{"version":3,"file":"kendo.mobile.min.js","sources":["kendo.mobile.js"],"sourcesContent":["(function(f, define) {\n define('kendo.core',['jquery'], f);\n})(function() {\n\nvar __meta__ = {\n id: \"core\",\n name: \"Core\",\n category: \"framework\",\n description: \"The core of the Kendo framework.\"\n};\n\nvar packageMetadata = {\n name: '@progress/kendo-ui',\n productName: 'Kendo UI',\n productCodes: ['KENDOUICOMPLETE', 'KENDOUI', 'KENDOUI', 'KENDOUICOMPLETE'],\n publishDate: 0,\n version: '',\n licensingDocsUrl: 'https://docs.telerik.com/kendo-ui/intro/installation/using-license-code'\n};\n\n\n(function($, window, undefined) {\n var kendo = window.kendo = window.kendo || { cultures: {} },\n extend = $.extend,\n each = $.each,\n isArray = Array.isArray,\n noop = $.noop,\n math = Math,\n Template,\n JSON = window.JSON || {},\n support = {},\n percentRegExp = /%/,\n formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g,\n boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i,\n numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/,\n FUNCTION = \"function\",\n STRING = \"string\",\n NUMBER = \"number\",\n OBJECT = \"object\",\n NULL = \"null\",\n BOOLEAN = \"boolean\",\n UNDEFINED = \"undefined\",\n PREFIX = \"prefix\",\n ARIA_LABELLEDBY = \"aria-labelledby\",\n ARIA_LABEL = \"aria-label\",\n LABELIDPART = \"_label\",\n getterCache = {},\n setterCache = {},\n slice = [].slice,\n cssPropertiesNames = [ \"themeColor\", \"fillMode\", \"shape\", \"size\", \"rounded\", \"positionMode\" ],\n // avoid extending the depricated properties in latest verions of jQuery\n noDepricateExtend = function() {\n var src, copyIsArray, copy, name, options, clone,\n target = arguments[ 0 ] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[ i ] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && typeof target !== \"function\") {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if ( i === length ) {\n target = this;\n i--;\n }\n\n for ( ; i < length; i++ ) {\n\n // Only deal with non-null/undefined values\n if ( ( options = arguments[ i ] ) != null ) {\n\n // Extend the base object\n for ( name in options ) {\n // filters, concat and : properties are depricated in the jQuery 3.3.0\n // accessing these properties throw a warning when jQuery migrate is included\n if (name == \"filters\" || name == \"concat\" || name == \":\") {\n continue;\n }\n src = target[ name ];\n copy = options[ name ];\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n ( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n if ( copyIsArray ) {\n copyIsArray = false;\n clone = src && Array.isArray( src ) ? src : [];\n\n } else {\n clone = src && jQuery.isPlainObject( src ) ? src : {};\n }\n\n // Never move original objects, clone them\n target[ name ] = noDepricateExtend( deep, clone, copy );\n\n // Don't bring in undefined values\n } else if ( copy !== undefined ) {\n target[ name ] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n kendo.version = \"2022.3.913\".replace(/^\\s+|\\s+$/g, '');\n\n function Class() {}\n\n Class.extend = function(proto) {\n var base = function() {},\n member,\n that = this,\n subclass = proto && proto.init ? proto.init : function() {\n that.apply(this, arguments);\n },\n fn;\n\n base.prototype = that.prototype;\n fn = subclass.fn = subclass.prototype = new base();\n\n for (member in proto) {\n if (proto[member] != null && proto[member].constructor === Object) {\n // Merge object members\n fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n } else {\n fn[member] = proto[member];\n }\n }\n\n fn.constructor = subclass;\n subclass.extend = that.extend;\n\n return subclass;\n };\n\n Class.prototype._initOptions = function(options) {\n this.options = deepExtend({}, this.options, options);\n };\n\n var isFunction = kendo.isFunction = function(fn) {\n return typeof fn === \"function\";\n };\n\n var preventDefault = function() {\n this._defaultPrevented = true;\n };\n\n var isDefaultPrevented = function() {\n return this._defaultPrevented === true;\n };\n\n var Observable = Class.extend({\n init: function() {\n this._events = {};\n },\n\n bind: function(eventName, handlers, one) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\n length,\n original,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n if (handlers === undefined) {\n for (idx in eventName) {\n that.bind(idx, eventName[idx]);\n }\n return that;\n }\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n if (one) {\n original = handler;\n handler = function() {\n that.unbind(eventName, handler);\n original.apply(that, arguments);\n };\n handler.original = original;\n }\n events = that._events[eventName] = that._events[eventName] || [];\n events.push(handler);\n }\n }\n\n return that;\n },\n\n one: function(eventNames, handlers) {\n return this.bind(eventNames, handlers, true);\n },\n\n first: function(eventName, handlers) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\n length,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n events = that._events[eventName] = that._events[eventName] || [];\n events.unshift(handler);\n }\n }\n\n return that;\n },\n\n trigger: function(eventName, e) {\n var that = this,\n events = that._events[eventName],\n idx,\n length;\n\n if (events) {\n e = e || {};\n\n e.sender = that;\n\n e._defaultPrevented = false;\n\n e.preventDefault = preventDefault;\n\n e.isDefaultPrevented = isDefaultPrevented;\n\n events = events.slice();\n\n for (idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(that, e);\n }\n\n return e._defaultPrevented === true;\n }\n\n return false;\n },\n\n unbind: function(eventName, handler) {\n var that = this,\n events = that._events[eventName],\n idx;\n\n if (eventName === undefined) {\n that._events = {};\n } else if (events) {\n if (handler) {\n for (idx = events.length - 1; idx >= 0; idx--) {\n if (events[idx] === handler || events[idx].original === handler) {\n events.splice(idx, 1);\n }\n }\n } else {\n that._events[eventName] = [];\n }\n }\n\n return that;\n }\n });\n\n\n function compilePart(part, stringPart) {\n if (stringPart) {\n return \"'\" +\n part.split(\"'\").join(\"\\\\'\")\n .split('\\\\\"').join('\\\\\\\\\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\") + \"'\";\n } else {\n var first = part.charAt(0),\n rest = part.substring(1);\n\n if (first === \"=\") {\n return \"+(\" + rest + \")+\";\n } else if (first === \":\") {\n return \"+$kendoHtmlEncode(\" + rest + \")+\";\n } else {\n return \";\" + part + \";$kendoOutput+=\";\n }\n }\n }\n\n var argumentNameRegExp = /^\\w+/,\n encodeRegExp = /\\$\\{([^}]*)\\}/g,\n escapedCurlyRegExp = /\\\\\\}/g,\n curlyRegExp = /__CURLY__/g,\n escapedSharpRegExp = /\\\\#/g,\n sharpRegExp = /__SHARP__/g,\n zeros = [\"\", \"0\", \"00\", \"000\", \"0000\"];\n\n Template = {\n paramName: \"data\", // name of the parameter of the generated template\n useWithBlock: true, // whether to wrap the template in a with() block\n render: function(template, data) {\n var idx,\n length,\n html = \"\";\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n html += template(data[idx]);\n }\n\n return html;\n },\n compile: function(template, options) {\n var settings = extend({}, this, options),\n paramName = settings.paramName,\n argumentName = paramName.match(argumentNameRegExp)[0],\n useWithBlock = settings.useWithBlock,\n functionBody = \"var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;\",\n fn,\n parts,\n idx;\n\n if (isFunction(template)) {\n return template;\n }\n\n functionBody += useWithBlock ? \"with(\" + paramName + \"){\" : \"\";\n\n functionBody += \"$kendoOutput=\";\n\n parts = template\n .replace(escapedCurlyRegExp, \"__CURLY__\")\n .replace(encodeRegExp, \"#=$kendoHtmlEncode($1)#\")\n .replace(curlyRegExp, \"}\")\n .replace(escapedSharpRegExp, \"__SHARP__\")\n .split(\"#\");\n\n for (idx = 0; idx < parts.length; idx ++) {\n functionBody += compilePart(parts[idx], idx % 2 === 0);\n }\n\n functionBody += useWithBlock ? \";}\" : \";\";\n\n functionBody += \"return $kendoOutput;\";\n\n functionBody = functionBody.replace(sharpRegExp, \"#\");\n\n try {\n fn = new Function(argumentName, functionBody);\n fn._slotCount = Math.floor(parts.length / 2);\n return fn;\n } catch (e) {\n throw new Error(kendo.format(\"Invalid template:'{0}' Generated code:'{1}'\", template, functionBody));\n }\n }\n };\n\nfunction pad(number, digits, end) {\n number = number + \"\";\n digits = digits || 2;\n end = digits - number.length;\n\n if (end) {\n return zeros[digits].substring(0, end) + number;\n }\n\n return number;\n}\n\n //JSON stringify\n(function() {\n var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = {\n \"\\b\": \"\\\\b\",\n \"\\t\": \"\\\\t\",\n \"\\n\": \"\\\\n\",\n \"\\f\": \"\\\\f\",\n \"\\r\": \"\\\\r\",\n \"\\\"\": '\\\\\"',\n \"\\\\\": \"\\\\\\\\\"\n },\n rep,\n toString = {}.toString;\n\n\n if (typeof Date.prototype.toJSON !== FUNCTION) {\n\n Date.prototype.toJSON = function() {\n var that = this;\n\n return isFinite(that.valueOf()) ?\n pad(that.getUTCFullYear(), 4) + \"-\" +\n pad(that.getUTCMonth() + 1) + \"-\" +\n pad(that.getUTCDate()) + \"T\" +\n pad(that.getUTCHours()) + \":\" +\n pad(that.getUTCMinutes()) + \":\" +\n pad(that.getUTCSeconds()) + \"Z\" : null;\n };\n\n String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function() {\n return this.valueOf();\n };\n }\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ? \"\\\"\" + string.replace(escapable, function(a) {\n var c = meta[a];\n return typeof c === STRING ? c :\n \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n }) + \"\\\"\" : \"\\\"\" + string + \"\\\"\";\n }\n\n function str(key, holder) {\n var i,\n k,\n v,\n length,\n mind = gap,\n partial,\n value = holder[key],\n type;\n\n if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n value = value.toJSON(key);\n }\n\n if (typeof rep === FUNCTION) {\n value = rep.call(holder, key, value);\n }\n\n type = typeof value;\n if (type === STRING) {\n return quote(value);\n } else if (type === NUMBER) {\n return isFinite(value) ? String(value) : NULL;\n } else if (type === BOOLEAN || type === NULL) {\n return String(value);\n } else if (type === OBJECT) {\n if (!value) {\n return NULL;\n }\n gap += indent;\n partial = [];\n if (toString.apply(value) === \"[object Array]\") {\n length = value.length;\n for (i = 0; i < length; i++) {\n partial[i] = str(i, value) || NULL;\n }\n v = partial.length === 0 ? \"[]\" : gap ?\n \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\" :\n \"[\" + partial.join(\",\") + \"]\";\n gap = mind;\n return v;\n }\n if (rep && typeof rep === OBJECT) {\n length = rep.length;\n for (i = 0; i < length; i++) {\n if (typeof rep[i] === STRING) {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? \"{}\" : gap ?\n \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\" :\n \"{\" + partial.join(\",\") + \"}\";\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON.stringify !== FUNCTION) {\n JSON.stringify = function(value, replacer, space) {\n var i;\n gap = \"\";\n indent = \"\";\n\n if (typeof space === NUMBER) {\n for (i = 0; i < space; i += 1) {\n indent += \" \";\n }\n\n } else if (typeof space === STRING) {\n indent = space;\n }\n\n rep = replacer;\n if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n throw new Error(\"JSON.stringify\");\n }\n\n return str(\"\", { \"\": value });\n };\n }\n})();\n\n// Date and Number formatting\n(function() {\n var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g,\n standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i,\n literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g,\n commaRegExp = /\\,/g,\n EMPTY = \"\",\n POINT = \".\",\n COMMA = \",\",\n SHARP = \"#\",\n ZERO = \"0\",\n PLACEHOLDER = \"??\",\n EN = \"en-US\",\n objectToString = {}.toString;\n\n //cultures\n kendo.cultures[\"en-US\"] = {\n name: EN,\n numberFormat: {\n pattern: [\"-n\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n percent: {\n pattern: [\"-n %\", \"n %\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n symbol: \"%\"\n },\n currency: {\n name: \"US Dollar\",\n abbr: \"USD\",\n pattern: [\"($n)\", \"$n\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n symbol: \"$\"\n }\n },\n calendars: {\n standard: {\n days: {\n names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n namesAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n namesShort: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ]\n },\n months: {\n names: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n namesAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n },\n AM: [ \"AM\", \"am\", \"AM\" ],\n PM: [ \"PM\", \"pm\", \"PM\" ],\n patterns: {\n d: \"M/d/yyyy\",\n D: \"dddd, MMMM dd, yyyy\",\n F: \"dddd, MMMM dd, yyyy h:mm:ss tt\",\n g: \"M/d/yyyy h:mm tt\",\n G: \"M/d/yyyy h:mm:ss tt\",\n m: \"MMMM dd\",\n M: \"MMMM dd\",\n s: \"yyyy'-'MM'-'ddTHH':'mm':'ss\",\n t: \"h:mm tt\",\n T: \"h:mm:ss tt\",\n u: \"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\n y: \"MMMM, yyyy\",\n Y: \"MMMM, yyyy\"\n },\n \"/\": \"/\",\n \":\": \":\",\n firstDay: 0,\n twoDigitYearMax: 2029\n }\n }\n };\n\n\n function findCulture(culture) {\n if (culture) {\n if (culture.numberFormat) {\n return culture;\n }\n\n if (typeof culture === STRING) {\n var cultures = kendo.cultures;\n return cultures[culture] || cultures[culture.split(\"-\")[0]] || null;\n }\n\n return null;\n }\n\n return null;\n }\n\n function getCulture(culture) {\n if (culture) {\n culture = findCulture(culture);\n }\n\n return culture || kendo.cultures.current;\n }\n\n kendo.culture = function(cultureName) {\n var cultures = kendo.cultures, culture;\n\n if (cultureName !== undefined) {\n culture = findCulture(cultureName) || cultures[EN];\n culture.calendar = culture.calendars.standard;\n cultures.current = culture;\n } else {\n return cultures.current;\n }\n };\n\n kendo.findCulture = findCulture;\n kendo.getCulture = getCulture;\n\n //set current culture to en-US.\n kendo.culture(EN);\n\n function formatDate(date, format, culture) {\n culture = getCulture(culture);\n\n var calendar = culture.calendars.standard,\n days = calendar.days,\n months = calendar.months;\n\n format = calendar.patterns[format] || format;\n\n return format.replace(dateFormatRegExp, function(match) {\n var minutes;\n var result;\n var sign;\n\n if (match === \"d\") {\n result = date.getDate();\n } else if (match === \"dd\") {\n result = pad(date.getDate());\n } else if (match === \"ddd\") {\n result = days.namesAbbr[date.getDay()];\n } else if (match === \"dddd\") {\n result = days.names[date.getDay()];\n } else if (match === \"M\") {\n result = date.getMonth() + 1;\n } else if (match === \"MM\") {\n result = pad(date.getMonth() + 1);\n } else if (match === \"MMM\") {\n result = months.namesAbbr[date.getMonth()];\n } else if (match === \"MMMM\") {\n result = months.names[date.getMonth()];\n } else if (match === \"yy\") {\n result = pad(date.getFullYear() % 100);\n } else if (match === \"yyyy\") {\n result = pad(date.getFullYear(), 4);\n } else if (match === \"h\" ) {\n result = date.getHours() % 12 || 12;\n } else if (match === \"hh\") {\n result = pad(date.getHours() % 12 || 12);\n } else if (match === \"H\") {\n result = date.getHours();\n } else if (match === \"HH\") {\n result = pad(date.getHours());\n } else if (match === \"m\") {\n result = date.getMinutes();\n } else if (match === \"mm\") {\n result = pad(date.getMinutes());\n } else if (match === \"s\") {\n result = date.getSeconds();\n } else if (match === \"ss\") {\n result = pad(date.getSeconds());\n } else if (match === \"f\") {\n result = math.floor(date.getMilliseconds() / 100);\n } else if (match === \"ff\") {\n result = date.getMilliseconds();\n if (result > 99) {\n result = math.floor(result / 10);\n }\n result = pad(result);\n } else if (match === \"fff\") {\n result = pad(date.getMilliseconds(), 3);\n } else if (match === \"tt\") {\n result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n } else if (match === \"zzz\") {\n minutes = date.getTimezoneOffset();\n sign = minutes < 0;\n\n result = math.abs(minutes / 60).toString().split(\".\")[0];\n minutes = math.abs(minutes) - (result * 60);\n\n result = (sign ? \"+\" : \"-\") + pad(result);\n result += \":\" + pad(minutes);\n } else if (match === \"zz\" || match === \"z\") {\n result = date.getTimezoneOffset() / 60;\n sign = result < 0;\n\n result = math.abs(result).toString().split(\".\")[0];\n result = (sign ? \"+\" : \"-\") + (match === \"zz\" ? pad(result) : result);\n }\n\n return result !== undefined ? result : match.slice(1, match.length - 1);\n });\n }\n\n //number formatting\n function formatNumber(number, format, culture) {\n culture = getCulture(culture);\n\n var numberFormat = culture.numberFormat,\n decimal = numberFormat[POINT],\n precision = numberFormat.decimals,\n pattern = numberFormat.pattern[0],\n literals = [],\n symbol,\n isCurrency, isPercent,\n customPrecision,\n formatAndPrecision,\n negative = number < 0,\n integer,\n fraction,\n integerLength,\n fractionLength,\n replacement = EMPTY,\n value = EMPTY,\n idx,\n length,\n ch,\n hasGroup,\n hasNegativeFormat,\n decimalIndex,\n sharpIndex,\n zeroIndex,\n hasZero, hasSharp,\n percentIndex,\n currencyIndex,\n startZeroIndex,\n start = -1,\n end;\n\n //return empty string if no number\n if (number === undefined) {\n return EMPTY;\n }\n\n if (!isFinite(number)) {\n return number;\n }\n\n //if no format then return number.toString() or number.toLocaleString() if culture.name is not defined\n if (!format) {\n return culture.name.length ? number.toLocaleString() : number.toString();\n }\n\n formatAndPrecision = standardFormatRegExp.exec(format);\n\n // standard formatting\n if (formatAndPrecision) {\n format = formatAndPrecision[1].toLowerCase();\n\n isCurrency = format === \"c\";\n isPercent = format === \"p\";\n\n if (isCurrency || isPercent) {\n //get specific number format information if format is currency or percent\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n pattern = numberFormat.pattern[negative ? 0 : 1];\n }\n\n customPrecision = formatAndPrecision[2];\n\n if (customPrecision) {\n precision = +customPrecision;\n }\n\n //return number in exponential format\n if (format === \"e\") {\n var exp = customPrecision ? number.toExponential(precision) : number.toExponential(); // toExponential() and toExponential(undefined) differ in FF #653438.\n\n return exp.replace(POINT, numberFormat[POINT]);\n }\n\n // multiply if format is percent\n if (isPercent) {\n number *= 100;\n }\n\n number = round(number, precision);\n negative = number < 0;\n number = number.split(POINT);\n\n integer = number[0];\n fraction = number[1];\n\n //exclude \"-\" if number is negative.\n if (negative) {\n integer = integer.substring(1);\n }\n\n value = groupInteger(integer, 0, integer.length, numberFormat);\n\n if (fraction) {\n value += decimal + fraction;\n }\n\n if (format === \"n\" && !negative) {\n return value;\n }\n\n number = EMPTY;\n\n for (idx = 0, length = pattern.length; idx < length; idx++) {\n ch = pattern.charAt(idx);\n\n if (ch === \"n\") {\n number += value;\n } else if (ch === \"$\" || ch === \"%\") {\n number += symbol;\n } else {\n number += ch;\n }\n }\n\n return number;\n }\n\n //custom formatting\n //\n //separate format by sections.\n\n if (format.indexOf(\"'\") > -1 || format.indexOf(\"\\\"\") > -1 || format.indexOf(\"\\\\\") > -1) {\n format = format.replace(literalRegExp, function(match) {\n var quoteChar = match.charAt(0).replace(\"\\\\\", \"\"),\n literal = match.slice(1).replace(quoteChar, \"\");\n\n literals.push(literal);\n\n return PLACEHOLDER;\n });\n }\n\n format = format.split(\";\");\n if (negative && format[1]) {\n //get negative format\n format = format[1];\n hasNegativeFormat = true;\n } else if (number === 0 && format[2]) {\n //format for zeros\n format = format[2];\n if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n //return format if it is string constant.\n return format;\n }\n } else {\n format = format[0];\n }\n\n percentIndex = format.indexOf(\"%\");\n currencyIndex = format.indexOf(\"$\");\n\n isPercent = percentIndex != -1;\n isCurrency = currencyIndex != -1;\n\n //multiply number if the format has percent\n if (isPercent) {\n number *= 100;\n }\n\n if (isCurrency && format[currencyIndex - 1] === \"\\\\\") {\n format = format.split(\"\\\\\").join(\"\");\n isCurrency = false;\n }\n\n if (isCurrency || isPercent) {\n //get specific number format information if format is currency or percent\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n }\n\n hasGroup = format.indexOf(COMMA) > -1;\n if (hasGroup) {\n format = format.replace(commaRegExp, EMPTY);\n }\n\n decimalIndex = format.indexOf(POINT);\n length = format.length;\n\n if (decimalIndex != -1) {\n fraction = number.toString().split(\"e\");\n if (fraction[1]) {\n fraction = round(number, Math.abs(fraction[1]));\n } else {\n fraction = fraction[0];\n }\n fraction = fraction.split(POINT)[1] || EMPTY;\n zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n hasZero = zeroIndex > -1;\n hasSharp = sharpIndex > -1;\n idx = fraction.length;\n\n if (!hasZero && !hasSharp) {\n format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n length = format.length;\n decimalIndex = -1;\n idx = 0;\n }\n\n if (hasZero && zeroIndex > sharpIndex) {\n idx = zeroIndex;\n } else if (sharpIndex > zeroIndex) {\n if (hasSharp && idx > sharpIndex) {\n var rounded = round(number, sharpIndex, negative);\n\n while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n sharpIndex--;\n\n rounded = round(number, sharpIndex, negative);\n }\n\n idx = sharpIndex;\n } else if (hasZero && idx < zeroIndex) {\n idx = zeroIndex;\n }\n }\n }\n\n number = round(number, idx, negative);\n\n sharpIndex = format.indexOf(SHARP);\n startZeroIndex = zeroIndex = format.indexOf(ZERO);\n\n //define the index of the first digit placeholder\n if (sharpIndex == -1 && zeroIndex != -1) {\n start = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n start = sharpIndex;\n } else {\n start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n }\n\n sharpIndex = format.lastIndexOf(SHARP);\n zeroIndex = format.lastIndexOf(ZERO);\n\n //define the index of the last digit placeholder\n if (sharpIndex == -1 && zeroIndex != -1) {\n end = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n end = sharpIndex;\n } else {\n end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n }\n\n if (start == length) {\n end = start;\n }\n\n if (start != -1) {\n value = number.toString().split(POINT);\n integer = value[0];\n fraction = value[1] || EMPTY;\n\n integerLength = integer.length;\n fractionLength = fraction.length;\n\n if (negative && (number * -1) >= 0) {\n negative = false;\n }\n\n number = format.substring(0, start);\n\n if (negative && !hasNegativeFormat) {\n number += \"-\";\n }\n\n for (idx = start; idx < length; idx++) {\n ch = format.charAt(idx);\n\n if (decimalIndex == -1) {\n if (end - idx < integerLength) {\n number += integer;\n break;\n }\n } else {\n if (zeroIndex != -1 && zeroIndex < idx) {\n replacement = EMPTY;\n }\n\n if ((decimalIndex - idx) <= integerLength && decimalIndex - idx > -1) {\n number += integer;\n idx = decimalIndex;\n }\n\n if (decimalIndex === idx) {\n number += (fraction ? decimal : EMPTY) + fraction;\n idx += end - decimalIndex + 1;\n continue;\n }\n }\n\n if (ch === ZERO) {\n number += ch;\n replacement = ch;\n } else if (ch === SHARP) {\n number += replacement;\n }\n }\n\n if (hasGroup) {\n number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, (integerLength + start)), numberFormat);\n }\n\n if (end >= start) {\n number += format.substring(end + 1);\n }\n\n //replace symbol placeholders\n if (isCurrency || isPercent) {\n value = EMPTY;\n for (idx = 0, length = number.length; idx < length; idx++) {\n ch = number.charAt(idx);\n value += (ch === \"$\" || ch === \"%\") ? symbol : ch;\n }\n number = value;\n }\n\n length = literals.length;\n\n if (length) {\n for (idx = 0; idx < length; idx++) {\n number = number.replace(PLACEHOLDER, literals[idx]);\n }\n }\n }\n\n return number;\n }\n\n var groupInteger = function(number, start, end, numberFormat) {\n var decimalIndex = number.indexOf(numberFormat[POINT]);\n var groupSizes = numberFormat.groupSize.slice();\n var groupSize = groupSizes.shift();\n var integer, integerLength;\n var idx, parts, value;\n var newGroupSize;\n\n end = decimalIndex !== -1 ? decimalIndex : end + 1;\n\n integer = number.substring(start, end);\n integerLength = integer.length;\n\n if (integerLength >= groupSize) {\n idx = integerLength;\n parts = [];\n\n while (idx > -1) {\n value = integer.substring(idx - groupSize, idx);\n if (value) {\n parts.push(value);\n }\n idx -= groupSize;\n newGroupSize = groupSizes.shift();\n groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n\n if (groupSize === 0) {\n if (idx > 0) {\n parts.push(integer.substring(0, idx));\n }\n break;\n }\n }\n\n integer = parts.reverse().join(numberFormat[COMMA]);\n number = number.substring(0, start) + integer + number.substring(end);\n }\n\n return number;\n };\n\n var round = function(value, precision, negative) {\n precision = precision || 0;\n\n value = value.toString().split('e');\n value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision)));\n\n if (negative) {\n value = -value;\n }\n\n value = value.toString().split('e');\n value = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision));\n\n return value.toFixed(Math.min(precision, 20));\n };\n\n var toString = function(value, fmt, culture) {\n if (fmt) {\n if (objectToString.call(value) === \"[object Date]\") {\n return formatDate(value, fmt, culture);\n } else if (typeof value === NUMBER) {\n return formatNumber(value, fmt, culture);\n }\n }\n\n return value !== undefined ? value : \"\";\n };\n\n kendo.format = function(fmt) {\n var values = arguments;\n\n return fmt.replace(formatRegExp, function(match, index, placeholderFormat) {\n var value = values[parseInt(index, 10) + 1];\n\n return toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\");\n });\n };\n\n kendo._extractFormat = function(format) {\n if (format.slice(0,3) === \"{0:\") {\n format = format.slice(3, format.length - 1);\n }\n\n return format;\n };\n\n kendo._activeElement = function() {\n try {\n return document.activeElement;\n } catch (e) {\n return document.documentElement.activeElement;\n }\n };\n\n kendo._round = round;\n kendo._outerWidth = function(element, includeMargin) { return $(element).outerWidth(includeMargin || false) || 0; };\n kendo._outerHeight = function(element, includeMargin) { return $(element).outerHeight(includeMargin || false) || 0; };\n kendo.toString = toString;\n})();\n\n\n(function() {\n var nonBreakingSpaceRegExp = /\\u00A0/g,\n spaceRegExp = /\\s/g,\n exponentRegExp = /[eE][\\-+]?[0-9]+/,\n shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/,\n longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/,\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\n offsetRegExp = /[+-]\\d*/,\n FORMATS_SEQUENCE = [ [], [ \"G\", \"g\", \"F\" ], [ \"D\", \"d\", \"y\", \"m\", \"T\", \"t\" ] ],\n STANDARD_FORMATS = [\n [\n \"yyyy-MM-ddTHH:mm:ss.fffffffzzz\",\n \"yyyy-MM-ddTHH:mm:ss.fffffff\",\n \"yyyy-MM-ddTHH:mm:ss.fffzzz\",\n \"yyyy-MM-ddTHH:mm:ss.fff\",\n \"ddd MMM dd yyyy HH:mm:ss\",\n \"yyyy-MM-ddTHH:mm:sszzz\",\n \"yyyy-MM-ddTHH:mmzzz\",\n \"yyyy-MM-ddTHH:mmzz\",\n \"yyyy-MM-ddTHH:mm:ss\",\n \"yyyy-MM-dd HH:mm:ss\",\n \"yyyy/MM/dd HH:mm:ss\"\n ], [\n \"yyyy-MM-ddTHH:mm\",\n \"yyyy-MM-dd HH:mm\",\n \"yyyy/MM/dd HH:mm\"\n ], [\n \"yyyy/MM/dd\",\n \"yyyy-MM-dd\",\n \"HH:mm:ss\",\n \"HH:mm\"\n ]\n ],\n numberRegExp = {\n 2: /^\\d{1,2}/,\n 3: /^\\d{1,3}/,\n 4: /^\\d{4}/\n },\n objectToString = {}.toString;\n\n function outOfRange(value, start, end) {\n return !(value >= start && value <= end);\n }\n\n function designatorPredicate(designator) {\n return designator.charAt(0);\n }\n\n function mapDesignators(designators) {\n return $.map(designators, designatorPredicate);\n }\n\n //if date's day is different than the typed one - adjust\n function adjustDST(date, hours) {\n if (!hours && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n }\n }\n\n function lowerArray(data) {\n var idx = 0,\n length = data.length,\n array = [];\n\n for (; idx < length; idx++) {\n array[idx] = (data[idx] + \"\").toLowerCase();\n }\n\n return array;\n }\n\n function lowerLocalInfo(localInfo) {\n var newLocalInfo = {}, property;\n\n for (property in localInfo) {\n newLocalInfo[property] = lowerArray(localInfo[property]);\n }\n\n return newLocalInfo;\n }\n\n function parseExact(value, format, culture, strict) {\n if (!value) {\n return null;\n }\n\n var lookAhead = function(match) {\n var i = 0;\n while (format[idx] === match) {\n i++;\n idx++;\n }\n if (i > 0) {\n idx -= 1;\n }\n return i;\n },\n getNumber = function(size) {\n var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'),\n match = value.substr(valueIdx, size).match(rg);\n\n if (match) {\n match = match[0];\n valueIdx += match.length;\n return parseInt(match, 10);\n }\n return null;\n },\n getIndexByName = function(names, lower) {\n var i = 0,\n length = names.length,\n name, nameLength,\n matchLength = 0,\n matchIdx = 0,\n subValue;\n\n for (; i < length; i++) {\n name = names[i];\n nameLength = name.length;\n subValue = value.substr(valueIdx, nameLength);\n\n if (lower) {\n subValue = subValue.toLowerCase();\n }\n\n if (subValue == name && nameLength > matchLength) {\n matchLength = nameLength;\n matchIdx = i;\n }\n }\n\n if (matchLength) {\n valueIdx += matchLength;\n return matchIdx + 1;\n }\n\n return null;\n },\n checkLiteral = function() {\n var result = false;\n if (value.charAt(valueIdx) === format[idx]) {\n valueIdx++;\n result = true;\n }\n return result;\n },\n calendar = culture.calendars.standard,\n year = null,\n month = null,\n day = null,\n hours = null,\n minutes = null,\n seconds = null,\n milliseconds = null,\n idx = 0,\n valueIdx = 0,\n literal = false,\n date = new Date(),\n twoDigitYearMax = calendar.twoDigitYearMax || 2029,\n defaultYear = date.getFullYear(),\n ch, count, length, pattern,\n pmHour, UTC, matches,\n amDesignators, pmDesignators,\n hoursOffset, minutesOffset,\n hasTime, match;\n\n if (!format) {\n format = \"d\"; //shord date format\n }\n\n //if format is part of the patterns get real format\n pattern = calendar.patterns[format];\n if (pattern) {\n format = pattern;\n }\n\n format = format.split(\"\");\n length = format.length;\n\n for (; idx < length; idx++) {\n ch = format[idx];\n\n if (literal) {\n if (ch === \"'\") {\n literal = false;\n } else {\n checkLiteral();\n }\n } else {\n if (ch === \"d\") {\n count = lookAhead(\"d\");\n if (!calendar._lowerDays) {\n calendar._lowerDays = lowerLocalInfo(calendar.days);\n }\n\n if (day !== null && count > 2) {\n continue;\n }\n\n day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? \"namesAbbr\" : \"names\"], true);\n\n if (day === null || outOfRange(day, 1, 31)) {\n return null;\n }\n } else if (ch === \"M\") {\n count = lookAhead(\"M\");\n if (!calendar._lowerMonths) {\n calendar._lowerMonths = lowerLocalInfo(calendar.months);\n }\n month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n\n if (month === null || outOfRange(month, 1, 12)) {\n return null;\n }\n month -= 1; //because month is zero based\n } else if (ch === \"y\") {\n count = lookAhead(\"y\");\n year = getNumber(count);\n\n if (year === null) {\n return null;\n }\n\n if (count == 2) {\n if (typeof twoDigitYearMax === \"string\") {\n twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n }\n\n year = (defaultYear - defaultYear % 100) + year;\n if (year > twoDigitYearMax) {\n year -= 100;\n }\n }\n } else if (ch === \"h\" ) {\n lookAhead(\"h\");\n hours = getNumber(2);\n if (hours == 12) {\n hours = 0;\n }\n if (hours === null || outOfRange(hours, 0, 11)) {\n return null;\n }\n } else if (ch === \"H\") {\n lookAhead(\"H\");\n hours = getNumber(2);\n if (hours === null || outOfRange(hours, 0, 23)) {\n return null;\n }\n } else if (ch === \"m\") {\n lookAhead(\"m\");\n minutes = getNumber(2);\n if (minutes === null || outOfRange(minutes, 0, 59)) {\n return null;\n }\n } else if (ch === \"s\") {\n lookAhead(\"s\");\n seconds = getNumber(2);\n if (seconds === null || outOfRange(seconds, 0, 59)) {\n return null;\n }\n } else if (ch === \"f\") {\n count = lookAhead(\"f\");\n\n match = value.substr(valueIdx, count).match(numberRegExp[3]);\n milliseconds = getNumber(count); //move value index position\n\n if (milliseconds !== null) {\n milliseconds = parseFloat(\"0.\" + match[0], 10);\n milliseconds = kendo._round(milliseconds, 3);\n milliseconds *= 1000;\n }\n\n if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n return null;\n }\n\n } else if (ch === \"t\") {\n count = lookAhead(\"t\");\n amDesignators = calendar.AM;\n pmDesignators = calendar.PM;\n\n if (count === 1) {\n amDesignators = mapDesignators(amDesignators);\n pmDesignators = mapDesignators(pmDesignators);\n }\n\n pmHour = getIndexByName(pmDesignators);\n if (!pmHour && !getIndexByName(amDesignators)) {\n return null;\n }\n }\n else if (ch === \"z\") {\n UTC = true;\n count = lookAhead(\"z\");\n\n if (value.substr(valueIdx, 1) === \"Z\") {\n checkLiteral();\n continue;\n }\n\n matches = value.substr(valueIdx, 6)\n .match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n\n if (!matches) {\n return null;\n }\n\n matches = matches[0].split(\":\");\n\n hoursOffset = matches[0];\n minutesOffset = matches[1];\n\n if (!minutesOffset && hoursOffset.length > 3) { //(+|-)[hh][mm] format is used\n valueIdx = hoursOffset.length - 2;\n minutesOffset = hoursOffset.substring(valueIdx);\n hoursOffset = hoursOffset.substring(0, valueIdx);\n }\n\n hoursOffset = parseInt(hoursOffset, 10);\n if (outOfRange(hoursOffset, -12, 13)) {\n return null;\n }\n\n if (count > 2) {\n minutesOffset = matches[0][0] + minutesOffset;\n minutesOffset = parseInt(minutesOffset, 10);\n if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n return null;\n }\n }\n } else if (ch === \"'\") {\n literal = true;\n checkLiteral();\n } else if (!checkLiteral()) {\n return null;\n }\n }\n }\n\n // if more characters follow, assume wrong format\n // https://github.com/telerik/kendo-ui-core/issues/3476\n if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n return null;\n }\n\n hasTime = hours !== null || minutes !== null || seconds || null;\n\n if (year === null && month === null && day === null && hasTime) {\n year = defaultYear;\n month = date.getMonth();\n day = date.getDate();\n } else {\n if (year === null) {\n year = defaultYear;\n }\n\n if (day === null) {\n day = 1;\n }\n }\n\n if (pmHour && hours < 12) {\n hours += 12;\n }\n\n if (UTC) {\n if (hoursOffset) {\n hours += -hoursOffset;\n }\n\n if (minutesOffset) {\n minutes += -minutesOffset;\n }\n\n value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n } else {\n value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n adjustDST(value, hours);\n }\n\n if (year < 100) {\n value.setFullYear(year);\n }\n\n if (value.getDate() !== day && UTC === undefined) {\n return null;\n }\n\n return value;\n }\n\n function parseMicrosoftFormatOffset(offset) {\n var sign = offset.substr(0, 1) === \"-\" ? -1 : 1;\n\n offset = offset.substring(1);\n offset = (parseInt(offset.substr(0, 2), 10) * 60) + parseInt(offset.substring(2), 10);\n\n return sign * offset;\n }\n\n function getDefaultFormats(culture) {\n var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n var calendar = culture.calendar || culture.calendars.standard;\n var patterns = calendar.patterns;\n var cultureFormats, formatIdx, idx;\n var formats = [];\n\n for (idx = 0; idx < length; idx++) {\n cultureFormats = FORMATS_SEQUENCE[idx];\n for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n formats.push(patterns[cultureFormats[formatIdx]]);\n }\n formats = formats.concat(STANDARD_FORMATS[idx]);\n }\n\n return formats;\n }\n\n function internalParseDate(value, formats, culture, strict) {\n if (objectToString.call(value) === \"[object Date]\") {\n return value;\n }\n\n var idx = 0;\n var date = null;\n var length;\n var tzoffset;\n\n if (value && value.indexOf(\"/D\") === 0) {\n date = dateRegExp.exec(value);\n if (date) {\n date = date[1];\n tzoffset = offsetRegExp.exec(date.substring(1));\n\n date = new Date(parseInt(date, 10));\n\n if (tzoffset) {\n tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n date = kendo.timezone.apply(date, 0);\n date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n }\n\n return date;\n }\n }\n\n culture = kendo.getCulture(culture);\n\n if (!formats) {\n formats = getDefaultFormats(culture);\n }\n\n formats = isArray(formats) ? formats : [formats];\n length = formats.length;\n\n for (; idx < length; idx++) {\n date = parseExact(value, formats[idx], culture, strict);\n if (date) {\n return date;\n }\n }\n\n return date;\n }\n\n kendo.parseDate = function(value, formats, culture) {\n return internalParseDate(value, formats, culture, false);\n };\n\n kendo.parseExactDate = function(value, formats, culture) {\n return internalParseDate(value, formats, culture, true);\n };\n\n kendo.parseInt = function(value, culture) {\n var result = kendo.parseFloat(value, culture);\n if (result) {\n result = result | 0;\n }\n return result;\n };\n\n kendo.parseFloat = function(value, culture, format) {\n if (!value && value !== 0) {\n return null;\n }\n\n if (typeof value === NUMBER) {\n return value;\n }\n\n value = value.toString();\n culture = kendo.getCulture(culture);\n\n var number = culture.numberFormat,\n percent = number.percent,\n currency = number.currency,\n symbol = currency.symbol,\n percentSymbol = percent.symbol,\n negative = value.indexOf(\"-\"),\n parts, isPercent;\n\n //handle exponential number\n if (exponentRegExp.test(value)) {\n value = parseFloat(value.replace(number[\".\"], \".\"));\n if (isNaN(value)) {\n value = null;\n }\n return value;\n }\n\n if (negative > 0) {\n return null;\n } else {\n negative = negative > -1;\n }\n\n if (value.indexOf(symbol) > -1 || (format && format.toLowerCase().indexOf(\"c\") > -1)) {\n number = currency;\n parts = number.pattern[0].replace(\"$\", symbol).split(\"n\");\n if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n value = value.replace(parts[0], \"\").replace(parts[1], \"\");\n negative = true;\n }\n } else if (value.indexOf(percentSymbol) > -1) {\n isPercent = true;\n number = percent;\n symbol = percentSymbol;\n }\n\n value = value.replace(\"-\", \"\")\n .replace(symbol, \"\")\n .replace(nonBreakingSpaceRegExp, \" \")\n .split(number[\",\"].replace(nonBreakingSpaceRegExp, \" \")).join(\"\")\n .replace(spaceRegExp, \"\")\n .replace(number[\".\"], \".\");\n\n value = parseFloat(value);\n\n if (isNaN(value)) {\n value = null;\n } else if (negative) {\n value *= -1;\n }\n\n if (value && isPercent) {\n value /= 100;\n }\n\n return value;\n };\n})();\n\n function getShadows(element) {\n var shadow = element.css(kendo.support.transitions.css + \"box-shadow\") || element.css(\"box-shadow\"),\n radius = shadow ? shadow.match(boxShadowRegExp) || [ 0, 0, 0, 0, 0 ] : [ 0, 0, 0, 0, 0 ],\n blur = math.max((+radius[3]), +(radius[4] || 0));\n\n return {\n left: (-radius[1]) + blur,\n right: (+radius[1]) + blur,\n bottom: (+radius[2]) + blur\n };\n }\n\n function wrap(element, autosize) {\n var percentage,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n parent = element.parent(),\n windowOuterWidth = outerWidth(window);\n\n parent.removeClass(\"k-animation-container-sm\");\n\n if (!parent.hasClass(\"k-animation-container\")) {\n var width = element[0].style.width,\n height = element[0].style.height,\n percentWidth = percentRegExp.test(width),\n percentHeight = percentRegExp.test(height),\n forceWidth = element.hasClass(\"k-tooltip\") || element.is(\".k-menu-horizontal.k-context-menu\");\n\n percentage = percentWidth || percentHeight;\n\n if (!percentWidth && (!autosize || (autosize && width) || forceWidth)) { width = autosize ? outerWidth(element) + 1 : outerWidth(element); }\n if (!percentHeight && (!autosize || (autosize && height)) || element.is(\".k-menu-horizontal.k-context-menu\")) { height = outerHeight(element); }\n\n element.wrap(\n $(\"
\")\n .addClass(\"k-animation-container\")\n .attr(\"role\", \"region\")\n .css({\n width: width,\n height: height\n }));\n parent = element.parent();\n\n if (percentage) {\n element.css({\n width: \"100%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n mozBoxSizing: \"border-box\",\n webkitBoxSizing: \"border-box\"\n });\n }\n } else {\n wrapResize(element, autosize);\n }\n\n if (windowOuterWidth < outerWidth(parent)) {\n parent.addClass(\"k-animation-container-sm\");\n\n wrapResize(element, autosize);\n }\n\n return parent;\n }\n\n function wrapResize(element, autosize) {\n var percentage,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n wrapper = element.parent(\".k-animation-container\"),\n wrapperStyle = wrapper[0].style;\n\n if (wrapper.is(\":hidden\")) {\n wrapper.css({\n display: \"\",\n position: \"\"\n });\n }\n\n percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n\n if (!percentage) {\n wrapper.css({\n width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n height: outerHeight(element),\n boxSizing: \"content-box\",\n mozBoxSizing: \"content-box\",\n webkitBoxSizing: \"content-box\"\n });\n }\n }\n\n function deepExtend(destination) {\n var i = 1,\n length = arguments.length;\n\n for (i = 1; i < length; i++) {\n deepExtendOne(destination, arguments[i]);\n }\n\n return destination;\n }\n\n function deepExtendOne(destination, source) {\n var ObservableArray = kendo.data.ObservableArray,\n LazyObservableArray = kendo.data.LazyObservableArray,\n DataSource = kendo.data.DataSource,\n HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n property,\n propValue,\n propType,\n propInit,\n destProp;\n\n for (property in source) {\n propValue = source[property];\n propType = typeof propValue;\n\n if (propType === OBJECT && propValue !== null) {\n propInit = propValue.constructor;\n } else {\n propInit = null;\n }\n\n if (propInit &&\n propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray &&\n propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp &&\n (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer) && !(propValue instanceof HTMLElement)) {\n\n if (propValue instanceof Date) {\n destination[property] = new Date(propValue.getTime());\n } else if (isFunction(propValue.clone)) {\n destination[property] = propValue.clone();\n } else {\n destProp = destination[property];\n if (typeof (destProp) === OBJECT) {\n destination[property] = destProp || {};\n } else {\n destination[property] = {};\n }\n deepExtendOne(destination[property], propValue);\n }\n } else if (propType !== UNDEFINED) {\n destination[property] = propValue;\n }\n }\n\n return destination;\n }\n\n function testRx(agent, rxs, dflt) {\n for (var rx in rxs) {\n if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n return rx;\n }\n }\n return dflt !== undefined ? dflt : agent;\n }\n\n function toHyphens(str) {\n return str.replace(/([a-z][A-Z])/g, function(g) {\n return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n });\n }\n\n function toCamelCase(str) {\n return str.replace(/\\-(\\w)/g, function(strMatch, g1) {\n return g1.toUpperCase();\n });\n }\n\n function getComputedStyles(element, properties) {\n var styles = {}, computedStyle;\n\n if (document.defaultView && document.defaultView.getComputedStyle) {\n computedStyle = document.defaultView.getComputedStyle(element, \"\");\n\n if (properties) {\n $.each(properties, function(idx, value) {\n styles[value] = computedStyle.getPropertyValue(value);\n });\n }\n } else {\n computedStyle = element.currentStyle;\n\n if (properties) {\n $.each(properties, function(idx, value) {\n styles[value] = computedStyle[toCamelCase(value)];\n });\n }\n }\n\n if (!kendo.size(styles)) {\n styles = computedStyle;\n }\n\n return styles;\n }\n\n function isScrollable(element) {\n if (element && element.className && typeof(element.className) === \"string\" && element.className.indexOf(\"k-auto-scrollable\") > -1) {\n return true;\n }\n\n var overflow = getComputedStyles(element, [\"overflow\"]).overflow;\n return overflow.indexOf(\"auto\") > -1 || overflow.indexOf(\"scroll\") > -1;\n }\n\n function scrollLeft(element, value) {\n var webkit = support.browser.webkit;\n var mozila = support.browser.mozilla;\n var browserVersion = support.browser.version;\n var el, isRtl;\n\n if (element instanceof $ && value !== undefined) {\n element.each(function(i, e) {\n scrollLeft(e, value);\n });\n\n return;\n } else {\n el = element instanceof $ ? element[0] : element;\n }\n\n if (!el) {\n return;\n }\n\n isRtl = support.isRtl(element);\n\n // After updating browser detection,\n // Test in which if should the Safari browsers go\n if (value !== undefined) {\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n } else if (isRtl && (mozila || webkit) && value > 0) {\n el.scrollLeft = -value;\n } else {\n el.scrollLeft = value;\n }\n } else {\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n } else {\n return Math.abs(el.scrollLeft);\n }\n }\n }\n\n (function() {\n support._scrollbar = undefined;\n\n support.scrollbar = function(refresh) {\n if (!isNaN(support._scrollbar) && !refresh) {\n return support._scrollbar;\n } else {\n var div = document.createElement(\"div\"),\n result;\n\n div.style.cssText = \"overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block\";\n div.innerHTML = \" \";\n document.body.appendChild(div);\n\n support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n\n document.body.removeChild(div);\n\n return result;\n }\n };\n\n support.isRtl = function(element) {\n return $(element).closest(\".k-rtl\").length > 0;\n };\n\n var table = document.createElement(\"table\");\n\n // Internet Explorer does not support setting the innerHTML of TBODY and TABLE elements\n try {\n table.innerHTML = \"\";\n\n support.tbodyInnerHtml = true;\n } catch (e) {\n support.tbodyInnerHtml = false;\n }\n\n support.touch = \"ontouchstart\" in window;\n\n var docStyle = document.documentElement.style;\n var transitions = support.transitions = false,\n transforms = support.transforms = false,\n elementProto = \"HTMLElement\" in window ? HTMLElement.prototype : [];\n\n support.hasHW3D = (\"WebKitCSSMatrix\" in window && \"m11\" in new window.WebKitCSSMatrix()) || \"MozPerspective\" in docStyle || \"msPerspective\" in docStyle;\n support.cssFlexbox = (\"flexWrap\" in docStyle) || (\"WebkitFlexWrap\" in docStyle) || (\"msFlexWrap\" in docStyle);\n\n each([ \"Moz\", \"webkit\", \"O\", \"ms\" ], function() {\n var prefix = this.toString(),\n hasTransitions = typeof table.style[prefix + \"Transition\"] === STRING;\n\n if (hasTransitions || typeof table.style[prefix + \"Transform\"] === STRING) {\n var lowPrefix = prefix.toLowerCase();\n\n transforms = {\n css: (lowPrefix != \"ms\") ? \"-\" + lowPrefix + \"-\" : \"\",\n prefix: prefix,\n event: (lowPrefix === \"o\" || lowPrefix === \"webkit\") ? lowPrefix : \"\"\n };\n\n if (hasTransitions) {\n transitions = transforms;\n transitions.event = transitions.event ? transitions.event + \"TransitionEnd\" : \"transitionend\";\n }\n\n return false;\n }\n });\n\n table = null;\n\n support.transforms = transforms;\n support.transitions = transitions;\n\n support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n\n try {\n support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n } catch (e) {\n //window.outerWidth throws error when in IE showModalDialog.\n support.screenWidth = window.screen.availWidth;\n support.screenHeight = window.screen.availHeight;\n }\n\n support.detectOS = function(ua) {\n var os = false, minorVersion, match = [],\n notAndroidPhone = !/mobile safari/i.test(ua),\n agentRxs = {\n wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n },\n osRxs = {\n ios: /^i(phone|pad|pod)$/i,\n android: /^android|fire$/i,\n blackberry: /^blackberry|playbook/i,\n windows: /windows/,\n wp: /wp/,\n flat: /sailfish|ffos|tizen/i,\n meego: /meego/\n },\n formFactorRxs = {\n tablet: /playbook|ipad|fire/i\n },\n browserRxs = {\n omini: /Opera\\sMini/i,\n omobile: /Opera\\sMobi/i,\n firefox: /Firefox|Fennec/i,\n mobilesafari: /version\\/.*safari/i,\n ie: /MSIE|Windows\\sPhone/i,\n chrome: /chrome|crios/i,\n webkit: /webkit/i\n };\n\n for (var agent in agentRxs) {\n if (agentRxs.hasOwnProperty(agent)) {\n match = ua.match(agentRxs[agent]);\n if (match) {\n if (agent == \"windows\" && \"plugins\" in navigator) { return false; } // Break if not Metro/Mobile Windows\n\n os = {};\n os.device = agent;\n os.tablet = testRx(agent, formFactorRxs, false);\n os.browser = testRx(ua, browserRxs, \"default\");\n os.name = testRx(agent, osRxs);\n os[os.name] = true;\n os.majorVersion = match[2];\n os.minorVersion = (match[3] || \"0\").replace(\"_\", \".\");\n minorVersion = os.minorVersion.replace(\".\", \"\").substr(0, 2);\n os.flatVersion = os.majorVersion + minorVersion + (new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join(\"0\"));\n os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED; // Use file protocol to detect appModes.\n os.appMode = window.navigator.standalone || (/file|local|wmapp/).test(window.location.protocol) || os.cordova; // Use file protocol to detect appModes.\n\n if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n os.tablet = agent;\n }\n\n break;\n }\n }\n }\n return os;\n };\n\n var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n\n support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n\n support.hasNativeScrolling = false;\n\n if (mobileOS.ios || (mobileOS.android && mobileOS.majorVersion > 2) || mobileOS.wp) {\n support.hasNativeScrolling = mobileOS;\n }\n\n support.delayedClick = function() {\n\n // only the mobile devices with touch events do this.\n if (support.touch) {\n // All iOS devices so far (by the time I am writing this, iOS 9.0.2 is the latest),\n // delay their click events.\n if (mobileOS.ios) {\n return true;\n }\n\n if (mobileOS.android) {\n\n if (!support.browser.chrome) { // older webkits and webviews delay the click\n return true;\n }\n\n // from here on, we deal with Chrome on Android.\n if (support.browser.version < 32) {\n return false;\n }\n\n // Chrome 32+ does conditional fast clicks if the view port is not user scalable.\n return !($(\"meta[name=viewport]\").attr(\"content\") || \"\").match(/user-scalable=no/i);\n }\n }\n\n return false;\n };\n\n support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n\n support.detectBrowser = function(ua) {\n var browser = false,\n match = [],\n chromiumEdgeMatch = [],\n browserRxs = {\n edge: /(edge)[ \\/]([\\w.]+)/i,\n webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n safari: /(webkit)[ \\/]([\\w.]+)/i,\n opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n };\n\n for (var agent in browserRxs) {\n if (browserRxs.hasOwnProperty(agent)) {\n match = ua.match(browserRxs[agent]);\n if (match) {\n browser = {};\n browser[agent] = true;\n browser[match[1].toLowerCase().split(\" \")[0].split(\"/\")[0]] = true;\n browser.version = parseInt(document.documentMode || match[2], 10);\n\n if (browser.chrome) {\n chromiumEdgeMatch = ua.match(/(edg)[ \\/]([\\w.]+)/i);\n\n if (chromiumEdgeMatch) {\n browser.chromiumEdge = true;\n }\n }\n\n break;\n }\n }\n }\n\n return browser;\n };\n\n support.browser = support.detectBrowser(navigator.userAgent);\n\n if (!mobileOS && support.touch && support.browser.safari) {\n mobileOS = support.mobileOS = {\n ios: true,\n tablet: \"tablet\",\n device: \"ipad\"\n };\n }\n\n support.detectClipboardAccess = function() {\n var commands = {\n copy: document.queryCommandSupported ? document.queryCommandSupported(\"copy\") : false,\n cut: document.queryCommandSupported ? document.queryCommandSupported(\"cut\") : false,\n paste: document.queryCommandSupported ? document.queryCommandSupported(\"paste\") : false\n };\n\n if (support.browser.chrome) {\n //not using queryCommandSupported due to chromium issues 476508 and 542948\n commands.paste = false;\n if (support.browser.version >= 43) {\n commands.copy = true;\n commands.cut = true;\n }\n }\n\n return commands;\n };\n\n support.clipboard = support.detectClipboardAccess();\n\n support.zoomLevel = function() {\n try {\n var browser = support.browser;\n var ie11WidthCorrection = 0;\n var docEl = document.documentElement;\n\n if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n ie11WidthCorrection = support.scrollbar();\n }\n\n return support.touch ? (docEl.clientWidth / window.innerWidth) :\n browser.msie && browser.version >= 10 ? (((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth) : 1;\n } catch (e) {\n return 1;\n }\n };\n\n (function(browser) {\n // add browser-specific CSS class\n var cssClass = \"\",\n docElement = $(document.documentElement),\n majorVersion = parseInt(browser.version, 10);\n\n if (browser.msie) {\n cssClass = \"ie\";\n } else if (browser.mozilla) {\n cssClass = \"ff\";\n } else if (browser.safari) {\n cssClass = \"safari\";\n } else if (browser.webkit) {\n cssClass = \"webkit\";\n } else if (browser.opera) {\n cssClass = \"opera\";\n } else if (browser.edge) {\n cssClass = \"edge\";\n }\n\n if (cssClass) {\n cssClass = \"k-\" + cssClass + \" k-\" + cssClass + majorVersion;\n }\n if (support.mobileOS) {\n cssClass += \" k-mobile\";\n }\n\n if (!support.cssFlexbox) {\n cssClass += \" k-no-flexbox\";\n }\n\n docElement.addClass(cssClass);\n })(support.browser);\n\n support.eventCapture = document.documentElement.addEventListener;\n\n var input = document.createElement(\"input\");\n\n support.placeholder = \"placeholder\" in input;\n support.propertyChangeEvent = \"onpropertychange\" in input;\n\n support.input = (function() {\n var types = [\"number\", \"date\", \"time\", \"month\", \"week\", \"datetime\", \"datetime-local\"];\n var length = types.length;\n var value = \"test\";\n var result = {};\n var idx = 0;\n var type;\n\n for (;idx < length; idx++) {\n type = types[idx];\n input.setAttribute(\"type\", type);\n input.value = value;\n\n result[type.replace(\"-\", \"\")] = input.type !== \"text\" && input.value !== value;\n }\n\n return result;\n })();\n\n input.style.cssText = \"float:left;\";\n\n support.cssFloat = !!input.style.cssFloat;\n\n input = null;\n\n support.stableSort = (function() {\n // Chrome sort is not stable for more than *10* items\n // IE9+ sort is not stable for than *512* items\n var threshold = 513;\n\n var sorted = [{\n index: 0,\n field: \"b\"\n }];\n\n for (var i = 1; i < threshold; i++) {\n sorted.push({\n index: i,\n field: \"a\"\n });\n }\n\n sorted.sort(function(a, b) {\n return a.field > b.field ? 1 : (a.field < b.field ? -1 : 0);\n });\n\n return sorted[0].index === 1;\n })();\n\n support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector ||\n elementProto.msMatchesSelector || elementProto.oMatchesSelector ||\n elementProto.matchesSelector || elementProto.matches ||\n function( selector ) {\n var nodeList = document.querySelectorAll ? ( this.parentNode || document ).querySelectorAll( selector ) || [] : $(selector),\n i = nodeList.length;\n\n while (i--) {\n if (nodeList[i] == this) {\n return true;\n }\n }\n\n return false;\n };\n\n support.matchMedia = \"matchMedia\" in window;\n\n support.pushState = window.history && window.history.pushState;\n\n support.hashChange = \"onhashchange\" in window;\n\n support.customElements = \"registerElement\" in window.document;\n\n var chrome = support.browser.chrome,\n mobileChrome = support.browser.crios,\n mozilla = support.browser.mozilla,\n safari = support.browser.safari;\n support.msPointers = !chrome && window.MSPointerEvent;\n support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n })();\n\n\n function size(obj) {\n var result = 0, key;\n for (key in obj) {\n if (obj.hasOwnProperty(key) && key != \"toJSON\") { // Ignore fake IE7 toJSON.\n result++;\n }\n }\n\n return result;\n }\n\n function getOffset(element, type, positioned) {\n if (!type) {\n type = \"offset\";\n }\n\n var offset = element[type]();\n // clone ClientRect object to JS object (jQuery3)\n var result = {\n top: offset.top,\n right: offset.right,\n bottom: offset.bottom,\n left: offset.left\n };\n\n // IE10 touch zoom is living in a separate viewport\n if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n var sign = support.isRtl(element) ? 1 : -1;\n\n result.top -= (window.pageYOffset - (document.documentElement.scrollTop));\n result.left -= (window.pageXOffset + (sign * document.documentElement.scrollLeft));\n }\n\n return result;\n }\n\n var directions = {\n left: { reverse: \"right\" },\n right: { reverse: \"left\" },\n down: { reverse: \"up\" },\n up: { reverse: \"down\" },\n top: { reverse: \"bottom\" },\n bottom: { reverse: \"top\" },\n \"in\": { reverse: \"out\" },\n out: { reverse: \"in\" }\n };\n\n function parseEffects(input) {\n var effects = {};\n\n each((typeof input === \"string\" ? input.split(\" \") : input), function(idx) {\n effects[idx] = this;\n });\n\n return effects;\n }\n\n function fx(element) {\n return new kendo.effects.Element(element);\n }\n\n var effects = {};\n\n $.extend(effects, {\n enabled: true,\n Element: function(element) {\n this.element = $(element);\n },\n\n promise: function(element, options) {\n if (!element.is(\":visible\")) {\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\n }\n\n if (options.hide) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n if (options.init) {\n options.init();\n }\n\n if (options.completeCallback) {\n options.completeCallback(element); // call the external complete callback with the element\n }\n\n element.dequeue();\n },\n\n disable: function() {\n this.enabled = false;\n this.promise = this.promiseShim;\n },\n\n enable: function() {\n this.enabled = true;\n this.promise = this.animatedPromise;\n }\n });\n\n effects.promiseShim = effects.promise;\n\n function prepareAnimationOptions(options, duration, reverse, complete) {\n if (typeof options === STRING) {\n // options is the list of effect names separated by space e.g. animate(element, \"fadeIn slideDown\")\n\n // only callback is provided e.g. animate(element, options, function() {});\n if (isFunction(duration)) {\n complete = duration;\n duration = 400;\n reverse = false;\n }\n\n if (isFunction(reverse)) {\n complete = reverse;\n reverse = false;\n }\n\n if (typeof duration === BOOLEAN) {\n reverse = duration;\n duration = 400;\n }\n\n options = {\n effects: options,\n duration: duration,\n reverse: reverse,\n complete: complete\n };\n }\n\n return extend({\n //default options\n effects: {},\n duration: 400, //jQuery default duration\n reverse: false,\n init: noop,\n teardown: noop,\n hide: false\n }, options, { completeCallback: options.complete, complete: noop }); // Move external complete callback, so deferred.resolve can be always executed.\n\n }\n\n function animate(element, options, duration, reverse, complete) {\n var idx = 0,\n length = element.length,\n instance;\n\n for (; idx < length; idx ++) {\n instance = $(element[idx]);\n instance.queue(function() {\n effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n });\n }\n\n return element;\n }\n\n function toggleClass(element, classes, options, add) {\n if (classes) {\n classes = classes.split(\" \");\n\n each(classes, function(idx, value) {\n element.toggleClass(value, add);\n });\n }\n\n return element;\n }\n\n if (!(\"kendoAnimate\" in $.fn)) {\n extend($.fn, {\n kendoStop: function(clearQueue, gotoEnd) {\n return this.stop(clearQueue, gotoEnd);\n },\n\n kendoAnimate: function(options, duration, reverse, complete) {\n return animate(this, options, duration, reverse, complete);\n },\n\n kendoAddClass: function(classes, options) {\n return kendo.toggleClass(this, classes, options, true);\n },\n\n kendoRemoveClass: function(classes, options) {\n return kendo.toggleClass(this, classes, options, false);\n },\n kendoToggleClass: function(classes, options, toggle) {\n return kendo.toggleClass(this, classes, options, toggle);\n }\n });\n }\n\n var ampRegExp = /&/g,\n ltRegExp = //g;\n function htmlEncode(value) {\n return (\"\" + value).replace(ampRegExp, \"&\").replace(ltRegExp, \"<\").replace(gtRegExp, \">\").replace(quoteRegExp, \""\").replace(aposRegExp, \"'\");\n }\n\n function unescape(value) {\n var template;\n\n try {\n template = window.decodeURIComponent(value);\n } catch (error) {\n // If the string contains Unicode characters\n // the decodeURIComponent() will throw an error.\n // Therefore: convert to UTF-8 character\n template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function(_, m1, m2) {\n return String.fromCharCode(parseInt(\"0x\" + (m1 || m2), 16));\n });\n }\n\n return template;\n }\n\n var eventTarget = function(e) {\n return e.target;\n };\n\n if (support.touch) {\n\n eventTarget = function(e) {\n var touches = \"originalEvent\" in e ? e.originalEvent.changedTouches : \"changedTouches\" in e ? e.changedTouches : null;\n\n return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n };\n\n each([\"swipe\", \"swipeLeft\", \"swipeRight\", \"swipeUp\", \"swipeDown\", \"doubleTap\", \"tap\"], function(m, value) {\n $.fn[value] = function(callback) {\n return this.on(value, callback);\n };\n });\n }\n\n if (support.touch) {\n if (!support.mobileOS) {\n support.mousedown = \"mousedown touchstart\";\n support.mouseup = \"mouseup touchend\";\n support.mousemove = \"mousemove touchmove\";\n support.mousecancel = \"mouseleave touchcancel\";\n support.click = \"click\";\n support.resize = \"resize\";\n } else {\n support.mousedown = \"touchstart\";\n support.mouseup = \"touchend\";\n support.mousemove = \"touchmove\";\n support.mousecancel = \"touchcancel\";\n support.click = \"touchend\";\n support.resize = \"orientationchange\";\n }\n } else if (support.pointers) {\n support.mousemove = \"pointermove\";\n support.mousedown = \"pointerdown\";\n support.mouseup = \"pointerup\";\n support.mousecancel = \"pointercancel\";\n support.click = \"pointerup\";\n support.resize = \"orientationchange resize\";\n } else if (support.msPointers) {\n support.mousemove = \"MSPointerMove\";\n support.mousedown = \"MSPointerDown\";\n support.mouseup = \"MSPointerUp\";\n support.mousecancel = \"MSPointerCancel\";\n support.click = \"MSPointerUp\";\n support.resize = \"orientationchange resize\";\n } else {\n support.mousemove = \"mousemove\";\n support.mousedown = \"mousedown\";\n support.mouseup = \"mouseup\";\n support.mousecancel = \"mouseleave\";\n support.click = \"click\";\n support.resize = \"resize\";\n }\n\n var wrapExpression = function(members, paramName) {\n var result = paramName || \"d\",\n index,\n idx,\n length,\n member,\n count = 1;\n\n for (idx = 0, length = members.length; idx < length; idx++) {\n member = members[idx];\n if (member !== \"\") {\n index = member.indexOf(\"[\");\n\n if (index !== 0) {\n if (index == -1) {\n member = \".\" + member;\n } else {\n count++;\n member = \".\" + member.substring(0, index) + \" || {})\" + member.substring(index);\n }\n }\n\n count++;\n result += member + ((idx < length - 1) ? \" || {})\" : \")\");\n }\n }\n return new Array(count).join(\"(\") + result;\n },\n localUrlRe = /^([a-z]+:)?\\/\\//i;\n\n extend(kendo, {\n widgets: [],\n _widgetRegisteredCallbacks: [],\n ui: kendo.ui || {},\n fx: kendo.fx || fx,\n effects: kendo.effects || effects,\n mobile: kendo.mobile || { },\n data: kendo.data || {},\n dataviz: kendo.dataviz || {},\n drawing: kendo.drawing || {},\n spreadsheet: { messages: {} },\n keys: {\n INSERT: 45,\n DELETE: 46,\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n END: 35,\n HOME: 36,\n SPACEBAR: 32,\n PAGEUP: 33,\n PAGEDOWN: 34,\n F2: 113,\n F10: 121,\n F12: 123,\n NUMPAD_PLUS: 107,\n NUMPAD_MINUS: 109,\n NUMPAD_DOT: 110\n },\n support: kendo.support || support,\n animate: kendo.animate || animate,\n ns: \"\",\n attr: function(value) {\n return \"data-\" + kendo.ns + value;\n },\n getShadows: getShadows,\n wrap: wrap,\n deepExtend: deepExtend,\n getComputedStyles: getComputedStyles,\n isScrollable: isScrollable,\n scrollLeft: scrollLeft,\n size: size,\n toCamelCase: toCamelCase,\n toHyphens: toHyphens,\n getOffset: kendo.getOffset || getOffset,\n parseEffects: kendo.parseEffects || parseEffects,\n toggleClass: kendo.toggleClass || toggleClass,\n directions: kendo.directions || directions,\n Observable: Observable,\n Class: Class,\n Template: Template,\n template: Template.compile.bind(Template),\n render: Template.render.bind(Template),\n stringify: JSON.stringify.bind(JSON),\n eventTarget: eventTarget,\n htmlEncode: htmlEncode,\n unescape: unescape,\n isLocalUrl: function(url) {\n return url && !localUrlRe.test(url);\n },\n\n expr: function(expression, safe, paramName) {\n expression = expression || \"\";\n\n if (typeof safe == STRING) {\n paramName = safe;\n safe = false;\n }\n\n paramName = paramName || \"d\";\n\n if (expression && expression.charAt(0) !== \"[\") {\n expression = \".\" + expression;\n }\n\n if (safe) {\n expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g,'\"$1_$DOT$_$2\"');\n expression = expression.replace(/'([^.]*)\\.([^']*)'/g,\"'$1_$DOT$_$2'\");\n expression = wrapExpression(expression.split(\".\"), paramName);\n expression = expression.replace(/_\\$DOT\\$_/g, \".\");\n } else {\n expression = paramName + expression;\n }\n\n return expression;\n },\n\n getter: function(expression, safe) {\n var key = expression + safe;\n return getterCache[key] = getterCache[key] || new Function(\"d\", \"return \" + kendo.expr(expression, safe));\n },\n\n setter: function(expression) {\n return setterCache[expression] = setterCache[expression] || new Function(\"d,value\", kendo.expr(expression) + \"=value\");\n },\n\n accessor: function(expression) {\n return {\n get: kendo.getter(expression),\n set: kendo.setter(expression)\n };\n },\n\n guid: function() {\n var id = \"\", i, random, chars = \"abcdef\";\n\n id += chars[Math.floor(Math.random() * Math.floor(chars.length))];\n\n for (i = 1; i < 32; i++) {\n random = math.random() * 16 | 0;\n\n if (i == 8 || i == 12 || i == 16 || i == 20) {\n id += \"-\";\n }\n id += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);\n }\n\n return id;\n },\n\n roleSelector: function(role) {\n return role.replace(/(\\S+)/g, \"[\" + kendo.attr(\"role\") + \"=$1],\").slice(0, -1);\n },\n\n directiveSelector: function(directives) {\n var selectors = directives.split(\" \");\n\n if (selectors) {\n for (var i = 0; i < selectors.length; i++) {\n if (selectors[i] != \"view\") {\n selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, \"$1-$2\");\n }\n }\n }\n\n return selectors.join(\" \").replace(/(\\S+)/g, \"kendo-mobile-$1,\").slice(0, -1);\n },\n\n triggeredByInput: function(e) {\n return (/^(label|input|textarea|select)$/i).test(e.target.tagName);\n },\n\n onWidgetRegistered: function(callback) {\n for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n callback(kendo.widgets[i]);\n }\n\n kendo._widgetRegisteredCallbacks.push(callback);\n },\n\n logToConsole: function(message, type) {\n var console = window.console;\n\n if (!kendo.suppressLog && typeof(console) != \"undefined\" && console.log) {\n console[type || \"log\"](message);\n }\n }\n });\n\n var Widget = Observable.extend( {\n init: function(element, options) {\n var that = this;\n\n validatePackage();\n\n that.element = kendo.jQuery(element).handler(that);\n\n that.angular(\"init\", options);\n\n Observable.fn.init.call(that);\n\n var dataSource = options ? options.dataSource : null;\n var props;\n\n if (options) {\n props = (that.componentTypes || {})[(options || {}).componentType];\n }\n\n if (dataSource) {\n // avoid deep cloning the data source\n options = extend({}, options, { dataSource: {} });\n }\n\n options = that.options = extend(true, {}, that.options, that.defaults, props || {}, options);\n\n if (dataSource) {\n options.dataSource = dataSource;\n }\n\n if (!that.element.attr(kendo.attr(\"role\"))) {\n that.element.attr(kendo.attr(\"role\"), (options.name || \"\").toLowerCase());\n }\n\n that.element.data(\"kendo\" + options.prefix + options.name, that);\n\n that.bind(that.events, options);\n },\n\n events: [],\n\n options: {\n prefix: \"\"\n },\n\n _hasBindingTarget: function() {\n return !!this.element[0].kendoBindingTarget;\n },\n\n _tabindex: function(target) {\n target = target || this.wrapper;\n\n var element = this.element,\n TABINDEX = \"tabindex\",\n tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n\n element.removeAttr(TABINDEX);\n\n target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n },\n\n setOptions: function(options) {\n this._clearCssClasses(options);\n this._setEvents(options);\n $.extend(this.options, options);\n this._applyCssClasses();\n },\n\n _setEvents: function(options) {\n var that = this,\n idx = 0,\n length = that.events.length,\n e;\n\n for (; idx < length; idx ++) {\n e = that.events[idx];\n if (that.options[e] && options[e]) {\n that.unbind(e, that.options[e]);\n if (that._events && that._events[e]) {\n delete that._events[e];\n }\n }\n }\n\n that.bind(that.events, options);\n },\n\n resize: function(force) {\n var size = this.getSize(),\n currentSize = this._size;\n\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n this._size = size;\n this._resize(size, force);\n this.trigger(\"resize\", size);\n }\n },\n\n getSize: function() {\n return kendo.dimensions(this.element);\n },\n\n size: function(size) {\n if (!size) {\n return this.getSize();\n } else {\n this.setSize(size);\n }\n },\n\n setSize: $.noop,\n _resize: $.noop,\n\n destroy: function() {\n var that = this;\n\n that.element.removeData(\"kendo\" + that.options.prefix + that.options.name);\n that.element.removeData(\"handler\");\n that.unbind();\n },\n _destroy: function() {\n this.destroy();\n },\n angular: function() {},\n\n _muteAngularRebind: function(callback) {\n this._muteRebind = true;\n\n callback.call(this);\n\n this._muteRebind = false;\n },\n\n _applyCssClasses: function(element) {\n var protoOptions = this.__proto__.options,\n options = this.options,\n el = element || this.wrapper || this.element,\n classes = [],\n i, prop, validFill, widgetName;\n\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n return;\n }\n\n for (i = 0; i < cssPropertiesNames.length; i++) {\n prop = cssPropertiesNames[i];\n widgetName = this.options._altname || protoOptions.name;\n\n if (protoOptions.hasOwnProperty(prop)) {\n if (prop === \"themeColor\") {\n validFill = kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: \"fillMode\",\n value: options.fillMode\n });\n\n if (validFill && validFill.length) {\n classes.push(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: options[prop],\n fill: options.fillMode\n }));\n }\n } else {\n classes.push(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: options[prop]\n }));\n }\n }\n }\n\n el.addClass(classes.join(\" \"));\n },\n\n _ariaLabel: function(target) {\n var that = this,\n inputElm = that.element,\n inputId = inputElm.attr(\"id\"),\n labelElm = $(\"label[for=\\\"\" + inputId + \"\\\"]\"),\n ariaLabel = inputElm.attr(ARIA_LABEL),\n ariaLabelledBy = inputElm.attr(ARIA_LABELLEDBY),\n labelId;\n\n if (target[0] === inputElm[0]) {\n return;\n }\n\n if (ariaLabel) {\n target.attr(ARIA_LABEL, ariaLabel);\n } else if (ariaLabelledBy) {\n target.attr(ARIA_LABELLEDBY, ariaLabelledBy);\n } else if (labelElm.length) {\n labelId = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\n target.attr(ARIA_LABELLEDBY, labelId);\n }\n },\n\n _clearCssClasses: function(newOptions, element) {\n var protoOptions = this.__proto__.options,\n currentOptions = this.options,\n el = element || this.wrapper || this.element,\n i, prop, widgetName;\n\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n return;\n }\n\n for (i = 0; i < cssPropertiesNames.length; i++) {\n prop = cssPropertiesNames[i];\n widgetName = this.options._altname || protoOptions.name;\n\n if (protoOptions.hasOwnProperty(prop) && newOptions.hasOwnProperty(prop)) {\n if (prop === \"themeColor\") {\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: currentOptions[prop],\n fill: currentOptions.fillMode\n }));\n } else {\n if (prop === \"fillMode\") {\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: \"themeColor\",\n value: currentOptions.themeColor,\n fill: currentOptions.fillMode\n }));\n }\n\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: currentOptions[prop]\n }));\n }\n }\n }\n },\n\n _generateLabelId: function(label, inputId) {\n var labelId = inputId + LABELIDPART;\n\n label.attr(\"id\", labelId);\n\n return labelId;\n },\n });\n\n var DataBoundWidget = Widget.extend({\n // Angular consumes these.\n dataItems: function() {\n return this.dataSource.flatView();\n },\n\n _angularItems: function(cmd) {\n var that = this;\n that.angular(cmd, function() {\n return {\n elements: that.items(),\n data: $.map(that.dataItems(), function(dataItem) {\n return { dataItem: dataItem };\n })\n };\n });\n }\n });\n\n kendo.dimensions = function(element, dimensions) {\n var domElement = element[0];\n\n if (dimensions) {\n element.css(dimensions);\n }\n\n return { width: domElement.offsetWidth, height: domElement.offsetHeight };\n };\n\n kendo.notify = noop;\n\n var templateRegExp = /template$/i,\n jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/,\n jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/,\n dashRegExp = /([A-Z])/g;\n\n function parseOption(element, option) {\n var value;\n\n if (option.indexOf(\"data\") === 0) {\n option = option.substring(4);\n option = option.charAt(0).toLowerCase() + option.substring(1);\n }\n\n option = option.replace(dashRegExp, \"-$1\");\n value = element.getAttribute(\"data-\" + kendo.ns + option);\n\n if (value === null) {\n value = undefined;\n } else if (value === \"null\") {\n value = null;\n } else if (value === \"true\") {\n value = true;\n } else if (value === \"false\") {\n value = false;\n } else if (numberRegExp.test(value) && option != \"mask\" && option != \"format\") {\n value = parseFloat(value);\n } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n value = new Function(\"return (\" + value + \")\")();\n }\n\n return value;\n }\n\n function parseOptions(element, options, source) {\n var result = {},\n option,\n value,\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n for (option in options) {\n value = parseOption(element, option);\n\n if (value !== undefined) {\n\n if (templateRegExp.test(option) && role != \"drawer\") {\n if (typeof value === \"string\") {\n if ($(\"#\" + value).length) {\n value = kendo.template($(\"#\" + value).html());\n } else if (source) {\n value = kendo.template(source[value]);\n }\n } else {\n value = element.getAttribute(option);\n }\n }\n\n result[option] = value;\n }\n }\n\n return result;\n }\n\n kendo.initWidget = function(element, options, roles) {\n var result,\n option,\n widget,\n idx,\n length,\n role,\n value,\n dataSource,\n fullPath,\n widgetKeyRegExp;\n\n // Preserve backwards compatibility with (element, options, namespace) signature, where namespace was kendo.ui\n if (!roles) {\n roles = kendo.ui.roles;\n } else if (roles.roles) {\n roles = roles.roles;\n }\n\n element = element.nodeType ? element : element[0];\n\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n if (!role) {\n return;\n }\n\n fullPath = role.indexOf(\".\") === -1;\n\n // look for any widget that may be already instantiated based on this role.\n // The prefix used is unknown, hence the regexp\n //\n\n if (fullPath) {\n widget = roles[role];\n } else { // full namespace path - like kendo.ui.Widget\n widget = kendo.getter(role)(window);\n }\n\n var data = $(element).data(),\n widgetKey = widget ? \"kendo\" + widget.fn.options.prefix + widget.fn.options.name : \"\";\n\n if (fullPath) {\n widgetKeyRegExp = new RegExp(\"^kendo.*\" + role + \"$\", \"i\");\n } else { // full namespace path - like kendo.ui.Widget\n widgetKeyRegExp = new RegExp(\"^\" + widgetKey + \"$\", \"i\");\n }\n\n for (var key in data) {\n if (key.match(widgetKeyRegExp)) {\n // we have detected a widget of the same kind - save its reference, we will set its options\n if (key === widgetKey) {\n result = data[key];\n } else {\n return data[key];\n }\n }\n }\n\n if (!widget) {\n return;\n }\n\n dataSource = parseOption(element, \"dataSource\");\n\n options = $.extend({}, parseOptions(element, $.extend({}, widget.fn.options, widget.fn.defaults) ), options);\n\n if (dataSource) {\n if (typeof dataSource === STRING) {\n options.dataSource = kendo.getter(dataSource)(window);\n } else {\n options.dataSource = dataSource;\n }\n }\n\n for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n option = widget.fn.events[idx];\n\n value = parseOption(element, option);\n\n if (value !== undefined) {\n options[option] = kendo.getter(value)(window);\n }\n }\n\n if (!result) {\n result = new widget(element, options);\n } else if (!$.isEmptyObject(options)) {\n result.setOptions(options);\n }\n\n return result;\n };\n\n kendo.rolesFromNamespaces = function(namespaces) {\n var roles = [],\n idx,\n length;\n\n if (!namespaces[0]) {\n namespaces = [kendo.ui, kendo.dataviz.ui];\n }\n\n for (idx = 0, length = namespaces.length; idx < length; idx ++) {\n roles[idx] = namespaces[idx].roles;\n }\n\n return extend.apply(null, [{}].concat(roles.reverse()));\n };\n\n kendo.init = function(element) {\n var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n kendo.initWidget(this, {}, roles);\n });\n };\n\n kendo.destroy = function(element) {\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n var data = $(this).data();\n\n for (var key in data) {\n if (key.indexOf(\"kendo\") === 0 && typeof data[key].destroy === FUNCTION) {\n data[key].destroy();\n }\n }\n });\n };\n\n function containmentComparer(a, b) {\n return $.contains(a, b) ? -1 : 1;\n }\n\n function resizableWidget() {\n var widget = $(this);\n return ($.inArray(widget.attr(\"data-\" + kendo.ns + \"role\"), [\"slider\", \"rangeslider\", \"breadcrumb\"]) > -1) || widget.is(\":visible\");\n }\n\n kendo.resize = function(element, force) {\n var widgets = $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().filter(resizableWidget);\n\n if (!widgets.length) {\n return;\n }\n\n // sort widgets based on their parent-child relation\n var widgetsArray = $.makeArray(widgets);\n widgetsArray.sort(containmentComparer);\n\n // resize widgets\n $.each(widgetsArray, function() {\n var widget = kendo.widgetInstance($(this));\n if (widget) {\n widget.resize(force);\n }\n });\n };\n\n kendo.parseOptions = parseOptions;\n\n extend(kendo.ui, {\n Widget: Widget,\n DataBoundWidget: DataBoundWidget,\n roles: {},\n progress: function(container, toggle, options) {\n var mask = container.find(\".k-loading-mask\"),\n support = kendo.support,\n browser = support.browser,\n isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n\n options = $.extend({}, {\n width: \"100%\",\n height: \"100%\",\n top: container.scrollTop(),\n opacity: false\n }, options);\n\n cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n\n if (toggle) {\n if (!mask.length) {\n isRtl = support.isRtl(container);\n leftRight = isRtl ? \"right\" : \"left\";\n containerScrollLeft = kendo.scrollLeft(container);\n webkitCorrection = browser.webkit ? (!isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft) : 0;\n\n mask = $(kendo.format(\"
{1}
\", cssClass, kendo.ui.progress.messages.loading))\n .width(options.width).height(options.height)\n .css(\"top\", options.top)\n .css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection)\n .prependTo(container);\n }\n } else if (mask) {\n mask.remove();\n }\n },\n plugin: function(widget, register, prefix) {\n var name = widget.fn.options.name,\n getter;\n\n register = register || kendo.ui;\n prefix = prefix || \"\";\n\n register[name] = widget;\n\n register.roles[name.toLowerCase()] = widget;\n\n getter = \"getKendo\" + prefix + name;\n name = \"kendo\" + prefix + name;\n\n var widgetEntry = { name: name, widget: widget, prefix: prefix || \"\" };\n kendo.widgets.push(widgetEntry);\n\n for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n kendo._widgetRegisteredCallbacks[i](widgetEntry);\n }\n\n $.fn[name] = function(options) {\n var value = this,\n args;\n\n if (typeof options === STRING) {\n args = slice.call(arguments, 1);\n\n this.each(function() {\n var widget = $.data(this, name),\n method,\n result;\n\n if (!widget) {\n throw new Error(kendo.format(\"Cannot call method '{0}' of {1} before it is initialized\", options, name));\n }\n\n method = widget[options];\n\n if (typeof method !== FUNCTION) {\n throw new Error(kendo.format(\"Cannot find method '{0}' of {1}\", options, name));\n }\n\n result = method.apply(widget, args);\n\n if (result !== undefined) {\n value = result;\n return false;\n }\n });\n } else {\n this.each(function() {\n return new widget(this, options);\n });\n }\n\n return value;\n };\n\n $.fn[name].widget = widget;\n\n $.fn[getter] = function() {\n return this.data(name);\n };\n }\n });\n\n kendo.ui.progress.messages = {\n loading: \"Loading...\"\n };\n\n var ContainerNullObject = { bind: function() { return this; }, nullObject: true, options: {} };\n\n var MobileWidget = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n this.element.autoApplyNS();\n this.wrapper = this.element;\n this.element.addClass(\"km-widget\");\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.element.kendoDestroy();\n },\n\n options: {\n prefix: \"Mobile\"\n },\n\n events: [],\n\n view: function() {\n var viewElement = this.element.closest(kendo.roleSelector(\"view splitview modalview drawer\"));\n return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n },\n\n viewHasNativeScrolling: function() {\n var view = this.view();\n return view && view.options.useNativeScrolling;\n },\n\n container: function() {\n var element = this.element.closest(kendo.roleSelector(\"view layout modalview drawer splitview\"));\n return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n }\n });\n\n extend(kendo.mobile, {\n init: function(element) {\n kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n },\n\n appLevelNativeScrolling: function() {\n return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n },\n\n roles: {},\n\n ui: {\n Widget: MobileWidget,\n DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n roles: {},\n plugin: function(widget) {\n kendo.ui.plugin(widget, kendo.mobile.ui, \"Mobile\");\n }\n }\n });\n\n deepExtend(kendo.dataviz, {\n init: function(element) {\n kendo.init(element, kendo.dataviz.ui);\n },\n ui: {\n roles: {},\n themes: {},\n views: [],\n plugin: function(widget) {\n kendo.ui.plugin(widget, kendo.dataviz.ui);\n }\n },\n roles: {}\n });\n\n kendo.touchScroller = function(elements, options) {\n // return the first touch scroller\n if (!options) { options = {}; }\n\n options.useNative = true;\n\n return $(elements).map(function(idx, element) {\n element = $(element);\n if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data(\"kendoMobileScroller\")) {\n element.kendoMobileScroller(options);\n return element.data(\"kendoMobileScroller\");\n } else {\n return false;\n }\n })[0];\n };\n\n kendo.preventDefault = function(e) {\n e.preventDefault();\n };\n\n kendo.widgetInstance = function(element, suites) {\n var role = element.data(kendo.ns + \"role\"),\n widgets = [], i, length,\n elementData = element.data(\"kendoView\");\n\n if (role) {\n // HACK!!! mobile view scroller widgets are instantiated on data-role=\"content\" elements. We need to discover them when resizing.\n if (role === \"content\") {\n role = \"scroller\";\n }\n\n // kendoEditorToolbar is not a public plugin, thus it does not exist in kendo.ui.roles.\n // Therefore, this is needed in order to be resized when placed in Kendo Window.\n if (role === \"editortoolbar\") {\n var editorToolbar = element.data(\"kendoEditorToolbar\");\n if (editorToolbar) {\n return editorToolbar;\n }\n }\n\n // kendo.View is not a ui plugin\n\n if (role === \"view\" && elementData) {\n return elementData;\n }\n\n if (suites) {\n if (suites[0]) {\n for (i = 0, length = suites.length; i < length; i ++) {\n widgets.push(suites[i].roles[role]);\n }\n } else {\n widgets.push(suites.roles[role]);\n }\n }\n else {\n widgets = [ kendo.ui.roles[role], kendo.dataviz.ui.roles[role], kendo.mobile.ui.roles[role] ];\n }\n\n if (role.indexOf(\".\") >= 0) {\n widgets = [ kendo.getter(role)(window) ];\n }\n\n for (i = 0, length = widgets.length; i < length; i ++) {\n var widget = widgets[i];\n if (widget) {\n var instance = element.data(\"kendo\" + widget.fn.options.prefix + widget.fn.options.name);\n if (instance) {\n return instance;\n }\n }\n }\n }\n };\n\n kendo.onResize = function(callback) {\n var handler = callback;\n if (support.mobileOS.android) {\n handler = function() { setTimeout(callback, 600); };\n }\n\n $(window).on(support.resize, handler);\n return handler;\n };\n\n kendo.unbindResize = function(callback) {\n $(window).off(support.resize, callback);\n };\n\n kendo.attrValue = function(element, key) {\n return element.data(kendo.ns + key);\n };\n\n kendo.days = {\n Sunday: 0,\n Monday: 1,\n Tuesday: 2,\n Wednesday: 3,\n Thursday: 4,\n Friday: 5,\n Saturday: 6\n };\n\n function focusable(element, isTabIndexNotNaN) {\n var nodeName = element.nodeName.toLowerCase();\n\n return (/input|select|textarea|button|object/.test(nodeName) ?\n !element.disabled :\n nodeName === \"a\" ?\n element.href || isTabIndexNotNaN :\n isTabIndexNotNaN\n ) &&\n visible(element);\n }\n\n function visible(element) {\n return $.expr.pseudos.visible(element) &&\n !$(element).parents().addBack().filter(function() {\n return $.css(this,\"visibility\") === \"hidden\";\n }).length;\n }\n\n $.extend($.expr.pseudos, {\n kendoFocusable: function(element) {\n var idx = $.attr(element, \"tabindex\");\n return focusable(element, !isNaN(idx) && idx > -1);\n }\n });\n\n var MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mouseup\", \"click\"];\n var EXCLUDE_BUST_CLICK_SELECTOR = \"label, input, [data-rel=external]\";\n\n var MouseEventNormalizer = {\n setupMouseMute: function() {\n var idx = 0,\n length = MOUSE_EVENTS.length,\n element = document.documentElement;\n\n if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n return;\n }\n\n MouseEventNormalizer.mouseTrap = true;\n\n MouseEventNormalizer.bustClick = false;\n MouseEventNormalizer.captureMouse = false;\n\n var handler = function(e) {\n if (MouseEventNormalizer.captureMouse) {\n if (e.type === \"click\") {\n if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n e.preventDefault();\n e.stopPropagation();\n }\n } else {\n e.stopPropagation();\n }\n }\n };\n\n for (; idx < length; idx++) {\n element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n }\n },\n\n muteMouse: function(e) {\n MouseEventNormalizer.captureMouse = true;\n if (e.data.bustClick) {\n MouseEventNormalizer.bustClick = true;\n }\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n },\n\n unMuteMouse: function() {\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function() {\n MouseEventNormalizer.captureMouse = false;\n MouseEventNormalizer.bustClick = false;\n }, 400);\n }\n };\n\n var eventMap = {\n down: \"touchstart mousedown\",\n move: \"mousemove touchmove\",\n up: \"mouseup touchend touchcancel\",\n cancel: \"mouseleave touchcancel\"\n };\n\n if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n eventMap = {\n down: \"touchstart\",\n move: \"touchmove\",\n up: \"touchend touchcancel\",\n cancel: \"touchcancel\"\n };\n } else if (support.pointers) {\n eventMap = {\n down: \"pointerdown\",\n move: \"pointermove\",\n up: \"pointerup\",\n cancel: \"pointercancel pointerleave\"\n };\n } else if (support.msPointers) {\n eventMap = {\n down: \"MSPointerDown\",\n move: \"MSPointerMove\",\n up: \"MSPointerUp\",\n cancel: \"MSPointerCancel MSPointerLeave\"\n };\n }\n\n if (support.msPointers && !(\"onmspointerenter\" in window)) { // IE10\n // Create MSPointerEnter/MSPointerLeave events using mouseover/out and event-time checks\n $.each({\n MSPointerEnter: \"MSPointerOver\",\n MSPointerLeave: \"MSPointerOut\"\n }, function( orig, fix ) {\n $.event.special[ orig ] = {\n delegateType: fix,\n bindType: fix,\n\n handle: function( event ) {\n var ret,\n target = this,\n related = event.relatedTarget,\n handleObj = event.handleObj;\n\n // For mousenter/leave call the handler if related is outside the target.\n // NB: No relatedTarget if the mouse left/entered the browser window\n if ( !related || (related !== target && !$.contains( target, related )) ) {\n event.type = handleObj.origType;\n ret = handleObj.handler.apply( this, arguments );\n event.type = fix;\n }\n return ret;\n }\n };\n });\n }\n\n\n var getEventMap = function(e) { return (eventMap[e] || e); },\n eventRegEx = /([^ ]+)/g;\n\n kendo.applyEventMap = function(events, ns) {\n events = events.replace(eventRegEx, getEventMap);\n\n if (ns) {\n events = events.replace(eventRegEx, \"$1.\" + ns);\n }\n\n return events;\n };\n\n kendo.keyDownHandler = function(e, widget) {\n var events = widget._events.kendoKeydown;\n\n if (!events) {\n return true;\n }\n\n events = events.slice();\n e.sender = widget;\n e.preventKendoKeydown = false;\n for (var idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(widget, e);\n }\n\n return !e.preventKendoKeydown;\n };\n\n var on = $.fn.on;\n\n function kendoJQuery(selector, context) {\n return new kendoJQuery.fn.init(selector, context);\n }\n\n noDepricateExtend(true, kendoJQuery, $);\n\n kendoJQuery.fn = kendoJQuery.prototype = new $();\n\n kendoJQuery.fn.constructor = kendoJQuery;\n\n kendoJQuery.fn.init = function(selector, context) {\n if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n context = kendoJQuery(context);\n }\n\n return $.fn.init.call(this, selector, context, rootjQuery);\n };\n\n kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n\n var rootjQuery = kendoJQuery(document);\n\n extend(kendoJQuery.fn, {\n handler: function(handler) {\n this.data(\"handler\", handler);\n return this;\n },\n\n autoApplyNS: function(ns) {\n this.data(\"kendoNS\", ns || kendo.guid());\n return this;\n },\n\n on: function() {\n var that = this,\n ns = that.data(\"kendoNS\");\n\n // support for event map signature\n if (arguments.length === 1) {\n return on.call(that, arguments[0]);\n }\n\n var context = that,\n args = slice.call(arguments);\n\n if (typeof args[args.length - 1] === UNDEFINED) {\n args.pop();\n }\n\n var callback = args[args.length - 1],\n events = kendo.applyEventMap(args[0], ns);\n\n // setup mouse trap\n if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n MouseEventNormalizer.setupMouseMute();\n\n var selector = args.length === 2 ? null : args[1],\n bustClick = events.indexOf(\"click\") > -1 && events.indexOf(\"touchend\") > -1;\n\n on.call(this,\n {\n touchstart: MouseEventNormalizer.muteMouse,\n touchend: MouseEventNormalizer.unMuteMouse\n },\n selector,\n {\n bustClick: bustClick\n });\n }\n\n if (arguments[0].indexOf(\"keydown\") !== -1 && args[1] && args[1].options) {\n args[0] = events;\n var widget = args[1];\n var keyDownCallBack = args[args.length - 1];\n args[args.length - 1] = function(e) {\n if (kendo.keyDownHandler(e, widget)) {\n return keyDownCallBack.apply(this, [e]);\n }\n };\n on.apply(that, args);\n return that;\n }\n\n if (typeof callback === STRING) {\n context = that.data(\"handler\");\n callback = context[callback];\n\n args[args.length - 1] = function(e) {\n callback.call(context, e);\n };\n }\n\n args[0] = events;\n\n on.apply(that, args);\n\n return that;\n },\n\n kendoDestroy: function(ns) {\n ns = ns || this.data(\"kendoNS\");\n\n if (ns) {\n this.off(\".\" + ns);\n }\n\n return this;\n }\n });\n\n kendo.jQuery = kendoJQuery;\n kendo.eventMap = eventMap;\n\n kendo.timezone = (function() {\n var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };\n var days = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\n\n function ruleToDate(year, rule) {\n var date;\n var targetDay;\n var ourDay;\n var month = rule[3];\n var on = rule[4];\n var time = rule[5];\n var cache = rule[8];\n\n if (!cache) {\n rule[8] = cache = {};\n }\n\n if (cache[year]) {\n return cache[year];\n }\n\n if (!isNaN(on)) {\n date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n } else if (on.indexOf(\"last\") === 0) {\n date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n\n targetDay = days[on.substr(4, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n } else if (on.indexOf(\">=\") >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n } else if (on.indexOf(\"<=\") >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n }\n\n return cache[year] = date;\n }\n\n function findRule(utcTime, rules, zone) {\n rules = rules[zone];\n\n if (!rules) {\n var time = zone.split(\":\");\n var offset = 0;\n\n if (time.length > 1) {\n offset = time[0] * 60 + Number(time[1]);\n }\n\n return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-'];\n }\n\n var year = new Date(utcTime).getUTCFullYear();\n\n rules = jQuery.grep(rules, function(rule) {\n var from = rule[0];\n var to = rule[1];\n\n return from <= year && (to >= year || (from == year && to == \"only\") || to == \"max\");\n });\n\n rules.push(utcTime);\n\n rules.sort(function(a, b) {\n if (typeof a != \"number\") {\n a = Number(ruleToDate(year, a));\n }\n\n if (typeof b != \"number\") {\n b = Number(ruleToDate(year, b));\n }\n\n return a - b;\n });\n\n var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n\n return isNaN(rule) ? rule : null;\n }\n\n function findZone(utcTime, zones, timezone) {\n var zoneRules = zones[timezone];\n\n if (typeof zoneRules === \"string\") {\n zoneRules = zones[zoneRules];\n }\n\n if (!zoneRules) {\n throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n }\n\n for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n var until = zoneRules[idx][3];\n\n if (until && utcTime > until) {\n break;\n }\n }\n\n var zone = zoneRules[idx + 1];\n\n if (!zone) {\n throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + \".\");\n }\n\n return zone;\n }\n\n function zoneAndRule(utcTime, zones, rules, timezone) {\n if (typeof utcTime != NUMBER) {\n utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(),\n utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(),\n utcTime.getSeconds(), utcTime.getMilliseconds());\n }\n\n var zone = findZone(utcTime, zones, timezone);\n\n return {\n zone: zone,\n rule: findRule(utcTime, rules, zone[1])\n };\n }\n\n function offset(utcTime, timezone) {\n if (timezone == \"Etc/UTC\" || timezone == \"Etc/GMT\") {\n return 0;\n }\n\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n\n return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n }\n\n function abbr(utcTime, timezone) {\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n\n var base = zone[2];\n\n if (base.indexOf(\"/\") >= 0) {\n return base.split(\"/\")[rule && +rule[6] ? 1 : 0];\n } else if (base.indexOf(\"%s\") >= 0) {\n return base.replace(\"%s\", (!rule || rule[7] == \"-\") ? '' : rule[7]);\n }\n\n return base;\n }\n\n function convert(date, fromOffset, toOffset) {\n var tempToOffset = toOffset;\n var diff;\n\n if (typeof fromOffset == STRING) {\n fromOffset = this.offset(date, fromOffset);\n }\n\n if (typeof toOffset == STRING) {\n toOffset = this.offset(date, toOffset);\n }\n\n var fromLocalOffset = date.getTimezoneOffset();\n\n date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n\n var toLocalOffset = date.getTimezoneOffset();\n\n if (typeof tempToOffset == STRING) {\n tempToOffset = this.offset(date, tempToOffset);\n }\n\n diff = (toLocalOffset - fromLocalOffset) + (toOffset - tempToOffset);\n\n return new Date(date.getTime() + diff * 60000);\n }\n\n function apply(date, timezone) {\n return this.convert(date, date.getTimezoneOffset(), timezone);\n }\n\n function remove(date, timezone) {\n return this.convert(date, timezone, date.getTimezoneOffset());\n }\n\n function toLocalDate(time) {\n return this.apply(new Date(time), \"Etc/UTC\");\n }\n\n return {\n zones: {},\n rules: {},\n offset: offset,\n convert: convert,\n apply: apply,\n remove: remove,\n abbr: abbr,\n toLocalDate: toLocalDate\n };\n })();\n\n kendo.date = (function() {\n var MS_PER_MINUTE = 60000,\n MS_PER_DAY = 86400000;\n\n function adjustDST(date, hours) {\n if (hours === 0 && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n return true;\n }\n\n return false;\n }\n\n function setDayOfWeek(date, day, dir) {\n var hours = date.getHours();\n\n dir = dir || 1;\n day = ((day - date.getDay()) + (7 * dir)) % 7;\n\n date.setDate(date.getDate() + day);\n adjustDST(date, hours);\n }\n\n function dayOfWeek(date, day, dir) {\n date = new Date(date);\n setDayOfWeek(date, day, dir);\n return date;\n }\n\n function firstDayOfMonth(date) {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n 1\n );\n }\n\n function lastDayOfMonth(date) {\n var last = new Date(date.getFullYear(), date.getMonth() + 1, 0),\n first = firstDayOfMonth(date),\n timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n\n if (timeOffset) {\n last.setHours(first.getHours() + (timeOffset / 60));\n }\n\n return last;\n }\n\n function firstDayOfYear(date) {\n return new Date(date.getFullYear(), 0, 1);\n }\n\n function lastDayOfYear(date) {\n return new Date(date.getFullYear(), 11, 31);\n }\n\n function moveDateToWeekStart(date, weekStartDay) {\n if (weekStartDay !== 1) {\n return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n }\n\n return addDays(date, (4 - (date.getDay() || 7)));\n }\n\n function calcWeekInYear(date, weekStartDay) {\n var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n\n var newDate = moveDateToWeekStart(date, weekStartDay);\n\n var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n\n var days = Math.floor(diffInMS / MS_PER_DAY);\n\n return 1 + Math.floor(days / 7);\n }\n\n function weekInYear(date, weekStartDay) {\n if (weekStartDay === undefined) {\n weekStartDay = kendo.culture().calendar.firstDay;\n }\n\n var prevWeekDate = addDays(date, -7);\n var nextWeekDate = addDays(date, 7);\n\n var weekNumber = calcWeekInYear(date, weekStartDay);\n\n if (weekNumber === 0) {\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n }\n\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n return 1;\n }\n\n return weekNumber;\n }\n\n function getDate(date) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n adjustDST(date, 0);\n return date;\n }\n\n function toUtcTime(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(),\n date.getDate(), date.getHours(), date.getMinutes(),\n date.getSeconds(), date.getMilliseconds());\n }\n\n function getMilliseconds(date) {\n return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n }\n\n function isInTimeRange(value, min, max) {\n var msMin = getMilliseconds(min),\n msMax = getMilliseconds(max),\n msValue;\n\n if (!value || msMin == msMax) {\n return true;\n }\n\n if (min >= max) {\n max += MS_PER_DAY;\n }\n\n msValue = getMilliseconds(value);\n\n if (msMin > msValue) {\n msValue += MS_PER_DAY;\n }\n\n if (msMax < msMin) {\n msMax += MS_PER_DAY;\n }\n\n return msValue >= msMin && msValue <= msMax;\n }\n\n function isInDateRange(value, min, max) {\n var msMin = min.getTime(),\n msMax = max.getTime(),\n msValue;\n\n if (msMin >= msMax) {\n msMax += MS_PER_DAY;\n }\n\n msValue = value.getTime();\n\n return msValue >= msMin && msValue <= msMax;\n }\n\n function addDays(date, offset) {\n var hours = date.getHours();\n date = new Date(date);\n\n setTime(date, offset * MS_PER_DAY);\n adjustDST(date, hours);\n return date;\n }\n\n function setTime(date, milliseconds, ignoreDST) {\n var offset = date.getTimezoneOffset();\n var difference;\n\n date.setTime(date.getTime() + milliseconds);\n\n if (!ignoreDST) {\n difference = date.getTimezoneOffset() - offset;\n date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n }\n }\n\n function setHours(date, time) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n adjustDST(date, time.getHours());\n return date;\n }\n\n function today() {\n return getDate(new Date());\n }\n\n function isToday(date) {\n return getDate(date).getTime() == today().getTime();\n }\n\n function toInvariantTime(date) {\n var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n\n if (date) {\n staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n }\n\n return staticDate;\n }\n\n function addYear(date, offset) {\n var currentDate = new Date(date);\n\n return new Date(currentDate.setFullYear(currentDate.getFullYear() + offset));\n }\n\n return {\n adjustDST: adjustDST,\n dayOfWeek: dayOfWeek,\n setDayOfWeek: setDayOfWeek,\n getDate: getDate,\n isInDateRange: isInDateRange,\n isInTimeRange: isInTimeRange,\n isToday: isToday,\n nextDay: function(date) {\n return addDays(date, 1);\n },\n previousDay: function(date) {\n return addDays(date, -1);\n },\n toUtcTime: toUtcTime,\n MS_PER_DAY: MS_PER_DAY,\n MS_PER_HOUR: 60 * MS_PER_MINUTE,\n MS_PER_MINUTE: MS_PER_MINUTE,\n setTime: setTime,\n setHours: setHours,\n addDays: addDays,\n today: today,\n toInvariantTime: toInvariantTime,\n firstDayOfMonth: firstDayOfMonth,\n lastDayOfMonth: lastDayOfMonth,\n weekInYear: weekInYear,\n getMilliseconds: getMilliseconds,\n firstDayOfYear: firstDayOfYear,\n lastDayOfYear: lastDayOfYear,\n nextYear: function(date) {\n return addYear(date, 1);\n },\n previousYear: function(date) {\n return addYear(date, -1);\n }\n };\n })();\n\n\n kendo.stripWhitespace = function(element) {\n if (document.createNodeIterator) {\n var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function(node) {\n return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, false);\n\n while (iterator.nextNode()) {\n if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n }\n }\n } else { // IE7/8 support\n for (var i = 0; i < element.childNodes.length; i++) {\n var child = element.childNodes[i];\n\n if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n element.removeChild(child);\n i--;\n }\n\n if (child.nodeType == 1) {\n kendo.stripWhitespace(child);\n }\n }\n }\n };\n\n var animationFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) { setTimeout(callback, 1000 / 60); };\n\n kendo.animationFrame = function(callback) {\n animationFrame.call(window, callback);\n };\n\n var animationQueue = [];\n\n kendo.queueAnimation = function(callback) {\n animationQueue[animationQueue.length] = callback;\n if (animationQueue.length === 1) {\n kendo.runNextAnimation();\n }\n };\n\n kendo.runNextAnimation = function() {\n kendo.animationFrame(function() {\n if (animationQueue[0]) {\n animationQueue.shift()();\n if (animationQueue[0]) {\n kendo.runNextAnimation();\n }\n }\n });\n };\n\n kendo.parseQueryStringParams = function(url) {\n var queryString = url.split('?')[1] || \"\",\n params = {},\n paramParts = queryString.split(/&|=/),\n length = paramParts.length,\n idx = 0;\n\n for (; idx < length; idx += 2) {\n if (paramParts[idx] !== \"\") {\n params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n }\n }\n\n return params;\n };\n\n kendo.elementUnderCursor = function(e) {\n if (typeof e.x.client != \"undefined\") {\n return document.elementFromPoint(e.x.client, e.y.client);\n }\n };\n\n kendo.wheelDeltaY = function(jQueryEvent) {\n var e = jQueryEvent.originalEvent,\n deltaY = e.wheelDeltaY,\n delta;\n\n if (e.wheelDelta) { // Webkit and IE\n if (deltaY === undefined || deltaY) { // IE does not have deltaY, thus always scroll (horizontal scrolling is treated as vertical)\n delta = e.wheelDelta;\n }\n } else if (e.detail && e.axis === e.VERTICAL_AXIS) { // Firefox and Opera\n delta = (-e.detail) * 10;\n }\n\n return delta;\n };\n\n kendo.throttle = function(fn, delay) {\n var timeout;\n var lastExecTime = 0;\n\n if (!delay || delay <= 0) {\n return fn;\n }\n\n var throttled = function() {\n var that = this;\n var elapsed = +new Date() - lastExecTime;\n var args = arguments;\n\n function exec() {\n fn.apply(that, args);\n lastExecTime = +new Date();\n }\n\n // first execution\n if (!lastExecTime) {\n return exec();\n }\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n if (elapsed > delay) {\n exec();\n } else {\n timeout = setTimeout(exec, delay - elapsed);\n }\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n };\n\n return throttled;\n };\n\n\n kendo.caret = function(element, start, end) {\n var rangeElement;\n var isPosition = start !== undefined;\n\n if (end === undefined) {\n end = start;\n }\n\n if (element[0]) {\n element = element[0];\n }\n\n if (isPosition && element.disabled) {\n return;\n }\n\n try {\n if (element.selectionStart !== undefined) {\n if (isPosition) {\n element.focus();\n var mobile = support.mobileOS;\n if (mobile.wp || mobile.android) {// without the timeout the caret is at the end of the input\n setTimeout(function() { element.setSelectionRange(start, end); }, 0);\n }\n else {\n element.setSelectionRange(start, end);\n }\n } else {\n start = [element.selectionStart, element.selectionEnd];\n }\n } else if (document.selection) {\n if ($(element).is(\":visible\")) {\n element.focus();\n }\n\n rangeElement = element.createTextRange();\n\n if (isPosition) {\n rangeElement.collapse(true);\n rangeElement.moveStart(\"character\", start);\n rangeElement.moveEnd(\"character\", end - start);\n rangeElement.select();\n } else {\n var rangeDuplicated = rangeElement.duplicate(),\n selectionStart, selectionEnd;\n\n rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n selectionStart = rangeDuplicated.text.length;\n selectionEnd = selectionStart + rangeElement.text.length;\n\n start = [selectionStart, selectionEnd];\n }\n }\n } catch (e) {\n /* element is not focused or it is not in the DOM */\n start = [];\n }\n\n return start;\n };\n\n kendo.compileMobileDirective = function(element, scope) {\n var angular = window.angular;\n\n element.attr(\"data-\" + kendo.ns + \"role\", element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n\n angular.element(element).injector().invoke([\"$compile\", function($compile) {\n $compile(element)(scope);\n\n if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n scope.$digest();\n }\n }]);\n\n return kendo.widgetInstance(element, kendo.mobile.ui);\n };\n\n kendo.antiForgeryTokens = function() {\n var tokens = { },\n csrf_token = $(\"meta[name=csrf-token],meta[name=_csrf]\").attr(\"content\"),\n csrf_param = $(\"meta[name=csrf-param],meta[name=_csrf_header]\").attr(\"content\");\n\n $(\"input[name^='__RequestVerificationToken']\").each(function() {\n tokens[this.name] = this.value;\n });\n\n if (csrf_param !== undefined && csrf_token !== undefined) {\n tokens[csrf_param] = csrf_token;\n }\n\n return tokens;\n };\n\n kendo.cycleForm = function(form) {\n var firstElement = form.find(\"input, .k-widget, .k-dropdownlist, .k-combobox\").first();\n var lastElement = form.find(\"button, .k-button\").last();\n\n function focus(el) {\n var widget = kendo.widgetInstance(el);\n\n if (widget && widget.focus) {\n widget.focus();\n } else {\n el.trigger(\"focus\");\n }\n }\n\n lastElement.on(\"keydown\", function(e) {\n if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n e.preventDefault();\n focus(firstElement);\n }\n });\n\n firstElement.on(\"keydown\", function(e) {\n if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n e.preventDefault();\n focus(lastElement);\n }\n });\n };\n\n kendo.focusElement = function(element) {\n var scrollTopPositions = [];\n var scrollableParents = element.parentsUntil(\"body\")\n .filter(function(index, element) {\n var computedStyle = kendo.getComputedStyles(element, [\"overflow\"]);\n return computedStyle.overflow !== \"visible\";\n })\n .add(window);\n\n scrollableParents.each(function(index, parent) {\n scrollTopPositions[index] = $(parent).scrollTop();\n });\n\n try {\n //The setActive method does not cause the document to scroll to the active object in the current page\n element[0].setActive();\n } catch (e) {\n element[0].focus();\n }\n\n scrollableParents.each(function(index, parent) {\n $(parent).scrollTop(scrollTopPositions[index]);\n });\n };\n\n kendo.focusNextElement = function() {\n if (document.activeElement) {\n var focussable = $(\":kendoFocusable\");\n var index = focussable.index(document.activeElement);\n\n if (index > -1) {\n var nextElement = focussable[index + 1] || focussable[0];\n nextElement.focus();\n }\n }\n };\n\n kendo.trim = function(value) {\n if (!!value) {\n return value.toString().trim();\n } else {\n return \"\";\n }\n };\n\n kendo.getWidgetFocusableElement = function(element) {\n var nextFocusable = element.closest(\":kendoFocusable\"),\n widgetInstance = kendo.widgetInstance(element),\n target;\n\n if (nextFocusable.length) {\n target = nextFocusable;\n } else if (widgetInstance) {\n target = widgetInstance.options.name === 'Editor' ?\n $(widgetInstance.body) :\n widgetInstance.wrapper.find(\":kendoFocusable\").first();\n } else {\n target = element;\n }\n\n return target;\n };\n\n kendo.addAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n if (current.indexOf(value) < 0) {\n element.attr(attribute, (current + \" \" + value).trim());\n }\n };\n\n kendo.removeAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n element.attr(attribute, current.replace(value, \"\").trim());\n };\n\n kendo.toggleAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n if (current.indexOf(value) < 0) {\n kendo.addAttribute(element, attribute, value);\n } else {\n kendo.removeAttribute(element, attribute, value);\n }\n };\n\n kendo.matchesMedia = function(mediaQuery) {\n var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n return support.matchMedia && window.matchMedia(media).matches;\n };\n\n kendo._bootstrapToMedia = function(bootstrapMedia) {\n return {\n \"xs\": \"(max-width: 576px)\",\n \"sm\": \"(min-width: 576px)\",\n \"md\": \"(min-width: 768px)\",\n \"lg\": \"(min-width: 992px)\",\n \"xl\": \"(min-width: 1200px)\"\n }[bootstrapMedia];\n };\n\n kendo.fileGroupMap = {\n audio: [\".aif\", \".iff\", \".m3u\", \".m4a\", \".mid\", \".mp3\", \".mpa\", \".wav\", \".wma\", \".ogg\", \".wav\", \".wma\", \".wpl\"],\n video: [\".3g2\", \".3gp\", \".avi\", \".asf\", \".flv\", \".m4u\", \".rm\", \".h264\", \".m4v\", \".mkv\", \".mov\", \".mp4\", \".mpg\",\n \".rm\", \".swf\", \".vob\", \".wmv\"],\n image: [\".ai\", \".dds\", \".heic\", \".jpe\", \"jfif\", \".jif\", \".jp2\", \".jps\", \".eps\", \".bmp\", \".gif\", \".jpeg\",\n \".jpg\", \".png\", \".ps\", \".psd\", \".svg\", \".svgz\", \".tif\", \".tiff\"],\n txt: [\".doc\", \".docx\", \".log\", \".pages\", \".tex\", \".wpd\", \".wps\", \".odt\", \".rtf\", \".text\", \".txt\", \".wks\"],\n presentation: [\".key\", \".odp\", \".pps\", \".ppt\", \".pptx\"],\n data: [\".xlr\", \".xls\", \".xlsx\"],\n programming: [\".tmp\", \".bak\", \".msi\", \".cab\", \".cpl\", \".cur\", \".dll\", \".dmp\", \".drv\", \".icns\", \".ico\", \".link\",\n \".sys\", \".cfg\", \".ini\", \".asp\", \".aspx\", \".cer\", \".csr\", \".css\", \".dcr\", \".htm\", \".html\", \".js\",\n \".php\", \".rss\", \".xhtml\"],\n pdf: [\".pdf\"],\n config: [\".apk\", \".app\", \".bat\", \".cgi\", \".com\", \".exe\", \".gadget\", \".jar\", \".wsf\"],\n zip: [\".7z\", \".cbr\", \".gz\", \".sitx\", \".arj\", \".deb\", \".pkg\", \".rar\", \".rpm\", \".tar.gz\", \".z\", \".zip\", \".zipx\"],\n \"disc-image\": [\".dmg\", \".iso\", \".toast\", \".vcd\", \".bin\", \".cue\", \".mdf\"]\n };\n\n kendo.getFileGroup = function(extension, withPrefix) {\n var fileTypeMap = kendo.fileGroupMap;\n var groups = Object.keys(fileTypeMap);\n var type = \"file\";\n\n if (extension === undefined || !extension.length) {\n return type;\n }\n\n for (var i = 0; i < groups.length; i += 1) {\n var extensions = fileTypeMap[groups[i]];\n\n if (extensions.indexOf(extension.toLowerCase()) > -1) {\n return withPrefix ? \"file-\" + groups[i] : groups[i];\n }\n }\n\n return type;\n };\n\n kendo.getFileSizeMessage = function(size) {\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n if (size === 0) {\n return '0 Byte';\n }\n\n var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n };\n\n kendo.selectorFromClasses = function(classes) {\n return \".\" + classes.split(\" \").join(\".\");\n };\n\n // Standardized Properties and CSS classes\n\n var themeColorValues = ['base', 'primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse'];\n var fillValues = ['solid', 'outline', 'flat'];\n //var postitionValues = ['edge', 'outside', 'inside'];\n var shapeValues = ['rectangle', 'square'];\n var sizeValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n var roundedValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n //var alignValues = [ ['top start', 'top-start'], ['top end', 'top-end'], ['bottom start', 'bottom-start'], ['bottom end', 'bottom-end'] ];\n var positionModeValues = [ 'fixed', 'static', 'sticky', 'absolute' ];\n var resizeValues = [ 'both', 'horizontal', 'vertical' ];\n var overflowValues = [ 'auto', 'hidden', 'visible', 'scroll', 'clip' ];\n\n kendo.cssProperties = (function() {\n var defaultValues = {},\n propertyDictionary = {};\n\n function registerPrefix(widget, prefix) {\n var dict = kendo.cssProperties.propertyDictionary;\n\n if (!dict[widget]) {\n dict[widget] = {};\n }\n\n dict[widget][PREFIX] = prefix;\n }\n\n function registerValues(widget, args) {\n var dict = kendo.cssProperties.propertyDictionary,\n i, j, prop, values, newValues, currentValue;\n\n for (i = 0; i < args.length; i++) {\n prop = args[i].prop;\n newValues = args[i].values;\n\n if (!dict[widget][prop]) {\n dict[widget][prop] = {};\n }\n\n values = dict[widget][prop];\n\n for (j = 0; j < newValues.length; j++) {\n currentValue = newValues[j];\n\n if (isArray(newValues[j])) {\n values[currentValue[0]] = currentValue[1];\n } else {\n values[currentValue] = currentValue;\n }\n }\n }\n }\n\n function registerCssClass(propName, value, shorthand) {\n if (!defaultValues[propName]) {\n defaultValues[propName] = {};\n }\n\n defaultValues[propName][value] = shorthand || value;\n }\n\n function registerCssClasses(propName, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (isArray(arr[i])) {\n registerCssClass(propName, arr[i][0], arr[i][1]);\n } else {\n registerCssClass(propName, arr[i]);\n }\n }\n }\n\n function getValidClass(args) {\n var widget = args.widget,\n propName = args.propName,\n value = args.value,\n fill = args.fill,\n cssProperties = kendo.cssProperties,\n defaultValues = cssProperties.defaultValues[propName],\n widgetProperties = cssProperties.propertyDictionary[widget],\n widgetValues, validValue, prefix;\n\n if (!widgetProperties) {\n return \"\";\n }\n\n widgetValues = widgetProperties[propName];\n validValue = widgetValues ? widgetValues[value] || defaultValues[value] : defaultValues[value];\n\n if (validValue) {\n if (propName === \"themeColor\") {\n prefix = widgetProperties[PREFIX] + fill + \"-\";\n } else if (propName === \"positionMode\") {\n prefix = \"k-pos-\";\n } else if (propName === \"rounded\") {\n prefix = \"k-rounded-\";\n } else if (propName === \"resize\") {\n prefix = \"k-resize-\";\n } else if (propName === \"overflow\") {\n prefix = \"k-overflow-\";\n } else {\n prefix = widgetProperties[PREFIX];\n }\n\n return prefix + validValue;\n } else {\n return \"\";\n }\n }\n\n registerCssClasses(\"themeColor\", themeColorValues);\n registerCssClasses(\"fillMode\", fillValues);\n registerCssClasses(\"shape\", shapeValues);\n registerCssClasses(\"size\", sizeValues);\n registerCssClasses(\"positionMode\", positionModeValues);\n registerCssClasses(\"rounded\", roundedValues);\n registerCssClasses(\"resize\", resizeValues);\n registerCssClasses(\"overflow\", overflowValues);\n\n return {\n positionModeValues: positionModeValues,\n roundedValues: roundedValues,\n sizeValues: sizeValues,\n shapeValues: shapeValues,\n fillModeValues: fillValues,\n themeColorValues: themeColorValues,\n\n defaultValues: defaultValues,\n propertyDictionary: propertyDictionary,\n\n registerValues: registerValues,\n getValidClass: getValidClass,\n registerPrefix: registerPrefix\n };\n }());\n\n //To do: delete below after implementing new styles and classes for BottomNavigation\n kendo.registerCssClass = function(propName, value, shorthand) {\n if (!kendo.propertyToCssClassMap[propName]) {\n kendo.propertyToCssClassMap[propName] = {};\n }\n\n kendo.propertyToCssClassMap[propName][value] = shorthand || value;\n };\n\n kendo.registerCssClasses = function(propName, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (isArray(arr[i])) {\n kendo.registerCssClass(propName, arr[i][0], arr[i][1]);\n } else {\n kendo.registerCssClass(propName, arr[i]);\n }\n }\n };\n\n kendo.getValidCssClass = function(prefix, propName, value) {\n var validValue = kendo.propertyToCssClassMap[propName][value];\n\n if (validValue) {\n return prefix + validValue;\n }\n };\n\n kendo.propertyToCssClassMap = {};\n\n kendo.registerCssClasses(\"themeColor\", themeColorValues);\n kendo.registerCssClasses(\"fill\", fillValues);\n //kendo.registerCssClasses(\"postition\", postitionValues);\n kendo.registerCssClasses(\"shape\", shapeValues);\n kendo.registerCssClasses(\"size\", sizeValues);\n //kendo.registerCssClasses(\"align\", alignValues);\n kendo.registerCssClasses(\"positionMode\", positionModeValues);\n\n // jQuery deferred helpers\n\n // influenced from: https://gist.github.com/fearphage/4341799\n kendo.whenAll = function(array) {\n var resolveValues = arguments.length == 1 && Array.isArray(array) ? array : Array.prototype.slice.call(arguments),\n length = resolveValues.length,\n remaining = length,\n deferred = $.Deferred(),\n i = 0,\n failed = 0,\n rejectContexts = Array(length),\n rejectValues = Array(length),\n resolveContexts = Array(length),\n value;\n\n function updateFunc(index, contexts, values) {\n return function() {\n if (values != resolveValues) {\n failed++;\n }\n\n deferred.notifyWith(\n contexts[index] = this,\n values[index] = Array.prototype.slice.call(arguments)\n );\n\n if (!(--remaining)) {\n deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);\n }\n };\n }\n\n for (; i < length; i++) {\n if ((value = resolveValues[i]) && kendo.isFunction(value.promise)) {\n value.promise()\n .done(updateFunc(i, resolveContexts, resolveValues))\n .fail(updateFunc(i, rejectContexts, rejectValues));\n }\n\n else {\n deferred.notifyWith(this, value);\n --remaining;\n }\n }\n\n if (!remaining) {\n deferred.resolveWith(resolveContexts, resolveValues);\n }\n\n return deferred.promise();\n };\n\n // kendo.saveAs -----------------------------------------------\n (function() {\n function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n var form = $(\"
\").attr({\n action: proxyURL,\n method: \"POST\",\n target: proxyTarget\n });\n\n var data = kendo.antiForgeryTokens();\n data.fileName = fileName;\n\n var parts = dataURI.split(\";base64,\");\n data.contentType = parts[0].replace(\"data:\", \"\");\n data.base64 = parts[1];\n\n for (var name in data) {\n if (data.hasOwnProperty(name)) {\n $('').attr({\n value: data[name],\n name: name,\n type: \"hidden\"\n }).appendTo(form);\n }\n }\n\n form.appendTo(\"body\").submit().remove();\n }\n\n var fileSaver = document.createElement(\"a\");\n var downloadAttribute = \"download\" in fileSaver && !kendo.support.browser.edge;\n\n function saveAsBlob(dataURI, fileName) {\n var blob = dataURI; // could be a Blob object\n\n if (typeof dataURI == \"string\") {\n var parts = dataURI.split(\";base64,\");\n var contentType = parts[0];\n var base64 = atob(parts[1]);\n var array = new Uint8Array(base64.length);\n\n for (var idx = 0; idx < base64.length; idx++) {\n array[idx] = base64.charCodeAt(idx);\n }\n blob = new Blob([array.buffer], { type: contentType });\n }\n\n navigator.msSaveBlob(blob, fileName);\n }\n\n function saveAsDataURI(dataURI, fileName) {\n if (window.Blob && dataURI instanceof Blob) {\n dataURI = URL.createObjectURL(dataURI);\n }\n\n fileSaver.download = fileName;\n fileSaver.href = dataURI;\n\n var e = document.createEvent(\"MouseEvents\");\n e.initMouseEvent(\"click\", true, false, window,\n 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n fileSaver.dispatchEvent(e);\n setTimeout(function() {\n URL.revokeObjectURL(dataURI);\n });\n }\n\n kendo.saveAs = function(options) {\n var save = postToProxy;\n\n if (!options.forceProxy) {\n if (downloadAttribute) {\n save = saveAsDataURI;\n } else if (navigator.msSaveBlob) {\n save = saveAsBlob;\n }\n }\n\n save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n };\n })();\n\n // kendo proxySetters\n kendo.proxyModelSetters = function proxyModelSetters(data) {\n var observable = {};\n\n Object.keys(data || {}).forEach(function(property) {\n Object.defineProperty(observable, property, {\n get: function() {\n return data[property];\n },\n set: function(value) {\n data[property] = value;\n data.dirty = true;\n }\n });\n });\n\n return observable;\n };\n\n kendo.getSeriesColors = function() {\n var seriesColorsTemplate = '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
',\n series = $(seriesColorsTemplate),\n colors = [];\n\n series.appendTo($('body'));\n\n series.each(function(i, item) {\n colors.push($(item).css(\"background-color\"));\n });\n\n series.remove();\n\n return colors;\n };\n\n kendo.isElement = function(element) {\n return element instanceof Element || element instanceof HTMLDocument;\n };\n\n // Kendo defaults\n (function() {\n\n kendo.defaults = kendo.defaults || {};\n kendo.setDefaults = function(key, value) {\n var path = key.split(\".\");\n var curr = kendo.defaults;\n\n key = path.pop();\n\n path.forEach(function(part) {\n if (curr[part] === undefined) {\n curr[part] = {};\n }\n\n curr = curr[part];\n });\n\n if (value.constructor === Object) {\n curr[key] = deepExtend({}, curr[key], value);\n } else {\n curr[key] = value;\n }\n };\n\n })();\n\n // Implement type() as it has been depricated in jQuery\n (function() {\n kendo.class2type = {};\n\n jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n function( _i, name ) {\n kendo.class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n } );\n\n kendo.type = function(obj) {\n if ( obj == null ) {\n return obj + \"\";\n }\n\n // Support: Android <=2.3 only (functionish RegExp)\n return typeof obj === \"object\" || typeof obj === \"function\" ?\n kendo.class2type[Object.prototype.toString.call(obj)] || \"object\" :\n typeof obj;\n };\n }());\n\n var KendoLicensing = { validatePackage: function() {},setScriptKey: function() {} };\n\n window.KendoLicensing = {\n setScriptKey: KendoLicensing.setScriptKey\n };\n\n function validatePackage() {\n KendoLicensing.validatePackage(packageMetadata);\n }\n\n})(jQuery, window);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.fx',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"fx\",\n name: \"Effects\",\n category: \"framework\",\n description: \"Required for animation effects in all Kendo UI widgets.\",\n depends: [ \"core\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n fx = kendo.effects,\n each = $.each,\n extend = $.extend,\n support = kendo.support,\n browser = support.browser,\n transforms = support.transforms,\n transitions = support.transitions,\n scaleProperties = { scale: 0, scalex: 0, scaley: 0, scale3d: 0 },\n translateProperties = { translate: 0, translatex: 0, translatey: 0, translate3d: 0 },\n hasZoom = (typeof document.documentElement.style.zoom !== \"undefined\") && !transforms,\n matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i,\n cssParamsRegExp = /^(-?[\\d\\.\\-]+)?[\\w\\s]*,?\\s*(-?[\\d\\.\\-]+)?[\\w\\s]*/i,\n translateXRegExp = /translatex?$/i,\n oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/,\n singleEffectRegExp = /(zoom|fade|expand)/,\n unitRegExp = /[xy]$/i,\n transformProps = [\"perspective\", \"rotate\", \"rotatex\", \"rotatey\", \"rotatez\", \"rotate3d\", \"scale\", \"scalex\", \"scaley\", \"scalez\", \"scale3d\", \"skew\", \"skewx\", \"skewy\", \"translate\", \"translatex\", \"translatey\", \"translatez\", \"translate3d\", \"matrix\", \"matrix3d\"],\n transform2d = [\"rotate\", \"scale\", \"scalex\", \"scaley\", \"skew\", \"skewx\", \"skewy\", \"translate\", \"translatex\", \"translatey\", \"matrix\"],\n transform2units = { \"rotate\": \"deg\", scale: \"\", skew: \"px\", translate: \"px\" },\n cssPrefix = transforms.css,\n round = Math.round,\n BLANK = \"\",\n PX = \"px\",\n NONE = \"none\",\n AUTO = \"auto\",\n WIDTH = \"width\",\n HEIGHT = \"height\",\n HIDDEN = \"hidden\",\n ORIGIN = \"origin\",\n ABORT_ID = \"abortId\",\n OVERFLOW = \"overflow\",\n TRANSLATE = \"translate\",\n POSITION = \"position\",\n COMPLETE_CALLBACK = \"completeCallback\",\n TRANSITION = cssPrefix + \"transition\",\n TRANSFORM = cssPrefix + \"transform\",\n BACKFACE = cssPrefix + \"backface-visibility\",\n PERSPECTIVE = cssPrefix + \"perspective\",\n DEFAULT_PERSPECTIVE = \"1500px\",\n TRANSFORM_PERSPECTIVE = \"perspective(\" + DEFAULT_PERSPECTIVE + \")\",\n directions = {\n left: {\n reverse: \"right\",\n property: \"left\",\n transition: \"translatex\",\n vertical: false,\n modifier: -1\n },\n right: {\n reverse: \"left\",\n property: \"left\",\n transition: \"translatex\",\n vertical: false,\n modifier: 1\n },\n down: {\n reverse: \"up\",\n property: \"top\",\n transition: \"translatey\",\n vertical: true,\n modifier: 1\n },\n up: {\n reverse: \"down\",\n property: \"top\",\n transition: \"translatey\",\n vertical: true,\n modifier: -1\n },\n top: {\n reverse: \"bottom\"\n },\n bottom: {\n reverse: \"top\"\n },\n \"in\": {\n reverse: \"out\",\n modifier: -1\n },\n out: {\n reverse: \"in\",\n modifier: 1\n },\n\n vertical: {\n reverse: \"vertical\"\n },\n\n horizontal: {\n reverse: \"horizontal\"\n }\n };\n\n kendo.directions = directions;\n\n extend($.fn, {\n kendoStop: function(clearQueue, gotoEnd) {\n if (transitions) {\n return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\n } else {\n return this.stop(clearQueue, gotoEnd);\n }\n }\n });\n\n /* jQuery support for all transform animations (FF 3.5/3.6, Opera 10.x, IE9 */\n\n if (transforms && !transitions) {\n each(transform2d, function(idx, value) {\n $.fn[value] = function(val) {\n if (typeof val == \"undefined\") {\n return animationProperty(this, value);\n } else {\n var that = $(this)[0],\n transformValue = value + \"(\" + val + transform2units[value.replace(unitRegExp, \"\")] + \")\";\n\n if (that.style.cssText.indexOf(TRANSFORM) == -1) {\n $(this).css(TRANSFORM, transformValue);\n } else {\n that.style.cssText = that.style.cssText.replace(new RegExp(value + \"\\\\(.*?\\\\)\", \"i\"), transformValue);\n }\n }\n return this;\n };\n\n $.fx.step[value] = function(fx) {\n $(fx.elem)[value](fx.now);\n };\n });\n\n var curProxy = $.fx.prototype.cur;\n $.fx.prototype.cur = function() {\n if (transform2d.indexOf(this.prop) != -1) {\n return parseFloat($(this.elem)[this.prop]());\n }\n\n return curProxy.apply(this, arguments);\n };\n }\n\n kendo.toggleClass = function(element, classes, options, add) {\n if (classes) {\n classes = classes.split(\" \");\n\n if (transitions) {\n options = extend({\n exclusive: \"all\",\n duration: 400,\n ease: \"ease-out\"\n }, options);\n\n element.css(TRANSITION, options.exclusive + \" \" + options.duration + \"ms \" + options.ease);\n setTimeout(function() {\n element.css(TRANSITION, \"\").css(HEIGHT);\n }, options.duration); // TODO: this should fire a kendoAnimate session instead.\n }\n\n each(classes, function(idx, value) {\n element.toggleClass(value, add);\n });\n }\n\n return element;\n };\n\n kendo.parseEffects = function(input, mirror) {\n var effects = {};\n\n if (typeof input === \"string\") {\n each(input.split(\" \"), function(idx, value) {\n var redirectedEffect = !singleEffectRegExp.test(value),\n resolved = value.replace(oldEffectsRegExp, function(match, $1, $2) {\n return $1 + \":\" + $2.toLowerCase();\n }), // Support for old zoomIn/fadeOut style, now deprecated.\n effect = resolved.split(\":\"),\n direction = effect[1],\n effectBody = {};\n\n if (effect.length > 1) {\n effectBody.direction = (mirror && redirectedEffect ? directions[direction].reverse : direction);\n }\n\n effects[effect[0]] = effectBody;\n });\n } else {\n each(input, function(idx) {\n var direction = this.direction;\n\n if (direction && mirror && !singleEffectRegExp.test(idx)) {\n this.direction = directions[direction].reverse;\n }\n\n effects[idx] = this;\n });\n }\n\n return effects;\n };\n\n function parseInteger(value) {\n return parseInt(value, 10);\n }\n\n function parseCSS(element, property) {\n return parseInteger(element.css(property));\n }\n\n function keys(obj) {\n var acc = [];\n for (var propertyName in obj) {\n acc.push(propertyName);\n }\n return acc;\n }\n\n function strip3DTransforms(properties) {\n for (var key in properties) {\n if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\n delete properties[key];\n }\n }\n\n return properties;\n }\n\n function normalizeCSS(element, properties) {\n var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\n\n for (key in properties) {\n lowerKey = key.toLowerCase();\n isTransformed = transforms && transformProps.indexOf(lowerKey) != -1;\n\n if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\n delete properties[key];\n } else {\n value = properties[key];\n\n if (isTransformed) {\n transformation.push(key + \"(\" + value + \")\");\n } else {\n cssValues[key] = value;\n }\n }\n }\n\n if (transformation.length) {\n cssValues[TRANSFORM] = transformation.join(\" \");\n }\n\n return cssValues;\n }\n\n if (transitions) {\n extend(fx, {\n transition: function(element, properties, options) {\n var css,\n delay = 0,\n oldKeys = element.data(\"keys\") || [],\n timeoutID;\n\n options = extend({\n duration: 200,\n ease: \"ease-out\",\n complete: null,\n exclusive: \"all\"\n },\n options\n );\n\n var stopTransitionCalled = false;\n\n var stopTransition = function() {\n if (!stopTransitionCalled) {\n stopTransitionCalled = true;\n\n if (timeoutID) {\n clearTimeout(timeoutID);\n timeoutID = null;\n }\n\n element\n .removeData(ABORT_ID)\n .dequeue()\n .css(TRANSITION, \"\")\n .css(TRANSITION);\n\n options.complete.call(element);\n }\n };\n\n options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\n\n css = normalizeCSS(element, properties);\n\n $.merge(oldKeys, keys(css));\n\n if ($.hasOwnProperty(\"uniqueSort\")) {\n element\n .data(\"keys\", $.uniqueSort(oldKeys))\n .height();\n } else {\n element\n .data(\"keys\", $.unique(oldKeys))\n .height();\n }\n\n element.css(TRANSITION, options.exclusive + \" \" + options.duration + \"ms \" + options.ease).css(TRANSITION);\n element.css(css).css(TRANSFORM);\n\n /**\n * Use transitionEnd event for browsers who support it - but duplicate it with setTimeout, as the transitionEnd event will not be triggered if no CSS properties change.\n * This should be cleaned up at some point (widget by widget), and refactored to widgets not relying on the complete callback if no transition occurs.\n *\n * For IE9 and below, resort to setTimeout.\n */\n if (transitions.event) {\n element.one(transitions.event, stopTransition);\n if (options.duration !== 0) {\n delay = 500;\n }\n }\n\n timeoutID = setTimeout(stopTransition, options.duration + delay);\n element.data(ABORT_ID, timeoutID);\n element.data(COMPLETE_CALLBACK, stopTransition);\n },\n\n stopQueue: function(element, clearQueue, gotoEnd) {\n var cssValues,\n taskKeys = element.data(\"keys\"),\n retainPosition = (!gotoEnd && taskKeys),\n completeCallback = element.data(COMPLETE_CALLBACK);\n\n if (retainPosition) {\n cssValues = kendo.getComputedStyles(element[0], taskKeys);\n }\n\n if (completeCallback) {\n completeCallback();\n }\n\n if (retainPosition) {\n element.css(cssValues);\n }\n\n return element\n .removeData(\"keys\")\n .stop(clearQueue);\n }\n });\n }\n\n function animationProperty(element, property) {\n if (transforms) {\n var transform = element.css(TRANSFORM);\n if (transform == NONE) {\n return property == \"scale\" ? 1 : 0;\n }\n\n var match = transform.match(new RegExp(property + \"\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)\")),\n computed = 0;\n\n if (match) {\n computed = parseInteger(match[1]);\n } else {\n match = transform.match(matrix3dRegExp) || [0, 0, 0, 0, 0];\n property = property.toLowerCase();\n\n if (translateXRegExp.test(property)) {\n computed = parseFloat(match[3] / match[2]);\n } else if (property == \"translatey\") {\n computed = parseFloat(match[4] / match[2]);\n } else if (property == \"scale\") {\n computed = parseFloat(match[2]);\n } else if (property == \"rotate\") {\n computed = parseFloat(Math.atan2(match[2], match[1]));\n }\n }\n\n return computed;\n } else {\n return parseFloat(element.css(property));\n }\n }\n\n var EffectSet = kendo.Class.extend({\n init: function(element, options) {\n var that = this;\n\n that.element = element;\n that.effects = [];\n that.options = options;\n that.restore = [];\n },\n\n run: function(effects) {\n var that = this,\n effect,\n idx, jdx,\n length = effects.length,\n element = that.element,\n options = that.options,\n deferred = $.Deferred(),\n start = {},\n end = {},\n target,\n children,\n childrenLength;\n\n that.effects = effects;\n\n deferred.done(that.complete.bind(that));\n\n element.data(\"animating\", true);\n\n for (idx = 0; idx < length; idx ++) {\n effect = effects[idx];\n\n effect.setReverse(options.reverse);\n effect.setOptions(options);\n\n that.addRestoreProperties(effect.restore);\n\n effect.prepare(start, end);\n\n children = effect.children();\n\n for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx ++) {\n children[jdx].duration(options.duration).run();\n }\n }\n\n // legacy support for options.properties\n for (var effectName in options.effects) {\n extend(end, options.effects[effectName].properties);\n }\n\n // Show the element initially\n if (!element.is(\":visible\")) {\n extend(start, { display: element.data(\"olddisplay\") || \"block\" });\n }\n\n if (transforms && !options.reset) {\n target = element.data(\"targetTransform\");\n\n if (target) {\n start = extend(target, start);\n }\n }\n\n start = normalizeCSS(element, start);\n\n if (transforms && !transitions) {\n start = strip3DTransforms(start);\n }\n\n element.css(start)\n .css(TRANSFORM); // Nudge\n\n for (idx = 0; idx < length; idx ++) {\n effects[idx].setup();\n }\n\n if (options.init) {\n options.init();\n }\n\n element.data(\"targetTransform\", end);\n fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\n\n return deferred.promise();\n },\n\n stop: function() {\n $(this.element).kendoStop(true, true);\n },\n\n addRestoreProperties: function(restore) {\n var element = this.element,\n value,\n i = 0,\n length = restore.length;\n\n for (; i < length; i ++) {\n value = restore[i];\n\n this.restore.push(value);\n\n if (!element.data(value)) {\n element.data(value, element.css(value));\n }\n }\n },\n\n restoreCallback: function() {\n var element = this.element;\n\n for (var i = 0, length = this.restore.length; i < length; i ++) {\n var value = this.restore[i];\n element.css(value, element.data(value));\n }\n },\n\n complete: function() {\n var that = this,\n idx = 0,\n element = that.element,\n options = that.options,\n effects = that.effects,\n length = effects.length;\n\n element\n .removeData(\"animating\")\n .dequeue(); // call next animation from the queue\n\n if (options.hide) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n this.restoreCallback();\n\n if (hasZoom && !transforms) {\n setTimeout(this.restoreCallback.bind(this), 0); // Again jQuery callback in IE8-\n }\n\n for (; idx < length; idx ++) {\n effects[idx].teardown();\n }\n\n if (options.completeCallback) {\n options.completeCallback(element);\n }\n }\n });\n\n fx.promise = function(element, options) {\n var effects = [],\n effectClass,\n effectSet = new EffectSet(element, options),\n parsedEffects = kendo.parseEffects(options.effects),\n effect;\n\n options.effects = parsedEffects;\n\n for (var effectName in parsedEffects) {\n effectClass = fx[capitalize(effectName)];\n\n if (effectClass) {\n effect = new effectClass(element, parsedEffects[effectName].direction);\n effects.push(effect);\n }\n }\n\n if (effects[0]) {\n effectSet.run(effects);\n } else { // Not sure how would an fx promise reach this state - means that you call kendoAnimate with no valid effects? Why?\n if (!element.is(\":visible\")) {\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\n }\n\n if (options.init) {\n options.init();\n }\n\n element.dequeue();\n effectSet.complete();\n }\n };\n\n extend(fx, {\n animate: function(elements, properties, options) {\n var useTransition = options.transition !== false;\n delete options.transition;\n\n if (transitions && \"transition\" in fx && useTransition) {\n fx.transition(elements, properties, options);\n } else {\n if (transforms) {\n elements.animate(strip3DTransforms(properties), { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on.\n } else {\n elements.each(function() {\n var element = $(this),\n multiple = {};\n\n each(transformProps, function(idx, value) { // remove transforms to avoid IE and older browsers confusion\n var params,\n currentValue = properties ? properties[value] + \" \" : null; // We need to match\n\n if (currentValue) {\n var single = properties;\n\n if (value in scaleProperties && properties[value] !== undefined) {\n params = currentValue.match(cssParamsRegExp);\n if (transforms) {\n extend(single, { scale: +params[0] });\n }\n } else {\n if (value in translateProperties && properties[value] !== undefined) {\n var position = element.css(POSITION),\n isFixed = (position == \"absolute\" || position == \"fixed\");\n\n if (!element.data(TRANSLATE)) {\n if (isFixed) {\n element.data(TRANSLATE, {\n top: parseCSS(element, \"top\") || 0,\n left: parseCSS(element, \"left\") || 0,\n bottom: parseCSS(element, \"bottom\"),\n right: parseCSS(element, \"right\")\n });\n } else {\n element.data(TRANSLATE, {\n top: parseCSS(element, \"marginTop\") || 0,\n left: parseCSS(element, \"marginLeft\") || 0\n });\n }\n }\n\n var originalPosition = element.data(TRANSLATE);\n\n params = currentValue.match(cssParamsRegExp);\n if (params) {\n\n var dX = value == TRANSLATE + \"y\" ? +null : +params[1],\n dY = value == TRANSLATE + \"y\" ? +params[1] : +params[2];\n\n if (isFixed) {\n if (!isNaN(originalPosition.right)) {\n if (!isNaN(dX)) { extend(single, { right: originalPosition.right - dX }); }\n } else {\n if (!isNaN(dX)) { extend(single, { left: originalPosition.left + dX }); }\n }\n\n if (!isNaN(originalPosition.bottom)) {\n if (!isNaN(dY)) { extend(single, { bottom: originalPosition.bottom - dY }); }\n } else {\n if (!isNaN(dY)) { extend(single, { top: originalPosition.top + dY }); }\n }\n } else {\n if (!isNaN(dX)) { extend(single, { marginLeft: originalPosition.left + dX }); }\n if (!isNaN(dY)) { extend(single, { marginTop: originalPosition.top + dY }); }\n }\n }\n }\n }\n\n if (!transforms && value != \"scale\" && value in single) {\n delete single[value];\n }\n\n if (single) {\n extend(multiple, single);\n }\n }\n });\n\n if (browser.msie) {\n delete multiple.scale;\n }\n\n element.animate(multiple, { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on.\n });\n }\n }\n }\n });\n\n fx.animatedPromise = fx.promise;\n\n var Effect = kendo.Class.extend({\n init: function(element, direction) {\n var that = this;\n that.element = element;\n that._direction = direction;\n that.options = {};\n that._additionalEffects = [];\n\n if (!that.restore) {\n that.restore = [];\n }\n },\n\n// Public API\n reverse: function() {\n this._reverse = true;\n return this.run();\n },\n\n play: function() {\n this._reverse = false;\n return this.run();\n },\n\n add: function(additional) {\n this._additionalEffects.push(additional);\n return this;\n },\n\n direction: function(value) {\n this._direction = value;\n return this;\n },\n\n duration: function(duration) {\n this._duration = duration;\n return this;\n },\n\n compositeRun: function() {\n var that = this,\n effectSet = new EffectSet(that.element, { reverse: that._reverse, duration: that._duration }),\n effects = that._additionalEffects.concat([ that ]);\n\n return effectSet.run(effects);\n },\n\n run: function() {\n if (this._additionalEffects && this._additionalEffects[0]) {\n return this.compositeRun();\n }\n\n var that = this,\n element = that.element,\n idx = 0,\n restore = that.restore,\n length = restore.length,\n value,\n deferred = $.Deferred(),\n start = {},\n end = {},\n target,\n children = that.children(),\n childrenLength = children.length;\n\n deferred.done(that._complete.bind(that));\n\n element.data(\"animating\", true);\n\n for (idx = 0; idx < length; idx ++) {\n value = restore[idx];\n\n if (!element.data(value)) {\n element.data(value, element.css(value));\n }\n }\n\n for (idx = 0; idx < childrenLength; idx ++) {\n children[idx].duration(that._duration).run();\n }\n\n that.prepare(start, end);\n\n if (!element.is(\":visible\")) {\n extend(start, { display: element.data(\"olddisplay\") || \"block\" });\n }\n\n if (transforms) {\n target = element.data(\"targetTransform\");\n\n if (target) {\n start = extend(target, start);\n }\n }\n\n start = normalizeCSS(element, start);\n\n if (transforms && !transitions) {\n start = strip3DTransforms(start);\n }\n\n element.css(start).css(TRANSFORM); // Trick webkit into re-rendering\n\n that.setup();\n\n element.data(\"targetTransform\", end);\n fx.animate(element, end, { duration: that._duration, complete: deferred.resolve });\n\n return deferred.promise();\n },\n\n stop: function() {\n var idx = 0,\n children = this.children(),\n childrenLength = children.length;\n\n for (idx = 0; idx < childrenLength; idx ++) {\n children[idx].stop();\n }\n\n $(this.element).kendoStop(true, true);\n return this;\n },\n\n restoreCallback: function() {\n var element = this.element;\n\n for (var i = 0, length = this.restore.length; i < length; i ++) {\n var value = this.restore[i];\n element.css(value, element.data(value));\n }\n },\n\n _complete: function() {\n var that = this,\n element = that.element;\n\n element\n .removeData(\"animating\")\n .dequeue(); // call next animation from the queue\n\n that.restoreCallback();\n\n if (that.shouldHide()) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n if (hasZoom && !transforms) {\n setTimeout(that.restoreCallback.bind(that), 0); // Again jQuery callback in IE8-\n }\n\n that.teardown();\n },\n\n /////////////////////////// Support for kendo.animate;\n setOptions: function(options) {\n extend(true, this.options, options);\n },\n\n children: function() {\n return [];\n },\n\n shouldHide: $.noop,\n\n setup: $.noop,\n prepare: $.noop,\n teardown: $.noop,\n directions: [],\n\n setReverse: function(reverse) {\n this._reverse = reverse;\n return this;\n }\n });\n\n function capitalize(word) {\n return word.charAt(0).toUpperCase() + word.substring(1);\n }\n\n function createEffect(name, definition) {\n var effectClass = Effect.extend(definition),\n directions = effectClass.prototype.directions;\n\n fx[capitalize(name)] = effectClass;\n\n fx.Element.prototype[name] = function(direction, opt1, opt2, opt3) {\n return new effectClass(this.element, direction, opt1, opt2, opt3);\n };\n\n each(directions, function(idx, theDirection) {\n fx.Element.prototype[name + capitalize(theDirection)] = function(opt1, opt2, opt3) {\n return new effectClass(this.element, theDirection, opt1, opt2, opt3);\n };\n });\n }\n\n var FOUR_DIRECTIONS = [\"left\", \"right\", \"up\", \"down\"],\n IN_OUT = [\"in\", \"out\"];\n\n createEffect(\"slideIn\", {\n directions: FOUR_DIRECTIONS,\n\n divisor: function(value) {\n this.options.divisor = value;\n return this;\n },\n\n prepare: function(start, end) {\n var that = this,\n tmp,\n element = that.element,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n direction = directions[that._direction],\n offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)),\n startValue = offset / (that.options && that.options.divisor || 1) + PX,\n endValue = \"0px\";\n\n if (that._reverse) {\n tmp = start;\n start = end;\n end = tmp;\n }\n\n if (transforms) {\n start[direction.transition] = startValue;\n end[direction.transition] = endValue;\n } else {\n start[direction.property] = startValue;\n end[direction.property] = endValue;\n }\n }\n });\n\n createEffect(\"tile\", {\n directions: FOUR_DIRECTIONS,\n\n init: function(element, direction, previous) {\n Effect.prototype.init.call(this, element, direction);\n this.options = { previous: previous };\n },\n\n previousDivisor: function(value) {\n this.options.previousDivisor = value;\n return this;\n },\n\n children: function() {\n var that = this,\n reverse = that._reverse,\n previous = that.options.previous,\n divisor = that.options.previousDivisor || 1,\n dir = that._direction;\n\n var children = [ kendo.fx(that.element).slideIn(dir).setReverse(reverse) ];\n\n if (previous) {\n children.push( kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse) );\n }\n\n return children;\n }\n });\n\n function createToggleEffect(name, property, defaultStart, defaultEnd) {\n createEffect(name, {\n directions: IN_OUT,\n\n startValue: function(value) {\n this._startValue = value;\n return this;\n },\n\n endValue: function(value) {\n this._endValue = value;\n return this;\n },\n\n shouldHide: function() {\n return this._shouldHide;\n },\n\n prepare: function(start, end) {\n var that = this,\n startValue,\n endValue,\n out = this._direction === \"out\",\n startDataValue = that.element.data(property),\n startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\n\n if (startDataValueIsSet) {\n startValue = startDataValue;\n } else if (typeof this._startValue !== \"undefined\") {\n startValue = this._startValue;\n } else {\n startValue = out ? defaultStart : defaultEnd;\n }\n\n if (typeof this._endValue !== \"undefined\") {\n endValue = this._endValue;\n } else {\n endValue = out ? defaultEnd : defaultStart;\n }\n\n if (this._reverse) {\n start[property] = endValue;\n end[property] = startValue;\n } else {\n start[property] = startValue;\n end[property] = endValue;\n }\n\n that._shouldHide = end[property] === defaultEnd;\n }\n });\n }\n\n createToggleEffect(\"fade\", \"opacity\", 1, 0);\n createToggleEffect(\"zoom\", \"scale\", 1, 0.01);\n\n createEffect(\"slideMargin\", {\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n options = that.options,\n origin = element.data(ORIGIN),\n offset = options.offset,\n margin,\n reverse = that._reverse;\n\n if (!reverse && origin === null) {\n element.data(ORIGIN, parseFloat(element.css(\"margin-\" + options.axis)));\n }\n\n margin = (element.data(ORIGIN) || 0);\n end[\"margin-\" + options.axis] = !reverse ? margin + offset : margin;\n }\n });\n\n createEffect(\"slideTo\", {\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n options = that.options,\n offset = options.offset.split(\",\"),\n reverse = that._reverse;\n\n if (transforms) {\n end.translatex = !reverse ? offset[0] : 0;\n end.translatey = !reverse ? offset[1] : 0;\n } else {\n end.left = !reverse ? offset[0] : 0;\n end.top = !reverse ? offset[1] : 0;\n }\n element.css(\"left\");\n }\n });\n\n createEffect(\"expand\", {\n directions: [\"horizontal\", \"vertical\"],\n\n restore: [ OVERFLOW ],\n\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n options = that.options,\n reverse = that._reverse,\n property = that._direction === \"vertical\" ? HEIGHT : WIDTH,\n setLength = element[0].style[property],\n oldLength = element.data(property),\n length = parseFloat(oldLength || setLength),\n realLength = round(element.css(property, AUTO)[property]());\n\n start.overflow = HIDDEN;\n\n length = (options && options.reset) ? realLength || length : length || realLength;\n\n end[property] = (reverse ? 0 : length) + PX;\n start[property] = (reverse ? length : 0) + PX;\n\n if (oldLength === undefined) {\n element.data(property, setLength);\n }\n },\n\n shouldHide: function() {\n return this._reverse;\n },\n\n teardown: function() {\n var that = this,\n element = that.element,\n property = that._direction === \"vertical\" ? HEIGHT : WIDTH,\n length = element.data(property);\n\n if (length == AUTO || length === BLANK) {\n setTimeout(function() { element.css(property, AUTO).css(property); }, 0); // jQuery animate complete callback in IE is called before the last animation step!\n }\n }\n });\n\n var TRANSFER_START_STATE = { position: \"absolute\", marginLeft: 0, marginTop: 0, scale: 1 };\n /**\n * Intersection point formulas are taken from here - http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html\n * Formula for a linear function from two points from here - http://demo.activemath.org/ActiveMath2/search/show.cmd?id=mbase://AC_UK_calculus/functions/ex_linear_equation_two_points\n * The transform origin point is the intersection point of the two lines from the top left corners/top right corners of the element and target.\n * The math and variables below MAY BE SIMPLIFIED (zeroes removed), but this would make the formula too cryptic.\n */\n createEffect(\"transfer\", {\n init: function(element, target) {\n this.element = element;\n this.options = { target: target };\n this.restore = [];\n },\n\n setup: function() {\n this.element.appendTo(document.body);\n },\n\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n outerBox = fx.box(element),\n innerBox = fx.box(that.options.target),\n currentScale = animationProperty(element, \"scale\"),\n scale = fx.fillScale(innerBox, outerBox),\n transformOrigin = fx.transformOrigin(innerBox, outerBox);\n\n extend(start, TRANSFER_START_STATE);\n end.scale = 1;\n\n element.css(TRANSFORM, \"scale(1)\").css(TRANSFORM);\n element.css(TRANSFORM, \"scale(\" + currentScale + \")\");\n\n start.top = outerBox.top;\n start.left = outerBox.left;\n start.transformOrigin = transformOrigin.x + PX + \" \" + transformOrigin.y + PX;\n\n if (that._reverse) {\n start.scale = scale;\n } else {\n end.scale = scale;\n }\n }\n });\n\n\n var CLIPS = {\n top: \"rect(auto auto $size auto)\",\n bottom: \"rect($size auto auto auto)\",\n left: \"rect(auto $size auto auto)\",\n right: \"rect(auto auto auto $size)\"\n };\n\n var ROTATIONS = {\n top: { start: \"rotatex(0deg)\", end: \"rotatex(180deg)\" },\n bottom: { start: \"rotatex(-180deg)\", end: \"rotatex(0deg)\" },\n left: { start: \"rotatey(0deg)\", end: \"rotatey(-180deg)\" },\n right: { start: \"rotatey(180deg)\", end: \"rotatey(0deg)\" }\n };\n\n function clipInHalf(container, direction) {\n var vertical = kendo.directions[direction].vertical,\n size = (container[vertical ? HEIGHT : WIDTH]() / 2) + \"px\";\n\n return CLIPS[direction].replace(\"$size\", size);\n }\n\n createEffect(\"turningPage\", {\n directions: FOUR_DIRECTIONS,\n\n init: function(element, direction, container) {\n Effect.prototype.init.call(this, element, direction);\n this._container = container;\n },\n\n prepare: function(start, end) {\n var that = this,\n reverse = that._reverse,\n direction = reverse ? directions[that._direction].reverse : that._direction,\n rotation = ROTATIONS[direction];\n\n start.zIndex = 1;\n\n if (that._clipInHalf) {\n start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\n }\n\n start[BACKFACE] = HIDDEN;\n\n end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\n start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\n },\n\n setup: function() {\n this._container.append(this.element);\n },\n\n face: function(value) {\n this._face = value;\n return this;\n },\n\n shouldHide: function() {\n var that = this,\n reverse = that._reverse,\n face = that._face;\n\n return (reverse && !face) || (!reverse && face);\n },\n\n clipInHalf: function(value) {\n this._clipInHalf = value;\n return this;\n },\n\n temporary: function() {\n this.element.addClass('temp-page');\n return this;\n }\n });\n\n createEffect(\"staticPage\", {\n directions: FOUR_DIRECTIONS,\n\n init: function(element, direction, container) {\n Effect.prototype.init.call(this, element, direction);\n this._container = container;\n },\n\n restore: [\"clip\"],\n\n prepare: function(start, end) {\n var that = this,\n direction = that._reverse ? directions[that._direction].reverse : that._direction;\n\n start.clip = clipInHalf(that._container, direction);\n start.opacity = 0.999;\n end.opacity = 1;\n },\n\n shouldHide: function() {\n var that = this,\n reverse = that._reverse,\n face = that._face;\n\n return (reverse && !face) || (!reverse && face);\n },\n\n face: function(value) {\n this._face = value;\n return this;\n }\n });\n\n createEffect(\"pageturn\", {\n directions: [\"horizontal\", \"vertical\"],\n\n init: function(element, direction, face, back) {\n Effect.prototype.init.call(this, element, direction);\n this.options = {};\n this.options.face = face;\n this.options.back = back;\n },\n\n children: function() {\n var that = this,\n options = that.options,\n direction = that._direction === \"horizontal\" ? \"left\" : \"top\",\n reverseDirection = kendo.directions[direction].reverse,\n reverse = that._reverse,\n temp,\n faceClone = options.face.clone(true).removeAttr(\"id\"),\n backClone = options.back.clone(true).removeAttr(\"id\"),\n element = that.element;\n\n if (reverse) {\n temp = direction;\n direction = reverseDirection;\n reverseDirection = temp;\n }\n\n return [\n kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\n kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\n kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\n kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\n ];\n },\n\n prepare: function(start, end) {\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n start.transformStyle = \"preserve-3d\";\n // hack to trigger transition end.\n start.opacity = 0.999;\n end.opacity = 1;\n },\n\n teardown: function() {\n this.element.find(\".temp-page\").remove();\n }\n });\n\n createEffect(\"flip\", {\n directions: [\"horizontal\", \"vertical\"],\n\n init: function(element, direction, face, back) {\n Effect.prototype.init.call(this, element, direction);\n this.options = {};\n this.options.face = face;\n this.options.back = back;\n },\n\n children: function() {\n var that = this,\n options = that.options,\n direction = that._direction === \"horizontal\" ? \"left\" : \"top\",\n reverseDirection = kendo.directions[direction].reverse,\n reverse = that._reverse,\n temp,\n element = that.element;\n\n if (reverse) {\n temp = direction;\n direction = reverseDirection;\n reverseDirection = temp;\n }\n\n return [\n kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\n kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\n ];\n },\n\n prepare: function(start) {\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n start.transformStyle = \"preserve-3d\";\n }\n });\n\n var RESTORE_OVERFLOW = !support.mobileOS.android;\n var IGNORE_TRANSITION_EVENT_SELECTOR = \".km-touch-scrollbar, .km-actionsheet-wrapper\";\n\n createEffect(\"replace\", {\n _before: $.noop,\n _after: $.noop,\n init: function(element, previous, transitionClass) {\n Effect.prototype.init.call(this, element);\n this._previous = $(previous);\n this._transitionClass = transitionClass;\n },\n\n duration: function() {\n throw new Error(\"The replace effect does not support duration setting; the effect duration may be customized through the transition class rule\");\n },\n\n beforeTransition: function(callback) {\n this._before = callback;\n return this;\n },\n\n afterTransition: function(callback) {\n this._after = callback;\n return this;\n },\n\n _both: function() {\n return $().add(this._element).add(this._previous);\n },\n\n _containerClass: function() {\n var direction = this._direction,\n containerClass = \"k-fx k-fx-start k-fx-\" + this._transitionClass;\n\n if (direction) {\n containerClass += \" k-fx-\" + direction;\n }\n\n if (this._reverse) {\n containerClass += \" k-fx-reverse\";\n }\n\n return containerClass;\n },\n\n complete: function(e) {\n if (!this.deferred || (e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR))) {\n return;\n }\n\n var container = this.container;\n\n container\n .removeClass(\"k-fx-end\")\n .removeClass(this._containerClass())\n .off(transitions.event, this.completeProxy);\n\n this._previous.hide().removeClass(\"k-fx-current\");\n this.element.removeClass(\"k-fx-next\");\n\n if (RESTORE_OVERFLOW) {\n container.css(OVERFLOW, \"\");\n }\n\n if (!this.isAbsolute) {\n this._both().css(POSITION, \"\");\n }\n\n this.deferred.resolve();\n delete this.deferred;\n },\n\n run: function() {\n if (this._additionalEffects && this._additionalEffects[0]) {\n return this.compositeRun();\n }\n\n var that = this,\n element = that.element,\n previous = that._previous,\n container = element.parents().filter(previous.parents()).first(),\n both = that._both(),\n deferred = $.Deferred(),\n originalPosition = element.css(POSITION),\n originalOverflow;\n\n // edge case for grid/scheduler, where the previous is already destroyed.\n if (!container.length) {\n container = element.parent();\n }\n\n this.container = container;\n this.deferred = deferred;\n this.isAbsolute = originalPosition == \"absolute\";\n\n if (!this.isAbsolute) {\n both.css(POSITION, \"absolute\");\n }\n\n if (RESTORE_OVERFLOW) {\n originalOverflow = container.css(OVERFLOW);\n container.css(OVERFLOW, \"hidden\");\n }\n\n if (!transitions) {\n this.complete();\n } else {\n element.addClass(\"k-fx-hidden\");\n\n container.addClass(this._containerClass());\n\n this.completeProxy = this.complete.bind(this);\n container.on(transitions.event, this.completeProxy);\n\n kendo.animationFrame(function() {\n element.removeClass(\"k-fx-hidden\").addClass(\"k-fx-next\");\n previous.css(\"display\", \"\").addClass(\"k-fx-current\");\n that._before(previous, element);\n kendo.animationFrame(function() {\n container.removeClass(\"k-fx-start\").addClass(\"k-fx-end\");\n that._after(previous, element);\n });\n });\n }\n\n return deferred.promise();\n },\n\n stop: function() {\n this.complete();\n }\n });\n\n var Animation = kendo.Class.extend({\n init: function() {\n var that = this;\n that._tickProxy = that._tick.bind(that);\n that._started = false;\n },\n\n tick: $.noop,\n done: $.noop,\n onEnd: $.noop,\n onCancel: $.noop,\n\n start: function() {\n if (!this.enabled()) {\n return;\n }\n\n if (!this.done()) {\n this._started = true;\n kendo.animationFrame(this._tickProxy);\n } else {\n this.onEnd();\n }\n },\n\n enabled: function() {\n return true;\n },\n\n cancel: function() {\n this._started = false;\n this.onCancel();\n },\n\n _tick: function() {\n var that = this;\n if (!that._started) { return; }\n\n that.tick();\n\n if (!that.done()) {\n kendo.animationFrame(that._tickProxy);\n } else {\n that._started = false;\n that.onEnd();\n }\n }\n });\n\n var Transition = Animation.extend({\n init: function(options) {\n var that = this;\n extend(that, options);\n Animation.fn.init.call(that);\n },\n\n done: function() {\n return this.timePassed() >= this.duration;\n },\n\n timePassed: function() {\n return Math.min(this.duration, (new Date()) - this.startDate);\n },\n\n moveTo: function(options) {\n var that = this,\n movable = that.movable;\n\n that.initial = movable[that.axis];\n that.delta = options.location - that.initial;\n\n that.duration = typeof options.duration == \"number\" ? options.duration : 300;\n\n that.tick = that._easeProxy(options.ease);\n\n that.startDate = new Date();\n that.start();\n },\n\n _easeProxy: function(ease) {\n var that = this;\n\n return function() {\n that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\n };\n }\n });\n\n extend(Transition, {\n easeOutExpo: function(t, b, c, d) {\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n },\n\n easeOutBack: function(t, b, c, d, s) {\n s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n });\n\n fx.Animation = Animation;\n fx.Transition = Transition;\n fx.createEffect = createEffect;\n\n fx.box = function(element) {\n element = $(element);\n var result = element.offset();\n result.width = kendo._outerWidth(element);\n result.height = kendo._outerHeight(element);\n return result;\n };\n\n fx.transformOrigin = function(inner, outer) {\n var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width),\n y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\n\n return {\n x: isNaN(x) ? 0 : x,\n y: isNaN(y) ? 0 : y\n };\n };\n\n fx.fillScale = function(inner, outer) {\n return Math.min(inner.width / outer.width, inner.height / outer.height);\n };\n\n fx.fitScale = function(inner, outer) {\n return Math.max(inner.width / outer.width, inner.height / outer.height);\n };\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.data.odata',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"data.odata\",\n name: \"OData\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n extend = $.extend,\n NEWLINE = \"\\r\\n\",\n DOUBLELINE = \"\\r\\n\\r\\n\",\n isFunction = kendo.isFunction,\n odataFilters = {\n eq: \"eq\",\n neq: \"ne\",\n gt: \"gt\",\n gte: \"ge\",\n lt: \"lt\",\n lte: \"le\",\n contains: \"substringof\",\n doesnotcontain: \"substringof\",\n endswith: \"endswith\",\n startswith: \"startswith\",\n isnull: \"eq\",\n isnotnull: \"ne\",\n isnullorempty: \"eq\",\n isnotnullorempty: \"ne\",\n isempty: \"eq\",\n isnotempty: \"ne\"\n },\n odataFiltersVersionFour = extend({}, odataFilters, {\n contains: \"contains\"\n }),\n mappers = {\n pageSize: $.noop,\n page: $.noop,\n filter: function(params, filter, useVersionFour) {\n if (filter) {\n filter = toOdataFilter(filter, useVersionFour);\n if (filter) {\n params.$filter = filter;\n }\n }\n },\n sort: function(params, orderby) {\n var expr = $.map(orderby, function(value) {\n var order = value.field.replace(/\\./g, \"/\");\n\n if (value.dir === \"desc\") {\n order += \" desc\";\n }\n\n return order;\n }).join(\",\");\n\n if (expr) {\n params.$orderby = expr;\n }\n },\n skip: function(params, skip) {\n if (skip) {\n params.$skip = skip;\n }\n },\n take: function(params, take) {\n if (take) {\n params.$top = take;\n }\n }\n },\n defaultDataType = {\n read: {\n dataType: \"jsonp\"\n }\n };\n\n function toOdataFilter(filter, useOdataFour) {\n var result = [],\n logic = filter.logic || \"and\",\n idx,\n length,\n field,\n type,\n format,\n operator,\n value,\n ignoreCase,\n filters = filter.filters;\n\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n value = filter.value;\n operator = filter.operator;\n\n if (filter.filters) {\n filter = toOdataFilter(filter, useOdataFour);\n } else {\n ignoreCase = filter.ignoreCase;\n field = field.replace(/\\./g, \"/\");\n filter = odataFilters[operator];\n if (useOdataFour) {\n filter = odataFiltersVersionFour[operator];\n }\n\n if (operator === \"isnullorempty\") {\n filter = kendo.format(\"{0} {1} null or {0} {1} ''\", field, filter);\n } else if (operator === \"isnotnullorempty\") {\n filter = kendo.format(\"{0} {1} null and {0} {1} ''\", field, filter);\n } else if (operator === \"isnull\" || operator === \"isnotnull\") {\n filter = kendo.format(\"{0} {1} null\", field, filter);\n } else if (operator === \"isempty\" || operator === \"isnotempty\") {\n filter = kendo.format(\"{0} {1} ''\", field, filter);\n } else if (filter && value !== undefined) {\n type = kendo.type(value);\n if (type === \"string\") {\n format = \"'{1}'\";\n value = value.replace(/'/g, \"''\");\n\n if (ignoreCase === true) {\n field = \"tolower(\" + field + \")\";\n }\n\n } else if (type === \"date\") {\n if (useOdataFour) {\n format = \"{1:yyyy-MM-ddTHH:mm:ss+00:00}\";\n value = kendo.timezone.apply(value, 'Etc/UTC');\n } else {\n format = \"datetime'{1:yyyy-MM-ddTHH:mm:ss}'\";\n }\n } else {\n format = \"{1}\";\n }\n\n if (filter.length > 3) {\n if (filter !== \"substringof\") {\n format = \"{0}({2},\" + format + \")\";\n } else {\n format = \"{0}(\" + format + \",{2})\";\n if (operator === \"doesnotcontain\") {\n if (useOdataFour) {\n format = \"{0}({2},'{1}') eq -1\";\n filter = \"indexof\";\n } else {\n format += \" eq false\";\n }\n }\n }\n } else {\n format = \"{2} {0} \" + format;\n }\n\n filter = kendo.format(format, filter, value, field);\n }\n }\n\n result.push(filter);\n }\n\n filter = result.join(\" \" + logic + \" \");\n\n if (result.length > 1) {\n filter = \"(\" + filter + \")\";\n }\n\n return filter;\n }\n\n function stripMetadata(obj) {\n for (var name in obj) {\n if (name.indexOf(\"@odata\") === 0) {\n delete obj[name];\n }\n }\n }\n\n function hex16() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substr(1);\n }\n\n function createBoundary(prefix) {\n return prefix + hex16() + '-' + hex16() + '-' + hex16();\n }\n\n function createDelimeter(boundary, close) {\n var result = NEWLINE + \"--\" + boundary;\n\n if (close) {\n result += \"--\";\n }\n\n return result;\n }\n\n function createCommand(transport, item, httpVerb, command) {\n var transportUrl = transport.options[command].url;\n var commandPrefix = kendo.format(\"{0} \", httpVerb);\n\n if (isFunction(transportUrl)) {\n return commandPrefix + transportUrl(item);\n } else {\n return commandPrefix + transportUrl;\n }\n }\n\n function getOperationHeader(changeset, changeId) {\n var header = \"\";\n\n header += createDelimeter(changeset, false);\n header += NEWLINE + 'Content-Type: application/http';\n header += NEWLINE + 'Content-Transfer-Encoding: binary';\n header += NEWLINE + 'Content-ID: ' + changeId;\n\n return header;\n }\n\n function getOperationContent(item) {\n var content = \"\";\n\n content += NEWLINE + \"Content-Type: application/json;odata=minimalmetadata\";\n content += NEWLINE + \"Prefer: return=representation\";\n content += DOUBLELINE + kendo.stringify(item);\n\n return content;\n }\n\n function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n var requestBody = \"\";\n\n for (var i = 0; i < collection.length; i++) {\n requestBody += getOperationHeader(changeset, changeId);\n requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n if (!skipContent) {\n requestBody += getOperationContent(collection[i]);\n }\n requestBody += NEWLINE;\n changeId++;\n }\n\n return requestBody;\n }\n\n function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n var requestBody = \"\";\n\n requestBody += getBoundary(boundary, changeset);\n requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n requestBody += createDelimeter(changeset, true);\n requestBody += NEWLINE;\n\n return requestBody;\n }\n\n function getBoundary(boundary,changeset) {\n var requestBody = \"\";\n\n requestBody += \"--\" + boundary + NEWLINE;\n requestBody += \"Content-Type: multipart/mixed; boundary=\" + changeset + NEWLINE;\n\n return requestBody;\n }\n\n function createBatchRequest(transport, colections) {\n\t\tvar options = extend({}, transport.options.batch);\n var boundary = createBoundary(\"sf_batch_\");\n var requestBody = \"\";\n var changeId = 0;\n var batchURL = transport.options.batch.url;\n var changeset = createBoundary(\"sf_changeset_\");\n\n options.type = transport.options.batch.type;\n options.url = isFunction(batchURL) ? batchURL() : batchURL;\n\t\toptions.headers = extend(options.headers || {}, {\n\t\t\t\"Content-Type\": \"multipart/mixed; boundary=\" + boundary\n\t\t});\n\n if (colections.updated.length) {\n requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, \"update\", false);\n changeId += colections.updated.length;\n changeset = createBoundary(\"sf_changeset_\");\n }\n\n if (colections.destroyed.length) {\n requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, \"destroy\", true);\n changeId += colections.destroyed.length;\n changeset = createBoundary(\"sf_changeset_\");\n }\n\n if (colections.created.length) {\n requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, \"create\", false);\n }\n\n requestBody += createDelimeter(boundary, true);\n\n options.data = requestBody;\n\n return options;\n }\n\n function parseBatchResponse(responseText) {\n var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n var markerIndex = 0;\n var collections = [];\n var changeBody;\n var status;\n var code;\n var marker;\n var jsonModel;\n\n collections.push({ models: [], passed: true });\n\n for (var i = 0; i < responseMarkers.length; i++) {\n marker = responseMarkers[i];\n if (marker.lastIndexOf('--', marker.length - 1)) {\n if (i < responseMarkers.length - 1) {\n collections.push({ models: [], passed: true });\n }\n continue;\n }\n\n if (!markerIndex) {\n markerIndex = responseText.indexOf(marker);\n } else {\n markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n }\n\n changeBody = responseText.substring(markerIndex, responseText.indexOf(\"--\", markerIndex + 1));\n status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n\n if (code >= 200 && code <= 299) {\n jsonModel = changeBody.match(/\\{.*\\}/gm);\n if (jsonModel) {\n collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n }\n } else {\n collections[collections.length - 1].passed = false;\n }\n\n }\n\n return collections;\n }\n\n extend(true, kendo.data, {\n schemas: {\n odata: {\n type: \"json\",\n data: function(data) {\n return data.d.results || [data.d];\n },\n total: \"d.__count\"\n }\n },\n transports: {\n odata: {\n read: {\n cache: true, // to prevent jQuery from adding cache buster\n dataType: \"jsonp\",\n jsonp: \"$callback\"\n },\n update: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json\", // to inform the server the the request body is JSON encoded\n type: \"PUT\" // can be PUT or MERGE\n },\n create: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json\",\n type: \"POST\" // must be POST to create new entity\n },\n destroy: {\n cache: true,\n dataType: \"json\",\n type: \"DELETE\"\n },\n parameterMap: function(options, type, useVersionFour) {\n var params,\n value,\n option,\n dataType;\n\n options = options || {};\n type = type || \"read\";\n dataType = (this.options || defaultDataType)[type];\n dataType = dataType ? dataType.dataType : \"json\";\n\n if (type === \"read\") {\n params = {\n $inlinecount: \"allpages\"\n };\n\n if (dataType != \"json\") {\n params.$format = \"json\";\n }\n\n for (option in options) {\n if (mappers[option]) {\n mappers[option](params, options[option], useVersionFour);\n } else {\n params[option] = options[option];\n }\n }\n } else {\n if (dataType !== \"json\") {\n throw new Error(\"Only json dataType can be used for \" + type + \" operation.\");\n }\n\n if (type !== \"destroy\") {\n for (option in options) {\n value = options[option];\n if (typeof value === \"number\") {\n options[option] = value + \"\";\n }\n }\n\n params = kendo.stringify(options);\n }\n }\n\n return params;\n }\n }\n }\n });\n\n extend(true, kendo.data, {\n schemas: {\n \"odata-v4\": {\n type: \"json\",\n data: function(data) {\n if (Array.isArray(data)) {\n for (var i = 0; i < data.length; i++) {\n stripMetadata(data[i]);\n }\n return data;\n } else {\n data = $.extend({}, data);\n stripMetadata(data);\n\n if (data.value) {\n return data.value;\n }\n return [data];\n }\n },\n total: function(data) {\n return data[\"@odata.count\"];\n }\n }\n },\n transports: {\n \"odata-v4\": {\n batch: {\n type: \"POST\"\n },\n read: {\n cache: true, // to prevent jQuery from adding cache buster\n dataType: \"json\"\n },\n update: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json;IEEE754Compatible=true\", // to inform the server the the request body is JSON encoded\n type: \"PUT\" // can be PUT or MERGE\n },\n create: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json;IEEE754Compatible=true\",\n type: \"POST\" // must be POST to create new entity\n },\n destroy: {\n cache: true,\n dataType: \"json\",\n type: \"DELETE\"\n },\n parameterMap: function(options, type) {\n var result = kendo.data.transports.odata.parameterMap(options, type, true);\n if (type == \"read\") {\n result.$count = true;\n delete result.$inlinecount;\n }\n\n\t\t\t\t\tif (result && result.$filter) {\n\t\t\t\t\t\t// Remove the single quotation marks around the GUID (OData v4).\n\t\t\t\t\t\tresult.$filter = result.$filter.replace(/('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')/ig, function(x) {\n\t\t\t\t\t\t\treturn x.substring(1, x.length - 1);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n return result;\n },\n submit: function(e) {\n var that = this;\n var options = createBatchRequest(that, e.data);\n var collections = e.data;\n\n if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n return;\n }\n\n $.ajax(extend(true, {}, {\n success: function(response) {\n var responses = parseBatchResponse(response);\n var index = 0;\n var current;\n\n if (collections.updated.length) {\n current = responses[index];\n if (current.passed) {\n // Pass either the obtained models or an empty array if only status codes are returned.\n e.success(current.models.length ? current.models : [], \"update\");\n }\n index++;\n }\n if (collections.destroyed.length) {\n current = responses[index];\n if (current.passed) {\n // For delete operations OData returns only status codes.\n // Passing empty array to datasource will force it to correctly remove the deleted items from the pristine collection.\n e.success([], \"destroy\");\n }\n index++;\n }\n if (collections.created.length) {\n current = responses[index];\n if (current.passed) {\n e.success(current.models, \"create\");\n }\n }\n },\n error: function(response, status, error) {\n e.error(response, status, error);\n }\n }, options));\n }\n }\n }\n });\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.data.xml',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"data.xml\",\n name: \"XML\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n};\n\n\n(function($, undefined) {\n var kendo = window.kendo,\n isArray = Array.isArray,\n isPlainObject = $.isPlainObject,\n map = $.map,\n each = $.each,\n extend = $.extend,\n getter = kendo.getter,\n Class = kendo.Class;\n\n var XmlDataReader = Class.extend({\n init: function(options) {\n var that = this,\n total = options.total,\n model = options.model,\n parse = options.parse,\n errors = options.errors,\n serialize = options.serialize,\n data = options.data;\n\n if (model) {\n if (isPlainObject(model)) {\n var base = options.modelBase || kendo.data.Model;\n\n if (model.fields) {\n each(model.fields, function(field, value) {\n if (isPlainObject(value) && value.field) {\n if (!kendo.isFunction(value.field)) {\n value = extend(value, { field: that.getter(value.field) });\n }\n } else {\n value = { field: that.getter(value) };\n }\n model.fields[field] = value;\n });\n }\n\n var id = model.id;\n if (id) {\n var idField = {};\n\n idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\n model.fields = extend(idField, model.fields);\n model.id = that.xpathToMember(id);\n }\n model = base.define(model);\n }\n\n that.model = model;\n }\n\n if (total) {\n if (typeof total == \"string\") {\n total = that.getter(total);\n that.total = function(data) {\n return parseInt(total(data), 10);\n };\n } else if (typeof total == \"function\") {\n that.total = total;\n }\n }\n\n if (errors) {\n if (typeof errors == \"string\") {\n errors = that.getter(errors);\n that.errors = function(data) {\n return errors(data) || null;\n };\n } else if (typeof errors == \"function\") {\n that.errors = errors;\n }\n }\n\n if (data) {\n if (typeof data == \"string\") {\n data = that.xpathToMember(data);\n that.data = function(value) {\n var result = that.evaluate(value, data),\n modelInstance;\n\n result = isArray(result) ? result : [result];\n\n if (that.model && model.fields) {\n modelInstance = new that.model();\n\n return map(result, function(value) {\n if (value) {\n var record = {}, field;\n\n for (field in model.fields) {\n record[field] = modelInstance._parse(field, model.fields[field].field(value));\n }\n\n return record;\n }\n });\n }\n\n return result;\n };\n } else if (typeof data == \"function\") {\n that.data = data;\n }\n }\n\n if (typeof parse == \"function\") {\n var xmlParse = that.parse;\n\n that.parse = function(data) {\n var xml = parse.call(that, data);\n return xmlParse.call(that, xml);\n };\n }\n\n if (typeof serialize == \"function\") {\n that.serialize = serialize;\n }\n },\n total: function(result) {\n return this.data(result).length;\n },\n errors: function(data) {\n return data ? data.errors : null;\n },\n serialize: function(data) {\n return data;\n },\n parseDOM: function(element) {\n var result = {},\n parsedNode,\n node,\n nodeType,\n nodeName,\n member,\n attribute,\n attributes = element.attributes,\n attributeCount = attributes.length,\n idx;\n\n for (idx = 0; idx < attributeCount; idx++) {\n attribute = attributes[idx];\n result[\"@\" + attribute.nodeName] = attribute.nodeValue;\n }\n\n for (node = element.firstChild; node; node = node.nextSibling) {\n nodeType = node.nodeType;\n\n if (nodeType === 3 || nodeType === 4) {\n // text nodes or CDATA are stored as #text field\n result[\"#text\"] = node.nodeValue;\n } else if (nodeType === 1) {\n // elements are stored as fields\n parsedNode = this.parseDOM(node);\n\n nodeName = node.nodeName;\n\n member = result[nodeName];\n\n if (isArray(member)) {\n // elements of same nodeName are stored as array\n member.push(parsedNode);\n } else if (member !== undefined) {\n member = [member, parsedNode];\n } else {\n member = parsedNode;\n }\n\n result[nodeName] = member;\n }\n }\n return result;\n },\n\n evaluate: function(value, expression) {\n var members = expression.split(\".\"),\n member,\n result,\n length,\n intermediateResult,\n idx;\n\n while (member = members.shift()) {\n value = value[member];\n\n if (isArray(value)) {\n result = [];\n expression = members.join(\".\");\n\n for (idx = 0, length = value.length; idx < length; idx++) {\n intermediateResult = this.evaluate(value[idx], expression);\n\n intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\n\n result.push.apply(result, intermediateResult);\n }\n\n return result;\n }\n }\n\n return value;\n },\n\n parse: function(xml) {\n var documentElement,\n tree,\n result = {};\n\n documentElement = xml.documentElement || $.parseXML(xml).documentElement;\n\n tree = this.parseDOM(documentElement);\n\n result[documentElement.nodeName] = tree;\n\n return result;\n },\n\n xpathToMember: function(member, raw) {\n if (!member) {\n return \"\";\n }\n\n member = member.replace(/^\\//, \"\") // remove the first \"/\"\n .replace(/\\//g, \".\"); // replace all \"/\" with \".\"\n\n if (member.indexOf(\"@\") >= 0) {\n // replace @attribute with '[\"@attribute\"]'\n return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\n }\n\n if (member.indexOf(\"text()\") >= 0) {\n // replace \".text()\" with '[\"#text\"]'\n return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\n }\n\n return member;\n },\n getter: function(member) {\n return getter(this.xpathToMember(member), true);\n }\n });\n\n $.extend(true, kendo.data, {\n XmlDataReader: XmlDataReader,\n readers: {\n xml: XmlDataReader\n }\n });\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.data',[ \"kendo.core\", \"kendo.data.odata\", \"kendo.data.xml\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"data\",\n name: \"Data source\",\n category: \"framework\",\n description: \"Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.\",\n depends: [ \"core\" ],\n features: [ {\n id: \"data-odata\",\n name: \"OData\",\n description: \"Support for accessing Open Data Protocol (OData) services.\",\n depends: [ \"data.odata\" ]\n }, {\n id: \"data-signalr\",\n name: \"SignalR\",\n description: \"Support for binding to SignalR hubs.\",\n depends: [ \"data.signalr\" ]\n }, {\n id: \"data-XML\",\n name: \"XML\",\n description: \"Support for binding to XML.\",\n depends: [ \"data.xml\" ]\n }]\n};\n\n\n(function($, undefined) {\n var extend = $.extend,\n isPlainObject = $.isPlainObject,\n isEmptyObject = $.isEmptyObject,\n isArray = Array.isArray,\n grep = $.grep,\n ajax = $.ajax,\n map,\n each = $.each,\n noop = $.noop,\n kendo = window.kendo,\n isFunction = kendo.isFunction,\n Observable = kendo.Observable,\n Class = kendo.Class,\n STRING = \"string\",\n FUNCTION = \"function\",\n ASCENDING = \"asc\",\n CREATE = \"create\",\n READ = \"read\",\n UPDATE = \"update\",\n DESTROY = \"destroy\",\n CHANGE = \"change\",\n SYNC = \"sync\",\n GET = \"get\",\n ERROR = \"error\",\n REQUESTSTART = \"requestStart\",\n PROGRESS = \"progress\",\n REQUESTEND = \"requestEnd\",\n ITEMSLOADED = \"itemsLoaded\",\n ITEMLOAD = \"itemLoad\",\n crud = [CREATE, READ, UPDATE, DESTROY],\n identity = function(o) { return o; },\n getter = kendo.getter,\n stringify = kendo.stringify,\n math = Math,\n push = [].push,\n join = [].join,\n pop = [].pop,\n splice = [].splice,\n shift = [].shift,\n slice = [].slice,\n unshift = [].unshift,\n toString = {}.toString,\n stableSort = kendo.support.stableSort,\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\n objectKeys = [];\n\n var ObservableArray = Observable.extend({\n init: function(array, type) {\n var that = this;\n\n that.type = type || ObservableObject;\n\n Observable.fn.init.call(that);\n\n that.length = array.length;\n\n that.wrapAll(array, that);\n that._loadPromises = [];\n that._loadedNodes = [];\n },\n\n at: function(index) {\n return this[index];\n },\n\n toJSON: function(serializeFunctions) {\n var idx, length = this.length, value, json = new Array(length);\n\n for (idx = 0; idx < length; idx++) {\n value = this[idx];\n\n if (value instanceof ObservableObject) {\n value = value.toJSON(serializeFunctions);\n }\n\n json[idx] = value;\n }\n\n return json;\n },\n\n parent: noop,\n\n wrapAll: function(source, target) {\n var that = this,\n idx,\n length,\n parent = function() {\n return that;\n };\n\n target = target || [];\n\n for (idx = 0, length = source.length; idx < length; idx++) {\n target[idx] = that.wrap(source[idx], parent);\n }\n\n return target;\n },\n\n wrap: function(object, parent) {\n var that = this,\n observable;\n\n if (object !== null && toString.call(object) === \"[object Object]\") {\n observable = object instanceof that.type || object instanceof Model;\n\n if (!observable) {\n object = object instanceof ObservableObject ? object.toJSON() : object;\n object = new that.type(object);\n }\n\n object.parent = parent;\n\n object.bind(CHANGE, function(e) {\n var isGroup = object.hasOwnProperty(\"hasSubgroups\");\n that.trigger(CHANGE, {\n field: e.field,\n node: e.node,\n index: e.index,\n items: e.items || [this],\n action: e.node || isGroup ? (e.action || \"itemloaded\") : \"itemchange\"\n });\n });\n\n object.bind(ITEMLOAD, function(e) {\n that._loadPromises.push(e.promise);\n that._loading = true;\n\n e.promise.done(function() {\n that._loadedNodes.push(e.node);\n var index = that._loadPromises.indexOf(e.promise);\n that._loadPromises.splice(index, 1);\n\n if (!that._loadPromises.length) {\n that._loading = false;\n that.trigger(ITEMSLOADED, { collection: that, nodes: that._loadedNodes });\n that._loadedNodes = [];\n }\n });\n });\n }\n\n return object;\n },\n\n loading: function() {\n return this._loading;\n },\n\n push: function() {\n var index = this.length,\n items = this.wrapAll(arguments),\n result;\n\n result = push.apply(this, items);\n\n if (!this.omitChangeEvent) {\n this.trigger(CHANGE, {\n action: \"add\",\n index: index,\n items: items\n });\n }\n\n return result;\n },\n\n slice: slice,\n\n sort: [].sort,\n\n join: join,\n\n pop: function() {\n var length = this.length, result = pop.apply(this);\n\n if (length) {\n this.trigger(CHANGE, {\n action: \"remove\",\n index: length - 1,\n items: [result]\n });\n }\n\n return result;\n },\n\n splice: function(index, howMany, item) {\n var items = this.wrapAll(slice.call(arguments, 2)),\n result, i, len;\n\n result = splice.apply(this, [index, howMany].concat(items));\n\n if (result.length) {\n if (!this.omitChangeEvent) {\n this.trigger(CHANGE, {\n action: \"remove\",\n index: index,\n items: result\n });\n }\n\n for (i = 0, len = result.length; i < len; i++) {\n if (result[i] && result[i].children) {\n result[i].unbind(CHANGE);\n }\n }\n }\n\n if (item) {\n if (!this.omitChangeEvent) {\n this.trigger(CHANGE, {\n action: \"add\",\n index: index,\n items: items\n });\n }\n }\n return result;\n },\n\n shift: function() {\n var length = this.length, result = shift.apply(this);\n\n if (length) {\n this.trigger(CHANGE, {\n action: \"remove\",\n index: 0,\n items: [result]\n });\n }\n\n return result;\n },\n\n unshift: function() {\n var items = this.wrapAll(arguments),\n result;\n\n result = unshift.apply(this, items);\n\n this.trigger(CHANGE, {\n action: \"add\",\n index: 0,\n items: items\n });\n\n return result;\n },\n\n indexOf: function(item) {\n var that = this,\n idx,\n length;\n\n for (idx = 0, length = that.length; idx < length; idx++) {\n if (that[idx] === item) {\n return idx;\n }\n }\n return -1;\n },\n\n forEach: function(callback, thisArg) {\n var idx = 0;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n callback.call(context, this[idx], idx, this);\n }\n },\n\n map: function(callback, thisArg) {\n var idx = 0;\n var result = [];\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n result[idx] = callback.call(context, this[idx], idx, this);\n }\n\n return result;\n },\n\n reduce: function(callback) {\n var idx = 0,\n result,\n length = this.length;\n\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx < length) {\n result = this[idx++];\n }\n\n for (; idx < length; idx++) {\n result = callback(result, this[idx], idx, this);\n }\n\n return result;\n },\n\n reduceRight: function(callback) {\n var idx = this.length - 1,\n result;\n\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx > 0) {\n result = this[idx--];\n }\n\n for (; idx >= 0; idx--) {\n result = callback(result, this[idx], idx, this);\n }\n\n return result;\n },\n\n filter: function(callback, thisArg) {\n var idx = 0;\n var result = [];\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n result[result.length] = item;\n }\n }\n\n return result;\n },\n\n find: function(callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n return item;\n }\n }\n },\n\n every: function(callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (!callback.call(context, item, idx, this)) {\n return false;\n }\n }\n\n return true;\n },\n\n some: function(callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n return true;\n }\n }\n\n return false;\n },\n\n // non-standard collection methods\n remove: function(item) {\n var idx = this.indexOf(item);\n\n if (idx !== -1) {\n this.splice(idx, 1);\n }\n },\n\n empty: function() {\n this.splice(0, this.length);\n }\n });\n\n // Polyfill for Symbol.iterator\n if (typeof Symbol !== \"undefined\" && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n }\n\n var LazyObservableArray = ObservableArray.extend({\n init: function(data, type, events) {\n var parentFn = function() { return this; };\n\n Observable.fn.init.call(this);\n\n this.type = type || ObservableObject;\n\n if (events) {\n this._events = events;\n }\n\n for (var idx = 0; idx < data.length; idx++) {\n this[idx] = data[idx];\n }\n\n this.length = idx;\n this._parent = parentFn.bind(this);\n },\n at: function(index) {\n var item = this[index];\n\n if (!(item instanceof this.type)) {\n item = this[index] = this.wrap(item, this._parent);\n } else {\n item.parent = this._parent;\n }\n\n return item;\n }\n });\n\n function eventHandler(context, type, field, prefix) {\n return function(e) {\n var event = {}, key;\n\n for (key in e) {\n event[key] = e[key];\n }\n\n if (prefix) {\n event.field = field + \".\" + e.field;\n } else {\n event.field = field;\n }\n\n if (type == CHANGE && context._notifyChange) {\n context._notifyChange(event);\n }\n\n context.trigger(type, event);\n };\n }\n\n function isPrimitiveType(value) {\n return (typeof value === \"object\" && Object.getPrototypeOf(value) === Object.getPrototypeOf({}))\n || Object.getPrototypeOf(value) === Object.getPrototypeOf(new Date())\n || typeof value !== \"object\";\n }\n\n function ownKeys(value, ignoreObjectKeys) {\n var props = [];\n var protoKeys = [];\n var keys, filteredObjectKeys;\n\n value = value || {};\n\n if (!isPrimitiveType(value)) {\n protoKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(value));\n }\n\n keys = Object.getOwnPropertyNames(value).concat(protoKeys);\n\n filteredObjectKeys = objectKeys.filter(function(key) {\n return keys.indexOf(key) < 0;\n });\n\n while (value) {\n Object.getOwnPropertyNames(value).forEach(function(prop) {\n if (props.indexOf(prop) === -1 && (!ignoreObjectKeys || filteredObjectKeys.indexOf(prop) < 0)) {\n props.push(prop);\n }\n });\n value = Object.getPrototypeOf(value);\n }\n\n return props;\n }\n\n objectKeys = ownKeys({}, false);\n\n var ObservableObject = Observable.extend({\n init: function(value) {\n var that = this,\n member,\n keys = ownKeys(value, true),\n parent = function() {\n return that;\n };\n\n Observable.fn.init.call(this);\n\n this._handlers = {};\n\n keys.forEach(function(field) {\n member = value[field];\n\n if (typeof member === \"object\" && member && !member.getTime && field.charAt(0) != \"_\") {\n member = that.wrap(member, field, parent);\n }\n\n that[field] = member;\n });\n\n that.uid = kendo.guid();\n },\n\n shouldSerialize: function(field, serializeFunctions) {\n return this.hasOwnProperty(field) && field !== \"_handlers\" && field !== \"_events\" && ((serializeFunctions && serializeFunctions[field]) || typeof this[field] !== FUNCTION) && field !== \"uid\";\n },\n\n forEach: function(f) {\n for (var i in this) {\n if (this.shouldSerialize(i)) {\n f(this[i], i);\n }\n }\n },\n\n toJSON: function(serializeFunctions) {\n var result = {}, value, field;\n\n for (field in this) {\n if (this.shouldSerialize(field, serializeFunctions)) {\n value = this[field];\n\n if (value instanceof ObservableObject || value instanceof ObservableArray) {\n value = value.toJSON(serializeFunctions);\n }\n\n result[field] = value;\n }\n }\n\n return result;\n },\n\n get: function(field) {\n var that = this, result;\n\n that.trigger(GET, { field: field });\n\n if (field === \"this\") {\n result = that;\n } else {\n result = kendo.getter(field, true)(that);\n }\n\n return result;\n },\n\n _set: function(field, value) {\n var that = this;\n var composite = field.indexOf(\".\") >= 0;\n\n if (composite) {\n var paths = field.split(\".\"),\n path = \"\";\n\n while (paths.length > 1) {\n path += paths.shift();\n var obj = kendo.getter(path, true)(that);\n if (obj instanceof ObservableObject) {\n obj.set(paths.join(\".\"), value);\n return composite;\n }\n path += \".\";\n }\n }\n\n kendo.setter(field)(that, value);\n\n return composite;\n },\n\n set: function(field, value) {\n var that = this,\n isSetPrevented = false,\n composite = field.indexOf(\".\") >= 0,\n current = kendo.getter(field, true)(that);\n\n if (current !== value) {\n if (current instanceof Observable && this._handlers[field]) {\n if (this._handlers[field].get) {\n current.unbind(GET, this._handlers[field].get);\n }\n current.unbind(CHANGE, this._handlers[field].change);\n }\n\n isSetPrevented = that.trigger(\"set\", { field: field, value: value });\n\n if (!isSetPrevented) {\n if (!composite) {\n value = that.wrap(value, field, function() { return that; });\n }\n if (!that._set(field, value) || field.indexOf(\"(\") >= 0 || field.indexOf(\"[\") >= 0) {\n that.trigger(CHANGE, { field: field });\n }\n }\n }\n\n return isSetPrevented;\n },\n\n parent: noop,\n\n wrap: function(object, field, parent) {\n var that = this;\n var get;\n var change;\n var type = toString.call(object);\n\n if (object != null && (type === \"[object Object]\" || type === \"[object Array]\")) {\n var isObservableArray = object instanceof ObservableArray;\n var isDataSource = object instanceof DataSource;\n\n if (type === \"[object Object]\" && !isDataSource && !isObservableArray) {\n if (!(object instanceof ObservableObject)) {\n object = new ObservableObject(object);\n }\n\n get = eventHandler(that, GET, field, true);\n object.bind(GET, get);\n change = eventHandler(that, CHANGE, field, true);\n object.bind(CHANGE, change);\n\n that._handlers[field] = { get: get, change: change };\n } else if (type === \"[object Array]\" || isObservableArray || isDataSource) {\n if (!isObservableArray && !isDataSource) {\n object = new ObservableArray(object);\n }\n\n change = eventHandler(that, CHANGE, field, false);\n\n object.bind(CHANGE, change);\n\n that._handlers[field] = { change: change };\n }\n\n object.parent = parent;\n }\n\n return object;\n }\n });\n\n function equal(x, y) {\n if (x === y) {\n return true;\n }\n\n var xtype = kendo.type(x), ytype = kendo.type(y), field;\n\n if (xtype !== ytype) {\n return false;\n }\n\n if (xtype === \"date\") {\n return x.getTime() === y.getTime();\n }\n\n if (xtype !== \"object\" && xtype !== \"array\") {\n return false;\n }\n\n for (field in x) {\n if (!equal(x[field], y[field])) {\n return false;\n }\n }\n\n return true;\n }\n\n var parsers = {\n \"number\": function(value) {\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\n return null;\n }\n return kendo.parseFloat(value);\n },\n\n \"date\": function(value) {\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\n return null;\n }\n return kendo.parseDate(value);\n },\n\n \"boolean\": function(value) {\n if (typeof value === STRING) {\n if (value.toLowerCase() === \"null\") {\n return null;\n } else {\n return value.toLowerCase() === \"true\";\n }\n }\n return value != null ? !!value : value;\n },\n\n \"string\": function(value) {\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\n return null;\n }\n return value != null ? (value + \"\") : value;\n },\n\n \"default\": function(value) {\n return value;\n }\n };\n\n var defaultValues = {\n \"string\": \"\",\n \"number\": 0,\n \"date\": new Date(),\n \"boolean\": false,\n \"default\": \"\"\n };\n\n function getFieldByName(obj, name) {\n var field,\n fieldName;\n\n for (fieldName in obj) {\n field = obj[fieldName];\n if (isPlainObject(field) && field.field && field.field === name) {\n return field;\n } else if (field === name) {\n return field;\n }\n }\n return null;\n }\n\n var Model = ObservableObject.extend({\n init: function(data) {\n var that = this;\n\n if (!data || $.isEmptyObject(data)) {\n data = $.extend({}, that.defaults, data);\n\n if (that._initializers) {\n for (var idx = 0; idx < that._initializers.length; idx++) {\n var name = that._initializers[idx];\n data[name] = that.defaults[name]();\n }\n }\n }\n\n ObservableObject.fn.init.call(that, data);\n\n that.dirty = false;\n that.dirtyFields = {};\n\n if (that.idField) {\n that.id = that.get(that.idField);\n\n if (that.id === undefined) {\n that.id = that._defaultId;\n }\n }\n },\n\n shouldSerialize: function(field) {\n return ObservableObject.fn.shouldSerialize.call(this, field) &&\n field !== \"uid\" && !(this.idField !== \"id\" && field === \"id\") &&\n field !== \"dirty\" && field !== \"dirtyFields\" && field !== \"_accessors\";\n },\n\n _parse: function(field, value) {\n var that = this,\n fieldName = field,\n fields = (that.fields || {}),\n parse;\n\n field = fields[field];\n if (!field) {\n field = getFieldByName(fields, fieldName);\n }\n if (field) {\n parse = field.parse;\n if (!parse && field.type) {\n parse = parsers[field.type.toLowerCase()];\n }\n }\n\n return parse ? parse(value) : value;\n },\n\n _notifyChange: function(e) {\n var action = e.action;\n\n if (action == \"add\" || action == \"remove\") {\n this.dirty = true;\n this.dirtyFields[e.field] = true;\n }\n },\n\n editable: function(field) {\n field = (this.fields || {})[field];\n return field ? field.editable !== false : true;\n },\n\n set: function(field, value) {\n var that = this;\n var dirty = that.dirty;\n\n if (that.editable(field)) {\n value = that._parse(field, value);\n\n if (!equal(value, that.get(field))) {\n that.dirty = true;\n that.dirtyFields[field] = true;\n\n if (ObservableObject.fn.set.call(that, field, value) && !dirty) {\n that.dirty = dirty;\n\n if (!that.dirty) {\n that.dirtyFields[field] = false;\n }\n }\n } else {\n that.trigger(\"equalSet\", { field: field, value: value });\n }\n }\n },\n\n accept: function(data) {\n var that = this,\n parent = function() { return that; },\n field;\n\n for (field in data) {\n var value = data[field];\n\n if (field.charAt(0) != \"_\") {\n value = that.wrap(data[field], field, parent);\n }\n\n that._set(field, value);\n }\n\n if (that.idField) {\n that.id = that.get(that.idField);\n }\n\n that.dirty = false;\n that.dirtyFields = {};\n },\n\n isNew: function() {\n return this.id === this._defaultId;\n }\n });\n\n Model.define = function(base, options) {\n if (options === undefined) {\n options = base;\n base = Model;\n }\n\n var model,\n proto = extend({ defaults: {} }, options),\n name,\n field,\n type,\n value,\n idx,\n length,\n fields = {},\n originalName,\n id = proto.id,\n functionFields = [];\n\n if (id) {\n proto.idField = id;\n }\n\n if (proto.id) {\n delete proto.id;\n }\n\n if (id) {\n proto.defaults[id] = proto._defaultId = \"\";\n }\n\n if (toString.call(proto.fields) === \"[object Array]\") {\n for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n field = proto.fields[idx];\n if (typeof field === STRING) {\n fields[field] = {};\n } else if (field.field) {\n fields[field.field] = field;\n }\n }\n proto.fields = fields;\n }\n\n for (name in proto.fields) {\n field = proto.fields[name];\n type = field.type || \"default\";\n value = null;\n originalName = name;\n\n name = typeof (field.field) === STRING ? field.field : name;\n\n if (!field.nullable) {\n value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n\n if (typeof value === \"function\") {\n functionFields.push(name);\n }\n }\n\n if (options.id === name) {\n proto._defaultId = value;\n }\n\n proto.defaults[originalName !== name ? originalName : name] = value;\n\n field.parse = field.parse || parsers[type];\n }\n\n if (functionFields.length > 0) {\n proto._initializers = functionFields;\n }\n\n model = base.extend(proto);\n model.define = function(options) {\n return Model.define(model, options);\n };\n\n if (proto.fields) {\n model.fields = proto.fields;\n model.idField = proto.idField;\n }\n\n return model;\n };\n\n var Comparer = {\n selector: function(field) {\n return isFunction(field) ? field : getter(field);\n },\n\n compare: function(field) {\n var selector = this.selector(field);\n return function(a, b) {\n a = selector(a);\n b = selector(b);\n\n if (a == null && b == null) {\n return 0;\n }\n\n if (a == null) {\n return -1;\n }\n\n if (b == null) {\n return 1;\n }\n\n if (a.localeCompare) {\n return a.localeCompare(b);\n }\n\n return a > b ? 1 : (a < b ? -1 : 0);\n };\n },\n\n create: function(sort) {\n var compare = sort.compare || this.compare(sort.field);\n\n if (sort.dir == \"desc\") {\n return function(a, b) {\n return compare(b, a, true);\n };\n }\n\n return compare;\n },\n\n combine: function(comparers) {\n return function(a, b) {\n var result = comparers[0](a, b),\n idx,\n length;\n\n for (idx = 1, length = comparers.length; idx < length; idx ++) {\n result = result || comparers[idx](a, b);\n }\n\n return result;\n };\n }\n };\n\n var StableComparer = extend({}, Comparer, {\n asc: function(field) {\n var selector = this.selector(field);\n return function(a, b) {\n var valueA = selector(a);\n var valueB = selector(b);\n\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n\n if (valueA == null) {\n return -1;\n }\n\n if (valueB == null) {\n return 1;\n }\n\n if (valueA.localeCompare) {\n return valueA.localeCompare(valueB);\n }\n\n return valueA > valueB ? 1 : -1;\n };\n },\n\n desc: function(field) {\n var selector = this.selector(field);\n return function(a, b) {\n var valueA = selector(a);\n var valueB = selector(b);\n\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n\n if (valueA == null) {\n return 1;\n }\n\n if (valueB == null) {\n return -1;\n }\n\n if (valueB.localeCompare) {\n return valueB.localeCompare(valueA);\n }\n\n return valueA < valueB ? 1 : -1;\n };\n },\n create: function(sort) {\n return this[sort.dir](sort.field);\n }\n });\n\n map = function(array, callback) {\n var idx, length = array.length, result = new Array(length);\n\n for (idx = 0; idx < length; idx++) {\n result[idx] = callback(array[idx], idx, array);\n }\n\n return result;\n };\n\n var operators = (function() {\n\n function quote(str) {\n if (typeof str == \"string\") {\n str = str.replace(/[\\r\\n]+/g, \"\");\n }\n return JSON.stringify(str);\n }\n\n function textOp(impl) {\n return function(a, b, ignore, accentFoldingFiltering) {\n b += \"\";\n if (ignore) {\n a = \"(\" + a + \" + '').toString()\" + ((accentFoldingFiltering) ? \".toLocaleLowerCase('\" + accentFoldingFiltering + \"')\" : \".toLowerCase()\");\n b = ((accentFoldingFiltering) ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase());\n }\n return impl(a, quote(b), ignore);\n };\n }\n\n function operator(op, a, b, ignore, accentFoldingFiltering) {\n if (b != null) {\n if (typeof b === STRING) {\n var date = dateRegExp.exec(b);\n if (date) {\n b = new Date(+date[1]);\n } else if (ignore) {\n b = quote(((accentFoldingFiltering) ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase()));\n a = \"((\" + a + \" || '')+'')\" + ((accentFoldingFiltering) ? \".toLocaleLowerCase('\" + accentFoldingFiltering + \"')\" : \".toLowerCase()\");\n } else {\n b = quote(b);\n }\n }\n\n if (b.getTime) {\n //b looks like a Date\n a = \"(\" + a + \"&&\" + a + \".getTime?\" + a + \".getTime():\" + a + \")\";\n b = b.getTime();\n }\n }\n\n return a + \" \" + op + \" \" + b;\n }\n\n function getMatchRegexp(pattern) {\n // take a pattern, as supported by Excel match filter, and\n // convert it to the equivalent JS regular expression.\n // Excel patterns support:\n //\n // * - match any sequence of characters\n // ? - match a single character\n //\n // to match a literal * or ?, they must be prefixed by a tilde (~)\n for (var rx = \"/^\", esc = false, i = 0; i < pattern.length; ++i) {\n var ch = pattern.charAt(i);\n if (esc) {\n rx += \"\\\\\" + ch;\n } else if (ch == \"~\") {\n esc = true;\n continue;\n } else if (ch == \"*\") {\n rx += \".*\";\n } else if (ch == \"?\") {\n rx += \".\";\n } else if (\".+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0\".indexOf(ch) >= 0) {\n rx += \"\\\\\" + ch;\n } else {\n rx += ch;\n }\n esc = false;\n }\n return rx + \"$/\";\n }\n\n return {\n quote: function(value) {\n if (value && value.getTime) {\n return \"new Date(\" + value.getTime() + \")\";\n }\n return quote(value);\n },\n eq: function(a, b, ignore, accentFoldingFiltering) {\n return operator(\"==\", a, b, ignore, accentFoldingFiltering);\n },\n neq: function(a, b, ignore, accentFoldingFiltering) {\n return operator(\"!=\", a, b, ignore, accentFoldingFiltering);\n },\n gt: function(a, b, ignore) {\n return operator(\">\", a, b, ignore);\n },\n gte: function(a, b, ignore) {\n return operator(\">=\", a, b, ignore);\n },\n lt: function(a, b, ignore) {\n return operator(\"<\", a, b, ignore);\n },\n lte: function(a, b, ignore) {\n return operator(\"<=\", a, b, ignore);\n },\n startswith: textOp(function(a, b) {\n return a + \".lastIndexOf(\" + b + \", 0) == 0\";\n }),\n doesnotstartwith: textOp(function(a, b) {\n return a + \".lastIndexOf(\" + b + \", 0) == -1\";\n }),\n endswith: textOp(function(a, b) {\n var n = b ? b.length - 2 : 0;\n return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") >= 0\";\n }),\n doesnotendwith: textOp(function(a, b) {\n var n = b ? b.length - 2 : 0;\n return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") < 0\";\n }),\n contains: textOp(function(a, b) {\n return a + \".indexOf(\" + b + \") >= 0\";\n }),\n doesnotcontain: textOp(function(a, b) {\n return a + \".indexOf(\" + b + \") == -1\";\n }),\n matches: textOp(function(a, b) {\n b = b.substring(1, b.length - 1);\n return getMatchRegexp(b) + \".test(\" + a + \")\";\n }),\n doesnotmatch: textOp(function(a, b) {\n b = b.substring(1, b.length - 1);\n return \"!\" + getMatchRegexp(b) + \".test(\" + a + \")\";\n }),\n isempty: function(a) {\n return a + \" === ''\";\n },\n isnotempty: function(a) {\n return a + \" !== ''\";\n },\n isnull: function(a) {\n return \"(\" + a + \" == null)\";\n },\n isnotnull: function(a) {\n return \"(\" + a + \" != null)\";\n },\n isnullorempty: function(a) {\n return \"(\" + a + \" === null) || (\" + a + \" === '')\";\n },\n isnotnullorempty: function(a) {\n return \"(\" + a + \" !== null) && (\" + a + \" !== '')\";\n }\n };\n })();\n\n function Query(data) {\n this.data = data || [];\n }\n\n Query.filterExpr = function(expression) {\n var expressions = [],\n logic = { and: \" && \", or: \" || \" },\n idx,\n length,\n filter,\n expr,\n fieldFunctions = [],\n operatorFunctions = [],\n field,\n operator,\n filters = expression.filters;\n\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n operator = filter.operator;\n\n if (filter.filters) {\n expr = Query.filterExpr(filter);\n //Nested function fields or operators - update their index e.g. __o[0] -> __o[1]\n filter = expr.expression\n .replace(/__o\\[(\\d+)\\]/g, function(match, index) {\n index = +index;\n return \"__o[\" + (operatorFunctions.length + index) + \"]\";\n })\n .replace(/__f\\[(\\d+)\\]/g, function(match, index) {\n index = +index;\n return \"__f[\" + (fieldFunctions.length + index) + \"]\";\n });\n\n operatorFunctions.push.apply(operatorFunctions, expr.operators);\n fieldFunctions.push.apply(fieldFunctions, expr.fields);\n } else {\n if (typeof field === FUNCTION) {\n expr = \"__f[\" + fieldFunctions.length + \"](d)\";\n fieldFunctions.push(field);\n } else {\n expr = kendo.expr(field);\n }\n\n if (typeof operator === FUNCTION) {\n filter = \"__o[\" + operatorFunctions.length + \"](\" + expr + \", \" + operators.quote(filter.value) + \")\";\n operatorFunctions.push(operator);\n } else {\n filter = operators[(operator || \"eq\").toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined ? filter.ignoreCase : true, expression.accentFoldingFiltering);\n }\n }\n\n expressions.push(filter);\n }\n\n return { expression: \"(\" + expressions.join(logic[expression.logic]) + \")\", fields: fieldFunctions, operators: operatorFunctions };\n };\n\n function normalizeSort(field, dir) {\n if (field) {\n var descriptor = typeof field === STRING ? { field: field, dir: dir } : field,\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []);\n\n return grep(descriptors, function(d) { return !!d.dir; });\n }\n }\n\n function sortFields(sorts, dir) {\n var sortObject = {};\n\n if (sorts) {\n var descriptor = typeof sorts === STRING ? { field: sorts, dir: dir } : sorts,\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []);\n\n for (var i = 0; i < descriptors.length; i++) {\n sortObject[descriptors[i].field] = { dir: descriptors[i].dir, index: i + 1 };\n }\n }\n\n return sortObject;\n }\n\n var operatorMap = {\n \"==\": \"eq\",\n equals: \"eq\",\n isequalto: \"eq\",\n equalto: \"eq\",\n equal: \"eq\",\n \"!=\": \"neq\",\n ne: \"neq\",\n notequals: \"neq\",\n isnotequalto: \"neq\",\n notequalto: \"neq\",\n notequal: \"neq\",\n \"<\": \"lt\",\n islessthan: \"lt\",\n lessthan: \"lt\",\n less: \"lt\",\n \"<=\": \"lte\",\n le: \"lte\",\n islessthanorequalto: \"lte\",\n lessthanequal: \"lte\",\n \">\": \"gt\",\n isgreaterthan: \"gt\",\n greaterthan: \"gt\",\n greater: \"gt\",\n \">=\": \"gte\",\n isgreaterthanorequalto: \"gte\",\n greaterthanequal: \"gte\",\n ge: \"gte\",\n notsubstringof: \"doesnotcontain\",\n isnull: \"isnull\",\n isempty: \"isempty\",\n isnotempty: \"isnotempty\"\n };\n\n function normalizeOperator(expression) {\n var idx,\n length,\n filter,\n operator,\n filters = expression.filters;\n\n if (filters) {\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n operator = filter.operator;\n\n if (operator && typeof operator === STRING) {\n filter.operator = operatorMap[operator.toLowerCase()] || operator;\n }\n\n normalizeOperator(filter);\n }\n }\n }\n\n function normalizeFilter(expression) {\n if (expression && !isEmptyObject(expression)) {\n if (isArray(expression) || !expression.filters) {\n expression = {\n logic: \"and\",\n filters: isArray(expression) ? expression : [expression]\n };\n }\n\n normalizeOperator(expression);\n\n return expression;\n }\n }\n\n Query.normalizeFilter = normalizeFilter;\n\n function compareDescriptor(f1, f2) {\n if (f1.logic || f2.logic) {\n return false;\n }\n\n return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n }\n\n function normalizeDescriptor(filter) {\n filter = filter || {};\n\n if (isEmptyObject(filter)) {\n return { logic: \"and\", filters: [] };\n }\n\n return normalizeFilter(filter);\n }\n\n function fieldComparer(a, b) {\n if (b.logic || (a.field > b.field)) {\n return 1;\n } else if (a.field < b.field) {\n return -1;\n } else {\n return 0;\n }\n }\n\n function compareFilters(expr1, expr2) {\n expr1 = normalizeDescriptor(expr1);\n expr2 = normalizeDescriptor(expr2);\n\n if (expr1.logic !== expr2.logic) {\n return false;\n }\n\n var f1, f2;\n var filters1 = (expr1.filters || []).slice();\n var filters2 = (expr2.filters || []).slice();\n\n if (filters1.length !== filters2.length) {\n return false;\n }\n\n filters1 = filters1.sort(fieldComparer);\n filters2 = filters2.sort(fieldComparer);\n\n for (var idx = 0; idx < filters1.length; idx++) {\n f1 = filters1[idx];\n f2 = filters2[idx];\n\n if (f1.logic && f2.logic) {\n if (!compareFilters(f1, f2)) {\n return false;\n }\n } else if (!compareDescriptor(f1, f2)) {\n return false;\n }\n }\n\n return true;\n }\n\n Query.compareFilters = compareFilters;\n\n function normalizeAggregate(expressions) {\n return isArray(expressions) ? expressions : [expressions];\n }\n\n function normalizeGroup(field, dir, compare, skipItemSorting) {\n var descriptor = typeof field === STRING ? { field: field, dir: dir, compare: compare, skipItemSorting: skipItemSorting } : field,\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []);\n\n return map(descriptors, function(d) {\n return {\n field: d.field,\n dir: d.dir || \"asc\",\n aggregates: d.aggregates,\n compare: d.compare,\n skipItemSorting: d.skipItemSorting\n };\n });\n }\n\n function normalizeGroupWithoutCompare(field, dir, compare) {\n var descriptors = normalizeGroup(field, dir, compare);\n\n for (var i = 0; i < descriptors.length; i++) {\n delete descriptors[i].compare;\n }\n\n return descriptors;\n }\n\n function anyGroupDescriptorHasCompare(groupDescriptors) {\n var descriptors = isArray(groupDescriptors) ? groupDescriptors : [groupDescriptors];\n\n for (var i = 0; i < descriptors.length; i++) {\n if (descriptors[i] && isFunction(descriptors[i].compare)) {\n return true;\n }\n }\n\n return false;\n }\n\n Query.prototype = {\n toArray: function() {\n return this.data;\n },\n range: function(index, count) {\n return new Query(this.data.slice(index, index + count));\n },\n skip: function(count) {\n return new Query(this.data.slice(count));\n },\n take: function(count) {\n return new Query(this.data.slice(0, count));\n },\n select: function(selector) {\n return new Query(map(this.data, selector));\n },\n order: function(selector, dir, inPlace) {\n var sort = { dir: dir };\n\n if (selector) {\n if (selector.compare) {\n sort.compare = selector.compare;\n } else {\n sort.field = selector;\n }\n }\n\n if (inPlace) {\n return new Query(this.data.sort(Comparer.create(sort)));\n }\n\n return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n },\n orderBy: function(selector, inPlace) {\n return this.order(selector, \"asc\", inPlace);\n },\n orderByDescending: function(selector, inPlace) {\n return this.order(selector, \"desc\", inPlace);\n },\n sort: function(field, dir, comparer, inPlace) {\n var idx,\n length,\n descriptors = normalizeSort(field, dir),\n comparers = [];\n\n comparer = comparer || Comparer;\n\n if (descriptors.length) {\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\n comparers.push(comparer.create(descriptors[idx]));\n }\n\n return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\n }\n\n return this;\n },\n\n filter: function(expressions) {\n var idx,\n current,\n length,\n compiled,\n predicate,\n data = this.data,\n fields,\n operators,\n result = [],\n filter;\n\n expressions = normalizeFilter(expressions);\n\n if (!expressions || expressions.filters.length === 0) {\n return this;\n }\n\n compiled = Query.filterExpr(expressions);\n fields = compiled.fields;\n operators = compiled.operators;\n\n predicate = filter = new Function(\"d, __f, __o\", \"return \" + compiled.expression);\n\n if (fields.length || operators.length) {\n filter = function(d) {\n return predicate(d, fields, operators);\n };\n }\n\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n current = data[idx];\n\n if (filter(current)) {\n result.push(current);\n }\n }\n\n return new Query(result);\n },\n\n group: function(descriptors, allData, options) {\n descriptors = normalizeGroup(descriptors || []);\n allData = allData || this.data;\n\n var that = this,\n result = new Query(that.data),\n descriptor;\n\n if (descriptors.length > 0) {\n descriptor = descriptors[0];\n\n if (options && options.groupPaging) {\n result = new Query(allData).groupAllData(descriptor, allData).select(function(group) {\n var data = new Query(allData).filter([{\n field: group.field,\n operator: \"eq\",\n value: group.value,\n ignoreCase: false\n }]);\n var items = descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray(), options).toArray() : group.items;\n return {\n field: group.field,\n value: group.value,\n hasSubgroups: descriptors.length > 1,\n items: items,\n aggregates: data.aggregate(descriptor.aggregates),\n uid: kendo.guid(),\n itemCount: items.length,\n subgroupCount: items.length\n };\n });\n\n } else {\n result = result.groupBy(descriptor).select(function(group) {\n var data = new Query(allData).filter([ { field: group.field, operator: \"eq\", value: group.value, ignoreCase: false } ]);\n return {\n field: group.field,\n value: group.value,\n items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n hasSubgroups: descriptors.length > 1,\n aggregates: data.aggregate(descriptor.aggregates)\n };\n });\n }\n }\n return result;\n },\n\n groupBy: function(descriptor) {\n var that = this;\n\n if (isEmptyObject(descriptor) || !this.data.length) {\n return new Query([]);\n }\n\n var field = descriptor.field,\n sorted = descriptor.skipItemSorting ? this.data : this._sortForGrouping(field, descriptor.dir || \"asc\"),\n accessor = kendo.accessor(field),\n item,\n groupValue = accessor.get(sorted[0], field),\n group = {\n field: field,\n value: groupValue,\n items: []\n },\n currentValue,\n idx,\n len,\n result = [group];\n\n for (idx = 0, len = sorted.length; idx < len; idx++) {\n item = sorted[idx];\n currentValue = accessor.get(item, field);\n if (!groupValueComparer(groupValue, currentValue)) {\n groupValue = currentValue;\n group = {\n field: field,\n value: groupValue,\n items: []\n };\n result.push(group);\n }\n group.items.push(item);\n }\n\n result = that._sortGroups(result, descriptor);\n\n return new Query(result);\n },\n\n groupAllData: function(descriptor, allData) {\n if (isEmptyObject(descriptor) || this.data && !this.data.length) {\n return new Query([]);\n }\n\n var field = descriptor.field,\n sorted = descriptor.skipItemSorting ? allData : new Query(allData).sort(field, descriptor.dir || \"asc\", StableComparer).toArray(),\n accessor = kendo.accessor(field),\n item,\n groupValue = accessor.get(sorted[0], field),\n group = {\n field: field,\n value: groupValue,\n items: []\n },\n currentValue,\n idx,\n len,\n result = [group];\n\n for (idx = 0, len = sorted.length; idx < len; idx++) {\n item = sorted[idx];\n currentValue = accessor.get(item, field);\n if (!groupValueComparer(groupValue, currentValue)) {\n groupValue = currentValue;\n group = {\n field: field,\n value: groupValue,\n items: []\n };\n result.push(group);\n }\n group.items.push(item);\n }\n\n result = this._sortGroups(result, descriptor);\n\n return new Query(result);\n },\n\n _sortForGrouping: function(field, dir) {\n var idx, length,\n data = this.data;\n\n if (!stableSort) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n data[idx].__position = idx;\n }\n\n data = new Query(data).sort(field, dir, StableComparer).toArray();\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n delete data[idx].__position;\n }\n return data;\n }\n\n return this.sort(field, dir).toArray();\n },\n\n _sortGroups: function(groups, descriptor) {\n var result = groups;\n\n if (descriptor && isFunction(descriptor.compare)) {\n result = new Query(result).order({ compare: descriptor.compare }, descriptor.dir || ASCENDING).toArray();\n }\n\n return result;\n },\n\n aggregate: function(aggregates) {\n var idx,\n len,\n result = {},\n state = {};\n\n if (aggregates && aggregates.length) {\n for (idx = 0, len = this.data.length; idx < len; idx++) {\n calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n }\n }\n return result;\n }\n };\n\n function groupValueComparer(a, b) {\n if (a && a.getTime && b && b.getTime) {\n return a.getTime() === b.getTime();\n }\n return a === b;\n }\n\n function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n aggregates = aggregates || [];\n var idx,\n aggr,\n functionName,\n len = aggregates.length;\n\n for (idx = 0; idx < len; idx++) {\n aggr = aggregates[idx];\n functionName = aggr.aggregate;\n var field = aggr.field;\n accumulator[field] = accumulator[field] || {};\n state[field] = state[field] || {};\n state[field][functionName] = state[field][functionName] || {};\n accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n }\n }\n\n var functions = {\n sum: function(accumulator, item, accessor) {\n var value = accessor.get(item);\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n return accumulator;\n },\n count: function(accumulator) {\n return (accumulator || 0) + 1;\n },\n average: function(accumulator, item, accessor, index, length, state) {\n var value = accessor.get(item);\n\n if (state.count === undefined) {\n state.count = 0;\n }\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n if (isNumber(value)) {\n state.count++;\n }\n\n if (index == length - 1 && isNumber(accumulator)) {\n accumulator = accumulator / state.count;\n }\n return accumulator;\n },\n max: function(accumulator, item, accessor) {\n var value = accessor.get(item);\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator < value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n },\n min: function(accumulator, item, accessor) {\n var value = accessor.get(item);\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n }\n };\n\n function isNumber(val) {\n return typeof val === \"number\" && !isNaN(val);\n }\n\n function isDate(val) {\n return val && val.getTime;\n }\n\n function toJSON(array) {\n var idx, length = array.length, result = new Array(length);\n\n for (idx = 0; idx < length; idx++) {\n result[idx] = array[idx].toJSON();\n }\n\n return result;\n }\n\n Query.normalizeGroup = normalizeGroup;\n Query.normalizeSort = normalizeSort;\n\n Query.process = function(data, options, inPlace) {\n options = options || {};\n\n var group = options.group;\n var customGroupSort = anyGroupDescriptorHasCompare(normalizeGroup(group || []));\n var query = new Query(data),\n groupDescriptorsWithoutCompare = normalizeGroupWithoutCompare(group || []),\n normalizedSort = normalizeSort(options.sort || []),\n sort = customGroupSort ? normalizedSort : groupDescriptorsWithoutCompare.concat(normalizedSort),\n groupDescriptorsWithoutSort,\n total,\n filterCallback = options.filterCallback,\n filter = options.filter,\n skip = options.skip,\n take = options.take;\n\n if (sort && inPlace) {\n query = query.sort(sort, undefined, undefined, inPlace);\n }\n\n if (filter) {\n query = query.filter(filter);\n\n if (filterCallback) {\n query = filterCallback(query);\n }\n\n total = query.toArray().length;\n }\n\n if (sort) {\n if (!inPlace) {\n query = query.sort(sort);\n }\n\n if (group) {\n data = query.toArray();\n }\n }\n\n if (customGroupSort) {\n query = query.group(group, data, options);\n\n if (skip !== undefined && take !== undefined && !options.groupPaging) {\n query = new Query(flatGroups(query.toArray())).range(skip, take);\n\n groupDescriptorsWithoutSort = map(groupDescriptorsWithoutCompare, function(groupDescriptor) {\n return extend({}, groupDescriptor, {\n skipItemSorting: true\n });\n });\n\n query = query.group(groupDescriptorsWithoutSort, data, options);\n }\n } else {\n if (skip !== undefined && take !== undefined) {\n total = query.data.length;\n\n if (skip + take > total && options.virtual) {\n skip -= skip + take - total;\n skip = skip < 0 ? 0 : skip;\n }\n query = query.range(skip, take);\n }\n\n if (group && (!isEmptyObject(group) || group.length !== 0)) {\n query = query.group(group, data, options);\n }\n }\n\n return {\n total: total,\n data: query.toArray()\n };\n };\n\n var LocalTransport = Class.extend({\n init: function(options) {\n this.data = options.data;\n },\n\n read: function(options) {\n options.success(this.data);\n },\n update: function(options) {\n options.success(options.data);\n },\n create: function(options) {\n options.success(options.data);\n },\n destroy: function(options) {\n options.success(options.data);\n }\n });\n\n var RemoteTransport = Class.extend( {\n init: function(options) {\n var that = this, parameterMap;\n\n options = that.options = extend({}, that.options, options);\n\n each(crud, function(index, type) {\n if (typeof options[type] === STRING) {\n options[type] = {\n url: options[type]\n };\n }\n });\n\n that.cache = options.cache ? Cache.create(options.cache) : {\n find: noop,\n add: noop\n };\n\n parameterMap = options.parameterMap;\n\n if (options.submit) {\n that.submit = options.submit;\n }\n\n if (isFunction(options.push)) {\n that.push = options.push;\n }\n\n if (!that.push) {\n that.push = identity;\n }\n\n that.parameterMap = isFunction(parameterMap) ? parameterMap : function(options) {\n var result = {};\n\n each(options, function(option, value) {\n if (option in parameterMap) {\n option = parameterMap[option];\n if (isPlainObject(option)) {\n value = option.value(value);\n option = option.key;\n }\n }\n\n result[option] = value;\n });\n\n return result;\n };\n },\n\n options: {\n parameterMap: identity\n },\n\n create: function(options) {\n return ajax(this.setup(options, CREATE));\n },\n\n read: function(options) {\n var that = this,\n success,\n error,\n result,\n cache = that.cache;\n\n options = that.setup(options, READ);\n\n success = options.success || noop;\n error = options.error || noop;\n\n result = cache.find(options.data);\n\n if (result !== undefined) {\n success(result);\n } else {\n options.success = function(result) {\n cache.add(options.data, result);\n\n success(result);\n };\n\n $.ajax(options);\n }\n },\n\n update: function(options) {\n return ajax(this.setup(options, UPDATE));\n },\n\n destroy: function(options) {\n return ajax(this.setup(options, DESTROY));\n },\n\n setup: function(options, type) {\n options = options || {};\n\n var that = this,\n parameters,\n operation = that.options[type],\n data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n\n options = extend(true, {}, operation, options);\n parameters = extend(true, {}, data, options.data);\n\n options.data = that.parameterMap(parameters, type);\n\n if (isFunction(options.url)) {\n options.url = options.url(parameters);\n }\n\n return options;\n }\n });\n\n var Cache = Class.extend({\n init: function() {\n this._store = {};\n },\n add: function(key, data) {\n if (key !== undefined) {\n this._store[stringify(key)] = data;\n }\n },\n find: function(key) {\n return this._store[stringify(key)];\n },\n clear: function() {\n this._store = {};\n },\n remove: function(key) {\n delete this._store[stringify(key)];\n }\n });\n\n Cache.create = function(options) {\n var store = {\n \"inmemory\": function() { return new Cache(); }\n };\n\n if (isPlainObject(options) && isFunction(options.find)) {\n return options;\n }\n\n if (options === true) {\n return new Cache();\n }\n\n return store[options]();\n };\n\n function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record,\n getter,\n originalName,\n idx,\n setters = {},\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n originalName = fieldNames[getter];\n\n if (originalName && originalName !== getter) {\n if (!setters[originalName]) {\n setters[originalName] = kendo.setter(originalName);\n }\n setters[originalName](record, getters[getter](record));\n delete record[getter];\n }\n }\n }\n }\n\n function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record,\n getter,\n originalName,\n idx,\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n record[getter] = modelInstance._parse(getter, getters[getter](record));\n\n originalName = fieldNames[getter];\n if (originalName && originalName !== getter) {\n delete record[originalName];\n }\n }\n }\n }\n\n function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record,\n idx,\n fieldName,\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n\n fieldName = originalFieldNames[record.field];\n if (fieldName && fieldName != record.field) {\n record.field = fieldName;\n }\n\n record.value = modelInstance._parse(record.field, record.value);\n\n if (record.items) {\n if (record.hasSubgroups) {\n convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n } else {\n convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n }\n }\n }\n }\n\n function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n return function(data) {\n data = originalFunction(data);\n\n return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\n };\n }\n\n function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\n return function(data) {\n\n if (data && !isEmptyObject(getters)) {\n if (toString.call(data) !== \"[object Array]\" && !(data instanceof ObservableArray)) {\n data = [data];\n }\n\n converter(data, getters, new model(), originalFieldNames, fieldNames);\n }\n\n return data || [];\n };\n }\n\n var DataReader = Class.extend({\n init: function(schema) {\n var that = this, member, get, model, base;\n\n schema = schema || {};\n\n for (member in schema) {\n get = schema[member];\n\n that[member] = typeof get === STRING ? getter(get) : get;\n }\n\n base = schema.modelBase || Model;\n\n if (isPlainObject(that.model)) {\n that.model = model = base.define(that.model);\n }\n\n var dataFunction = that.data.bind(that);\n\n that._dataAccessFunction = dataFunction;\n\n if (that.model) {\n var groupsFunction = that.groups.bind(that),\n serializeFunction = that.serialize.bind(that),\n originalFieldNames = {},\n getters = {},\n serializeGetters = {},\n fieldNames = {},\n shouldSerialize = false,\n fieldName,\n name;\n\n model = that.model;\n\n if (model.fields) {\n each(model.fields, function(field, value) {\n var fromName;\n\n fieldName = field;\n\n if (isPlainObject(value) && value.field) {\n fieldName = value.field;\n } else if (typeof value === STRING) {\n fieldName = value;\n }\n\n if (isPlainObject(value) && value.from) {\n fromName = value.from;\n }\n\n shouldSerialize = shouldSerialize || (fromName && fromName !== field) || fieldName !== field;\n name = fromName || fieldName;\n getters[field] = name.indexOf(\".\") !== -1 ? getter(name, true) : getter(name);\n serializeGetters[field] = getter(field);\n originalFieldNames[fromName || fieldName] = field;\n fieldNames[field] = fromName || fieldName;\n });\n\n if (!schema.serialize && shouldSerialize) {\n that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n }\n }\n\n that._dataAccessFunction = dataFunction;\n that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\n that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n }\n },\n errors: function(data) {\n return data ? data.errors : null;\n },\n parse: identity,\n data: identity,\n total: function(data) {\n return data.length;\n },\n groups: identity,\n aggregates: function() {\n return {};\n },\n serialize: function(data) {\n return data;\n }\n });\n\n function fillLastGroup(originalGroup, newGroup) {\n var currOriginal;\n var currentNew;\n\n if (newGroup.items && newGroup.items.length) {\n for (var i = 0; i < newGroup.items.length; i++) {\n currOriginal = originalGroup.items[originalGroup.items.length - 1];\n currentNew = newGroup.items[i];\n if (currOriginal && currentNew) {\n if (currOriginal.hasSubgroups && currOriginal.value == currentNew.value) {\n fillLastGroup(currOriginal, currentNew);\n } else if (currOriginal.field && currOriginal.value == currentNew.value) {\n currOriginal.items.omitChangeEvent = true;\n currOriginal.items.push.apply(currOriginal.items, currentNew.items);\n currOriginal.items.omitChangeEvent = false;\n } else {\n originalGroup.items.omitChangeEvent = true;\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n originalGroup.items.omitChangeEvent = false;\n }\n } else if (currentNew) {\n originalGroup.items.omitChangeEvent = true;\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n originalGroup.items.omitChangeEvent = false;\n }\n }\n }\n }\n function mergeGroups(target, dest, skip, take) {\n var group,\n idx = 0,\n items;\n\n while (dest.length && take) {\n group = dest[idx];\n items = group.items;\n\n var length = items.length;\n\n if (target && target.field === group.field && target.value === group.value) {\n if (target.hasSubgroups && target.items.length) {\n mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n } else {\n items = items.slice(skip, skip + take);\n target.items = target.items.concat(items);\n }\n dest.splice(idx--, 1);\n } else if (group.hasSubgroups && items.length) {\n mergeGroups(group, items, skip, take);\n if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n } else {\n items = items.slice(skip, skip + take);\n group.items = items;\n\n if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n }\n\n if (items.length === 0) {\n skip -= length;\n } else {\n skip = 0;\n take -= items.length;\n }\n\n if (++idx >= dest.length) {\n break;\n }\n }\n\n if (idx < dest.length) {\n dest.splice(idx, dest.length - idx);\n }\n }\n\n function flatGroups(groups, indexFunction) {\n var result = [];\n var groupsLength = (groups || []).length;\n var group;\n var items;\n var indexFn = isFunction(indexFunction) ? indexFunction : function(array, index) {\n return array[index];\n };\n\n for (var groupIndex = 0; groupIndex < groupsLength; groupIndex++) {\n group = indexFn(groups, groupIndex);\n\n if (group.hasSubgroups) {\n result = result.concat(flatGroups(group.items));\n } else {\n items = group.items;\n\n for (var itemIndex = 0; itemIndex < items.length; itemIndex++) {\n result.push(indexFn(items, itemIndex));\n }\n }\n }\n return result;\n }\n\n function flattenGroups(data) {\n var idx,\n result = [],\n length,\n items,\n itemIndex;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n var group = data.at(idx);\n if (group.items) {\n if (group.hasSubgroups) {\n result = result.concat(flattenGroups(group.items));\n } else {\n items = group.items;\n for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n result.push(items.at(itemIndex));\n }\n }\n }\n }\n return result;\n }\n\n function wrapGroupItems(data, model) {\n var idx, length, group;\n if (model) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n group = data.at(idx);\n if (group.items) {\n if (group.hasSubgroups) {\n wrapGroupItems(group.items, model);\n } else {\n group.items = new LazyObservableArray(group.items, model, group.items._events);\n }\n }\n }\n }\n }\n\n function eachGroupItems(data, func) {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx].hasSubgroups) {\n if (eachGroupItems(data[idx].items, func)) {\n return true;\n }\n } else if (func(data[idx].items, data[idx])) {\n return true;\n }\n }\n }\n\n function replaceInRanges(ranges, data, item, observable) {\n for (var idx = 0; idx < ranges.length; idx++) {\n if (ranges[idx].data === data) {\n break;\n }\n if (replaceInRange(ranges[idx].data, item, observable)) {\n break;\n }\n }\n }\n\n function replaceInRange(items, item, observable) {\n for (var idx = 0, length = items.length; idx < length; idx++) {\n if (items[idx] && items[idx].hasSubgroups) {\n return replaceInRange(items[idx].items, item, observable);\n } else if (items[idx] === item || items[idx] === observable) {\n items[idx] = observable;\n return true;\n }\n }\n }\n\n function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n var item = view[viewIndex];\n\n if (!item || item instanceof type) {\n continue;\n }\n\n if (item.hasSubgroups !== undefined && !serverGrouping) {\n replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n } else {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx] === item) {\n view[viewIndex] = data.at(idx);\n replaceInRanges(ranges, data, item, view[viewIndex]);\n break;\n }\n }\n }\n }\n }\n\n function removeModel(data, model) {\n if (!data) {\n return;\n }\n var length = data.length;\n var dataItem;\n var idx;\n\n for (idx = 0; idx < length; idx++) {\n dataItem = data[idx];\n\n if (dataItem.uid && dataItem.uid == model.uid) {\n data.splice(idx, 1);\n return dataItem;\n }\n }\n }\n\n function indexOfPristineModel(data, model) {\n if (model) {\n return indexOf(data, function(item) {\n return (item.uid && item.uid == model.uid) || (item[model.idField] === model.id && model.id !== model._defaultId);\n });\n }\n return -1;\n }\n\n function indexOfModel(data, model) {\n if (model) {\n return indexOf(data, function(item) {\n return item.uid == model.uid;\n });\n }\n return -1;\n }\n\n function indexOf(data, comparer) {\n var idx, length;\n if (!data) {\n return;\n }\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (comparer(data[idx])) {\n return idx;\n }\n }\n\n return -1;\n }\n\n function fieldNameFromModel(fields, name) {\n if (fields && !isEmptyObject(fields)) {\n var descriptor = fields[name];\n var fieldName;\n if (isPlainObject(descriptor)) {\n fieldName = descriptor.from || descriptor.field || name;\n } else {\n fieldName = fields[name] || name;\n }\n\n if (isFunction(fieldName)) {\n return name;\n }\n\n return fieldName;\n }\n return name;\n }\n\n function convertFilterDescriptorsField(descriptor, model) {\n var idx,\n length,\n target = {};\n\n for (var field in descriptor) {\n if (field !== \"filters\") {\n target[field] = descriptor[field];\n }\n }\n\n if (descriptor.filters) {\n target.filters = [];\n for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n }\n } else {\n target.field = fieldNameFromModel(model.fields, target.field);\n }\n return target;\n }\n\n function convertDescriptorsField(descriptors, model) {\n var idx,\n length,\n result = [],\n target,\n descriptor;\n\n for (idx = 0, length = descriptors.length; idx < length; idx ++) {\n target = {};\n\n descriptor = descriptors[idx];\n\n for (var field in descriptor) {\n target[field] = descriptor[field];\n }\n\n target.field = fieldNameFromModel(model.fields, target.field);\n\n if (target.aggregates && isArray(target.aggregates)) {\n target.aggregates = convertDescriptorsField(target.aggregates, model);\n }\n result.push(target);\n }\n return result;\n }\n\n var DataSource = Observable.extend({\n init: function(options) {\n var that = this, model, data;\n\n if (options) {\n data = options.data;\n }\n\n options = that.options = extend({}, that.options, options);\n\n that._map = {};\n that._prefetch = {};\n that._data = [];\n that._pristineData = [];\n that._ranges = [];\n that._view = [];\n that._pristineTotal = 0;\n that._destroyed = [];\n that._pageSize = options.pageSize;\n that._page = options.page || (options.pageSize ? 1 : undefined);\n that._sort = normalizeSort(options.sort);\n that._sortFields = sortFields(options.sort);\n that._filter = normalizeFilter(options.filter);\n that._group = normalizeGroup(options.group);\n that._aggregate = options.aggregate;\n that._total = options.total;\n that._groupPaging = options.groupPaging;\n\n if (that._groupPaging) {\n that._groupsState = {};\n }\n that._shouldDetachObservableParents = true;\n\n Observable.fn.init.call(that);\n\n that.transport = Transport.create(options, data, that);\n\n if (isFunction(that.transport.push)) {\n that.transport.push({\n pushCreate: that._pushCreate.bind(that),\n pushUpdate: that._pushUpdate.bind(that),\n pushDestroy: that._pushDestroy.bind(that)\n });\n }\n\n if (options.offlineStorage != null) {\n if (typeof options.offlineStorage == \"string\") {\n var key = options.offlineStorage;\n\n that._storage = {\n getItem: function() {\n return JSON.parse(localStorage.getItem(key));\n },\n setItem: function(item) {\n localStorage.setItem(key, stringify(that.reader.serialize(item)));\n }\n };\n } else {\n that._storage = options.offlineStorage;\n }\n }\n\n that.reader = new kendo.data.readers[options.schema.type || \"json\" ](options.schema);\n\n model = that.reader.model || {};\n\n that._detachObservableParents();\n\n that._data = that._observe(that._data);\n that._online = true;\n\n that.bind([\"push\", ERROR, CHANGE, REQUESTSTART, SYNC, REQUESTEND, PROGRESS], options);\n },\n\n options: {\n data: null,\n schema: {\n modelBase: Model\n },\n offlineStorage: null,\n serverSorting: false,\n serverPaging: false,\n serverFiltering: false,\n serverGrouping: false,\n serverAggregates: false,\n batch: false,\n inPlaceSort: false\n },\n\n clone: function() {\n return this;\n },\n\n online: function(value) {\n if (value !== undefined) {\n if (this._online != value) {\n this._online = value;\n\n if (value) {\n return this.sync();\n }\n }\n\n return $.Deferred().resolve().promise();\n } else {\n return this._online;\n }\n },\n\n offlineData: function(state) {\n if (this.options.offlineStorage == null) {\n return null;\n }\n\n if (state !== undefined) {\n return this._storage.setItem(state);\n }\n\n return this._storage.getItem() || [];\n },\n\n _isServerGrouped: function() {\n var group = this.group() || [];\n\n return this.options.serverGrouping && group.length;\n },\n\n _isServerGroupPaged: function() {\n return this._isServerGrouped() && this._groupPaging;\n },\n\n _isGroupPaged: function() {\n var group = this._group || [];\n\n return this._groupPaging && group.length;\n },\n\n _pushCreate: function(result) {\n this._push(result, \"pushCreate\");\n },\n\n _pushUpdate: function(result) {\n this._push(result, \"pushUpdate\");\n },\n\n _pushDestroy: function(result) {\n this._push(result, \"pushDestroy\");\n },\n\n _push: function(result, operation) {\n var data = this._readData(result);\n\n if (!data) {\n data = result;\n }\n\n this[operation](data);\n },\n\n _flatData: function(data, skip) {\n if (data) {\n if (this._isServerGrouped()) {\n return flattenGroups(data);\n }\n\n if (!skip) {\n for (var idx = 0; idx < data.length; idx++) {\n data.at(idx);\n }\n }\n }\n\n return data;\n },\n\n parent: noop,\n\n get: function(id) {\n var idx, length, data = this._flatData(this._data, this.options.useRanges);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].id == id) {\n return data[idx];\n }\n }\n },\n\n getByUid: function(id) {\n return this._getByUid(id, this._data);\n },\n\n _getByUid: function(id, dataItems) {\n var idx, length, data = this._flatData(dataItems, this.options.useRanges);\n\n if (!data) {\n return;\n }\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].uid == id) {\n return data[idx];\n }\n }\n },\n\n indexOf: function(model) {\n return indexOfModel(this._data, model);\n },\n\n at: function(index) {\n return this._data.at(index);\n },\n\n data: function(value) {\n var that = this;\n if (value !== undefined) {\n that._detachObservableParents();\n that._data = this._observe(value);\n\n that._pristineData = value.slice(0);\n\n that._storeData();\n\n that._ranges = [];\n that.trigger(\"reset\");\n that._addRange(that._data);\n\n that._total = that._data.length;\n that._pristineTotal = that._total;\n\n that._process(that._data);\n } else {\n if (that._data) {\n for (var idx = 0; idx < that._data.length; idx++) {\n that._data.at(idx);\n }\n }\n\n return that._data;\n }\n },\n\n view: function(value) {\n if (value === undefined) {\n return this._view;\n } else {\n this._view = this._observeView(value);\n }\n },\n\n _observeView: function(data) {\n var that = this;\n replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n\n var view = new LazyObservableArray(data, that.reader.model);\n view.parent = function() { return that.parent(); };\n return view;\n },\n\n flatView: function() {\n var groups = this.group() || [];\n\n if (groups.length) {\n return flattenGroups(this._view);\n } else {\n return this._view;\n }\n },\n\n add: function(model) {\n return this.insert(this._data.length, model);\n },\n\n _createNewModel: function(model) {\n if (this.reader.model) {\n return new this.reader.model(model);\n }\n\n if (model instanceof ObservableObject) {\n return model;\n }\n\n return new ObservableObject(model);\n },\n\n insert: function(index, model) {\n if (!model) {\n model = index;\n index = 0;\n }\n\n if (!(model instanceof Model)) {\n model = this._createNewModel(model);\n }\n\n if (this._isServerGrouped()) {\n this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n } else {\n this._data.splice(index, 0, model);\n }\n\n this._insertModelInRange(index, model);\n\n return model;\n },\n\n pushInsert: function(index, items) {\n var that = this;\n var rangeSpan = that._getCurrentRangeSpan();\n\n if (!items) {\n items = index;\n index = 0;\n }\n\n if (!isArray(items)) {\n items = [items];\n }\n\n var pushed = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n\n try {\n for (var idx = 0; idx < items.length; idx ++) {\n var item = items[idx];\n\n var result = this.insert(index, item);\n\n pushed.push(result);\n\n var pristine = result.toJSON();\n\n if (this._isServerGrouped()) {\n pristine = this._wrapInEmptyGroup(pristine);\n }\n\n this._pristineData.push(pristine);\n\n if (rangeSpan && rangeSpan.length) {\n $(rangeSpan).last()[0].pristineData.push(pristine);\n }\n\n index++;\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"create\",\n items: pushed\n });\n }\n },\n\n pushCreate: function(items) {\n this.pushInsert(this._data.length, items);\n },\n\n pushUpdate: function(items) {\n if (!isArray(items)) {\n items = [items];\n }\n\n var pushed = [];\n\n for (var idx = 0; idx < items.length; idx ++) {\n var item = items[idx];\n var model = this._createNewModel(item);\n\n var target = this.get(model.id);\n\n if (target) {\n pushed.push(target);\n\n target.accept(item);\n\n target.trigger(CHANGE);\n\n this._updatePristineForModel(target, item);\n } else {\n this.pushCreate(item);\n }\n }\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"update\",\n items: pushed\n });\n }\n },\n\n pushDestroy: function(items) {\n var pushed = this._removeItems(items);\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"destroy\",\n items: pushed\n });\n }\n },\n\n _removeItems: function(items, removePristine) {\n if (!isArray(items)) {\n items = [items];\n }\n\n var shouldRemovePristine = typeof removePristine !== \"undefined\" ? removePristine : true;\n\n var destroyed = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n try {\n for (var idx = 0; idx < items.length; idx ++) {\n var item = items[idx];\n var model = this._createNewModel(item);\n var found = false;\n\n this._eachItem(this._data, function(items) {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items.at(idx);\n if (item.id === model.id) {\n destroyed.push(item);\n items.splice(idx, 1);\n found = true;\n break;\n }\n }\n });\n\n if (found && shouldRemovePristine) {\n this._removePristineForModel(model);\n this._destroyed.pop();\n }\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n\n return destroyed;\n },\n\n pushMove: function(index, items) {\n var pushed = this._moveItems(index, items);\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"update\",\n items: pushed\n });\n }\n },\n\n _moveItems: function(index, items) {\n if (!isArray(items)) {\n items = [items];\n }\n\n var moved = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n\n try {\n for (var i = 0; i < items.length; i ++) {\n var item = items[i];\n var model = this._createNewModel(item);\n\n this._eachItem(this._data, function(dataItems) {\n for (var idx = 0; idx < dataItems.length; idx++) {\n var dataItem = dataItems.at(idx);\n if (dataItem.id === model.id) {\n moved.push(dataItem);\n dataItems.splice(index >= idx ? --index : index, 0, dataItems.splice(idx, 1)[0]);\n index++;\n break;\n }\n }\n });\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n\n return moved;\n },\n\n remove: function(model) {\n var result,\n that = this,\n hasGroups = that._isServerGrouped();\n\n if (hasGroups && model.uid && (!model.isNew || !model.isNew())) {\n that._pushInDestroyed(model);\n }\n\n this._eachItem(that._data, function(items) {\n result = removeModel(items, model);\n\n if (result && hasGroups) {\n return true;\n }\n });\n\n this._removeModelFromRanges(model);\n\n return model;\n },\n\n destroyed: function() {\n return this._destroyed;\n },\n\n created: function() {\n var idx,\n length,\n result = [],\n data = this._flatData(this._data, this.options.useRanges);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].isNew && data[idx].isNew()) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n\n updated: function() {\n var idx,\n length,\n result = [],\n data = this._flatData(this._data, this.options.useRanges);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if ((data[idx].isNew && !data[idx].isNew()) && data[idx].dirty) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n\n sync: function() {\n var that = this,\n created = [],\n updated = [],\n destroyed = that._destroyed;\n\n var promise = $.Deferred().resolve().promise();\n\n if (that.online()) {\n\n if (!that.reader.model) {\n return promise;\n }\n\n created = that.created();\n updated = that.updated();\n\n var promises = [];\n\n if (that.options.batch && that.transport.submit) {\n promises = that._sendSubmit(created, updated, destroyed);\n } else {\n promises.push.apply(promises, that._send(\"create\", created));\n promises.push.apply(promises, that._send(\"update\", updated));\n promises.push.apply(promises, that._send(\"destroy\", destroyed));\n }\n\n promise = $.when\n .apply(null, promises)\n .then(function() {\n var idx, length;\n\n for (idx = 0, length = arguments.length; idx < length; idx++) {\n if (arguments[idx]) {\n that._accept(arguments[idx]);\n }\n }\n\n that._storeData(true);\n\n that._syncEnd();\n\n that._change({ action: \"sync\" });\n\n that.trigger(SYNC);\n\n if (that._isServerGroupPaged()) {\n that.read();\n }\n });\n } else {\n that._storeData(true);\n\n that._syncEnd();\n\n that._change({ action: \"sync\" });\n }\n\n return promise;\n },\n\n _syncEnd: noop,\n\n cancelChanges: function(model) {\n var that = this;\n\n if (model instanceof kendo.data.Model) {\n that._cancelModel(model);\n } else {\n that._destroyed = [];\n that._detachObservableParents();\n that._data = that._observe(that._pristineData);\n if (that.options.serverPaging) {\n that._total = that._pristineTotal;\n }\n\n that._ranges = [];\n that._addRange(that._data, 0);\n\n that._changesCanceled();\n\n that._change();\n\n that._markOfflineUpdatesAsDirty();\n\n if (that._isServerGrouped()) {\n that.read();\n }\n }\n },\n\n _changesCanceled: noop,\n\n _markOfflineUpdatesAsDirty: function() {\n var that = this;\n\n if (that.options.offlineStorage != null) {\n that._eachItem(that._data, function(items) {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items.at(idx);\n if (item.__state__ == \"update\" || item.__state__ == \"create\") {\n item.dirty = true;\n }\n }\n });\n }\n },\n\n hasChanges: function() {\n var idx,\n length,\n data = this._flatData(this._data, this.options.useRanges);\n\n if (this._destroyed.length) {\n return true;\n }\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if ((data[idx].isNew && data[idx].isNew()) || data[idx].dirty) {\n return true;\n }\n }\n\n return false;\n },\n\n _accept: function(result) {\n var that = this,\n models = result.models,\n response = result.response,\n idx = 0,\n serverGroup = that._isServerGrouped(),\n pristine = that._pristineData,\n type = result.type,\n length;\n\n that.trigger(REQUESTEND, { response: response, type: type });\n\n if (response && !isEmptyObject(response)) {\n response = that.reader.parse(response);\n\n if (that._handleCustomErrors(response)) {\n return;\n }\n\n response = that.reader.data(response);\n\n if (!isArray(response)) {\n response = [response];\n }\n } else {\n response = $.map(models, function(model) { return model.toJSON(); } );\n }\n\n if (type === \"destroy\") {\n that._destroyed = [];\n }\n\n for (idx = 0, length = models.length; idx < length; idx++) {\n if (type !== \"destroy\") {\n models[idx].accept(response[idx]);\n\n if (type === \"create\") {\n pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\n } else if (type === \"update\") {\n that._updatePristineForModel(models[idx], response[idx]);\n }\n } else {\n that._removePristineForModel(models[idx]);\n }\n }\n },\n\n _updatePristineForModel: function(model, values) {\n this._executeOnPristineForModel(model, function(index, items) {\n kendo.deepExtend(items[index], values);\n });\n },\n\n _executeOnPristineForModel: function(model, callback) {\n this._eachPristineItem(\n function(items) {\n var index = indexOfPristineModel(items, model);\n if (index > -1) {\n callback(index, items);\n return true;\n }\n });\n },\n\n _removePristineForModel: function(model) {\n this._executeOnPristineForModel(model, function(index, items) {\n items.splice(index, 1);\n });\n },\n\n _readData: function(data) {\n var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n return read.call(this.reader, data);\n },\n\n _eachPristineItem: function(callback) {\n var that = this;\n var options = that.options;\n var rangeSpan = that._getCurrentRangeSpan();\n\n that._eachItem(that._pristineData, callback);\n\n if (options.serverPaging && options.useRanges) {\n each(rangeSpan, function(i, range) {\n that._eachItem(range.pristineData, callback);\n });\n }\n },\n\n _eachItem: function(data, callback) {\n if (data && data.length) {\n if (this._isServerGrouped()) {\n eachGroupItems(data, callback);\n } else {\n callback(data);\n }\n }\n },\n\n _pristineForModel: function(model) {\n var pristine,\n idx,\n callback = function(items) {\n idx = indexOfPristineModel(items, model);\n if (idx > -1) {\n pristine = items[idx];\n return true;\n }\n };\n\n this._eachPristineItem(callback);\n\n return pristine;\n },\n\n _cancelModel: function(model) {\n var that = this;\n var pristine = this._pristineForModel(model);\n\n this._eachItem(this._data, function(items) {\n var idx = indexOfModel(items, model);\n if (idx >= 0) {\n if (pristine && (!model.isNew() || pristine.__state__)) {\n items[idx].accept(pristine);\n\n if (pristine.__state__ == \"update\") {\n items[idx].dirty = true;\n }\n\n } else {\n that._modelCanceled(model);\n\n items.splice(idx, 1);\n\n that._removeModelFromRanges(model);\n }\n }\n });\n },\n\n _modelCanceled: noop,\n\n _submit: function(promises, data) {\n var that = this;\n\n that.trigger(REQUESTSTART, { type: \"submit\" });\n\n that.trigger(PROGRESS);\n\n that.transport.submit(extend({\n success: function(response, type) {\n var promise = $.grep(promises, function(x) {\n return x.type == type;\n })[0];\n\n if (promise) {\n promise.resolve({\n response: response,\n models: promise.models,\n type: type\n });\n }\n },\n error: function(response, status, error) {\n for (var idx = 0; idx < promises.length; idx++) {\n promises[idx].reject(response);\n }\n\n that.error(response, status, error);\n }\n }, data));\n },\n\n _sendSubmit: function(created, updated, destroyed) {\n var that = this,\n promises = [];\n\n if (that.options.batch) {\n if (created.length) {\n promises.push($.Deferred(function(deferred) {\n deferred.type = \"create\";\n deferred.models = created;\n }));\n }\n\n if (updated.length) {\n promises.push($.Deferred(function(deferred) {\n deferred.type = \"update\";\n deferred.models = updated;\n }));\n }\n\n if (destroyed.length) {\n promises.push($.Deferred(function(deferred) {\n deferred.type = \"destroy\";\n deferred.models = destroyed;\n }));\n }\n\n that._submit(promises, {\n data: {\n created: that.reader.serialize(toJSON(created)),\n updated: that.reader.serialize(toJSON(updated)),\n destroyed: that.reader.serialize(toJSON(destroyed))\n }\n });\n }\n\n return promises;\n },\n\n _promise: function(data, models, type) {\n var that = this;\n\n return $.Deferred(function(deferred) {\n that.trigger(REQUESTSTART, { type: type });\n\n that.trigger(PROGRESS);\n\n that.transport[type].call(that.transport, extend({\n success: function(response) {\n deferred.resolve({\n response: response,\n models: models,\n type: type\n });\n },\n error: function(response, status, error) {\n deferred.reject(response);\n that.error(response, status, error);\n }\n }, data));\n }).promise();\n },\n\n _send: function(method, data) {\n var that = this,\n idx,\n length,\n promises = [],\n converted = that.reader.serialize(toJSON(data));\n\n if (that.options.batch) {\n if (data.length) {\n promises.push(that._promise( { data: { models: converted } }, data , method));\n }\n } else {\n for (idx = 0, length = data.length; idx < length; idx++) {\n promises.push(that._promise( { data: converted[idx] }, [ data[idx] ], method));\n }\n }\n\n return promises;\n },\n\n read: function(data) {\n var that = this, params = that._params(data);\n var deferred = $.Deferred();\n\n that._queueRequest(params, function() {\n var isPrevented = that.trigger(REQUESTSTART, { type: \"read\" });\n if (!isPrevented) {\n that.trigger(PROGRESS);\n\n that._ranges = [];\n that.trigger(\"reset\");\n if (that.online()) {\n that.transport.read({\n data: params,\n success: function(data) {\n that._ranges = [];\n that.success(data, params);\n\n deferred.resolve();\n },\n error: function() {\n var args = slice.call(arguments);\n\n that.error.apply(that, args);\n\n deferred.reject.apply(deferred, args);\n }\n });\n } else if (that.options.offlineStorage != null) {\n that.success(that.offlineData(), params);\n\n deferred.resolve();\n }\n } else {\n that._dequeueRequest();\n\n deferred.resolve(isPrevented);\n }\n });\n\n return deferred.promise();\n },\n\n _readAggregates: function(data) {\n return this.reader.aggregates(data);\n },\n\n success: function(data) {\n var that = this,\n options = that.options,\n items,\n replaceSubset;\n\n that.trigger(REQUESTEND, { response: data, type: \"read\" });\n\n if (that.online()) {\n data = that.reader.parse(data);\n\n if (that._handleCustomErrors(data)) {\n that._dequeueRequest();\n return;\n }\n\n that._total = that.reader.total(data);\n\n if (that._isServerGroupPaged()) {\n that._serverGroupsTotal = that._total;\n }\n\n if (that._pageSize > that._total) {\n that._pageSize = that._total;\n if (that.options.pageSize && that.options.pageSize > that._pageSize) {\n that._pageSize = that.options.pageSize;\n }\n }\n\n if (that._aggregate && options.serverAggregates) {\n that._aggregateResult = that._readAggregates(data);\n }\n\n data = that._readData(data);\n\n that._destroyed = [];\n } else {\n data = that._readData(data);\n\n items = [];\n var itemIds = {};\n var model = that.reader.model;\n var idField = model ? model.idField : \"id\";\n var idx;\n\n for (idx = 0; idx < this._destroyed.length; idx++) {\n var id = this._destroyed[idx][idField];\n itemIds[id] = id;\n }\n\n for (idx = 0; idx < data.length; idx++) {\n var item = data[idx];\n var state = item.__state__;\n if (state == \"destroy\") {\n if (!itemIds[item[idField]]) {\n this._pushInDestroyed(this._createNewModel(item));\n }\n } else {\n items.push(item);\n }\n }\n\n data = items;\n\n that._total = data.length;\n }\n\n that._pristineTotal = that._total;\n replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\n\n if (that.options.endless) {\n if (replaceSubset) {\n that._pristineData.splice(that._skip, that._pristineData.length);\n }\n items = data.slice(0);\n for (var j = 0; j < items.length; j++) {\n that._pristineData.push(items[j]);\n }\n } else {\n that._pristineData = data.slice(0);\n }\n\n that._detachObservableParents();\n\n if (that.options.endless) {\n that._data.unbind(CHANGE, that._changeHandler);\n\n if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\n fillLastGroup(that._data[that._data.length - 1], data[0]);\n data.shift();\n }\n\n data = that._observe(data);\n if (replaceSubset) {\n that._data.splice(that._skip, that._data.length);\n }\n for (var i = 0; i < data.length; i++) {\n that._data.push(data[i]);\n }\n that._data.bind(CHANGE, that._changeHandler);\n } else {\n that._data = that._observe(data);\n }\n\n that._markOfflineUpdatesAsDirty();\n\n that._storeData();\n\n that._addRange(that._data);\n\n that._process(that._data);\n\n that._dequeueRequest();\n },\n\n _detachObservableParents: function() {\n if (this._data && this._shouldDetachObservableParents) {\n for (var idx = 0; idx < this._data.length; idx++) {\n if (this._data[idx].parent) {\n this._data[idx].parent = noop;\n }\n }\n }\n },\n\n _storeData: function(updatePristine) {\n var serverGrouping = this._isServerGrouped();\n var model = this.reader.model;\n\n function items(data) {\n var state = [];\n\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data.at(idx);\n var item = dataItem.toJSON();\n\n if (serverGrouping && dataItem.items) {\n item.items = items(dataItem.items);\n } else {\n item.uid = dataItem.uid;\n\n if (model) {\n if (dataItem.isNew()) {\n item.__state__ = \"create\";\n } else if (dataItem.dirty) {\n item.__state__ = \"update\";\n }\n }\n }\n state.push(item);\n }\n\n return state;\n }\n\n if (this.options.offlineStorage != null) {\n var state = items(this._data);\n\n var destroyed = [];\n\n for (var idx = 0; idx < this._destroyed.length; idx++) {\n var item = this._destroyed[idx].toJSON();\n item.__state__ = \"destroy\";\n destroyed.push(item);\n }\n\n this.offlineData(state.concat(destroyed));\n\n if (updatePristine) {\n this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\n }\n }\n },\n\n _addRange: function(data, skip) {\n var that = this,\n start = typeof (skip) !== \"undefined\" ? skip : (that._skip || 0),\n end,\n range = {\n data: data,\n pristineData: data.toJSON(),\n timestamp: that._timeStamp()\n };\n\n if (this._isGroupPaged()) {\n end = start + data.length;\n range.outerStart = start;\n range.outerEnd = end;\n } else {\n end = start + that._flatData(data, true).length;\n }\n\n range.start = start;\n range.end = end;\n that._ranges.push(range);\n that._sortRanges();\n\n if (that._isGroupPaged()) {\n if (!that._groupsFlat) {\n that._groupsFlat = [];\n }\n that._appendToGroupsFlat(range.data);\n that._updateOuterRangesLength();\n }\n },\n\n _appendToGroupsFlat: function(data) {\n var length = data.length;\n\n for (var i = 0; i < length; i++) {\n this._groupsFlat.push(data[i]);\n }\n },\n\n _getGroupByUid: function(uid) {\n var length = this._groupsFlat.length;\n var group;\n\n for (var i = 0; i < length; i++) {\n group = this._groupsFlat[i];\n if (group.uid === uid) {\n return group;\n }\n }\n },\n\n _sortRanges: function() {\n this._ranges.sort(function(x, y) {\n return x.start - y.start;\n });\n },\n\n error: function(xhr, status, errorThrown) {\n this._dequeueRequest();\n this.trigger(REQUESTEND, { });\n this.trigger(ERROR, { xhr: xhr, status: status, errorThrown: errorThrown });\n },\n\n _params: function(data) {\n var that = this,\n options = extend({\n take: that.take(),\n skip: that.skip(),\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate,\n groupPaging: !!that._groupPaging\n }, data);\n\n if (!that.options.serverPaging) {\n delete options.take;\n delete options.skip;\n delete options.page;\n delete options.pageSize;\n }\n\n if (!that.options.serverGrouping) {\n delete options.group;\n } else if (that.reader.model && options.group) {\n options.group = convertDescriptorsField(options.group, that.reader.model);\n }\n\n if (!that.options.serverFiltering) {\n delete options.filter;\n } else if (that.reader.model && options.filter) {\n options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n }\n\n if (!that.options.serverSorting) {\n delete options.sort;\n } else if (that.reader.model && options.sort) {\n options.sort = convertDescriptorsField(options.sort, that.reader.model);\n }\n\n if (!that.options.serverAggregates) {\n delete options.aggregate;\n } else if (that.reader.model && options.aggregate) {\n options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n }\n\n if (!that.options.groupPaging) {\n delete options.groupPaging;\n }\n\n return options;\n },\n\n _queueRequest: function(options, callback) {\n var that = this;\n if (!that._requestInProgress) {\n that._requestInProgress = true;\n that._pending = undefined;\n callback();\n } else {\n that._pending = { callback: callback.bind(that), options: options };\n }\n },\n\n _dequeueRequest: function() {\n var that = this;\n that._requestInProgress = false;\n if (that._pending) {\n that._queueRequest(that._pending.options, that._pending.callback);\n }\n },\n\n _handleCustomErrors: function(response) {\n if (this.reader.errors) {\n var errors = this.reader.errors(response);\n if (errors) {\n this.trigger(ERROR, { xhr: null, status: \"customerror\", errorThrown: \"custom error\", errors: errors });\n return true;\n }\n }\n return false;\n },\n\n _shouldWrap: function(data) {\n var model = this.reader.model;\n\n if (model && data.length) {\n return !(data[0] instanceof model);\n }\n\n return false;\n },\n\n _observe: function(data) {\n var that = this,\n model = that.reader.model;\n\n that._shouldDetachObservableParents = true;\n\n if (data instanceof ObservableArray) {\n that._shouldDetachObservableParents = false;\n if (that._shouldWrap(data)) {\n data.type = that.reader.model;\n data.wrapAll(data, data);\n }\n } else {\n var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n data = new arrayType(data, that.reader.model);\n data.parent = function() { return that.parent(); };\n }\n\n if (that._isServerGrouped()) {\n wrapGroupItems(data, model);\n }\n\n if (that._changeHandler && that._data && that._data instanceof ObservableArray &&\n !(that.options.useRanges && that.options.serverPaging)) {\n that._data.unbind(CHANGE, that._changeHandler);\n } else {\n that._changeHandler = that._change.bind(that);\n }\n\n return data.bind(CHANGE, that._changeHandler);\n },\n\n _updateTotalForAction: function(action, items) {\n var that = this;\n\n var total = parseInt(that._total, 10);\n\n if (!isNumber(that._total)) {\n total = parseInt(that._pristineTotal, 10);\n }\n if (action === \"add\") {\n total += items.length;\n } else if (action === \"remove\") {\n total -= items.length;\n } else if (action !== \"itemchange\" && action !== \"sync\" && !that.options.serverPaging) {\n total = that._pristineTotal;\n } else if (action === \"sync\") {\n total = that._pristineTotal = parseInt(that._total, 10);\n }\n\n that._total = total;\n },\n\n _pushInDestroyed: function(model) {\n var isPushed = this._destroyed.find(function(item) {\n return item.uid === model.uid;\n });\n if (!isPushed) {\n this._destroyed.push(model);\n }\n },\n\n _change: function(e) {\n var that = this, idx, length, action = e ? e.action : \"\";\n\n if (action === \"remove\") {\n for (idx = 0, length = e.items.length; idx < length; idx++) {\n if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n that._pushInDestroyed(e.items[idx]);\n }\n }\n }\n\n if (that.options.autoSync && (action === \"add\" || action === \"remove\" || action === \"itemchange\")) {\n\n var handler = function(args) {\n if (args.action === \"sync\") {\n that.unbind(\"change\", handler);\n that._updateTotalForAction(action, e.items);\n }\n };\n\n that.first(\"change\", handler);\n\n that.sync();\n\n } else {\n that._updateTotalForAction(action, e ? e.items : []);\n\n that._process(that._data, e);\n }\n },\n\n _calculateAggregates: function(data, options) {\n options = options || {};\n\n var query = new Query(data),\n aggregates = options.aggregate,\n filter = options.filter;\n\n if (filter) {\n query = query.filter(filter);\n }\n\n return query.aggregate(aggregates);\n },\n\n _process: function(data, e) {\n var that = this,\n options = {},\n result;\n\n if (that.options.serverPaging !== true) {\n options.skip = that._skip;\n options.take = that._take || that._pageSize;\n\n if (options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) {\n options.skip = (that._page - 1) * that._pageSize;\n }\n\n if (that.options.useRanges) {\n options.skip = that.currentRangeStart();\n }\n }\n\n if (that.options.serverSorting !== true) {\n options.sort = that._sort;\n }\n\n if (that.options.serverFiltering !== true) {\n options.filter = that._filter;\n }\n\n if (that.options.serverGrouping !== true) {\n options.group = that._group;\n }\n\n if (that.options.serverAggregates !== true) {\n options.aggregate = that._aggregate;\n }\n\n if (that.options.serverGrouping) {\n that._clearEmptyGroups(data);\n }\n\n options.groupPaging = that._groupPaging;\n\n if (that._isGroupPaged() && e && (e.action === \"page\" || e.action === \"expandGroup\" || e.action === \"collapseGroup\")) {\n result = that._queryProcess(data, {\n aggregate: that._aggregate\n });\n } else {\n result = that._queryProcess(data, options);\n }\n\n if (that._filter && e && e.action === \"add\") {\n var model = e.items[0],\n resultData = result.data;\n\n var modelIsInView = resultData.find(function(item) {\n return item.uid === model.uid;\n });\n\n if (!modelIsInView) {\n result.data.splice(model.index, 0, model);\n result.total++;\n }\n }\n\n if (that.options.serverAggregates !== true) {\n // for performance reasons, calculate aggregates for part of the data only after query process\n // this is necessary in the TreeList when paging\n that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\n }\n\n that._setView(result, options, e);\n\n that._setFilterTotal(result.total, false);\n\n e = e || {};\n\n e.items = e.items || that._view;\n\n that.trigger(CHANGE, e);\n },\n\n _setView: function(result, options, e) {\n var that = this;\n\n if (that._isGroupPaged() && !that._isServerGrouped()) {\n if (e && (e.action === \"page\" || e.action === \"expandGroup\" || e.action === \"collapseGroup\")) {\n that.view(result.data);\n that._updateOuterRangesLength();\n } else {\n that._ranges = [];\n var query = new Query(result.data);\n that._addRange(that._observe(result.data));\n\n if (options.skip + options.take > result.data.length) {\n options.skip = result.data.length - options.take;\n }\n\n that.view(query.range(options.skip, options.take).toArray());\n }\n\n } else {\n that.view(result.data);\n }\n },\n\n _clearEmptyGroups: function(data) {\n for (var idx = data.length - 1; idx >= 0; idx--) {\n var group = data[idx];\n if (group.hasSubgroups) {\n this._clearEmptyGroups(group.items);\n }\n\n if (group.items && !group.items.length && !group.itemCount) {\n splice.apply(group.parent(), [idx, 1]);\n }\n }\n },\n\n _queryProcess: function(data, options) {\n if (this.options.inPlaceSort) {\n return Query.process(data, options, this.options.inPlaceSort);\n }\n else {\n return Query.process(data, options);\n }\n },\n\n _mergeState: function(options) {\n var that = this;\n\n if (options !== undefined) {\n that._pageSize = options.pageSize;\n that._page = options.page;\n that._sort = options.sort;\n that._filter = options.filter;\n that._group = options.group;\n that._aggregate = options.aggregate;\n that._skip = that._currentRangeStart = options.skip;\n that._take = options.take;\n\n if (that._skip === undefined) {\n that._skip = that._currentRangeStart = that.skip();\n options.skip = that.skip();\n }\n\n if (that._take === undefined && that._pageSize !== undefined) {\n that._take = that._pageSize;\n options.take = that._take;\n }\n\n if (that.options.virtual) {\n options.virtual = that.options.virtual;\n }\n\n if (options.sort) {\n that._sort = options.sort = normalizeSort(options.sort);\n that._sortFields = sortFields(options.sort);\n }\n\n if (options.filter) {\n that._filter = options.filter = (that.options.accentFoldingFiltering && !$.isEmptyObject(options.filter)) ? $.extend({}, normalizeFilter(options.filter), { accentFoldingFiltering: that.options.accentFoldingFiltering }) : normalizeFilter(options.filter);\n }\n\n if (options.group) {\n that._group = options.group = normalizeGroup(options.group);\n }\n if (options.aggregate) {\n that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n }\n }\n return options;\n },\n\n query: function(options) {\n var result;\n var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n\n if (remote || ((this._data === undefined || this._data.length === 0) && !this._destroyed.length)) {\n if (this.options.endless) {\n var moreItemsCount = options.pageSize - this.pageSize();\n if (moreItemsCount > 0) {\n moreItemsCount = this.pageSize();\n options.page = options.pageSize / moreItemsCount;\n options.pageSize = moreItemsCount;\n } else {\n options.page = 1;\n this.options.endless = false;\n }\n }\n return this.read(this._mergeState(options));\n }\n\n var isPrevented = this.trigger(REQUESTSTART, { type: \"read\" });\n if (!isPrevented) {\n this.trigger(PROGRESS);\n if (options) {\n options.groupPaging = this._groupPaging;\n }\n result = this._queryProcess(this._data, this._mergeState(options));\n\n this._setFilterTotal(result.total, true);\n\n this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\n this._setView(result, options);\n this.trigger(REQUESTEND, { type: \"read\" });\n this.trigger(CHANGE, { items: result.data, action: options ? options.action : \"\" });\n }\n\n return $.Deferred().resolve(isPrevented).promise();\n },\n\n _hasExpandedSubGroups: function(group) {\n var result = false;\n var length = group.items ? group.items.length : 0;\n\n if (!group.hasSubgroups) {\n return false;\n }\n\n for (var i = 0; i < length; i++) {\n if (this._groupsState[group.items[i].uid]) {\n result = true;\n break;\n }\n }\n return result;\n },\n\n _findGroupedRange: function(data, result, options, parents, callback) {\n var that = this;\n var length = data.length;\n var group;\n var current;\n var itemsLength;\n var groupCount;\n var itemsToSkip;\n\n for (var i = 0; i < length; i++) {\n group = data[i];\n\n if (options.taken >= options.take) {\n break;\n }\n\n if (!that._getGroupByUid(group.uid)) {\n that._groupsFlat.push(group);\n }\n\n if (that._groupsState[group.uid]) {\n if (that._isServerGroupPaged()) {\n if (that._fetchGroupItems(group, options, parents, callback)) {\n that._fetchingGroupItems = true;\n return;\n }\n groupCount = (group.subgroupCount || group.itemCount) + 1;\n itemsToSkip = options.skip - options.skipped;\n if (!that._hasExpandedSubGroups(group) && itemsToSkip > groupCount) {\n options.skipped += groupCount;\n continue;\n }\n }\n\n if (options.includeParents && options.skipped < options.skip) {\n options.skipped++;\n group.excludeHeader = true;\n } else if (options.includeParents) {\n options.taken++;\n group.excludeHeader = false;\n }\n\n if (group.hasSubgroups && group.items && group.items.length) {\n group.currentItems = [];\n\n if (!parents) {\n parents = [];\n }\n parents.push(group);\n\n that._findGroupedRange(group.items, group.currentItems, options, parents, callback);\n parents.pop();\n\n if (group.currentItems.length || options.taken > 0) {\n result.push(group);\n } else {\n group.excludeHeader = false;\n }\n } else {\n current = [];\n itemsLength = group.items.length;\n\n for (var j = 0; j < itemsLength; j++) {\n if (options.skipped < options.skip) {\n options.skipped++;\n continue;\n }\n\n if (options.taken >= options.take) {\n break;\n }\n current.push(group.items[j]);\n options.taken++;\n }\n\n if (current.length || options.taken > 0) {\n group.currentItems = current;\n result.push(group);\n } else {\n group.excludeHeader = false;\n }\n }\n } else {\n if (options.skipped < options.skip) {\n options.skipped++;\n continue;\n }\n result.push(group);\n options.taken++;\n }\n }\n },\n\n _expandedSubGroupItemsCount: function(group, end, includeCurrentItems) {\n var that = this;\n var result = 0;\n var subGroup;\n var endSpecified = typeof end === \"number\";\n var length = endSpecified ? end : group.subgroupCount;\n var temp;\n\n if (!group.hasSubgroups) {\n return result;\n }\n\n for (var i = 0; i < length; i++) {\n subGroup = group.items[i];\n\n if (!subGroup) {\n break;\n }\n\n if (subGroup.hasSubgroups && that._groupsState[group.uid]) {\n temp = that._expandedSubGroupItemsCount(subGroup, length, true);\n result += temp;\n\n if (endSpecified) {\n length -= temp;\n }\n } else if (!subGroup.hasSubgroups && that._groupsState[subGroup.uid]) {\n temp = subGroup.items ? subGroup.items.length : 0;\n result += temp;\n if (endSpecified) {\n length -= temp;\n }\n }\n\n if (includeCurrentItems) {\n result += 1;\n if (endSpecified) {\n length -= 1;\n }\n }\n\n if (endSpecified && result > length) {\n return result;\n }\n }\n\n return result;\n },\n\n _fetchGroupItems: function(group, options, parents, callback) {\n var that = this;\n var groupItemsSkip;\n var firstItem;\n var lastItem;\n var groupItemCount = group.hasSubgroups ? group.subgroupCount : group.itemCount;\n var take = options.take;\n var skipped = options.skipped;\n var pageSize = that.take();\n var expandedSubGroupItemsCount;\n\n if (options.includeParents) {\n if (skipped < options.skip) {\n skipped += 1;\n } else {\n take -= 1;\n }\n }\n\n if (!group.items || (group.items && !group.items.length)) {\n that.getGroupItems(group, options, parents, callback, 0);\n return true;\n } else {\n expandedSubGroupItemsCount = this._expandedSubGroupItemsCount(group, options.skip - skipped);\n groupItemsSkip = Math.max(options.skip - (skipped + expandedSubGroupItemsCount), 0);\n\n if (groupItemsSkip >= groupItemCount) {\n return false;\n }\n\n firstItem = group.items[groupItemsSkip];\n lastItem = group.items[Math.min(groupItemsSkip + take, groupItemCount - 1)];\n\n if (firstItem.notFetched) {\n that.getGroupItems(group, options, parents, callback, math.max(math.floor(groupItemsSkip / pageSize), 0) * pageSize, math.round((groupItemsSkip + pageSize) / pageSize));\n return true;\n }\n\n if (lastItem.notFetched) {\n that.getGroupItems(group, options, parents, callback, math.max(math.floor((groupItemsSkip + pageSize) / pageSize), 0) * pageSize, math.round((groupItemsSkip + pageSize) / pageSize));\n return true;\n }\n }\n },\n\n getGroupItems: function(group, options, parents, callback, groupItemsSkip, page) {\n var that = this;\n var take;\n var filter;\n var data;\n var subgroups;\n\n if (!group.items) {\n group.items = [];\n }\n\n take = that.take();\n filter = this._composeItemsFilter(group, parents);\n data = {\n page: page || 1,\n pageSize: take,\n skip: groupItemsSkip,\n take: take,\n filter: filter,\n aggregate: that._aggregate,\n sort: that._sort\n };\n subgroups = that.findSubgroups(group);\n\n if (subgroups && subgroups.length) {\n data.group = subgroups;\n data.groupPaging = true;\n }\n\n clearTimeout(that._timeout);\n that._timeout = setTimeout(function() {\n that._queueRequest(data, function() {\n if (!that.trigger(REQUESTSTART, {\n type: \"read\"\n })) {\n that.transport.read({\n data: data,\n success: that._groupItemsSuccessHandler(group, options.skip, that.take(), callback, groupItemsSkip),\n error: function() {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n }\n });\n } else {\n that._dequeueRequest();\n }\n });\n }, 100);\n },\n\n _groupItemsSuccessHandler: function(group, skip, take, callback, groupItemsSkip) {\n var that = this;\n var timestamp = that._timeStamp();\n callback = isFunction(callback) ? callback : noop;\n var totalField = that.options.schema && that.options.schema.total ? that.options.schema.total : \"Total\";\n\n return function(data) {\n var temp;\n var model = Model.define(that.options.schema.model);\n var totalCount;\n\n that._dequeueRequest();\n\n that.trigger(REQUESTEND, {\n response: data,\n type: \"read\"\n });\n\n if (isFunction(totalField)) {\n totalCount = totalField(data);\n } else {\n totalCount = data[totalField];\n }\n\n data = that.reader.parse(data);\n\n if (group.hasSubgroups) {\n temp = that.reader.groups(data);\n group.subgroupCount = totalCount;\n } else {\n temp = that.reader.data(data);\n temp = temp.map(function(item) {\n return new model(item);\n });\n }\n\n group.items.omitChangeEvent = true;\n for (var i = 0; i < totalCount; i++) {\n if (i >= groupItemsSkip && i < (groupItemsSkip + take) ) {\n group.items.splice(i, 1, temp[i - groupItemsSkip]);\n } else {\n if (!group.items[i]) {\n group.items.splice(i, 0, { notFetched: true });\n }\n }\n }\n group.items.omitChangeEvent = false;\n\n that._updateRangePristineData(group);\n that._fetchingGroupItems = false;\n\n if (!group.countAdded) {\n that._serverGroupsTotal += totalCount;\n group.countAdded = true;\n }\n\n that.range(skip, take, callback, \"expandGroup\");\n\n if (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress) {\n that.trigger(CHANGE, {});\n }\n };\n },\n\n findSubgroups: function(group) {\n var indexOfCurrentGroup = this._group.map(function(g) {\n return g.field;\n }).indexOf(group.field);\n\n return this._group.slice(indexOfCurrentGroup + 1, this._group.length);\n },\n\n _composeItemsFilter: function(group, parents) {\n var filter = this.filter() || {\n logic: \"and\",\n filters: []\n };\n\n filter.logic = 'and';\n filter = extend(true, {}, filter);\n filter.filters.push({\n field: group.field,\n operator: \"eq\",\n value: group.value\n });\n\n if (parents) {\n for (var i = 0; i < parents.length; i++) {\n filter.filters.push({\n field: parents[i].field,\n operator: \"eq\",\n value: parents[i].value\n });\n }\n }\n\n return filter;\n },\n\n _updateRangePristineData: function(group) {\n var that = this;\n var ranges = that._ranges;\n var rangesLength = ranges.length;\n var temp;\n var currentGroup;\n var range;\n var dataLength;\n var indexes;\n var currIdx;\n\n for (var i = 0; i < rangesLength; i++) {\n range = ranges[i];\n dataLength = range.data.length;\n indexes = [];\n temp = null;\n\n for (var j = 0; j < dataLength; j++) {\n currentGroup = range.data[j];\n indexes.push(j);\n\n if ((currentGroup.uid === group.uid) || (currentGroup.hasSubgroups && currentGroup.items.length && that._containsSubGroup(currentGroup, group, indexes))) {\n break;\n }\n indexes.pop();\n }\n\n if (indexes.length) {\n temp = ranges[i].pristineData;\n\n while (indexes.length > 1) {\n currIdx = indexes.splice(0, 1)[0];\n temp = temp[currIdx].items;\n }\n temp[indexes[0]] = that._cloneGroup(group);\n break;\n }\n }\n },\n\n _containsSubGroup: function(group, subgroup, indexes) {\n var that = this;\n var length = group.items.length;\n var currentSubGroup;\n\n if (group.hasSubgroups && length) {\n for (var i = 0; i < length; i++) {\n currentSubGroup = group.items[i];\n indexes.push(i);\n if (currentSubGroup.uid === subgroup.uid ||\n (currentSubGroup.hasSubgroups &&\n currentSubGroup.items.length &&\n that._containsSubGroup(currentSubGroup, subgroup, indexes))) {\n return true;\n }\n indexes.pop();\n }\n }\n\n },\n\n _cloneGroup: function(group) {\n var that = this;\n group = typeof group.toJSON == \"function\" ? group.toJSON() : group;\n\n if (group.items && group.items.length) {\n group.items = group.items.map(function(item) {\n return that._cloneGroup(item);\n });\n }\n\n return group;\n },\n\n _setFilterTotal: function(filterTotal, setDefaultValue) {\n var that = this;\n\n if (!that.options.serverFiltering) {\n if (filterTotal !== undefined) {\n that._total = filterTotal;\n } else if (setDefaultValue) {\n that._total = that._data.length;\n }\n }\n },\n\n fetch: function(callback) {\n var that = this;\n var fn = function(isPrevented) {\n if (isPrevented !== true && isFunction(callback)) {\n callback.call(that);\n }\n };\n\n return this._query().done(fn);\n },\n\n _query: function(options) {\n var that = this;\n\n return that.query(extend({}, {\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that.sort(),\n filter: that.filter(),\n group: that.group(),\n aggregate: that.aggregate()\n }, options));\n },\n\n next: function(options) {\n var that = this,\n page = that.page(),\n total = that.total();\n\n options = options || {};\n\n if (!page || (total && page + 1 > that.totalPages())) {\n return;\n }\n\n that._skip = that._currentRangeStart = page * that.take();\n\n page += 1;\n options.page = page;\n\n that._query(options);\n\n return page;\n },\n\n prev: function(options) {\n var that = this,\n page = that.page();\n\n options = options || {};\n\n if (!page || page === 1) {\n return;\n }\n\n that._skip = that._currentRangeStart = that._skip - that.take();\n\n page -= 1;\n options.page = page;\n\n that._query(options);\n\n return page;\n },\n\n page: function(val) {\n var that = this,\n skip;\n\n if (val !== undefined) {\n val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n var take = that.take();\n\n if (that._isGroupPaged()) {\n val -= 1;\n that.range(val * take, take, null, \"page\");\n return;\n }\n that._query(that._pageableQueryOptions({ page: val }));\n return;\n }\n skip = that.skip();\n\n return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n },\n\n pageSize: function(val) {\n var that = this;\n\n if (val !== undefined) {\n that._query(that._pageableQueryOptions({ pageSize: val, page: 1 }));\n return;\n }\n\n return that.take();\n },\n\n sort: function(val) {\n var that = this;\n\n if (val !== undefined) {\n that.trigger(\"sort\");\n that._query({ sort: val });\n return;\n }\n\n return that._sort;\n },\n\n filter: function(val) {\n var that = this;\n\n if (val === undefined) {\n return that._filter;\n }\n\n that.trigger(\"reset\");\n that._query({ filter: val, page: 1 });\n },\n\n group: function(val) {\n var that = this;\n var options = { group: val };\n\n if (that._groupPaging) {\n // clear ranges if ungrouping is performed\n if (val !== undefined && (!val || !val.length) ) {\n that._ranges = [];\n }\n options.page = 1;\n }\n\n if (val !== undefined) {\n that._query(options);\n return;\n }\n\n return that._group;\n },\n\n getGroupsFlat: function(data) {\n var idx,\n result = [],\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n var group = data[idx];\n if (group.hasSubgroups) {\n result = result.concat(this.getGroupsFlat(group.items));\n }\n\n result.push(group);\n }\n\n return result;\n },\n\n total: function() {\n return parseInt(this._total || 0, 10);\n },\n\n groupsTotal: function(includeExpanded) {\n var that = this;\n\n if (!that._group.length) {\n return that.total();\n }\n\n if (that._isServerGrouped()) {\n if (that._serverGroupsTotal) {\n return that._serverGroupsTotal;\n }\n that._serverGroupsTotal = that.total();\n\n return that._serverGroupsTotal;\n }\n\n return that._calculateGroupsTotal(that._ranges.length ? that._ranges[0].data : [], includeExpanded);\n },\n\n _calculateGroupsTotal: function(groups, includeExpanded, itemsField, ignoreState) {\n var that = this;\n itemsField = itemsField || \"items\";\n var total;\n var length;\n\n if (that._group.length && groups) {\n total = 0;\n length = groups.length;\n\n for (var i = 0; i < length; i++) {\n total += that.groupCount(groups[i], includeExpanded, itemsField, ignoreState);\n }\n that._groupsTotal = total;\n return total;\n }\n\n that._groupsTotal = that._data.length;\n return that._groupsTotal;\n },\n\n groupCount: function(group, includeExpanded, itemsField, ignoreState) {\n var that = this;\n var total = 0;\n\n if (group.hasSubgroups && that._groupsState[group.uid]) {\n if (includeExpanded && !group.excludeHeader || ignoreState) {\n total += 1;\n }\n\n group[itemsField].forEach(function(subgroup) {\n total += that.groupCount(subgroup, includeExpanded, itemsField, ignoreState);\n });\n } else {\n if (that._groupsState[group.uid]) {\n if (includeExpanded && !group.excludeHeader || ignoreState) {\n total++;\n }\n total += group[itemsField] ? group[itemsField].length : 0;\n } else {\n total++;\n }\n }\n return total;\n },\n\n countGroupRange: function(range) {\n var total = 0;\n var length = range.length;\n\n for (var i = 0; i < length; i++) {\n total += this.groupCount(range[i], true);\n }\n\n return total;\n },\n\n aggregate: function(val) {\n var that = this;\n\n if (val !== undefined) {\n that._query({ aggregate: val });\n return;\n }\n\n return that._aggregate;\n },\n\n aggregates: function() {\n var result = this._aggregateResult;\n\n if (isEmptyObject(result)) {\n result = this._emptyAggregates(this.aggregate());\n }\n\n return result;\n },\n\n _emptyAggregates: function(aggregates) {\n var result = {};\n\n if (!isEmptyObject(aggregates)) {\n var aggregate = {};\n\n if (!isArray(aggregates)) {\n aggregates = [aggregates];\n }\n\n for (var idx = 0; idx < aggregates.length; idx++) {\n aggregate[aggregates[idx].aggregate] = 0;\n result[aggregates[idx].field] = aggregate;\n }\n }\n\n return result;\n },\n\n _pageableQueryOptions: function(options) {\n return options;\n },\n\n _wrapInEmptyGroup: function(model) {\n var groups = this.group(),\n parent,\n group,\n idx,\n length;\n\n for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n group = groups[idx];\n parent = {\n value: model.get ? model.get(group.field) : model[group.field],\n field: group.field,\n items: parent ? [parent] : [model],\n hasSubgroups: !!parent,\n aggregates: this._emptyAggregates(group.aggregates)\n };\n }\n\n return parent;\n },\n\n totalPages: function() {\n var that = this,\n pageSize = that.pageSize() || that.total(),\n total = that._isGroupPaged() ? that.groupsTotal(true) : that.total();\n\n return math.ceil((total || 0) / pageSize);\n },\n\n inRange: function(skip, take) {\n var that = this,\n end = math.min(skip + take, that.total());\n\n if (!that.options.serverPaging && that._data.length > 0) {\n return true;\n }\n\n return that._findRange(skip, end).length > 0;\n },\n\n lastRange: function() {\n var ranges = this._ranges;\n return ranges[ranges.length - 1] || { start: 0, end: 0, data: [] };\n },\n\n firstItemUid: function() {\n var ranges = this._ranges;\n return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n },\n\n enableRequestsInProgress: function() {\n this._skipRequestsInProgress = false;\n },\n\n _timeStamp: function() {\n return new Date().getTime();\n },\n\n range: function(skip, take, callback, action) {\n this._currentRequestTimeStamp = this._timeStamp();\n this._skipRequestsInProgress = true;\n var total = this._isGroupPaged() ? this.groupsTotal(true) : this.total();\n\n if (action === \"expandGroup\" || action === \"collapseGroup\") {\n this._updateOuterRangesLength();\n }\n\n skip = math.min(skip || 0, total);\n callback = isFunction(callback) ? callback : noop;\n\n var that = this,\n pageSkip = math.max(math.floor(skip / take), 0) * take,\n size = math.min(pageSkip + take, total),\n data;\n\n data = that._findRange(skip, math.min(skip + take, total), callback);\n\n if ((data.length || total === 0) && !that._fetchingGroupItems) {\n that._processRangeData(data, skip, take, that._originalPageSkip || pageSkip, that._originalSize || size, {\n action: action\n });\n that._originalPageSkip = null;\n that._originalSize = null;\n callback();\n return;\n }\n\n if (that._isGroupPaged()) {\n that._originalPageSkip = pageSkip;\n that._originalSize = size;\n\n pageSkip = math.max(math.floor(that._adjustPageSkip(skip, take) / take), 0) * take;\n size = math.min(pageSkip + take, total);\n }\n\n if (take !== undefined && !that._fetchingGroupItems) {\n if ((that._isGroupPaged() && !that._groupRangeExists(pageSkip, take)) || !that._rangeExists(pageSkip, size)) {\n that.prefetch(pageSkip, take, function() {\n if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n that.prefetch(size, take, function() {\n that.range(skip, take, callback );\n });\n } else {\n that.range(skip, take, callback);\n }\n });\n } else if (pageSkip < skip) {\n that.prefetch(size, take, function() {\n that.range(skip, take, callback );\n });\n }\n }\n },\n\n _findRange: function(start, end, callback) {\n var that = this,\n ranges = that._ranges,\n range,\n data = [],\n skipIdx,\n takeIdx,\n startIndex,\n endIndex,\n rangeData,\n rangeEnd,\n processed,\n options = that.options,\n remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates,\n flatData,\n count,\n length,\n groupMapOptions = {\n take: end - start,\n skip: start,\n skipped: 0,\n taken: 0,\n includeParents: true\n },\n prevRangeEnd,\n isGroupPaged = that._isGroupPaged(),\n startField = isGroupPaged ? \"outerStart\" : \"start\",\n endField = isGroupPaged ? \"outerEnd\" : \"end\",\n currentDataLength;\n\n for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n range = ranges[skipIdx];\n\n if (isGroupPaged) {\n if (range.outerStart >= end) {\n return [];\n }\n\n if (start > range.outerEnd) {\n groupMapOptions.skipped += range.outerEnd - (prevRangeEnd || 0);\n prevRangeEnd = range.outerEnd;\n continue;\n }\n\n if (typeof prevRangeEnd !== \"undefined\" && prevRangeEnd != range.outerStart) {\n groupMapOptions.skipped += range.outerStart - prevRangeEnd;\n }\n\n if (groupMapOptions.skipped > groupMapOptions.skip) {\n return [];\n }\n\n if (typeof prevRangeEnd === \"undefined\" && start > 0 && range.start > 0) {\n groupMapOptions.skipped = range.outerStart;\n }\n\n takeIdx = skipIdx;\n while (true) {\n this._findGroupedRange(range.data, data, groupMapOptions, null, callback);\n currentDataLength = that._calculateGroupsTotal(data, true, \"currentItems\");\n\n if (currentDataLength >= groupMapOptions.take) {\n return data;\n }\n\n if (that._fetchingGroupItems) {\n return [];\n }\n takeIdx++;\n\n if (ranges[takeIdx] && ranges[takeIdx].outerStart === range.outerEnd) {\n range = ranges[takeIdx];\n } else {\n break;\n }\n }\n } else if (start >= range[startField] && start <= range[endField]) {\n count = 0;\n\n for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n range = ranges[takeIdx];\n flatData = that._flatData(range.data, true);\n\n if (flatData.length && start + count >= range.start) {\n rangeData = range.data;\n rangeEnd = range.end;\n\n if (!remote) {\n if (options.inPlaceSort) {\n processed = that._queryProcess(range.data, { filter: that.filter() });\n } else {\n var sort = normalizeGroupWithoutCompare(that.group() || []).concat(normalizeSort(that.sort() || []));\n processed = that._queryProcess(range.data, { sort: sort, filter: that.filter() });\n }\n flatData = rangeData = processed.data;\n\n if (processed.total !== undefined) {\n rangeEnd = processed.total;\n }\n }\n\n startIndex = 0;\n if (start + count > range.start) {\n startIndex = (start + count) - range.start;\n }\n endIndex = flatData.length;\n if (rangeEnd > end) {\n endIndex = endIndex - (rangeEnd - end);\n }\n count += endIndex - startIndex;\n data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n\n if (end <= range.end && count == end - start) {\n return data;\n }\n }\n }\n break;\n }\n prevRangeEnd = range.outerEnd;\n }\n return [];\n },\n\n _getRangesMismatch: function(pageSkip) {\n var that = this;\n var ranges = that._ranges;\n var mismatch = 0;\n var i = 0;\n\n while (true) {\n var range = ranges[i];\n if (!range || range.outerStart > pageSkip) {\n break;\n }\n\n if (range.outerEnd != range.end) {\n mismatch = range.outerEnd - range.end;\n }\n i++;\n }\n\n return mismatch;\n },\n\n _mergeGroups: function(data, range, skip, take) {\n if (this._isServerGrouped()) {\n var temp = range.toJSON(),\n prevGroup;\n\n if (data.length) {\n prevGroup = data[data.length - 1];\n }\n\n mergeGroups(prevGroup, temp, skip, take);\n\n return data.concat(temp);\n }\n return data.concat(range.slice(skip, take));\n },\n\n _processRangeData: function(data, skip, take, pageSkip, size, eventData) {\n var that = this;\n\n that._pending = undefined;\n\n that._skip = skip > that.skip() && !that._omitPrefetch ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n\n that._currentRangeStart = skip;\n\n that._take = take;\n\n var paging = that.options.serverPaging;\n var sorting = that.options.serverSorting;\n var filtering = that.options.serverFiltering;\n var aggregates = that.options.serverAggregates;\n try {\n that.options.serverPaging = true;\n if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n that.options.serverSorting = true;\n }\n that.options.serverFiltering = true;\n that.options.serverPaging = true;\n that.options.serverAggregates = true;\n\n if (paging) {\n that._detachObservableParents();\n that._data = data = that._observe(data);\n }\n that._process(data, eventData);\n } finally {\n that.options.serverPaging = paging;\n that.options.serverSorting = sorting;\n that.options.serverFiltering = filtering;\n that.options.serverAggregates = aggregates;\n }\n },\n\n skip: function() {\n var that = this;\n\n if (that._skip === undefined) {\n return (that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined);\n }\n return that._skip;\n },\n\n currentRangeStart: function() {\n return this._currentRangeStart || 0;\n },\n\n take: function() {\n return this._take || this._pageSize;\n },\n\n _prefetchSuccessHandler: function(skip, size, callback, force) {\n var that = this;\n var timestamp = that._timeStamp();\n\n return function(data) {\n var found = false,\n range = { start: skip, end: size, data: [], timestamp: that._timeStamp() },\n idx,\n length,\n temp;\n\n that._dequeueRequest();\n\n that.trigger(REQUESTEND, { response: data, type: \"read\" });\n\n data = that.reader.parse(data);\n\n temp = that._readData(data);\n\n if (temp.length) {\n for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n if (that._ranges[idx].start === skip) {\n found = true;\n range = that._ranges[idx];\n\n if (!that._isGroupPaged()) {\n range.pristineData = temp;\n range.data = that._observe(temp);\n range.end = range.start + that._flatData(range.data, true).length;\n that._sortRanges();\n }\n\n break;\n }\n }\n\n if (!found) {\n that._addRange(that._observe(temp), skip);\n }\n }\n\n that._total = that.reader.total(data);\n\n if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n if (callback && temp.length) {\n callback();\n } else {\n that.trigger(CHANGE, {});\n }\n }\n };\n },\n\n prefetch: function(skip, take, callback) {\n var that = this,\n size = math.min(skip + take, that.total()),\n options = {\n take: take,\n skip: skip,\n page: skip / take + 1,\n pageSize: take,\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n };\n\n\n if ((that._isGroupPaged() && !that._isServerGrouped() && that._groupRangeExists(skip, size))) {\n if (callback) {\n callback();\n }\n return;\n }\n\n if ((that._isServerGroupPaged() && !that._groupRangeExists(skip, size)) || !that._rangeExists(skip, size)) {\n clearTimeout(that._timeout);\n\n that._timeout = setTimeout(function() {\n that._queueRequest(options, function() {\n if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\n if (that._omitPrefetch) {\n that.trigger(PROGRESS);\n }\n that.transport.read({\n data: that._params(options),\n success: that._prefetchSuccessHandler(skip, size, callback),\n error: function() {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n }\n });\n } else {\n that._dequeueRequest();\n }\n });\n }, 100);\n } else if (callback) {\n callback();\n }\n },\n\n _multiplePrefetch: function(skip, take, callback) {\n var that = this,\n size = math.min(skip + take, that.total()),\n options = {\n take: take,\n skip: skip,\n page: skip / take + 1,\n pageSize: take,\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n };\n\n if (!that._rangeExists(skip, size)) {\n if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\n that.transport.read({\n data: that._params(options),\n success: that._prefetchSuccessHandler(skip, size, callback, true)\n });\n }\n } else if (callback) {\n callback();\n }\n },\n\n _adjustPageSkip: function(start, take) {\n var that = this;\n var prevRange = that._getPrevRange(start);\n var result;\n var total = that.total();\n var mismatch;\n\n if (prevRange) {\n mismatch = that._getRangesMismatch(start);\n\n if (!mismatch) {\n return start;\n }\n start -= mismatch;\n }\n result = math.max(math.floor(start / take), 0) * take;\n\n if (result > total) {\n while (true) {\n result -= take;\n if (result < total) {\n break;\n }\n }\n }\n return result;\n },\n\n _getNextRange: function(end) {\n var that = this,\n ranges = that._ranges,\n idx,\n length;\n\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n if (ranges[idx].start <= end && ranges[idx].end >= end) {\n return ranges[idx];\n }\n }\n },\n\n _getPrevRange: function(start) {\n var that = this,\n ranges = that._ranges,\n idx,\n range,\n length = ranges.length;\n\n for (idx = length - 1; idx >= 0; idx--) {\n if (ranges[idx].outerStart <= start) {\n range = ranges[idx];\n break;\n }\n\n }\n\n return range;\n },\n\n _rangeExists: function(start, end) {\n var that = this,\n ranges = that._ranges,\n idx,\n length;\n\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n if (ranges[idx].start <= start && ranges[idx].end >= end) {\n return true;\n }\n }\n\n return false;\n },\n\n _groupRangeExists: function(start, end) {\n var that = this,\n ranges = that._ranges,\n idx,\n length,\n availableItemsCount = 0,\n total = that.groupsTotal(true);\n\n if (end > total && !that._isServerGrouped()) {\n end = total;\n }\n\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n var range = ranges[idx];\n if (range.outerStart <= start && range.outerEnd >= start) {\n availableItemsCount += range.outerEnd - start;\n } else if (range.outerStart <= end && range.outerEnd >= end) {\n availableItemsCount += end - range.outerStart;\n }\n }\n\n return availableItemsCount >= end - start;\n },\n\n _getCurrentRangeSpan: function() {\n var that = this;\n var ranges = that._ranges;\n var start = that.currentRangeStart();\n var end = start + (that.take() || 0);\n var rangeSpan = [];\n var range;\n var idx;\n var length = ranges.length;\n\n for (idx = 0; idx < length; idx++) {\n range = ranges[idx];\n\n if ((range.start <= start && range.end >= start) || (range.start >= start && range.start <= end)) {\n rangeSpan.push(range);\n }\n }\n\n return rangeSpan;\n },\n\n _removeModelFromRanges: function(model) {\n var that = this;\n var range;\n\n for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n range = this._ranges[idx];\n\n that._removeModelFromRange(range, model);\n }\n\n that._updateRangesLength();\n },\n\n _removeModelFromRange: function(range, model) {\n this._eachItem(range.data, function(data) {\n if (!data) {\n return;\n }\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data[idx];\n\n if (dataItem.uid && dataItem.uid == model.uid) {\n [].splice.call(data, idx, 1);\n break;\n }\n }\n });\n },\n\n _insertModelInRange: function(index, model) {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var range;\n var i;\n\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n\n if (range.start <= index && range.end >= index) {\n if (!that._getByUid(model.uid, range.data)) {\n if (that._isServerGrouped()) {\n range.data.splice(index, 0, that._wrapInEmptyGroup(model));\n } else {\n range.data.splice(index, 0, model);\n }\n }\n\n break;\n }\n }\n\n that._updateRangesLength();\n },\n\n _updateRangesLength: function() {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var mismatchFound = false;\n var mismatchLength = 0;\n var lengthDifference = 0;\n var rangeLength;\n var range;\n var i;\n\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n rangeLength = that._isGroupPaged() ? range.data.length : that._flatData(range.data, true).length;\n lengthDifference = rangeLength - math.abs(range.end - range.start);\n\n if (!mismatchFound && lengthDifference !== 0) {\n mismatchFound = true;\n mismatchLength = lengthDifference;\n range.end += mismatchLength;\n continue;\n }\n\n if (mismatchFound) {\n range.start += mismatchLength;\n range.end += mismatchLength;\n }\n }\n },\n\n _updateOuterRangesLength: function() {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var mismatchLength = 0;\n var range;\n var i;\n var prevRange;\n var rangeLength;\n\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n rangeLength = that._isGroupPaged() ? that._calculateGroupsTotal(range.data, true, \"items\", true) : that._flatData(range.data, true).length;\n\n if (prevRange) {\n if (prevRange.end != range.start) {\n mismatchLength = range.start - prevRange.end;\n }\n range.outerStart = prevRange.outerEnd + mismatchLength;\n mismatchLength = 0;\n } else {\n range.outerStart = range.start;\n }\n\n range.outerEnd = range.outerStart + rangeLength;\n prevRange = range;\n }\n }\n });\n\n var Transport = {};\n\n Transport.create = function(options, data, dataSource) {\n var transport,\n transportOptions = options.transport ? $.extend({}, options.transport) : null;\n\n if (transportOptions) {\n transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n\n if (options.type === \"jsdo\") {\n transportOptions.dataSource = dataSource;\n }\n\n if (options.type) {\n kendo.data.transports = kendo.data.transports || {};\n kendo.data.schemas = kendo.data.schemas || {};\n\n if (!kendo.data.transports[options.type]) {\n kendo.logToConsole(\"Unknown DataSource transport type '\" + options.type + \"'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.\", \"warn\");\n } else if (!isPlainObject(kendo.data.transports[options.type])) {\n transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n } else {\n transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n }\n\n options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n }\n\n if (!transport) {\n transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n }\n } else {\n transport = new LocalTransport({ data: options.data || [] });\n }\n return transport;\n };\n\n DataSource.create = function(options) {\n if (isArray(options) || options instanceof ObservableArray) {\n options = { data: options };\n }\n\n var dataSource = options || {},\n data = dataSource.data,\n fields = dataSource.fields,\n table = dataSource.table,\n select = dataSource.select,\n idx,\n length,\n model = {},\n field;\n\n if (!data && fields && !dataSource.transport) {\n if (table) {\n data = inferTable(table, fields);\n } else if (select) {\n data = inferSelect(select, fields);\n\n if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n dataSource.group = \"optgroup\";\n }\n }\n }\n\n if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n for (idx = 0, length = fields.length; idx < length; idx++) {\n field = fields[idx];\n if (field.type) {\n model[field.field] = field;\n }\n }\n\n if (!isEmptyObject(model)) {\n dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n }\n }\n\n dataSource.data = data;\n\n select = null;\n dataSource.select = null;\n table = null;\n dataSource.table = null;\n\n return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n };\n\n function inferSelect(select, fields) {\n select = $(select)[0];\n var options = select.options;\n var firstField = fields[0];\n var secondField = fields[1];\n\n var data = [];\n var idx, length;\n var optgroup;\n var option;\n var record;\n var value;\n\n for (idx = 0, length = options.length; idx < length; idx++) {\n record = {};\n option = options[idx];\n optgroup = option.parentNode;\n\n if (optgroup === select) {\n optgroup = null;\n }\n\n if (option.disabled || (optgroup && optgroup.disabled)) {\n continue;\n }\n\n if (optgroup) {\n record.optgroup = optgroup.label;\n }\n\n record[firstField.field] = option.text;\n\n value = option.attributes.value;\n\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n\n record[secondField.field] = value;\n\n data.push(record);\n }\n\n return data;\n }\n\n function inferTable(table, fields) {\n var tbody = $(table)[0].tBodies[0],\n rows = tbody ? tbody.rows : [],\n idx,\n length,\n fieldIndex,\n fieldCount = fields.length,\n data = [],\n cells,\n record,\n cell,\n empty;\n\n for (idx = 0, length = rows.length; idx < length; idx++) {\n record = {};\n empty = true;\n cells = rows[idx].cells;\n\n for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n cell = cells[fieldIndex];\n if (cell.nodeName.toLowerCase() !== \"th\") {\n empty = false;\n record[fields[fieldIndex].field] = cell.innerHTML;\n }\n }\n if (!empty) {\n data.push(record);\n }\n }\n\n return data;\n }\n\n var Node = Model.define({\n idField: \"id\",\n\n init: function(value) {\n var that = this,\n hasChildren = that.hasChildren || value && value.hasChildren,\n childrenField = \"items\",\n childrenOptions = {};\n\n kendo.data.Model.fn.init.call(that, value);\n\n if (typeof that.children === STRING) {\n childrenField = that.children;\n }\n\n childrenOptions = {\n schema: {\n data: childrenField,\n model: {\n hasChildren: hasChildren,\n id: that.idField,\n fields: that.fields\n }\n }\n };\n\n if (typeof that.children !== STRING) {\n extend(childrenOptions, that.children);\n }\n\n childrenOptions.data = value;\n\n if (!hasChildren) {\n hasChildren = childrenOptions.schema.data;\n }\n\n if (typeof hasChildren === STRING) {\n hasChildren = kendo.getter(hasChildren);\n }\n\n if (isFunction(hasChildren)) {\n var hasChildrenObject = hasChildren.call(that, that);\n\n if (hasChildrenObject && hasChildrenObject.length === 0) {\n that.hasChildren = false;\n } else {\n that.hasChildren = !!hasChildrenObject;\n }\n }\n\n that._childrenOptions = childrenOptions;\n\n if (that.hasChildren) {\n that._initChildren();\n }\n\n that._loaded = !!(value && value._loaded);\n },\n\n _initChildren: function() {\n var that = this;\n var children, transport, parameterMap;\n\n if (!(that.children instanceof HierarchicalDataSource)) {\n children = that.children = new HierarchicalDataSource(that._childrenOptions);\n\n transport = children.transport;\n parameterMap = transport.parameterMap;\n\n transport.parameterMap = function(data, type) {\n data[that.idField || \"id\"] = that.id;\n\n if (parameterMap) {\n data = parameterMap.call(that, data, type);\n }\n\n return data;\n };\n\n children.parent = function() {\n return that;\n };\n\n children.bind(CHANGE, function(e) {\n e.node = e.node || that;\n that.trigger(CHANGE, e);\n });\n\n children.bind(ERROR, function(e) {\n var collection = that.parent();\n\n if (collection) {\n e.node = e.node || that;\n collection.trigger(ERROR, e);\n }\n });\n\n children.bind(ITEMSLOADED, function(e) {\n var collection = that.parent();\n\n if (collection) {\n collection.trigger(ITEMSLOADED, e);\n }\n });\n\n that._updateChildrenField();\n }\n },\n\n append: function(model) {\n this._initChildren();\n this.loaded(true);\n this.children.add(model);\n },\n\n hasChildren: false,\n\n level: function() {\n var parentNode = this.parentNode(),\n level = 0;\n\n while (parentNode && parentNode.parentNode) {\n level++;\n parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n }\n\n return level;\n },\n\n _updateChildrenField: function() {\n var fieldName = this._childrenOptions.schema.data;\n\n this[fieldName || \"items\"] = this.children.data();\n },\n\n _childrenLoaded: function() {\n this._loaded = true;\n\n this._updateChildrenField();\n },\n\n load: function() {\n var options = {};\n var method = \"_query\";\n var children, promise;\n\n if (this.hasChildren) {\n this._initChildren();\n\n children = this.children;\n\n options[this.idField || \"id\"] = this.id;\n\n if (!this._loaded) {\n children._data = undefined;\n method = \"read\";\n }\n\n children.one(CHANGE, this._childrenLoaded.bind(this));\n\n if (this._matchFilter) {\n options.filter = { field: '_matchFilter', operator: 'eq', value: true };\n }\n\n promise = children[method](options);\n if (!this._loaded) {\n this.trigger(ITEMLOAD, { promise: promise, node: this });\n }\n } else {\n this.loaded(true);\n }\n\n return promise || $.Deferred().resolve().promise();\n },\n\n parentNode: function() {\n var array = this.parent();\n\n return array.parent();\n },\n\n loaded: function(value) {\n if (value !== undefined) {\n this._loaded = value;\n } else {\n return this._loaded;\n }\n },\n\n shouldSerialize: function(field) {\n return Model.fn.shouldSerialize.call(this, field) &&\n field !== \"children\" &&\n field !== \"_loaded\" &&\n field !== \"hasChildren\" &&\n field !== \"_childrenOptions\";\n }\n });\n\n function dataMethod(name) {\n return function() {\n var data = this._data,\n result = DataSource.fn[name].apply(this, slice.call(arguments));\n\n if (this._data != data) {\n this._attachBubbleHandlers();\n }\n\n return result;\n };\n }\n\n var HierarchicalDataSource = DataSource.extend({\n init: function(options) {\n var node = Node.define({\n children: options\n });\n\n if (options.filter && !options.serverFiltering) {\n this._hierarchicalFilter = options.filter;\n options.filter = null;\n }\n\n DataSource.fn.init.call(this, extend(true, {}, { schema: { modelBase: node, model: node } }, options));\n\n this._attachBubbleHandlers();\n },\n\n _attachBubbleHandlers: function() {\n var that = this;\n\n that._data.bind(ERROR, function(e) {\n that.trigger(ERROR, e);\n });\n\n that._data.bind(ITEMSLOADED, function(e) {\n that.trigger(ITEMSLOADED, e);\n });\n },\n\n loading: function() {\n if (this._data) {\n return this._data.loading() || this._childrenLoading();\n }\n return false;\n },\n\n _childrenLoading: function() {\n var isLoading = false;\n this._data.forEach(function(node) {\n if (node.hasChildren && node.children.loading()) {\n isLoading = true;\n }\n });\n return isLoading;\n },\n\n read: function(data) {\n var result = DataSource.fn.read.call(this, data);\n\n if (this._hierarchicalFilter) {\n if (this._data && this._data.length > 0) {\n this.filter(this._hierarchicalFilter);\n } else {\n this.options.filter = this._hierarchicalFilter;\n this._filter = normalizeFilter(this.options.filter);\n this._hierarchicalFilter = null;\n }\n }\n\n return result;\n },\n\n remove: function(node) {\n var parentNode = node.parentNode(),\n dataSource = this,\n result;\n\n if (parentNode && parentNode._initChildren) {\n dataSource = parentNode.children;\n }\n\n result = DataSource.fn.remove.call(dataSource, node);\n\n if (parentNode && !dataSource.data().length) {\n parentNode.hasChildren = false;\n }\n\n return result;\n },\n\n success: dataMethod(\"success\"),\n\n data: dataMethod(\"data\"),\n\n insert: function(index, model) {\n var parentNode = this.parent();\n\n if (parentNode && parentNode._initChildren) {\n parentNode.hasChildren = true;\n parentNode._initChildren();\n }\n\n return DataSource.fn.insert.call(this, index, model);\n },\n\n filter: function(val) {\n if (val === undefined) {\n return this._filter;\n }\n\n if (!this.options.serverFiltering && this._markHierarchicalQuery(val)) {\n val = { logic: \"or\", filters: [val, { field: '_matchFilter', operator: 'equals', value: true }] };\n }\n\n this.trigger(\"reset\");\n this._query({ filter: val, page: 1 });\n },\n\n _markHierarchicalQuery: function(expressions) {\n var compiled;\n var predicate;\n var fields;\n var operators;\n var filter;\n var accentFoldingFiltering = this.options.accentFoldingFiltering;\n\n expressions = accentFoldingFiltering ? $.extend({}, normalizeFilter(expressions), { accentFoldingFiltering: accentFoldingFiltering }) : normalizeFilter(expressions);\n\n if (!expressions || expressions.filters.length === 0) {\n this._updateHierarchicalFilter(function() {return true;});\n return false;\n }\n\n compiled = Query.filterExpr(expressions);\n fields = compiled.fields;\n operators = compiled.operators;\n\n predicate = filter = new Function(\"d, __f, __o\", \"return \" + compiled.expression);\n\n if (fields.length || operators.length) {\n filter = function(d) {\n return predicate(d, fields, operators);\n };\n }\n\n this._updateHierarchicalFilter(filter);\n return true;\n },\n\n _updateHierarchicalFilter: function(filter) {\n var current;\n var data = this._data;\n var result = false;\n\n for (var idx = 0; idx < data.length; idx++) {\n current = data[idx];\n\n if (current.hasChildren) {\n current._matchFilter = current.children._updateHierarchicalFilter(filter);\n if (!current._matchFilter) {\n current._matchFilter = filter(current);\n }\n } else {\n current._matchFilter = filter(current);\n }\n\n if (current._matchFilter) {\n result = true;\n }\n }\n return result;\n },\n\n _find: function(method, value) {\n var idx, length, node, children;\n var data = this._data;\n\n if (!data) {\n return;\n }\n\n node = DataSource.fn[method].call(this, value);\n\n if (node) {\n return node;\n }\n\n data = this._flatData(this._data);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n children = data[idx].children;\n\n if (!(children instanceof HierarchicalDataSource)) {\n continue;\n }\n\n node = children[method](value);\n\n if (node) {\n return node;\n }\n }\n },\n\n get: function(id) {\n return this._find(\"get\", id);\n },\n\n getByUid: function(uid) {\n return this._find(\"getByUid\", uid);\n }\n });\n\n function inferList(list, fields) {\n var items = $(list).children(),\n idx,\n length,\n data = [],\n record,\n textField = fields[0].field,\n urlField = fields[1] && fields[1].field,\n spriteCssClassField = fields[2] && fields[2].field,\n imageUrlField = fields[3] && fields[3].field,\n item,\n id,\n textChild,\n className,\n children;\n\n function elements(collection, tagName) {\n return collection.filter(tagName).add(collection.find(tagName));\n }\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n record = { _loaded: true };\n item = items.eq(idx);\n\n textChild = item[0].firstChild;\n children = item.children();\n list = children.filter(\"ul\");\n children = children.filter(\":not(ul)\");\n\n id = item.attr(\"data-id\");\n\n if (id) {\n record.id = id;\n }\n\n if (textChild) {\n record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n }\n\n if (urlField) {\n record[urlField] = elements(children, \"a\").attr(\"href\");\n }\n\n if (imageUrlField) {\n record[imageUrlField] = elements(children, \"img\").attr(\"src\");\n }\n\n if (spriteCssClassField) {\n className = elements(children, \".k-sprite\").prop(\"className\");\n record[spriteCssClassField] = className && kendo.trim(className.replace(\"k-sprite\", \"\"));\n }\n\n if (list.length) {\n record.items = inferList(list.eq(0), fields);\n }\n\n if (item.attr(\"data-hasChildren\") == \"true\") {\n record.hasChildren = true;\n }\n\n data.push(record);\n }\n\n return data;\n }\n\n HierarchicalDataSource.create = function(options) {\n options = options && options.push ? { data: options } : options;\n\n var dataSource = options || {},\n data = dataSource.data,\n fields = dataSource.fields,\n list = dataSource.list;\n\n if (data && data._dataSource) {\n return data._dataSource;\n }\n\n if (!data && fields && !dataSource.transport) {\n if (list) {\n data = inferList(list, fields);\n }\n }\n\n dataSource.data = data;\n\n return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n };\n\n var Buffer = kendo.Observable.extend({\n init: function(dataSource, viewSize, disablePrefetch) {\n kendo.Observable.fn.init.call(this);\n\n this._prefetching = false;\n this.dataSource = dataSource;\n this.prefetch = !disablePrefetch;\n\n var buffer = this;\n\n dataSource.bind(\"change\", function() {\n buffer._change();\n });\n\n dataSource.bind(\"reset\", function() {\n buffer._reset();\n });\n\n this._syncWithDataSource();\n\n this.setViewSize(viewSize);\n },\n\n setViewSize: function(viewSize) {\n this.viewSize = viewSize;\n this._recalculate();\n },\n\n at: function(index) {\n var pageSize = this.pageSize,\n itemPresent = true;\n\n if (index >= this.total()) {\n this.trigger(\"endreached\", { index: index });\n return null;\n }\n\n if (!this.useRanges) {\n return this.dataSource.view()[index];\n }\n if (this.useRanges) {\n // out of range request\n if (index < this.dataOffset || index >= this.skip + pageSize) {\n itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n }\n\n // prefetch\n if (index === this.prefetchThreshold) {\n this._prefetch();\n }\n\n // mid-range jump - prefetchThreshold and nextPageThreshold may be equal, do not change to else if\n if (index === this.midPageThreshold) {\n this.range(this.nextMidRange, true);\n }\n // next range jump\n else if (index === this.nextPageThreshold) {\n this.range(this.nextFullRange);\n }\n // pull-back\n else if (index === this.pullBackThreshold) {\n if (this.offset === this.skip) { // from full range to mid range\n this.range(this.previousMidRange);\n } else { // from mid range to full range\n this.range(this.previousFullRange);\n }\n }\n\n if (itemPresent) {\n return this.dataSource.at(index - this.dataOffset);\n } else {\n this.trigger(\"endreached\", { index: index });\n return null;\n }\n }\n },\n\n indexOf: function(item) {\n return this.dataSource.data().indexOf(item) + this.dataOffset;\n },\n\n total: function() {\n return parseInt(this.dataSource.total(), 10);\n },\n\n next: function() {\n var buffer = this,\n pageSize = buffer.pageSize,\n offset = buffer.skip - buffer.viewSize + pageSize,\n pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n\n this.offset = offset;\n this.dataSource.prefetch(pageSkip, pageSize, function() {\n buffer._goToRange(offset, true);\n });\n },\n\n range: function(offset, nextRange) {\n if (this.offset === offset) {\n return true;\n }\n\n var buffer = this,\n pageSize = this.pageSize,\n pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize,\n dataSource = this.dataSource;\n\n if (nextRange) {\n pageSkip += pageSize;\n }\n\n if (dataSource.inRange(offset, pageSize)) {\n this.offset = offset;\n this._recalculate();\n this._goToRange(offset);\n return true;\n } else if (this.prefetch) {\n dataSource.prefetch(pageSkip, pageSize, function() {\n buffer.offset = offset;\n buffer._recalculate();\n buffer._goToRange(offset, true);\n });\n return false;\n }\n\n return true;\n },\n\n syncDataSource: function() {\n var offset = this.offset;\n this.offset = null;\n this.range(offset);\n },\n\n destroy: function() {\n this.unbind();\n },\n\n _prefetch: function() {\n var buffer = this,\n pageSize = this.pageSize,\n prefetchOffset = this.skip + pageSize,\n dataSource = this.dataSource;\n\n if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n this._prefetching = true;\n this.trigger(\"prefetching\", { skip: prefetchOffset, take: pageSize });\n\n dataSource.prefetch(prefetchOffset, pageSize, function() {\n buffer._prefetching = false;\n buffer.trigger(\"prefetched\", { skip: prefetchOffset, take: pageSize });\n });\n }\n },\n\n _goToRange: function(offset, expanding) {\n if (this.offset !== offset) {\n return;\n }\n\n this.dataOffset = offset;\n this._expanding = expanding;\n this.dataSource.range(offset, this.pageSize);\n this.dataSource.enableRequestsInProgress();\n },\n\n _reset: function() {\n this._syncPending = true;\n },\n\n _change: function() {\n var dataSource = this.dataSource;\n\n this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n\n if (this._syncPending) {\n this._syncWithDataSource();\n this._recalculate();\n this._syncPending = false;\n this.trigger(\"reset\", { offset: this.offset });\n }\n\n this.trigger(\"resize\");\n\n if (this._expanding) {\n this.trigger(\"expand\");\n }\n\n delete this._expanding;\n },\n\n _syncWithDataSource: function() {\n var dataSource = this.dataSource;\n\n this._firstItemUid = dataSource.firstItemUid();\n this.dataOffset = this.offset = dataSource.skip() || 0;\n this.pageSize = dataSource.pageSize();\n this.useRanges = dataSource.options.serverPaging;\n },\n\n _recalculate: function() {\n var pageSize = this.pageSize,\n offset = this.offset,\n viewSize = this.viewSize,\n skip = Math.ceil(offset / pageSize) * pageSize;\n\n this.skip = skip;\n this.midPageThreshold = skip + pageSize - 1;\n this.nextPageThreshold = skip + viewSize - 1;\n this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n this.pullBackThreshold = this.offset - 1;\n\n this.nextMidRange = skip + pageSize - viewSize;\n this.nextFullRange = skip;\n this.previousMidRange = offset - viewSize;\n this.previousFullRange = skip - pageSize;\n }\n });\n\n var BatchBuffer = kendo.Observable.extend({\n init: function(dataSource, batchSize) {\n var batchBuffer = this;\n\n kendo.Observable.fn.init.call(batchBuffer);\n\n this.dataSource = dataSource;\n this.batchSize = batchSize;\n this._total = 0;\n\n this.buffer = new Buffer(dataSource, batchSize * 3);\n\n this.buffer.bind({\n \"endreached\": function(e) {\n batchBuffer.trigger(\"endreached\", { index: e.index });\n },\n \"prefetching\": function(e) {\n batchBuffer.trigger(\"prefetching\", { skip: e.skip, take: e.take });\n },\n \"prefetched\": function(e) {\n batchBuffer.trigger(\"prefetched\", { skip: e.skip, take: e.take });\n },\n \"reset\": function() {\n batchBuffer._total = 0;\n batchBuffer.trigger(\"reset\");\n },\n \"resize\": function() {\n batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n batchBuffer.trigger(\"resize\", { total: batchBuffer.total(), offset: this.offset });\n }\n });\n },\n\n syncDataSource: function() {\n this.buffer.syncDataSource();\n },\n\n at: function(index) {\n var buffer = this.buffer,\n skip = index * this.batchSize,\n take = this.batchSize,\n view = [],\n item;\n\n if (buffer.offset > skip) {\n buffer.at(buffer.offset - 1);\n }\n\n for (var i = 0; i < take; i++) {\n item = buffer.at(skip + i);\n\n if (item === null) {\n break;\n }\n\n view.push(item);\n }\n\n return view;\n },\n\n total: function() {\n return this._total;\n },\n\n destroy: function() {\n this.buffer.destroy();\n this.unbind();\n }\n });\n\n extend(true, kendo.data, {\n readers: {\n json: DataReader\n },\n Query: Query,\n DataSource: DataSource,\n HierarchicalDataSource: HierarchicalDataSource,\n Node: Node,\n Comparer: Comparer,\n ObservableObject: ObservableObject,\n ObservableArray: ObservableArray,\n LazyObservableArray: LazyObservableArray,\n LocalTransport: LocalTransport,\n RemoteTransport: RemoteTransport,\n Cache: Cache,\n DataReader: DataReader,\n Model: Model,\n Buffer: Buffer,\n BatchBuffer: BatchBuffer\n });\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.data.signalr',[ \"kendo.data\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"data.signalr\",\n name: \"SignalR\",\n category: \"framework\",\n depends: [ \"data\" ],\n hidden: true\n};\n\n(function($) {\n var kendo = window.kendo;\n var isFunction = kendo.isFunction;\n\n function isJQueryPromise(promise) {\n return promise && isFunction(promise.done) && isFunction(promise.fail);\n }\n\n function isNativePromise(promise) {\n return promise && isFunction(promise.then) && isFunction(promise.catch);\n }\n\n var transport = kendo.data.RemoteTransport.extend({\n init: function(options) {\n var signalr = options && options.signalr ? options.signalr : {};\n\n var promise = signalr.promise;\n\n if (!promise) {\n throw new Error('The \"promise\" option must be set.');\n }\n\n if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\n throw new Error('The \"promise\" option must be a Promise.');\n }\n\n this.promise = promise;\n\n var hub = signalr.hub;\n\n if (!hub) {\n throw new Error('The \"hub\" option must be set.');\n }\n\n if (typeof hub.on != \"function\" || typeof hub.invoke != \"function\") {\n throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\n }\n\n this.hub = hub;\n\n kendo.data.RemoteTransport.fn.init.call(this, options);\n },\n\n push: function(callbacks) {\n var client = this.options.signalr.client || {};\n\n if (client.create) {\n this.hub.on(client.create, callbacks.pushCreate);\n }\n\n if (client.update) {\n this.hub.on(client.update, callbacks.pushUpdate);\n }\n\n if (client.destroy) {\n this.hub.on(client.destroy, callbacks.pushDestroy);\n }\n },\n\n _crud: function(options, type) {\n var hub = this.hub;\n var promise = this.promise;\n var server = this.options.signalr.server;\n\n if (!server || !server[type]) {\n throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\n }\n\n var args = [server[type]];\n\n var data = this.parameterMap(options.data, type);\n\n if (!$.isEmptyObject(data)) {\n args.push(data);\n }\n\n if (isJQueryPromise(promise)) {\n promise.done(function() {\n hub.invoke.apply(hub, args)\n .done(options.success)\n .fail(options.error);\n });\n } else if (isNativePromise(promise)) {\n promise.then(function() {\n hub.invoke.apply(hub, args)\n .then(options.success)\n .catch(options.error);\n });\n }\n },\n\n read: function(options) {\n this._crud(options, \"read\");\n },\n\n create: function(options) {\n this._crud(options, \"create\");\n },\n\n update: function(options) {\n this._crud(options, \"update\");\n },\n\n destroy: function(options) {\n this._crud(options, \"destroy\");\n }\n });\n\n $.extend(true, kendo.data, {\n transports: {\n signalr: transport\n }\n });\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.binder',[ \"kendo.core\", \"kendo.data\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"binder\",\n name: \"MVVM\",\n category: \"framework\",\n description: \"Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).\",\n depends: [ \"core\", \"data\" ]\n};\n\n\n(function($, undefined) {\n var kendo = window.kendo,\n Observable = kendo.Observable,\n ObservableObject = kendo.data.ObservableObject,\n ObservableArray = kendo.data.ObservableArray,\n toString = {}.toString,\n binders = {},\n Class = kendo.Class,\n VALUE = \"value\",\n SOURCE = \"source\",\n EVENTS = \"events\",\n CHECKED = \"checked\",\n CSS = \"css\",\n deleteExpando = true,\n FUNCTION = \"function\",\n CHANGE = \"change\";\n\n (function() {\n var a = document.createElement(\"a\");\n\n try {\n delete a.test;\n } catch (e) {\n deleteExpando = false;\n }\n })();\n\n var Binding = Observable.extend( {\n init: function(parents, path) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.source = parents[0];\n that.parents = parents;\n that.path = path;\n that.dependencies = {};\n that.dependencies[path] = true;\n that.observable = that.source instanceof Observable;\n\n that._access = function(e) {\n that.dependencies[e.field] = true;\n };\n\n if (that.observable) {\n that._change = function(e) {\n that.change(e);\n };\n\n that.source.bind(CHANGE, that._change);\n }\n },\n\n _parents: function() {\n var parents = this.parents;\n var value = this.get();\n\n if (value && typeof value.parent == \"function\") {\n var parent = value.parent();\n\n if ($.inArray(parent, parents) < 0) {\n parents = [parent].concat(parents);\n }\n }\n\n return parents;\n },\n\n change: function(e) {\n var dependency,\n ch,\n field = e.field,\n that = this;\n\n if (that.path === \"this\") {\n that.trigger(CHANGE, e);\n } else {\n for (dependency in that.dependencies) {\n if (dependency.indexOf(field) === 0) {\n ch = dependency.charAt(field.length);\n\n if (!ch || ch === \".\" || ch === \"[\") {\n that.trigger(CHANGE, e);\n break;\n }\n }\n }\n }\n },\n\n start: function(source) {\n source.bind(\"get\", this._access);\n },\n\n stop: function(source) {\n source.unbind(\"get\", this._access);\n },\n\n get: function() {\n\n var that = this,\n source = that.source,\n index = 0,\n path = that.path,\n result = source;\n\n if (!that.observable) {\n return result;\n }\n\n that.start(that.source);\n\n result = source.get(path);\n\n // Traverse the observable hierarchy if the binding is not resolved at the current level.\n while (result === undefined && source) {\n\n source = that.parents[++index];\n\n if (source instanceof ObservableObject) {\n result = source.get(path);\n }\n }\n\n // second pass try to get the parent from the object hierarchy\n if (result === undefined) {\n source = that.source; //get the initial source\n\n while (result === undefined && source) {\n source = source.parent();\n\n if (source instanceof ObservableObject) {\n result = source.get(path);\n }\n }\n }\n\n // If the result is a function - invoke it\n if (typeof result === \"function\") {\n index = path.lastIndexOf(\".\");\n\n // If the function is a member of a nested observable object make that nested observable the context (this) of the function\n if (index > 0) {\n source = source.get(path.substring(0, index));\n }\n\n // Invoke the function\n that.start(source);\n\n if (source !== that.source) {\n result = result.call(source, that.source);\n } else {\n result = result.call(source);\n }\n\n that.stop(source);\n }\n\n // If the binding is resolved by a parent object\n if (source && source !== that.source) {\n\n that.currentSource = source; // save parent object\n\n // Listen for changes in the parent object\n source.unbind(CHANGE, that._change)\n .bind(CHANGE, that._change);\n }\n\n that.stop(that.source);\n\n return result;\n },\n\n set: function(value) {\n var source = this.currentSource || this.source;\n\n var field = kendo.getter(this.path)(source);\n\n if (typeof field === \"function\") {\n if (source !== this.source) {\n field.call(source, this.source, value);\n } else {\n field.call(source, value);\n }\n } else {\n source.set(this.path, value);\n }\n },\n\n destroy: function() {\n if (this.observable) {\n this.source.unbind(CHANGE, this._change);\n if (this.currentSource) {\n this.currentSource.unbind(CHANGE, this._change);\n }\n }\n\n this.unbind();\n }\n });\n\n var EventBinding = Binding.extend( {\n get: function() {\n var source = this.source,\n path = this.path,\n index = 0,\n handler;\n\n handler = source.get(path);\n\n while (!handler && source) {\n source = this.parents[++index];\n\n if (source instanceof ObservableObject) {\n handler = source.get(path);\n }\n }\n\n if (!handler) {\n return;\n }\n\n return handler.bind(source);\n }\n });\n\n var TemplateBinding = Binding.extend( {\n init: function(source, path, template) {\n var that = this;\n\n Binding.fn.init.call(that, source, path);\n\n that.template = template;\n },\n\n render: function(value) {\n var html;\n\n this.start(this.source);\n\n html = kendo.render(this.template, value);\n\n this.stop(this.source);\n\n return html;\n }\n });\n\n var Binder = Class.extend({\n init: function(element, bindings, options) {\n this.element = element;\n this.bindings = bindings;\n this.options = options;\n },\n\n bind: function(binding, attribute) {\n var that = this;\n\n binding = attribute ? binding[attribute] : binding;\n\n binding.bind(CHANGE, function(e) {\n that.refresh(attribute || e);\n });\n\n that.refresh(attribute);\n },\n\n destroy: function() {\n }\n });\n\n var TypedBinder = Binder.extend({\n dataType: function() {\n var dataType = this.element.getAttribute(\"data-\" + kendo.ns + \"type\") || this.element.type || \"text\";\n return dataType.toLowerCase();\n },\n\n parsedValue: function() {\n return this._parseValue(this.element.value, this.dataType());\n },\n\n _parseValue: function(value, dataType) {\n if (dataType == \"date\") {\n value = kendo.parseDate(value, \"yyyy-MM-dd\");\n } else if (dataType == \"datetime-local\") {\n value = kendo.parseDate(value, [\"yyyy-MM-ddTHH:mm:ss\", \"yyyy-MM-ddTHH:mm\"] );\n } else if (dataType == \"number\") {\n value = kendo.parseFloat(value);\n } else if (dataType == \"boolean\") {\n value = value.toLowerCase();\n if (kendo.parseFloat(value) !== null) {\n value = Boolean(kendo.parseFloat(value));\n } else {\n value = (value.toLowerCase() === \"true\");\n }\n }\n return value;\n }\n });\n\n binders.attr = Binder.extend({\n refresh: function(key) {\n this.element.setAttribute(key, this.bindings.attr[key].get());\n }\n });\n\n binders.css = Binder.extend({\n init: function(element, bindings, options) {\n Binder.fn.init.call(this, element, bindings, options);\n this.classes = {};\n },\n refresh: function(className) {\n var element = $(this.element),\n binding = this.bindings.css[className],\n hasClass = this.classes[className] = binding.get();\n if (hasClass) {\n element.addClass(className);\n } else {\n element.removeClass(className);\n }\n }\n });\n\n binders.style = Binder.extend({\n refresh: function(key) {\n this.element.style[key] = this.bindings.style[key].get() || \"\";\n }\n });\n\n binders.enabled = Binder.extend({\n refresh: function() {\n if (this.bindings.enabled.get()) {\n this.element.removeAttribute(\"disabled\");\n } else {\n this.element.setAttribute(\"disabled\", \"disabled\");\n }\n }\n });\n\n binders.readonly = Binder.extend({\n refresh: function() {\n if (this.bindings.readonly.get()) {\n this.element.setAttribute(\"readonly\", \"readonly\");\n } else {\n this.element.removeAttribute(\"readonly\");\n }\n }\n });\n\n binders.disabled = Binder.extend({\n refresh: function() {\n if (this.bindings.disabled.get()) {\n this.element.setAttribute(\"disabled\", \"disabled\");\n } else {\n this.element.removeAttribute(\"disabled\");\n }\n }\n });\n\n binders.events = Binder.extend({\n init: function(element, bindings, options) {\n Binder.fn.init.call(this, element, bindings, options);\n this.handlers = {};\n },\n\n refresh: function(key) {\n var element = $(this.element),\n binding = this.bindings.events[key],\n handler = this.handlers[key];\n\n if (handler) {\n element.off(key, handler);\n }\n\n handler = this.handlers[key] = binding.get();\n\n element.on(key, binding.source, handler);\n },\n\n destroy: function() {\n var element = $(this.element),\n handler;\n\n for (handler in this.handlers) {\n element.off(handler, this.handlers[handler]);\n }\n }\n });\n\n binders.text = Binder.extend({\n refresh: function() {\n var text = this.bindings.text.get();\n var dataFormat = this.element.getAttribute(\"data-\" + kendo.ns + \"format\") || \"\";\n if (text == null) {\n text = \"\";\n }\n\n $(this.element).text(kendo.toString(text, dataFormat));\n }\n });\n\n binders.visible = Binder.extend({\n refresh: function() {\n if (this.bindings.visible.get()) {\n this.element.style.display = \"\";\n } else {\n this.element.style.display = \"none\";\n }\n }\n });\n\n binders.invisible = Binder.extend({\n refresh: function() {\n if (!this.bindings.invisible.get()) {\n this.element.style.display = \"\";\n } else {\n this.element.style.display = \"none\";\n }\n }\n });\n\n binders.html = Binder.extend({\n refresh: function() {\n this.element.innerHTML = this.bindings.html.get();\n }\n });\n\n binders.value = TypedBinder.extend({\n init: function(element, bindings, options) {\n TypedBinder.fn.init.call(this, element, bindings, options);\n\n this._change = this.change.bind(this);\n this.eventName = options.valueUpdate || CHANGE;\n\n $(this.element).on(this.eventName, this._change);\n\n this._initChange = false;\n },\n\n change: function() {\n this._initChange = this.eventName != CHANGE;\n\n this.bindings[VALUE].set(this.parsedValue());\n\n this._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var value = this.bindings[VALUE].get();\n\n if (value == null) {\n value = \"\";\n }\n\n var type = this.dataType();\n\n if (type == \"date\") {\n value = kendo.toString(value, \"yyyy-MM-dd\");\n } else if (type == \"datetime-local\") {\n value = kendo.toString(value, \"yyyy-MM-ddTHH:mm:ss\");\n }\n\n this.element.value = value;\n }\n\n this._initChange = false;\n },\n\n destroy: function() {\n $(this.element).off(this.eventName, this._change);\n }\n });\n\n binders.source = Binder.extend({\n init: function(element, bindings, options) {\n Binder.fn.init.call(this, element, bindings, options);\n\n var source = this.bindings.source.get();\n\n if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\n source.fetch();\n }\n },\n\n refresh: function(e) {\n var that = this,\n source = that.bindings.source.get();\n\n if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n e = e || {};\n\n if (e.action == \"add\") {\n that.add(e.index, e.items);\n } else if (e.action == \"remove\") {\n that.remove(e.index, e.items);\n } else if (e.action != \"itemchange\") {\n that.render();\n }\n } else {\n that.render();\n }\n },\n\n container: function() {\n var element = this.element;\n\n if (element.nodeName.toLowerCase() == \"table\") {\n if (!element.tBodies[0]) {\n element.appendChild(document.createElement(\"tbody\"));\n }\n element = element.tBodies[0];\n }\n\n return element;\n },\n\n template: function() {\n var options = this.options,\n template = options.template,\n nodeName = this.container().nodeName.toLowerCase();\n\n if (!template) {\n if (nodeName == \"select\") {\n if (options.valueField || options.textField) {\n template = kendo.format('',\n options.valueField || options.textField, options.textField || options.valueField);\n } else {\n template = \"\";\n }\n } else if (nodeName == \"tbody\") {\n template = \"#:data#\";\n } else if (nodeName == \"ul\" || nodeName == \"ol\") {\n template = \"
  • #:data#
  • \";\n } else {\n template = \"#:data#\";\n }\n template = kendo.template(template);\n }\n\n return template;\n },\n\n add: function(index, items) {\n var element = this.container(),\n parents,\n idx,\n length,\n child,\n clone = element.cloneNode(false),\n reference = element.children[index];\n\n $(clone).html(kendo.render(this.template(), items));\n\n if (clone.children.length) {\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n child = clone.children[0];\n element.insertBefore(child, reference || null);\n bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\n }\n }\n },\n\n remove: function(index, items) {\n var idx, element = this.container();\n\n for (idx = 0; idx < items.length; idx++) {\n var child = element.children[index];\n unbindElementTree(child, true);\n if (child.parentNode == element) {\n element.removeChild(child);\n }\n }\n },\n\n render: function() {\n var source = this.bindings.source.get(),\n parents,\n idx,\n length,\n element = this.container(),\n template = this.template();\n\n if (source == null) {\n return;\n }\n\n if (source instanceof kendo.data.DataSource) {\n source = source.view();\n }\n\n if (!(source instanceof ObservableArray) && toString.call(source) !== \"[object Array]\") {\n source = [source];\n }\n\n if (this.bindings.template) {\n unbindElementChildren(element, true);\n\n $(element).html(this.bindings.template.render(source));\n\n if (element.children.length) {\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = source.length; idx < length; idx++) {\n bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\n }\n }\n } else {\n $(element).html(kendo.render(template, source));\n }\n }\n });\n\n binders.input = {\n checked: TypedBinder.extend({\n init: function(element, bindings, options) {\n TypedBinder.fn.init.call(this, element, bindings, options);\n this._change = this.change.bind(this);\n\n $(this.element).change(this._change);\n },\n\n change: function() {\n var element = this.element;\n var value = this.value();\n\n if (element.type == \"radio\") {\n value = this.parsedValue();\n this.bindings[CHECKED].set(value);\n } else if (element.type == \"checkbox\") {\n var source = this.bindings[CHECKED].get();\n var index;\n\n if (source instanceof ObservableArray) {\n value = this.parsedValue();\n if (value instanceof Date) {\n for (var i = 0; i < source.length; i++) {\n if (source[i] instanceof Date && +source[i] === +value) {\n index = i;\n break;\n }\n }\n } else {\n index = source.indexOf(value);\n }\n if (index > -1) {\n source.splice(index, 1);\n } else {\n source.push(value);\n }\n } else {\n this.bindings[CHECKED].set(value);\n }\n }\n },\n\n refresh: function() {\n var value = this.bindings[CHECKED].get(),\n source = value,\n type = this.dataType(),\n element = this.element;\n\n if (element.type == \"checkbox\") {\n if (source instanceof ObservableArray) {\n var index = -1;\n value = this.parsedValue();\n if (value instanceof Date) {\n for (var i = 0; i < source.length; i++) {\n if (source[i] instanceof Date && +source[i] === +value) {\n index = i;\n break;\n }\n }\n } else {\n index = source.indexOf(value);\n }\n element.checked = (index >= 0);\n } else {\n element.checked = source;\n }\n } else if (element.type == \"radio\") {\n if (type == \"date\") {\n value = kendo.toString(value, \"yyyy-MM-dd\");\n } else if (type == \"datetime-local\") {\n value = kendo.toString(value, \"yyyy-MM-ddTHH:mm:ss\");\n }\n\n if (value !== null && typeof(value) !== \"undefined\" && element.value === value.toString()) {\n element.checked = true;\n } else {\n element.checked = false;\n }\n }\n },\n\n value: function() {\n var element = this.element,\n value = element.value;\n\n if (element.type == \"checkbox\") {\n value = element.checked;\n }\n\n return value;\n },\n destroy: function() {\n $(this.element).off(CHANGE, this._change);\n }\n })\n };\n\n binders.select = {\n source: binders.source.extend({\n refresh: function(e) {\n var that = this,\n source = that.bindings.source.get();\n\n if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n e = e || {};\n if (e.action == \"add\") {\n that.add(e.index, e.items);\n } else if (e.action == \"remove\") {\n that.remove(e.index, e.items);\n } else if (e.action == \"itemchange\" || e.action === undefined) {\n that.render();\n if (that.bindings.value) {\n if (that.bindings.value) {\n var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data(\"valueField\"));\n if (val === null) {\n that.element.selectedIndex = -1;\n } else {\n that.element.value = val;\n }\n }\n }\n }\n } else {\n that.render();\n }\n }\n }),\n value: TypedBinder.extend({\n init: function(target, bindings, options) {\n TypedBinder.fn.init.call(this, target, bindings, options);\n\n this._change = this.change.bind(this);\n $(this.element).change(this._change);\n },\n\n parsedValue: function() {\n var dataType = this.dataType();\n var values = [];\n var value, option, idx, length;\n for (idx = 0, length = this.element.options.length; idx < length; idx++) {\n option = this.element.options[idx];\n\n if (option.selected) {\n value = option.attributes.value;\n\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n\n values.push(this._parseValue(value, dataType));\n }\n }\n return values;\n },\n\n change: function() {\n var values = [],\n element = this.element,\n source,\n field = this.options.valueField || this.options.textField,\n valuePrimitive = this.options.valuePrimitive,\n option,\n valueIndex,\n value,\n idx,\n length;\n\n for (idx = 0, length = element.options.length; idx < length; idx++) {\n option = element.options[idx];\n\n if (option.selected) {\n value = option.attributes.value;\n\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n\n if (field) {\n values.push(value);\n } else {\n values.push(this._parseValue(value, this.dataType()));\n }\n\n }\n }\n\n if (field) {\n source = this.bindings.source.get();\n if (source instanceof kendo.data.DataSource) {\n source = source.view();\n }\n\n for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\n for (idx = 0, length = source.length; idx < length; idx++) {\n var sourceValue = source[idx].get(field);\n var match = (String(sourceValue) === values[valueIndex]);\n if (match) {\n values[valueIndex] = source[idx];\n break;\n }\n }\n }\n }\n\n value = this.bindings[VALUE].get();\n if (value instanceof ObservableArray) {\n value.splice.apply(value, [0, value.length].concat(values));\n } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined || !field)) {\n this.bindings[VALUE].set(values[0]);\n } else {\n this.bindings[VALUE].set(values[0].get(field));\n }\n },\n refresh: function() {\n var optionIndex,\n element = this.element,\n options = element.options,\n value = this.bindings[VALUE].get(),\n values = value,\n field = this.options.valueField || this.options.textField,\n found = false,\n type = this.dataType(),\n optionValue;\n\n if (!(values instanceof ObservableArray)) {\n values = new ObservableArray([value]);\n }\n\n element.selectedIndex = -1;\n\n for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\n value = values[valueIndex];\n\n\n if (field && value instanceof ObservableObject) {\n value = value.get(field);\n }\n\n if (type == \"date\") {\n value = kendo.toString(values[valueIndex], \"yyyy-MM-dd\");\n } else if (type == \"datetime-local\") {\n value = kendo.toString(values[valueIndex], \"yyyy-MM-ddTHH:mm:ss\");\n }\n\n for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\n optionValue = options[optionIndex].value;\n\n if (optionValue === \"\" && value !== \"\") {\n optionValue = options[optionIndex].text;\n }\n\n if (value != null && optionValue == value.toString()) {\n options[optionIndex].selected = true;\n found = true;\n }\n }\n }\n },\n destroy: function() {\n $(this.element).off(CHANGE, this._change);\n }\n })\n };\n\n function dataSourceBinding(bindingName, fieldName, setter) {\n return Binder.extend({\n init: function(widget, bindings, options) {\n var that = this;\n\n Binder.fn.init.call(that, widget.element[0], bindings, options);\n\n that.widget = widget;\n that._dataBinding = that.dataBinding.bind(that);\n that._dataBound = that.dataBound.bind(that);\n that._itemChange = that.itemChange.bind(that);\n },\n\n itemChange: function(e) {\n bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\n },\n\n dataBinding: function(e) {\n var idx,\n length,\n widget = this.widget,\n items = e.removedItems || widget.items();\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n unbindElementTree(items[idx], false);\n }\n },\n\n _ns: function(ns) {\n ns = ns || kendo.ui;\n var all = [ kendo.ui, kendo.dataviz.ui, kendo.mobile.ui ];\n all.splice($.inArray(ns, all), 1);\n all.unshift(ns);\n\n return kendo.rolesFromNamespaces(all);\n },\n\n dataBound: function(e) {\n var idx,\n length,\n widget = this.widget,\n items = e.addedItems || widget.items(),\n dataSource = widget[fieldName],\n view,\n parents,\n hds = kendo.data.HierarchicalDataSource;\n\n if (hds && dataSource instanceof hds) {\n // suppress binding of HDS items, because calling view() on root\n // will return only root items, and widget.items() returns all items\n return;\n }\n\n if (items.length) {\n view = e.addedDataItems || dataSource.flatView();\n parents = this.bindings[bindingName]._parents();\n\n for (idx = 0, length = view.length; idx < length; idx++) {\n if (items[idx]) {\n bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\n }\n }\n }\n },\n\n refresh: function(e) {\n var that = this,\n source,\n widget = that.widget,\n select, multiselect, dropdowntree;\n\n e = e || {};\n\n if (!e.action) {\n that.destroy();\n\n widget.bind(\"dataBinding\", that._dataBinding);\n widget.bind(\"dataBound\", that._dataBound);\n widget.bind(\"itemChange\", that._itemChange);\n\n source = that.bindings[bindingName].get();\n\n if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\n if (source instanceof kendo.data.DataSource) {\n widget[setter](source);\n } else if (source && source._dataSource) {\n widget[setter](source._dataSource);\n } else {\n select = kendo.ui.Select && widget instanceof kendo.ui.Select;\n multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n dropdowntree = kendo.ui.DropDownTree && widget instanceof kendo.ui.DropDownTree;\n\n if (!dropdowntree) {\n widget[fieldName].data(source);\n } else {\n widget.treeview[fieldName].data(source);\n }\n\n if (that.bindings.value && (select || multiselect)) {\n widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\n }\n }\n }\n }\n },\n\n destroy: function() {\n var widget = this.widget;\n\n widget.unbind(\"dataBinding\", this._dataBinding);\n widget.unbind(\"dataBound\", this._dataBound);\n widget.unbind(\"itemChange\", this._itemChange);\n }\n });\n }\n\n binders.widget = {\n events: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n this.widget = widget;\n this.handlers = {};\n },\n\n refresh: function(key) {\n var binding = this.bindings.events[key],\n handler = this.handlers[key];\n\n if (handler) {\n this.widget.unbind(key, handler);\n }\n\n handler = binding.get();\n\n this.handlers[key] = function(e) {\n e.data = binding.source;\n\n handler(e);\n\n if (e.data === binding.source) {\n delete e.data;\n }\n };\n\n this.widget.bind(key, this.handlers[key]);\n },\n\n destroy: function() {\n var handler;\n\n for (handler in this.handlers) {\n this.widget.unbind(handler, this.handlers[handler]);\n }\n }\n }),\n\n checked: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.bind(CHANGE, this._change);\n },\n change: function() {\n this.bindings[CHECKED].set(this.value());\n },\n\n refresh: function() {\n if (this.element.type === \"radio\") {\n this.widget.check(this.bindings[CHECKED].get().toString() === this.value());\n } else {\n this.widget.check(this.bindings[CHECKED].get() === true);\n }\n },\n\n value: function() {\n var element = this.element,\n value = element.value;\n\n if (value == \"on\" || value == \"off\" || this.element.type == \"checkbox\") {\n value = element.checked;\n }\n\n return value;\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n\n start: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n this._change = this.change.bind(this);\n this.widget = widget;\n this.widget.bind(CHANGE, this._change);\n },\n\n change: function() {\n this.bindings.start.set(this.widget.range().start);\n },\n\n refresh: function() {\n var that = this;\n var start = this.bindings.start.get();\n var end = that.widget._range ? that.widget._range.end : null;\n this.widget.range({ start: start, end: end });\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n\n end: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n this._change = this.change.bind(this);\n this.widget = widget;\n this.widget.bind(CHANGE, this._change);\n },\n\n change: function() {\n this.bindings.end.set(this.widget.range().end);\n },\n\n refresh: function() {\n var that = this;\n var end = this.bindings.end.get();\n var start = that.widget._range ? that.widget._range.start : null;\n this.widget.range({ start: start, end: end });\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n\n visible: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n var visible = this.bindings.visible.get();\n this.widget.wrapper[0].style.display = visible ? \"\" : \"none\";\n }\n }),\n\n invisible: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n var invisible = this.bindings.invisible.get();\n this.widget.wrapper[0].style.display = invisible ? \"none\" : \"\";\n }\n }),\n\n floatingLabel: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n if (!widget.floatingLabel) {\n return;\n }\n\n widget.floatingLabel.refresh();\n }\n }),\n\n enabled: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n if (this.widget.enable) {\n this.widget.enable(this.bindings.enabled.get());\n }\n }\n }),\n\n disabled: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n if (this.widget.enable) {\n this.widget.enable(!this.bindings.disabled.get());\n }\n }\n }),\n\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\"),\n\n value: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.first(CHANGE, this._change);\n\n var value = this.bindings.value.get();\n\n this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\n this._valueIsObservableArray = value instanceof ObservableArray;\n this._initChange = false;\n },\n\n _source: function() {\n var source;\n\n if (this.widget.dataItem) {\n source = this.widget.dataItem();\n if (source && source instanceof ObservableObject) {\n return [source];\n }\n }\n\n if (this.bindings.source) {\n source = this.bindings.source.get();\n }\n\n if (!source || source instanceof kendo.data.DataSource) {\n source = this.widget.dataSource.flatView();\n }\n\n return source;\n },\n\n change: function() {\n var value = this.widget.value(),\n field = this.options.dataValueField || this.options.dataTextField,\n isArray = toString.call(value) === \"[object Array]\",\n isObservableObject = this._valueIsObservableObject,\n valueIndex, valueLength, values = [],\n sourceItem, sourceValue,\n idx, length, source;\n\n this._initChange = true;\n\n if (field) {\n\n if (value === \"\" && (isObservableObject || this.options.valuePrimitive)) {\n value = null;\n } else {\n source = this._source();\n\n if (isArray) {\n valueLength = value.length;\n values = value.slice(0);\n }\n\n for (idx = 0, length = source.length; idx < length; idx++) {\n sourceItem = source[idx];\n sourceValue = sourceItem.get(field);\n\n if (isArray) {\n for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\n if (sourceValue == values[valueIndex]) {\n values[valueIndex] = sourceItem;\n break;\n }\n }\n } else if (sourceValue == value) {\n value = isObservableObject ? sourceItem : sourceValue;\n break;\n }\n }\n\n if (values[0]) {\n if (this._valueIsObservableArray) {\n value = values;\n } else if (isObservableObject || !field) {\n value = values[0];\n } else {\n value = values[0].get(field);\n }\n }\n }\n }\n\n this.bindings.value.set(value);\n this._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var widget = this.widget;\n var options = widget.options;\n var textField = options.dataTextField;\n var valueField = options.dataValueField || textField;\n var value = this.bindings.value.get();\n var text = options.text || \"\";\n var idx = 0, length;\n var values = [];\n\n if (value === undefined) {\n value = null;\n }\n\n if (valueField) {\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n values[idx] = value[idx].get(valueField);\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n text = value.get(textField);\n value = value.get(valueField);\n }\n }\n\n if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\n if (textField === valueField && !text) {\n text = value;\n }\n\n if (!text && (value || value === 0) && options.valuePrimitive) {\n widget.value(value);\n } else {\n widget._preselect(value, text);\n }\n } else {\n widget.value(value);\n }\n }\n\n this._initChange = false;\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n dropdowntree: {\n value: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.first(CHANGE, this._change);\n this._initChange = false;\n },\n\n change: function() {\n var that = this,\n oldValues = that.bindings[VALUE].get(),\n valuePrimitive = that.options.valuePrimitive,\n selectedNode = that.widget.treeview.select(),\n nonPrimitiveValues = that.widget._isMultipleSelection() ? that.widget._getAllChecked() : (that.widget.treeview.dataItem(selectedNode) || that.widget.value()),\n newValues = (valuePrimitive || that.widget.options.autoBind === false) ? that.widget.value() : nonPrimitiveValues;\n\n var field = this.options.dataValueField || this.options.dataTextField;\n\n newValues = newValues.slice ? newValues.slice(0) : newValues;\n\n that._initChange = true;\n\n if (oldValues instanceof ObservableArray) {\n var remove = [];\n var newLength = newValues.length;\n var i = 0, j = 0;\n var old = oldValues[i];\n var same = false;\n var removeIndex;\n var newValue;\n var found;\n\n while (old !== undefined) {\n found = false;\n for (j = 0; j < newLength; j++) {\n if (valuePrimitive) {\n same = newValues[j] == old;\n } else {\n newValue = newValues[j];\n\n newValue = newValue.get ? newValue.get(field) : newValue;\n same = newValue == (old.get ? old.get(field) : old);\n }\n\n if (same) {\n newValues.splice(j, 1);\n newLength -= 1;\n found = true;\n break;\n }\n }\n\n if (!found) {\n remove.push(old);\n arraySplice(oldValues, i, 1);\n removeIndex = i;\n } else {\n i += 1;\n }\n\n old = oldValues[i];\n }\n\n arraySplice(oldValues, oldValues.length, 0, newValues);\n\n if (remove.length) {\n oldValues.trigger(\"change\", {\n action: \"remove\",\n items: remove,\n index: removeIndex\n });\n }\n\n if (newValues.length) {\n oldValues.trigger(\"change\", {\n action: \"add\",\n items: newValues,\n index: oldValues.length - 1\n });\n }\n } else {\n that.bindings[VALUE].set(newValues);\n }\n\n that._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var options = this.options,\n widget = this.widget,\n field = options.dataValueField || options.dataTextField,\n value = this.bindings.value.get(),\n data = value,\n idx = 0, length,\n values = [],\n selectedValue;\n\n if (field) {\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n selectedValue = value[idx];\n values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n value = value.get(field);\n }\n }\n if (options.autoBind === false && options.valuePrimitive !== true) {\n widget._preselect(data, value);\n } else {\n widget.value(value);\n }\n }\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n })\n },\n gantt: {\n dependencies: dataSourceBinding(\"dependencies\", \"dependencies\", \"setDependenciesDataSource\")\n },\n\n multiselect: {\n value: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.first(CHANGE, this._change);\n this._initChange = false;\n },\n\n change: function() {\n var that = this,\n oldValues = that.bindings[VALUE].get(),\n valuePrimitive = that.options.valuePrimitive,\n newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\n\n var field = this.options.dataValueField || this.options.dataTextField;\n\n newValues = newValues.slice(0);\n\n that._initChange = true;\n\n if (oldValues instanceof ObservableArray) {\n var remove = [];\n\n var newLength = newValues.length;\n\n var i = 0, j = 0;\n var old = oldValues[i];\n var same = false;\n var removeIndex;\n var newValue;\n var found;\n\n while (old !== undefined) {\n found = false;\n for (j = 0; j < newLength; j++) {\n if (valuePrimitive) {\n same = newValues[j] == old;\n } else {\n newValue = newValues[j];\n\n newValue = newValue.get ? newValue.get(field) : newValue;\n same = newValue == (old.get ? old.get(field) : old);\n }\n\n if (same) {\n newValues.splice(j, 1);\n newLength -= 1;\n found = true;\n break;\n }\n }\n\n if (!found) {\n remove.push(old);\n arraySplice(oldValues, i, 1);\n removeIndex = i;\n } else {\n i += 1;\n }\n\n old = oldValues[i];\n }\n\n arraySplice(oldValues, oldValues.length, 0, newValues);\n\n if (remove.length) {\n oldValues.trigger(\"change\", {\n action: \"remove\",\n items: remove,\n index: removeIndex\n });\n }\n\n if (newValues.length) {\n oldValues.trigger(\"change\", {\n action: \"add\",\n items: newValues,\n index: oldValues.length - 1\n });\n }\n } else {\n that.bindings[VALUE].set(newValues);\n }\n\n that._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var options = this.options,\n widget = this.widget,\n field = options.dataValueField || options.dataTextField,\n value = this.bindings.value.get(),\n data = value,\n idx = 0, length,\n values = [],\n selectedValue;\n\n if (value === undefined) {\n value = null;\n }\n\n if (field) {\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n selectedValue = value[idx];\n values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n value = value.get(field);\n }\n }\n\n if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\n widget._preselect(data, value);\n } else {\n widget.value(value);\n }\n }\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n\n })\n },\n scheduler: {\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\").extend({\n dataBound: function(e) {\n var idx;\n var length;\n var widget = this.widget;\n var elements = e.addedItems || widget.items();\n var data, parents;\n\n if (elements.length) {\n data = e.addedDataItems || widget.dataItems();\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n }\n }\n }\n })\n },\n\n grid: {\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\").extend({\n dataBound: function(e) {\n var idx,\n length,\n widget = this.widget,\n elements = e.addedItems || widget.items(),\n parents,\n data;\n\n if (elements.length) {\n data = e.addedDataItems || widget.dataItems();\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n }\n }\n }\n })\n },\n\n badge: {\n text: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n refresh: function() {\n var text = this.bindings.text.get();\n\n if (text == null) {\n text = \"\";\n }\n this.widget.text(text);\n }\n })\n }\n };\n\n var arraySplice = function(arr, idx, remove, add) {\n add = add || [];\n remove = remove || 0;\n\n var addLength = add.length;\n var oldLength = arr.length;\n\n var shifted = [].slice.call(arr, idx + remove);\n var shiftedLength = shifted.length;\n var index;\n\n if (addLength) {\n addLength = idx + addLength;\n index = 0;\n\n for (; idx < addLength; idx++) {\n arr[idx] = add[index];\n index++;\n }\n\n arr.length = addLength;\n } else if (remove) {\n arr.length = idx;\n\n remove += idx;\n while (idx < remove) {\n delete arr[--remove];\n }\n }\n\n if (shiftedLength) {\n shiftedLength = idx + shiftedLength;\n index = 0;\n\n for (; idx < shiftedLength; idx++) {\n arr[idx] = shifted[index];\n index++;\n }\n\n arr.length = shiftedLength;\n }\n\n idx = arr.length;\n\n while (idx < oldLength) {\n delete arr[idx];\n idx++;\n }\n };\n\n var BindingTarget = Class.extend( {\n init: function(target, options) {\n this.target = target;\n this.options = options;\n this.toDestroy = [];\n },\n\n bind: function(bindings) {\n var key,\n hasValue,\n hasSource,\n hasEvents,\n hasChecked,\n hasCss,\n widgetBinding = this instanceof WidgetBindingTarget,\n specificBinders = this.binders();\n\n for (key in bindings) {\n if (key == VALUE) {\n hasValue = true;\n } else if (key == SOURCE) {\n hasSource = true;\n } else if (key == EVENTS && !widgetBinding) {\n hasEvents = true;\n } else if (key == CHECKED) {\n hasChecked = true;\n } else if (key == CSS) {\n hasCss = true;\n } else {\n this.applyBinding(key, bindings, specificBinders);\n }\n }\n if (hasSource) {\n this.applyBinding(SOURCE, bindings, specificBinders);\n }\n\n if (hasValue) {\n this.applyBinding(VALUE, bindings, specificBinders);\n }\n\n if (hasChecked) {\n this.applyBinding(CHECKED, bindings, specificBinders);\n }\n\n if (hasEvents && !widgetBinding) {\n this.applyBinding(EVENTS, bindings, specificBinders);\n }\n\n if (hasCss && !widgetBinding) {\n this.applyBinding(CSS, bindings, specificBinders);\n }\n\n if (widgetBinding && this.target && this.target.floatingLabel) {\n this.applyBinding(\"floatingLabel\", bindings, specificBinders);\n }\n },\n\n binders: function() {\n return binders[this.target.nodeName.toLowerCase()] || {};\n },\n\n applyBinding: function(name, bindings, specificBinders) {\n var binder = specificBinders[name] || binders[name],\n toDestroy = this.toDestroy,\n attribute,\n binding = bindings[name];\n\n if (binder) {\n binder = new binder(this.target, bindings, this.options);\n\n toDestroy.push(binder);\n\n if (binding instanceof Binding) {\n binder.bind(binding);\n toDestroy.push(binding);\n } else {\n for (attribute in binding) {\n binder.bind(binding, attribute);\n toDestroy.push(binding[attribute]);\n }\n }\n } else if (name !== \"template\") {\n throw new Error(\"The \" + name + \" binding is not supported by the \" + this.target.nodeName.toLowerCase() + \" element\");\n }\n },\n\n destroy: function() {\n var idx,\n length,\n toDestroy = this.toDestroy;\n\n for (idx = 0, length = toDestroy.length; idx < length; idx++) {\n toDestroy[idx].destroy();\n }\n }\n });\n\n var WidgetBindingTarget = BindingTarget.extend( {\n binders: function() {\n return binders.widget[this.target.options.name.toLowerCase()] || {};\n },\n\n applyBinding: function(name, bindings, specificBinders) {\n var binder = specificBinders[name] || binders.widget[name],\n toDestroy = this.toDestroy,\n attribute,\n binding = bindings[name];\n\n if (binder) {\n binder = new binder(this.target, bindings, this.target.options);\n\n toDestroy.push(binder);\n\n\n if (binding instanceof Binding) {\n binder.bind(binding);\n toDestroy.push(binding);\n } else {\n for (attribute in binding) {\n binder.bind(binding, attribute);\n toDestroy.push(binding[attribute]);\n }\n }\n } else {\n throw new Error(\"The \" + name + \" binding is not supported by the \" + this.target.options.name + \" widget\");\n }\n }\n });\n\n function bindingTargetForRole(element, roles) {\n var widget = kendo.initWidget(element, {}, roles);\n\n if (widget) {\n return new WidgetBindingTarget(widget);\n }\n }\n\n var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g,\n whiteSpaceRegExp = /\\s/g;\n\n function parseBindings(bind) {\n var result = {},\n idx,\n length,\n token,\n colonIndex,\n key,\n value,\n tokens;\n\n tokens = bind.match(keyValueRegExp);\n\n for (idx = 0, length = tokens.length; idx < length; idx++) {\n token = tokens[idx];\n colonIndex = token.indexOf(\":\");\n\n key = token.substring(0, colonIndex);\n value = token.substring(colonIndex + 1);\n\n if (value.charAt(0) == \"{\") {\n value = parseBindings(value);\n }\n\n result[key] = value;\n }\n\n return result;\n }\n\n function createBindings(bindings, source, type) {\n var binding,\n result = {};\n\n for (binding in bindings) {\n result[binding] = new type(source, bindings[binding]);\n }\n\n return result;\n }\n\n function bindElement(element, source, roles, parents) {\n\n if (!element || element.getAttribute(\"data-\" + kendo.ns + \"stop\")) {\n return;\n }\n\n var role = element.getAttribute(\"data-\" + kendo.ns + \"role\"),\n idx,\n bind = element.getAttribute(\"data-\" + kendo.ns + \"bind\"),\n childrenCopy = [],\n deep = true,\n bindings,\n options = {},\n target;\n\n parents = parents || [source];\n\n if (role || bind) {\n unbindElement(element, false);\n }\n\n if (role) {\n target = bindingTargetForRole(element, roles);\n }\n\n if (bind) {\n bind = parseBindings(bind.replace(whiteSpaceRegExp, \"\"));\n\n if (!target) {\n options = kendo.parseOptions(element, { textField: \"\", valueField: \"\", template: \"\", valueUpdate: CHANGE, valuePrimitive: false, autoBind: true }, source);\n options.roles = roles;\n target = new BindingTarget(element, options);\n }\n\n target.source = source;\n\n bindings = createBindings(bind, parents, Binding);\n\n if (options.template) {\n bindings.template = new TemplateBinding(parents, \"\", options.template);\n }\n\n if (bindings.click) {\n bind.events = bind.events || {};\n bind.events.click = bind.click;\n bindings.click.destroy();\n delete bindings.click;\n }\n\n if (bindings.source) {\n deep = false;\n }\n\n if (bind.attr) {\n bindings.attr = createBindings(bind.attr, parents, Binding);\n }\n\n if (bind.style) {\n bindings.style = createBindings(bind.style, parents, Binding);\n }\n\n if (bind.events) {\n bindings.events = createBindings(bind.events, parents, EventBinding);\n }\n\n if (bind.css) {\n bindings.css = createBindings(bind.css, parents, Binding);\n }\n\n target.bind(bindings);\n }\n\n if (target) {\n element.kendoBindingTarget = target;\n }\n\n var children = element.children;\n if (deep && children && !element.getAttribute(\"data-\" + kendo.ns + \"stop\")) {\n // https://github.com/telerik/kendo/issues/1240 for the weirdness.\n for (idx = 0; idx < children.length; idx++) {\n childrenCopy[idx] = children[idx];\n }\n\n for (idx = 0; idx < childrenCopy.length; idx++) {\n bindElement(childrenCopy[idx], source, roles, parents);\n }\n }\n }\n\n function bind(dom, object) {\n var idx,\n length,\n node,\n roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\n\n object = kendo.observable(object);\n dom = $(dom);\n\n for (idx = 0, length = dom.length; idx < length; idx++) {\n node = dom[idx];\n if (node.nodeType === 1) {\n bindElement(node, object, roles);\n }\n }\n }\n\n function unbindElement(element, destroyWidget) {\n var bindingTarget = element.kendoBindingTarget;\n\n if (bindingTarget) {\n bindingTarget.destroy();\n\n if (deleteExpando) {\n delete element.kendoBindingTarget;\n } else if (element.removeAttribute) {\n element.removeAttribute(\"kendoBindingTarget\");\n } else {\n element.kendoBindingTarget = null;\n }\n }\n\n if (destroyWidget) {\n var widget = kendo.widgetInstance($(element));\n if (widget && typeof widget.destroy === FUNCTION) {\n widget.destroy();\n }\n }\n }\n\n function unbindElementTree(element, destroyWidgets) {\n unbindElement(element, destroyWidgets);\n\n unbindElementChildren(element, destroyWidgets);\n }\n\n function unbindElementChildren(element, destroyWidgets) {\n var children = element.children;\n\n if (children) {\n for (var idx = 0, length = children.length; idx < length; idx++) {\n unbindElementTree(children[idx], destroyWidgets);\n }\n }\n }\n\n function unbind(dom) {\n var idx, length;\n\n dom = $(dom);\n\n for (idx = 0, length = dom.length; idx < length; idx++ ) {\n unbindElementTree(dom[idx], false);\n }\n }\n\n function notify(widget, namespace) {\n var element = widget.element,\n bindingTarget = element[0].kendoBindingTarget;\n\n if (bindingTarget) {\n bind(element, bindingTarget.source, namespace);\n }\n }\n\n function retrievePrimitiveValues(value, valueField) {\n var values = [];\n var idx = 0;\n var length;\n var item;\n\n if (!valueField) {\n return value;\n }\n\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n item = value[idx];\n values[idx] = item.get ? item.get(valueField) : item[valueField];\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n value = value.get(valueField);\n }\n\n return value;\n }\n\n kendo.unbind = unbind;\n kendo.bind = bind;\n kendo.data.binders = binders;\n kendo.data.Binder = Binder;\n kendo.notify = notify;\n\n kendo.observable = function(object) {\n if (!(object instanceof ObservableObject)) {\n object = new ObservableObject(object);\n }\n\n return object;\n };\n\n kendo.observableHierarchy = function(array) {\n var dataSource = kendo.data.HierarchicalDataSource.create(array);\n\n function recursiveRead(data) {\n var i, children;\n\n for (i = 0; i < data.length; i++) {\n data[i]._initChildren();\n\n children = data[i].children;\n\n children.fetch();\n\n data[i].items = children.data();\n\n recursiveRead(data[i].items);\n }\n }\n\n dataSource.fetch();\n\n recursiveRead(dataSource.data());\n\n dataSource._data._dataSource = dataSource;\n\n return dataSource._data;\n };\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.validator',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"validator\",\n name: \"Validator\",\n category: \"web\",\n description: \"The Validator offers an easy way to do a client-side form validation.\",\n depends: [ \"core\" ]\n};\n\n\n(function($, undefined) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n NS = \".kendoValidator\",\n INVALIDMSG = \"k-invalid-msg\",\n invalidMsgRegExp = new RegExp(INVALIDMSG,'i'),\n INVALIDINPUT = \"k-invalid\",\n VALIDINPUT = \"k-valid\",\n VALIDATIONSUMMARY = \"k-validation-summary\",\n INVALIDLABEL = \"k-text-error\",\n MESSAGEBOX = \"k-messagebox k-messagebox-error\",\n INPUTINNER = \".k-input-inner\",\n INPUTWRAPPER = \".k-input\",\n ARIAINVALID = \"aria-invalid\",\n ARIADESCRIBEDBY = \"aria-describedby\",\n emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i,\n urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i,\n INPUTSELECTOR = \":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])\",\n CHECKBOXSELECTOR = \":checkbox:not([disabled],[readonly])\",\n NUMBERINPUTSELECTOR = \"[type=number],[type=range]\",\n BLUR = \"blur\",\n NAME = \"name\",\n FORM = \"form\",\n NOVALIDATE = \"novalidate\",\n //events\n VALIDATE = \"validate\",\n CHANGE = \"change\",\n VALIDATE_INPUT = \"validateInput\",\n\n patternMatcher = function(value, pattern) {\n if (typeof pattern === \"string\") {\n pattern = new RegExp('^(?:' + pattern + ')$');\n }\n return pattern.test(value);\n },\n matcher = function(input, selector, pattern) {\n var value = input.val();\n\n if (input.filter(selector).length && value !== \"\") {\n return patternMatcher(value, pattern);\n }\n return true;\n },\n hasAttribute = function(input, name) {\n if (input.length) {\n return input[0].attributes[name] != null;\n }\n return false;\n };\n\n if (!kendo.ui.validator) {\n kendo.ui.validator = { rules: {}, messages: {}, allowSubmit: $.noop, validateOnInit: $.noop };\n }\n\n function resolveRules(element) {\n var resolvers = kendo.ui.validator.ruleResolvers || {},\n rules = {},\n name;\n\n for (name in resolvers) {\n $.extend(true, rules, resolvers[name].resolve(element));\n }\n return rules;\n }\n\n function decode(value) {\n return value.replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>');\n }\n\n function numberOfDecimalDigits(value) {\n value = (value + \"\").split('.');\n if (value.length > 1) {\n return value[1].length;\n }\n return 0;\n }\n\n function parseHtml(text) {\n if ($.parseHTML) {\n return $($.parseHTML(text));\n }\n return $(text);\n }\n\n function searchForMessageContainer(elements, fieldName) {\n var containers = $(),\n element,\n attr;\n\n for (var idx = 0, length = elements.length; idx < length; idx++) {\n element = elements[idx];\n if (invalidMsgRegExp.test(element.className)) {\n attr = element.getAttribute(kendo.attr(\"for\"));\n if (attr === fieldName) {\n containers = containers.add(element);\n }\n }\n }\n return containers;\n }\n\n function isLabelFor(label, element) {\n if (!label) {\n return false;\n }\n if (typeof label.nodeName !== 'string' || label.nodeName !== 'LABEL') {\n return false;\n }\n if (typeof label.getAttribute('for') !== 'string' || typeof element.getAttribute('id') !== 'string') {\n return false;\n }\n if (label.getAttribute('for') !== element.getAttribute('id')) {\n return false;\n }\n\n return true;\n }\n\n var SUMMARYTEMPLATE = '';\n\n var Validator = Widget.extend({\n init: function(element, options) {\n var that = this,\n resolved = resolveRules(element),\n validateAttributeSelector = \"[\" + kendo.attr(\"validate\") + \"!=false]\";\n\n options = options || {};\n\n options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n\n Widget.fn.init.call(that, element, options);\n\n that._errorTemplate = kendo.template(that.options.errorTemplate);\n that._summaryTemplate = kendo.template(that.options.validationSummary.template || SUMMARYTEMPLATE);\n\n if (that.element.is(FORM)) {\n that.element.attr(NOVALIDATE, NOVALIDATE);\n }\n\n that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n\n that._errors = {};\n that._attachEvents();\n that._isValidated = false;\n\n if (that._validateOnInit()) {\n that.validate();\n }\n },\n\n events: [ VALIDATE, CHANGE, VALIDATE_INPUT ],\n\n options: {\n name: \"Validator\",\n errorTemplate: '#= message #',\n messages: {\n required: \"{0} is required\",\n pattern: \"{0} is not valid\",\n min: \"{0} should be greater than or equal to {1}\",\n max: \"{0} should be smaller than or equal to {1}\",\n step: \"{0} is not valid\",\n email: \"{0} is not valid email\",\n url: \"{0} is not valid URL\",\n date: \"{0} is not valid date\",\n dateCompare: \"End date should be greater than or equal to the start date\",\n captcha: \"The text you entered doesn't match the image.\"\n },\n rules: {\n required: function(input) {\n var noNameCheckbox = !input.attr(\"name\") && !input.is(\":checked\"),\n name = input.attr(\"name\"),\n quote = !!name && name.indexOf(\"'\") > -1 ? '\\\"' : \"'\",\n namedCheckbox = input.attr(\"name\") && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\n checkbox = input.filter(\"[type=checkbox]\").length && (noNameCheckbox || namedCheckbox),\n radio = input.filter(\"[type=radio]\").length && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\n value = input.val();\n\n return !(hasAttribute(input, \"required\") && (!value || value === \"\" || value.length === 0 || checkbox || radio));\n },\n pattern: function(input) {\n if (input.filter(\"[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]\").filter(\"[pattern]\").length && input.val() !== \"\") {\n return patternMatcher(input.val(), input.attr(\"pattern\"));\n }\n return true;\n },\n min: function(input) {\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[min]\").length && input.val() !== \"\") {\n var min = parseFloat(input.attr(\"min\")) || 0,\n val = kendo.parseFloat(input.val());\n\n return min <= val;\n }\n return true;\n },\n max: function(input) {\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[max]\").length && input.val() !== \"\") {\n var max = parseFloat(input.attr(\"max\")) || 0,\n val = kendo.parseFloat(input.val());\n\n return max >= val;\n }\n return true;\n },\n step: function(input) {\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[step]\").length && input.val() !== \"\") {\n var min = parseFloat(input.attr(\"min\")) || 0,\n step = parseFloat(input.attr(\"step\")) || 1,\n val = parseFloat(input.val()),\n decimals = numberOfDecimalDigits(step),\n raise;\n\n if (decimals) {\n raise = Math.pow(10, decimals);\n return ((Math.floor((val - min) * raise)) % (step * raise)) / Math.pow(100, decimals) === 0;\n }\n return ((val - min) % step) === 0;\n }\n return true;\n },\n email: function(input) {\n return matcher(input, \"[type=email],[\" + kendo.attr(\"type\") + \"=email]\", emailRegExp);\n },\n url: function(input) {\n return matcher(input, \"[type=url],[\" + kendo.attr(\"type\") + \"=url]\", urlRegExp);\n },\n date: function(input) {\n if (input.filter(\"[type^=date],[\" + kendo.attr(\"type\") + \"=date]\").length && input.val() !== \"\") {\n return kendo.parseDate(input.val(), input.attr(kendo.attr(\"format\"))) !== null;\n }\n return true;\n },\n captcha: function(input) {\n if (input.filter(\"[\" + kendo.attr(\"role\") + \"=captcha]\").length) {\n var that = this,\n captcha = kendo.widgetInstance(input),\n isValidated = function(isValid) {\n return typeof(isValid) !== 'undefined' && isValid !== null;\n };\n\n if (!input.data(\"captcha_validating\") && !isValidated(captcha.isValid()) && !!captcha.getCaptchaId()) {\n input.data(\"captcha_validating\", true);\n that._validating = true;\n captcha.validate().done(function() {\n that._validating = false;\n that._checkElement(input);\n }).fail(function(data) {\n that._validating = false;\n if (data.error && data.error === \"handler_not_defined\") {\n window.console.warn(\"Captcha's validationHandler is not defined! You should either define a proper validation endpoint or declare a callback function to ensure the required behavior.\");\n }\n });\n }\n\n if (isValidated(captcha.isValid())) {\n input.removeData(\"captcha_validating\");\n return captcha.isValid();\n }\n }\n return true;\n }\n },\n validateOnBlur: true,\n validationSummary: false\n },\n\n _allowSubmit: function() {\n return kendo.ui.validator.allowSubmit(this.element, this.errors());\n },\n\n _validateOnInit: function() {\n return kendo.ui.validator.validateOnInit(this.element);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.element.off(NS);\n\n if (this.validationSummary) {\n this.validationSummary.off(NS);\n this.validationSummary = null;\n }\n },\n\n value: function() {\n if (!this._isValidated) {\n return false;\n }\n\n return this.errors().length === 0;\n },\n\n _submit: function(e) {\n if ((!this.validate() && !this._allowSubmit()) || this._validating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n e.preventDefault();\n return false;\n }\n return true;\n },\n\n _checkElement: function(element) {\n var state = this.value();\n\n this.validateInput(element);\n\n if (this.value() !== state) {\n this.trigger(CHANGE);\n }\n },\n\n _attachEvents: function() {\n var that = this;\n\n if (that.element.is(FORM)) {\n that.element.on(\"submit\" + NS, that._submit.bind(that));\n }\n\n if (that.options.validateOnBlur) {\n if (!that.element.is(INPUTSELECTOR)) {\n that.element.on(BLUR + NS, that._inputSelector, function() {\n that._checkElement($(this));\n });\n\n that.element.on(\"click\" + NS, that._checkboxSelector, function() {\n that._checkElement($(this));\n });\n } else {\n that.element.on(BLUR + NS, function() {\n that._checkElement(that.element);\n });\n\n if (that.element.is(CHECKBOXSELECTOR)) {\n that.element.on(\"click\" + NS, function() {\n that._checkElement(that.element);\n });\n }\n }\n }\n },\n\n validate: function() {\n var inputs;\n var idx;\n var result = false;\n var length;\n\n var isValid = this.value();\n\n this._errors = {};\n\n if (!this.element.is(INPUTSELECTOR)) {\n var invalid = false;\n\n inputs = this.element.find(this._inputSelector);\n\n for (idx = 0, length = inputs.length; idx < length; idx++) {\n if (!this.validateInput(inputs.eq(idx))) {\n invalid = true;\n }\n }\n\n result = !invalid;\n } else {\n result = this.validateInput(this.element);\n }\n\n if (this.options.validationSummary && !isValid) {\n this.showValidationSummary();\n }\n\n this.trigger(VALIDATE, { valid: result, errors: this.errors() });\n\n if (isValid !== result) {\n this.trigger(CHANGE);\n }\n\n return result;\n },\n\n validateInput: function(input) {\n input = $(input);\n\n\n this._isValidated = true;\n\n var that = this,\n template = that._errorTemplate,\n result = that._checkValidity(input),\n valid = result.valid,\n widgetInstance,\n className = \".\" + INVALIDMSG,\n fieldName = (input.attr(NAME) || \"\"),\n lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function() {\n var element = $(this);\n if (element.filter(\"[\" + kendo.attr(\"for\") + \"]\").length) {\n return element.attr(kendo.attr(\"for\")) === fieldName;\n }\n\n return true;\n\n })).addClass(\"k-hidden\"),\n messageText = !valid ? that._extractMessage(input, result.key) : \"\",\n messageLabel = !valid ? parseHtml(template({ message: decode(messageText), field: fieldName })) : \"\",\n wasValid = !input.attr(ARIAINVALID),\n isInputInner = input.is(INPUTINNER),\n inputWrapper = input.parent(INPUTWRAPPER);\n\n input.removeAttr(ARIAINVALID);\n\n if (input.hasClass(\"k-hidden\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-signature\"));\n }\n\n if (!valid && !input.data(\"captcha_validating\")) {\n that._errors[fieldName] = messageText;\n var lblId = lbl.attr('id');\n\n that._decorateMessageContainer(messageLabel, fieldName);\n\n\n if (lblId) {\n messageLabel.attr('id', lblId);\n }\n\n if (lbl.length !== 0) {\n lbl.replaceWith(messageLabel);\n } else {\n widgetInstance = widgetInstance || kendo.widgetInstance(input);\n var parentElement = input.parent().get(0);\n var nextElement = input.next().get(0);\n var prevElement = input.prev().get(0);\n\n // Get the instance of the RadioGroup which is not initialized on the input element\n if (!widgetInstance && input.is(\"[type=radio]\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-radio-list\"));\n }\n\n // Get the instance of the CheckBoxGroup which is not initialized on the input element\n if (!widgetInstance && input.is(\"[type=checkbox]\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-checkbox-list\"));\n }\n\n if (widgetInstance && widgetInstance.wrapper && (widgetInstance.element !== widgetInstance.wrapper || widgetInstance.options.name == \"Signature\")) {\n messageLabel.insertAfter(widgetInstance.wrapper);\n } else if (parentElement && parentElement.nodeName === \"LABEL\") {\n // Input inside label\n messageLabel.insertAfter(parentElement);\n } else if (nextElement && isLabelFor(nextElement, input[0])) {\n // Input before label\n messageLabel.insertAfter(nextElement);\n } else if (prevElement && isLabelFor(prevElement, input[0])) {\n // Input after label\n messageLabel.insertAfter(input);\n } else if (isInputInner && inputWrapper.length) {\n // Input after input wrapper\n messageLabel.insertAfter(inputWrapper);\n } else {\n messageLabel.insertAfter(input);\n }\n }\n\n messageLabel.removeClass(\"k-hidden\");\n\n input.attr(ARIAINVALID, true);\n } else {\n delete that._errors[fieldName];\n }\n\n if (wasValid !== valid) {\n this.trigger(VALIDATE_INPUT, { valid: valid, input: input, error: messageText, field: fieldName });\n }\n\n widgetInstance = (widgetInstance && widgetInstance.options.name == \"Signature\") ? widgetInstance : kendo.widgetInstance(input);\n if (!widgetInstance || !(widgetInstance._inputWrapper || widgetInstance.wrapper)) {\n input.toggleClass(INVALIDINPUT, !valid);\n input.toggleClass(VALIDINPUT, valid);\n }\n\n if (widgetInstance) {\n var inputWrap = widgetInstance._inputWrapper || widgetInstance.wrapper;\n var inputLabel = widgetInstance._inputLabel;\n\n if (inputWrap) {\n inputWrap.toggleClass(INVALIDINPUT, !valid);\n inputWrap.toggleClass(VALIDINPUT, valid);\n }\n if (inputLabel) {\n inputLabel.toggleClass(INVALIDLABEL, !valid);\n }\n }\n\n if (wasValid !== valid) {\n var errorId = messageLabel ? messageLabel.attr(\"id\") : lbl.attr(\"id\");\n\n that._associateMessageContainer(input, errorId);\n\n if (this.options.validationSummary && this.options.validateOnBlur) {\n this.showValidationSummary();\n }\n }\n\n return valid;\n },\n\n hideMessages: function() {\n var that = this,\n className = \".\" + INVALIDMSG,\n element = that.element;\n\n that._disassociateMessageContainers();\n\n if (!element.is(INPUTSELECTOR)) {\n element.find(className).addClass(\"k-hidden\");\n } else {\n element.next(className).addClass(\"k-hidden\");\n }\n },\n\n reset: function() {\n var that = this,\n inputs = that.element.find(\".\" + INVALIDINPUT),\n labels = that.element.find(\".\" + INVALIDLABEL);\n\n that._errors = [];\n\n that.hideMessages();\n\n that.hideValidationSummary();\n\n inputs.removeAttr(ARIAINVALID);\n inputs.removeClass(INVALIDINPUT);\n labels.removeClass(INVALIDLABEL);\n },\n\n _findMessageContainer: function(fieldName) {\n var locators = kendo.ui.validator.messageLocators,\n name,\n containers = $();\n\n for (var idx = 0, length = this.element.length; idx < length; idx++) {\n containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName(\"*\"), fieldName));\n }\n\n for (name in locators) {\n containers = containers.add(locators[name].locate(this.element, fieldName));\n }\n\n return containers;\n },\n\n _decorateMessageContainer: function(container, fieldName) {\n var locators = kendo.ui.validator.messageLocators,\n name;\n\n container.addClass(INVALIDMSG)\n .attr(kendo.attr(\"for\"), fieldName || \"\");\n\n if (!container.attr(\"id\")) {\n container.attr(\"id\", fieldName + \"-error\");\n }\n\n for (name in locators) {\n locators[name].decorate(container, fieldName);\n }\n },\n\n _extractMessage: function(input, ruleKey) {\n var that = this,\n customMessage = that.options.messages[ruleKey],\n fieldName = input.attr(NAME),\n nonDefaultMessage;\n\n if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\n nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n }\n\n customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n\n return kendo.format(input.attr(kendo.attr(ruleKey + \"-msg\")) || input.attr(\"validationMessage\") || nonDefaultMessage || customMessage || input.attr(\"title\") || \"\",\n fieldName,\n input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n },\n\n _checkValidity: function(input) {\n var rules = this.options.rules,\n rule;\n\n for (rule in rules) {\n if (!rules[rule].call(this, input)) {\n return { valid: false, key: rule };\n }\n }\n\n return { valid: true };\n },\n\n errors: function() {\n var results = [],\n errors = this._errors,\n error;\n\n for (error in errors) {\n results.push(errors[error]);\n }\n return results;\n },\n\n setOptions: function(options) {\n if (options.validationSummary) {\n this.hideValidationSummary();\n }\n\n kendo.deepExtend(this.options, options);\n\n this.destroy();\n\n this.init(this.element, this.options);\n\n this._setEvents(this.options);\n },\n\n _getInputNames: function() {\n var that = this,\n inputs = that.element.find(that._inputSelector),\n sorted = [];\n\n for (var idx = 0, length = inputs.length; idx < length; idx++) {\n var input = $(inputs[idx]);\n\n if (hasAttribute(input, NAME)) {\n // Add current name if:\n // - not present so far;\n // - present but not part of CheckBoxGroup or RadioGroup.\n if (sorted.indexOf(input.attr(NAME)) === -1 ||\n (input.closest(\".k-checkbox-list\").length === 0 &&\n input.closest(\".k-radio-list\").length === 0)) {\n sorted.push(input.attr(NAME));\n }\n }\n }\n\n return sorted;\n },\n\n _associateMessageContainer: function(input, errorId) {\n var nextFocusable = kendo.getWidgetFocusableElement(input);\n\n if (!nextFocusable || !errorId) {\n return;\n }\n\n kendo.toggleAttribute(nextFocusable, ARIADESCRIBEDBY, errorId);\n },\n\n _disassociateMessageContainers: function() {\n var that = this,\n inputs = that.element.find(\".\" + INVALIDINPUT).addBack(),\n input, errorId;\n\n for (var i = 0; i < inputs.length; i += 1) {\n input = $(inputs[i]);\n\n if (input.is(\"input\")) {\n errorId = that._findMessageContainer(input.attr(NAME))\n .add(input.next(\".\" + INVALIDMSG))\n .attr(\"id\");\n\n that._associateMessageContainer(input, errorId);\n }\n }\n },\n\n _errorsByName: function() {\n var that = this,\n inputNames = that._getInputNames(),\n sorted = [];\n\n for (var i = 0; i < inputNames.length; i += 1) {\n var name = inputNames[i];\n\n if (that._errors[name]) {\n sorted.push({\n field: name,\n message: that._errors[name]\n });\n }\n }\n\n return sorted;\n },\n\n _renderSummary: function() {\n var that = this,\n options = this.options.validationSummary,\n element = this.element,\n prevElement = element.prev(),\n container;\n\n if (options.container) {\n container = $(options.container);\n } else if (prevElement && prevElement.hasClass(VALIDATIONSUMMARY)) {\n container = prevElement;\n } else {\n container = $(\"
    \").insertBefore(that.element);\n }\n\n container.addClass([VALIDATIONSUMMARY, MESSAGEBOX].join(\" \"));\n container.attr(\"role\", \"alert\");\n\n container.on(\"click\" + NS, that._summaryClick.bind(that));\n\n return container;\n },\n\n _summaryClick: function(e) {\n e.preventDefault();\n\n var that = this,\n link = $(e.target),\n target = that.element.find(\"[name='\" + link.data(\"field\") + \"']\"),\n nextFocusable;\n\n if (!target.length) {\n return;\n }\n\n nextFocusable = kendo.getWidgetFocusableElement(target);\n\n if (nextFocusable) {\n nextFocusable.trigger(\"focus\");\n }\n },\n\n showValidationSummary: function() {\n var that = this,\n summary = that.validationSummary,\n errors = that._errorsByName(),\n errorsList;\n\n if (!summary) {\n summary = that.validationSummary = that._renderSummary();\n }\n\n errorsList = parseHtml(that._summaryTemplate({\n errors: errors\n }));\n\n summary.html(errorsList);\n\n summary.toggleClass(\"k-hidden\", !errors.length);\n },\n\n hideValidationSummary: function() {\n var that = this,\n summary = that.validationSummary;\n\n if (!summary) {\n return;\n }\n\n summary.addClass(\"k-hidden\");\n }\n });\n\n kendo.ui.plugin(Validator);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.router',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"router\",\n name: \"Router\",\n category: \"framework\",\n description: \"The Router class is responsible for tracking the application state and navigating between the application states.\",\n depends: [ \"core\" ],\n hidden: false\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n CHANGE = \"change\",\n BACK = \"back\",\n SAME = \"same\",\n support = kendo.support,\n location = window.location,\n history = window.history,\n CHECK_URL_INTERVAL = 50,\n BROKEN_BACK_NAV = kendo.support.browser.msie,\n hashStrip = /^#*/,\n document = window.document;\n\n function absoluteURL(path, pathPrefix) {\n if (!pathPrefix) {\n return path;\n }\n\n if (path + \"/\" === pathPrefix) {\n path = pathPrefix;\n }\n\n var regEx = new RegExp(\"^\" + pathPrefix, \"i\");\n\n if (!regEx.test(path)) {\n path = pathPrefix + \"/\" + path;\n }\n\n return location.protocol + '//' + (location.host + \"/\" + path).replace(/\\/\\/+/g, '/');\n }\n\n function hashDelimiter(bang) {\n return bang ? \"#!\" : \"#\";\n }\n\n function locationHash(hashDelimiter) {\n var href = location.href;\n\n // ignore normal anchors if in hashbang mode - however, still return \"\" if no hash present\n if (hashDelimiter === \"#!\" && href.indexOf(\"#\") > -1 && href.indexOf(\"#!\") < 0) {\n return null;\n }\n\n return href.split(hashDelimiter)[1] || \"\";\n }\n\n function stripRoot(root, url) {\n if (url.indexOf(root) === 0) {\n return (url.substr(root.length)).replace(/\\/\\//g, '/');\n } else {\n return url;\n }\n }\n\n var HistoryAdapter = kendo.Class.extend({\n back: function() {\n if (BROKEN_BACK_NAV) {\n setTimeout(function() { history.back(); });\n } else {\n history.back();\n }\n },\n\n forward: function() {\n if (BROKEN_BACK_NAV) {\n setTimeout(function() { history.forward(); });\n } else {\n history.forward();\n }\n },\n\n length: function() {\n return history.length;\n },\n\n replaceLocation: function(url) {\n location.replace(url);\n }\n });\n\n var PushStateAdapter = HistoryAdapter.extend({\n init: function(root) {\n this.root = root;\n },\n\n navigate: function(to) {\n history.pushState({}, document.title, absoluteURL(to, this.root));\n },\n\n replace: function(to) {\n history.replaceState({}, document.title, absoluteURL(to, this.root));\n },\n\n normalize: function(url) {\n return stripRoot(this.root, url);\n },\n\n current: function() {\n var current = location.pathname;\n\n if (location.search) {\n current += location.search;\n }\n\n return stripRoot(this.root, current);\n },\n\n change: function(callback) {\n $(window).bind(\"popstate.kendo\", callback);\n },\n\n stop: function() {\n $(window).unbind(\"popstate.kendo\");\n },\n\n normalizeCurrent: function(options) {\n var fixedUrl,\n root = options.root,\n pathname = location.pathname,\n hash = locationHash(hashDelimiter(options.hashBang));\n\n if (root === pathname + \"/\") {\n fixedUrl = root;\n }\n\n if (root === pathname && hash) {\n fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n }\n\n if (fixedUrl) {\n history.pushState({}, document.title, fixedUrl);\n }\n }\n });\n\n function fixHash(url) {\n return url.replace(/^(#)?/, \"#\");\n }\n\n function fixBang(url) {\n return url.replace(/^(#(!)?)?/, \"#!\");\n }\n\n var HashAdapter = HistoryAdapter.extend({\n init: function(bang) {\n this._id = kendo.guid();\n this.prefix = hashDelimiter(bang);\n this.fix = bang ? fixBang : fixHash;\n },\n\n navigate: function(to) {\n location.hash = this.fix(to);\n },\n\n replace: function(to) {\n this.replaceLocation(this.fix(to));\n },\n\n normalize: function(url) {\n if (url.indexOf(this.prefix) < 0) {\n return url;\n } else {\n return url.split(this.prefix)[1];\n }\n },\n\n change: function(callback) {\n if (support.hashChange) {\n $(window).on(\"hashchange.\" + this._id, callback);\n } else {\n this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n }\n },\n\n stop: function() {\n $(window).off(\"hashchange.\" + this._id);\n clearInterval(this._interval);\n },\n\n current: function() {\n return locationHash(this.prefix);\n },\n\n normalizeCurrent: function(options) {\n var pathname = location.pathname,\n root = options.root;\n\n if (options.pushState && root !== pathname) {\n this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n return true; // browser will reload at this point.\n }\n\n return false;\n }\n });\n\n var History = kendo.Observable.extend({\n start: function(options) {\n options = options || {};\n\n this.bind([CHANGE, BACK, SAME], options);\n\n if (this._started) {\n return;\n }\n\n this._started = true;\n\n options.root = options.root || \"/\";\n\n var adapter = this.createAdapter(options),\n current;\n\n // adapter may reload the document\n if (adapter.normalizeCurrent(options)) {\n return;\n }\n\n current = adapter.current();\n\n $.extend(this, {\n adapter: adapter,\n root: options.root,\n historyLength: adapter.length(),\n current: current,\n locations: [current]\n });\n\n adapter.change(this._checkUrl.bind(this));\n },\n\n createAdapter: function(options) {\n return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n },\n\n stop: function() {\n if (!this._started) {\n return;\n }\n this.adapter.stop();\n this.unbind(CHANGE);\n this._started = false;\n },\n\n change: function(callback) {\n this.bind(CHANGE, callback);\n },\n\n replace: function(to, silent) {\n\n this._navigate(to, silent, function(adapter) {\n adapter.replace(to);\n this.locations[this.locations.length - 1] = this.current;\n });\n },\n\n navigate: function(to, silent) {\n if (to === \"#:back\") {\n this.backCalled = true;\n this.adapter.back();\n return;\n }\n\n this._navigate(to, silent, function(adapter) {\n adapter.navigate(to);\n this.locations.push(this.current);\n });\n },\n\n _navigate: function(to, silent, callback) {\n var adapter = this.adapter;\n\n to = adapter.normalize(to);\n\n if (this.current === to || this.current === decodeURIComponent(to)) {\n this.trigger(SAME);\n return;\n }\n\n if (!silent) {\n if (this.trigger(CHANGE, { url: to, decode: false })) {\n return;\n }\n }\n\n this.current = to;\n\n callback.call(this, adapter);\n\n this.historyLength = adapter.length();\n },\n\n _checkUrl: function() {\n var adapter = this.adapter,\n current = adapter.current(),\n newLength = adapter.length(),\n navigatingInExisting = this.historyLength === newLength,\n back = current === this.locations[this.locations.length - 2] && navigatingInExisting,\n backCalled = this.backCalled,\n prev = this.current;\n\n if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n return true;\n }\n\n this.historyLength = newLength;\n this.backCalled = false;\n\n this.current = current;\n\n if (back && this.trigger(\"back\", { url: prev, to: current })) {\n adapter.forward();\n this.current = prev;\n return;\n }\n\n if (this.trigger(CHANGE, { url: current, backButtonPressed: !backCalled })) {\n if (back) {\n adapter.forward();\n } else {\n adapter.back();\n this.historyLength --;\n }\n this.current = prev;\n return;\n }\n\n if (back) {\n this.locations.pop();\n } else {\n this.locations.push(current);\n }\n }\n });\n\n kendo.History = History;\n kendo.History.HistoryAdapter = HistoryAdapter;\n kendo.History.HashAdapter = HashAdapter;\n kendo.History.PushStateAdapter = PushStateAdapter;\n kendo.absoluteURL = absoluteURL;\n kendo.history = new History();\n})(window.kendo.jQuery);\n\n(function() {\n var kendo = window.kendo,\n history = kendo.history,\n Observable = kendo.Observable,\n INIT = \"init\",\n ROUTE_MISSING = \"routeMissing\",\n CHANGE = \"change\",\n BACK = \"back\",\n SAME = \"same\",\n optionalParam = /\\((.*?)\\)/g,\n namedParam = /(\\(\\?)?:\\w+/g,\n splatParam = /\\*\\w+/g,\n escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n function namedParamReplace(match, optional) {\n return optional ? match : '([^\\/]+)';\n }\n\n function routeToRegExp(route, ignoreCase) {\n return new RegExp('^' + route\n .replace(escapeRegExp, '\\\\$&')\n .replace(optionalParam, '(?:$1)?')\n .replace(namedParam, namedParamReplace)\n .replace(splatParam, '(.*?)') + '$', ignoreCase ? \"i\" : \"\");\n }\n\n function stripUrl(url) {\n return url.replace(/(\\?.*)|(#.*)/g, \"\");\n }\n\n var Route = kendo.Class.extend({\n init: function(route, callback, ignoreCase) {\n if (!(route instanceof RegExp)) {\n route = routeToRegExp(route, ignoreCase);\n }\n\n this.route = route;\n this._callback = callback;\n },\n\n callback: function(url, back, decode) {\n var params,\n idx = 0,\n length,\n queryStringParams = kendo.parseQueryStringParams(url);\n queryStringParams._back = back;\n\n url = stripUrl(url);\n params = this.route.exec(url).slice(1);\n length = params.length;\n\n if (decode) {\n for (; idx < length; idx ++) {\n if (typeof params[idx] !== 'undefined') {\n params[idx] = decodeURIComponent(params[idx]);\n }\n }\n }\n\n params.push(queryStringParams);\n\n this._callback.apply(null, params);\n },\n\n worksWith: function(url, back, decode) {\n if (this.route.test(stripUrl(url))) {\n this.callback(url, back, decode);\n return true;\n } else {\n return false;\n }\n }\n });\n\n var Router = Observable.extend({\n init: function(options) {\n if (!options) {\n options = {};\n }\n\n Observable.fn.init.call(this);\n\n this.routes = [];\n this.pushState = options.pushState;\n this.hashBang = options.hashBang;\n this.root = options.root;\n this.ignoreCase = options.ignoreCase !== false;\n\n this.bind([INIT, ROUTE_MISSING, CHANGE, SAME, BACK], options);\n },\n\n destroy: function() {\n history.unbind(CHANGE, this._urlChangedProxy);\n history.unbind(SAME, this._sameProxy);\n history.unbind(BACK, this._backProxy);\n this.unbind();\n },\n\n start: function() {\n var that = this,\n sameProxy = function() { that._same(); },\n backProxy = function(e) { that._back(e); },\n urlChangedProxy = function(e) { that._urlChanged(e); };\n\n history.start({\n same: sameProxy,\n change: urlChangedProxy,\n back: backProxy,\n pushState: that.pushState,\n hashBang: that.hashBang,\n root: that.root\n });\n\n // eslint-disable-next-line no-undef\n var initEventObject = { url: history.current || \"/\", preventDefault: $.noop };\n\n if (!that.trigger(INIT, initEventObject)) {\n that._urlChanged(initEventObject);\n }\n\n this._urlChangedProxy = urlChangedProxy;\n this._backProxy = backProxy;\n },\n\n route: function(route, callback) {\n this.routes.push(new Route(route, callback, this.ignoreCase));\n },\n\n navigate: function(url, silent) {\n kendo.history.navigate(url, silent);\n },\n\n replace: function(url, silent) {\n kendo.history.replace(url, silent);\n },\n\n _back: function(e) {\n if (this.trigger(BACK, { url: e.url, to: e.to })) {\n e.preventDefault();\n }\n },\n\n _same: function() {\n this.trigger(SAME);\n },\n\n _urlChanged: function(e) {\n var url = e.url;\n var decode = !!e.decode;\n var back = e.backButtonPressed;\n\n if (!url) {\n url = \"/\";\n }\n\n if (this.trigger(CHANGE, { url: e.url, params: kendo.parseQueryStringParams(e.url), backButtonPressed: back })) {\n e.preventDefault();\n return;\n }\n\n var idx = 0,\n routes = this.routes,\n route,\n length = routes.length;\n\n for (; idx < length; idx ++) {\n route = routes[idx];\n\n if (route.worksWith(url, back, decode)) {\n return;\n }\n }\n\n if (this.trigger(ROUTE_MISSING, { url: url, params: kendo.parseQueryStringParams(url), backButtonPressed: back })) {\n e.preventDefault();\n }\n }\n });\n\n kendo.Router = Router;\n})();\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.view',[\n \"kendo.core\",\n \"kendo.binder\",\n \"kendo.fx\"\n ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"view\",\n name: \"View\",\n category: \"framework\",\n description: \"The View class instantiates and handles the events of a certain screen from the application.\",\n depends: [ \"core\", \"binder\", \"fx\" ],\n hidden: false\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n attr = kendo.attr,\n ui = kendo.ui,\n attrValue = kendo.attrValue,\n directiveSelector = kendo.directiveSelector,\n Observable = kendo.Observable,\n Widget = kendo.ui.Widget,\n roleSelector = kendo.roleSelector,\n\n SCRIPT = \"SCRIPT\",\n INIT = \"init\",\n TRANSITION_START = \"transitionStart\",\n TRANSITION_END = \"transitionEnd\",\n SHOW = \"show\",\n HIDE = \"hide\",\n ATTACH = \"attach\",\n DETACH = \"detach\",\n sizzleErrorRegExp = /unrecognized expression/;\n\n var bodyRegExp = /]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i;\n var LOAD_START = \"loadStart\";\n var LOAD_COMPLETE = \"loadComplete\";\n var SHOW_START = \"showStart\";\n var SAME_VIEW_REQUESTED = \"sameViewRequested\";\n var VIEW_SHOW = \"viewShow\";\n var VIEW_TYPE_DETERMINED = \"viewTypeDetermined\";\n var AFTER = \"after\";\n var classNames = {\n content: \"k-content\",\n view: \"k-view\",\n stretchedView: \"k-stretched-view\",\n widget: \"k-widget\",\n header: \"k-header\",\n footer: \"k-footer\"\n };\n\n var View = kendo.ui.Widget.extend({\n init: function(content, options) {\n var that = this;\n options = options || {};\n that.id = kendo.guid();\n\n Observable.fn.init.call(that);\n this.options = $.extend({}, this.options, options);\n\n that.content = content;\n\n if (that.options.renderOnInit) {\n Widget.fn.init.call(that, that._createElement(), options);\n }\n\n if (that.options.wrapInSections) {\n that._renderSections();\n }\n\n that.tagName = options.tagName || \"div\";\n that.model = options.model;\n that._wrap = options.wrap !== false;\n this._evalTemplate = options.evalTemplate || false;\n this._useWithBlock = options.useWithBlock;\n that._fragments = {};\n\n that.bind([ INIT, SHOW, HIDE, TRANSITION_START, TRANSITION_END ], options);\n },\n\n options: {\n name: \"View\",\n renderOnInit: false,\n wrapInSections: false,\n detachOnHide: true,\n detachOnDestroy: true\n },\n\n render: function(container) {\n var that = this,\n notInitialized = !that.element;\n\n // The order below matters - kendo.bind should happen when the element is in the DOM, and show should be triggered after init.\n\n if (notInitialized) {\n that.element = that._createElement();\n }\n\n if (container) {\n $(container).append(that.element);\n }\n\n if (notInitialized) {\n kendo.bind(that.element, that.model);\n that.trigger(INIT);\n }\n\n if (container) {\n that._eachFragment(ATTACH);\n that.trigger(SHOW);\n }\n\n return that.element;\n },\n\n clone: function() {\n return new ViewClone(this);\n },\n\n triggerBeforeShow: function() {\n return true;\n },\n\n triggerBeforeHide: function() {\n return true;\n },\n\n showStart: function() {\n var that = this;\n var element = that.render();\n\n if (element) {\n element.css(\"display\", \"\");\n }\n\n this.trigger(SHOW_START, { view: this });\n },\n\n showEnd: function() {\n },\n\n hideEnd: function() {\n this.hide();\n },\n\n beforeTransition: function(type) {\n this.trigger(TRANSITION_START, { type: type });\n },\n\n afterTransition: function(type) {\n this.trigger(TRANSITION_END, { type: type });\n },\n\n hide: function() {\n if (this.options.detachOnHide) {\n this._eachFragment(DETACH);\n $(this.element).detach();\n }\n\n this.trigger(HIDE);\n },\n\n destroy: function() {\n var that = this;\n var element = that.element;\n\n if (element) {\n Widget.fn.destroy.call(that);\n\n kendo.unbind(element);\n kendo.destroy(element);\n\n if (that.options.detachOnDestroy) {\n element.remove();\n }\n }\n },\n\n // ported from mobile view\n purge: function() {\n var that = this;\n\n that.destroy();\n $(that.element).add(that.content).add(that.wrapper).off().remove();\n },\n\n fragments: function(fragments) {\n $.extend(this._fragments, fragments);\n },\n\n _eachFragment: function(methodName) {\n for (var placeholder in this._fragments) {\n this._fragments[placeholder][methodName](this, placeholder);\n }\n },\n\n _createElement: function() {\n var that = this,\n wrapper = \"<\" + that.tagName + \">\",\n element,\n content;\n\n try {\n content = $(document.getElementById(that.content) || that.content); // support passing id without #\n\n if (content[0].tagName === SCRIPT) {\n content = content.html();\n }\n } catch (e) {\n if (sizzleErrorRegExp.test(e.message)) {\n content = that.content;\n }\n }\n\n if (typeof content === \"string\") {\n content = content.replace(/^\\s+|\\s+$/g, '');\n if (that._evalTemplate) {\n content = kendo.template(content, { useWithBlock: that._useWithBlock })(that.model || {});\n }\n\n element = $(wrapper).append(content);\n // drop the wrapper if asked - this seems like the easiest (although not very intuitive) way to avoid messing up templates with questionable content, like this one for instance:\n // \n if (!that._wrap) {\n element = element.contents();\n }\n } else {\n element = content;\n if (that._evalTemplate) {\n var result = $(kendo.template($(\"
    \").append(element.clone(true)).html(), { useWithBlock: that._useWithBlock })(that.model || {}));\n\n // template uses DOM\n if ($.contains(document, element[0])) {\n element.replaceWith(result);\n }\n\n element = result;\n }\n if (that._wrap) {\n element = element.wrapAll(wrapper).parent();\n }\n }\n\n return element;\n },\n\n _renderSections: function() {\n var that = this;\n\n if (that.options.wrapInSections) {\n that._wrapper();\n that._createContent();\n that._createHeader();\n that._createFooter();\n }\n },\n\n _wrapper: function() {\n var that = this;\n var content = that.content;\n\n if (content.is(roleSelector(\"view\"))) {\n that.wrapper = that.content;\n } else {\n that.wrapper = content\n .wrap('
    ')\n .parent();\n }\n\n var wrapper = that.wrapper;\n\n wrapper.attr(\"id\", that.id);\n\n wrapper.addClass(classNames.view);\n wrapper.addClass(classNames.widget);\n wrapper.attr(\"role\", \"view\");\n },\n\n _createContent: function() {\n var that = this;\n var wrapper = $(that.wrapper);\n var contentSelector = roleSelector(\"content\");\n\n if (!wrapper.children(contentSelector)[0]) {\n var ccontentElements = wrapper.children().filter(function() {\n var child = $(this);\n if (!child.is(roleSelector(\"header\")) && !child.is(roleSelector(\"footer\"))) {\n return child;\n }\n });\n\n ccontentElements.wrap(\"
    ');\n }\n\n // use contentElement instead of content as view.content can be a string\n this.contentElement = wrapper.children(roleSelector(\"content\"));\n\n this.contentElement\n .addClass(classNames.stretchedView)\n .addClass(classNames.content);\n },\n\n _createHeader: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n this.header = wrapper.children(roleSelector(\"header\")).addClass(classNames.header);\n },\n\n _createFooter: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n this.footer = wrapper.children(roleSelector(\"footer\")).addClass(classNames.footer);\n }\n });\n\n var ViewClone = kendo.Class.extend({\n init: function(view) {\n $.extend(this, {\n element: view.element.clone(true),\n transition: view.transition,\n id: view.id\n });\n\n view.element.parent().append(this.element);\n },\n\n hideEnd: function() {\n this.element.remove();\n },\n\n beforeTransition: $.noop,\n afterTransition: $.noop\n });\n\n var Layout = View.extend({\n init: function(content, options) {\n View.fn.init.call(this, content, options);\n this.containers = {};\n },\n\n container: function(selector) {\n var container = this.containers[selector];\n\n if (!container) {\n container = this._createContainer(selector);\n this.containers[selector] = container;\n }\n\n return container;\n },\n\n showIn: function(selector, view, transition) {\n this.container(selector).show(view, transition);\n },\n\n _createContainer: function(selector) {\n var root = this.render(),\n element = root.find(selector),\n container;\n\n if (!element.length && root.is(selector)) {\n if (root.is(selector)) {\n element = root;\n } else {\n\n throw new Error(\"can't find a container with the specified \" + selector + \" selector\");\n }\n }\n\n container = new ViewContainer(element);\n\n container.bind(\"accepted\", function(e) {\n e.view.render(element);\n });\n\n return container;\n }\n });\n\n var Fragment = View.extend({\n attach: function(view, placeholder) {\n view.element.find(placeholder).replaceWith(this.render());\n },\n\n detach: function() {\n }\n });\n\n var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\n\n function parseTransition(transition) {\n if (!transition) {\n return {};\n }\n\n var matches = transition.match(transitionRegExp) || [];\n\n return {\n type: matches[1],\n direction: matches[3],\n reverse: matches[5] === \"reverse\"\n };\n }\n\n var ViewContainer = Observable.extend({\n init: function(container) {\n Observable.fn.init.call(this);\n this.container = container;\n this.history = [];\n this.view = null;\n this.running = false;\n },\n\n after: function() {\n this.running = false;\n this.trigger(\"complete\", { view: this.view });\n this.trigger(\"after\");\n },\n\n end: function() {\n this.view.showEnd();\n this.previous.hideEnd();\n this.after();\n },\n\n show: function(view, transition, locationID) {\n if (!view.triggerBeforeShow() || (this.view && !this.view.triggerBeforeHide())) {\n this.trigger(\"after\");\n return false;\n }\n\n locationID = locationID || view.id;\n\n var that = this,\n current = (view === that.view) ? view.clone() : that.view,\n history = that.history,\n previousEntry = history[history.length - 2] || {},\n back = previousEntry.id === locationID,\n // If explicit transition is set, it will be with highest priority\n // Next we will try using the history record transition or the view transition configuration\n theTransition = transition || ( back ? history[history.length - 1].transition : view.transition ),\n transitionData = parseTransition(theTransition);\n\n if (that.running) {\n that.effect.stop();\n }\n\n if (theTransition === \"none\") {\n theTransition = null;\n }\n\n that.trigger(\"accepted\", { view: view });\n that.view = view;\n that.previous = current;\n that.running = true;\n\n if (!back) {\n history.push({ id: locationID, transition: theTransition });\n } else {\n history.pop();\n }\n\n if (!current) {\n view.showStart();\n view.showEnd();\n that.after();\n return true;\n }\n\n if (!theTransition || !kendo.effects.enabled) {\n view.showStart();\n that.end();\n } else {\n // hide the view element before init/show - prevents blinks on iPad\n // the replace effect will remove this class\n view.element.addClass(\"k-fx-hidden\");\n view.showStart();\n // do not reverse the explicit transition\n if (back && !transition) {\n transitionData.reverse = !transitionData.reverse;\n }\n\n that.effect = kendo.fx(view.element).replace(current.element, transitionData.type)\n .beforeTransition(function() {\n view.beforeTransition(\"show\");\n current.beforeTransition(\"hide\");\n })\n .afterTransition(function() {\n view.afterTransition(\"show\");\n current.afterTransition(\"hide\");\n })\n .direction(transitionData.direction)\n .setReverse(transitionData.reverse);\n\n that.effect.run().then(function() { that.end(); });\n }\n\n return true;\n },\n\n destroy: function() {\n var that = this;\n var view = that.view;\n\n if (view && view.destroy) {\n view.destroy();\n }\n }\n });\n\n var ViewEngine = Observable.extend({\n init: function(options) {\n var that = this,\n views,\n container;\n\n Observable.fn.init.call(that);\n that.options = options;\n\n $.extend(that, options);\n that.sandbox = $(\"
    \");\n container = that.container;\n\n views = that._hideViews(container);\n that.rootView = views.first();\n that.layouts = {};\n\n that.viewContainer = new kendo.ViewContainer(that.container);\n\n that.viewContainer.bind(\"accepted\", function(e) {\n e.view.params = that.params;\n });\n\n that.viewContainer.bind(\"complete\", function(e) {\n that.trigger(VIEW_SHOW, { view: e.view });\n });\n\n that.viewContainer.bind(AFTER, function() {\n that.trigger(AFTER);\n });\n\n this.bind(this.events, options);\n },\n\n events: [\n SHOW_START,\n AFTER,\n VIEW_SHOW,\n LOAD_START,\n LOAD_COMPLETE,\n SAME_VIEW_REQUESTED,\n VIEW_TYPE_DETERMINED\n ],\n\n destroy: function() {\n var that = this;\n var viewContainer = that.viewContainer;\n\n kendo.destroy(that.container);\n\n for (var id in that.layouts) {\n this.layouts[id].destroy();\n }\n\n if (viewContainer) {\n viewContainer.destroy();\n }\n },\n\n view: function() {\n return this.viewContainer.view;\n },\n\n showView: function(url, transition, params) {\n url = url.replace(new RegExp(\"^\" + this.remoteViewURLPrefix), \"\");\n if (url === \"\" && this.remoteViewURLPrefix) {\n url = \"/\";\n }\n\n if (url.replace(/^#/, \"\") === this.url) {\n this.trigger(SAME_VIEW_REQUESTED);\n return false;\n }\n\n this.trigger(SHOW_START);\n\n var that = this,\n element = that._findViewElement(url),\n view = kendo.widgetInstance(element);\n\n that.url = url.replace(/^#/, \"\");\n\n that.params = params;\n\n if (view && view.reload) {\n view.purge();\n element = [];\n }\n\n this.trigger(VIEW_TYPE_DETERMINED, { remote: element.length === 0, url: url });\n\n if (element[0]) {\n if (!view) {\n view = that._createView(element);\n }\n\n return that.viewContainer.show(view, transition, url);\n } else {\n return true;\n }\n },\n\n append: function(html, url) {\n var sandbox = this.sandbox,\n urlPath = (url || \"\").split(\"?\")[0],\n container = this.container,\n views,\n view;\n\n if (bodyRegExp.test(html)) {\n html = RegExp.$1;\n }\n\n sandbox[0].innerHTML = html;\n\n container.append(sandbox.children(\"script, style\"));\n\n views = this._hideViews(sandbox);\n view = views.first();\n\n // Generic HTML content found as remote view - no remote view markers\n if (!view.length) {\n views = view = sandbox.wrapInner(\"
    \").children(); // one element\n }\n\n if (urlPath) {\n view.hide().attr(attr(\"url\"), urlPath);\n }\n\n container.append(views);\n\n return this._createView(view);\n },\n\n _locate: function(selectors) {\n return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n },\n\n _findViewElement: function(url) {\n var element,\n urlPath = url.split(\"?\")[0];\n\n if (!urlPath) {\n return this.rootView;\n }\n\n element = this.container.children(\"[\" + attr(\"url\") + \"='\" + urlPath + \"']\");\n\n // do not try to search for \"#/foo/bar\" id, jQuery throws error\n if (!element[0] && urlPath.indexOf(\"/\") === -1) {\n element = this.container.children(urlPath.charAt(0) === \"#\" ? urlPath : \"#\" + urlPath);\n }\n\n if (!element[0]) {\n element = this._findViewElementById(url);\n }\n\n return element;\n },\n\n _findViewElementById: function(id) {\n var element = this.container.children(\"[id='\" + id + \"']\");\n return element;\n },\n\n _createView: function(element) {\n //return this._createMobileView(element);\n return this._createSpaView(element);\n },\n\n _createMobileView: function(element) {\n return kendo.initWidget(element, {\n defaultTransition: this.transition,\n loader: this.loader,\n container: this.container,\n getLayout: this.getLayoutProxy,\n modelScope: this.modelScope,\n reload: attrValue(element, \"reload\")\n }, ui.roles);\n },\n\n _createSpaView: function(element) {\n var viewOptions = (this.options || {}).viewOptions || {};\n return new kendo.View(element, {\n renderOnInit: viewOptions.renderOnInit,\n wrap: viewOptions.wrap || false,\n wrapInSections: viewOptions.wrapInSections,\n detachOnHide: viewOptions.detachOnHide,\n detachOnDestroy: viewOptions.detachOnDestroy\n });\n },\n\n _hideViews: function(container) {\n return container.children(this._locate(\"view\")).hide();\n }\n });\n\n kendo.ViewEngine = ViewEngine;\n\n kendo.ViewContainer = ViewContainer;\n kendo.Fragment = Fragment;\n kendo.Layout = Layout;\n kendo.View = View;\n kendo.ViewClone = ViewClone;\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.userevents',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"userevents\",\n name: \"User Events\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n support = kendo.support,\n Class = kendo.Class,\n Observable = kendo.Observable,\n now = Date.now,\n extend = $.extend,\n OS = support.mobileOS,\n invalidZeroEvents = OS && OS.android,\n DEFAULT_MIN_HOLD = 800,\n CLICK_DELAY = 300,\n DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, // WP8 and W8 are very sensitive and always report move.\n\n // UserEvents events\n PRESS = \"press\",\n HOLD = \"hold\",\n SELECT = \"select\",\n START = \"start\",\n MOVE = \"move\",\n END = \"end\",\n CANCEL = \"cancel\",\n TAP = \"tap\",\n DOUBLETAP = \"doubleTap\",\n RELEASE = \"release\",\n GESTURESTART = \"gesturestart\",\n GESTURECHANGE = \"gesturechange\",\n GESTUREEND = \"gestureend\",\n GESTURETAP = \"gesturetap\";\n\n var THRESHOLD = {\n \"api\": 0,\n \"touch\": 0,\n \"mouse\": 9,\n \"pointer\": 9\n };\n\n var ENABLE_GLOBAL_SURFACE = (!support.touch || support.mouseAndTouchPresent);\n\n function touchDelta(touch1, touch2) {\n var x1 = touch1.x.location,\n y1 = touch1.y.location,\n x2 = touch2.x.location,\n y2 = touch2.y.location,\n dx = x1 - x2,\n dy = y1 - y2;\n\n return {\n center: {\n x: (x1 + x2) / 2,\n y: (y1 + y2) / 2\n },\n\n distance: Math.sqrt(dx * dx + dy * dy)\n };\n }\n\n function getTouches(e) {\n var touches = [],\n originalEvent = e.originalEvent,\n currentTarget = e.currentTarget,\n idx = 0, length,\n changedTouches,\n touch;\n\n if (e.api) {\n touches.push({\n id: 2, // hardcoded ID for API call;\n event: e,\n target: e.target,\n currentTarget: e.target,\n location: e,\n type: \"api\"\n });\n }\n else if (e.type.match(/touch/)) {\n changedTouches = originalEvent ? originalEvent.changedTouches : [];\n for (length = changedTouches.length; idx < length; idx ++) {\n touch = changedTouches[idx];\n touches.push({\n location: touch,\n event: e,\n target: touch.target,\n currentTarget: currentTarget,\n id: touch.identifier,\n type: \"touch\"\n });\n }\n }\n else if (support.pointers || support.msPointers) {\n touches.push({\n location: originalEvent,\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n id: originalEvent.pointerId,\n type: \"pointer\"\n });\n } else {\n touches.push({\n id: 1, // hardcoded ID for mouse event;\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n location: e,\n type: \"mouse\"\n });\n }\n\n return touches;\n }\n\n var TouchAxis = Class.extend({\n init: function(axis, location) {\n var that = this;\n\n that.axis = axis;\n\n that._updateLocationData(location);\n\n that.startLocation = that.location;\n that.velocity = that.delta = 0;\n that.timeStamp = now();\n },\n\n move: function(location) {\n var that = this,\n offset = location[\"page\" + that.axis],\n timeStamp = now(),\n timeDelta = (timeStamp - that.timeStamp) || 1; // Firing manually events in tests can make this 0;\n\n if (!offset && invalidZeroEvents) {\n return;\n }\n\n that.delta = offset - that.location;\n\n that._updateLocationData(location);\n\n that.initialDelta = offset - that.startLocation;\n that.velocity = that.delta / timeDelta;\n that.timeStamp = timeStamp;\n },\n\n _updateLocationData: function(location) {\n var that = this, axis = that.axis;\n\n that.location = location[\"page\" + axis];\n that.client = location[\"client\" + axis];\n that.screen = location[\"screen\" + axis];\n }\n });\n\n var Touch = Class.extend({\n init: function(userEvents, target, touchInfo) {\n extend(this, {\n x: new TouchAxis(\"X\", touchInfo.location),\n y: new TouchAxis(\"Y\", touchInfo.location),\n type: touchInfo.type,\n useClickAsTap: userEvents.useClickAsTap,\n threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n userEvents: userEvents,\n target: target,\n currentTarget: touchInfo.currentTarget,\n initialTouch: touchInfo.target,\n id: touchInfo.id,\n pressEvent: touchInfo,\n _clicks: userEvents._clicks,\n supportDoubleTap: userEvents.supportDoubleTap,\n _moved: false,\n _finished: false\n });\n },\n\n press: function() {\n this._holdTimeout = setTimeout(this._hold.bind(this), this.userEvents.minHold);\n this._trigger(PRESS, this.pressEvent);\n },\n\n _tap: function(touchInfo) {\n var that = this;\n that.userEvents._clicks++;\n if (that.userEvents._clicks == 1) {\n that._clickTimeout = setTimeout(function() {\n if (that.userEvents._clicks == 1) {\n that._trigger(TAP, touchInfo);\n }\n else {\n that._trigger(DOUBLETAP, touchInfo);\n }\n that.userEvents._clicks = 0;\n }, CLICK_DELAY);\n }\n },\n\n _hold: function() {\n this._trigger(HOLD, this.pressEvent);\n },\n\n move: function(touchInfo) {\n var that = this;\n var preventMove = touchInfo.type !== \"api\" && that.userEvents._shouldNotMove;\n\n if (that._finished || preventMove) { return; }\n\n that.x.move(touchInfo.location);\n that.y.move(touchInfo.location);\n\n if (!that._moved) {\n if (that._withinIgnoreThreshold()) {\n return;\n }\n\n if (!UserEvents.current || UserEvents.current === that.userEvents) {\n that._start(touchInfo);\n } else {\n return that.dispose();\n }\n }\n\n // Event handlers may cancel the drag in the START event handler, hence the double check for pressed.\n if (!that._finished) {\n that._trigger(MOVE, touchInfo);\n }\n },\n\n end: function(touchInfo) {\n this.endTime = now();\n\n if (this._finished) { return; }\n\n // Mark the object as finished if there are blocking operations in the event handlers (alert/confirm)\n this._finished = true;\n\n this._trigger(RELEASE, touchInfo); // Release should be fired before TAP (as click is after mouseup/touchend)\n\n if (this._moved) {\n this._trigger(END, touchInfo);\n } else {\n if (!this.useClickAsTap) {\n if (this.supportDoubleTap) {\n this._tap(touchInfo);\n }\n else {\n this._trigger(TAP, touchInfo);\n }\n }\n }\n\n clearTimeout(this._holdTimeout);\n\n this.dispose();\n },\n\n dispose: function() {\n var userEvents = this.userEvents,\n activeTouches = userEvents.touches;\n\n this._finished = true;\n this.pressEvent = null;\n clearTimeout(this._holdTimeout);\n\n activeTouches.splice($.inArray(this, activeTouches), 1);\n },\n\n skip: function() {\n this.dispose();\n },\n\n cancel: function() {\n this.dispose();\n },\n\n isMoved: function() {\n return this._moved;\n },\n\n _start: function(touchInfo) {\n clearTimeout(this._holdTimeout);\n\n this.startTime = now();\n this._moved = true;\n this._trigger(START, touchInfo);\n },\n\n _trigger: function(name, touchInfo) {\n var that = this,\n jQueryEvent = touchInfo.event,\n data = {\n touch: that,\n x: that.x,\n y: that.y,\n target: that.target,\n event: jQueryEvent\n };\n\n if (that.userEvents.notify(name, data)) {\n jQueryEvent.preventDefault();\n }\n },\n\n _withinIgnoreThreshold: function() {\n var xDelta = this.x.initialDelta,\n yDelta = this.y.initialDelta;\n\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n }\n });\n\n function withEachUpEvent(callback) {\n var downEvents = kendo.eventMap.up.split(\" \"),\n idx = 0,\n length = downEvents.length;\n\n for (; idx < length; idx ++) {\n callback(downEvents[idx]);\n }\n }\n\n var UserEvents = Observable.extend({\n init: function(element, options) {\n var that = this,\n filter,\n ns = kendo.guid();\n\n options = options || {};\n filter = that.filter = options.filter;\n that.threshold = options.threshold || DEFAULT_THRESHOLD;\n that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n that.touches = [];\n that._maxTouches = options.multiTouch ? 2 : 1;\n that.allowSelection = options.allowSelection;\n that.captureUpIfMoved = options.captureUpIfMoved;\n that.useClickAsTap = !options.fastTap && !support.delayedClick();\n that.eventNS = ns;\n that._clicks = 0;\n that.supportDoubleTap = options.supportDoubleTap;\n\n element = $(element).handler(that);\n Observable.fn.init.call(that);\n\n extend(that, {\n element: element,\n // the touch events lock to the element anyway, so no need for the global setting\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n stopPropagation: options.stopPropagation,\n pressed: false\n });\n\n that.surface.handler(that)\n .on(kendo.applyEventMap(\"move\", ns), \"_move\")\n .on(kendo.applyEventMap(\"up cancel\", ns), \"_end\");\n\n element.on(kendo.applyEventMap(\"down\", ns), filter, \"_start\");\n\n if (that.useClickAsTap) {\n element.on(kendo.applyEventMap(\"click\", ns), filter, \"_click\");\n }\n\n if (support.pointers || support.msPointers) {\n //touch-action:none will not work for IE10\n if (support.browser.version < 11) {\n var defaultAction = \"pinch-zoom double-tap-zoom\";\n element.css(\"-ms-touch-action\", options.touchAction && options.touchAction != \"none\" ? defaultAction + \" \" + options.touchAction : defaultAction);\n } else {\n element.css(\"touch-action\", options.touchAction || \"none\");\n }\n }\n\n if (options.preventDragEvent) {\n element.on(kendo.applyEventMap(\"dragstart\", ns), kendo.preventDefault);\n }\n\n element.on(kendo.applyEventMap(\"mousedown\", ns), filter, { root: element }, \"_select\");\n\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0],\n preventIfMovingProxy = that.preventIfMoving.bind(that);\n\n withEachUpEvent(function(eventName) {\n surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n });\n }\n\n that.bind([\n PRESS,\n HOLD,\n TAP,\n DOUBLETAP,\n START,\n MOVE,\n END,\n RELEASE,\n CANCEL,\n GESTURESTART,\n GESTURECHANGE,\n GESTUREEND,\n GESTURETAP,\n SELECT\n ], options);\n },\n\n preventIfMoving: function(e) {\n if (this._isMoved()) {\n e.preventDefault();\n }\n },\n\n destroy: function() {\n var that = this;\n\n if (that._destroyed) {\n return;\n }\n\n that._destroyed = true;\n\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0];\n withEachUpEvent(function(eventName) {\n surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n });\n }\n\n that.element.kendoDestroy(that.eventNS);\n that.surface.kendoDestroy(that.eventNS);\n that.element.removeData(\"handler\");\n that.surface.removeData(\"handler\");\n that._disposeAll();\n\n that.unbind();\n delete that.surface;\n delete that.element;\n delete that.currentTarget;\n },\n\n capture: function() {\n UserEvents.current = this;\n },\n\n cancel: function() {\n this._disposeAll();\n this.trigger(CANCEL);\n },\n\n notify: function(eventName, data) {\n var that = this,\n touches = that.touches;\n\n if (this._isMultiTouch()) {\n switch (eventName) {\n case MOVE:\n eventName = GESTURECHANGE;\n break;\n case END:\n eventName = GESTUREEND;\n break;\n case TAP:\n eventName = GESTURETAP;\n break;\n }\n\n extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n }\n\n return this.trigger(eventName, extend(data, { type: eventName }));\n },\n\n // API\n press: function(x, y, target) {\n this._apiCall(\"_start\", x, y, target);\n },\n\n move: function(x, y) {\n this._apiCall(\"_move\", x, y);\n },\n\n end: function(x, y) {\n this._apiCall(\"_end\", x, y);\n },\n\n _isMultiTouch: function() {\n return this.touches.length > 1;\n },\n\n _maxTouchesReached: function() {\n return this.touches.length >= this._maxTouches;\n },\n\n _disposeAll: function() {\n var touches = this.touches;\n while (touches.length > 0) {\n touches.pop().dispose();\n }\n },\n\n _isMoved: function() {\n return $.grep(this.touches, function(touch) {\n return touch.isMoved();\n }).length;\n },\n\n _select: function(e) {\n if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n e.preventDefault();\n }\n },\n\n _start: function(e) {\n var that = this,\n idx = 0,\n filter = that.filter,\n target,\n touches = getTouches(e),\n length = touches.length,\n touch,\n which = e.which;\n\n if ((which && which > 1) || (that._maxTouchesReached())) {\n return;\n }\n\n UserEvents.current = null;\n\n that.currentTarget = e.currentTarget;\n\n if (that.stopPropagation) {\n e.stopPropagation();\n }\n\n for (; idx < length; idx ++) {\n if (that._maxTouchesReached()) {\n break;\n }\n\n touch = touches[idx];\n\n if (filter) {\n target = $(touch.currentTarget); // target.is(filter) ? target : target.closest(filter, that.element);\n } else {\n target = that.element;\n }\n\n if (!target.length) {\n continue;\n }\n\n touch = new Touch(that, target, touch);\n that.touches.push(touch);\n touch.press();\n\n if (that._isMultiTouch()) {\n that.notify(\"gesturestart\", {});\n }\n }\n },\n\n _move: function(e) {\n this._eachTouch(\"move\", e);\n },\n\n _end: function(e) {\n this._eachTouch(\"end\", e);\n },\n\n _click: function(e) {\n var data = {\n touch: {\n initialTouch: e.target,\n target: $(e.currentTarget),\n endTime: now(),\n x: {\n location: e.pageX,\n client: e.clientX\n },\n y: {\n location: e.pageY,\n client: e.clientY\n }\n },\n x: e.pageX,\n y: e.pageY,\n target: $(e.currentTarget),\n event: e,\n type: \"tap\"\n };\n\n if (this.trigger(\"tap\", data)) {\n e.preventDefault();\n }\n },\n\n _eachTouch: function(methodName, e) {\n var that = this,\n dict = {},\n touches = getTouches(e),\n activeTouches = that.touches,\n idx,\n touch,\n touchInfo,\n matchingTouch;\n\n for (idx = 0; idx < activeTouches.length; idx ++) {\n touch = activeTouches[idx];\n dict[touch.id] = touch;\n }\n\n for (idx = 0; idx < touches.length; idx ++) {\n touchInfo = touches[idx];\n matchingTouch = dict[touchInfo.id];\n\n if (matchingTouch) {\n matchingTouch[methodName](touchInfo);\n }\n }\n },\n\n _apiCall: function(type, x, y, target) {\n this[type]({\n api: true,\n pageX: x,\n pageY: y,\n clientX: x,\n clientY: y,\n target: $(target || this.element)[0],\n stopPropagation: $.noop,\n preventDefault: $.noop\n });\n }\n });\n\n UserEvents.defaultThreshold = function(value) {\n DEFAULT_THRESHOLD = value;\n };\n\n UserEvents.minHold = function(value) {\n DEFAULT_MIN_HOLD = value;\n };\n\n kendo.getTouches = getTouches;\n kendo.touchDelta = touchDelta;\n kendo.UserEvents = UserEvents;\n })(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.draganddrop',[ \"kendo.core\", \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"draganddrop\",\n name: \"Drag & drop\",\n category: \"framework\",\n description: \"Drag & drop functionality for any DOM element.\",\n depends: [ \"core\", \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n support = kendo.support,\n document = window.document,\n $window = $(window),\n Class = kendo.Class,\n Widget = kendo.ui.Widget,\n Observable = kendo.Observable,\n UserEvents = kendo.UserEvents,\n extend = $.extend,\n getOffset = kendo.getOffset,\n draggables = {},\n dropTargets = {},\n dropAreas = {},\n lastDropTarget,\n elementUnderCursor = kendo.elementUnderCursor,\n KEYUP = \"keyup\",\n CHANGE = \"change\",\n\n // Draggable events\n DRAGSTART = \"dragstart\",\n HOLD = \"hold\",\n DRAG = \"drag\",\n DRAGEND = \"dragend\",\n DRAGCANCEL = \"dragcancel\",\n HINTDESTROYED = \"hintDestroyed\",\n\n // DropTarget events\n DRAGENTER = \"dragenter\",\n DRAGLEAVE = \"dragleave\",\n DROP = \"drop\";\n\n function contains(parent, child) {\n try {\n return $.contains(parent, child) || parent == child;\n } catch (e) {\n return false;\n }\n }\n\n function numericCssPropery(element, property) {\n return parseInt(element.css(property), 10) || 0;\n }\n\n function within(value, range) {\n return Math.min(Math.max(value, range.min), range.max);\n }\n\n function containerBoundaries(container, element) {\n var offset = getOffset(container),\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n minX = offset.left + numericCssPropery(container, \"borderLeftWidth\") + numericCssPropery(container, \"paddingLeft\"),\n minY = offset.top + numericCssPropery(container, \"borderTopWidth\") + numericCssPropery(container, \"paddingTop\"),\n maxX = minX + container.width() - outerWidth(element, true),\n maxY = minY + container.height() - outerHeight(element, true);\n\n return {\n x: { min: minX, max: maxX },\n y: { min: minY, max: maxY }\n };\n }\n\n function checkTarget(target, targets, areas) {\n var theTarget, theFilter, i = 0,\n targetLen = targets && targets.length,\n areaLen = areas && areas.length;\n\n while (target && target.parentNode) {\n for (i = 0; i < targetLen; i ++) {\n theTarget = targets[i];\n if (theTarget.element[0] === target) {\n return { target: theTarget, targetElement: target };\n }\n }\n\n for (i = 0; i < areaLen; i ++) {\n theFilter = areas[i];\n if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n return { target: theFilter, targetElement: target };\n }\n }\n\n target = target.parentNode;\n }\n\n return undefined;\n }\n\n var TapCapture = Observable.extend({\n init: function(element, options) {\n var that = this,\n domElement = element[0];\n\n that.capture = false;\n\n if (domElement.addEventListener) {\n $.each(kendo.eventMap.down.split(\" \"), function() {\n domElement.addEventListener(this, that._press.bind(that), true);\n });\n $.each(kendo.eventMap.up.split(\" \"), function() {\n domElement.addEventListener(this, that._release.bind(that), true);\n });\n } else {\n $.each(kendo.eventMap.down.split(\" \"), function() {\n domElement.attachEvent(this, that._press.bind(that));\n });\n $.each(kendo.eventMap.up.split(\" \"), function() {\n domElement.attachEvent(this, that._release.bind(that));\n });\n }\n\n Observable.fn.init.call(that);\n\n that.bind([\"press\", \"release\"], options || {});\n },\n\n captureNext: function() {\n this.capture = true;\n },\n\n cancelCapture: function() {\n this.capture = false;\n },\n\n _press: function(e) {\n var that = this;\n that.trigger(\"press\");\n if (that.capture) {\n e.preventDefault();\n }\n },\n\n _release: function(e) {\n var that = this;\n that.trigger(\"release\");\n\n if (that.capture) {\n e.preventDefault();\n that.cancelCapture();\n }\n }\n });\n\n var PaneDimension = Observable.extend({\n init: function(options) {\n var that = this;\n Observable.fn.init.call(that);\n\n that.forcedEnabled = false;\n\n $.extend(that, options);\n\n that.scale = 1;\n\n if (that.horizontal) {\n that.measure = \"offsetWidth\";\n that.scrollSize = \"scrollWidth\";\n that.axis = \"x\";\n } else {\n that.measure = \"offsetHeight\";\n that.scrollSize = \"scrollHeight\";\n that.axis = \"y\";\n }\n },\n\n makeVirtual: function() {\n $.extend(this, {\n virtual: true,\n forcedEnabled: true,\n _virtualMin: 0,\n _virtualMax: 0\n });\n },\n\n virtualSize: function(min, max) {\n if (this._virtualMin !== min || this._virtualMax !== max) {\n this._virtualMin = min;\n this._virtualMax = max;\n this.update();\n }\n },\n\n outOfBounds: function(offset) {\n return offset > this.max || offset < this.min;\n },\n\n forceEnabled: function() {\n this.forcedEnabled = true;\n },\n\n getSize: function() {\n return this.container[0][this.measure];\n },\n\n getTotal: function() {\n return this.element[0][this.scrollSize];\n },\n\n rescale: function(scale) {\n this.scale = scale;\n },\n\n update: function(silent) {\n var that = this,\n total = that.virtual ? that._virtualMax : that.getTotal(),\n scaledTotal = total * that.scale,\n size = that.getSize();\n\n if (total === 0 && !that.forcedEnabled) {\n return; // we are not visible.\n }\n\n that.max = that.virtual ? -that._virtualMin : 0;\n that.size = size;\n that.total = scaledTotal;\n that.min = Math.min(that.max, size - scaledTotal);\n that.minScale = size / total;\n that.centerOffset = (scaledTotal - size) / 2;\n\n that.enabled = that.forcedEnabled || (scaledTotal > size);\n\n if (!silent) {\n that.trigger(CHANGE, that);\n }\n }\n });\n\n var PaneDimensions = Observable.extend({\n init: function(options) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.x = new PaneDimension(extend({ horizontal: true }, options));\n that.y = new PaneDimension(extend({ horizontal: false }, options));\n that.container = options.container;\n that.forcedMinScale = options.minScale;\n that.maxScale = options.maxScale || 100;\n\n that.bind(CHANGE, options);\n },\n\n rescale: function(newScale) {\n this.x.rescale(newScale);\n this.y.rescale(newScale);\n this.refresh();\n },\n\n centerCoordinates: function() {\n return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) };\n },\n\n refresh: function() {\n var that = this;\n that.x.update();\n that.y.update();\n that.enabled = that.x.enabled || that.y.enabled;\n that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n that.trigger(CHANGE);\n }\n });\n\n var PaneAxis = Observable.extend({\n init: function(options) {\n var that = this;\n extend(that, options);\n Observable.fn.init.call(that);\n },\n\n outOfBounds: function() {\n return this.dimension.outOfBounds(this.movable[this.axis]);\n },\n\n dragMove: function(delta) {\n var that = this,\n dimension = that.dimension,\n axis = that.axis,\n movable = that.movable,\n position = movable[axis] + delta;\n\n if (!dimension.enabled) {\n return;\n }\n\n if ((position < dimension.min && delta < 0) || (position > dimension.max && delta > 0)) {\n delta *= that.resistance;\n }\n\n movable.translateAxis(axis, delta);\n that.trigger(CHANGE, that);\n }\n });\n\n var Pane = Class.extend({\n\n init: function(options) {\n var that = this,\n x,\n y,\n resistance,\n movable;\n\n extend(that, { elastic: true }, options);\n\n resistance = that.elastic ? 0.5 : 0;\n movable = that.movable;\n\n that.x = x = new PaneAxis({\n axis: \"x\",\n dimension: that.dimensions.x,\n resistance: resistance,\n movable: movable\n });\n\n that.y = y = new PaneAxis({\n axis: \"y\",\n dimension: that.dimensions.y,\n resistance: resistance,\n movable: movable\n });\n\n that.userEvents.bind([\"press\", \"move\", \"end\", \"gesturestart\", \"gesturechange\"], {\n gesturestart: function(e) {\n that.gesture = e;\n that.offset = that.dimensions.container.offset();\n },\n\n press: function(e) {\n if ($(e.event.target).closest(\"a\").is(\"[data-navigate-on-press=true]\")) {\n e.sender.cancel();\n }\n },\n\n gesturechange: function(e) {\n var previousGesture = that.gesture,\n previousCenter = previousGesture.center,\n\n center = e.center,\n\n scaleDelta = e.distance / previousGesture.distance,\n\n minScale = that.dimensions.minScale,\n maxScale = that.dimensions.maxScale,\n coordinates;\n\n if (movable.scale <= minScale && scaleDelta < 1) {\n // Resist shrinking. Instead of shrinking from 1 to 0.5, it will shrink to 0.5 + (1 /* minScale */ - 0.5) * 0.8 = 0.9;\n scaleDelta += (1 - scaleDelta) * 0.8;\n }\n\n if (movable.scale * scaleDelta >= maxScale) {\n scaleDelta = maxScale / movable.scale;\n }\n\n var offsetX = movable.x + that.offset.left,\n offsetY = movable.y + that.offset.top;\n\n coordinates = {\n x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n };\n\n movable.scaleWith(scaleDelta);\n\n x.dragMove(coordinates.x);\n y.dragMove(coordinates.y);\n\n that.dimensions.rescale(movable.scale);\n that.gesture = e;\n e.preventDefault();\n },\n\n move: function(e) {\n if (e.event.target.tagName.match(/textarea|input/i)) {\n return;\n }\n\n if (x.dimension.enabled || y.dimension.enabled) {\n x.dragMove(e.x.delta);\n y.dragMove(e.y.delta);\n e.preventDefault();\n } else {\n e.touch.skip();\n }\n },\n\n end: function(e) {\n e.preventDefault();\n }\n });\n }\n });\n\n var TRANSFORM_STYLE = support.transitions.prefix + \"Transform\",\n translate;\n\n\n if (support.hasHW3D) {\n translate = function(x, y, scale) {\n return \"translate3d(\" + x + \"px,\" + y + \"px,0) scale(\" + scale + \")\";\n };\n } else {\n translate = function(x, y, scale) {\n return \"translate(\" + x + \"px,\" + y + \"px) scale(\" + scale + \")\";\n };\n }\n\n var Movable = Observable.extend({\n init: function(element) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.element = $(element);\n that.element[0].style.webkitTransformOrigin = \"left top\";\n that.x = 0;\n that.y = 0;\n that.scale = 1;\n that._saveCoordinates(translate(that.x, that.y, that.scale));\n },\n\n translateAxis: function(axis, by) {\n this[axis] += by;\n this.refresh();\n },\n\n scaleTo: function(scale) {\n this.scale = scale;\n this.refresh();\n },\n\n scaleWith: function(scaleDelta) {\n this.scale *= scaleDelta;\n this.refresh();\n },\n\n translate: function(coordinates) {\n this.x += coordinates.x;\n this.y += coordinates.y;\n this.refresh();\n },\n\n moveAxis: function(axis, value) {\n this[axis] = value;\n this.refresh();\n },\n\n moveTo: function(coordinates) {\n extend(this, coordinates);\n this.refresh();\n },\n\n refresh: function() {\n var that = this,\n x = that.x,\n y = that.y,\n newCoordinates;\n\n if (that.round) {\n x = Math.round(x);\n y = Math.round(y);\n }\n\n newCoordinates = translate(x, y, that.scale);\n\n if (newCoordinates != that.coordinates) {\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n that.element[0].style.position = \"absolute\";\n that.element[0].style.left = that.x + \"px\";\n that.element[0].style.top = that.y + \"px\";\n\n } else {\n that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n }\n that._saveCoordinates(newCoordinates);\n that.trigger(CHANGE);\n }\n },\n\n _saveCoordinates: function(coordinates) {\n this.coordinates = coordinates;\n }\n });\n\n function destroyDroppable(collection, widget) {\n var groupName = widget.options.group,\n droppables = collection[groupName],\n i;\n\n Widget.fn.destroy.call(widget);\n\n if (droppables.length > 1) {\n for (i = 0; i < droppables.length; i++) {\n if (droppables[i] == widget) {\n droppables.splice(i, 1);\n break;\n }\n }\n } else {\n droppables.length = 0; // WTF, porting this from the previous destroyGroup\n delete collection[groupName];\n }\n }\n\n var DropTarget = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n var group = that.options.group;\n\n if (!(group in dropTargets)) {\n dropTargets[group] = [ that ];\n } else {\n dropTargets[group].push( that );\n }\n },\n\n events: [\n DRAGENTER,\n DRAGLEAVE,\n DROP\n ],\n\n options: {\n name: \"DropTarget\",\n group: \"default\"\n },\n\n destroy: function() {\n destroyDroppable(dropTargets, this);\n },\n\n _trigger: function(eventName, e) {\n var that = this,\n draggable = draggables[that.options.group];\n\n if (draggable) {\n return that.trigger(eventName, extend({}, e.event, {\n draggable: draggable,\n dropTarget: e.dropTarget\n }));\n }\n },\n\n _over: function(e) {\n this._trigger(DRAGENTER, e);\n },\n\n _out: function(e) {\n this._trigger(DRAGLEAVE, e);\n },\n\n _drop: function(e) {\n var that = this,\n draggable = draggables[that.options.group];\n\n if (draggable) {\n draggable.dropped = !that._trigger(DROP, e);\n }\n }\n });\n\n DropTarget.destroyGroup = function(groupName) {\n var group = dropTargets[groupName] || dropAreas[groupName],\n i;\n\n if (group) {\n for (i = 0; i < group.length; i++) {\n Widget.fn.destroy.call(group[i]);\n }\n\n group.length = 0;\n delete dropTargets[groupName];\n delete dropAreas[groupName];\n }\n };\n\n DropTarget._cache = dropTargets;\n\n var DropTargetArea = DropTarget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n var group = that.options.group;\n\n if (!(group in dropAreas)) {\n dropAreas[group] = [ that ];\n } else {\n dropAreas[group].push( that );\n }\n },\n\n destroy: function() {\n destroyDroppable(dropAreas, this);\n },\n\n options: {\n name: \"DropTargetArea\",\n group: \"default\",\n filter: null\n }\n });\n\n var Draggable = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._activated = false;\n\n that.userEvents = new UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: that.options.filter,\n threshold: that.options.distance,\n start: that._start.bind(that),\n hold: that._hold.bind(that),\n move: that._drag.bind(that),\n end: that._end.bind(that),\n cancel: that._cancel.bind(that),\n select: that._select.bind(that)\n });\n\n if (kendo.support.touch) {\n that.element.find(that.options.filter).css('touch-action', 'none');\n }\n\n that._afterEndHandler = that._afterEnd.bind(that);\n that._captureEscape = that._captureEscape.bind(that);\n },\n\n events: [\n HOLD,\n DRAGSTART,\n DRAG,\n DRAGEND,\n DRAGCANCEL,\n HINTDESTROYED\n ],\n\n options: {\n name: \"Draggable\",\n distance: ( kendo.support.touch ? 0 : 5),\n group: \"default\",\n cursorOffset: null,\n axis: null,\n container: null,\n filter: null,\n ignore: null,\n holdToDrag: false,\n autoScroll: false,\n dropped: false\n },\n\n cancelHold: function() {\n this._activated = false;\n },\n\n _captureEscape: function(e) {\n var that = this;\n\n if (e.keyCode === kendo.keys.ESC) {\n that._trigger(DRAGCANCEL, { event: e });\n that.userEvents.cancel();\n }\n },\n\n _updateHint: function(e) {\n var that = this,\n coordinates,\n options = that.options,\n boundaries = that.boundaries,\n axis = options.axis,\n cursorOffset = that.options.cursorOffset;\n\n if (cursorOffset) {\n coordinates = { left: e.x.location + cursorOffset.left, top: e.y.location + cursorOffset.top };\n } else {\n that.hintOffset.left += e.x.delta;\n that.hintOffset.top += e.y.delta;\n coordinates = $.extend({}, that.hintOffset);\n }\n\n if (boundaries) {\n coordinates.top = within(coordinates.top, boundaries.y);\n coordinates.left = within(coordinates.left, boundaries.x);\n }\n\n if (axis === \"x\") {\n delete coordinates.top;\n } else if (axis === \"y\") {\n delete coordinates.left;\n }\n\n that.hint.css(coordinates);\n },\n\n _shouldIgnoreTarget: function(target) {\n var ignoreSelector = this.options.ignore;\n return ignoreSelector && $(target).is(ignoreSelector);\n },\n\n _select: function(e) {\n if (!this._shouldIgnoreTarget(e.event.target)) {\n e.preventDefault();\n }\n },\n\n _start: function(e) {\n var that = this,\n options = that.options,\n container = options.container ? $(options.container) : null,\n hint = options.hint;\n\n if (this._shouldIgnoreTarget(e.touch.initialTouch) || (options.holdToDrag && !that._activated)) {\n that.userEvents.cancel();\n return;\n }\n\n that.currentTarget = e.target;\n that.currentTargetOffset = getOffset(that.currentTarget);\n\n if (hint) {\n if (that.hint) {\n that.hint.stop(true, true).remove();\n }\n\n that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n\n var offset = getOffset(that.currentTarget);\n that.hintOffset = offset;\n\n that.hint.css( {\n position: \"absolute\",\n zIndex: 20000, // the Window's z-index is 10000 and can be raised because of z-stacking\n left: offset.left,\n top: offset.top\n })\n .appendTo(document.body);\n\n that.angular(\"compile\", function() {\n that.hint.removeAttr(\"ng-repeat\");\n var scopeTarget = $(e.target);\n\n while (!scopeTarget.data(\"$$kendoScope\") && scopeTarget.length) {\n scopeTarget = scopeTarget.parent();\n }\n\n return {\n elements: that.hint.get(),\n scopeFrom: scopeTarget.data(\"$$kendoScope\")\n };\n });\n }\n\n draggables[options.group] = that;\n\n that.dropped = false;\n\n if (container) {\n that.boundaries = containerBoundaries(container, that.hint);\n }\n\n $(document).on(KEYUP, that._captureEscape);\n\n if (that._trigger(DRAGSTART, e)) {\n that.userEvents.cancel();\n that._afterEnd();\n }\n\n that.userEvents.capture();\n },\n\n _hold: function(e) {\n this.currentTarget = e.target;\n\n if (this._trigger(HOLD, e)) {\n this.userEvents.cancel();\n } else {\n this._activated = true;\n }\n },\n\n _drag: function(e) {\n e.preventDefault();\n\n var cursorElement = this._elementUnderCursor(e);\n\n if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n this._scrollableParent = findScrollableParent(cursorElement);\n this._cursorElement = cursorElement;\n }\n\n this._lastEvent = e;\n this._processMovement(e, cursorElement);\n\n if (this.options.autoScroll) {\n // chrome seems to trigger mousemove when mouse is moved outside of the window (over the Chrome), too.\n if (this._scrollableParent[0]) {\n var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n\n\n this._scrollCompenstation = $.extend({}, this.hintOffset);\n this._scrollVelocity = velocity;\n\n if (velocity.y === 0 && velocity.x === 0) {\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n } else if (!this._scrollInterval) {\n this._scrollInterval = setInterval(this._autoScroll.bind(this), 50);\n }\n }\n }\n\n if (this.hint) {\n this._updateHint(e);\n }\n },\n\n _processMovement: function(e, cursorElement) {\n this._withDropTarget(cursorElement, function(target, targetElement) {\n if (!target) {\n if (lastDropTarget) {\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n lastDropTarget = null;\n }\n return;\n }\n\n if (lastDropTarget) {\n if (targetElement === lastDropTarget.targetElement) {\n return;\n }\n\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n }\n\n target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n lastDropTarget = extend(target, { targetElement: targetElement });\n });\n\n this._trigger(DRAG, extend(e, { dropTarget: lastDropTarget, elementUnderCursor: cursorElement }));\n },\n\n _autoScroll: function() {\n var parent = this._scrollableParent[0],\n velocity = this._scrollVelocity,\n compensation = this._scrollCompenstation;\n\n if (!parent) {\n return;\n }\n\n var cursorElement = this._elementUnderCursor(this._lastEvent);\n this._processMovement(this._lastEvent, cursorElement);\n\n var yIsScrollable, xIsScrollable;\n\n var isRootNode = parent === scrollableRoot()[0];\n\n if (isRootNode) {\n yIsScrollable = document.body.scrollHeight > $window.height();\n xIsScrollable = document.body.scrollWidth > $window.width();\n } else {\n yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n }\n\n var yDelta = parent.scrollTop + velocity.y;\n var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n\n var xDelta = parent.scrollLeft + velocity.x;\n var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n\n if (yInBounds) {\n parent.scrollTop += velocity.y;\n } else if (yIsScrollable && yDelta < 0) {\n parent.scrollTop = 0;\n }\n\n if (xInBounds) {\n parent.scrollLeft += velocity.x;\n } else if (xIsScrollable && xDelta < 0) {\n parent.scrollLeft = 0;\n }\n\n if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n if (yInBounds) {\n compensation.top += velocity.y;\n }\n\n if (xInBounds) {\n compensation.left += velocity.x;\n }\n\n this.hint.css(compensation);\n }\n },\n\n _end: function(e) {\n this._withDropTarget(this._elementUnderCursor(e), function(target, targetElement) {\n if (target) {\n target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n lastDropTarget = null;\n }\n });\n\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n this._cancel(this._trigger(DRAGEND, e));\n },\n\n _cancel: function(isDefaultPrevented) {\n var that = this;\n\n that._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n that._activated = false;\n\n if (that.hint && !that.dropped) {\n setTimeout(function() {\n that.hint.stop(true, true);\n\n if (isDefaultPrevented) {\n that._afterEndHandler();\n } else {\n that.hint.animate(that.currentTargetOffset, \"fast\", that._afterEndHandler);\n }\n }, 0);\n\n } else {\n that._afterEnd();\n }\n },\n\n _trigger: function(eventName, e) {\n var that = this;\n\n return that.trigger(\n eventName, extend(\n {},\n e.event,\n {\n x: e.x,\n y: e.y,\n currentTarget: that.currentTarget,\n initialTarget: e.touch ? e.touch.initialTouch : null,\n dropTarget: e.dropTarget,\n elementUnderCursor: e.elementUnderCursor\n }\n ));\n },\n\n _elementUnderCursor: function(e) {\n var target = elementUnderCursor(e),\n hint = this.hint;\n\n if (hint && contains(hint[0], target)) {\n hint.hide();\n target = elementUnderCursor(e);\n // IE8 does not return the element in iframe from first attempt\n if (!target) {\n target = elementUnderCursor(e);\n }\n hint.show();\n }\n\n return target;\n },\n\n _withDropTarget: function(element, callback) {\n var result,\n group = this.options.group,\n targets = dropTargets[group],\n areas = dropAreas[group];\n\n if (targets && targets.length || areas && areas.length) {\n result = checkTarget(element, targets, areas);\n\n if (result) {\n callback(result.target, result.targetElement);\n } else {\n callback();\n }\n }\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that._afterEnd();\n\n that.userEvents.destroy();\n\n this._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n\n that.currentTarget = null;\n },\n\n _afterEnd: function() {\n var that = this;\n\n if (that.hint) {\n that.hint.remove();\n }\n\n delete draggables[that.options.group];\n\n that.trigger(\"destroy\");\n that.trigger(HINTDESTROYED);\n $(document).off(KEYUP, that._captureEscape);\n }\n });\n\n kendo.ui.plugin(DropTarget);\n kendo.ui.plugin(DropTargetArea);\n kendo.ui.plugin(Draggable);\n kendo.TapCapture = TapCapture;\n kendo.containerBoundaries = containerBoundaries;\n\n extend(kendo.ui, {\n Pane: Pane,\n PaneDimensions: PaneDimensions,\n Movable: Movable\n });\n\n function scrollableViewPort(element) {\n var root = scrollableRoot()[0],\n offset,\n top,\n left;\n\n if (element[0] === root) {\n top = root.scrollTop;\n left = root.scrollLeft;\n\n return {\n top: top,\n left: left,\n bottom: top + $window.height(),\n right: left + $window.width()\n };\n } else {\n offset = element.offset();\n offset.bottom = offset.top + element.height();\n offset.right = offset.left + element.width();\n return offset;\n }\n }\n\n function scrollableRoot() {\n return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\n }\n\n function findScrollableParent(element) {\n var root = scrollableRoot();\n\n if (!element || element === document.body || element === document.documentElement) {\n return root;\n }\n\n var parent = $(element)[0];\n\n while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n parent = parent.parentNode;\n }\n\n if (parent === document.body) {\n return root;\n }\n\n return $(parent);\n }\n\n function autoScrollVelocity(mouseX, mouseY, rect) {\n var velocity = { x: 0, y: 0 };\n\n var AUTO_SCROLL_AREA = 50;\n\n if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n }\n\n if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n }\n\n return velocity;\n }\n\n // export for testing\n kendo.ui.Draggable.utils = {\n autoScrollVelocity: autoScrollVelocity,\n scrollableViewPort: scrollableViewPort,\n findScrollableParent: findScrollableParent\n };\n\n })(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.popup',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"popup\",\n name: \"Pop-up\",\n category: \"framework\",\n depends: [ \"core\" ],\n advanced: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.ui,\n Widget = ui.Widget,\n Class = kendo.Class,\n support = kendo.support,\n getOffset = kendo.getOffset,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n OPEN = \"open\",\n CLOSE = \"close\",\n DEACTIVATE = \"deactivate\",\n ACTIVATE = \"activate\",\n CENTER = \"center\",\n LEFT = \"left\",\n RIGHT = \"right\",\n TOP = \"top\",\n BOTTOM = \"bottom\",\n ABSOLUTE = \"absolute\",\n HIDDEN = \"hidden\",\n BODY = \"body\",\n LOCATION = \"location\",\n POSITION = \"position\",\n VISIBLE = \"visible\",\n EFFECTS = \"effects\",\n ACTIVE = \"k-active\",\n ACTIVEBORDER = \"k-state-border\",\n ACTIVEBORDERREGEXP = /k-state-border-(\\w+)/,\n ACTIVECHILDREN = \".k-picker-wrap, .k-dropdown-wrap, .k-link\",\n MOUSEDOWN = \"down\",\n DOCUMENT_ELEMENT = $(document.documentElement),\n WINDOW = $(window),\n SCROLL = \"scroll\",\n cssPrefix = support.transitions.css,\n TRANSFORM = cssPrefix + \"transform\",\n extend = $.extend,\n NS = \".kendoPopup\",\n styles = [\"font-size\",\n \"font-family\",\n \"font-stretch\",\n \"font-style\",\n \"font-weight\",\n \"line-height\"];\n\n function contains(container, target) {\n if (!container || !target) {\n return false;\n }\n return container === target || $.contains(container, target);\n }\n\n var Popup = Widget.extend({\n init: function(element, options) {\n var that = this, parentPopup;\n\n options = options || {};\n\n if (options.isRtl) {\n options.origin = options.origin || BOTTOM + \" \" + RIGHT;\n options.position = options.position || TOP + \" \" + RIGHT;\n }\n\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n options = that.options;\n\n that.collisions = options.collision ? options.collision.split(\" \") : [];\n that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n\n if (that.collisions.length === 1) {\n that.collisions.push(that.collisions[0]);\n }\n\n parentPopup = $(that.options.anchor).closest(\".k-popup,.k-group\").filter(\":not([class^=km-])\"); // When popup is in another popup, make it relative.\n\n options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\n\n that.element.hide()\n .addClass(\"k-popup k-group k-reset\")\n .toggleClass(\"k-rtl\", !!options.isRtl)\n .css({ position: ABSOLUTE })\n .appendTo(options.appendTo)\n .attr(\"aria-hidden\", true)\n .on(\"mouseenter\" + NS, function() {\n that._hovered = true;\n })\n .on(\"wheel\" + NS, function(e) {\n var list = $(e.target).find(\".k-list\");\n var scrollArea = list.parent();\n if (list.length && list.is(\":visible\") && ((scrollArea.scrollTop() === 0 && e.originalEvent.deltaY < 0) ||\n (scrollArea.scrollTop() === scrollArea.prop('scrollHeight') - scrollArea.prop('offsetHeight') && e.originalEvent.deltaY > 0))) {\n e.preventDefault();\n }\n })\n .on(\"mouseleave\" + NS, function() {\n that._hovered = false;\n });\n\n that.wrapper = $();\n\n if (options.animation === false) {\n options.animation = { open: { effects: {} }, close: { hide: true, effects: {} } };\n }\n\n extend(options.animation.open, {\n complete: function() {\n that.wrapper.css({ overflow: VISIBLE }); // Forcing refresh causes flickering in mobile.\n that._activated = true;\n that._trigger(ACTIVATE);\n }\n });\n\n extend(options.animation.close, {\n complete: function() {\n that._animationClose();\n }\n });\n\n that._mousedownProxy = function(e) {\n that._mousedown(e);\n };\n\n if (support.mobileOS.android) {\n that._resizeProxy = function(e) {\n setTimeout(function() {\n that._resize(e);\n }, 600); //Logic from kendo.onResize\n };\n } else {\n that._resizeProxy = function(e) {\n that._resize(e);\n };\n }\n\n if (options.toggleTarget) {\n $(options.toggleTarget).on(options.toggleEvent + NS, that.toggle.bind(that));\n }\n },\n\n events: [\n OPEN,\n ACTIVATE,\n CLOSE,\n DEACTIVATE\n ],\n\n options: {\n name: \"Popup\",\n toggleEvent: \"click\",\n origin: BOTTOM + \" \" + LEFT,\n position: TOP + \" \" + LEFT,\n anchor: BODY,\n appendTo: null,\n collision: \"flip fit\",\n viewport: window,\n copyAnchorStyles: true,\n autosize: false,\n modal: false,\n adjustSize: {\n width: 0,\n height: 0\n },\n animation: {\n open: {\n effects: \"slideIn:down\",\n transition: true,\n duration: 200\n },\n close: { // if close animation effects are defined, they will be used instead of open.reverse\n duration: 100,\n hide: true\n }\n },\n omitOriginOffsets: false\n },\n\n _animationClose: function() {\n var that = this;\n var location = that.wrapper.data(LOCATION);\n\n that.wrapper.hide();\n\n if (location) {\n that.wrapper.css(location);\n }\n\n if (that.options.anchor != BODY) {\n that._hideDirClass();\n }\n\n that._closing = false;\n that._trigger(DEACTIVATE);\n },\n\n destroy: function() {\n var that = this,\n options = that.options,\n element = that.element.off(NS),\n parent;\n\n Widget.fn.destroy.call(that);\n\n if (options.toggleTarget) {\n $(options.toggleTarget).off(NS);\n }\n\n if (!options.modal) {\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n that._toggleResize(false);\n }\n\n kendo.destroy(that.element.children());\n element.removeData();\n\n if (options.appendTo[0] === document.body) {\n parent = element.parent(\".k-animation-container\");\n\n if (parent[0]) {\n parent.remove();\n } else {\n element.remove();\n }\n }\n },\n\n open: function(x, y) {\n var that = this,\n fixed = { isFixed: !isNaN(parseInt(y,10)), x: x, y: y },\n element = that.element,\n options = that.options,\n animation, wrapper,\n anchor = $(options.anchor),\n mobile = element[0] && element.hasClass(\"km-widget\"),\n listbox = element.find(\"[role='listbox']\");\n\n if (!that.visible()) {\n if (options.copyAnchorStyles) {\n if (mobile && styles[0] == \"font-size\") {\n styles.shift();\n }\n element.css(kendo.getComputedStyles(anchor[0], styles));\n }\n\n if (element.data(\"animating\") || that._trigger(OPEN)) {\n return;\n }\n\n that._activated = false;\n\n if (!options.modal) {\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy)\n .on(that.downEvent, that._mousedownProxy);\n\n // this binding hangs iOS in editor\n // all elements in IE7/8 fire resize event, causing mayhem\n that._toggleResize(false);\n that._toggleResize(true);\n }\n\n that.wrapper = wrapper = kendo.wrap(element, options.autosize)\n .css({\n overflow: HIDDEN,\n display: \"block\",\n position: ABSOLUTE\n })\n .attr(\"aria-hidden\", false);\n\n if (listbox.attr(\"aria-label\")) {\n wrapper.attr(\"aria-label\", listbox.attr(\"aria-label\"));\n } else if (listbox.attr(\"aria-labelledby\")) {\n wrapper.attr(\"aria-labelledby\", listbox.attr(\"aria-labelledby\"));\n }\n\n if (support.mobileOS.android) {\n wrapper.css(TRANSFORM, \"translatez(0)\"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur.\n }\n\n wrapper.css(POSITION);\n\n if ($(options.appendTo)[0] == document.body) {\n wrapper.css(TOP, \"-10000px\");\n }\n\n that.flipped = that._position(fixed);\n animation = that._openAnimation();\n\n if (options.anchor != BODY) {\n that._showDirClass(animation);\n }\n\n if (!element.is(\":visible\") && element.data(\"olddisplay\") === undefined) {\n element.show();\n element.data(\"olddisplay\", element.css(\"display\"));\n element.hide();\n }\n\n element.data(EFFECTS, animation.effects)\n .kendoStop(true)\n .kendoAnimate(animation)\n .attr(\"aria-hidden\", false);\n }\n },\n\n _location: function(isFixed) {\n var that = this,\n element = that.element,\n options = that.options,\n wrapper,\n anchor = $(options.anchor),\n mobile = element[0] && element.hasClass(\"km-widget\");\n\n if (options.copyAnchorStyles) {\n if (mobile && styles[0] == \"font-size\") {\n styles.shift();\n }\n element.css(kendo.getComputedStyles(anchor[0], styles));\n }\n\n that.wrapper = wrapper = kendo.wrap(element, options.autosize)\n .css({\n overflow: HIDDEN,\n display: \"block\",\n position: ABSOLUTE\n });\n\n if (support.mobileOS.android) {\n wrapper.css(TRANSFORM, \"translatez(0)\"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur.\n }\n\n wrapper.css(POSITION);\n\n if ($(options.appendTo)[0] == document.body) {\n wrapper.css(TOP, \"-10000px\");\n }\n\n that._position(isFixed || {});\n\n var offset = wrapper.offset();\n return {\n width: kendo._outerWidth(wrapper),\n height: kendo._outerHeight(wrapper),\n left: offset.left,\n top: offset.top\n };\n },\n\n _openAnimation: function() {\n var animation = extend(true, {}, this.options.animation.open);\n animation.effects = kendo.parseEffects(animation.effects, this.flipped);\n\n return animation;\n },\n\n _hideDirClass: function() {\n var anchor = $(this.options.anchor);\n var direction = ((anchor.attr(\"class\") || \"\").match(ACTIVEBORDERREGEXP) || [\"\", \"down\"])[1];\n var dirClass = ACTIVEBORDER + \"-\" + direction;\n\n anchor\n .removeClass(dirClass)\n .children(ACTIVECHILDREN)\n .removeClass(ACTIVE)\n .removeClass(dirClass);\n\n this.element.removeClass(ACTIVEBORDER + \"-\" + kendo.directions[direction].reverse);\n },\n\n _showDirClass: function(animation) {\n var direction = animation.effects.slideIn ? animation.effects.slideIn.direction : \"down\";\n var dirClass = ACTIVEBORDER + \"-\" + direction;\n\n $(this.options.anchor)\n .addClass(dirClass)\n .children(ACTIVECHILDREN)\n .addClass(ACTIVE)\n .addClass(dirClass);\n\n this.element.addClass(ACTIVEBORDER + \"-\" + kendo.directions[direction].reverse);\n },\n\n position: function() {\n if (this.visible()) {\n this.flipped = this._position();\n //this._hideDirClass();\n //this._showDirClass(this._openAnimation());\n }\n },\n\n toggle: function() {\n var that = this;\n\n that[that.visible() ? CLOSE : OPEN]();\n },\n\n visible: function() {\n return this.element.is(\":\" + VISIBLE);\n },\n\n close: function(skipEffects) {\n var that = this,\n options = that.options, wrap,\n animation, openEffects, closeEffects;\n\n if (that.visible()) {\n wrap = (that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide());\n\n that._toggleResize(false);\n\n if (that._closing || that._trigger(CLOSE)) {\n that._toggleResize(true);\n return;\n }\n\n // Close all inclusive popups.\n that.element.find(\".k-popup\").each(function() {\n var that = $(this),\n popup = that.data(\"kendoPopup\");\n\n if (popup) {\n popup.close(skipEffects);\n }\n });\n\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n\n if (skipEffects) {\n animation = { hide: true, effects: {} };\n } else {\n animation = extend(true, {}, options.animation.close);\n openEffects = that.element.data(EFFECTS);\n closeEffects = animation.effects;\n\n if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\n animation.effects = openEffects;\n animation.reverse = true;\n }\n\n that._closing = true;\n }\n\n that.element\n .kendoStop(true)\n .attr(\"aria-hidden\", true);\n wrap\n .css({ overflow: HIDDEN }) // stop callback will remove hidden overflow\n .attr(\"aria-hidden\", true);\n that.element.kendoAnimate(animation);\n\n if (skipEffects) {\n that._animationClose();\n }\n }\n },\n\n _trigger: function(ev) {\n return this.trigger(ev, { type: ev });\n },\n\n _resize: function(e) {\n var that = this;\n\n if (support.resize.indexOf(e.type) !== -1) {\n clearTimeout(that._resizeTimeout);\n that._resizeTimeout = setTimeout(function() {\n that._position();\n that._resizeTimeout = null;\n }, 50);\n } else {\n if (!that._hovered || (that._activated && that.element.find(\".k-list\").length > 0)) {\n that.close();\n }\n }\n },\n\n _toggleResize: function(toggle) {\n var method = toggle ? \"on\" : \"off\";\n var eventNames = support.resize;\n\n if (!(support.mobileOS.ios || support.mobileOS.android || support.browser.safari)) {\n eventNames += \" \" + SCROLL;\n }\n\n if (toggle && !this.scrollableParents) {\n this.scrollableParents = this._scrollableParents();\n }\n\n if (this.scrollableParents && this.scrollableParents.length) {\n this.scrollableParents[method](SCROLL, this._resizeProxy);\n }\n\n WINDOW[method](eventNames, this._resizeProxy);\n },\n\n _mousedown: function(e) {\n var that = this,\n container = that.element[0],\n options = that.options,\n anchor = $(options.anchor)[0],\n toggleTarget = options.toggleTarget,\n target = kendo.eventTarget(e),\n popup = $(target).closest(\".k-popup\"),\n mobile = popup.parent().parent(\".km-shim\").length;\n\n popup = popup[0];\n if (!mobile && popup && popup !== that.element[0]) {\n return;\n }\n\n // This MAY result in popup not closing in certain cases.\n if ($(e.target).closest(\"a\").data(\"rel\") === \"popover\") {\n return;\n }\n\n if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\n that.close();\n }\n },\n\n _fit: function(position, size, viewPortSize) {\n var output = 0;\n\n if (position + size > viewPortSize) {\n output = viewPortSize - (position + size);\n }\n\n if (position < 0) {\n output = -position;\n }\n\n return output;\n },\n\n _flip: function(offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\n var output = 0;\n boxSize = boxSize || size;\n\n if (position !== origin && position !== CENTER && origin !== CENTER) {\n if (offset + boxSize > viewPortSize) {\n output += -(anchorSize + size);\n }\n\n if (offset + output < 0) {\n output += anchorSize + size;\n }\n }\n return output;\n },\n\n _scrollableParents: function() {\n return $(this.options.anchor)\n .parentsUntil(\"body\")\n .filter(function(index, element) {\n return kendo.isScrollable(element);\n });\n },\n\n _position: function(fixed) {\n var that = this,\n //element = that.element.css(POSITION, \"\"), /* fixes telerik/kendo-ui-core#790, comes from telerik/kendo#615 */\n element = that.element,\n wrapper = that.wrapper,\n options = that.options,\n viewport = $(options.viewport),\n zoomLevel = support.zoomLevel(),\n isWindow = !!((viewport[0] == window) && window.innerWidth && (zoomLevel <= 1.02)),\n anchor = $(options.anchor),\n origins = options.origin.toLowerCase().split(\" \"),\n positions = options.position.toLowerCase().split(\" \"),\n collisions = that.collisions,\n siblingContainer, parents,\n parentZIndex, zIndex = 10002,\n idx = 0,\n docEl = document.documentElement,\n length, viewportOffset, viewportWidth, viewportHeight;\n\n if (options.viewport === window) {\n viewportOffset = {\n top: (window.pageYOffset || document.documentElement.scrollTop || 0),\n left: (window.pageXOffset || document.documentElement.scrollLeft || 0)\n };\n } else {\n viewportOffset = viewport.offset();\n }\n\n if (isWindow) {\n viewportWidth = window.innerWidth;\n viewportHeight = window.innerHeight;\n } else {\n viewportWidth = viewport.width();\n viewportHeight = viewport.height();\n }\n\n if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\n var sign = options.isRtl ? -1 : 1;\n\n viewportWidth -= sign * kendo.support.scrollbar();\n }\n\n siblingContainer = anchor.parents().filter(wrapper.siblings());\n\n if (siblingContainer[0]) {\n parentZIndex = Math.max(Number(siblingContainer.css(\"zIndex\")), 0);\n\n // set z-index to be more than that of the container/sibling\n // compensate with more units for window z-stack\n if (parentZIndex) {\n zIndex = parentZIndex + 10;\n } else {\n parents = anchor.parentsUntil(siblingContainer);\n for (length = parents.length; idx < length; idx++) {\n parentZIndex = Number($(parents[idx]).css(\"zIndex\"));\n if (parentZIndex && zIndex < parentZIndex) {\n zIndex = parentZIndex + 10;\n }\n }\n }\n }\n\n wrapper.css(\"zIndex\", zIndex);\n\n if (fixed && fixed.isFixed) {\n wrapper.css({ left: fixed.x, top: fixed.y });\n } else {\n wrapper.css(that._align(origins, positions));\n }\n\n var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]),\n offset = getOffset(wrapper),\n anchorParent = anchor.offsetParent().parent(\".k-animation-container,.k-popup,.k-group\"); // If the parent is positioned, get the current positions\n\n if (anchorParent.length) {\n pos = getOffset(wrapper, POSITION, true);\n offset = getOffset(wrapper);\n }\n\n offset.top -= viewportOffset.top;\n offset.left -= viewportOffset.left;\n\n if (!that.wrapper.data(LOCATION)) { // Needed to reset the popup location after every closure - fixes the resize bugs.\n wrapper.data(LOCATION, extend({}, pos));\n }\n\n var offsets = extend({}, offset),\n location = extend({}, pos),\n adjustSize = options.adjustSize;\n\n if (collisions[0] === \"fit\") {\n location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\n }\n\n if (collisions[1] === \"fit\") {\n location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\n }\n\n var flipPos = extend({}, location);\n var elementHeight = outerHeight(element);\n var wrapperHeight = outerHeight(wrapper);\n\n if (!wrapper.height() && elementHeight) {\n wrapperHeight = wrapperHeight + elementHeight;\n }\n\n if (collisions[0] === \"flip\") {\n location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\n }\n\n if (collisions[1] === \"flip\") {\n location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\n }\n\n element.css(POSITION, ABSOLUTE);\n wrapper.css(location);\n\n return (location.left != flipPos.left || location.top != flipPos.top);\n },\n\n _align: function(origin, position) {\n var that = this,\n element = that.wrapper,\n anchor = $(that.options.anchor),\n verticalOrigin = origin[0],\n horizontalOrigin = origin[1],\n verticalPosition = position[0],\n horizontalPosition = position[1],\n anchorOffset = getOffset(anchor),\n appendTo = $(that.options.appendTo),\n appendToOffset,\n width = outerWidth(element),\n height = outerHeight(element) || outerHeight(element.children().first()),\n anchorWidth = outerWidth(anchor),\n anchorHeight = outerHeight(anchor),\n top = that.options.omitOriginOffsets ? 0 : anchorOffset.top,\n left = that.options.omitOriginOffsets ? 0 : anchorOffset.left,\n round = Math.round;\n\n if (appendTo[0] != document.body) {\n appendToOffset = getOffset(appendTo);\n top -= appendToOffset.top;\n left -= appendToOffset.left;\n }\n\n\n if (verticalOrigin === BOTTOM) {\n top += anchorHeight;\n }\n\n if (verticalOrigin === CENTER) {\n top += round(anchorHeight / 2);\n }\n\n if (verticalPosition === BOTTOM) {\n top -= height;\n }\n\n if (verticalPosition === CENTER) {\n top -= round(height / 2);\n }\n\n if (horizontalOrigin === RIGHT) {\n left += anchorWidth;\n }\n\n if (horizontalOrigin === CENTER) {\n left += round(anchorWidth / 2);\n }\n\n if (horizontalPosition === RIGHT) {\n left -= width;\n }\n\n if (horizontalPosition === CENTER) {\n left -= round(width / 2);\n }\n\n return {\n top: top,\n left: left\n };\n }\n });\n\n ui.plugin(Popup);\n\n var stableSort = kendo.support.stableSort;\n var tabKeyTrapNS = \"kendoTabKeyTrap\";\n var focusableNodesSelector = \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]\";\n var TabKeyTrap = Class.extend({\n init: function(element) {\n this.element = $(element);\n this.element.autoApplyNS(tabKeyTrapNS);\n },\n\n trap: function() {\n this.element.on(\"keydown\", this._keepInTrap.bind(this));\n },\n\n removeTrap: function() {\n this.element.kendoDestroy(tabKeyTrapNS);\n },\n\n destroy: function() {\n this.element.kendoDestroy(tabKeyTrapNS);\n this.element = undefined;\n },\n\n shouldTrap: function() {\n return true;\n },\n\n _keepInTrap: function(e) {\n if (e.which !== 9 || !this.shouldTrap() || e.isDefaultPrevented()) {\n return;\n }\n\n var elements = this._focusableElements();\n var sortedElements = this._sortFocusableElements(elements);\n var next = this._nextFocusable(e, sortedElements);\n\n this._focus(next);\n\n e.preventDefault();\n },\n _focusableElements: function() {\n var elements = this.element.find(focusableNodesSelector).filter(function(i, item) {\n return item.tabIndex >= 0 && $(item).is(':visible') && !$(item).is('[disabled]');\n });\n\n if (this.element.is(\"[tabindex]\")) {\n elements.push(this.element[0]);\n }\n\n return elements;\n },\n _sortFocusableElements: function(elements) {\n var sortedElements;\n\n if (stableSort) {\n sortedElements = elements.sort(function(prev, next) {\n return prev.tabIndex - next.tabIndex;\n });\n } else {\n var attrName = \"__k_index\";\n elements.each(function(i, item) {\n item.setAttribute(attrName, i);\n });\n\n sortedElements = elements.sort(function(prev, next) {\n return prev.tabIndex === next.tabIndex ?\n parseInt(prev.getAttribute(attrName), 10) - parseInt(next.getAttribute(attrName), 10) :\n prev.tabIndex - next.tabIndex;\n });\n\n elements.removeAttr(attrName);\n }\n\n return sortedElements;\n },\n _nextFocusable: function(e, elements) {\n var count = elements.length;\n var current = elements.index(e.target);\n\n return elements.get((current + (e.shiftKey ? -1 : 1)) % count);\n },\n _focus: function(element) {\n if (element.nodeName == \"IFRAME\") {\n element.contentWindow.document.body.focus();\n return;\n }\n\n element.focus();\n\n if (element.nodeName == \"INPUT\" && element.setSelectionRange && this._haveSelectionRange(element)) {\n element.setSelectionRange(0, element.value.length);\n }\n },\n _haveSelectionRange: function(element) {\n var elementType = element.type.toLowerCase();\n\n return elementType === \"text\" || elementType === \"search\" ||\n elementType === \"url\" || elementType === \"tel\" ||\n elementType === \"password\";\n }\n });\n ui.Popup.TabKeyTrap = TabKeyTrap;\n})(window.kendo.jQuery);\n\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.touch',[ \"kendo.core\", \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"touch\",\n name: \"Touch\",\n category: \"mobile\",\n description: \"The kendo Touch widget provides a cross-platform compatible API for handling user-initiated touch events, multi-touch gestures and event sequences (drag, swipe, etc.). \",\n depends: [ \"core\", \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n abs = Math.abs,\n MAX_DOUBLE_TAP_DISTANCE = 20;\n\n var Touch = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n options = that.options;\n\n element = that.element;\n that.wrapper = element;\n\n function eventProxy(name) {\n return function(e) {\n that._triggerTouch(name, e);\n };\n }\n\n function gestureEventProxy(name) {\n return function(e) {\n that.trigger(name, { touches: e.touches, distance: e.distance, center: e.center, event: e.event });\n };\n }\n\n that.events = new kendo.UserEvents(element, {\n filter: options.filter,\n surface: options.surface,\n minHold: options.minHold,\n multiTouch: options.multiTouch,\n allowSelection: true,\n fastTap: options.fastTap,\n press: eventProxy(\"touchstart\"),\n hold: eventProxy(\"hold\"),\n tap: that._tap.bind(that),\n gesturestart: gestureEventProxy(\"gesturestart\"),\n gesturechange: gestureEventProxy(\"gesturechange\"),\n gestureend: gestureEventProxy(\"gestureend\")\n });\n\n if (options.enableSwipe) {\n that.events.bind(\"start\", that._swipestart.bind(that));\n that.events.bind(\"move\", that._swipemove.bind(that));\n } else {\n that.events.bind(\"start\", that._dragstart.bind(that));\n that.events.bind(\"move\", eventProxy(\"drag\"));\n that.events.bind(\"end\", eventProxy(\"dragend\"));\n }\n\n kendo.notify(that);\n },\n\n events: [\n \"touchstart\",\n \"dragstart\",\n \"drag\",\n \"dragend\",\n \"tap\",\n \"doubletap\",\n \"hold\",\n \"swipe\",\n \"gesturestart\",\n \"gesturechange\",\n \"gestureend\"\n ],\n\n options: {\n name: \"Touch\",\n surface: null,\n global: false,\n fastTap: false,\n filter: null,\n multiTouch: false,\n enableSwipe: false,\n minXDelta: 30,\n maxYDelta: 20,\n maxDuration: 1000,\n minHold: 800,\n doubleTapTimeout: 800\n },\n\n cancel: function() {\n this.events.cancel();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.events.destroy();\n },\n\n _triggerTouch: function(type, e) {\n if (this.trigger(type, { touch: e.touch, event: e.event })) {\n e.preventDefault();\n }\n },\n\n _tap: function(e) {\n var that = this,\n lastTap = that.lastTap,\n touch = e.touch;\n\n if (lastTap &&\n (touch.endTime - lastTap.endTime < that.options.doubleTapTimeout) &&\n kendo.touchDelta(touch, lastTap).distance < MAX_DOUBLE_TAP_DISTANCE\n ) {\n\n that._triggerTouch(\"doubletap\", e);\n that.lastTap = null;\n } else {\n that._triggerTouch(\"tap\", e);\n that.lastTap = touch;\n }\n },\n\n _dragstart: function(e) {\n this._triggerTouch(\"dragstart\", e);\n },\n\n _swipestart: function(e) {\n if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n e.sender.capture();\n }\n },\n\n _swipemove: function(e) {\n var that = this,\n options = that.options,\n touch = e.touch,\n duration = e.event.timeStamp - touch.startTime,\n direction = touch.x.initialDelta > 0 ? \"right\" : \"left\";\n\n if (\n abs(touch.x.initialDelta) >= options.minXDelta &&\n abs(touch.y.initialDelta) < options.maxYDelta &&\n duration < options.maxDuration\n )\n {\n that.trigger(\"swipe\", {\n direction: direction,\n touch: e.touch\n });\n\n touch.cancel();\n }\n }\n });\n\n kendo.ui.plugin(Touch);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.scroller',[ \"kendo.fx\", \"kendo.draganddrop\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.scroller\",\n name: \"Scroller\",\n category: \"mobile\",\n description: \"The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.\",\n depends: [ \"fx\", \"draganddrop\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n fx = kendo.effects,\n ui = mobile.ui,\n extend = $.extend,\n Widget = ui.Widget,\n Class = kendo.Class,\n Movable = kendo.ui.Movable,\n Pane = kendo.ui.Pane,\n PaneDimensions = kendo.ui.PaneDimensions,\n Transition = fx.Transition,\n Animation = fx.Animation,\n abs = Math.abs,\n SNAPBACK_DURATION = 500,\n SCROLLBAR_OPACITY = 0.7,\n FRICTION = 0.96,\n VELOCITY_MULTIPLIER = 10,\n MAX_VELOCITY = 55,\n OUT_OF_BOUNDS_FRICTION = 0.5,\n ANIMATED_SCROLLER_PRECISION = 5,\n RELEASECLASS = \"km-scroller-release\",\n REFRESHCLASS = \"km-scroller-refresh\",\n PULL = \"pull\",\n CHANGE = \"change\",\n RESIZE = \"resize\",\n SCROLL = \"scroll\",\n MOUSE_WHEEL_ID = 2;\n\n var ZoomSnapBack = Animation.extend({\n init: function(options) {\n var that = this;\n Animation.fn.init.call(that);\n extend(that, options);\n\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\n that.tapCapture.bind(\"press\", that.cancel.bind(that));\n },\n\n enabled: function() {\n return this.movable.scale < this.dimensions.minScale;\n },\n\n done: function() {\n return this.dimensions.minScale - this.movable.scale < 0.01;\n },\n\n tick: function() {\n var movable = this.movable;\n movable.scaleWith(1.1);\n this.dimensions.rescale(movable.scale);\n },\n\n onEnd: function() {\n var movable = this.movable;\n movable.scaleTo(this.dimensions.minScale);\n this.dimensions.rescale(movable.scale);\n }\n });\n\n var DragInertia = Animation.extend({\n init: function(options) {\n var that = this;\n\n Animation.fn.init.call(that);\n\n extend(that, options, {\n transition: new Transition({\n axis: options.axis,\n movable: options.movable,\n onEnd: function() { that._end(); }\n })\n });\n\n that.tapCapture.bind(\"press\", function() { that.cancel(); });\n that.userEvents.bind(\"end\", that.start.bind(that));\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\n that.userEvents.bind(\"tap\", that.onEnd.bind(that));\n },\n\n onCancel: function() {\n this.transition.cancel();\n },\n\n freeze: function(location) {\n var that = this;\n that.cancel();\n that._moveTo(location);\n },\n\n onEnd: function() {\n var that = this;\n if (that.paneAxis.outOfBounds()) {\n that._snapBack();\n } else {\n that._end();\n }\n },\n\n done: function() {\n return abs(this.velocity) < 1;\n },\n\n start: function(e) {\n var that = this,\n velocity;\n\n if (!that.dimension.enabled) { return; }\n\n if (that.paneAxis.outOfBounds()) {\n if (that.transition._started) {\n that.transition.cancel();\n that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\n\n Animation.fn.start.call(that);\n } else {\n that._snapBack();\n }\n } else {\n velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n\n that.tapCapture.captureNext();\n Animation.fn.start.call(that);\n }\n },\n\n tick: function() {\n var that = this,\n dimension = that.dimension,\n friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction,\n delta = (that.velocity *= friction),\n location = that.movable[that.axis] + delta;\n\n if (!that.elastic && dimension.outOfBounds(location)) {\n location = Math.max(Math.min(location, dimension.max), dimension.min);\n that.velocity = 0;\n }\n\n that.movable.moveAxis(that.axis, location);\n },\n\n _end: function() {\n this.tapCapture.cancelCapture();\n this.end();\n },\n\n _snapBack: function() {\n var that = this,\n dimension = that.dimension,\n snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n that._moveTo(snapBack);\n },\n\n _moveTo: function(location) {\n this.transition.moveTo({ location: location, duration: SNAPBACK_DURATION, ease: Transition.easeOutExpo });\n }\n });\n\n var AnimatedScroller = Animation.extend({\n init: function(options) {\n var that = this;\n\n kendo.effects.Animation.fn.init.call(this);\n\n extend(that, options, {\n origin: {},\n destination: {},\n offset: {}\n });\n },\n\n tick: function() {\n this._updateCoordinates();\n this.moveTo(this.origin);\n },\n\n done: function() {\n return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n },\n\n onEnd: function() {\n this.moveTo(this.destination);\n if (this.callback) {\n this.callback.call();\n }\n },\n\n setCoordinates: function(from, to) {\n this.offset = {};\n this.origin = from;\n this.destination = to;\n },\n\n setCallback: function(callback) {\n if (callback && kendo.isFunction(callback)) {\n this.callback = callback;\n } else {\n callback = undefined;\n }\n },\n\n _updateCoordinates: function() {\n this.offset = {\n x: (this.destination.x - this.origin.x) / 4,\n y: (this.destination.y - this.origin.y) / 4\n };\n\n this.origin = {\n y: this.origin.y + this.offset.y,\n x: this.origin.x + this.offset.x\n };\n }\n });\n\n var ScrollBar = Class.extend({\n init: function(options) {\n var that = this,\n horizontal = options.axis === \"x\",\n element = $('
    ');\n\n if (horizontal) {\n element.attr(\"aria-orientation\", \"horizontal\");\n }\n\n extend(that, options, {\n element: element,\n elementSize: 0,\n movable: new Movable(element),\n scrollMovable: options.movable,\n alwaysVisible: options.alwaysVisible,\n size: horizontal ? \"width\" : \"height\"\n });\n\n that.scrollMovable.bind(CHANGE, that.refresh.bind(that));\n that.container.append(element);\n if (options.alwaysVisible) {\n that.show();\n }\n },\n\n refresh: function() {\n var that = this,\n axis = that.axis,\n dimension = that.dimension,\n paneSize = dimension.size,\n scrollMovable = that.scrollMovable,\n sizeRatio = paneSize / dimension.total,\n position = Math.round(-scrollMovable[axis] * sizeRatio),\n size = Math.round(paneSize * sizeRatio);\n\n if (sizeRatio >= 1) {\n this.element.css(\"display\", \"none\");\n } else {\n this.element.css(\"display\", \"\");\n }\n\n if (position + size > paneSize) {\n size = paneSize - position;\n } else if (position < 0) {\n size += position;\n position = 0;\n }\n\n if (that.elementSize != size) {\n that.element.css(that.size, size + \"px\");\n that.elementSize = size;\n }\n\n that._ariaValue(position, dimension.size - that.elementSize);\n\n that.movable.moveAxis(axis, position);\n },\n\n show: function() {\n this.element.css({ opacity: SCROLLBAR_OPACITY, visibility: \"visible\" });\n },\n\n hide: function() {\n if (!this.alwaysVisible) {\n this.element.css({ opacity: 0 });\n }\n },\n\n _ariaValue: function(current, total) {\n var element = this.element;\n\n if (current > total) {\n current = total;\n }\n\n element.attr(\"aria-valuemax\", total);\n element.attr(\"aria-valuenow\", current);\n }\n });\n\n var Scroller = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n\n that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n if (that._native) {\n element.addClass(\"km-native-scroller\")\n .prepend('
    ');\n\n extend(that, {\n scrollElement: element,\n fixedContainer: element.children().first()\n });\n\n return;\n }\n\n element\n .css(\"overflow\", \"hidden\")\n .addClass(\"km-scroll-wrapper\")\n .wrapInner('
    ')\n .prepend('
    ');\n\n var inner = element.children().eq(1),\n\n tapCapture = new kendo.TapCapture(element),\n\n movable = new Movable(inner),\n\n dimensions = new PaneDimensions({\n element: inner,\n container: element,\n forcedEnabled: that.options.zoom\n }),\n\n avoidScrolling = this.options.avoidScrolling,\n\n userEvents = new kendo.UserEvents(element, {\n touchAction: \"pan-y\",\n fastTap: true,\n allowSelection: true,\n preventDragEvent: true,\n captureUpIfMoved: true,\n multiTouch: that.options.zoom,\n supportDoubleTap: that.options.supportDoubleTap,\n start: function(e) {\n dimensions.refresh();\n\n var velocityX = abs(e.x.velocity),\n velocityY = abs(e.y.velocity),\n horizontalSwipe = velocityX * 2 >= velocityY,\n originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target),\n verticalSwipe = velocityY * 2 >= velocityX;\n\n\n if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n userEvents.capture();\n } else {\n userEvents.cancel();\n }\n }\n }),\n\n pane = new Pane({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n elastic: that.options.elastic\n }),\n\n zoomSnapBack = new ZoomSnapBack({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n tapCapture: tapCapture\n }),\n\n animatedScroller = new AnimatedScroller({\n moveTo: function(coordinates) {\n that.scrollTo(coordinates.x, coordinates.y);\n }\n });\n\n movable.bind(CHANGE, function() {\n that.scrollTop = - movable.y;\n that.scrollLeft = - movable.x;\n\n that.trigger(SCROLL, {\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n });\n\n if (that.options.mousewheelScrolling) {\n element.on(\"DOMMouseScroll mousewheel\", this._wheelScroll.bind(this));\n }\n\n extend(that, {\n movable: movable,\n dimensions: dimensions,\n zoomSnapBack: zoomSnapBack,\n animatedScroller: animatedScroller,\n userEvents: userEvents,\n pane: pane,\n tapCapture: tapCapture,\n pulled: false,\n enabled: true,\n scrollElement: inner,\n scrollTop: 0,\n scrollLeft: 0,\n fixedContainer: element.children().first()\n });\n\n that._initAxis(\"x\");\n that._initAxis(\"y\");\n\n // build closure\n that._wheelEnd = function() {\n that._wheel = false;\n that.userEvents.end(0, that._wheelY);\n };\n\n dimensions.refresh();\n\n if (that.options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n if (!this._wheel) {\n this._wheel = true;\n this._wheelY = 0;\n this.userEvents.press(0, this._wheelY);\n }\n\n clearTimeout(this._wheelTimeout);\n this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n\n var delta = kendo.wheelDeltaY(e);\n\n if (delta) {\n this._wheelY += delta;\n this.userEvents.move(0, this._wheelY);\n }\n\n e.preventDefault();\n },\n\n makeVirtual: function() {\n this.dimensions.y.makeVirtual();\n },\n\n virtualSize: function(min, max) {\n this.dimensions.y.virtualSize(min, max);\n },\n\n height: function() {\n return this.dimensions.y.size;\n },\n\n scrollHeight: function() {\n return this.scrollElement[0].scrollHeight;\n },\n\n scrollWidth: function() {\n return this.scrollElement[0].scrollWidth;\n },\n\n options: {\n name: \"Scroller\",\n zoom: false,\n pullOffset: 140,\n visibleScrollHints: false,\n elastic: true,\n useNative: false,\n mousewheelScrolling: true,\n avoidScrolling: function() { return false; },\n pullToRefresh: false,\n messages: {\n pullTemplate: \"Pull to refresh\",\n releaseTemplate: \"Release to refresh\",\n refreshTemplate: \"Refreshing\"\n }\n },\n\n events: [\n PULL,\n SCROLL,\n RESIZE\n ],\n\n _resize: function() {\n if (!this._native) {\n this.contentResized();\n }\n },\n\n setOptions: function(options) {\n var that = this;\n Widget.fn.setOptions.call(that, options);\n if (options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n\n reset: function() {\n if (this._native) {\n this.scrollElement.scrollTop(0);\n } else {\n this.movable.moveTo({ x: 0, y: 0 });\n this._scale(1);\n }\n },\n\n contentResized: function() {\n this.dimensions.refresh();\n if (this.pane.x.outOfBounds()) {\n this.movable.moveAxis(\"x\", this.dimensions.x.min);\n }\n\n if (this.pane.y.outOfBounds()) {\n this.movable.moveAxis(\"y\", this.dimensions.y.min);\n }\n },\n\n zoomOut: function() {\n var dimensions = this.dimensions;\n dimensions.refresh();\n this._scale(dimensions.fitScale);\n this.movable.moveTo(dimensions.centerCoordinates());\n },\n\n enable: function() {\n this.enabled = true;\n },\n\n disable: function() {\n this.enabled = false;\n },\n\n scrollTo: function(x, y) {\n if (this._native) {\n kendo.scrollLeft(this.scrollElement, abs(x));\n this.scrollElement.scrollTop(abs(y));\n } else {\n this.dimensions.refresh();\n this.movable.moveTo({ x: x, y: y });\n }\n },\n\n animatedScrollTo: function(x, y, callback) {\n var from,\n to;\n\n if (this._native) {\n this.scrollTo(x, y);\n } else {\n from = { x: this.movable.x, y: this.movable.y };\n to = { x: x, y: y };\n\n this.animatedScroller.setCoordinates(from, to);\n this.animatedScroller.setCallback(callback);\n this.animatedScroller.start();\n }\n },\n\n pullHandled: function() {\n var that = this;\n that.refreshHint.removeClass(REFRESHCLASS);\n that.hintContainer.html(that.pullTemplate({}));\n that.yinertia.onEnd();\n that.xinertia.onEnd();\n that.userEvents.cancel();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n if (this.userEvents) {\n this.userEvents.destroy();\n }\n },\n\n _scale: function(scale) {\n this.dimensions.rescale(scale);\n this.movable.scaleTo(scale);\n },\n\n _initPullToRefresh: function() {\n var that = this;\n\n that.dimensions.y.forceEnabled();\n that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n\n that.scrollElement.prepend('' + that.pullTemplate({}) + '');\n that.refreshHint = that.scrollElement.children().first();\n that.hintContainer = that.refreshHint.children(\".km-template\");\n\n that.pane.y.bind(\"change\", that._paneChange.bind(that));\n that.userEvents.bind(\"end\", that._dragEnd.bind(that));\n },\n\n _dragEnd: function() {\n var that = this;\n\n if (!that.pulled) {\n return;\n }\n\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n that.hintContainer.html(that.refreshTemplate({}));\n that.yinertia.freeze(that.options.pullOffset / 2);\n that.trigger(\"pull\");\n },\n\n _paneChange: function() {\n var that = this;\n\n if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n if (!that.pulled) {\n that.pulled = true;\n that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n that.hintContainer.html(that.releaseTemplate({}));\n }\n } else if (that.pulled) {\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS);\n that.hintContainer.html(that.pullTemplate({}));\n }\n },\n\n _initAxis: function(axis) {\n var that = this,\n elementId = that.element.attr(\"id\"),\n movable = that.movable,\n dimension = that.dimensions[axis],\n tapCapture = that.tapCapture,\n paneAxis = that.pane[axis],\n scrollBar;\n\n if (!elementId) {\n elementId = kendo.guid();\n that.element.attr(\"id\", elementId);\n }\n\n scrollBar = new ScrollBar({\n axis: axis,\n movable: movable,\n dimension: dimension,\n container: that.element,\n alwaysVisible: that.options.visibleScrollHints,\n controlsId: elementId\n });\n\n dimension.bind(CHANGE, function() {\n scrollBar.refresh();\n });\n\n paneAxis.bind(CHANGE, function() {\n scrollBar.show();\n });\n\n that[axis + \"inertia\"] = new DragInertia({\n axis: axis,\n paneAxis: paneAxis,\n movable: movable,\n tapCapture: tapCapture,\n userEvents: that.userEvents,\n dimension: dimension,\n elastic: that.options.elastic,\n friction: that.options.friction || FRICTION,\n velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n end: function() {\n scrollBar.hide();\n that.trigger(\"scrollEnd\", {\n axis: axis,\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n }\n });\n }\n });\n\n ui.plugin(Scroller);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.view',[ \"kendo.core\", \"kendo.fx\", \"kendo.mobile.scroller\", \"kendo.view\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.view\",\n name: \"View\",\n category: \"mobile\",\n description: \"Mobile View\",\n depends: [ \"core\", \"fx\", \"mobile.scroller\", \"view\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n ui = mobile.ui,\n attr = kendo.attr,\n Widget = ui.Widget,\n ViewClone = kendo.ViewClone,\n INIT = \"init\",\n UI_OVERLAY = '
    ',\n BEFORE_SHOW = \"beforeShow\",\n SHOW = \"show\",\n AFTER_SHOW = \"afterShow\",\n BEFORE_HIDE = \"beforeHide\",\n TRANSITION_END = \"transitionEnd\",\n TRANSITION_START = \"transitionStart\",\n HIDE = \"hide\",\n DESTROY = \"destroy\",\n attrValue = kendo.attrValue,\n roleSelector = kendo.roleSelector,\n directiveSelector = kendo.directiveSelector,\n compileMobileDirective = kendo.compileMobileDirective;\n\n function initPopOvers(element) {\n var popovers = element.find(roleSelector(\"popover\")),\n idx, length,\n roles = ui.roles;\n\n for (idx = 0, length = popovers.length; idx < length; idx ++) {\n kendo.initWidget(popovers[idx], {}, roles);\n }\n }\n\n function preventScrollIfNotInput(e) {\n if (!kendo.triggeredByInput(e)) {\n e.preventDefault();\n }\n }\n\n var View = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n this.params = {};\n\n $.extend(this, options);\n\n this.transition = this.transition || this.defaultTransition;\n\n this._id();\n\n if (!this.options.$angular) {\n this._layout();\n this._overlay();\n this._scroller();\n this._model();\n } else {\n this._overlay();\n }\n },\n\n events: [\n INIT,\n BEFORE_SHOW,\n SHOW,\n AFTER_SHOW,\n BEFORE_HIDE,\n HIDE,\n DESTROY,\n TRANSITION_START,\n TRANSITION_END\n ],\n\n options: {\n name: \"View\",\n title: \"\",\n layout: null,\n getLayout: $.noop,\n reload: false,\n transition: \"\",\n defaultTransition: \"\",\n useNativeScrolling: false,\n stretch: false,\n zoom: false,\n model: null,\n modelScope: window,\n scroller: {},\n initWidgets: true\n },\n\n enable: function(enable) {\n if (typeof enable == \"undefined\") {\n enable = true;\n }\n\n if (enable) {\n this.overlay.hide();\n } else {\n this.overlay.show();\n }\n },\n\n destroy: function() {\n if (this.layout) {\n this.layout.detach(this);\n }\n\n this.trigger(DESTROY);\n\n\n Widget.fn.destroy.call(this);\n\n if (this.scroller) {\n this.scroller.destroy();\n }\n\n if (this.options.$angular) {\n this.element.scope().$destroy();\n }\n\n kendo.destroy(this.element);\n },\n\n purge: function() {\n this.destroy();\n this.element.remove();\n },\n\n triggerBeforeShow: function() {\n if (this.trigger(BEFORE_SHOW, { view: this })) {\n return false;\n }\n return true;\n },\n\n triggerBeforeHide: function() {\n if (this.trigger(BEFORE_HIDE, { view: this })) {\n return false;\n }\n return true;\n },\n\n showStart: function() {\n var element = this.element;\n\n element.css(\"display\", \"\");\n\n if (!this.inited) {\n this.inited = true;\n this.trigger(INIT, { view: this });\n } else { // skip the initial controller update\n this._invokeNgController();\n }\n\n if (this.layout) {\n this.layout.attach(this);\n }\n\n this._padIfNativeScrolling();\n this.trigger(SHOW, { view: this });\n kendo.resize(element);\n },\n\n showEnd: function() {\n this.trigger(AFTER_SHOW, { view: this });\n this._padIfNativeScrolling();\n },\n\n hideEnd: function() {\n var that = this;\n that.element.hide();\n that.trigger(HIDE, { view: that });\n\n if (that.layout) {\n that.layout.trigger(HIDE, { view: that, layout: that.layout });\n }\n },\n\n beforeTransition: function(type) {\n this.trigger(TRANSITION_START, { type: type });\n },\n\n afterTransition: function(type) {\n this.trigger(TRANSITION_END, { type: type });\n },\n\n _padIfNativeScrolling: function() {\n if (mobile.appLevelNativeScrolling()) {\n var isAndroid = kendo.support.mobileOS && kendo.support.mobileOS.android,\n skin = mobile.application.skin() || \"\",\n isAndroidForced = mobile.application.os.android || (skin.indexOf(\"android\") > -1),\n hasPlatformIndependentSkin = skin === \"flat\" || (skin.indexOf(\"material\") > -1),\n topContainer = (isAndroid || isAndroidForced) && (!hasPlatformIndependentSkin) ? \"footer\" : \"header\",\n bottomContainer = (isAndroid || isAndroidForced) && (!hasPlatformIndependentSkin) ? \"header\" : \"footer\";\n\n this.content.css({\n paddingTop: this[topContainer].height(),\n paddingBottom: this[bottomContainer].height()\n });\n }\n },\n\n contentElement: function() {\n var that = this;\n\n return that.options.stretch ? that.content : that.scrollerContent;\n },\n\n clone: function() {\n return new ViewClone(this);\n },\n\n _scroller: function() {\n var that = this;\n\n if (mobile.appLevelNativeScrolling()) {\n return;\n }\n if (that.options.stretch) {\n that.content.addClass(\"km-stretched-view\");\n } else {\n that.content.kendoMobileScroller($.extend(that.options.scroller, { zoom: that.options.zoom, useNative: that.options.useNativeScrolling }));\n\n that.scroller = that.content.data(\"kendoMobileScroller\");\n that.scrollerContent = that.scroller.scrollElement;\n }\n\n // prevent accidental address bar display when pulling the header\n if (kendo.support.kineticScrollNeeded) {\n $(that.element).on(\"touchmove\", \".km-header\", preventScrollIfNotInput);\n if (!that.options.useNativeScrolling && !that.options.stretch) {\n $(that.element).on(\"touchmove\", \".km-content\", preventScrollIfNotInput);\n }\n }\n },\n\n _model: function() {\n var that = this,\n element = that.element,\n model = that.options.model;\n\n if (typeof model === \"string\") {\n model = kendo.getter(model)(that.options.modelScope);\n }\n\n that.model = model;\n\n initPopOvers(element);\n\n that.element.css(\"display\", \"\");\n if (that.options.initWidgets) {\n if (model) {\n kendo.bind(element, model, ui, kendo.ui, kendo.dataviz.ui);\n } else {\n mobile.init(element.children());\n }\n }\n that.element.css(\"display\", \"none\");\n },\n\n _id: function() {\n var element = this.element,\n idAttrValue = element.attr(\"id\") || \"\";\n\n this.id = attrValue(element, \"url\") || \"#\" + idAttrValue;\n\n if (this.id == \"#\") {\n this.id = kendo.guid();\n element.attr(\"id\", this.id);\n }\n },\n\n _layout: function() {\n var contentSelector = roleSelector(\"content\"),\n element = this.element;\n\n element.addClass(\"km-view\");\n\n this.header = element.children(roleSelector(\"header\")).addClass(\"km-header\");\n this.footer = element.children(roleSelector(\"footer\")).addClass(\"km-footer\");\n\n if (!element.children(contentSelector)[0]) {\n element.wrapInner(\"
    ');\n }\n\n this.content = element.children(roleSelector(\"content\"))\n .addClass(\"km-content\");\n\n this.element.prepend(this.header).append(this.footer);\n\n\n this.layout = this.options.getLayout(this.layout);\n\n if (this.layout) {\n this.layout.setup(this);\n }\n },\n\n _overlay: function() {\n this.overlay = $(UI_OVERLAY).appendTo(this.element);\n },\n\n _invokeNgController: function() {\n var controller,\n scope;\n\n if (this.options.$angular) {\n controller = this.element.controller();\n scope = this.options.$angular[0];\n\n if (controller) {\n var callback = this._callController.bind(this, controller, scope);\n\n if (/^\\$(digest|apply)$/.test(scope.$$phase)) {\n callback();\n } else {\n scope.$apply(callback);\n }\n }\n }\n },\n\n _callController: function(controller, scope) {\n this.element.injector().invoke(controller.constructor, controller, { $scope: scope });\n }\n });\n\n function initWidgets(collection) {\n collection.each(function() {\n kendo.initWidget($(this), {}, ui.roles);\n });\n }\n\n var Layout = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n\n element = this.element;\n\n this.header = element.children(this._locate(\"header\")).addClass(\"km-header\");\n this.footer = element.children(this._locate(\"footer\")).addClass(\"km-footer\");\n this.elements = this.header.add(this.footer);\n\n initPopOvers(element);\n\n if (!this.options.$angular) {\n kendo.mobile.init(this.element.children());\n }\n this.element.detach();\n this.trigger(INIT, { layout: this });\n },\n\n _locate: function(selectors) {\n return this.options.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n },\n\n options: {\n name: \"Layout\",\n id: null,\n platform: null\n },\n\n events: [\n INIT,\n SHOW,\n HIDE\n ],\n\n setup: function(view) {\n if (!view.header[0]) { view.header = this.header; }\n if (!view.footer[0]) { view.footer = this.footer; }\n },\n\n detach: function(view) {\n var that = this;\n if (view.header === that.header && that.header[0]) {\n view.element.prepend(that.header.detach()[0].cloneNode(true));\n }\n\n if (view.footer === that.footer && that.footer.length) {\n view.element.append(that.footer.detach()[0].cloneNode(true));\n }\n },\n\n attach: function(view) {\n var that = this,\n previousView = that.currentView;\n\n if (previousView) {\n that.detach(previousView);\n }\n\n if (view.header === that.header) {\n that.header.detach();\n view.element.children(roleSelector(\"header\")).remove();\n view.element.prepend(that.header);\n }\n\n if (view.footer === that.footer) {\n that.footer.detach();\n view.element.children(roleSelector(\"footer\")).remove();\n view.element.append(that.footer);\n }\n\n that.trigger(SHOW, { layout: that, view: view });\n that.currentView = view;\n }\n });\n\n var Observable = kendo.Observable,\n bodyRegExp = /]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i,\n LOAD_START = \"loadStart\",\n LOAD_COMPLETE = \"loadComplete\",\n SHOW_START = \"showStart\",\n SAME_VIEW_REQUESTED = \"sameViewRequested\",\n VIEW_SHOW = \"viewShow\",\n VIEW_TYPE_DETERMINED = \"viewTypeDetermined\",\n AFTER = \"after\";\n\n var ViewEngine = Observable.extend({\n init: function(options) {\n var that = this,\n views,\n errorMessage,\n container,\n collection;\n\n Observable.fn.init.call(that);\n\n $.extend(that, options);\n that.sandbox = $(\"
    \");\n container = that.container;\n\n views = that._hideViews(container);\n that.rootView = views.first();\n\n if (!that.rootView[0] && options.rootNeeded) {\n if (container[0] == kendo.mobile.application.element[0]) {\n errorMessage = 'Your kendo mobile application element does not contain any direct child elements with data-role=\"view\" attribute set. Make sure that you instantiate the mobile application using the correct container.';\n } else {\n errorMessage = 'Your pane element does not contain any direct child elements with data-role=\"view\" attribute set.';\n }\n throw new Error(errorMessage);\n }\n\n that.layouts = {};\n\n that.viewContainer = new kendo.ViewContainer(that.container);\n\n that.viewContainer.bind(\"accepted\", function(e) {\n e.view.params = that.params;\n });\n\n that.viewContainer.bind(\"complete\", function(e) {\n that.trigger(VIEW_SHOW, { view: e.view });\n });\n\n that.viewContainer.bind(AFTER, function() {\n that.trigger(AFTER);\n });\n\n this.getLayoutProxy = this._getLayout.bind(this);\n that._setupLayouts(container);\n\n collection = container.children(that._locate(\"modalview drawer\"));\n if (that.$angular) {\n\n that.$angular[0].viewOptions = {\n defaultTransition: that.transition,\n loader: that.loader,\n container: that.container,\n getLayout: that.getLayoutProxy\n };\n\n collection.each(function(idx, element) {\n compileMobileDirective($(element), options.$angular[0]);\n });\n } else {\n initWidgets(collection);\n }\n\n this.bind(this.events, options);\n },\n\n events: [\n SHOW_START,\n AFTER,\n VIEW_SHOW,\n LOAD_START,\n LOAD_COMPLETE,\n SAME_VIEW_REQUESTED,\n VIEW_TYPE_DETERMINED\n ],\n\n destroy: function() {\n kendo.destroy(this.container);\n\n for (var id in this.layouts) {\n this.layouts[id].destroy();\n }\n },\n\n view: function() {\n return this.viewContainer.view;\n },\n\n showView: function(url, transition, params) {\n url = url.replace(new RegExp(\"^\" + this.remoteViewURLPrefix), \"\");\n if (url === \"\" && this.remoteViewURLPrefix) {\n url = \"/\";\n }\n\n if (url.replace(/^#/, \"\") === this.url) {\n this.trigger(SAME_VIEW_REQUESTED);\n return false;\n }\n\n this.trigger(SHOW_START);\n\n var that = this,\n showClosure = function(view) {\n return that.viewContainer.show(view, transition, url);\n },\n element = that._findViewElement(url),\n view = kendo.widgetInstance(element);\n\n that.url = url.replace(/^#/, \"\");\n\n that.params = params;\n\n if (view && view.reload) {\n view.purge();\n element = [];\n }\n\n this.trigger(VIEW_TYPE_DETERMINED, { remote: element.length === 0, url: url });\n\n if (element[0]) {\n if (!view) {\n view = that._createView(element);\n }\n\n return showClosure(view);\n } else {\n if (this.serverNavigation) {\n location.href = url;\n } else {\n that._loadView(url, showClosure);\n }\n return true;\n }\n },\n\n append: function(html, url) {\n var sandbox = this.sandbox,\n urlPath = (url || \"\").split(\"?\")[0],\n container = this.container,\n views,\n modalViews,\n view;\n\n if (bodyRegExp.test(html)) {\n html = RegExp.$1;\n }\n\n sandbox[0].innerHTML = html;\n\n container.append(sandbox.children(\"script, style\"));\n\n views = this._hideViews(sandbox);\n view = views.first();\n\n // Generic HTML content found as remote view - no remote view markers\n if (!view.length) {\n views = view = sandbox.wrapInner(\"
    \").children(); // one element\n }\n\n if (urlPath) {\n view.hide().attr(attr(\"url\"), urlPath);\n }\n\n this._setupLayouts(sandbox);\n\n modalViews = sandbox.children(this._locate(\"modalview drawer\"));\n\n container.append(sandbox.children(this._locate(\"layout modalview drawer\")).add(views));\n\n // Initialize the modalviews after they have been appended to the final container\n initWidgets(modalViews);\n\n return this._createView(view);\n },\n\n _locate: function(selectors) {\n return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n },\n\n _findViewElement: function(url) {\n var element,\n urlPath = url.split(\"?\")[0];\n\n if (!urlPath) {\n return this.rootView;\n }\n\n element = this.container.children(\"[\" + attr(\"url\") + \"='\" + urlPath + \"']\");\n\n // do not try to search for \"#/foo/bar\" id, jQuery throws error\n if (!element[0] && urlPath.indexOf(\"/\") === -1) {\n element = this.container.children(urlPath.charAt(0) === \"#\" ? urlPath : \"#\" + urlPath);\n }\n\n return element;\n },\n\n _createView: function(element) {\n if (this.$angular) {\n return compileMobileDirective(element, this.$angular[0]);\n } else {\n return kendo.initWidget(element, {\n defaultTransition: this.transition,\n loader: this.loader,\n container: this.container,\n getLayout: this.getLayoutProxy,\n modelScope: this.modelScope,\n reload: attrValue(element, \"reload\")\n }, ui.roles);\n }\n },\n\n _getLayout: function(name) {\n if (name === \"\") {\n return null;\n }\n\n return name ? this.layouts[name] : this.layouts[this.layout];\n },\n\n _loadView: function(url, callback) {\n if (this._xhr) {\n this._xhr.abort();\n }\n\n this.trigger(LOAD_START);\n\n this._xhr = $.get(kendo.absoluteURL(url, this.remoteViewURLPrefix), \"html\")\n .always(this._xhrComplete.bind(this, callback, url));\n },\n\n _xhrComplete: function(callback, url, response) {\n var success = true;\n\n if (typeof response === \"object\") {\n if (response.status === 0) {\n if (response.responseText && response.responseText.length > 0) {\n success = true;\n response = response.responseText;\n } else { // request has been aborted for real\n return;\n }\n }\n }\n\n this.trigger(LOAD_COMPLETE);\n\n if (success) {\n callback(this.append(response, url));\n }\n },\n\n _hideViews: function(container) {\n return container.children(this._locate(\"view splitview\")).hide();\n },\n\n _setupLayouts: function(element) {\n var that = this,\n layout;\n\n element.children(that._locate(\"layout\")).each(function() {\n if (that.$angular) {\n layout = compileMobileDirective($(this), that.$angular[0]);\n } else {\n layout = kendo.initWidget($(this), {}, ui.roles);\n }\n\n var platform = layout.options.platform;\n\n if (!platform || platform === mobile.application.os.name) {\n that.layouts[layout.options.id] = layout;\n } else {\n layout.destroy();\n }\n });\n\n }\n });\n\n kendo.mobile.ViewEngine = ViewEngine;\n\n ui.plugin(View);\n ui.plugin(Layout);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.loader',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.loader\",\n name: \"Loader\",\n category: \"mobile\",\n description: \"Mobile Loader\",\n depends: [ \"core\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Widget = ui.Widget,\n CAPTURE_EVENTS = $.map(kendo.eventMap, function(value) { return value; }).join(\" \").split(\" \");\n\n var Loader = Widget.extend({\n init: function(container, options) {\n var that = this,\n element = $('
    ');\n\n Widget.fn.init.call(that, element, options);\n\n that.container = container;\n that.captureEvents = false;\n\n that._attachCapture();\n\n element.append(that.options.loading).hide().appendTo(container);\n },\n\n options: {\n name: \"Loader\",\n loading: \"

    Loading...

    \",\n timeout: 100\n },\n\n show: function() {\n var that = this;\n\n clearTimeout(that._loading);\n\n if (that.options.loading === false) {\n return;\n }\n\n that.captureEvents = true;\n that._loading = setTimeout(function() {\n that.element.show();\n }, that.options.timeout);\n },\n\n hide: function() {\n this.captureEvents = false;\n clearTimeout(this._loading);\n this.element.hide();\n },\n\n changeMessage: function(message) {\n this.options.loading = message;\n this.element.find(\">h1\").html(message);\n },\n\n transition: function() {\n this.captureEvents = true;\n this.container.css(\"pointer-events\", \"none\");\n },\n\n transitionDone: function() {\n this.captureEvents = false;\n this.container.css(\"pointer-events\", \"\");\n },\n\n _attachCapture: function() {\n var that = this;\n that.captureEvents = false;\n\n function capture(e) {\n if (that.captureEvents) {\n e.preventDefault();\n }\n }\n\n for (var i = 0; i < CAPTURE_EVENTS.length; i ++) {\n that.container[0].addEventListener(CAPTURE_EVENTS[i], capture, true);\n }\n }\n });\n\n ui.plugin(Loader);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.pane',[ \"kendo.mobile.view\", \"kendo.mobile.loader\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.pane\",\n name: \"Pane\",\n category: \"mobile\",\n description: \"Mobile Pane\",\n depends: [ \"mobile.view\", \"mobile.loader\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n roleSelector = kendo.roleSelector,\n ui = mobile.ui,\n Widget = ui.Widget,\n ViewEngine = mobile.ViewEngine,\n View = ui.View,\n Loader = mobile.ui.Loader,\n\n EXTERNAL = \"external\",\n HREF = \"href\",\n DUMMY_HREF = \"#!\",\n\n NAVIGATE = \"navigate\",\n VIEW_SHOW = \"viewShow\",\n SAME_VIEW_REQUESTED = \"sameViewRequested\",\n OS = kendo.support.mobileOS,\n SKIP_TRANSITION_ON_BACK_BUTTON = OS.ios && !OS.appMode && OS.flatVersion >= 700,\n WIDGET_RELS = /popover|actionsheet|modalview|drawer/,\n BACK = \"#:back\",\n\n attrValue = kendo.attrValue;\n\n var Pane = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n options = that.options;\n element = that.element;\n\n element.addClass(\"km-pane\");\n\n if (that.options.collapsible) {\n element.addClass(\"km-collapsible-pane\");\n }\n\n this.history = [];\n\n this.historyCallback = function(url, params, backButtonPressed) {\n var transition = that.transition;\n that.transition = null;\n\n // swiping back in iOS leaves the app in a very broken state if we perform a transition\n if (SKIP_TRANSITION_ON_BACK_BUTTON && backButtonPressed) {\n transition = \"none\";\n }\n\n return that.viewEngine.showView(url, transition, params);\n };\n\n this._historyNavigate = function(url) {\n if (url === BACK) {\n if (that.history.length === 1) {\n return;\n }\n\n that.history.pop();\n url = that.history[that.history.length - 1];\n } else {\n that.history.push(url);\n }\n\n that.historyCallback(url, kendo.parseQueryStringParams(url));\n };\n\n this._historyReplace = function(url) {\n var params = kendo.parseQueryStringParams(url);\n that.history[that.history.length - 1] = url;\n that.historyCallback(url, params);\n };\n\n that.loader = new Loader(element, {\n loading: that.options.loading\n });\n\n that.viewEngine = new ViewEngine({\n container: element,\n transition: options.transition,\n modelScope: options.modelScope,\n rootNeeded: !options.initial,\n serverNavigation: options.serverNavigation,\n remoteViewURLPrefix: options.root || \"\",\n layout: options.layout,\n $angular: options.$angular,\n loader: that.loader,\n\n showStart: function() {\n that.loader.transition();\n that.closeActiveDialogs();\n },\n\n after: function() {\n that.loader.transitionDone();\n },\n\n viewShow: function(e) {\n that.trigger(VIEW_SHOW, e);\n },\n\n loadStart: function() {\n that.loader.show();\n },\n\n loadComplete: function() {\n that.loader.hide();\n },\n\n sameViewRequested: function() {\n that.trigger(SAME_VIEW_REQUESTED);\n },\n\n viewTypeDetermined: function(e) {\n if (!e.remote || !that.options.serverNavigation) {\n that.trigger(NAVIGATE, { url: e.url });\n }\n }\n });\n\n\n this._setPortraitWidth();\n\n kendo.onResize(function() {\n that._setPortraitWidth();\n });\n\n that._setupAppLinks();\n },\n\n closeActiveDialogs: function() {\n var dialogs = this.element.find(roleSelector(\"actionsheet popover modalview\")).filter(\":visible\");\n dialogs.each(function() {\n kendo.widgetInstance($(this), ui).close();\n });\n },\n\n navigateToInitial: function() {\n var initial = this.options.initial;\n\n if (initial) {\n this.navigate(initial);\n }\n\n return initial;\n },\n\n options: {\n name: \"Pane\",\n portraitWidth: \"\",\n transition: \"\",\n layout: \"\",\n collapsible: false,\n initial: null,\n modelScope: window,\n loading: \"

    Loading...

    \"\n },\n\n events: [\n NAVIGATE,\n VIEW_SHOW,\n SAME_VIEW_REQUESTED\n ],\n\n append: function(html) {\n return this.viewEngine.append(html);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.viewEngine.destroy();\n this.userEvents.destroy();\n },\n\n navigate: function(url, transition) {\n if (url instanceof View) {\n url = url.id;\n }\n\n this.transition = transition;\n\n this._historyNavigate(url);\n },\n\n replace: function(url, transition) {\n if (url instanceof View) {\n url = url.id;\n }\n\n this.transition = transition;\n\n this._historyReplace(url);\n },\n\n bindToRouter: function(router) {\n var that = this,\n history = this.history,\n viewEngine = this.viewEngine;\n\n router.bind(\"init\", function(e) {\n var url = e.url,\n attrUrl = router.pushState ? url : \"/\";\n\n viewEngine.rootView.attr(kendo.attr(\"url\"), attrUrl);\n\n // if current is set, then this means that the pane has navigated to a given view - we need to update the router accordingly.\n var length = history.length;\n\n if (url === \"/\" && length) {\n router.navigate(history[length - 1], true);\n e.preventDefault(); // prevents from executing routeMissing, by default\n }\n });\n\n router.bind(\"routeMissing\", function(e) {\n if (!that.historyCallback(e.url, e.params, e.backButtonPressed)) {\n e.preventDefault();\n }\n });\n\n router.bind(\"same\", function() {\n that.trigger(SAME_VIEW_REQUESTED);\n });\n\n that._historyNavigate = function(url) {\n router.navigate(url);\n };\n\n that._historyReplace = function(url) {\n router.replace(url);\n };\n },\n\n hideLoading: function() {\n this.loader.hide();\n },\n\n showLoading: function() {\n this.loader.show();\n },\n\n changeLoadingMessage: function(message) {\n this.loader.changeMessage(message);\n },\n\n view: function() {\n return this.viewEngine.view();\n },\n\n _setPortraitWidth: function() {\n var width,\n portraitWidth = this.options.portraitWidth;\n\n if (portraitWidth) {\n width = kendo.mobile.application.element.is(\".km-vertical\") ? portraitWidth : \"auto\";\n this.element.css(\"width\", width);\n }\n },\n\n _setupAppLinks: function() {\n var that = this,\n linkRoles = \"tab\",\n pressedButtonSelector = \"[data-\" + kendo.ns + \"navigate-on-press]\",\n\n buttonSelectors = $.map([\"button\", \"backbutton\", \"detailbutton\", \"listview-link\"] , function(role) {\n return roleSelector(role) + \":not(\" + pressedButtonSelector + \")\";\n }).join(\",\");\n\n this.element.handler(this)\n .on(\"down\", roleSelector(linkRoles) + \",\" + pressedButtonSelector, \"_mouseup\")\n .on(\"click\", roleSelector(linkRoles) + \",\" + buttonSelectors + \",\" + pressedButtonSelector, \"_appLinkClick\");\n\n this.userEvents = new kendo.UserEvents(this.element, {\n fastTap: true,\n filter: buttonSelectors,\n tap: function(e) {\n e.event.currentTarget = e.touch.currentTarget;\n that._mouseup(e.event);\n }\n });\n\n // remove the ms-touch-action added by the user events, breaks native scrolling in WP8\n this.element.css('-ms-touch-action', '');\n },\n\n _appLinkClick: function(e) {\n var href = $(e.currentTarget).attr(\"href\");\n var remote = href && href[0] !== \"#\" && this.options.serverNavigation;\n\n if (!remote && attrValue($(e.currentTarget), \"rel\") != EXTERNAL) {\n e.preventDefault();\n }\n },\n\n _mouseup: function(e) {\n if (e.which > 1 || e.isDefaultPrevented()) {\n return;\n }\n\n var pane = this,\n link = $(e.currentTarget),\n transition = attrValue(link, \"transition\"),\n rel = attrValue(link, \"rel\") || \"\",\n target = attrValue(link, \"target\"),\n href = link.attr(HREF),\n delayedTouchEnd = SKIP_TRANSITION_ON_BACK_BUTTON && link[0].offsetHeight === 0,\n remote = href && href[0] !== \"#\" && this.options.serverNavigation;\n\n if (delayedTouchEnd || remote || rel === EXTERNAL || (typeof href === \"undefined\") || href === DUMMY_HREF) {\n return;\n }\n\n // Prevent iOS address bar progress display for in app navigation\n link.attr(HREF, DUMMY_HREF);\n setTimeout(function() { link.attr(HREF, href); });\n\n if (rel.match(WIDGET_RELS)) {\n kendo.widgetInstance($(href), ui).openFor(link);\n // if propagation is not stopped and actionsheet is opened from tabstrip,\n // the actionsheet is closed immediately.\n if (rel === \"actionsheet\" || rel === \"drawer\") {\n e.stopPropagation();\n }\n } else {\n if (target === \"_top\") {\n pane = mobile.application.pane;\n }\n else if (target) {\n pane = $(\"#\" + target).data(\"kendoMobilePane\");\n }\n\n pane.navigate(href, transition);\n }\n\n e.preventDefault();\n }\n });\n\n Pane.wrap = function(element) {\n if (!element.is(roleSelector(\"view\"))) {\n element = element.wrap('
    ').parent();\n }\n\n var paneContainer = element.wrap('
    ').parent(),\n pane = new Pane(paneContainer);\n\n pane.navigate(\"\");\n\n return pane;\n };\n ui.plugin(Pane);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.popover',[ \"kendo.popup\", \"kendo.mobile.pane\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.popover\",\n name: \"PopOver\",\n category: \"mobile\",\n description: \"The mobile PopOver widget represents a transient view which is displayed when the user taps on a navigational widget or area on the screen. \",\n depends: [ \"popup\", \"mobile.pane\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n ui = mobile.ui,\n HIDE = \"hide\",\n OPEN = \"open\",\n CLOSE = \"close\",\n WRAPPER = '
    ',\n ARROW = '
    ',\n OVERLAY = '
    ',\n DIRECTION_CLASSES = \"km-up km-down km-left km-right\",\n Widget = ui.Widget,\n DIRECTIONS = {\n \"down\": {\n origin: \"bottom center\",\n position: \"top center\"\n },\n \"up\": {\n origin: \"top center\",\n position: \"bottom center\"\n },\n \"left\": {\n origin: \"center left\",\n position: \"center right\",\n collision: \"fit flip\"\n },\n \"right\": {\n origin: \"center right\",\n position: \"center left\",\n collision: \"fit flip\"\n }\n },\n\n ANIMATION = {\n animation: {\n open: {\n effects: \"fade:in\",\n duration: 0\n },\n close: {\n effects: \"fade:out\",\n duration: 400\n }\n }\n },\n DIMENSIONS = {\n \"horizontal\": { offset: \"top\", size: \"height\" },\n \"vertical\": { offset: \"left\", size: \"width\" }\n },\n\n REVERSE = {\n \"up\": \"down\",\n \"down\": \"up\",\n \"left\": \"right\",\n \"right\": \"left\"\n };\n\n var Popup = Widget.extend({\n init: function(element, options) {\n var that = this,\n containerPopup = element.closest(\".km-modalview-wrapper\"),\n viewport = element.closest(\".km-root\").children('.km-pane').first(),\n container = containerPopup[0] ? containerPopup : viewport,\n popupOptions,\n axis;\n\n if (options.viewport) {\n viewport = options.viewport;\n } else if (!viewport[0]) {\n viewport = window;\n }\n\n if (options.container) {\n container = options.container;\n } else if (!container[0]) {\n container = document.body;\n }\n\n popupOptions = {\n viewport: viewport,\n copyAnchorStyles: false,\n autosize: true,\n open: function() {\n that.overlay.show();\n },\n\n activate: that._activate.bind(that),\n\n deactivate: function() {\n that.overlay.hide();\n if (!that._apiCall) {\n that.trigger(HIDE);\n }\n\n that._apiCall = false;\n }\n };\n\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n options = that.options;\n\n element.wrap(WRAPPER).addClass(\"km-popup\").show();\n\n axis = that.options.direction.match(/left|right/) ? \"horizontal\" : \"vertical\";\n\n that.dimensions = DIMENSIONS[axis];\n\n that.wrapper = element.parent().css({\n width: options.width,\n height: options.height\n }).addClass(\"km-popup-wrapper km-\" + options.direction).hide();\n\n that.arrow = $(ARROW).prependTo(that.wrapper).hide();\n\n that.overlay = $(OVERLAY).appendTo(container).hide();\n popupOptions.appendTo = that.overlay;\n\n if (options.className) {\n that.overlay.addClass(options.className);\n }\n\n that.popup = new kendo.ui.Popup(that.wrapper, $.extend(true, popupOptions, ANIMATION, DIRECTIONS[options.direction]));\n },\n\n options: {\n name: \"Popup\",\n width: 240,\n height: \"\",\n direction: \"down\",\n container: null,\n viewport: null\n },\n\n events: [\n HIDE\n ],\n\n show: function(target) {\n this.popup.options.anchor = $(target);\n this.popup.open();\n },\n\n hide: function() {\n this._apiCall = true;\n this.popup.close();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.popup.destroy();\n this.overlay.remove();\n },\n\n target: function() {\n return this.popup.options.anchor;\n },\n\n _activate: function() {\n var that = this,\n direction = that.options.direction,\n dimensions = that.dimensions,\n offset = dimensions.offset,\n popup = that.popup,\n anchor = popup.options.anchor,\n anchorOffset = $(anchor).offset(),\n elementOffset = $(popup.element).offset(),\n cssClass = popup.flipped ? REVERSE[direction] : direction,\n min = that.arrow[dimensions.size]() * 2,\n max = that.element[dimensions.size]() - that.arrow[dimensions.size](),\n size = $(anchor)[dimensions.size](),\n offsetAmount = anchorOffset[offset] - elementOffset[offset] + (size / 2);\n\n if (offsetAmount < min) {\n offsetAmount = min;\n }\n\n if (offsetAmount > max) {\n offsetAmount = max;\n }\n\n that.wrapper.removeClass(DIRECTION_CLASSES).addClass(\"km-\" + cssClass);\n that.arrow.css(offset, offsetAmount).show();\n }\n });\n\n var PopOver = Widget.extend({\n init: function(element, options) {\n var that = this,\n popupOptions;\n\n that.initialOpen = false;\n\n Widget.fn.init.call(that, element, options);\n\n popupOptions = $.extend({\n className: \"km-popover-root\",\n hide: function() { that.trigger(CLOSE); }\n }, this.options.popup);\n\n that.popup = new Popup(that.element, popupOptions);\n that.popup.overlay.on(\"move\", function(e) {\n if (e.target == that.popup.overlay[0]) {\n e.preventDefault();\n }\n });\n\n that.pane = new ui.Pane(that.element, $.extend(this.options.pane, { $angular: this.options.$angular }));\n\n kendo.notify(that, ui);\n },\n\n options: {\n name: \"PopOver\",\n popup: { },\n pane: { }\n },\n\n events: [\n OPEN,\n CLOSE\n ],\n\n open: function(target) {\n this.popup.show(target);\n\n if (!this.initialOpen) {\n if (!this.pane.navigateToInitial()) {\n this.pane.navigate(\"\");\n }\n\n this.popup.popup._position();\n this.initialOpen = true;\n } else {\n this.pane.view()._invokeNgController();\n }\n },\n\n openFor: function(target) {\n this.open(target);\n this.trigger(OPEN, { target: this.popup.target() });\n },\n\n close: function() {\n this.popup.hide();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.pane.destroy();\n this.popup.destroy();\n\n kendo.destroy(this.element);\n }\n });\n\n ui.plugin(Popup);\n ui.plugin(PopOver);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.shim',[ \"kendo.popup\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.shim\",\n name: \"Shim\",\n category: \"mobile\",\n description: \"Mobile Shim\",\n depends: [ \"popup\" ],\n hidden: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Popup = kendo.ui.Popup,\n SHIM = '
    ',\n HIDE = \"hide\",\n Widget = ui.Widget;\n\n var Shim = Widget.extend({\n init: function(element, options) {\n var that = this,\n app = kendo.mobile.application,\n os = kendo.support.mobileOS,\n osname = app ? app.os.name : (os ? os.name : \"ios\"),\n ioswp = osname === \"ios\" || osname === \"wp\" || (app ? app.os.skin : false),\n bb = osname === \"blackberry\",\n align = options.align || (ioswp ? \"bottom center\" : bb ? \"center right\" : \"center center\"),\n position = options.position || (ioswp ? \"bottom center\" : bb ? \"center right\" : \"center center\"),\n effect = options.effect || (ioswp ? \"slideIn:up\" : bb ? \"slideIn:left\" : \"fade:in\"),\n shim = $(SHIM).handler(that).hide();\n\n Widget.fn.init.call(that, element, options);\n\n that.shim = shim;\n element = that.element;\n options = that.options;\n\n if (options.className) {\n that.shim.addClass(options.className);\n }\n\n if (!options.modal) {\n that.shim.on(\"down\", \"_hide\");\n }\n\n (app ? app.element : $(document.body)).append(shim);\n\n that.popup = new Popup(that.element, {\n anchor: shim,\n modal: true,\n appendTo: shim,\n origin: align,\n position: position,\n animation: {\n open: {\n effects: effect,\n duration: options.duration\n },\n close: {\n duration: options.duration\n }\n },\n\n close: function(e) {\n var prevented = false;\n\n if (!that._apiCall) {\n prevented = that.trigger(HIDE);\n }\n\n if (prevented) {\n e.preventDefault();\n }\n\n that._apiCall = false;\n },\n\n deactivate: function() { // Deactivate event can't be prevented.\n shim.hide();\n },\n\n open: function() {\n shim.show();\n }\n });\n\n kendo.notify(that);\n },\n\n events: [ HIDE ],\n\n options: {\n name: \"Shim\",\n modal: false,\n align: undefined,\n position: undefined,\n effect: undefined,\n duration: 200\n },\n\n show: function() {\n this.popup.open();\n },\n\n hide: function() {\n this._apiCall = true;\n this.popup.close();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.shim.kendoDestroy();\n this.popup.destroy();\n this.shim.remove();\n },\n\n _hide: function(e) {\n if (!e || !$.contains(this.shim.children().children(\".k-popup\")[0], e.target)) {\n this.popup.close();\n }\n }\n });\n\n ui.plugin(Shim);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.modalview',[ \"kendo.mobile.shim\", \"kendo.mobile.view\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.modalview\",\n name: \"ModalView\",\n category: \"mobile\",\n description: \"The Kendo ModalView is used to present self-contained functionality in the context of the current task.\",\n depends: [ \"mobile.shim\", \"mobile.view\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Shim = ui.Shim,\n Widget = ui.Widget,\n BEFORE_OPEN = \"beforeOpen\",\n OPEN = \"open\",\n CLOSE = \"close\",\n INIT = \"init\",\n WRAP = '
    ';\n\n var ModalView = ui.View.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._id();\n that._wrap();\n that._shim();\n\n if (!this.options.$angular) {\n that._layout();\n that._scroller();\n that._model();\n }\n\n that.element.css(\"display\", \"\");\n\n that.trigger(INIT);\n },\n\n events: [\n INIT,\n BEFORE_OPEN,\n OPEN,\n CLOSE\n ],\n\n options: {\n name: \"ModalView\",\n modal: true,\n width: null,\n height: null\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.shim.destroy();\n },\n\n open: function(target) {\n var that = this;\n that.target = $(target);\n that.shim.show();\n\n that._invokeNgController();\n\n // necessary for the mobile view interface\n that.trigger(\"show\", { view: that });\n },\n\n // Interface implementation, called from the pane click handlers\n openFor: function(target) {\n if (!this.trigger(BEFORE_OPEN, { target: target })) {\n this.open(target);\n this.trigger(OPEN, { target: target });\n }\n },\n\n close: function() {\n if (this.element.is(\":visible\") && !this.trigger(CLOSE)) {\n this.shim.hide();\n }\n },\n\n _wrap: function() {\n var that = this,\n element = that.element,\n options = that.options,\n width, height;\n\n width = element[0].style.width || \"auto\";\n height = element[0].style.height || \"auto\";\n\n element.addClass(\"km-modalview\").wrap(WRAP);\n\n that.wrapper = element.parent().css({\n width: options.width || width || 300,\n height: options.height || height || 300\n }).addClass(height == \"auto\" ? \" km-auto-height\" : \"\");\n\n element.css({ width: \"\", height: \"\" });\n },\n\n _shim: function() {\n var that = this;\n\n that.shim = new Shim(that.wrapper, {\n modal: that.options.modal,\n position: \"center center\",\n align: \"center center\",\n effect: \"fade:in\",\n className: \"km-modalview-root\",\n hide: function(e) {\n if (that.trigger(CLOSE)) {\n e.preventDefault();\n }\n }\n });\n }\n });\n\n ui.plugin(ModalView);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.drawer',[ \"kendo.mobile.view\", \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.drawer\",\n name: \"Drawer\",\n category: \"mobile\",\n description: \"The Kendo Mobile Drawer widget provides slide to reveal global application toolbox\",\n depends: [ \"mobile.view\", \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n os = kendo.support.mobileOS,\n Transition = kendo.effects.Transition,\n roleSelector = kendo.roleSelector,\n AXIS = \"x\",\n ui = mobile.ui,\n SWIPE_TO_OPEN = !(os.ios && os.majorVersion == 7 && !os.appMode),\n BEFORE_SHOW = \"beforeShow\",\n INIT = \"init\",\n SHOW = \"show\",\n HIDE = \"hide\",\n AFTER_HIDE = \"afterHide\",\n NULL_VIEW = { enable: $.noop };\n\n var Drawer = ui.View.extend({\n init: function(element, options) {\n // move the drawer to the top, in order to hide it\n $(element).parent().prepend(element);\n\n mobile.ui.Widget.fn.init.call(this, element, options);\n\n if (!this.options.$angular) {\n this._layout();\n this._scroller();\n }\n\n this._model();\n\n var pane = this.element.closest(roleSelector(\"pane\")).data(\"kendoMobilePane\"),\n userEvents;\n\n if (pane) {\n this.pane = pane;\n this.pane.bind(\"viewShow\", function(e) {\n drawer._viewShow(e);\n });\n\n this.pane.bind(\"sameViewRequested\", function() {\n drawer.hide();\n });\n\n userEvents = this.userEvents = new kendo.UserEvents(pane.element, {\n fastTap: true,\n filter: roleSelector(\"view splitview\"),\n allowSelection: true\n });\n\n } else {\n this.currentView = NULL_VIEW;\n var container = $(this.options.container);\n\n if (!container) {\n throw new Error(\"The drawer needs a container configuration option set.\");\n }\n\n userEvents = this.userEvents = new kendo.UserEvents(container, { fastTap: true, allowSelection: true });\n this._attachTransition(container);\n }\n\n var drawer = this;\n\n var hide = function(e) {\n if (drawer.visible) {\n drawer.hide();\n e.preventDefault();\n }\n };\n\n if (this.options.swipeToOpen && SWIPE_TO_OPEN) {\n userEvents.bind(\"press\", function() { drawer.transition.cancel(); });\n userEvents.bind(\"start\", function(e) { drawer._start(e); });\n userEvents.bind(\"move\", function(e) { drawer._update(e); });\n userEvents.bind(\"end\", function(e) { drawer._end(e); });\n userEvents.bind(\"tap\", hide);\n } else {\n userEvents.bind(\"press\", hide);\n }\n\n this.leftPositioned = this.options.position === \"left\";\n\n this.visible = false;\n\n this.element.hide().addClass(\"km-drawer\").addClass(this.leftPositioned ? \"km-left-drawer\" : \"km-right-drawer\");\n this.trigger(INIT);\n },\n\n options: {\n name: \"Drawer\",\n position: \"left\",\n views: [],\n swipeToOpenViews: [],\n swipeToOpen: true,\n title: \"\",\n container: null\n },\n\n events: [\n BEFORE_SHOW,\n HIDE,\n AFTER_HIDE,\n INIT,\n SHOW\n ],\n\n show: function() {\n if (this._activate()) {\n this._show();\n }\n },\n\n hide: function() {\n if (!this.currentView) {\n return;\n }\n\n this.currentView.enable();\n\n Drawer.current = null;\n this._moveViewTo(0);\n this.trigger(HIDE, { view: this });\n },\n\n // Alias in order to support popover/modalview etc. interface\n openFor: function() {\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n },\n\n destroy: function() {\n ui.View.fn.destroy.call(this);\n this.userEvents.destroy();\n },\n\n _activate: function() {\n if (this.visible) {\n return true;\n }\n\n var visibleOnCurrentView = this._currentViewIncludedIn(this.options.views);\n\n if (!visibleOnCurrentView || this.trigger(BEFORE_SHOW, { view: this })) {\n return false;\n }\n\n this._setAsCurrent();\n this.element.show();\n\n this.trigger(SHOW, { view: this });\n this._invokeNgController();\n return true;\n },\n\n _currentViewIncludedIn: function(views) {\n if (!this.pane || !views.length) {\n return true;\n }\n\n var view = this.pane.view();\n return $.inArray(view.id.replace('#', ''), views) > -1 || $.inArray(view.element.attr(\"id\"), views) > -1;\n },\n\n _show: function() {\n this.currentView.enable(false);\n\n this.visible = true;\n var offset = this.element.width();\n\n if (!this.leftPositioned) {\n offset = -offset;\n }\n\n this._moveViewTo(offset);\n },\n\n _setAsCurrent: function() {\n if (Drawer.last !== this) {\n if (Drawer.last) {\n Drawer.last.element.hide();\n }\n this.element.show();\n }\n\n Drawer.last = this;\n Drawer.current = this;\n },\n\n _moveViewTo: function(offset) {\n this.userEvents.cancel();\n this.transition.moveTo({ location: offset, duration: 400, ease: Transition.easeOutExpo });\n },\n\n _viewShow: function(e) {\n if (this.currentView) {\n this.currentView.enable();\n }\n\n if (this.currentView === e.view) {\n this.hide();\n return;\n }\n\n this.currentView = e.view;\n this._attachTransition(e.view.element);\n },\n\n _attachTransition: function(element) {\n var that = this,\n movable = this.movable,\n currentOffset = movable && movable.x;\n\n\n if (this.transition) {\n this.transition.cancel();\n this.movable.moveAxis(\"x\", 0);\n }\n\n movable = this.movable = new kendo.ui.Movable(element);\n\n this.transition = new Transition({\n axis: AXIS,\n movable: this.movable,\n onEnd: function() {\n if (movable[AXIS] === 0) {\n element[0].style.cssText = \"\";\n that.element.hide();\n that.trigger(AFTER_HIDE);\n that.visible = false;\n }\n }\n });\n\n if (currentOffset) {\n element.addClass(\"k-fx-hidden\");\n kendo.animationFrame(function() {\n element.removeClass(\"k-fx-hidden\");\n that.movable.moveAxis(AXIS, currentOffset);\n that.hide();\n });\n }\n },\n\n _start: function(e) {\n var userEvents = e.sender;\n\n // ignore non-horizontal swipes\n if (Math.abs(e.x.velocity) < Math.abs(e.y.velocity) || kendo.triggeredByInput(e.event) || !this._currentViewIncludedIn(this.options.swipeToOpenViews)) {\n userEvents.cancel();\n return;\n }\n\n var leftPositioned = this.leftPositioned,\n visible = this.visible,\n canMoveLeft = leftPositioned && visible || !leftPositioned && !Drawer.current,\n canMoveRight = !leftPositioned && visible || leftPositioned && !Drawer.current,\n leftSwipe = e.x.velocity < 0;\n\n if ((canMoveLeft && leftSwipe) || (canMoveRight && !leftSwipe)) {\n if (this._activate()) {\n userEvents.capture();\n return;\n }\n }\n\n userEvents.cancel();\n },\n\n _update: function(e) {\n var movable = this.movable,\n newPosition = movable.x + e.x.delta,\n limitedPosition;\n\n if (this.leftPositioned) {\n limitedPosition = Math.min(Math.max(0, newPosition), this.element.width());\n } else {\n limitedPosition = Math.max(Math.min(0, newPosition), -this.element.width());\n }\n\n this.movable.moveAxis(AXIS, limitedPosition);\n e.event.preventDefault();\n e.event.stopPropagation();\n },\n\n _end: function(e) {\n var velocity = e.x.velocity,\n pastHalf = Math.abs(this.movable.x) > this.element.width() / 2,\n velocityThreshold = 0.8,\n shouldShow;\n\n if (this.leftPositioned) {\n shouldShow = velocity > -velocityThreshold && (velocity > velocityThreshold || pastHalf);\n } else {\n shouldShow = velocity < velocityThreshold && (velocity < -velocityThreshold || pastHalf);\n }\n\n if (shouldShow) {\n this._show();\n } else {\n this.hide();\n }\n }\n });\n\n ui.plugin(Drawer);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.splitview',[ \"kendo.mobile.pane\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.splitview\",\n name: \"SplitView\",\n category: \"mobile\",\n description: \"The mobile SplitView is a tablet-specific view that consists of two or more mobile Pane widgets.\",\n depends: [ \"mobile.pane\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Widget = ui.Widget,\n EXPANED_PANE_SHIM = \"
    \",\n View = ui.View;\n\n var SplitView = View.extend({\n init: function(element, options) {\n var that = this,\n pane, modalViews;\n\n Widget.fn.init.call(that, element, options);\n element = that.element;\n\n $.extend(that, options);\n\n that._id();\n\n if (!that.options.$angular) {\n that._layout();\n that._overlay();\n } else {\n that._overlay();\n }\n\n that._style();\n\n modalViews = element.children(that._locate(\"modalview\"));\n\n if (!that.options.$angular) {\n kendo.mobile.init(modalViews);\n } else {\n modalViews.each(function(idx, element) {\n kendo.compileMobileDirective($(element), options.$angular[0]);\n });\n }\n\n that.panes = [];\n that._paramsHistory = [];\n\n if (!that.options.$angular) {\n that.content.children(kendo.roleSelector(\"pane\")).each(function() {\n pane = kendo.initWidget(this, {}, ui.roles);\n that.panes.push(pane);\n });\n } else {\n that.element.children(kendo.directiveSelector(\"pane\")).each(function() {\n pane = kendo.compileMobileDirective($(this), options.$angular[0]);\n that.panes.push(pane);\n });\n\n that.element.children(kendo.directiveSelector(\"header footer\")).each(function() {\n kendo.compileMobileDirective($(this), options.$angular[0]);\n });\n }\n\n that.expandedPaneShim = $(EXPANED_PANE_SHIM).appendTo(that.element);\n\n that._shimUserEvents = new kendo.UserEvents(that.expandedPaneShim, {\n fastTap: true,\n tap: function() {\n that.collapsePanes();\n }\n });\n },\n\n _locate: function(selectors) {\n return this.options.$angular ? kendo.directiveSelector(selectors) : kendo.roleSelector(selectors);\n },\n\n options: {\n name: \"SplitView\",\n style: \"horizontal\"\n },\n\n expandPanes: function() {\n this.element.addClass(\"km-expanded-splitview\");\n },\n\n collapsePanes: function() {\n this.element.removeClass(\"km-expanded-splitview\");\n },\n\n // Implement view interface\n _layout: function() {\n var that = this,\n element = that.element;\n\n that.transition = kendo.attrValue(element, \"transition\");\n kendo.mobile.ui.View.prototype._layout.call(this);\n kendo.mobile.init(this.header.add(this.footer));\n that.element.addClass(\"km-splitview\");\n that.content.addClass(\"km-split-content\");\n },\n\n _style: function() {\n var style = this.options.style,\n element = this.element,\n styles;\n\n if (style) {\n styles = style.split(\" \");\n $.each(styles, function() {\n element.addClass(\"km-split-\" + this);\n });\n }\n },\n\n showStart: function() {\n var that = this;\n that.element.css(\"display\", \"\");\n\n if (!that.inited) {\n that.inited = true;\n $.each(that.panes, function() {\n if (this.options.initial) {\n this.navigateToInitial();\n } else {\n this.navigate(\"\");\n }\n });\n that.trigger(\"init\", { view: that });\n } else {\n this._invokeNgController();\n }\n\n that.trigger(\"show\", { view: that });\n }\n });\n\n ui.plugin(SplitView);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.application',[ \"kendo.mobile.pane\", \"kendo.router\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.application\",\n name: \"Application\",\n category: \"mobile\",\n description: \"The Mobile application provides a framework to build native looking web applications on mobile devices.\",\n depends: [ \"mobile.pane\", \"router\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n support = kendo.support,\n Widget = mobile.ui.Widget,\n Pane = mobile.ui.Pane,\n\n DEFAULT_OS = \"ios7\",\n OS = support.mobileOS,\n BERRYPHONEGAP = OS.device == \"blackberry\" && OS.flatVersion >= 600 && OS.flatVersion < 1000 && OS.appMode,\n FONT_SIZE_COEF = 0.93,\n VERTICAL = \"km-vertical\",\n CHROME = OS.browser === \"chrome\",\n BROKEN_WEBVIEW_RESIZE = OS.ios && OS.flatVersion >= 700 && OS.flatVersion < 800 && (OS.appMode || CHROME),\n INITIALLY_HORIZONTAL = (Math.abs(window.orientation) / 90 == 1),\n HORIZONTAL = \"km-horizontal\",\n\n MOBILE_PLATFORMS = {\n ios7: { ios: true, browser: \"default\", device: \"iphone\", flatVersion: \"700\", majorVersion: \"7\", minorVersion: \"0.0\", name: \"ios\", tablet: false },\n ios: { ios: true, browser: \"default\", device: \"iphone\", flatVersion: \"612\", majorVersion: \"6\", minorVersion: \"1.2\", name: \"ios\", tablet: false },\n android: { android: true, browser: \"default\", device: \"android\", flatVersion: \"442\", majorVersion: \"4\", minorVersion: \"4.2\", name: \"android\", tablet: false },\n blackberry: { blackberry: true, browser: \"default\", device: \"blackberry\", flatVersion: \"710\", majorVersion: \"7\", minorVersion: \"1.0\", name: \"blackberry\", tablet: false },\n meego: { meego: true, browser: \"default\", device: \"meego\", flatVersion: \"850\", majorVersion: \"8\", minorVersion: \"5.0\", name: \"meego\", tablet: false },\n wp: { wp: true, browser: \"default\", device: \"wp\", flatVersion: \"800\", majorVersion: \"8\", minorVersion: \"0.0\", name: \"wp\", tablet: false }\n },\n\n viewportTemplate = kendo.template('', { usedWithBlock: false }),\n systemMeta = kendo.template(' ' +\n ' ' +\n ' ', { usedWithBlock: false }),\n clipTemplate = kendo.template('', { usedWithBlock: false }),\n ENABLE_CLIP = OS.android && OS.browser != \"chrome\" || OS.blackberry,\n\n iconMeta = kendo.template('', { usedWithBlock: false }),\n\n HIDEBAR = (OS.device == \"iphone\" || OS.device == \"ipod\") && OS.majorVersion < 7,\n SUPPORT_SWIPE_TO_GO_BACK = (OS.device == \"iphone\" || OS.device == \"ipod\") && OS.majorVersion >= 7,\n HISTORY_TRANSITION = SUPPORT_SWIPE_TO_GO_BACK ? \"none\" : null,\n BARCOMPENSATION = OS.browser == \"mobilesafari\" ? 60 : 0,\n STATUS_BAR_HEIGHT = 20,\n WINDOW = $(window),\n SCREEN = window.screen,\n HEAD = $(\"head\"),\n\n // mobile app events\n INIT = \"init\";\n\n function osCssClass(os, options) {\n var classes = [];\n\n if (OS) {\n classes.push(\"km-on-\" + OS.name);\n }\n\n if (os.skin) {\n classes.push(\"km-\" + os.skin);\n } else {\n if (os.name == \"ios\" && os.majorVersion > 6) {\n classes.push(\"km-ios7\");\n } else {\n classes.push(\"km-\" + os.name);\n }\n }\n if ((os.name == \"ios\" && os.majorVersion < 7) || os.name != \"ios\") {\n classes.push(\"km-\" + os.name + os.majorVersion);\n }\n classes.push(\"km-\" + os.majorVersion);\n classes.push(\"km-m\" + (os.minorVersion ? os.minorVersion[0] : 0));\n\n if (os.variant && ((os.skin && os.skin === os.name) || !os.skin || os.setDefaultPlatform === false)) {\n classes.push(\"km-\" + (os.skin ? os.skin : os.name) + \"-\" + os.variant);\n }\n\n if (os.cordova) {\n classes.push(\"km-cordova\");\n }\n if (os.appMode) {\n classes.push(\"km-app\");\n } else {\n classes.push(\"km-web\");\n }\n\n if (options && options.statusBarStyle) {\n classes.push(\"km-\" + options.statusBarStyle + \"-status-bar\");\n }\n\n return classes.join(\" \");\n }\n\n function wp8Background(os) {\n return 'km-wp-' + (os.noVariantSet ?\n (parseInt($(\"
    \").css(\"background-color\").split(\",\")[1], 10) === 0 ? 'dark' : 'light') :\n os.variant + \" km-wp-\" + os.variant + \"-force\");\n }\n\n function isOrientationHorizontal(element) {\n return OS.wp ? element.css(\"animation-name\") == \"-kendo-landscape\" : (Math.abs(window.orientation) / 90 == 1);\n }\n\n function getOrientationClass(element) {\n return isOrientationHorizontal(element) ? HORIZONTAL : VERTICAL;\n }\n\n function setMinimumHeight(pane) {\n pane.parent().addBack()\n .css(\"min-height\", window.innerHeight);\n }\n\n function applyViewportHeight() {\n $(\"meta[name=viewport]\").remove();\n HEAD.append(viewportTemplate({\n height: \", width=device-width\" + // width=device-width was removed for iOS6, but this should stay for BB PhoneGap.\n (isOrientationHorizontal() ?\n \", height=\" + window.innerHeight + \"px\" :\n (support.mobileOS.flatVersion >= 600 && support.mobileOS.flatVersion < 700) ?\n \", height=\" + window.innerWidth + \"px\" :\n \", height=device-height\")\n }));\n }\n\n var Application = Widget.extend({\n init: function(element, options) {\n // global reference to current application\n mobile.application = this;\n $(this.bootstrap.bind(this, element, options));\n },\n\n bootstrap: function(element, options) {\n element = $(element);\n\n if (!element[0]) {\n element = $(document.body);\n }\n\n Widget.fn.init.call(this, element, options);\n this.element.removeAttr(\"data-\" + kendo.ns + \"role\");\n\n this._setupPlatform();\n this._attachMeta();\n this._setupElementClass();\n this._attachHideBarHandlers();\n var paneOptions = $.extend({}, this.options);\n delete paneOptions.name;\n\n var that = this,\n startHistory = function() {\n that.pane = new Pane(that.element, paneOptions);\n that.pane.navigateToInitial();\n\n if (that.options.updateDocumentTitle) {\n that._setupDocumentTitle();\n }\n\n that._startHistory();\n that.trigger(INIT);\n };\n\n if (this.options.$angular) {\n setTimeout(startHistory);\n } else {\n startHistory();\n }\n },\n\n options: {\n name: \"Application\",\n hideAddressBar: true,\n browserHistory: true,\n historyTransition: HISTORY_TRANSITION,\n modelScope: window,\n statusBarStyle: \"black\",\n transition: \"\",\n retina: false,\n platform: null,\n skin: null,\n updateDocumentTitle: true,\n useNativeScrolling: false\n },\n\n events: [\n INIT\n ],\n\n navigate: function(url, transition) {\n this.pane.navigate(url, transition);\n },\n\n replace: function(url, transition) {\n this.pane.replace(url, transition);\n },\n\n scroller: function() {\n return this.view().scroller;\n },\n\n hideLoading: function() {\n if (this.pane) {\n this.pane.hideLoading();\n } else {\n throw new Error(\"The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler.\");\n }\n },\n\n showLoading: function() {\n if (this.pane) {\n this.pane.showLoading();\n } else {\n throw new Error(\"The mobile application instance is not fully instantiated. Please consider activating loading in the application init event handler.\");\n }\n },\n\n changeLoadingMessage: function(message) {\n if (this.pane) {\n this.pane.changeLoadingMessage(message);\n } else {\n throw new Error(\"The mobile application instance is not fully instantiated. Please consider changing the message in the application init event handler.\");\n }\n },\n\n view: function() {\n return this.pane.view();\n },\n\n skin: function(skin) {\n var that = this;\n\n if (!arguments.length) {\n return that.options.skin;\n }\n\n that.options.skin = skin || \"\";\n that.element[0].className = \"km-pane\";\n that._setupPlatform();\n that._setupElementClass();\n\n return that.options.skin;\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.pane.destroy();\n if (this.options.browserHistory) {\n this.router.destroy();\n }\n },\n\n _setupPlatform: function() {\n var that = this,\n platform = that.options.platform,\n skin = that.options.skin,\n split = [],\n os = OS || MOBILE_PLATFORMS[DEFAULT_OS],\n refreshBackgroundFn = function() {\n if (that.os.variant && (that.os.skin && that.os.skin === that.os.name) || !that.os.skin) {\n that.element.removeClass(\"km-wp-dark km-wp-light km-wp-dark-force km-wp-light-force\").addClass(wp8Background(that.os));\n }\n };\n\n if (platform) {\n os.setDefaultPlatform = true;\n if (typeof platform === \"string\") {\n split = platform.split(\"-\");\n os = $.extend({ variant: split[1] }, os, MOBILE_PLATFORMS[split[0]]);\n } else {\n os = platform;\n }\n }\n\n if (skin) {\n split = skin.split(\"-\");\n if (!OS) {\n os.setDefaultPlatform = false;\n }\n os = $.extend({}, os, { skin: split[0], variant: split[1] });\n }\n\n if (!os.variant) {\n os.noVariantSet = true;\n os.variant = \"dark\";\n }\n\n that.os = os;\n\n that.osCssClass = osCssClass(that.os, that.options);\n\n if (os.name == \"wp\") {\n if (!that.refreshBackgroundColorProxy) {\n that.refreshBackgroundColorProxy = refreshBackgroundFn.bind(that);\n }\n\n $(document).off(\"visibilitychange\", that.refreshBackgroundColorProxy);\n $(document).off(\"resume\", that.refreshBackgroundColorProxy);\n\n if (!os.skin) {\n that.element.parent().css(\"overflow\", \"hidden\");\n\n $(document).on(\"visibilitychange\", that.refreshBackgroundColorProxy); // Restore theme on browser focus (using the Visibility API).\n $(document).on(\"resume\", that.refreshBackgroundColorProxy); // PhoneGap fires resume.\n\n that.refreshBackgroundColorProxy();\n }\n }\n },\n\n _startHistory: function() {\n if (this.options.browserHistory) {\n this.router = new kendo.Router({ pushState: this.options.pushState, root: this.options.root, hashBang: this.options.hashBang });\n this.pane.bindToRouter(this.router);\n this.router.start();\n } else {\n if (!this.options.initial) {\n this.pane.navigate(\"\");\n }\n }\n },\n\n _resizeToScreenHeight: function() {\n var includeStatusBar = $(\"meta[name=apple-mobile-web-app-status-bar-style]\").attr(\"content\").match(/black-translucent|hidden/),\n element = this.element,\n height;\n\n if (CHROME) {\n height = window.innerHeight;\n } else {\n if (isOrientationHorizontal(element)) {\n if (includeStatusBar) {\n if (INITIALLY_HORIZONTAL) {\n height = SCREEN.availWidth + STATUS_BAR_HEIGHT;\n } else {\n height = SCREEN.availWidth;\n }\n } else {\n if (INITIALLY_HORIZONTAL) {\n height = SCREEN.availWidth;\n } else {\n height = SCREEN.availWidth - STATUS_BAR_HEIGHT;\n }\n }\n } else {\n if (includeStatusBar) {\n if (INITIALLY_HORIZONTAL) {\n height = SCREEN.availHeight;\n } else {\n height = SCREEN.availHeight + STATUS_BAR_HEIGHT;\n }\n } else {\n if (INITIALLY_HORIZONTAL) {\n height = SCREEN.availHeight - STATUS_BAR_HEIGHT;\n } else {\n height = SCREEN.availHeight;\n }\n }\n }\n }\n\n element.height(height);\n },\n\n _setupElementClass: function() {\n var that = this, size,\n element = that.element;\n\n element.parent().addClass(\"km-root km-\" + (that.os.tablet ? \"tablet\" : \"phone\"));\n element.addClass(that.osCssClass + \" \" + getOrientationClass(element));\n if (this.options.useNativeScrolling) {\n element.parent().addClass(\"km-native-scrolling\");\n }\n\n if (CHROME) {\n element.addClass(\"km-ios-chrome\");\n }\n\n if (support.wpDevicePixelRatio) {\n element.parent().css(\"font-size\", support.wpDevicePixelRatio + \"em\");\n }\n\n if (this.options.retina) {\n element.parent().addClass(\"km-retina\");\n element.parent().css(\"font-size\", (support.devicePixelRatio * FONT_SIZE_COEF) + \"em\");\n }\n\n if (BERRYPHONEGAP) {\n applyViewportHeight();\n }\n if (that.options.useNativeScrolling) {\n element.parent().addClass(\"km-native-scrolling\");\n } else if (ENABLE_CLIP) {\n size = (screen.availWidth > screen.availHeight ? screen.availWidth : screen.availHeight) + 200;\n $(clipTemplate({ width: size, height: size })).appendTo(HEAD);\n }\n\n if (BROKEN_WEBVIEW_RESIZE) {\n that._resizeToScreenHeight();\n }\n\n kendo.onResize(function() {\n element\n .removeClass(\"km-horizontal km-vertical\")\n .addClass(getOrientationClass(element));\n\n if (that.options.useNativeScrolling) {\n setMinimumHeight(element);\n }\n\n if (BROKEN_WEBVIEW_RESIZE) {\n that._resizeToScreenHeight();\n }\n\n if (BERRYPHONEGAP) {\n applyViewportHeight();\n }\n\n kendo.resize(element);\n });\n },\n\n _clearExistingMeta: function() {\n HEAD.find(\"meta\")\n .filter(\"[name|='apple-mobile-web-app'],[name|='msapplication-tap'],[name='viewport']\")\n .remove();\n },\n\n _attachMeta: function() {\n var options = this.options,\n icon = options.icon, size;\n\n this._clearExistingMeta();\n\n if (!BERRYPHONEGAP) {\n HEAD.prepend(viewportTemplate({ height: \"\", scale: this.options.retina ? 1 / support.devicePixelRatio : \"1.0\" }));\n }\n\n HEAD.prepend(systemMeta(options));\n\n if (icon) {\n if (typeof icon === \"string\") {\n icon = { \"\": icon };\n }\n\n for (size in icon) {\n HEAD.prepend(iconMeta({ icon: icon[size], size: size }));\n }\n }\n\n if (options.useNativeScrolling) {\n setMinimumHeight(this.element);\n }\n },\n\n _attachHideBarHandlers: function() {\n var that = this,\n hideBar = that._hideBar.bind(that);\n\n if (support.mobileOS.appMode || !that.options.hideAddressBar || !HIDEBAR || that.options.useNativeScrolling) {\n return;\n }\n\n that._initialHeight = {};\n\n WINDOW.on(\"load\", hideBar);\n\n kendo.onResize(function() {\n setTimeout(window.scrollTo, 0, 0, 1);\n });\n },\n\n _setupDocumentTitle: function() {\n var that = this,\n defaultTitle = document.title;\n\n that.pane.bind(\"viewShow\", function(e) {\n var title = e.view.title;\n document.title = title !== undefined ? title : defaultTitle;\n });\n },\n\n _hideBar: function() {\n var that = this,\n element = that.element;\n\n element.height(kendo.support.transforms.css + \"calc(100% + \" + BARCOMPENSATION + \"px)\");\n $(window).trigger(kendo.support.resize);\n }\n });\n\n kendo.mobile.Application = Application;\n kendo.ui.plugin(Application, kendo.mobile, 'Mobile');\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.actionsheet',[ \"kendo.mobile.popover\", \"kendo.mobile.shim\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.actionsheet\",\n name: \"ActionSheet\",\n category: \"mobile\",\n description: \"The mobile ActionSheet widget displays a set of choices related to a task the user initiates.\",\n depends: [ \"mobile.popover\", \"mobile.shim\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n support = kendo.support,\n ui = kendo.mobile.ui,\n Shim = ui.Shim,\n Popup = ui.Popup,\n Widget = ui.Widget,\n OPEN = \"open\",\n CLOSE = \"close\",\n COMMAND = \"command\",\n BUTTONS = \"li>a\",\n CONTEXT_DATA = \"actionsheetContext\",\n WRAP = '
    ',\n cancelTemplate = kendo.template('
  • #:cancel#
  • ');\n\n var ActionSheet = Widget.extend({\n init: function(element, options) {\n var that = this,\n ShimClass,\n tablet,\n type,\n os = support.mobileOS;\n\n Widget.fn.init.call(that, element, options);\n\n options = that.options;\n type = options.type;\n element = that.element;\n\n if (type === \"auto\") {\n tablet = os && os.tablet;\n } else {\n tablet = type === \"tablet\";\n }\n\n ShimClass = tablet ? Popup : Shim;\n\n if (options.cancelTemplate) {\n cancelTemplate = kendo.template(options.cancelTemplate);\n }\n\n element\n .addClass(\"km-actionsheet\")\n .append(cancelTemplate({ cancel: that.options.cancel }))\n .wrap(WRAP)\n .on(\"up\", BUTTONS, \"_click\")\n .on(\"click\", BUTTONS, kendo.preventDefault);\n\n that.view().bind(\"destroy\", function() {\n that.destroy();\n });\n\n that.wrapper = element.parent().addClass(type ? \" km-actionsheet-\" + type : \"\");\n\n that.shim = new ShimClass(that.wrapper, $.extend({ modal: os.ios && os.majorVersion < 7, className: \"km-actionsheet-root\" }, that.options.popup) );\n\n that._closeProxy = that._close.bind(that);\n that._shimHideProxy = that._shimHide.bind(that);\n that.shim.bind(\"hide\", that._shimHideProxy);\n\n if (tablet) {\n kendo.onResize(that._closeProxy);\n }\n\n kendo.notify(that, ui);\n },\n\n events: [\n OPEN,\n CLOSE,\n COMMAND\n ],\n\n options: {\n name: \"ActionSheet\",\n cancel: \"Cancel\",\n type: \"auto\",\n popup: { height: \"auto\" }\n },\n\n open: function(target, context) {\n var that = this;\n that.target = $(target);\n that.context = context;\n that.shim.show(target);\n },\n\n close: function() {\n this.context = this.target = null;\n this.shim.hide();\n },\n\n openFor: function(target) {\n var that = this,\n context = target.data(CONTEXT_DATA);\n\n that.open(target, context);\n that.trigger(OPEN, { target: target, context: context });\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n kendo.unbindResize(this._closeProxy);\n this.shim.destroy();\n },\n\n _click: function(e) {\n if (e.isDefaultPrevented()) {\n return;\n }\n\n var currentTarget = $(e.currentTarget);\n var action = currentTarget.data(\"action\");\n\n if (action) {\n var actionData = {\n target: this.target,\n context: this.context\n },\n $angular = this.options.$angular;\n\n if ($angular) {\n this.element.injector().get(\"$parse\")(action)($angular[0])(actionData);\n } else {\n kendo.getter(action)(window)(actionData);\n }\n }\n\n this.trigger(COMMAND, { target: this.target, context: this.context, currentTarget: currentTarget });\n\n e.preventDefault();\n this._close();\n },\n\n _shimHide: function(e) {\n if (!this.trigger(CLOSE)) {\n this.context = this.target = null;\n } else {\n e.preventDefault();\n }\n },\n\n _close: function(e) {\n if (!this.trigger(CLOSE)) {\n this.close();\n } else {\n e.preventDefault();\n }\n }\n });\n\n ui.plugin(ActionSheet);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.button',[ \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.button\",\n name: \"Button\",\n category: \"mobile\",\n description: \"The Button widget navigates between mobile Application views when pressed.\",\n depends: [ \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n ui = mobile.ui,\n Widget = ui.Widget,\n support = kendo.support,\n os = support.mobileOS,\n ANDROID3UP = os.android && os.flatVersion >= 300,\n CLICK = \"click\",\n DISABLED = \"disabled\",\n DISABLEDSTATE = \"km-state-disabled\";\n\n function highlightButton(widget, event, highlight) {\n $(event.target).closest(\".km-button,.km-detail\").toggleClass(\"km-state-active\", highlight);\n\n if (ANDROID3UP && widget.deactivateTimeoutID) {\n clearTimeout(widget.deactivateTimeoutID);\n widget.deactivateTimeoutID = 0;\n }\n }\n\n function createBadge(value) {\n return $('' + value + '');\n }\n\n var Button = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n var useTap = that.options.clickOn === \"up\";\n\n that._wrap();\n that._style();\n\n if (!useTap) {\n that.element.attr(\"data-navigate-on-press\", true);\n }\n\n that.options.enable = that.options.enable && !that.element.attr(DISABLED);\n that.enable(that.options.enable);\n\n that._userEvents = new kendo.UserEvents(that.element, {\n allowSelection: !useTap,\n fastTap: true,\n press: function(e) {\n that._activate(e);\n },\n release: function(e) {\n highlightButton(that, e, false);\n if (!useTap) { e.event.stopPropagation(); }\n }\n });\n\n that._userEvents.bind(useTap ? \"tap\" : \"press\", function(e) {\n that._release(e);\n });\n\n\n if (ANDROID3UP) {\n that.element.on(\"move\", function(e) { that._timeoutDeactivate(e); });\n }\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this._userEvents.destroy();\n },\n\n events: [\n CLICK\n ],\n\n options: {\n name: \"Button\",\n icon: \"\",\n style: \"\",\n badge: \"\",\n clickOn: \"up\",\n enable: true\n },\n\n badge: function(value) {\n var badge = this.badgeElement = this.badgeElement || createBadge(value).appendTo(this.element);\n\n if (value || value === 0) {\n badge.html(value);\n return this;\n }\n\n if (value === false) {\n badge.empty().remove();\n this.badgeElement = false;\n return this;\n }\n\n return badge.html();\n },\n\n enable: function(enable) {\n var element = this.element;\n\n if (typeof enable == \"undefined\") {\n enable = true;\n }\n\n this.options.enable = enable;\n\n if (enable) {\n element.prop(DISABLED, false);\n } else {\n element.attr(DISABLED, DISABLED);\n }\n\n element.toggleClass(DISABLEDSTATE, !enable);\n },\n\n _timeoutDeactivate: function(e) {\n if (!this.deactivateTimeoutID) {\n this.deactivateTimeoutID = setTimeout(highlightButton, 500, this, e, false);\n }\n },\n\n _activate: function(e) {\n var activeElement = document.activeElement,\n nodeName = activeElement ? activeElement.nodeName : \"\";\n\n if (this.options.enable) {\n highlightButton(this, e, true);\n\n if (nodeName == \"INPUT\" || nodeName == \"TEXTAREA\") {\n activeElement.blur(); // Hide device keyboard\n }\n }\n },\n\n _release: function(e) {\n var that = this;\n\n if (e.which > 1) {\n return;\n }\n\n if (!that.options.enable) {\n e.preventDefault();\n return;\n }\n\n if (that.trigger(CLICK, { target: $(e.target), button: that.element })) {\n e.preventDefault();\n }\n },\n\n _style: function() {\n var style = this.options.style,\n element = this.element,\n styles;\n\n if (style) {\n styles = style.split(\" \");\n $.each(styles, function() {\n element.addClass(\"km-\" + this);\n });\n }\n },\n\n _wrap: function() {\n var that = this,\n icon = that.options.icon,\n badge = that.options.badge,\n iconSpan = '').children(\"span.km-text\");\n }\n\n if (!image[0] && icon) {\n if (!span[0]) {\n iconSpan += \" km-notext\";\n }\n that.iconElement = element.prepend($(iconSpan + '\" />'));\n }\n\n if (badge || badge === 0) {\n that.badgeElement = createBadge(badge).appendTo(element);\n }\n }\n });\n\n var BackButton = Button.extend({\n options: {\n name: \"BackButton\",\n style: \"back\"\n },\n\n init: function(element, options) {\n var that = this;\n Button.fn.init.call(that, element, options);\n\n if (typeof that.element.attr(\"href\") === \"undefined\") {\n that.element.attr(\"href\", \"#:back\");\n }\n }\n });\n\n var DetailButton = Button.extend({\n options: {\n name: \"DetailButton\",\n style: \"\"\n },\n\n init: function(element, options) {\n Button.fn.init.call(this, element, options);\n },\n\n _style: function() {\n var style = this.options.style + \" detail\",\n element = this.element;\n\n if (style) {\n var styles = style.split(\" \");\n $.each(styles, function() {\n element.addClass(\"km-\" + this);\n });\n }\n },\n\n _wrap: function() {\n var that = this,\n icon = that.options.icon,\n iconSpan = ''));\n }\n }\n\n });\n\n ui.plugin(Button);\n ui.plugin(BackButton);\n ui.plugin(DetailButton);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.buttongroup',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.buttongroup\",\n name: \"ButtonGroup\",\n category: \"mobile\",\n description: \"The Kendo mobile ButtonGroup widget is a linear set of grouped buttons.\",\n depends: [ \"core\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Widget = ui.Widget,\n ACTIVE = \"state-active\",\n DISABLE = \"state-disabled\",\n SELECT = \"select\",\n SELECTOR = \"li:not(.km-\" + ACTIVE + \")\";\n\n function className(name) {\n return \"k-\" + name + \" km-\" + name;\n }\n\n function createBadge(value) {\n return $('' + value + '');\n }\n\n var ButtonGroup = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that.element.addClass(\"km-buttongroup k-widget k-button-group\").find(\"li\").each(that._button);\n\n that.element.on(that.options.selectOn, SELECTOR, \"_select\");\n\n that._enable = true;\n that.select(that.options.index);\n\n if (!that.options.enable) {\n that._enable = false;\n that.wrapper.addClass(className(DISABLE));\n }\n },\n\n events: [\n SELECT\n ],\n\n options: {\n name: \"ButtonGroup\",\n selectOn: \"down\",\n index: -1,\n enable: true\n },\n\n current: function() {\n return this.element.find(\".km-\" + ACTIVE);\n },\n\n select: function(li) {\n var that = this,\n index = -1;\n\n if (li === undefined || li === -1 || !that._enable || $(li).is(\".km-\" + DISABLE)) {\n return;\n }\n\n that.current().removeClass(className(ACTIVE));\n\n if (typeof li === \"number\") {\n index = li;\n li = $(that.element[0].children[li]);\n } else if (li.nodeType) {\n li = $(li);\n index = li.index();\n }\n\n li.addClass(className(ACTIVE));\n that.selectedIndex = index;\n },\n\n badge: function(item, value) {\n var buttongroup = this.element, badge;\n\n if (!isNaN(item)) {\n item = buttongroup.children().get(item);\n }\n\n item = buttongroup.find(item);\n badge = $(item.children(\".km-badge\")[0] || createBadge(value).appendTo(item));\n\n if (value || value === 0) {\n badge.html(value);\n return this;\n }\n\n if (value === false) {\n badge.empty().remove();\n return this;\n }\n\n return badge.html();\n },\n\n enable: function(enable) {\n if (typeof enable == \"undefined\") {\n enable = true;\n }\n\n this.wrapper.toggleClass(className(DISABLE), !enable);\n\n this._enable = this.options.enable = enable;\n },\n\n _button: function() {\n var button = $(this).addClass(className(\"button\")),\n icon = kendo.attrValue(button, \"icon\"),\n badge = kendo.attrValue(button, \"badge\"),\n span = button.children(\"span\"),\n image = button.find(\"img\").addClass(className(\"image\"));\n\n if (!span[0]) {\n span = button.wrapInner(\"\").children(\"span\");\n }\n\n span.addClass(className(\"text\"));\n\n if (!image[0] && icon) {\n button.prepend($(''));\n }\n\n if (badge || badge === 0) {\n createBadge(badge).appendTo(button);\n }\n },\n\n _select: function(e) {\n if (e.which > 1 || e.isDefaultPrevented() || !this._enable) {\n return;\n }\n\n this.select(e.currentTarget);\n this.trigger(SELECT, { index: this.selectedIndex });\n }\n });\n\n ui.plugin(ButtonGroup);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.collapsible',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.collapsible\",\n name: \"Collapsible\",\n category: \"mobile\",\n description: \"The Kendo mobile Collapsible widget provides ability for creating collapsible blocks of content.\",\n depends: [ \"core\", \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Widget = ui.Widget,\n COLLAPSIBLE = \"km-collapsible\",\n HEADER = \"km-collapsible-header\",\n CONTENT = \"km-collapsible-content\",\n INSET = \"km-collapsibleinset\",\n HEADER_WRAPPER = \"
    \",\n CONTENT_WRAPPER = \"
    \",\n\n COLLAPSED = \"km-collapsed\",\n EXPANDED = \"km-expanded\",\n ANIMATED = \"km-animated\",\n\n //icon position\n LEFT = \"left\",\n\n //events\n EXAPND = \"expand\",\n COLLAPSE = \"collapse\";\n\n var Collapsible = Widget.extend({\n init: function(element, options) {\n var that = this,\n container = $(element);\n\n Widget.fn.init.call(that, container, options);\n\n container.addClass(COLLAPSIBLE);\n\n that._buildHeader();\n that.content = container.children().not(that.header).wrapAll(CONTENT_WRAPPER).parent();\n\n that._userEvents = new kendo.UserEvents(that.header, {\n fastTap: true,\n tap: function() { that.toggle(); }\n });\n\n container.addClass(that.options.collapsed ? COLLAPSED : EXPANDED);\n\n if (that.options.inset) {\n container.addClass(INSET);\n }\n\n if (that.options.animation) {\n that.content.addClass(ANIMATED);\n that.content.height(0);\n if (that.options.collapsed) {\n that.content.hide();\n }\n } else if (that.options.collapsed) {\n that.content.hide();\n }\n },\n\n events: [\n EXAPND,\n COLLAPSE\n ],\n\n options: {\n name: \"Collapsible\",\n collapsed: true,\n collapseIcon: \"arrow-n\",\n expandIcon: \"arrow-s\",\n iconPosition: LEFT,\n animation: true,\n inset: false\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this._userEvents.destroy();\n },\n\n expand: function(instant) {\n var icon = this.options.collapseIcon,\n content = this.content,\n ios = kendo.support.mobileOS.ios;\n\n if (!this.trigger(EXAPND)) {\n if (icon) {\n this.header.find(\".km-icon\").removeClass().addClass(\"km-icon km-\" + icon);\n }\n this.element.removeClass(COLLAPSED).addClass(EXPANDED);\n\n if (this.options.animation && !instant) {\n content.off(\"transitionend\");\n content.show();\n if (ios) { content.removeClass(ANIMATED); } //required to get the height of the content on iOS\n content.height(this._getContentHeight());\n if (ios) { content.addClass(ANIMATED); }\n\n kendo.resize(content);\n } else {\n content.show();\n }\n }\n },\n\n collapse: function(instant) {\n var icon = this.options.expandIcon,\n content = this.content;\n\n if (!this.trigger(COLLAPSE)) {\n if (icon) {\n this.header.find(\".km-icon\").removeClass().addClass(\"km-icon km-\" + icon);\n }\n this.element.removeClass(EXPANDED).addClass(COLLAPSED);\n\n if (this.options.animation && !instant) {\n content.one(\"transitionend\", function() { content.hide(); });\n content.height(0);\n } else {\n content.hide();\n }\n }\n },\n\n toggle: function(instant) {\n if (this.isCollapsed()) {\n this.expand(instant);\n } else {\n this.collapse(instant);\n }\n },\n\n isCollapsed: function() {\n return this.element.hasClass(COLLAPSED);\n },\n\n resize: function() {\n if (!this.isCollapsed() && this.options.animation) {\n this.content.height(this._getContentHeight());\n }\n },\n\n _buildHeader: function() {\n var header = this.element.children(\":header\").wrapAll(HEADER_WRAPPER),\n iconSpan = $(''),\n icon = this.options.collapsed ? this.options.expandIcon : this.options.collapseIcon,\n iconPosition = this.options.iconPosition;\n\n if (icon) {\n header.prepend(iconSpan);\n iconSpan.addClass(\"km-\" + icon);\n }\n\n this.header = header.parent();\n this.header.addClass(\"km-icon-\" + iconPosition);\n },\n\n _getContentHeight: function() {\n var style = this.content.attr(\"style\"),\n height;\n\n this.content.css({\n position: 'absolute',\n visibility: 'hidden',\n height: \"auto\"\n });\n\n height = this.content.height();\n\n this.content.attr(\"style\", style ? style : \"\");\n\n return height;\n }\n });\n\n ui.plugin(Collapsible);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.listview',[ \"kendo.data\", \"kendo.userevents\", \"kendo.mobile.button\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.listview\",\n name: \"ListView\",\n category: \"mobile\",\n description: \"The Kendo Mobile ListView widget is used to display flat or grouped list of items.\",\n depends: [ \"data\", \"userevents\", \"mobile.button\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n Node = window.Node,\n mobile = kendo.mobile,\n ui = mobile.ui,\n outerHeight = kendo._outerHeight,\n DataSource = kendo.data.DataSource,\n Widget = ui.DataBoundWidget,\n ITEM_SELECTOR = \".km-list > li, > li:not(.km-group-container)\",\n HIGHLIGHT_SELECTOR = \".km-listview-link, .km-listview-label\",\n ICON_SELECTOR = \"[\" + kendo.attr(\"icon\") + \"]\",\n attrValue = kendo.attrValue,\n GROUP_CLASS = \"km-group-title\",\n ACTIVE_CLASS = \"km-state-active\",\n GROUP_WRAPPER = '
    ',\n GROUP_TEMPLATE = kendo.template('
  • #= this.headerTemplate(data) #
      #= kendo.render(this.template, data.items)#
  • '),\n WRAPPER = '
    ',\n SEARCH_TEMPLATE = kendo.template(''),\n NS = \".kendoMobileListView\",\n STYLED = \"styled\",\n DATABOUND = \"dataBound\",\n DATABINDING = \"dataBinding\",\n ITEM_CHANGE = \"itemChange\",\n CLICK = \"click\",\n CHANGE = \"change\",\n PROGRESS = \"progress\",\n FUNCTION = \"function\",\n\n whitespaceRegExp = /^\\s+$/,\n buttonRegExp = /button/;\n\n function whitespace() {\n return this.nodeType === Node.TEXT_NODE && this.nodeValue.match(whitespaceRegExp);\n }\n\n function addIcon(item, icon) {\n if (icon && !item[0].querySelector(\".km-icon\")) {\n item.prepend('');\n }\n }\n\n function enhanceItem(item) {\n addIcon(item, attrValue(item, \"icon\"));\n addIcon(item, attrValue(item.children(ICON_SELECTOR), \"icon\"));\n }\n\n function enhanceLinkItem(item) {\n var parent = item.parent(),\n itemAndDetailButtons = item.add(parent.children(kendo.roleSelector(\"detailbutton\"))),\n otherNodes = parent.contents().not(itemAndDetailButtons).not(whitespace);\n\n if (otherNodes.length) {\n return;\n }\n\n item.addClass(\"km-listview-link\")\n .attr(kendo.attr(\"role\"), \"listview-link\");\n\n addIcon(item, attrValue(parent, \"icon\"));\n addIcon(item, attrValue(item, \"icon\"));\n }\n\n function enhanceCheckBoxItem(label) {\n if (!label[0].querySelector(\"input[type=checkbox],input[type=radio]\")) {\n return;\n }\n\n var item = label.parent();\n\n if (item.contents().not(label).not(function() { return this.nodeType == 3; })[0]) {\n return;\n }\n\n label.addClass(\"km-listview-label\");\n\n label.children(\"[type=checkbox],[type=radio]\").addClass(\"km-widget km-icon km-check\");\n }\n\n function putAt(element, top) {\n $(element).css('transform', 'translate3d(0px, ' + top + 'px, 0px)');\n }\n\n var HeaderFixer = kendo.Class.extend({\n init: function(listView) {\n var scroller = listView.scroller();\n\n if (!scroller) {\n return;\n }\n\n this.options = listView.options;\n this.element = listView.element;\n this.scroller = listView.scroller();\n this._shouldFixHeaders();\n\n var headerFixer = this;\n\n var cacheHeaders = function() {\n headerFixer._cacheHeaders();\n };\n\n listView.bind(\"resize\", cacheHeaders);\n\n listView.bind(STYLED, cacheHeaders);\n listView.bind(DATABOUND, cacheHeaders);\n\n this._scrollHandler = function(e) {\n headerFixer._fixHeader(e);\n };\n scroller.bind(\"scroll\", this._scrollHandler);\n },\n\n destroy: function() {\n var that = this;\n if (that.scroller) {\n that.scroller.unbind(\"scroll\", that._scrollHandler);\n }\n },\n\n _fixHeader: function(e) {\n if (!this.fixedHeaders) {\n return;\n }\n\n var i = 0,\n scroller = this.scroller,\n headers = this.headers,\n scrollTop = e.scrollTop,\n headerPair,\n offset,\n header;\n\n do {\n headerPair = headers[i++];\n if (!headerPair) {\n header = $(\"
    \");\n break;\n }\n offset = headerPair.offset;\n header = headerPair.header;\n } while (offset + 1 > scrollTop);\n\n if (this.currentHeader != i) {\n scroller.fixedContainer.html(header.clone());\n this.currentHeader = i;\n }\n },\n\n _shouldFixHeaders: function() {\n this.fixedHeaders = this.options.type === \"group\" && this.options.fixedHeaders;\n },\n\n _cacheHeaders: function() {\n this._shouldFixHeaders();\n\n if (!this.fixedHeaders) {\n return;\n }\n\n var headers = [], offset = this.scroller.scrollTop;\n\n this.element.find(\".\" + GROUP_CLASS).each(function(_, header) {\n header = $(header);\n headers.unshift({\n offset: header.position().top + offset,\n header: header\n });\n });\n\n this.headers = headers;\n this._fixHeader({ scrollTop: offset });\n }\n });\n\n var DEFAULT_PULL_PARAMETERS = function() {\n return { page: 1 };\n };\n\n var RefreshHandler = kendo.Class.extend({\n init: function(listView) {\n var handler = this,\n options = listView.options,\n scroller = listView.scroller(),\n pullParameters = options.pullParameters || DEFAULT_PULL_PARAMETERS;\n\n this.listView = listView;\n this.scroller = scroller;\n\n listView.bind(\"_dataSource\", function(e) {\n handler.setDataSource(e.dataSource);\n });\n\n scroller.setOptions({\n pullToRefresh: true,\n pull: function() {\n if (!handler._pulled) {\n handler._pulled = true;\n handler.dataSource.read(pullParameters.call(listView, handler._first));\n }\n },\n messages: {\n pullTemplate: options.messages.pullTemplate,\n releaseTemplate: options.messages.releaseTemplate,\n refreshTemplate: options.messages.refreshTemplate\n }\n });\n },\n\n setDataSource: function(dataSource) {\n var handler = this;\n\n this._first = dataSource.view()[0];\n this.dataSource = dataSource;\n\n dataSource.bind(\"change\", function() {\n handler._change();\n });\n\n dataSource.bind(\"error\", function() {\n handler._change();\n });\n },\n\n _change: function() {\n var scroller = this.scroller,\n dataSource = this.dataSource;\n\n if (this._pulled) {\n scroller.pullHandled();\n }\n\n if (this._pulled || !this._first) {\n var view = dataSource.view();\n\n if (view[0]) {\n this._first = view[0];\n }\n }\n\n this._pulled = false;\n }\n });\n\n var VirtualList = kendo.Observable.extend({\n init: function(options) {\n var list = this;\n\n kendo.Observable.fn.init.call(list);\n\n list.buffer = options.buffer;\n list.height = options.height;\n list.item = options.item;\n list.items = [];\n list.footer = options.footer;\n\n list.buffer.bind(\"reset\", function() {\n list.refresh();\n });\n\n },\n\n refresh: function() {\n var buffer = this.buffer,\n items = this.items,\n endReached = false;\n\n while (items.length) {\n items.pop().destroy();\n }\n\n this.offset = buffer.offset;\n\n var itemConstructor = this.item,\n prevItem,\n item;\n\n for (var idx = 0; idx < buffer.viewSize; idx ++) {\n if (idx === buffer.total()) {\n endReached = true;\n break;\n }\n item = itemConstructor(this.content(this.offset + items.length));\n item.below(prevItem);\n prevItem = item;\n items.push(item);\n }\n\n this.itemCount = items.length;\n\n this.trigger(\"reset\");\n\n this._resize();\n\n if (endReached) {\n this.trigger(\"endReached\");\n }\n },\n\n totalHeight: function() {\n if (!this.items[0]) {\n return 0;\n }\n\n var list = this,\n items = list.items,\n top = items[0].top,\n bottom = items[items.length - 1].bottom,\n averageItemHeight = (bottom - top) / list.itemCount,\n remainingItemsCount = list.buffer.length - list.offset - list.itemCount;\n\n return (this.footer ? this.footer.height : 0) + bottom + remainingItemsCount * averageItemHeight;\n },\n\n batchUpdate: function(top) {\n var height = this.height(),\n items = this.items,\n item,\n initialOffset = this.offset;\n\n if (!items[0]) {\n return;\n }\n\n if (this.lastDirection) { // scrolling up\n while (items[items.length - 1].bottom > top + height * 2) {\n if (this.offset === 0) {\n break;\n }\n\n this.offset --;\n item = items.pop();\n item.update(this.content(this.offset));\n item.above(items[0]);\n items.unshift(item);\n }\n } else { // scrolling down\n while (items[0].top < top - height) {\n var nextIndex = this.offset + this.itemCount; // here, it should be offset + 1 + itemCount - 1.\n\n if (nextIndex === this.buffer.total()) {\n this.trigger(\"endReached\");\n break;\n }\n\n if (nextIndex === this.buffer.length) {\n break;\n }\n\n item = items.shift();\n item.update(this.content(this.offset + this.itemCount));\n item.below(items[items.length - 1]);\n items.push(item);\n this.offset ++;\n }\n }\n\n if (initialOffset !== this.offset) {\n this._resize();\n }\n },\n\n update: function(top) {\n var list = this,\n items = this.items,\n item,\n firstItem,\n lastItem,\n height = this.height(),\n itemCount = this.itemCount,\n padding = height / 2,\n up = (this.lastTop || 0) > top,\n topBorder = top - padding,\n bottomBorder = top + height + padding;\n\n if (!items[0]) {\n return;\n }\n\n this.lastTop = top;\n this.lastDirection = up;\n\n if (up) { // scrolling up\n if (items[0].top > topBorder && // needs reorder\n items[items.length - 1].bottom > bottomBorder + padding && // enough padding below\n this.offset > 0 // we are not at the top\n )\n {\n this.offset --;\n item = items.pop();\n firstItem = items[0];\n item.update(this.content(this.offset));\n items.unshift(item);\n\n item.above(firstItem);\n list._resize();\n }\n } else { // scrolling down\n if (\n items[items.length - 1].bottom < bottomBorder && // needs reorder\n items[0].top < topBorder - padding // enough padding above\n )\n {\n var nextIndex = this.offset + itemCount; // here, it should be offset + 1 + itemCount - 1.\n\n if (nextIndex === this.buffer.total()) {\n this.trigger(\"endReached\");\n } else if (nextIndex !== this.buffer.length) {\n item = items.shift();\n lastItem = items[items.length - 1];\n items.push(item);\n item.update(this.content(this.offset + this.itemCount));\n list.offset ++;\n\n item.below(lastItem);\n list._resize();\n }\n }\n }\n },\n\n content: function(index) {\n return this.buffer.at(index);\n },\n\n destroy: function() {\n this.unbind();\n },\n\n _resize: function() {\n var items = this.items,\n top = 0,\n bottom = 0,\n firstItem = items[0],\n lastItem = items[items.length - 1];\n\n if (firstItem) {\n top = firstItem.top;\n bottom = lastItem.bottom;\n }\n\n this.trigger(\"resize\", { top: top, bottom: bottom });\n\n if (this.footer) {\n this.footer.below(lastItem);\n }\n }\n });\n\n // export for testing purposes\n kendo.mobile.ui.VirtualList = VirtualList;\n\n var VirtualListViewItem = kendo.Class.extend({\n init: function(listView, dataItem) {\n var element = listView.append([dataItem], true)[0],\n height = element.offsetHeight;\n\n $.extend(this, {\n top: 0,\n element: element,\n listView: listView,\n height: height,\n bottom: height\n });\n },\n\n update: function(dataItem) {\n this.element = this.listView.setDataItem(this.element, dataItem);\n },\n\n above: function(item) {\n if (item) {\n this.height = this.element.offsetHeight;\n this.top = item.top - this.height;\n this.bottom = item.top;\n putAt(this.element, this.top);\n }\n },\n\n below: function(item) {\n if (item) {\n this.height = this.element.offsetHeight;\n this.top = item.bottom;\n this.bottom = this.top + this.height;\n putAt(this.element, this.top);\n }\n },\n\n destroy: function() {\n kendo.destroy(this.element);\n $(this.element).remove();\n }\n });\n\n var LOAD_ICON = '
    ';\n var VirtualListViewLoadingIndicator = kendo.Class.extend({\n init: function(listView) {\n this.element = $('
  • ').appendTo(listView.element);\n this._loadIcon = $(LOAD_ICON).appendTo(this.element);\n },\n\n enable: function() {\n this.element.show();\n this.height = outerHeight(this.element, true);\n },\n\n disable: function() {\n this.element.hide();\n this.height = 0;\n },\n\n below: function(item) {\n if (item) {\n this.top = item.bottom;\n this.bottom = this.height + this.top;\n putAt(this.element, this.top);\n }\n }\n });\n\n var VirtualListViewPressToLoadMore = VirtualListViewLoadingIndicator.extend({\n init: function(listView, buffer) {\n\n this._loadIcon = $(LOAD_ICON).hide();\n this._loadButton = $('' + listView.options.messages.loadMoreText + '').hide();\n this.element = $('
  • ').append(this._loadIcon).append(this._loadButton).appendTo(listView.element);\n\n var loadMore = this;\n\n this._loadButton.kendoMobileButton().data(\"kendoMobileButton\").bind(\"click\", function() {\n loadMore._hideShowButton();\n buffer.next();\n });\n\n buffer.bind(\"resize\", function() {\n loadMore._showLoadButton();\n });\n\n this.height = outerHeight(this.element, true);\n this.disable();\n },\n\n _hideShowButton: function() {\n this._loadButton.hide();\n this.element.addClass(\"km-scroller-refresh\");\n this._loadIcon.css('display', 'block');\n },\n\n _showLoadButton: function() {\n this._loadButton.show();\n this.element.removeClass(\"km-scroller-refresh\");\n this._loadIcon.hide();\n }\n });\n\n var VirtualListViewItemBinder = kendo.Class.extend({\n init: function(listView) {\n var binder = this;\n\n this.chromeHeight = outerHeight(listView.wrapper.children().not(listView.element));\n this.listView = listView;\n this.scroller = listView.scroller();\n this.options = listView.options;\n\n listView.bind(\"_dataSource\", function(e) {\n binder.setDataSource(e.dataSource, e.empty);\n });\n\n listView.bind(\"resize\", function() {\n if (!binder.list.items.length) {\n return;\n }\n\n binder.scroller.reset();\n binder.buffer.range(0);\n binder.list.refresh();\n });\n\n this.scroller.makeVirtual();\n\n this._scroll = function(e) {\n binder.list.update(e.scrollTop);\n };\n this.scroller.bind('scroll', this._scroll);\n this._scrollEnd = function(e) {\n binder.list.batchUpdate(e.scrollTop);\n };\n this.scroller.bind('scrollEnd', this._scrollEnd);\n },\n\n destroy: function() {\n this.list.unbind();\n this.buffer.unbind();\n this.scroller.unbind('scroll', this._scroll);\n this.scroller.unbind('scrollEnd', this._scrollEnd);\n },\n\n setDataSource: function(dataSource, empty) {\n var binder = this,\n options = this.options,\n listView = this.listView,\n scroller = listView.scroller(),\n pressToLoadMore = options.loadMore,\n pageSize,\n buffer,\n footer;\n\n this.dataSource = dataSource;\n\n pageSize = dataSource.pageSize() || options.virtualViewSize;\n\n if (!pageSize && !empty) {\n throw new Error(\"the DataSource does not have page size configured. Page Size setting is mandatory for the mobile listview virtual scrolling to work as expected.\");\n }\n\n if (this.buffer) {\n this.buffer.destroy();\n }\n\n buffer = new kendo.data.Buffer(dataSource, Math.floor(pageSize / 2), pressToLoadMore);\n\n if (pressToLoadMore) {\n footer = new VirtualListViewPressToLoadMore(listView, buffer);\n } else {\n footer = new VirtualListViewLoadingIndicator(listView);\n }\n\n if (this.list) {\n this.list.destroy();\n }\n\n var list = new VirtualList({\n buffer: buffer,\n footer: footer,\n item: function(dataItem) { return new VirtualListViewItem(listView, dataItem); },\n height: function() { return scroller.height(); }\n });\n\n list.bind(\"resize\", function() {\n binder.updateScrollerSize();\n listView.updateSize();\n });\n\n list.bind(\"reset\", function() {\n binder.footer.enable();\n });\n\n list.bind(\"endReached\", function() {\n footer.disable();\n binder.updateScrollerSize();\n });\n\n buffer.bind(\"expand\", function() {\n list.lastDirection = false; // expand down\n list.batchUpdate(scroller.scrollTop);\n });\n\n $.extend(this, {\n buffer: buffer,\n scroller: scroller,\n list: list,\n footer: footer\n });\n },\n\n updateScrollerSize: function() {\n this.scroller.virtualSize(0, this.list.totalHeight() + this.chromeHeight);\n },\n\n refresh: function() {\n this.list.refresh();\n },\n\n reset: function() {\n this.buffer.range(0);\n this.list.refresh();\n }\n });\n\n var ListViewItemBinder = kendo.Class.extend({\n init: function(listView) {\n var binder = this;\n this.listView = listView;\n this.options = listView.options;\n\n var itemBinder = this;\n\n this._refreshHandler = function(e) {\n itemBinder.refresh(e);\n };\n\n this._progressHandler = function() {\n listView.showLoading();\n };\n\n listView.bind(\"_dataSource\", function(e) {\n binder.setDataSource(e.dataSource);\n });\n },\n\n destroy: function() {\n this._unbindDataSource();\n },\n\n reset: function() { },\n\n refresh: function(e) {\n var action = e && e.action,\n dataItems = e && e.items,\n listView = this.listView,\n dataSource = this.dataSource,\n prependOnRefresh = this.options.appendOnRefresh,\n view = dataSource.view(),\n groups = dataSource.group(),\n groupedMode = groups && groups[0],\n item;\n\n\n if (action === \"itemchange\") {\n if (!listView._hasBindingTarget()) {\n item = listView.findByDataItem(dataItems)[0];\n if (item) {\n listView.setDataItem(item, dataItems[0]);\n }\n }\n return;\n }\n\n var removedItems, addedItems, addedDataItems;\n var adding = (action === \"add\" && !groupedMode) || (prependOnRefresh && !listView._filter);\n var removing = action === \"remove\" && !groupedMode;\n\n if (adding) {\n // no need to unbind anything\n removedItems = [];\n } else if (removing) {\n // unbind the items about to be removed;\n removedItems = listView.findByDataItem(dataItems);\n }\n\n if (listView.trigger(DATABINDING, { action: action || \"rebind\", items: dataItems, removedItems: removedItems, index: e && e.index })) {\n if (this._shouldShowLoading()) {\n listView.hideLoading();\n }\n return;\n }\n\n if (action === \"add\" && !groupedMode) {\n var index = view.indexOf(dataItems[0]);\n if (index > -1) {\n addedItems = listView.insertAt(dataItems, index);\n addedDataItems = dataItems;\n }\n } else if (action === \"remove\" && !groupedMode) {\n addedItems = [];\n listView.remove(dataItems);\n } else if (groupedMode) {\n listView.replaceGrouped(view);\n }\n else if (prependOnRefresh && !listView._filter) {\n addedItems = listView.prepend(view);\n addedDataItems = view;\n }\n else {\n listView.replace(view);\n }\n\n if (this._shouldShowLoading()) {\n listView.hideLoading();\n }\n\n listView.trigger(DATABOUND, { ns: ui, addedItems: addedItems, addedDataItems: addedDataItems });\n },\n\n setDataSource: function(dataSource) {\n if (this.dataSource) {\n this._unbindDataSource();\n }\n\n this.dataSource = dataSource;\n dataSource.bind(CHANGE, this._refreshHandler);\n\n if (this._shouldShowLoading()) {\n this.dataSource.bind(PROGRESS, this._progressHandler);\n }\n },\n\n _unbindDataSource: function() {\n this.dataSource.unbind(CHANGE, this._refreshHandler).unbind(PROGRESS, this._progressHandler);\n },\n\n _shouldShowLoading: function() {\n var options = this.options;\n return !options.pullToRefresh && !options.loadMore && !options.endlessScroll;\n }\n });\n\n var ListViewFilter = kendo.Class.extend({\n init: function(listView) {\n var filter = this,\n filterable = listView.options.filterable,\n events = \"change paste\",\n that = this;\n\n this.listView = listView;\n this.options = filterable;\n\n listView.element.before(SEARCH_TEMPLATE({ placeholder: filterable.placeholder || \"Search...\" }));\n\n if (filterable.autoFilter !== false) {\n events += \" keyup\";\n }\n\n this.element = listView.wrapper.find(\".km-search-form\");\n\n this.searchInput = listView.wrapper.find(\"input[type=search]\")\n .closest(\"form\").on(\"submit\" + NS, function(e) {\n e.preventDefault();\n })\n .end()\n .on(\"focus\" + NS, function() {\n filter._oldFilter = filter.searchInput.val();\n })\n .on(events.split(\" \").join(NS + \" \") + NS, this._filterChange.bind(this));\n\n this.clearButton = listView.wrapper.find(\".km-filter-reset\")\n .on(CLICK, this._clearFilter.bind(this))\n .hide();\n\n this._dataSourceChange = this._refreshInput.bind(this);\n listView.bind(\"_dataSource\", function(e) {\n e.dataSource.bind(\"change\", that._dataSourceChange);\n });\n },\n\n _refreshInput: function() {\n var appliedFilters = this.listView.dataSource.filter();\n var searchInput = this.listView._filter.searchInput;\n\n if (!appliedFilters || appliedFilters.filters[0].field !== this.listView.options.filterable.field) {\n searchInput.val(\"\");\n } else {\n searchInput.val(appliedFilters.filters[0].value);\n }\n },\n\n _search: function(expr) {\n this._filter = true;\n this.clearButton[expr ? \"show\" : \"hide\"]();\n this.listView.dataSource.filter(expr);\n },\n\n _filterChange: function(e) {\n var filter = this;\n if (e.type == \"paste\" && this.options.autoFilter !== false) {\n setTimeout(function() {\n filter._applyFilter();\n }, 1);\n } else {\n this._applyFilter();\n }\n },\n\n _applyFilter: function() {\n var options = this.options,\n value = this.searchInput.val(),\n expr = value.length ? {\n field: options.field,\n operator: options.operator || \"startswith\",\n ignoreCase: options.ignoreCase,\n value: value\n } : null;\n\n if (value === this._oldFilter) {\n return;\n }\n\n this._oldFilter = value;\n this._search(expr);\n },\n\n _clearFilter: function(e) {\n this.searchInput.val(\"\");\n this._search(null);\n\n e.preventDefault();\n }\n });\n\n var ListView = Widget.extend({\n init: function(element, options) {\n var listView = this;\n\n Widget.fn.init.call(this, element, options);\n\n element = this.element;\n\n options = this.options;\n\n // support for legacy typo in configuration options: scrollTreshold -> scrollThreshold.\n if (options.scrollTreshold) {\n options.scrollThreshold = options.scrollTreshold;\n }\n\n element\n .on(\"down\", HIGHLIGHT_SELECTOR, \"_highlight\")\n .on(\"move up cancel\", HIGHLIGHT_SELECTOR, \"_dim\");\n\n this._userEvents = new kendo.UserEvents(element, {\n fastTap: true,\n filter: ITEM_SELECTOR,\n allowSelection: true,\n tap: function(e) {\n listView._click(e);\n }\n });\n\n // HACK!!! to negate the ms touch action from the user events.\n element.css(\"-ms-touch-action\", \"auto\");\n\n element.wrap(WRAPPER);\n\n this.wrapper = this.element.parent();\n\n this._headerFixer = new HeaderFixer(this);\n\n this._itemsCache = {};\n this._templates();\n\n this.virtual = options.endlessScroll || options.loadMore;\n\n this._style();\n\n if (this.options.$angular && (this.virtual || this.options.pullToRefresh)) {\n setTimeout(this._start.bind(this));\n } else {\n this._start();\n }\n\n },\n\n _start: function() {\n var options = this.options;\n\n if (this.options.filterable) {\n this._filter = new ListViewFilter(this);\n }\n\n if (this.virtual) {\n this._itemBinder = new VirtualListViewItemBinder(this);\n } else {\n this._itemBinder = new ListViewItemBinder(this);\n }\n\n if (this.options.pullToRefresh) {\n this._pullToRefreshHandler = new RefreshHandler(this);\n }\n\n this.setDataSource(options.dataSource);\n\n this._enhanceItems(this.items());\n\n kendo.notify(this, ui);\n },\n\n events: [\n CLICK,\n DATABINDING,\n DATABOUND,\n ITEM_CHANGE\n ],\n\n options: {\n name: \"ListView\",\n style: \"\",\n type: \"flat\",\n autoBind: true,\n fixedHeaders: false,\n template: \"#:data#\",\n headerTemplate: '#:value#',\n appendOnRefresh: false,\n loadMore: false,\n endlessScroll: false,\n scrollThreshold: 30,\n pullToRefresh: false,\n messages: {\n loadMoreText: \"Press to load more\",\n pullTemplate: \"Pull to refresh\",\n releaseTemplate: \"Release to refresh\",\n refreshTemplate: \"Refreshing\"\n },\n pullOffset: 140,\n filterable: false,\n virtualViewSize: null\n },\n\n refresh: function() {\n this._itemBinder.refresh();\n },\n\n reset: function() {\n this._itemBinder.reset();\n },\n\n setDataSource: function(dataSource) {\n // the listView should have a ready datasource for MVVM to function properly. But an empty datasource should not empty the element\n var emptyDataSource = !dataSource;\n this.dataSource = DataSource.create(dataSource);\n\n this.trigger(\"_dataSource\", { dataSource: this.dataSource, empty: emptyDataSource });\n\n if (this.options.autoBind && !emptyDataSource) {\n this.items().remove();\n this.dataSource.fetch();\n }\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n kendo.destroy(this.element);\n this._userEvents.destroy();\n if (this._itemBinder) {\n this._itemBinder.destroy();\n }\n\n if (this._headerFixer) {\n this._headerFixer.destroy();\n }\n\n this.element.unwrap();\n delete this.element;\n delete this.wrapper;\n delete this._userEvents;\n },\n\n items: function() {\n if (this.options.type === \"group\") {\n return this.element.find(\".km-list\").children();\n } else {\n return this.element.children().not('.km-load-more');\n }\n },\n\n scroller: function() {\n if (!this._scrollerInstance) {\n this._scrollerInstance = this.element.closest(\".km-scroll-wrapper\").data(\"kendoMobileScroller\");\n }\n\n return this._scrollerInstance;\n },\n\n showLoading: function() {\n var view = this.view();\n if (view && view.loader) {\n view.loader.show();\n }\n },\n\n hideLoading: function() {\n var view = this.view();\n if (view && view.loader) {\n view.loader.hide();\n }\n },\n\n insertAt: function(dataItems, index, triggerChange) {\n var listView = this;\n return listView._renderItems(dataItems, function(items) {\n if (index === 0) {\n listView.element.prepend(items);\n }\n else if (index === -1) {\n listView.element.append(items);\n } else {\n listView.items().eq(index - 1).after(items);\n }\n\n if (triggerChange) {\n for (var i = 0; i < items.length; i ++) {\n listView.trigger(ITEM_CHANGE, { item: items.eq(i), data: dataItems[i], ns: ui });\n }\n }\n });\n },\n\n append: function(dataItems, triggerChange) {\n return this.insertAt(dataItems, -1, triggerChange);\n },\n\n prepend: function(dataItems, triggerChange) {\n return this.insertAt(dataItems, 0, triggerChange);\n },\n\n replace: function(dataItems) {\n this.options.type = \"flat\";\n this._angularItems(\"cleanup\");\n kendo.destroy(this.element.children());\n this.element.empty();\n this._userEvents.cancel();\n this._style();\n return this.insertAt(dataItems, 0);\n },\n\n replaceGrouped: function(groups) {\n this.options.type = \"group\";\n this._angularItems(\"cleanup\");\n this.element.empty();\n var items = $(kendo.render(this.groupTemplate, groups));\n\n this._enhanceItems(items.children(\"ul\").children(\"li\"));\n this.element.append(items);\n mobile.init(items);\n this._style();\n this._angularItems(\"compile\");\n },\n\n remove: function(dataItems) {\n var items = this.findByDataItem(dataItems);\n this.angular(\"cleanup\", function() {\n return { elements: items };\n });\n kendo.destroy(items);\n items.remove();\n },\n\n findByDataItem: function(dataItems) {\n var selectors = [];\n\n for (var idx = 0, length = dataItems.length; idx < length; idx ++) {\n selectors[idx] = \"[data-\" + kendo.ns + \"uid=\" + dataItems[idx].uid + \"]\";\n }\n\n return this.element.find(selectors.join(\",\"));\n },\n\n // item is a DOM element, not jQuery object.\n setDataItem: function(item, dataItem) {\n var listView = this,\n replaceItem = function(items) {\n var newItem = $(items[0]);\n kendo.destroy(item);\n listView.angular(\"cleanup\", function() { return { elements: [ $(item) ] }; });\n $(item).replaceWith(newItem);\n listView.trigger(ITEM_CHANGE, { item: newItem, data: dataItem, ns: ui });\n };\n\n return this._renderItems([dataItem], replaceItem)[0];\n },\n\n updateSize: function() {\n this._size = this.getSize();\n },\n\n _renderItems: function(dataItems, callback) {\n var items = $(kendo.render(this.template, dataItems));\n\n callback(items);\n\n this.angular(\"compile\", function() {\n return {\n elements: items,\n data: dataItems.map(function(data) {\n return { dataItem: data };\n })\n };\n });\n\n mobile.init(items);\n this._enhanceItems(items);\n\n return items;\n },\n\n _dim: function(e) {\n this._toggle(e, false);\n },\n\n _highlight: function(e) {\n this._toggle(e, true);\n },\n\n _toggle: function(e, highlight) {\n if (e.which > 1) {\n return;\n }\n\n var clicked = $(e.currentTarget),\n item = clicked.parent(),\n role = attrValue(clicked, \"role\") || \"\",\n plainItem = (!role.match(buttonRegExp)),\n prevented = e.isDefaultPrevented();\n\n if (plainItem) {\n item.toggleClass(ACTIVE_CLASS, highlight && !prevented);\n }\n },\n\n _templates: function() {\n var template = this.options.template,\n headerTemplate = this.options.headerTemplate,\n dataIDAttribute = ' data-uid=\"#=arguments[0].uid || \"\"#\"',\n templateProxy = {},\n groupTemplateProxy = {};\n\n if (typeof template === FUNCTION) {\n templateProxy.template = template;\n template = \"#=this.template(data)#\";\n }\n\n this.template = kendo.template(\"\" + template + \"\").bind(templateProxy);\n\n groupTemplateProxy.template = this.template;\n\n if (typeof headerTemplate === FUNCTION) {\n groupTemplateProxy._headerTemplate = headerTemplate;\n headerTemplate = \"#=this._headerTemplate(data)#\";\n }\n\n groupTemplateProxy.headerTemplate = kendo.template(headerTemplate);\n\n this.groupTemplate = GROUP_TEMPLATE.bind(groupTemplateProxy);\n },\n\n _click: function(e) {\n if (e.event.which > 1 || e.event.isDefaultPrevented()) {\n return;\n }\n\n var dataItem,\n item = e.target,\n target = $(e.event.target),\n buttonElement = target.closest(kendo.roleSelector(\"button\", \"detailbutton\", \"backbutton\")),\n button = kendo.widgetInstance(buttonElement, ui),\n id = item.attr(kendo.attr(\"uid\"));\n\n if (id) {\n dataItem = this.dataSource.getByUid(id);\n }\n\n if (this.trigger(CLICK, { target: target, item: item, dataItem: dataItem, button: button })) {\n e.preventDefault();\n }\n },\n\n _styleGroups: function() {\n var rootItems = this.element.children();\n\n rootItems.children(\"ul\").addClass(\"km-list\");\n\n rootItems.each(function() {\n var li = $(this),\n groupHeader = li.contents().first();\n\n li.addClass(\"km-group-container\");\n if (!groupHeader.is(\"ul\") && !groupHeader.is(\"div.\" + GROUP_CLASS)) {\n groupHeader.wrap(GROUP_WRAPPER);\n }\n });\n },\n\n _style: function() {\n var options = this.options,\n grouped = options.type === \"group\",\n element = this.element,\n inset = options.style === \"inset\";\n\n element.addClass(\"km-listview\")\n .toggleClass(\"km-list\", !grouped)\n .toggleClass(\"km-virtual-list\", this.virtual)\n .toggleClass(\"km-listinset\", !grouped && inset)\n .toggleClass(\"km-listgroup\", grouped && !inset)\n .toggleClass(\"km-listgroupinset\", grouped && inset);\n\n if (!element.parents(\".km-listview\")[0]) {\n element.closest(\".km-content\").toggleClass(\"km-insetcontent\", inset); // iOS has white background when the list is not inset.\n }\n\n if (grouped) {\n this._styleGroups();\n }\n\n this.trigger(STYLED);\n },\n\n _enhanceItems: function(items) {\n items.each(function() {\n var item = $(this),\n child,\n enhanced = false;\n\n item.children().each(function() {\n child = $(this);\n if (child.is(\"a\")) {\n enhanceLinkItem(child);\n enhanced = true;\n } else if (child.is(\"label\")) {\n enhanceCheckBoxItem(child);\n enhanced = true;\n }\n });\n\n if (!enhanced) {\n enhanceItem(item);\n }\n });\n }\n });\n\n ui.plugin(ListView);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.navbar',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.navbar\",\n name: \"NavBar\",\n category: \"mobile\",\n description: \"The Kendo mobile NavBar widget is used inside a mobile View or Layout Header element to display an application navigation bar.\",\n depends: [ \"core\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n ui = mobile.ui,\n Widget = ui.Widget;\n\n function createContainer(align, element) {\n var items = element.find(\"[\" + kendo.attr(\"align\") + \"=\" + align + \"]\");\n\n if (items[0]) {\n return $('
    ').append(items).prependTo(element);\n }\n }\n\n function toggleTitle(centerElement) {\n var siblings = centerElement.siblings(),\n noTitle = !!centerElement.children(\"ul\")[0],\n showTitle = (!!siblings[0] && kendo.trim(centerElement.text()) === \"\"),\n android = !!(kendo.mobile.application && kendo.mobile.application.element.is(\".km-android\"));\n\n centerElement.prevAll().toggleClass(\"km-absolute\", noTitle);\n centerElement.toggleClass(\"km-show-title\", showTitle);\n centerElement.toggleClass(\"km-fill-title\", showTitle && !kendo.trim(centerElement.html()));\n centerElement.toggleClass(\"km-no-title\", noTitle);\n centerElement.toggleClass(\"km-hide-title\", android && !siblings.children().is(\":visible\"));\n }\n\n var NavBar = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n\n that.container().bind(\"show\", this.refresh.bind(this));\n\n element.addClass(\"km-navbar\").wrapInner($('
    '));\n that.leftElement = createContainer(\"left\", element);\n that.rightElement = createContainer(\"right\", element);\n that.centerElement = element.find(\".km-view-title\");\n },\n\n options: {\n name: \"NavBar\"\n },\n\n title: function(value) {\n this.element.find(kendo.roleSelector(\"view-title\")).text(value);\n toggleTitle(this.centerElement);\n },\n\n refresh: function(e) {\n var view = e.view;\n this.title(view.options.title);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n kendo.destroy(this.element);\n }\n });\n\n ui.plugin(NavBar);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.scrollview',[ \"kendo.fx\", \"kendo.data\", \"kendo.draganddrop\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.scrollview\",\n name: \"ScrollView\",\n category: \"mobile\",\n description: \"The Kendo Mobile ScrollView widget is used to scroll content wider than the device screen.\",\n depends: [ \"fx\", \"data\", \"draganddrop\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n ui = mobile.ui,\n Transition = kendo.effects.Transition,\n Pane = kendo.ui.Pane,\n PaneDimensions = kendo.ui.PaneDimensions,\n Widget = ui.DataBoundWidget,\n DataSource = kendo.data.DataSource,\n Buffer = kendo.data.Buffer,\n BatchBuffer = kendo.data.BatchBuffer,\n\n // Math\n math = Math,\n abs = math.abs,\n ceil = math.ceil,\n round = math.round,\n max = math.max,\n min = math.min,\n floor = math.floor,\n\n CHANGE = \"change\",\n CHANGING = \"changing\",\n REFRESH = \"refresh\",\n CURRENT_PAGE_CLASS = \"current-page\",\n VIRTUAL_PAGE_CLASS = \"virtual-page\",\n FUNCTION = \"function\",\n ITEM_CHANGE = \"itemChange\",\n CLEANUP = \"cleanup\",\n\n VIRTUAL_PAGE_COUNT = 3,\n LEFT_PAGE = -1,\n CETER_PAGE = 0,\n RIGHT_PAGE = 1,\n\n LEFT_SWIPE = -1,\n NUDGE = 0,\n RIGHT_SWIPE = 1;\n\n function className(name) {\n return \"k-\" + name + \" km-\" + name;\n }\n\n var Pager = kendo.Class.extend({\n init: function(scrollView) {\n var that = this,\n element = $(\"
      \");\n\n scrollView.element.append(element);\n\n this._changeProxy = that._change.bind(that);\n this._refreshProxy = that._refresh.bind(that);\n scrollView.bind(CHANGE, this._changeProxy);\n scrollView.bind(REFRESH, this._refreshProxy);\n\n $.extend(that, { element: element, scrollView: scrollView });\n },\n\n items: function() {\n return this.element.children();\n },\n\n _refresh: function(e) {\n var pageHTML = \"\";\n\n for (var idx = 0; idx < e.pageCount; idx ++) {\n pageHTML += \"
    1. \";\n }\n\n this.element.html(pageHTML);\n this.items().eq(e.page).addClass(className(CURRENT_PAGE_CLASS));\n },\n\n _change: function(e) {\n this.items()\n .removeClass(className(CURRENT_PAGE_CLASS))\n .eq(e.page).addClass(className(CURRENT_PAGE_CLASS));\n },\n\n destroy: function() {\n this.scrollView.unbind(CHANGE, this._changeProxy);\n this.scrollView.unbind(REFRESH, this._refreshProxy);\n this.element.remove();\n }\n });\n\n kendo.mobile.ui.ScrollViewPager = Pager;\n\n var TRANSITION_END = \"transitionEnd\",\n DRAG_START = \"dragStart\",\n DRAG_END = \"dragEnd\";\n\n var ElasticPane = kendo.Observable.extend({\n init: function(element, options) {\n var that = this;\n\n kendo.Observable.fn.init.call(this);\n\n this.element = element;\n this.container = element.parent();\n\n var movable,\n transition,\n userEvents,\n dimensions,\n dimension,\n pane;\n\n movable = new kendo.ui.Movable(that.element);\n\n transition = new Transition({\n axis: \"x\",\n movable: movable,\n onEnd: function() {\n that.trigger(TRANSITION_END);\n }\n });\n\n userEvents = new kendo.UserEvents(element, {\n fastTap: true,\n start: function(e) {\n if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n userEvents.capture();\n } else {\n userEvents.cancel();\n }\n\n that.trigger(DRAG_START, e);\n transition.cancel();\n },\n allowSelection: true,\n end: function(e) {\n that.trigger(DRAG_END, e);\n }\n });\n\n dimensions = new PaneDimensions({\n element: that.element,\n container: that.container\n });\n\n dimension = dimensions.x;\n\n dimension.bind(CHANGE, function() {\n that.trigger(CHANGE);\n });\n\n pane = new Pane({\n dimensions: dimensions,\n userEvents: userEvents,\n movable: movable,\n elastic: true\n });\n\n $.extend(that, {\n duration: options && options.duration || 1,\n movable: movable,\n transition: transition,\n userEvents: userEvents,\n dimensions: dimensions,\n dimension: dimension,\n pane: pane\n });\n\n this.bind([TRANSITION_END, DRAG_START, DRAG_END, CHANGE], options);\n },\n\n size: function() {\n return { width: this.dimensions.x.getSize(), height: this.dimensions.y.getSize() };\n },\n\n total: function() {\n return this.dimension.getTotal();\n },\n\n offset: function() {\n return -this.movable.x;\n },\n\n updateDimension: function() {\n this.dimension.update(true);\n },\n\n refresh: function() {\n this.dimensions.refresh();\n },\n\n moveTo: function(offset) {\n this.movable.moveAxis(\"x\", -offset);\n },\n\n transitionTo: function(offset, ease, instant) {\n if (instant) {\n this.moveTo(-offset);\n } else {\n this.transition.moveTo({ location: offset, duration: this.duration, ease: ease });\n }\n }\n });\n\n kendo.mobile.ui.ScrollViewElasticPane = ElasticPane;\n\n var ScrollViewContent = kendo.Observable.extend({\n init: function(element, pane, options) {\n var that = this;\n\n kendo.Observable.fn.init.call(this);\n that.element = element;\n that.pane = pane;\n that._getPages();\n this.page = 0;\n this.pageSize = options.pageSize || 1;\n this.contentHeight = options.contentHeight;\n this.enablePager = options.enablePager;\n this.pagerOverlay = options.pagerOverlay;\n },\n\n scrollTo: function(page, instant) {\n this.page = page;\n this.pane.transitionTo(- page * this.pane.size().width, Transition.easeOutExpo, instant);\n },\n\n paneMoved: function(swipeType, bounce, callback, /*internal*/ instant) {\n var that = this,\n pane = that.pane,\n width = pane.size().width * that.pageSize,\n approx = round,\n ease = bounce ? Transition.easeOutBack : Transition.easeOutExpo,\n snap,\n nextPage;\n\n if (swipeType === LEFT_SWIPE) {\n approx = ceil;\n } else if (swipeType === RIGHT_SWIPE) {\n approx = floor;\n }\n\n nextPage = approx(pane.offset() / width);\n\n snap = max(that.minSnap, min(-nextPage * width, that.maxSnap));\n\n if (nextPage != that.page) {\n if (callback && callback({ currentPage: that.page, nextPage: nextPage })) {\n snap = -that.page * pane.size().width;\n }\n }\n\n pane.transitionTo(snap, ease, instant);\n },\n\n updatePage: function() {\n var pane = this.pane,\n page = round(pane.offset() / pane.size().width);\n\n if (page != this.page) {\n this.page = page;\n return true;\n }\n\n return false;\n },\n\n forcePageUpdate: function() {\n return this.updatePage();\n },\n\n resizeTo: function(size) {\n var pane = this.pane,\n width = size.width;\n\n this.pageElements.width(width);\n\n if (this.contentHeight === \"100%\") {\n var containerHeight = this.element.parent().height();\n\n if (this.enablePager === true) {\n var pager = this.element.parent().find(\"ol.km-pages\");\n if (!this.pagerOverlay && pager.length) {\n containerHeight -= kendo._outerHeight(pager, true);\n }\n }\n\n this.element.css(\"height\", containerHeight);\n this.pageElements.css(\"height\", containerHeight);\n }\n\n // re-read pane dimension after the pageElements have been resized.\n pane.updateDimension();\n\n if (!this._paged) {\n this.page = floor(pane.offset() / width);\n }\n\n this.scrollTo(this.page, true);\n\n this.pageCount = ceil(pane.total() / width);\n this.minSnap = - (this.pageCount - 1) * width;\n this.maxSnap = 0;\n },\n\n _getPages: function() {\n this.pageElements = this.element.find(kendo.roleSelector(\"page\"));\n this._paged = this.pageElements.length > 0;\n }\n });\n\n kendo.mobile.ui.ScrollViewContent = ScrollViewContent;\n\n var VirtualScrollViewContent = kendo.Observable.extend({\n init: function(element, pane, options) {\n var that = this;\n\n kendo.Observable.fn.init.call(this);\n\n that.element = element;\n that.pane = pane;\n that.options = options;\n that._templates();\n that.page = options.page || 0;\n that.pages = [];\n that._initPages();\n that.resizeTo(that.pane.size());\n\n that.pane.dimension.forceEnabled();\n },\n\n setDataSource: function(dataSource) {\n this.dataSource = DataSource.create(dataSource);\n this._buffer();\n this._pendingPageRefresh = false;\n this._pendingWidgetRefresh = false;\n },\n\n _viewShow: function() {\n var that = this;\n if (that._pendingWidgetRefresh) {\n setTimeout(function() {\n that._resetPages();\n }, 0);\n that._pendingWidgetRefresh = false;\n }\n },\n\n _buffer: function() {\n var itemsPerPage = this.options.itemsPerPage;\n\n if (this.buffer) {\n this.buffer.destroy();\n }\n\n if (itemsPerPage > 1) {\n this.buffer = new BatchBuffer(this.dataSource, itemsPerPage);\n } else {\n this.buffer = new Buffer(this.dataSource, itemsPerPage * 3);\n }\n\n this._resizeProxy = this._onResize.bind(this);\n this._resetProxy = this._onReset.bind(this);\n this._endReachedProxy = this._onEndReached.bind(this);\n\n this.buffer.bind({\n \"resize\": this._resizeProxy,\n \"reset\": this._resetProxy,\n \"endreached\": this._endReachedProxy\n });\n },\n\n _templates: function() {\n var template = this.options.template,\n emptyTemplate = this.options.emptyTemplate,\n templateProxy = {},\n emptyTemplateProxy = {};\n\n if (typeof template === FUNCTION) {\n templateProxy.template = template;\n template = \"#=this.template(data)#\";\n }\n\n this.template = kendo.template(template).bind(templateProxy);\n\n if (typeof emptyTemplate === FUNCTION) {\n emptyTemplateProxy.emptyTemplate = emptyTemplate;\n emptyTemplate = \"#=this.emptyTemplate(data)#\";\n }\n\n this.emptyTemplate = kendo.template(emptyTemplate).bind(emptyTemplateProxy);\n },\n\n _initPages: function() {\n var pages = this.pages,\n element = this.element,\n page;\n\n for (var i = 0; i < VIRTUAL_PAGE_COUNT; i++) {\n page = new Page(element);\n pages.push(page);\n }\n\n this.pane.updateDimension();\n },\n\n resizeTo: function(size) {\n var pages = this.pages,\n pane = this.pane;\n\n for (var i = 0; i < pages.length; i++) {\n pages[i].setWidth(size.width);\n }\n\n if (this.options.contentHeight === \"auto\") {\n this.element.css(\"height\", this.pages[1].element.height());\n }\n\n else if (this.options.contentHeight === \"100%\") {\n var containerHeight = this.element.parent().height();\n\n if (this.options.enablePager === true) {\n var pager = this.element.parent().find(\"ol.km-pages\");\n if (!this.options.pagerOverlay && pager.length) {\n containerHeight -= kendo._outerHeight(pager, true);\n }\n }\n\n this.element.css(\"height\", containerHeight);\n pages[0].element.css(\"height\", containerHeight);\n pages[1].element.css(\"height\", containerHeight);\n pages[2].element.css(\"height\", containerHeight);\n }\n\n pane.updateDimension();\n\n this._repositionPages();\n\n this.width = size.width;\n },\n\n scrollTo: function(page) {\n var buffer = this.buffer,\n dataItem;\n\n buffer.syncDataSource();\n dataItem = buffer.at(page);\n\n if (!dataItem) {\n return;\n }\n\n this._updatePagesContent(page);\n\n this.page = page;\n },\n\n paneMoved: function(swipeType, bounce, callback, /*internal*/ instant) {\n var that = this,\n pane = that.pane,\n width = pane.size().width,\n offset = pane.offset(),\n thresholdPassed = Math.abs(offset) >= width / 3,\n ease = bounce ? kendo.effects.Transition.easeOutBack : kendo.effects.Transition. easeOutExpo,\n isEndReached = that.page + 2 > that.buffer.total(),\n nextPage,\n delta = 0;\n\n if (swipeType === RIGHT_SWIPE) {\n if (that.page !== 0) {\n delta = -1; //backward\n }\n } else if (swipeType === LEFT_SWIPE && !isEndReached) {\n delta = 1; //forward\n } else if (offset > 0 && (thresholdPassed && !isEndReached)) {\n delta = 1; //forward\n } else if (offset < 0 && thresholdPassed) {\n if (that.page !== 0) {\n delta = -1; //backward\n }\n }\n\n nextPage = that.page;\n if (delta) {\n nextPage = (delta > 0) ? nextPage + 1 : nextPage - 1;\n }\n\n if (callback && callback({ currentPage: that.page, nextPage: nextPage })) {\n delta = 0;\n }\n\n if (delta === 0) {\n that._cancelMove(ease, instant);\n } else if (delta === -1) {\n that._moveBackward(instant);\n } else if (delta === 1) {\n that._moveForward(instant);\n }\n },\n\n updatePage: function() {\n var pages = this.pages;\n\n if (this.pane.offset() === 0) {\n return false;\n }\n\n if (this.pane.offset() > 0) {\n pages.push(this.pages.shift());//forward\n this.page++;\n this.setPageContent(pages[2], this.page + 1);\n } else {\n pages.unshift(this.pages.pop()); //back\n this.page--;\n this.setPageContent(pages[0], this.page - 1);\n }\n\n this._repositionPages();\n\n this._resetMovable();\n\n return true;\n },\n\n forcePageUpdate: function() {\n var offset = this.pane.offset(),\n threshold = this.pane.size().width * 3 / 4;\n\n if (abs(offset) > threshold) {\n return this.updatePage();\n }\n\n return false;\n },\n\n _resetMovable: function() {\n this.pane.moveTo(0);\n },\n\n _moveForward: function(instant) {\n this.pane.transitionTo(-this.width, kendo.effects.Transition.easeOutExpo, instant);\n },\n\n _moveBackward: function(instant) {\n this.pane.transitionTo(this.width, kendo.effects.Transition.easeOutExpo, instant);\n },\n\n _cancelMove: function(ease, /*internal*/ instant) {\n this.pane.transitionTo(0, ease, instant);\n },\n\n _resetPages: function() {\n this.page = this.options.page || 0;\n\n this._updatePagesContent(this.page);\n this._repositionPages();\n\n this.trigger(\"reset\");\n },\n\n _onResize: function() {\n this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);\n\n if (this._pendingPageRefresh) {\n this._updatePagesContent(this.page);\n this._pendingPageRefresh = false;\n }\n\n this.trigger(\"resize\");\n },\n\n _onReset: function() {\n this.pageCount = ceil(this.dataSource.total() / this.options.itemsPerPage);\n this._resetPages();\n },\n\n _onEndReached: function() {\n this._pendingPageRefresh = true;\n },\n\n _repositionPages: function() {\n var pages = this.pages;\n\n pages[0].position(LEFT_PAGE);\n pages[1].position(CETER_PAGE);\n pages[2].position(RIGHT_PAGE);\n },\n\n _updatePagesContent: function(offset) {\n var pages = this.pages,\n currentPage = offset || 0;\n\n this.setPageContent(pages[0], currentPage - 1);\n this.setPageContent(pages[1], currentPage);\n this.setPageContent(pages[2], currentPage + 1);\n },\n\n setPageContent: function(page, index) {\n var buffer = this.buffer,\n template = this.template,\n emptyTemplate = this.emptyTemplate,\n view = null;\n\n if (index >= 0) {\n view = buffer.at(index);\n if (Array.isArray(view) && !view.length) {\n view = null;\n }\n }\n\n this.trigger(CLEANUP, { item: page.element });\n\n if (view !== null) {\n page.content(template(view));\n } else {\n page.content(emptyTemplate({}));\n }\n\n kendo.mobile.init(page.element);\n this.trigger(ITEM_CHANGE, { item: page.element, data: view, ns: kendo.mobile.ui });\n\n }\n });\n\n kendo.mobile.ui.VirtualScrollViewContent = VirtualScrollViewContent;\n\n var Page = kendo.Class.extend({\n init: function(container) {\n this.element = $(\"
      \");\n this.width = container.width();\n this.element.width(this.width);\n container.append(this.element);\n },\n\n content: function(theContent) {\n this.element.html(theContent);\n },\n\n position: function(position) { //position can be -1, 0, 1\n this.element.css(\"transform\", \"translate3d(\" + this.width * position + \"px, 0, 0)\");\n },\n\n setWidth: function(width) {\n this.width = width;\n this.element.width(width);\n }\n });\n\n kendo.mobile.ui.VirtualPage = Page;\n\n var ScrollView = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n options = that.options;\n element = that.element;\n\n kendo.stripWhitespace(element[0]);\n\n element\n .wrapInner(\"
      \")\n .addClass(\"k-widget \" + className(\"scrollview\"));\n\n if (this.options.enablePager) {\n this.pager = new Pager(this);\n\n if (this.options.pagerOverlay) {\n element.addClass(className(\"scrollview-overlay\"));\n }\n }\n\n that.inner = element.children().first();\n that.page = 0;\n that.inner.css(\"height\", options.contentHeight);\n\n that.pane = new ElasticPane(that.inner, {\n duration: this.options.duration,\n transitionEnd: this._transitionEnd.bind(this),\n dragStart: this._dragStart.bind(this),\n dragEnd: this._dragEnd.bind(this),\n change: this[REFRESH].bind(this)\n });\n\n that.bind(\"resize\", function() {\n that.pane.refresh();\n });\n\n that.page = options.page;\n\n var empty = this.inner.children().length === 0;\n\n var content = empty ? new VirtualScrollViewContent(that.inner, that.pane, options) : new ScrollViewContent(that.inner, that.pane, options);\n\n content.page = that.page;\n\n content.bind(\"reset\", function() {\n this._pendingPageRefresh = false;\n that._syncWithContent();\n that.trigger(REFRESH, { pageCount: content.pageCount, page: content.page });\n });\n\n content.bind(\"resize\", function() {\n that.trigger(REFRESH, { pageCount: content.pageCount, page: content.page });\n });\n\n content.bind(ITEM_CHANGE, function(e) {\n that.trigger(ITEM_CHANGE, e);\n\n that.angular(\"compile\", function() {\n return { elements: e.item, data: [ { dataItem: e.data } ] };\n });\n });\n\n content.bind(CLEANUP, function(e) {\n that.angular(\"cleanup\", function() {\n return { elements: e.item };\n });\n });\n\n that._content = content;\n that.setDataSource(options.dataSource);\n\n var mobileContainer = that.container();\n\n if (mobileContainer.nullObject) {\n that.viewInit();\n that.viewShow();\n } else {\n mobileContainer.bind(\"show\", this.viewShow.bind(this)).bind(\"init\", this.viewInit.bind(this));\n }\n },\n\n options: {\n name: \"ScrollView\",\n page: 0,\n duration: 400,\n velocityThreshold: 0.8,\n contentHeight: \"auto\",\n pageSize: 1,\n itemsPerPage: 1,\n bounceVelocityThreshold: 1.6,\n enablePager: true,\n pagerOverlay: false,\n autoBind: true,\n template: \"\",\n emptyTemplate: \"\"\n },\n\n events: [\n CHANGING,\n CHANGE,\n REFRESH\n ],\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n kendo.destroy(this.element);\n },\n\n viewInit: function() {\n if (this.options.autoBind) {\n this._content.scrollTo(this._content.page, true);\n }\n },\n\n viewShow: function() {\n this.pane.refresh();\n },\n\n refresh: function() {\n var content = this._content;\n\n content.resizeTo(this.pane.size());\n this.page = content.page;\n this.trigger(REFRESH, { pageCount: content.pageCount, page: content.page });\n },\n\n content: function(html) {\n this.element.children().first().html(html);\n this._content._getPages();\n this.pane.refresh();\n },\n\n value: function(item) {\n var dataSource = this.dataSource;\n\n if (item) {\n this.scrollTo(dataSource.indexOf(item), true);\n } else {\n return dataSource.at(this.page);\n }\n },\n\n scrollTo: function(page, instant) {\n this._content.scrollTo(page, instant);\n this._syncWithContent();\n },\n\n prev: function() {\n var that = this,\n prevPage = that.page - 1;\n\n if (that._content instanceof VirtualScrollViewContent) {\n that._content.paneMoved(RIGHT_SWIPE, undefined, function(eventData) {\n return that.trigger(CHANGING, eventData);\n });\n } else if (prevPage > -1) {\n that.scrollTo(prevPage);\n }\n },\n\n next: function() {\n var that = this,\n nextPage = that.page + 1;\n\n if (that._content instanceof VirtualScrollViewContent) {\n that._content.paneMoved(LEFT_SWIPE, undefined, function(eventData) {\n return that.trigger(CHANGING, eventData);\n });\n } else if (nextPage < that._content.pageCount) {\n that.scrollTo(nextPage);\n }\n },\n\n setDataSource: function(dataSource) {\n if (!(this._content instanceof VirtualScrollViewContent)) {\n return;\n }\n // the scrollview should have a ready datasource for MVVM to function properly. But an empty datasource should not empty the element\n var emptyDataSource = !dataSource;\n this.dataSource = DataSource.create(dataSource);\n\n this._content.setDataSource(this.dataSource);\n\n if (this.options.autoBind && !emptyDataSource) {\n // this.items().remove();\n this.dataSource.fetch();\n }\n },\n\n items: function() {\n return this.element.find(\".km-\" + VIRTUAL_PAGE_CLASS);\n },\n\n _syncWithContent: function() {\n var pages = this._content.pages,\n buffer = this._content.buffer,\n data,\n element;\n\n this.page = this._content.page;\n\n data = buffer ? buffer.at(this.page) : undefined;\n if (!(data instanceof Array)) {\n data = [data];\n }\n element = pages ? pages[1].element : undefined;\n\n this.trigger(CHANGE, { page: this.page, element: element, data: data });\n },\n\n _dragStart: function() {\n if (this._content.forcePageUpdate()) {\n this._syncWithContent();\n }\n },\n\n _dragEnd: function(e) {\n var that = this,\n velocity = e.x.velocity,\n velocityThreshold = this.options.velocityThreshold,\n swipeType = NUDGE,\n bounce = abs(velocity) > this.options.bounceVelocityThreshold;\n\n if (velocity > velocityThreshold) {\n swipeType = RIGHT_SWIPE;\n } else if (velocity < -velocityThreshold) {\n swipeType = LEFT_SWIPE;\n }\n\n this._content.paneMoved(swipeType, bounce, function(eventData) {\n return that.trigger(CHANGING, eventData);\n });\n },\n\n _transitionEnd: function() {\n if (this._content.updatePage()) {\n this._syncWithContent();\n }\n }\n });\n\n ui.plugin(ScrollView);\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n\n(function(f, define) {\n define('kendo.mobile.switch',[ \"kendo.fx\", \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.switch\",\n name: \"Switch\",\n category: \"mobile\",\n description: \"The mobile Switch widget is used to display two exclusive choices.\",\n depends: [ \"fx\", \"userevents\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n outerWidth = kendo._outerWidth,\n Widget = ui.Widget,\n support = kendo.support,\n CHANGE = \"change\",\n SWITCHON = \"switch-on\",\n SWITCHOFF = \"switch-off\",\n MARGINLEFT = \"margin-left\",\n ACTIVE_STATE = \"state-active\",\n DISABLED_STATE = \"state-disabled\",\n DISABLED = \"disabled\",\n RESOLVEDPREFIX = support.transitions.css === undefined ? \"\" : support.transitions.css,\n TRANSFORMSTYLE = RESOLVEDPREFIX + \"transform\";\n\n function className(name) {\n return \"km-\" + name;\n }\n\n function limitValue(value, minLimit, maxLimit) {\n return Math.max(minLimit, Math.min(maxLimit, value));\n }\n\n var SWITCH_MARKUP = '\\\n \\\n \\\n \\\n \\\n \\\n {0} \\\n {1} \\\n \\\n \\\n ';\n\n var Switch = Widget.extend({\n init: function(element, options) {\n var that = this, checked;\n\n Widget.fn.init.call(that, element, options);\n\n options = that.options;\n\n that.wrapper = $(kendo.format(SWITCH_MARKUP, options.onLabel, options.offLabel));\n that.handle = that.wrapper.find(\".km-switch-handle\");\n that.background = that.wrapper.find(\".km-switch-background\");\n that.wrapper.insertBefore(that.element).prepend(that.element);\n\n that._drag();\n\n that.origin = parseInt(that.background.css(MARGINLEFT), 10);\n\n that.constrain = 0;\n that.snapPoint = 0;\n\n element = that.element[0];\n element.type = \"checkbox\";\n that._animateBackground = true;\n\n checked = that.options.checked;\n\n if (checked === null) {\n checked = element.checked;\n }\n\n that.check(checked);\n\n that.options.enable = that.options.enable && !that.element.attr(DISABLED);\n that.enable(that.options.enable);\n\n that.refresh();\n kendo.notify(that, kendo.mobile.ui);\n },\n\n refresh: function() {\n var that = this,\n handleWidth = outerWidth(that.handle, true);\n\n that.width = that.wrapper.width();\n\n that.constrain = that.width - handleWidth;\n that.snapPoint = that.constrain / 2;\n\n if (typeof that.origin != \"number\") {\n that.origin = parseInt(that.background.css(MARGINLEFT), 10);\n }\n\n that.background.data(\"origin\", that.origin);\n\n that.check(that.element[0].checked);\n },\n\n events: [\n CHANGE\n ],\n\n options: {\n name: \"Switch\",\n onLabel: \"on\",\n offLabel: \"off\",\n checked: null,\n enable: true\n },\n\n check: function(check) {\n var that = this,\n element = that.element[0];\n\n if (check === undefined) {\n return element.checked;\n }\n\n that._position(check ? that.constrain : 0);\n element.checked = check;\n that.wrapper\n .toggleClass(className(SWITCHON), check)\n .toggleClass(className(SWITCHOFF), !check);\n },\n\n // alias for check, NG support\n value: function() {\n return this.check.apply(this, arguments);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.userEvents.destroy();\n },\n\n toggle: function() {\n var that = this;\n\n that.check(!that.element[0].checked);\n },\n\n enable: function(enable) {\n var element = this.element,\n wrapper = this.wrapper;\n\n if (typeof enable == \"undefined\") {\n enable = true;\n }\n\n this.options.enable = enable;\n\n if (enable) {\n element.prop(DISABLED, false);\n } else {\n element.attr(DISABLED, DISABLED);\n }\n\n wrapper.toggleClass(className(DISABLED_STATE), !enable);\n },\n\n _resize: function() {\n this.refresh();\n },\n\n _move: function(e) {\n var that = this;\n e.preventDefault();\n that._position(limitValue(that.position + e.x.delta, 0, that.width - outerWidth(that.handle, true)));\n },\n\n _position: function(position) {\n var that = this;\n\n that.position = position;\n that.handle.css(TRANSFORMSTYLE, \"translatex(\" + position + \"px)\");\n\n if (that._animateBackground) {\n that.background.css(MARGINLEFT, that.origin + position);\n }\n },\n\n _start: function() {\n if (!this.options.enable) {\n this.userEvents.cancel();\n } else {\n this.userEvents.capture();\n this.handle.addClass(className(ACTIVE_STATE));\n }\n },\n\n _stop: function() {\n var that = this;\n\n that.handle.removeClass(className(ACTIVE_STATE));\n that._toggle(that.position > that.snapPoint);\n },\n\n _toggle: function(checked) {\n var that = this,\n handle = that.handle,\n element = that.element[0],\n value = element.checked,\n duration = kendo.mobile.application && kendo.mobile.application.os.wp ? 100 : 200,\n distance;\n\n that.wrapper\n .toggleClass(className(SWITCHON), checked)\n .toggleClass(className(SWITCHOFF), !checked);\n\n that.position = distance = checked * that.constrain;\n\n if (that._animateBackground) {\n that.background\n .kendoStop(true, true)\n .kendoAnimate({ effects: \"slideMargin\", offset: distance, reset: true, reverse: !checked, axis: \"left\", duration: duration });\n }\n\n handle\n .kendoStop(true, true)\n .kendoAnimate({\n effects: \"slideTo\",\n duration: duration,\n offset: distance + \"px,0\",\n reset: true,\n complete: function() {\n if (value !== checked) {\n element.checked = checked;\n that.trigger(CHANGE, { checked: checked });\n }\n }\n });\n },\n\n _drag: function() {\n var that = this;\n\n that.userEvents = new kendo.UserEvents(that.wrapper, {\n fastTap: true,\n tap: function() {\n if (that.options.enable) {\n that._toggle(!that.element[0].checked);\n }\n },\n start: that._start.bind(that),\n move: that._move.bind(that),\n end: that._stop.bind(that)\n });\n }\n });\n\n ui.plugin(Switch);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile.tabstrip',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"mobile.tabstrip\",\n name: \"TabStrip\",\n category: \"mobile\",\n description: \"The mobile TabStrip widget is used inside a mobile view or layout footer element to display an application-wide group of navigation buttons.\",\n depends: [ \"core\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.mobile.ui,\n Widget = ui.Widget,\n ACTIVE_STATE_CLASS = \"km-state-active\",\n SELECT = \"select\";\n\n function createBadge(value) {\n return $('' + value + '');\n }\n\n var TabStrip = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n that.container().bind(\"show\", this.refresh.bind(this));\n\n that.element\n .addClass(\"km-tabstrip\")\n .find(\"a\").each(that._buildButton)\n .eq(that.options.selectedIndex).addClass(ACTIVE_STATE_CLASS);\n\n that.element.on(\"down\", \"a\", \"_release\");\n },\n\n events: [\n SELECT\n ],\n\n switchTo: function(url) {\n var tabs = this.element.find('a'),\n tab,\n path,\n idx = 0,\n length = tabs.length;\n\n if (isNaN(url)) {\n for (; idx < length; idx ++) {\n tab = tabs[idx];\n path = tab.href.replace(/(\\#.+)(\\?.+)$/, \"$1\"); // remove the fragment query string - http://www.foo.com?foo#bar**?baz=qux**\n\n if (path.indexOf(url, path.length - url.length) !== -1) {\n this._setActiveItem($(tab));\n return true;\n }\n }\n } else {\n this._setActiveItem(tabs.eq(url));\n return true;\n }\n\n return false;\n },\n\n switchByFullUrl: function(url) {\n var tab;\n\n tab = this.element.find(\"a[href$='\" + url + \"']\");\n this._setActiveItem(tab);\n },\n\n clear: function() {\n this.currentItem().removeClass(ACTIVE_STATE_CLASS);\n },\n\n currentItem: function() {\n return this.element.children(\".\" + ACTIVE_STATE_CLASS);\n },\n\n badge: function(item, value) {\n var tabstrip = this.element, badge;\n\n if (!isNaN(item)) {\n item = tabstrip.children().get(item);\n }\n\n item = tabstrip.find(item);\n badge = $(item.find(\".km-badge\")[0] || createBadge(value).insertAfter(item.children(\".km-icon\")));\n\n if (value || value === 0) {\n badge.html(value);\n return this;\n }\n\n if (value === false) {\n badge.empty().remove();\n return this;\n }\n\n return badge.html();\n },\n\n _release: function(e) {\n if (e.which > 1) {\n return;\n }\n\n var that = this,\n item = $(e.currentTarget);\n\n if (item[0] === that.currentItem()[0]) {\n return;\n }\n\n if (that.trigger(SELECT, { item: item })) {\n e.preventDefault();\n } else {\n that._setActiveItem(item);\n }\n },\n\n _setActiveItem: function(item) {\n if (!item[0]) {\n return;\n }\n this.clear();\n item.addClass(ACTIVE_STATE_CLASS);\n },\n\n _buildButton: function() {\n var button = $(this),\n icon = kendo.attrValue(button, \"icon\"),\n badge = kendo.attrValue(button, \"badge\"),\n image = button.find(\"img\"),\n iconSpan = $('');\n\n button\n .addClass(\"km-button\")\n .attr(kendo.attr(\"role\"), \"tab\")\n .contents().not(image)\n .wrapAll('');\n\n if (image[0]) {\n image.addClass(\"km-image\").prependTo(button);\n } else {\n button.prepend(iconSpan);\n if (icon) {\n iconSpan.addClass(\"km-\" + icon);\n if (badge || badge === 0) {\n createBadge(badge).insertAfter(iconSpan);\n }\n }\n }\n },\n\n refresh: function(e) {\n var url = e.view.id;\n\n if (url && !this.switchTo(e.view.id)) {\n this.switchTo(url);\n }\n },\n\n options: {\n name: \"TabStrip\",\n selectedIndex: 0,\n enable: true\n }\n });\n\n ui.plugin(TabStrip);\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.angular',[ \"kendo.core\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"angular\",\n name: \"AngularJS Directives\",\n category: \"framework\",\n description: \"Adds Kendo UI for AngularJS directives\",\n depends: [ \"core\" ],\n defer: true\n};\n\n(function($, angular, undefined) {\n \"use strict\";\n\n // Angular2 exposes a global angular object, but it does not have an injector...\n if (!angular || !angular.injector) {\n return;\n }\n\n\n var module = angular.module('kendo.directives', []),\n $injector = angular.injector(['ng']),\n $parse = $injector.get('$parse'),\n $timeout = $injector.get('$timeout'),\n $defaultCompile,\n $log = $injector.get('$log');\n\n function withoutTimeout(f) {\n var save = $timeout;\n try {\n $timeout = function(f) { return f(); };\n return f();\n } finally {\n $timeout = save;\n }\n }\n\n var OPTIONS_NOW;\n\n var createDataSource = (function() {\n var types = {\n TreeList: 'TreeListDataSource',\n TreeView: 'HierarchicalDataSource',\n Scheduler: 'SchedulerDataSource',\n PivotGrid: 'PivotDataSource',\n PivotConfigurator: 'PivotDataSource',\n PanelBar: 'HierarchicalDataSource',\n Menu: \"$PLAIN\",\n ContextMenu: \"$PLAIN\"\n };\n var toDataSource = function(dataSource, type) {\n if (type == '$PLAIN') {\n return dataSource;\n }\n return kendo.data[type].create(dataSource);\n };\n return function(scope, element, role, source) {\n var type = types[role] || 'DataSource';\n var current = scope.$eval(source);\n var ds = toDataSource(current, type);\n\n scope.$watch(source, function(mew) {\n var widget = kendoWidgetInstance(element);\n\n if (widget && typeof widget.setDataSource == \"function\") {\n if (mew !== current && mew !== widget.dataSource) {\n var ds = toDataSource(mew, type);\n widget.setDataSource(ds);\n current = mew;\n }\n }\n });\n return ds;\n };\n }());\n\n var ignoredAttributes = {\n kDataSource: true,\n kOptions: true,\n kRebind: true,\n kNgModel: true,\n kNgDelay: true\n };\n\n var ignoredOwnProperties = {\n // XXX: other names to ignore here?\n name: true,\n title: true,\n style: true\n };\n\n function createWidget(scope, element, attrs, widget, origAttr, controllers) {\n\n if (!(element instanceof jQuery)) {\n throw new Error(\"The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.\");\n }\n\n var kNgDelay = attrs.kNgDelay,\n delayValue = scope.$eval(kNgDelay);\n\n controllers = controllers || [];\n\n var ngModel = controllers[0],\n ngForm = controllers[1];\n\n var ctor = $(element)[widget];\n\n if (!ctor) {\n window.console.error(\"Could not find: \" + widget);\n return null;\n }\n\n var parsed = parseOptions(scope, element, attrs, widget, ctor);\n\n var options = parsed.options;\n\n if (parsed.unresolved.length) {\n var promises = [];\n\n for (var i = 0, len = parsed.unresolved.length; i < len; i++) {\n\n var unresolved = parsed.unresolved[i];\n\n var promise = $.Deferred(function(d) {\n var unwatch = scope.$watch(unresolved.path, function(newValue) {\n if (newValue !== undefined) {\n unwatch();\n d.resolve();\n }\n });\n }).promise();\n\n promises.push(promise);\n }\n\n $.when.apply(null, promises).then(createIt);\n\n return;\n }\n\n if (kNgDelay && !delayValue) {\n var root = scope.$root || scope;\n\n var register = function() {\n var unregister = scope.$watch(kNgDelay, function(newValue) {\n if (newValue !== undefined) {\n unregister();\n // remove subsequent delays, to make ng-rebind work\n element.removeAttr(attrs.$attr.kNgDelay);\n kNgDelay = null;\n $timeout(createIt); // XXX: won't work without `timeout` ;-\\\n }\n });\n };\n\n // WARNING: the watchers should be registered in the digest cycle.\n // the fork here is for the timeout/non-timeout initiated widgets.\n if (/^\\$(digest|apply)$/.test(root.$$phase)) {\n register();\n } else {\n scope.$apply(register);\n }\n\n return;\n } else {\n return createIt();\n }\n\n function createIt() {\n var originalElement;\n\n if (attrs.kRebind) {\n originalElement = $($(element)[0].cloneNode(true));\n }\n\n // re-parse the options here.\n options = parseOptions(scope, element, attrs, widget, ctor).options;\n\n if (element.is(\"select\")) {\n (function(options) {\n if (options.length > 0) {\n var first = $(options[0]);\n if (!/\\S/.test(first.text()) && /^\\?/.test(first.val())) {\n first.remove();\n }\n\n for (var i = 0; i < options.length; i++) {\n $(options[i]).off(\"$destroy\");\n }\n }\n }(element[0].options));\n }\n\n var object = ctor.call(element, OPTIONS_NOW = options).data(widget);\n\n exposeWidget(object, scope, attrs, widget, origAttr);\n\n scope.$emit(\"kendoWidgetCreated\", object);\n\n var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);\n\n if (attrs.kRebind) {\n setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);\n }\n\n if (attrs.kNgDisabled) {\n var kNgDisabled = attrs.kNgDisabled;\n var isDisabled = scope.$eval(kNgDisabled);\n if (isDisabled) {\n object.enable(!isDisabled);\n }\n bindToKNgDisabled(object, scope, element, kNgDisabled);\n }\n\n if (attrs.kNgReadonly) {\n var kNgReadonly = attrs.kNgReadonly;\n var isReadonly = scope.$eval(kNgReadonly);\n if (isReadonly) {\n object.readonly(isReadonly);\n }\n bindToKNgReadonly(object, scope, element, kNgReadonly);\n }\n\n // kNgModel is used for the \"logical\" value\n if (attrs.kNgModel) {\n bindToKNgModel(object, scope, attrs.kNgModel);\n }\n\n // 2 way binding: ngModel <-> widget.value()\n if (ngModel) {\n bindToNgModel(object, scope, element, ngModel, ngForm);\n }\n\n if (object) {\n propagateClassToWidgetWrapper(object, element);\n }\n\n return object;\n }\n }\n\n\n function parseOptions(scope, element, attrs, widget, ctor) {\n var role = widget.replace(/^kendo/, '');\n var unresolved = [];\n var optionsPath = attrs.kOptions || attrs.options;\n var optionsValue = scope.$eval(optionsPath);\n\n if (optionsPath && optionsValue === undefined) {\n unresolved.push({ option: \"options\", path: optionsPath });\n }\n\n var options = angular.extend({}, attrs.defaultOptions, optionsValue);\n\n function addOption(name, value) {\n var scopeValue = angular.copy(scope.$eval(value));\n if (scopeValue === undefined) {\n unresolved.push({ option: name, path: value });\n } else {\n options[name] = scopeValue;\n }\n }\n\n\n var widgetOptions = ctor.widget.prototype.options;\n var widgetEvents = ctor.widget.prototype.events;\n\n\n $.each(attrs, function(name, value) {\n if (name === \"source\" || name === \"kDataSource\" || name === \"kScopeField\" || name === \"scopeField\") {\n return;\n }\n\n var dataName = \"data\" + name.charAt(0).toUpperCase() + name.slice(1);\n\n if (name.indexOf(\"on\") === 0) { // let's search for such event.\n var eventKey = name.replace(/^on./, function(prefix) {\n return prefix.charAt(2).toLowerCase();\n });\n\n if (widgetEvents.indexOf(eventKey) > -1) {\n options[eventKey] = value;\n }\n } // don't elsif here - there are on* options\n\n if (widgetOptions.hasOwnProperty(dataName)) {\n addOption(dataName, value);\n } else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {\n addOption(name, value);\n } else if (!ignoredAttributes[name]) {\n var match = name.match(/^k(On)?([A-Z].*)/);\n if (match) {\n var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);\n if (match[1] && name != \"kOnLabel\" // XXX: k-on-label can be used on MobileSwitch :-\\\n ) {\n options[optionName] = value;\n } else {\n if (name == \"kOnLabel\") {\n optionName = \"onLabel\"; // XXX: that's awful.\n }\n addOption(optionName, value);\n }\n }\n }\n });\n\n // parse the datasource attribute\n var dataSource = attrs.kDataSource || attrs.source;\n\n if (dataSource) {\n options.dataSource = createDataSource(scope, element, role, dataSource);\n }\n\n // deepExtend in kendo.core (used in Editor) will fail with stack\n // overflow if we don't put it in an array :-\\\n options.$angular = [ scope ];\n\n return {\n options: options,\n unresolved: unresolved\n };\n }\n\n function bindToKNgDisabled(widget, scope, element, kNgDisabled) {\n if ((kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar) || (kendo.ui.Menu && widget instanceof kendo.ui.Menu)) {\n $log.warn(\"k-ng-disabled specified on a widget that does not have the enable() method: \" + (widget.options.name));\n return;\n }\n scope.$watch(kNgDisabled, function(newValue, oldValue) {\n if (newValue != oldValue) {\n widget.enable(!newValue);\n }\n });\n }\n\n function bindToKNgReadonly(widget, scope, element, kNgReadonly) {\n if (typeof widget.readonly != \"function\") {\n $log.warn(\"k-ng-readonly specified on a widget that does not have the readonly() method: \" + (widget.options.name));\n return;\n }\n scope.$watch(kNgReadonly, function(newValue, oldValue) {\n if (newValue != oldValue) {\n widget.readonly(newValue);\n }\n });\n }\n\n function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {\n if (attrs[origAttr]) {\n var set = $parse(attrs[origAttr]).assign;\n if (set) {\n // set the value of the expression to the kendo widget object to expose its api\n set(scope, widget);\n } else {\n throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);\n }\n }\n }\n\n function formValue(element) {\n if (/checkbox|radio/i.test(element.attr(\"type\"))) {\n return element.prop(\"checked\");\n }\n return element.val();\n }\n\n var formRegExp = /^(input|select|textarea)$/i;\n\n function isForm(element) {\n return formRegExp.test(element[0].tagName);\n }\n\n function bindToNgModel(widget, scope, element, ngModel, ngForm) {\n if (!widget.value) {\n return;\n }\n\n var value;\n // Some widgets trigger \"change\" on the input field\n // and this would result in two events sent (#135)\n var haveChangeOnElement = false;\n\n if (isForm(element)) {\n value = function() {\n return formValue(element);\n };\n } else {\n value = function() {\n return widget.value();\n };\n }\n\n // Angular will invoke $render when the view needs to be updated with the view value.\n var viewRender = function() {\n // Update the widget with the view value.\n\n // delaying with setTimout for cases where the datasource is set thereafter.\n // https://github.com/kendo-labs/angular-kendo/issues/304\n var val = ngModel.$viewValue;\n if (val === undefined) {\n val = ngModel.$modelValue;\n }\n\n if (val === undefined) {\n val = null;\n }\n\n haveChangeOnElement = true;\n setTimeout(function() {\n haveChangeOnElement = false;\n if (widget) { // might have been destroyed in between. :-(\n var kNgModel = scope[widget.element.attr(\"k-ng-model\")];\n\n if (kNgModel) {\n val = kNgModel;\n }\n\n if (widget.options.autoBind === false && !widget.listView.bound()) {\n if (val) {\n widget.value(val);\n }\n } else {\n widget.value(val);\n }\n }\n }, 0);\n };\n\n ngModel.$render = viewRender;\n setTimeout(function() {\n if (ngModel.$render !== viewRender) {\n ngModel.$render = viewRender;\n ngModel.$render();\n }\n });\n\n if (isForm(element)) {\n element.on(\"change\", function() {\n haveChangeOnElement = true;\n });\n }\n\n var onChange = function(pristine) {\n return function() {\n var formPristine;\n if (haveChangeOnElement && !element.is(\"select\")) {\n return;\n }\n if (pristine && ngForm) {\n formPristine = ngForm.$pristine;\n }\n ngModel.$setViewValue(value());\n if (pristine) {\n ngModel.$setPristine();\n if (formPristine) {\n ngForm.$setPristine();\n }\n }\n digest(scope);\n };\n };\n\n widget.first(\"change\", onChange(false));\n widget.first(\"spin\", onChange(false));\n\n if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {\n widget.first(\"dataBound\", onChange(true));\n }\n\n var currentVal = value();\n\n // if the model value is undefined, then we set the widget value to match ( == null/undefined )\n // In telerik/kendo-ui-core#1027 we discovered that after the timeout the $viewValue arives as NaN in some weird, default form.\n // Hence the check below.\n if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {\n if (!ngModel.$isEmpty(ngModel.$viewValue)) {\n widget.value(ngModel.$viewValue);\n } else if (currentVal != null && currentVal !== \"\" && currentVal != ngModel.$viewValue) {\n ngModel.$setViewValue(currentVal);\n }\n }\n\n ngModel.$setPristine();\n }\n\n function bindToKNgModel(widget, scope, kNgModel) {\n if (kendo.ui.DateRangePicker && widget instanceof kendo.ui.DateRangePicker) {\n var rangePickerModels = kNgModel.split(\",\");\n var rangePickerStartModel = rangePickerModels[0].trim();\n var rangePickerEndModel;\n\n bindToKNgModel(widget._startDateInput, scope, rangePickerStartModel);\n if (rangePickerModels[1]) {\n rangePickerEndModel = rangePickerModels[1].trim();\n bindToKNgModel(widget._endDateInput, scope, rangePickerEndModel);\n widget.range({ start: scope[rangePickerStartModel], end: scope[rangePickerEndModel] });\n } else {\n widget.range({ start: scope[rangePickerStartModel], end: null });\n }\n\n return;\n }\n\n if (typeof widget.value != \"function\") {\n $log.warn(\"k-ng-model specified on a widget that does not have the value() method: \" + (widget.options.name));\n return;\n }\n\n var form = $(widget.element).parents(\"ng-form, form\").first();\n var ngForm = kendo.getter(form.attr(\"name\"), true)(scope);\n var getter = $parse(kNgModel);\n var setter = getter.assign;\n var updating = false;\n\n var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect ||\n kendo.ui.RangeSlider && widget instanceof kendo.ui.RangeSlider;\n\n var length = function(value) {\n //length is irrelevant when value is not collection\n return value && valueIsCollection ? value.length : 0;\n };\n\n var currentValueLength = length(getter(scope));\n\n widget.$angular_setLogicValue(getter(scope));\n\n // keep in sync\n var watchHandler = function(newValue, oldValue) {\n if (newValue === undefined) {\n // because widget's value() method usually checks if the new value is undefined,\n // in which case it returns the current value rather than clearing the field.\n // https://github.com/telerik/kendo-ui-core/issues/299\n newValue = null;\n }\n\n //compare values by reference if a collection\n if (updating || (newValue == oldValue && length(newValue) == currentValueLength)) {\n return;\n }\n\n currentValueLength = length(newValue);\n widget.$angular_setLogicValue(newValue);\n };\n\n if (valueIsCollection) {\n scope.$watchCollection(kNgModel, watchHandler);\n } else {\n scope.$watch(kNgModel, watchHandler);\n }\n\n var changeHandler = function() {\n updating = true;\n\n if (ngForm && ngForm.$pristine) {\n ngForm.$setDirty();\n }\n\n digest(scope, function() {\n setter(scope, widget.$angular_getLogicValue());\n currentValueLength = length(getter(scope));\n });\n\n updating = false;\n };\n\n widget.first(\"change\", changeHandler);\n widget.first(\"spin\", changeHandler);\n }\n\n function destroyWidgetOnScopeDestroy(scope, widget) {\n var deregister = scope.$on(\"$destroy\", function() {\n deregister();\n if (widget) {\n kendo.destroy(widget.element);\n widget = null;\n }\n });\n\n return deregister;\n }\n\n // mutation observers - propagate the original\n // element's class to the widget wrapper.\n function propagateClassToWidgetWrapper(widget, element) {\n if (!(window.MutationObserver && widget.wrapper)) {\n return;\n }\n\n var prevClassList = [].slice.call($(element)[0].classList);\n\n var mo = new MutationObserver(function(changes) {\n suspend(); // make sure we don't trigger a loop\n if (!widget) {\n return;\n }\n\n changes.forEach(function(chg) {\n var w = $(widget.wrapper)[0];\n switch (chg.attributeName) {\n\n case \"class\":\n // sync classes to the wrapper element\n var currClassList = [].slice.call(chg.target.classList);\n currClassList.forEach(function(cls) {\n if (prevClassList.indexOf(cls) < 0) {\n w.classList.add(cls);\n if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) { // https://github.com/kendo-labs/angular-kendo/issues/356\n widget.input[0].classList.add(cls);\n }\n }\n });\n prevClassList.forEach(function(cls) {\n if (currClassList.indexOf(cls) < 0) {\n w.classList.remove(cls);\n if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) { // https://github.com/kendo-labs/angular-kendo/issues/356\n widget.input[0].classList.remove(cls);\n }\n }\n });\n prevClassList = currClassList;\n break;\n\n case \"disabled\":\n if (typeof widget.enable == \"function\" && !widget.element.attr(\"readonly\")) {\n widget.enable(!$(chg.target).attr(\"disabled\"));\n }\n break;\n\n case \"readonly\":\n if (typeof widget.readonly == \"function\" && !widget.element.attr(\"disabled\")) {\n widget.readonly(!!$(chg.target).attr(\"readonly\"));\n }\n break;\n }\n });\n\n resume();\n });\n\n function suspend() {\n mo.disconnect();\n }\n\n function resume() {\n mo.observe($(element)[0], { attributes: true });\n }\n\n resume();\n widget.first(\"destroy\", suspend);\n }\n\n function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {\n // watch for changes on the expression passed in the k-rebind attribute\n var unregister = scope.$watch(rebindAttr, function(newValue, oldValue) {\n if (!widget._muteRebind && newValue !== oldValue) {\n unregister(); // this watcher will be re-added if we compile again!\n\n if (attrs._cleanUp) {\n attrs._cleanUp();\n }\n\n var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];\n\n if (templateOptions) {\n templateOptions.forEach(function(name) {\n var templateContents = scope.$eval(attrs[\"k\" + name]);\n\n if (templateContents) {\n originalElement.append($(templateContents).attr(kendo.toHyphens(\"k\" + name), \"\"));\n }\n });\n }\n\n var _wrapper = $(widget.wrapper)[0];\n var _element = $(widget.element)[0];\n var isUpload = widget.options.name === \"Upload\";\n\n if (isUpload) {\n element = $(_element);\n }\n\n var compile = element.injector().get(\"$compile\");\n widget._destroy();\n\n if (destroyRegister) {\n destroyRegister();\n }\n\n widget = null;\n\n if (_element) {\n if (_wrapper) {\n _wrapper.parentNode.replaceChild(_element, _wrapper);\n }\n $(element).replaceWith(originalElement);\n }\n\n compile(originalElement)(scope);\n }\n }, true); // watch for object equality. Use native or simple values.\n digest(scope);\n }\n\n function bind(f, obj) {\n return function(a, b) {\n return f.call(obj, a, b);\n };\n }\n\n function setTemplate(key, value) {\n this[key] = kendo.stringify(value);\n }\n\n module.factory('directiveFactory', [ '$compile', function(compile) {\n var kendoRenderedTimeout;\n var RENDERED = false;\n\n // caching $compile for the dirty hack upstairs. This is awful, but we happen to have elements outside of the bootstrapped root :(.\n $defaultCompile = compile;\n\n var create = function(role, origAttr) {\n return {\n // Parse the directive for attributes and classes\n restrict: \"AC\",\n require: [ \"?ngModel\", \"^?form\" ],\n scope: false,\n\n controller: [ '$scope', '$attrs', '$element', function($scope, $attrs) {\n this.template = bind(setTemplate, $attrs);\n $attrs._cleanUp = bind(function() {\n this.template = null;\n $attrs._cleanUp = null;\n }, this);\n }],\n\n link: function(scope, element, attrs, controllers) {\n var $element = $(element);\n\n // we must remove data-kendo-widget-name attribute because\n // it breaks kendo.widgetInstance; can generate all kinds\n // of funny issues like\n //\n // https://github.com/kendo-labs/angular-kendo/issues/167\n //\n // but we still keep the attribute without the\n // `data-` prefix, so k-rebind would work.\n var roleattr = role.replace(/([A-Z])/g, \"-$1\");\n\n $element.attr(roleattr, $element.attr(\"data-\" + roleattr));\n $element[0].removeAttribute(\"data-\" + roleattr);\n\n var widget = createWidget(scope, element, attrs, role, origAttr, controllers);\n\n if (!widget) {\n return;\n }\n\n if (kendoRenderedTimeout) {\n clearTimeout(kendoRenderedTimeout);\n }\n\n kendoRenderedTimeout = setTimeout(function() {\n scope.$emit(\"kendoRendered\");\n if (!RENDERED) {\n RENDERED = true;\n $(\"form\").each(function() {\n var form = $(this).controller(\"form\");\n if (form) {\n form.$setPristine();\n }\n });\n }\n });\n }\n };\n };\n\n return {\n create: create\n };\n }]);\n\n var TAGNAMES = {\n Editor: \"textarea\",\n NumericTextBox: \"input\",\n DatePicker: \"input\",\n DateTimePicker: \"input\",\n TimePicker: \"input\",\n AutoComplete: \"input\",\n ColorPicker: \"input\",\n MaskedTextBox: \"input\",\n MultiSelect: \"input\",\n Upload: \"input\",\n Validator: \"form\",\n Button: \"button\",\n MobileButton: \"a\",\n MobileBackButton: \"a\",\n MobileDetailButton: \"a\",\n ListView: \"ul\",\n MobileListView: \"ul\",\n ScrollView: \"div\",\n PanelBar: \"ul\",\n TreeView: \"ul\",\n Menu: \"ul\",\n ContextMenu: \"ul\",\n ActionSheet: \"ul\",\n Switch: \"input\"\n };\n\n var SKIP_SHORTCUTS = [\n 'MobileView',\n 'MobileDrawer',\n 'MobileLayout',\n 'MobileSplitView',\n 'MobilePane',\n 'MobileModalView'\n ];\n\n var MANUAL_DIRECTIVES = [\n 'MobileApplication',\n 'MobileView',\n 'MobileModalView',\n 'MobileLayout',\n 'MobileActionSheet',\n 'MobileDrawer',\n 'MobileSplitView',\n 'MobilePane',\n 'MobileScrollView',\n 'MobilePopOver'\n ];\n\n angular.forEach(['MobileNavBar', 'MobileButton', 'MobileBackButton', 'MobileDetailButton', 'MobileTabStrip', 'MobileScrollView', 'MobileScroller'], function(widget) {\n MANUAL_DIRECTIVES.push(widget);\n widget = \"kendo\" + widget;\n module.directive(widget, function() {\n return {\n restrict: \"A\",\n link: function(scope, element, attrs) {\n createWidget(scope, element, attrs, widget, widget);\n }\n };\n });\n });\n\n function createDirectives(klass, isMobile) {\n function make(directiveName, widgetName) {\n module.directive(directiveName, [\n \"directiveFactory\",\n function(directiveFactory) {\n return directiveFactory.create(widgetName, directiveName);\n }\n ]);\n }\n\n var name = isMobile ? \"Mobile\" : \"\";\n name += klass.fn.options.name;\n\n var className = name;\n var shortcut = \"kendo\" + name.charAt(0) + name.substr(1).toLowerCase();\n name = \"kendo\" + name;\n\n // -type directives\n var dashed = name.replace(/([A-Z])/g, \"-$1\");\n\n if (SKIP_SHORTCUTS.indexOf(name.replace(\"kendo\", \"\")) == -1) {\n var names = name === shortcut ? [ name ] : [ name, shortcut ];\n angular.forEach(names, function(directiveName) {\n module.directive(directiveName, function() {\n return {\n restrict: \"E\",\n replace: true,\n template: function(element, attributes) {\n var tag = TAGNAMES[className] || \"div\";\n var scopeField = attributes.kScopeField || attributes.scopeField;\n\n return \"<\" + tag + \" \" + dashed + (scopeField ? ('=\"' + scopeField + '\"') : \"\") + \">\" + element.html() + \"\";\n }\n };\n });\n });\n }\n\n if (MANUAL_DIRECTIVES.indexOf(name.replace(\"kendo\", \"\")) > -1) {\n return;\n }\n\n // here name should be like kendoMobileListView so kendo-mobile-list-view works,\n // and shortcut like kendoMobilelistview, for kendo-mobilelistview\n\n make(name, name);\n if (shortcut != name) {\n make(shortcut, name);\n }\n\n }\n\n /* -----[ utils ]----- */\n\n function kendoWidgetInstance(el) {\n el = $(el);\n return kendo.widgetInstance(el, kendo.ui) ||\n kendo.widgetInstance(el, kendo.mobile.ui) ||\n kendo.widgetInstance(el, kendo.dataviz.ui);\n }\n\n function digest(scope, func) {\n var root = scope.$root || scope;\n var isDigesting = /^\\$(digest|apply)$/.test(root.$$phase);\n if (func) {\n if (isDigesting) {\n func();\n } else {\n root.$apply(func);\n }\n } else if (!isDigesting) {\n root.$digest();\n }\n }\n\n function destroyScope(scope, el) {\n scope.$destroy();\n if (el) {\n // prevent leaks. https://github.com/kendo-labs/angular-kendo/issues/237\n $(el)\n .removeData(\"$scope\")\n .removeData(\"$$kendoScope\")\n .removeData(\"$isolateScope\")\n .removeData(\"$isolateScopeNoTemplate\")\n .removeClass(\"ng-scope\");\n }\n }\n\n var encode = kendo.htmlEncode;\n var open = /{{/g;\n var close = /}}/g;\n var encOpen = '{​{';\n var encClose = '}​}';\n\n kendo.htmlEncode = function(str) {\n return encode(str)\n .replace(open, encOpen)\n .replace(close, encClose);\n };\n\n var pendingPatches = [];\n\n // defadvice will patch a class' method with another function. That\n // function will be called in a context containing `next` (to call\n // the next method) and `object` (a reference to the original\n // object).\n function defadvice(klass, methodName, func) {\n if (Array.isArray(klass)) {\n return angular.forEach(klass, function(klass) {\n defadvice(klass, methodName, func);\n });\n }\n if (typeof klass == \"string\") {\n var a = klass.split(\".\");\n var x = kendo;\n while (x && a.length > 0) {\n x = x[a.shift()];\n }\n if (!x) {\n pendingPatches.push([ klass, methodName, func ]);\n return false;\n }\n klass = x.prototype;\n }\n var origMethod = klass[methodName];\n klass[methodName] = function() {\n var self = this, args = arguments;\n return func.apply({\n self: self,\n next: function() {\n return origMethod.apply(self, arguments.length > 0 ? arguments : args);\n }\n }, args);\n };\n return true;\n }\n\n kendo.onWidgetRegistered(function(entry) {\n pendingPatches = $.grep(pendingPatches, function(args) {\n return !defadvice.apply(null, args);\n });\n createDirectives(entry.widget, entry.prefix == \"Mobile\");\n });\n\n /* -----[ Customize widgets for Angular ]----- */\n\n defadvice([ \"ui.Widget\", \"mobile.ui.Widget\" ], \"angular\", function(cmd, arg) {\n var self = this.self;\n if (cmd == \"init\") {\n // `arg` here should be the widget options.\n // the Chart doesn't send the options to Widget::init in constructor\n // hence the OPTIONS_NOW hack (initialized in createWidget).\n if (!arg && OPTIONS_NOW) {\n arg = OPTIONS_NOW;\n }\n OPTIONS_NOW = null;\n if (arg && arg.$angular) {\n self.$angular_scope = arg.$angular[0];\n self.$angular_init(self.element, arg);\n }\n return;\n }\n\n var scope = self.$angular_scope;\n\n if (scope) {\n withoutTimeout(function() {\n var x = arg(), elements = x.elements, data = x.data;\n if (elements.length > 0) {\n switch (cmd) {\n\n case \"cleanup\":\n angular.forEach(elements, function(el) {\n var itemScope = $(el).data(\"$$kendoScope\");\n\n if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {\n destroyScope(itemScope, el);\n }\n });\n break;\n\n case \"compile\":\n var injector = self.element.injector();\n var compile = injector ? injector.get(\"$compile\") : $defaultCompile;\n\n angular.forEach(elements, function(el, i) {\n var itemScope;\n if (x.scopeFrom) {\n itemScope = x.scopeFrom;\n } else {\n var vars = data && data[i];\n if (vars !== undefined) {\n itemScope = $.extend(scope.$new(), vars);\n itemScope.$$kendoScope = true;\n } else {\n itemScope = scope;\n }\n }\n\n $(el).data(\"$$kendoScope\", itemScope);\n compile(el)(itemScope);\n });\n digest(scope);\n break;\n }\n }\n });\n }\n });\n\n defadvice(\"ui.Widget\", \"$angular_getLogicValue\", function() {\n return this.self.value();\n });\n\n defadvice(\"ui.Widget\", \"$angular_setLogicValue\", function(val) {\n this.self.value(val);\n });\n\n defadvice(\"ui.Select\", \"$angular_getLogicValue\", function() {\n var item = this.self.dataItem(),\n valueField = this.self.options.dataValueField;\n\n if (item) {\n if (this.self.options.valuePrimitive) {\n if (!!valueField) {\n return item[valueField];\n } else {\n return item;\n }\n } else {\n return item.toJSON();\n }\n } else {\n return null;\n }\n });\n\n defadvice(\"ui.Select\", \"$angular_setLogicValue\", function(val) {\n var self = this.self;\n var options = self.options;\n var valueField = options.dataValueField;\n var text = options.text || \"\";\n\n if (val === undefined) {\n val = \"\";\n }\n\n if (valueField && !options.valuePrimitive && val) {\n text = val[options.dataTextField] || \"\";\n val = val[valueField || options.dataTextField];\n }\n\n if (self.options.autoBind === false && !self.listView.bound()) {\n if (!text && val && options.valuePrimitive) {\n self.value(val);\n } else {\n self._preselect(val, text);\n }\n } else {\n self.value(val);\n }\n });\n\n defadvice(\"ui.MultiSelect\", \"$angular_getLogicValue\", function() {\n var value = this.self.dataItems().slice(0);\n var valueField = this.self.options.dataValueField;\n\n if (valueField && this.self.options.valuePrimitive) {\n value = $.map(value, function(item) {\n return item[valueField];\n });\n }\n\n return value;\n });\n\n defadvice(\"ui.MultiSelect\", \"$angular_setLogicValue\", function(val) {\n if (val == null) {\n val = [];\n }\n\n var self = this.self;\n var options = self.options;\n var valueField = options.dataValueField;\n var data = val;\n\n if (valueField && !options.valuePrimitive) {\n val = $.map(val, function(item) {\n return item[valueField];\n });\n }\n\n if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {\n self._preselect(data, val);\n } else {\n self.value(val);\n }\n });\n\n /* AutoComplete's getter and setter are removed!\n By design, AutoComplete should be bound only to primitive string\n value and data items are bound only to serve the list of suggestions.\n\n Binding multiple data items is supported by the MultiSelect widget.\n */\n\n // All event handlers that are strings are compiled the Angular way.\n defadvice(\"ui.Widget\", \"$angular_init\", function(element, options) {\n var self = this.self;\n if (options && !Array.isArray(options)) {\n var scope = self.$angular_scope;\n for (var i = self.events.length; --i >= 0;) {\n var event = self.events[i];\n var handler = options[event];\n if (handler && typeof handler == \"string\") {\n options[event] = self.$angular_makeEventHandler(event, scope, handler);\n }\n }\n }\n });\n\n // most handers will only contain a kendoEvent in the scope.\n defadvice(\"ui.Widget\", \"$angular_makeEventHandler\", function(event, scope, handler) {\n handler = $parse(handler);\n return function(e) {\n digest(scope, function() {\n handler(scope, { kendoEvent: e });\n });\n };\n });\n\n // for the Grid and ListView we add `data` and `selected` too.\n defadvice([ \"ui.Grid\", \"ui.ListView\", \"ui.TreeView\", \"ui.PanelBar\" ], \"$angular_makeEventHandler\", function(event, scope, handler) {\n if (event != \"change\") {\n return this.next();\n }\n handler = $parse(handler);\n return function(ev) {\n var widget = ev.sender;\n var options = widget.options;\n var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;\n\n if (angular.isString(options.selectable)) {\n cell = options.selectable.indexOf('cell') !== -1;\n multiple = options.selectable.indexOf('multiple') !== -1;\n }\n if (widget._checkBoxSelection) {\n multiple = true;\n }\n\n elems = locals.selected = this.select();\n items = locals.data = [];\n columns = locals.columns = [];\n for (var i = 0; i < elems.length; i++) {\n var item = cell ? elems[i].parentNode : elems[i];\n var dataItem = widget.dataItem(item);\n if (cell) {\n if (angular.element.inArray(dataItem, items) < 0) {\n items.push(dataItem);\n }\n colIdx = angular.element(elems[i]).index();\n if (angular.element.inArray(colIdx, columns) < 0 ) {\n columns.push(colIdx);\n }\n } else {\n items.push(dataItem);\n }\n }\n\n if (!multiple) {\n locals.dataItem = locals.data = items[0];\n locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);\n locals.selected = elems[0];\n }\n\n digest(scope, function() {\n handler(scope, locals);\n });\n };\n });\n\n // If no `template` is supplied for Grid columns, provide an Angular\n // template. The reason is that in this way AngularJS will take\n // care to update the view as the data in scope changes.\n defadvice(\"ui.Grid\", \"$angular_init\", function(element, options) {\n this.next();\n if (options.columns) {\n var settings = $.extend({}, kendo.Template, options.templateSettings);\n angular.forEach(options.columns, function(col) {\n if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined || col.encoded)) {\n col.template = \"#: \" +\n kendo.expr(col.field, settings.paramName) + \"#\";\n }\n });\n }\n });\n\n {\n // mobile/ButtonGroup does not have a \"value\" method, but looks\n // like it would be useful. We provide it here.\n\n defadvice(\"mobile.ui.ButtonGroup\", \"value\", function(mew) {\n var self = this.self;\n if (mew != null) {\n self.select(self.element.children(\"li.km-button\").eq(mew));\n self.trigger(\"change\");\n self.trigger(\"select\", { index: self.selectedIndex });\n }\n return self.selectedIndex;\n });\n\n defadvice(\"mobile.ui.ButtonGroup\", \"_select\", function() {\n this.next();\n this.self.trigger(\"change\");\n });\n }\n\n // mobile directives\n module\n .directive('kendoMobileApplication', function() {\n return {\n terminal: true,\n link: function(scope, element, attrs) {\n createWidget(scope, element, attrs, 'kendoMobileApplication', 'kendoMobileApplication');\n }\n };\n }).directive('kendoMobileView', function() {\n return {\n scope: true,\n link: {\n pre: function(scope, element, attrs) {\n attrs.defaultOptions = scope.viewOptions;\n attrs._instance = createWidget(scope, element, attrs, 'kendoMobileView', 'kendoMobileView');\n },\n\n post: function(scope, element, attrs) {\n attrs._instance._layout();\n attrs._instance._scroller();\n }\n }\n };\n }).directive('kendoMobileDrawer', function() {\n return {\n scope: true,\n link: {\n pre: function(scope, element, attrs) {\n attrs.defaultOptions = scope.viewOptions;\n attrs._instance = createWidget(scope, element, attrs, 'kendoMobileDrawer', 'kendoMobileDrawer');\n },\n\n post: function(scope, element, attrs) {\n attrs._instance._layout();\n attrs._instance._scroller();\n }\n }\n };\n }).directive('kendoMobileModalView', function() {\n return {\n scope: true,\n link: {\n pre: function(scope, element, attrs) {\n attrs.defaultOptions = scope.viewOptions;\n attrs._instance = createWidget(scope, element, attrs, 'kendoMobileModalView', 'kendoMobileModalView');\n },\n\n post: function(scope, element, attrs) {\n attrs._instance._layout();\n attrs._instance._scroller();\n }\n }\n };\n }).directive('kendoMobileSplitView', function() {\n return {\n terminal: true,\n link: {\n pre: function(scope, element, attrs) {\n attrs.defaultOptions = scope.viewOptions;\n attrs._instance = createWidget(scope, element, attrs, 'kendoMobileSplitView', 'kendoMobileSplitView');\n },\n\n post: function(scope, element, attrs) {\n attrs._instance._layout();\n }\n }\n };\n }).directive('kendoMobilePane', function() {\n return {\n terminal: true,\n link: {\n pre: function(scope, element, attrs) {\n attrs.defaultOptions = scope.viewOptions;\n createWidget(scope, element, attrs, 'kendoMobilePane', 'kendoMobilePane');\n }\n }\n };\n }).directive('kendoMobileLayout', function() {\n return {\n link: {\n pre: function(scope, element, attrs) {\n createWidget(scope, element, attrs, 'kendoMobileLayout', 'kendoMobileLayout');\n }\n }\n };\n }).directive('kendoMobileActionSheet', function() {\n return {\n restrict: \"A\",\n link: function(scope, element, attrs) {\n element.find(\"a[k-action]\").each(function() {\n $(this).attr(\"data-\" + kendo.ns + \"action\", $(this).attr(\"k-action\"));\n });\n\n createWidget(scope, element, attrs, 'kendoMobileActionSheet', 'kendoMobileActionSheet');\n }\n };\n }).directive('kendoMobilePopOver', function() {\n return {\n terminal: true,\n link: {\n pre: function(scope, element, attrs) {\n attrs.defaultOptions = scope.viewOptions;\n createWidget(scope, element, attrs, 'kendoMobilePopOver', 'kendoMobilePopOver');\n }\n }\n };\n }).directive('kendoViewTitle', function() {\n return {\n restrict: \"E\",\n replace: true,\n template: function(element) {\n return \"\" + element.html() + \"\";\n }\n };\n }).directive('kendoMobileHeader', function() {\n return {\n restrict: \"E\",\n link: function(scope, element) {\n element.addClass(\"km-header\").attr(\"data-role\", \"header\");\n }\n };\n }).directive('kendoMobileFooter', function() {\n return {\n restrict: 'E',\n link: function(scope, element) {\n element.addClass(\"km-footer\").attr(\"data-role\", \"footer\");\n }\n };\n }).directive('kendoMobileScrollViewPage', function() {\n return {\n restrict: \"E\",\n replace: true,\n template: function(element) {\n return \"
      \" + element.html() + \"
      \";\n }\n };\n });\n\n angular.forEach(['align', 'icon', 'rel', 'transition', 'actionsheetContext'], function(attr) {\n var kAttr = \"k\" + attr.slice(0, 1).toUpperCase() + attr.slice(1);\n\n module.directive(kAttr, function() {\n return {\n restrict: 'A',\n priority: 2,\n link: function(scope, element, attrs) {\n element.attr(kendo.attr(kendo.toHyphens(attr)), scope.$eval(attrs[kAttr]));\n }\n };\n });\n });\n\n var WIDGET_TEMPLATE_OPTIONS = {\n \"TreeMap\": [ \"Template\" ],\n \"MobileListView\": [ \"HeaderTemplate\", \"Template\" ],\n \"MobileScrollView\": [ \"EmptyTemplate\", \"Template\" ],\n \"Grid\": [ \"AltRowTemplate\", \"DetailTemplate\", \"RowTemplate\" ],\n \"ListView\": [ \"EditTemplate\", \"Template\", \"AltTemplate\" ],\n \"Pager\": [ \"SelectTemplate\", \"LinkTemplate\" ],\n \"PivotGrid\": [ \"ColumnHeaderTemplate\", \"DataCellTemplate\", \"RowHeaderTemplate\" ],\n \"Scheduler\": [\"AllDayEventTemplate\", \"DateHeaderTemplate\", \"EventTemplate\", \"MajorTimeHeaderTemplate\", \"MinorTimeHeaderTemplate\"],\n \"ScrollView\": [ \"Template\" ],\n \"PanelBar\": [ \"Template\" ],\n \"TreeView\": [ \"Template\" ],\n \"Validator\": [ \"ErrorTemplate\" ]\n };\n\n (function() {\n var templateDirectives = {};\n angular.forEach(WIDGET_TEMPLATE_OPTIONS, function(templates, widget) {\n angular.forEach(templates, function(template) {\n if (!templateDirectives[template]) {\n templateDirectives[template] = [ ];\n }\n templateDirectives[template].push(\"?^^kendo\" + widget);\n });\n });\n\n angular.forEach(templateDirectives, function(parents, directive) {\n var templateName = \"k\" + directive;\n var attrName = kendo.toHyphens(templateName);\n\n module.directive(templateName, function() {\n return {\n restrict: \"A\",\n require: parents,\n terminal: true,\n compile: function($element, $attrs) {\n if ($attrs[templateName] !== \"\") {\n return;\n }\n\n $element.removeAttr(attrName);\n var template = $element[0].outerHTML;\n\n return function(scope, element, attrs, controllers) {\n var controller;\n\n while (!controller && controllers.length) {\n controller = controllers.shift();\n }\n\n if (!controller) {\n $log.warn(attrName + \" without a matching parent widget found. It can be one of the following: \" + parents.join(\", \"));\n } else {\n controller.template(templateName, template);\n element.remove();\n }\n };\n }\n };\n });\n });\n\n })();\n\n\n})(window.kendo.jQuery, window.angular);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n(function(f, define) {\n define('kendo.mobile',[\n \"kendo.core\",\n \"kendo.fx\",\n \"kendo.data.odata\",\n \"kendo.data.xml\",\n \"kendo.data\",\n \"kendo.data.signalr\",\n \"kendo.binder\",\n \"kendo.validator\",\n \"kendo.router\",\n \"kendo.view\",\n \"kendo.userevents\",\n \"kendo.draganddrop\",\n \"kendo.popup\",\n \"kendo.touch\",\n \"kendo.mobile.popover\",\n \"kendo.mobile.loader\",\n \"kendo.mobile.scroller\",\n \"kendo.mobile.shim\",\n \"kendo.mobile.view\",\n \"kendo.mobile.modalview\",\n \"kendo.mobile.drawer\",\n \"kendo.mobile.splitview\",\n \"kendo.mobile.pane\",\n \"kendo.mobile.application\",\n \"kendo.mobile.actionsheet\",\n \"kendo.mobile.button\",\n \"kendo.mobile.buttongroup\",\n \"kendo.mobile.collapsible\",\n \"kendo.mobile.listview\",\n \"kendo.mobile.navbar\",\n \"kendo.mobile.scrollview\",\n \"kendo.mobile.switch\",\n \"kendo.mobile.tabstrip\",\n \"kendo.angular\"\n ], f);\n})(function() {\n \"bundle all\";\n return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","packageMetadata","productName","productCodes","publishDate","version","licensingDocsUrl","$","jQuery","window","undefined","kendo","cultures","extend","each","isArray","Array","noop","math","Math","Template","JSON","support","percentRegExp","formatRegExp","boxShadowRegExp","numberRegExp","FUNCTION","STRING","NUMBER","OBJECT","NULL","BOOLEAN","UNDEFINED","PREFIX","ARIA_LABELLEDBY","ARIA_LABEL","LABELIDPART","getterCache","setterCache","slice","cssPropertiesNames","noDepricateExtend","src","copyIsArray","copy","options","clone","target","arguments","i","length","deep","this","isPlainObject","Class","replace","proto","base","member","that","subclass","init","apply","fn","prototype","constructor","Object","_initOptions","deepExtend","isFunction","preventDefault","_defaultPrevented","isDefaultPrevented","Observable","_events","bind","eventName","handlers","one","idx","eventNames","original","handler","handlersIsFunction","events","unbind","push","first","unshift","trigger","e","sender","call","splice","compilePart","part","stringPart","split","join","charAt","rest","substring","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","zeros","pad","number","digits","end","paramName","useWithBlock","render","template","data","html","compile","settings","argumentName","match","functionBody","parts","Function","_slotCount","floor","Error","format","escapable","gap","indent","meta","\b","\t","\n","\f","\r","\"","\\","rep","toString","Date","toJSON","isFinite","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","String","Number","Boolean","quote","string","lastIndex","test","a","c","charCodeAt","str","key","holder","k","v","mind","partial","value","type","hasOwnProperty","stringify","replacer","space","","dateFormatRegExp","standardFormatRegExp","literalRegExp","commaRegExp","EMPTY","POINT","COMMA","SHARP","ZERO","PLACEHOLDER","EN","objectToString","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","minutes","result","sign","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","abs","formatNumber","decimal","precision","decimals","pattern","literals","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","negative","integer","fraction","integerLength","fractionLength","replacement","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","start","toLocaleString","exec","toLowerCase","currency","percent","exp","toExponential","round","groupInteger","indexOf","quoteChar","literal","lastIndexOf","rounded","max",",",".","groupSize","abbr","namesShort","d","D","F","g","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","groupSizes","shift","newGroupSize","reverse","toFixed","min","fmt","nonBreakingSpaceRegExp","values","index","placeholderFormat","parseInt","_extractFormat","_activeElement","document","activeElement","documentElement","_round","_outerWidth","element","includeMargin","outerWidth","_outerHeight","outerHeight","spaceRegExp","exponentRegExp","shortTimeZoneRegExp","longTimeZoneRegExp","dateRegExp","offsetRegExp","FORMATS_SEQUENCE","STANDARD_FORMATS","2","3","4","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","property","parseExact","strict","lookAhead","getNumber","size","rg","RegExp","substr","valueIdx","getIndexByName","lower","nameLength","matchLength","matchIdx","subValue","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","_lowerDays","_lowerMonths","parseFloat","isNaN","setFullYear","parseMicrosoftFormatOffset","offset","getDefaultFormats","cultureFormats","formatIdx","formats","concat","internalParseDate","tzoffset","timezone","convert","getShadows","shadow","css","transitions","radius","blur","left","right","bottom","wrap","autosize","percentage","parent","windowOuterWidth","removeClass","hasClass","width","style","height","percentWidth","percentHeight","forceWidth","is","addClass","attr","boxSizing","mozBoxSizing","webkitBoxSizing","wrapResize","wrapper","wrapperStyle","display","position","destination","deepExtendOne","source","ObservableArray","LazyObservableArray","DataSource","HierarchicalDataSource","propValue","propType","propInit","destProp","ArrayBuffer","HTMLElement","getTime","testRx","agent","rxs","dflt","rx","toHyphens","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","styles","computedStyle","defaultView","getComputedStyle","getPropertyValue","currentStyle","isScrollable","className","overflow","scrollLeft","webkit","browser","mozila","mozilla","browserVersion","el","isRtl","safari","scrollWidth","clientWidth","parseDate","parseExactDate","percentSymbol","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","table","tbodyInnerHtml","touch","docStyle","transforms","elementProto","hasHW3D","WebKitCSSMatrix","cssFlexbox","prefix","hasTransitions","lowPrefix","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","os","minorVersion","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","chrome","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","mobileOS","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","chromiumEdgeMatch","edge","opera","msie","documentMode","chromiumEdge","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","top","cssClass","docElement","eventCapture","addEventListener","input","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","b","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","selector","nodeList","querySelectorAll","parentNode","matchMedia","pushState","history","hashChange","customElements","mobileChrome","crios","obj","getOffset","positioned","pointers","msPointers","pageYOffset","pageXOffset","MSPointerEvent","PointerEvent","kineticScrollNeeded","directions","down","up","in","out","parseEffects","effects","fx","Element","prepareAnimationOptions","duration","complete","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","ampRegExp","ltRegExp","quoteRegExp","aposRegExp","gtRegExp","htmlEncode","unescape","decodeURIComponent","error","_","m1","m2","fromCharCode","eventTarget","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","on","mousedown","mouseup","mousemove","mousecancel","click","resize","wrapExpression","members","localUrlRe","Widget","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","ns","isLocalUrl","url","expr","expression","safe","getter","setter","accessor","get","set","guid","random","chars","roleSelector","role","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","validatePackage","angular","dataSource","props","componentTypes","componentType","defaults","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_clearCssClasses","_setEvents","_applyCssClasses","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","protoOptions","__proto__","prop","validFill","widgetName","cssProperties","propertyDictionary","_altname","getValidClass","widget","propName","fillMode","fill","_ariaLabel","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","labelId","_generateLabelId","newOptions","currentOptions","themeColor","label","DataBoundWidget","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","templateRegExp","domElement","offsetHeight","notify","jsonRegExp","jsonFormatRegExp","dashRegExp","parseOption","option","getAttribute","parseOptions","containmentComparer","contains","resizableWidget","inArray","initWidget","roles","fullPath","widgetKeyRegExp","nodeType","widgetKey","isEmptyObject","rolesFromNamespaces","namespaces","find","addBack","filter","widgetsArray","makeArray","widgetInstance","progress","container","mask","leftRight","webkitCorrection","containerScrollLeft","scrollTop","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","ContainerNullObject","nullObject","MobileWidget","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","pseudos","parents","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","elementData","editorToolbar","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","eventMap","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","getEventMap","eventRegEx","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","kendoJQuery","context","rootjQuery","animationFrame","pop","search","touchstart","touchend","keyDownCallBack","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","zoneRules","until","zoneAndRule","info","fromOffset","toOffset","tempToOffset","diff","fromLocalOffset","toLocalOffset","toLocalDate","MS_PER_MINUTE","MS_PER_DAY","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","firstDayOfYear","lastDayOfYear","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","toInvariantTime","isInTimeRange","msMin","msMax","msValue","isInDateRange","setTime","ignoreDST","difference","today","isToday","staticDate","addYear","currentDate","nextDay","previousDay","MS_PER_HOUR","nextYear","previousYear","stripWhitespace","createNodeIterator","iterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","child","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","animationQueue","themeColorValues","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","deltaY","delta","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","lastExecTime","throttled","elapsed","caret","rangeElement","isPosition","selectionStart","focus","setSelectionRange","selectionEnd","selection","createTextRange","collapse","moveStart","moveEnd","select","rangeDuplicated","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","nextElement","getWidgetFocusableElement","nextFocusable","addAttribute","attribute","removeAttribute","toggleAttribute","matchesMedia","mediaQuery","media","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","disc-image","getFileGroup","extension","withPrefix","fileTypeMap","groups","extensions","getFileSizeMessage","sizes","pow","selectorFromClasses","fillValues","shapeValues","sizeValues","roundedValues","positionModeValues","resizeValues","overflowValues","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","defaultValues","registerPrefix","dict","registerValues","j","newValues","currentValue","registerCssClass","shorthand","registerCssClasses","arr","widgetProperties","widgetValues","validValue","fillModeValues","propertyToCssClassMap","getValidCssClass","whenAll","resolveValues","remaining","deferred","Deferred","failed","rejectContexts","rejectValues","resolveContexts","updateFunc","contexts","notifyWith","done","fail","resolveWith","fileSaver","downloadAttribute","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","getSeriesColors","seriesColorsTemplate","series","colors","item","isElement","HTMLDocument","setDefaults","path","curr","class2type","_i","KendoLicensing","setScriptKey","amd","a1","a2","a3","depends","scaleProperties","scale","scalex","scaley","scale3d","translateProperties","translate","translatex","translatey","translate3d","hasZoom","zoom","matrix3dRegExp","cssParamsRegExp","translateXRegExp","oldEffectsRegExp","singleEffectRegExp","unitRegExp","transformProps","transform2d","transform2units","rotate","skew","cssPrefix","BLANK","PX","NONE","AUTO","WIDTH","HEIGHT","HIDDEN","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","POSITION","COMPLETE_CALLBACK","TRANSITION","TRANSFORM","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","transition","vertical","modifier","horizontal","stopQueue","val","animationProperty","transformValue","step","elem","now","curProxy","cur","parseInteger","parseCSS","acc","propertyName","strip3DTransforms","normalizeCSS","transformation","cssValues","lowerKey","isTransformed","exclusive","ease","mirror","redirectedEffect","resolved","$1","$2","effect","direction","effectBody","oldKeys","timeoutID","stopTransitionCalled","stopTransition","speeds","merge","uniqueSort","unique","taskKeys","retainPosition","transform","computed","atan2","EffectSet","restore","run","jdx","children","childrenLength","setReverse","addRestoreProperties","prepare","effectName","reset","setup","resolve","restoreCallback","Effect","effectClass","effectSet","parsedEffects","capitalize","useTransition","show","multiple","single","isFixed","originalPosition","dX","dY","marginLeft","marginTop","_direction","_additionalEffects","_reverse","play","additional","_duration","compositeRun","_complete","shouldHide","word","createEffect","definition","opt1","opt2","opt3","theDirection","FOUR_DIRECTIONS","IN_OUT","createToggleEffect","defaultStart","defaultEnd","startValue","_startValue","endValue","_endValue","_shouldHide","startDataValue","startDataValueIsSet","divisor","tmp","previous","previousDivisor","slideIn","origin","margin","setLength","oldLength","realLength","TRANSFER_START_STATE","CLIPS","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","ROTATIONS","clipInHalf","_container","rotation","zIndex","_clipInHalf","clip","append","face","_face","temporary","back","reverseDirection","temp","faceClone","backClone","staticPage","turningPage","transformStyle","RESTORE_OVERFLOW","IGNORE_TRANSITION_EVENT_SELECTOR","Animation","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","both","originalOverflow","_tickProxy","_tick","_started","tick","onEnd","onCancel","Transition","timePassed","startDate","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","easeOutBack","inner","outer","fitScale","hidden","NEWLINE","DOUBLELINE","odataFilters","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","isnullorempty","isnotnullorempty","isempty","isnotempty","odataFiltersVersionFour","mappers","pageSize","page","useVersionFour","toOdataFilter","$filter","orderby","order","$orderby","skip","$skip","take","$top","defaultDataType","read","dataType","useOdataFour","logic","operator","ignoreCase","filters","stripMetadata","hex16","createBoundary","createDelimeter","boundary","close","createCommand","transport","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","getOperationContent","content","getOperations","collection","skipContent","requestBody","processCollection","colection","getBoundary","createBatchRequest","colections","batch","batchURL","headers","Content-Type","updated","destroyed","created","parseBatchResponse","responseText","responseMarkers","markerIndex","collections","changeBody","status","code","marker","jsonModel","models","passed","parse","schemas","odata","results","total","transports","jsonp","update","create","parameterMap","$inlinecount","$format","odata-v4","$count","ajax","success","response","responses","XmlDataReader","model","errors","serialize","modelBase","Model","fields","idField","xpathToMember","evaluate","modelInstance","record","_parse","xmlParse","xml","parseDOM","parsedNode","attributes","attributeCount","firstChild","nextSibling","intermediateResult","tree","parseXML","raw","readers","features","ASCENDING","CREATE","READ","UPDATE","DESTROY","CHANGE","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","ITEMSLOADED","ITEMLOAD","crud","identity","o","objectKeys","ObservableObject","wrapAll","_loadPromises","_loadedNodes","at","serializeFunctions","json","object","isGroup","_loading","nodes","omitChangeEvent","howMany","thisArg","reduce","reduceRight","every","some","empty","Symbol","parentFn","_parent","eventHandler","_notifyChange","isPrimitiveType","getPrototypeOf","ownKeys","ignoreObjectKeys","protoKeys","filteredObjectKeys","getOwnPropertyNames","_handlers","uid","shouldSerialize","f","_set","composite","paths","isSetPrevented","change","isObservableArray","isDataSource","equal","xtype","ytype","parsers","boolean","default","getFieldByName","fieldName","_initializers","dirtyFields","_defaultId","editable","accept","isNew","Comparer","originalName","functionFields","nullable","defaultValue","compare","localeCompare","combine","comparers","StableComparer","asc","valueA","valueB","__position","desc","operators","textOp","impl","ignore","accentFoldingFiltering","toLocaleLowerCase","op","getMatchRegexp","esc","doesnotstartwith","n","doesnotendwith","doesnotmatch","Query","normalizeSort","descriptor","descriptors","sortFields","sorts","sortObject","filterExpr","expressions","and","or","fieldFunctions","operatorFunctions","operatorMap","==","equals","isequalto","equalto","!=","ne","notequals","isnotequalto","notequalto","notequal","<","islessthan","lessthan","less","<=","le","islessthanorequalto","lessthanequal",">","isgreaterthan","greaterthan","greater",">=","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","normalizeOperator","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","normalizeGroup","skipItemSorting","aggregates","normalizeGroupWithoutCompare","anyGroupDescriptorHasCompare","groupDescriptors","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","toArray","range","inPlace","orderBy","orderByDescending","comparer","compiled","predicate","group","allData","groupPaging","groupAllData","hasSubgroups","itemCount","subgroupCount","groupBy","_sortForGrouping","groupValue","_sortGroups","sum","isNumber","average","isDate","process","customGroupSort","query","groupDescriptorsWithoutCompare","normalizedSort","groupDescriptorsWithoutSort","filterCallback","flatGroups","groupDescriptor","virtual","LocalTransport","RemoteTransport","Cache","parameters","operation","_store","clear","serializeRecords","getters","originalFieldNames","fieldNames","setters","convertRecords","convertGroup","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","store","inmemory","DataReader","schema","dataFunction","_dataAccessFunction","groupsFunction","serializeFunction","serializeGetters","fromName","_wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","indexFunction","groupsLength","indexFn","groupIndex","itemIndex","flattenGroups","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","serverGrouping","viewIndex","removeModel","indexOfPristineModel","indexOfModel","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","_map","_prefetch","_data","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","_page","_sort","_sortFields","_filter","_group","_aggregate","_total","_groupPaging","_groupsState","_shouldDetachObservableParents","Transport","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","inPlaceSort","online","sync","offlineData","_isServerGrouped","_isServerGroupPaged","_isGroupPaged","_push","_readData","_flatData","useRanges","getByUid","_getByUid","_storeData","_addRange","_process","_observeView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","rangeSpan","_getCurrentRangeSpan","pushed","autoSync","pristine","pristineData","_updatePristineForModel","_removeItems","removePristine","shouldRemovePristine","found","_eachItem","_removePristineForModel","pushMove","_moveItems","moved","hasGroups","_pushInDestroyed","_removeModelFromRanges","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","_change","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","reject","_promise","converted","_params","_queueRequest","isPrevented","_dequeueRequest","_readAggregates","replaceSubset","_serverGroupsTotal","_aggregateResult","itemIds","_skip","endless","_changeHandler","updatePristine","timestamp","_timeStamp","outerStart","outerEnd","_sortRanges","_groupsFlat","_appendToGroupsFlat","_updateOuterRangesLength","_getGroupByUid","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_updateTotalForAction","isPushed","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","resultData","modelIsInView","dataToAggregate","_setView","_setFilterTotal","_mergeState","_currentRangeStart","remote","moreItemsCount","_hasExpandedSubGroups","_findGroupedRange","itemsLength","groupCount","itemsToSkip","taken","_fetchGroupItems","_fetchingGroupItems","skipped","includeParents","excludeHeader","currentItems","_expandedSubGroupItemsCount","includeCurrentItems","subGroup","endSpecified","groupItemsSkip","firstItem","lastItem","groupItemCount","expandedSubGroupItemsCount","getGroupItems","notFetched","subgroups","_composeItemsFilter","findSubgroups","_timeout","_groupItemsSuccessHandler","totalField","totalCount","_updateRangePristineData","countAdded","_currentRequestTimeStamp","_skipRequestsInProgress","indexOfCurrentGroup","rangesLength","currentGroup","dataLength","indexes","currIdx","_containsSubGroup","_cloneGroup","subgroup","currentSubGroup","filterTotal","setDefaultValue","fetch","_query","next","totalPages","prev","_pageableQueryOptions","getGroupsFlat","groupsTotal","includeExpanded","_calculateGroupsTotal","itemsField","ignoreState","_groupsTotal","countGroupRange","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","pageSkip","_processRangeData","_originalPageSkip","_originalSize","_adjustPageSkip","_groupRangeExists","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","groupMapOptions","prevRangeEnd","isGroupPaged","startField","endField","currentDataLength","_mergeGroups","_getRangesMismatch","mismatch","prevGroup","eventData","_omitPrefetch","paging","sorting","filtering","_prefetchSuccessHandler","_multiplePrefetch","prevRange","_getPrevRange","_getNextRange","availableItemsCount","_removeModelFromRange","_updateRangesLength","mismatchFound","mismatchLength","lengthDifference","rangeLength","inferSelect","firstField","secondField","optgroup","specified","inferTable","tbody","tBodies","rows","fieldIndex","fieldCount","cells","cell","transportOptions","Node","hasChildren","childrenField","childrenOptions","hasChildrenObject","_childrenOptions","_initChildren","_loaded","_updateChildrenField","loaded","level","_childrenLoaded","load","_matchFilter","dataMethod","_attachBubbleHandlers","_hierarchicalFilter","_childrenLoading","isLoading","_markHierarchicalQuery","_updateHierarchicalFilter","_find","inferList","list","textField","urlField","spriteCssClassField","imageUrlField","textChild","_dataSource","Buffer","viewSize","disablePrefetch","_prefetching","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","BatchBuffer","batchSize","batchBuffer","endreached","prefetching","prefetched","isJQueryPromise","isNativePromise","catch","signalr","hub","callbacks","_crud","server","binders","VALUE","SOURCE","EVENTS","CHECKED","CSS","deleteExpando","Binding","dependencies","_access","_parents","dependency","currentSource","EventBinding","TemplateBinding","Binder","bindings","binding","TypedBinder","parsedValue","_parseValue","dataSourceBinding","bindingName","_dataBinding","dataBinding","_dataBound","dataBound","_itemChange","itemChange","bindElement","_ns","removedItems","unbindElementTree","all","addedItems","hds","addedDataItems","multiselect","dropdowntree","Select","MultiSelect","DropDownTree","treeview","retrievePrimitiveValues","dataValueField","readonly","dataFormat","invisible","valueUpdate","_initChange","autoBind","valueField","cloneNode","reference","insertBefore","unbindElementChildren","checked","selectedIndex","selected","valuePrimitive","valueIndex","sourceValue","optionIndex","optionValue","check","_range","floatingLabel","_valueIsObservableObject","_valueIsObservableArray","_source","dataTextField","isObservableObject","valueLength","sourceItem","cascadeFrom","listView","bound","_preselect","oldValues","selectedNode","nonPrimitiveValues","_isMultipleSelection","_getAllChecked","newLength","old","same","removeIndex","newValue","arraySplice","selectedValue","gantt","_isBound","scheduler","grid","badge","addLength","shifted","shiftedLength","BindingTarget","toDestroy","hasValue","hasSource","hasEvents","hasChecked","hasCss","widgetBinding","WidgetBindingTarget","specificBinders","applyBinding","binder","bindingTargetForRole","keyValueRegExp","whiteSpaceRegExp","parseBindings","token","colonIndex","createBindings","childrenCopy","unbindElement","dom","destroyWidget","bindingTarget","destroyWidgets","namespace","observableHierarchy","recursiveRead","NS","INVALIDMSG","invalidMsgRegExp","INVALIDINPUT","VALIDINPUT","VALIDATIONSUMMARY","INVALIDLABEL","MESSAGEBOX","INPUTINNER","INPUTWRAPPER","ARIAINVALID","ARIADESCRIBEDBY","emailRegExp","urlRegExp","INPUTSELECTOR","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","BLUR","NAME","FORM","NOVALIDATE","VALIDATE","VALIDATE_INPUT","patternMatcher","matcher","hasAttribute","validator","allowSubmit","validateOnInit","resolveRules","resolvers","ruleResolvers","decode","numberOfDecimalDigits","parseHtml","parseHTML","searchForMessageContainer","containers","isLabelFor","SUMMARYTEMPLATE","Validator","validateAttributeSelector","_errorTemplate","errorTemplate","_summaryTemplate","validationSummary","_inputSelector","_checkboxSelector","_errors","_attachEvents","_isValidated","_validateOnInit","validate","required","email","dateCompare","captcha","noNameCheckbox","namedCheckbox","checkbox","radio","raise","isValidated","isValid","getCaptchaId","_validating","_checkElement","warn","validateOnBlur","_allowSubmit","stopImmediatePropagation","validateInput","inputs","invalid","showValidationSummary","valid","_checkValidity","lbl","_findMessageContainer","messageText","_extractMessage","messageLabel","wasValid","isInputInner","inputWrapper","lblId","_decorateMessageContainer","replaceWith","parentElement","prevElement","insertAfter","_inputWrapper","inputWrap","inputLabel","_inputLabel","errorId","_associateMessageContainer","hideMessages","_disassociateMessageContainers","labels","hideValidationSummary","locators","messageLocators","getElementsByTagName","locate","decorate","ruleKey","customMessage","nonDefaultMessage","_getInputNames","_errorsByName","inputNames","_renderSummary","_summaryClick","link","summary","errorsList","BACK","SAME","CHECK_URL_INTERVAL","BROKEN_BACK_NAV","hashStrip","absoluteURL","pathPrefix","regEx","host","hashDelimiter","bang","locationHash","stripRoot","root","HistoryAdapter","forward","replaceLocation","PushStateAdapter","navigate","title","replaceState","normalize","pathname","normalizeCurrent","fixedUrl","hash","hashBang","fixHash","fixBang","HashAdapter","_id","_interval","setInterval","clearInterval","History","adapter","createAdapter","historyLength","locations","_checkUrl","silent","_navigate","backCalled","navigatingInExisting","backButtonPressed","INIT","ROUTE_MISSING","optionalParam","namedParam","splatParam","escapeRegExp","namedParamReplace","optional","routeToRegExp","route","stripUrl","Route","_callback","queryStringParams","_back","worksWith","Router","routes","_urlChangedProxy","_sameProxy","_backProxy","sameProxy","_same","backProxy","urlChangedProxy","_urlChanged","initEventObject","SCRIPT","TRANSITION_START","TRANSITION_END","SHOW","HIDE","ATTACH","DETACH","sizzleErrorRegExp","bodyRegExp","LOAD_START","LOAD_COMPLETE","SHOW_START","SAME_VIEW_REQUESTED","VIEW_SHOW","VIEW_TYPE_DETERMINED","AFTER","classNames","stretchedView","footer","View","renderOnInit","_createElement","wrapInSections","_renderSections","_wrap","_evalTemplate","evalTemplate","_useWithBlock","_fragments","detachOnHide","detachOnDestroy","notInitialized","_eachFragment","ViewClone","triggerBeforeShow","triggerBeforeHide","showStart","showEnd","hideEnd","detach","purge","fragments","methodName","getElementById","contents","_wrapper","_createContent","_createHeader","_createFooter","contentSelector","ccontentElements","contentElement","Layout","_createContainer","showIn","ViewContainer","Fragment","attach","transitionRegExp","parseTransition","running","after","locationID","previousEntry","theTransition","transitionData","ViewEngine","sandbox","_hideViews","rootView","layouts","viewContainer","showView","remoteViewURLPrefix","_findViewElement","reload","_createView","urlPath","wrapInner","_locate","$angular","_findViewElementById","_createSpaView","_createMobileView","defaultTransition","loader","getLayout","getLayoutProxy","modelScope","viewOptions","OS","invalidZeroEvents","DEFAULT_MIN_HOLD","CLICK_DELAY","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","MOVE","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","api","mouse","pointer","ENABLE_GLOBAL_SURFACE","touchDelta","touch1","touch2","x1","y1","x2","y2","dx","dy","center","distance","sqrt","getTouches","currentTarget","identifier","pointerId","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","initialTouch","pressEvent","_clicks","supportDoubleTap","_moved","_finished","press","_holdTimeout","_hold","minHold","_trigger","_tap","_clickTimeout","preventMove","_shouldNotMove","_withinIgnoreThreshold","UserEvents","_start","dispose","endTime","activeTouches","isMoved","startTime","xDelta","yDelta","withEachUpEvent","downEvents","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","eventNS","surface","global","ownerDocument","pressed","defaultAction","touchAction","preventDragEvent","surfaceElement","preventIfMovingProxy","preventIfMoving","_isMoved","removeEventListener","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","which","_move","_eachTouch","_end","_click","pageX","pageY","matchingTouch","defaultThreshold","$window","draggables","dropTargets","dropAreas","lastDropTarget","KEYUP","DRAGSTART","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","numericCssPropery","within","containerBoundaries","minX","minY","maxX","maxY","checkTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","targetElement","TapCapture","_press","_release","attachEvent","captureNext","cancelCapture","PaneDimension","forcedEnabled","measure","scrollSize","makeVirtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesturestart","gesture","gesturechange","previousGesture","previousCenter","scaleDelta","coordinates","offsetX","offsetY","scaleWith","TRANSFORM_STYLE","Movable","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","destroyDroppable","groupName","droppables","DropTarget","draggable","dropTarget","_over","_out","_drop","dropped","DropTargetArea","destroyGroup","_cache","Draggable","_activated","hold","_drag","_cancel","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","_updateHint","boundaries","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","currentTargetOffset","scopeTarget","scopeFrom","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","findScrollableParent","_lastEvent","_processMovement","autoScrollVelocity","scrollableViewPort","_scrollCompenstation","_scrollVelocity","_scrollInterval","_autoScroll","_withDropTarget","compensation","yIsScrollable","xIsScrollable","isRootNode","scrollableRoot","yInBounds","xInBounds","initialTarget","mouseX","mouseY","rect","AUTO_SCROLL_AREA","utils","advanced","OPEN","CLOSE","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","BODY","LOCATION","VISIBLE","EFFECTS","ACTIVE","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","MOUSEDOWN","DOCUMENT_ELEMENT","WINDOW","SCROLL","Popup","parentPopup","collisions","collision","downEvent","anchor","_hovered","scrollArea","animation","open","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","omitOriginOffsets","_hideDirClass","_closing","_toggleResize","fixed","listbox","flipped","_position","_openAnimation","_showDirClass","_location","dirClass","skipEffects","openEffects","closeEffects","popup","ev","_resizeTimeout","_scrollableParents","_fit","viewPortSize","output","_flip","anchorSize","boxSize","isWindow","origins","positions","siblingContainer","parentZIndex","viewportOffset","viewportWidth","viewportHeight","siblings","_align","pos","offsetParent","anchorParent","offsets","flipPos","elementHeight","wrapperHeight","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","appendToOffset","anchorWidth","anchorHeight","tabKeyTrapNS","focusableNodesSelector","TabKeyTrap","trap","_keepInTrap","removeTrap","shouldTrap","_focusableElements","sortedElements","_sortFocusableElements","_nextFocusable","_focus","tabIndex","attrName","contentWindow","_haveSelectionRange","elementType","MAX_DOUBLE_TAP_DISTANCE","eventProxy","_triggerTouch","gestureEventProxy","tap","gestureend","enableSwipe","_swipestart","_swipemove","_dragstart","minXDelta","maxYDelta","maxDuration","doubleTapTimeout","lastTap","SNAPBACK_DURATION","SCROLLBAR_OPACITY","FRICTION","VELOCITY_MULTIPLIER","MAX_VELOCITY","OUT_OF_BOUNDS_FRICTION","ANIMATED_SCROLLER_PRECISION","RELEASECLASS","REFRESHCLASS","PULL","RESIZE","MOUSE_WHEEL_ID","ZoomSnapBack","tapCapture","DragInertia","freeze","_moveTo","paneAxis","_snapBack","velocityMultiplier","friction","snapBack","AnimatedScroller","_updateCoordinates","setCoordinates","setCallback","ScrollBar","controlsId","elementSize","scrollMovable","alwaysVisible","paneSize","sizeRatio","_ariaValue","visibility","_native","prepend","scrollElement","fixedContainer","avoidScrolling","velocityX","velocityY","horizontalSwipe","originatedFromFixedContainer","verticalSwipe","pane","zoomSnapBack","animatedScroller","scrollTo","mousewheelScrolling","_wheelScroll","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","ctrlKey","_wheelTimeout","pullOffset","visibleScrollHints","pullTemplate","releaseTemplate","refreshTemplate","contentResized","_scale","zoomOut","animatedScrollTo","pullHandled","refreshHint","hintContainer","yinertia","xinertia","_paneChange","_dragEnd","elementId","scrollBar","UI_OVERLAY","BEFORE_SHOW","AFTER_SHOW","BEFORE_HIDE","initPopOvers","popovers","preventScrollIfNotInput","_layout","_overlay","_scroller","_model","layout","stretch","scroller","initWidgets","overlay","$destroy","inited","_invokeNgController","_padIfNativeScrolling","isAndroid","skin","isAndroidForced","hasPlatformIndependentSkin","topContainer","bottomContainer","paddingTop","paddingBottom","scrollerContent","idAttrValue","controller","_callController","$apply","$scope","platform","previousView","currentView","errorMessage","rootNeeded","_getLayout","_setupLayouts","showClosure","serverNavigation","_loadView","modalViews","_xhr","abort","always","_xhrComplete","CAPTURE_EVENTS","Loader","captureEvents","_attachCapture","changeMessage","transitionDone","EXTERNAL","HREF","DUMMY_HREF","NAVIGATE","SKIP_TRANSITION_ON_BACK_BUTTON","WIDGET_RELS","collapsible","historyCallback","viewEngine","_historyNavigate","_historyReplace","closeActiveDialogs","viewShow","loadStart","loadComplete","sameViewRequested","viewTypeDetermined","_setPortraitWidth","_setupAppLinks","dialogs","navigateToInitial","portraitWidth","bindToRouter","router","attrUrl","hideLoading","showLoading","changeLoadingMessage","linkRoles","pressedButtonSelector","buttonSelectors","_mouseup","_appLinkClick","rel","delayedTouchEnd","openFor","paneContainer","WRAPPER","ARROW","OVERLAY","DIRECTION_CLASSES","DIRECTIONS","ANIMATION","DIMENSIONS","REVERSE","containerPopup","popupOptions","activate","_activate","deactivate","arrow","elementOffset","offsetAmount","PopOver","initialOpen","SHIM","Shim","app","osname","ioswp","bb","align","shim","prevented","_hide","BEFORE_OPEN","WRAP","ModalView","_shim","AXIS","SWIPE_TO_OPEN","AFTER_HIDE","NULL_VIEW","Drawer","drawer","_viewShow","_attachTransition","swipeToOpen","_update","leftPositioned","swipeToOpenViews","_show","_moveViewTo","visibleOnCurrentView","_currentViewIncludedIn","_setAsCurrent","currentOffset","canMoveLeft","canMoveRight","leftSwipe","newPosition","limitedPosition","pastHalf","velocityThreshold","shouldShow","EXPANED_PANE_SHIM","SplitView","_style","panes","_paramsHistory","expandedPaneShim","_shimUserEvents","collapsePanes","expandPanes","DEFAULT_OS","BERRYPHONEGAP","FONT_SIZE_COEF","VERTICAL","CHROME","BROKEN_WEBVIEW_RESIZE","INITIALLY_HORIZONTAL","orientation","HORIZONTAL","MOBILE_PLATFORMS","ios7","viewportTemplate","usedWithBlock","systemMeta","clipTemplate","ENABLE_CLIP","iconMeta","HIDEBAR","SUPPORT_SWIPE_TO_GO_BACK","HISTORY_TRANSITION","BARCOMPENSATION","STATUS_BAR_HEIGHT","SCREEN","HEAD","osCssClass","variant","setDefaultPlatform","statusBarStyle","wp8Background","noVariantSet","isOrientationHorizontal","getOrientationClass","setMinimumHeight","applyViewportHeight","Application","bootstrap","_setupPlatform","_attachMeta","_setupElementClass","_attachHideBarHandlers","paneOptions","startHistory","updateDocumentTitle","_setupDocumentTitle","_startHistory","hideAddressBar","browserHistory","historyTransition","retina","refreshBackgroundFn","refreshBackgroundColorProxy","_resizeToScreenHeight","includeStatusBar","_clearExistingMeta","icon","hideBar","_hideBar","_initialHeight","defaultTitle","COMMAND","BUTTONS","CONTEXT_DATA","cancelTemplate","ActionSheet","ShimClass","_closeProxy","_close","_shimHideProxy","_shimHide","actionData","ANDROID3UP","CLICK","DISABLED","DISABLEDSTATE","highlightButton","highlight","deactivateTimeoutID","createBadge","Button","useTap","clickOn","_userEvents","release","_timeoutDeactivate","badgeElement","button","iconSpan","span","iconElement","BackButton","DetailButton","DISABLE","SELECTOR","ButtonGroup","_button","selectOn","_enable","li","buttongroup","COLLAPSIBLE","HEADER","CONTENT","INSET","HEADER_WRAPPER","CONTENT_WRAPPER","COLLAPSED","EXPANDED","ANIMATED","EXAPND","COLLAPSE","Collapsible","_buildHeader","not","collapsed","inset","collapseIcon","expandIcon","iconPosition","expand","instant","_getContentHeight","isCollapsed","ITEM_SELECTOR","HIGHLIGHT_SELECTOR","ICON_SELECTOR","GROUP_CLASS","ACTIVE_CLASS","GROUP_WRAPPER","GROUP_TEMPLATE","SEARCH_TEMPLATE","STYLED","DATABOUND","DATABINDING","ITEM_CHANGE","whitespaceRegExp","buttonRegExp","whitespace","TEXT_NODE","addIcon","querySelector","enhanceItem","enhanceLinkItem","itemAndDetailButtons","otherNodes","enhanceCheckBoxItem","putAt","HeaderFixer","_shouldFixHeaders","headerFixer","cacheHeaders","_cacheHeaders","_scrollHandler","_fixHeader","fixedHeaders","headerPair","currentHeader","DEFAULT_PULL_PARAMETERS","RefreshHandler","pullParameters","setDataSource","pull","_pulled","_first","VirtualList","endReached","itemConstructor","prevItem","below","totalHeight","averageItemHeight","remainingItemsCount","batchUpdate","initialOffset","lastDirection","above","nextIndex","padding","lastTop","topBorder","bottomBorder","VirtualListViewItem","setDataItem","LOAD_ICON","VirtualListViewLoadingIndicator","_loadIcon","VirtualListViewPressToLoadMore","_loadButton","loadMoreText","loadMore","kendoMobileButton","_hideShowButton","_showLoadButton","VirtualListViewItemBinder","chromeHeight","_scroll","_scrollEnd","pressToLoadMore","virtualViewSize","updateScrollerSize","updateSize","ListViewItemBinder","itemBinder","_refreshHandler","_progressHandler","_unbindDataSource","prependOnRefresh","appendOnRefresh","groupedMode","findByDataItem","adding","removing","_shouldShowLoading","insertAt","replaceGrouped","endlessScroll","ListViewFilter","filterable","before","autoFilter","searchInput","_oldFilter","_filterChange","clearButton","_clearFilter","_dataSourceChange","_refreshInput","appliedFilters","_search","_applyFilter","ListView","scrollTreshold","scrollThreshold","_headerFixer","_itemsCache","_templates","_itemBinder","_pullToRefreshHandler","_enhanceItems","headerTemplate","emptyDataSource","unwrap","_scrollerInstance","triggerChange","_renderItems","groupTemplate","replaceItem","newItem","_dim","_toggle","_highlight","clicked","plainItem","dataIDAttribute","templateProxy","groupTemplateProxy","_headerTemplate","buttonElement","_styleGroups","rootItems","groupHeader","grouped","enhanced","createContainer","toggleTitle","centerElement","noTitle","showTitle","prevAll","NavBar","leftElement","rightElement","CHANGING","REFRESH","CURRENT_PAGE_CLASS","VIRTUAL_PAGE_CLASS","CLEANUP","VIRTUAL_PAGE_COUNT","LEFT_PAGE","CETER_PAGE","RIGHT_PAGE","LEFT_SWIPE","NUDGE","RIGHT_SWIPE","Pager","scrollView","_changeProxy","_refreshProxy","_refresh","pageHTML","pageCount","ScrollViewPager","DRAG_START","DRAG_END","ElasticPane","updateDimension","transitionTo","ScrollViewContent","ScrollViewElasticPane","_getPages","contentHeight","enablePager","pagerOverlay","paneMoved","swipeType","bounce","approx","snap","nextPage","minSnap","maxSnap","currentPage","updatePage","forcePageUpdate","resizeTo","pageElements","containerHeight","pager","_paged","VirtualScrollViewContent","pages","_initPages","_buffer","_pendingPageRefresh","_pendingWidgetRefresh","_resetPages","itemsPerPage","_onResize","_resetProxy","_onReset","_endReachedProxy","_onEndReached","emptyTemplate","emptyTemplateProxy","Page","setWidth","_repositionPages","_updatePagesContent","thresholdPassed","isEndReached","_cancelMove","_moveBackward","_moveForward","setPageContent","_resetMovable","theContent","ScrollView","VirtualPage","transitionEnd","_transitionEnd","dragStart","_dragStart","dragEnd","_syncWithContent","_content","mobileContainer","viewInit","bounceVelocityThreshold","prevPage","SWITCHON","SWITCHOFF","MARGINLEFT","ACTIVE_STATE","DISABLED_STATE","RESOLVEDPREFIX","TRANSFORMSTYLE","limitValue","minLimit","maxLimit","SWITCH_MARKUP","Switch","onLabel","offLabel","background","constrain","snapPoint","_animateBackground","handleWidth","_stop","ACTIVE_STATE_CLASS","TabStrip","_buildButton","switchTo","tabs","tab","_setActiveItem","switchByFullUrl","currentItem","tabstrip","defer","module","$injector","$parse","$timeout","$defaultCompile","$log","withoutTimeout","OPTIONS_NOW","createDataSource","TreeList","TreeView","Scheduler","PivotGrid","PivotConfigurator","PanelBar","Menu","ContextMenu","toDataSource","$eval","ds","$watch","mew","kendoWidgetInstance","ignoredAttributes","kDataSource","kOptions","kRebind","kNgModel","kNgDelay","ignoredOwnProperties","createWidget","attrs","origAttr","controllers","delayValue","ngModel","ngForm","ctor","parsed","unresolved","unwatch","createIt","$root","unregister","$attr","originalElement","exposeWidget","$emit","destroyRegister","destroyWidgetOnScopeDestroy","setupRebind","kNgDisabled","isDisabled","bindToKNgDisabled","kNgReadonly","isReadonly","bindToKNgReadonly","bindToKNgModel","bindToNgModel","propagateClassToWidgetWrapper","optionsPath","optionsValue","defaultOptions","addOption","scopeValue","widgetOptions","widgetEvents","dataName","eventKey","optionName","oldValue","kendoWidget","assign","formValue","formRegExp","isForm","haveChangeOnElement","viewRender","$viewValue","$modelValue","$render","onChange","formPristine","$pristine","$setViewValue","$setPristine","digest","AutoComplete","currentVal","$isEmpty","DateRangePicker","rangePickerModels","rangePickerStartModel","rangePickerEndModel","_startDateInput","_endDateInput","updating","valueIsCollection","RangeSlider","currentValueLength","$angular_setLogicValue","watchHandler","$watchCollection","changeHandler","$setDirty","$angular_getLogicValue","deregister","$on","MutationObserver","prevClassList","classList","mo","changes","suspend","chg","w","attributeName","currClassList","cls","ComboBox","resume","disconnect","observe","rebindAttr","_cleanUp","templateOptions","WIDGET_TEMPLATE_OPTIONS","templateContents","isUpload","replaceChild","setTemplate","factory","kendoRenderedTimeout","RENDERED","restrict","require","$attrs","$element","roleattr","TAGNAMES","Editor","NumericTextBox","DatePicker","DateTimePicker","TimePicker","ColorPicker","MaskedTextBox","Upload","MobileButton","MobileBackButton","MobileDetailButton","MobileListView","SKIP_SHORTCUTS","MANUAL_DIRECTIVES","directive","createDirectives","klass","isMobile","make","directiveName","directiveFactory","shortcut","dashed","tag","scopeField","kScopeField","isDigesting","destroyScope","encode","encOpen","encClose","pendingPatches","defadvice","origMethod","self","entry","arg","$angular_scope","$angular_init","itemScope","$$kendoScope","vars","$new","$angular_makeEventHandler","kendoEvent","locals","elems","columns","colIdx","isString","selectable","_checkBoxSelection","angularDataItem","templateSettings","col","encoded","terminal","pre","_instance","post","kAttr","priority","TreeMap","MobileScrollView","Grid","templateDirectives","templates","templateName","outerHTML"],"mappings":"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"}