{"version":3,"file":"kendo.data.min.js","sources":["kendo.data.js"],"sourcesContent":["(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"],"names":["define","__meta__","id","name","category","description","depends","features","$","window","kendo","jQuery","undefined","extend","isPlainObject","isEmptyObject","isArray","Array","grep","ajax","map","each","noop","isFunction","Observable","Class","STRING","FUNCTION","ASCENDING","CREATE","READ","UPDATE","DESTROY","CHANGE","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","ITEMSLOADED","ITEMLOAD","crud","identity","o","getter","stringify","math","Math","push","join","pop","splice","shift","slice","unshift","toString","stableSort","support","dateRegExp","objectKeys","ObservableArray","init","array","type","that","this","ObservableObject","fn","call","length","wrapAll","_loadPromises","_loadedNodes","at","index","toJSON","serializeFunctions","idx","value","json","parent","source","target","wrap","object","observable","Model","bind","e","isGroup","hasOwnProperty","trigger","field","node","items","action","promise","_loading","done","indexOf","collection","nodes","loading","arguments","result","apply","omitChangeEvent","sort","howMany","item","i","len","concat","children","unbind","forEach","callback","thisArg","context","reduce","reduceRight","filter","find","every","some","remove","empty","Symbol","iterator","prototype","LazyObservableArray","data","events","parentFn","_events","_parent","eventHandler","prefix","event","key","_notifyChange","isPrimitiveType","Object","getPrototypeOf","Date","ownKeys","ignoreObjectKeys","props","protoKeys","keys","filteredObjectKeys","getOwnPropertyNames","prop","member","_handlers","getTime","charAt","uid","guid","shouldSerialize","f","get","_set","composite","paths","split","path","obj","set","setter","isSetPrevented","current","change","isObservableArray","isDataSource","DataSource","equal","x","y","xtype","ytype","parsers","number","toLowerCase","parseFloat","date","parseDate","boolean","string","default","defaultValues","getFieldByName","fieldName","defaults","_initializers","dirty","dirtyFields","idField","_defaultId","_parse","fields","parse","editable","accept","isNew","Comparer","base","options","model","proto","originalName","functionFields","nullable","defaultValue","selector","compare","a","b","localeCompare","create","dir","combine","comparers","StableComparer","asc","valueA","valueB","__position","desc","operators","quote","str","replace","JSON","textOp","impl","ignore","accentFoldingFiltering","toLocaleLowerCase","operator","op","exec","getMatchRegexp","pattern","rx","esc","ch","eq","neq","gt","gte","lt","lte","startswith","doesnotstartwith","endswith","n","doesnotendwith","contains","doesnotcontain","matches","substring","doesnotmatch","isempty","isnotempty","isnull","isnotnull","isnullorempty","isnotnullorempty","Query","normalizeSort","descriptor","descriptors","d","sortFields","sorts","sortObject","filterExpr","expression","expressions","logic","and","or","expr","fieldFunctions","operatorFunctions","filters","match","ignoreCase","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","accessor","toArray","range","count","skip","take","select","order","inPlace","orderBy","orderByDescending","comparer","compiled","predicate","Function","group","allData","groupPaging","groupAllData","hasSubgroups","itemCount","subgroupCount","groupBy","sorted","_sortForGrouping","groupValue","currentValue","_sortGroups","groups","sum","isNumber","average","max","isDate","min","val","isNaN","process","customGroupSort","query","groupDescriptorsWithoutCompare","normalizedSort","groupDescriptorsWithoutSort","total","filterCallback","flatGroups","groupDescriptor","virtual","LocalTransport","read","success","update","destroy","RemoteTransport","parameterMap","url","cache","Cache","add","submit","option","setup","error","parameters","operation","_store","clear","serializeRecords","getters","modelInstance","originalFieldNames","fieldNames","record","setters","convertRecords","convertGroup","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","store","inmemory","DataReader","schema","modelBase","dataFunction","_dataAccessFunction","groupsFunction","serializeFunction","serialize","serializeGetters","fromName","from","_wrapDataAccessBase","errors","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","indexFunction","groupsLength","indexFn","groupIndex","itemIndex","flattenGroups","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","view","serverGrouping","viewIndex","removeModel","dataItem","indexOfPristineModel","indexOfModel","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","_map","_prefetch","_data","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","pageSize","_page","page","_sort","_sortFields","_filter","_group","_aggregate","_total","_groupPaging","_groupsState","_shouldDetachObservableParents","transport","Transport","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","readers","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","batch","inPlaceSort","clone","online","sync","Deferred","resolve","offlineData","_isServerGrouped","_isServerGroupPaged","_isGroupPaged","_push","_readData","_flatData","useRanges","getByUid","_getByUid","dataItems","_storeData","_addRange","_process","_observeView","flatView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","rangeSpan","_getCurrentRangeSpan","pushed","autoSync","pristine","last","pristineData","_updatePristineForModel","_removeItems","removePristine","shouldRemovePristine","destroyed","found","_eachItem","_removePristineForModel","pushMove","_moveItems","moved","hasGroups","_pushInDestroyed","_removeModelFromRanges","created","updated","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","_change","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","models","response","serverGroup","_handleCustomErrors","values","_executeOnPristineForModel","deepExtend","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","status","reject","deferred","_promise","method","converted","params","_params","_queueRequest","isPrevented","args","_dequeueRequest","_readAggregates","replaceSubset","_serverGroupsTotal","_aggregateResult","itemIds","_skip","endless","j","_changeHandler","updatePristine","start","end","timestamp","_timeStamp","outerStart","outerEnd","_sortRanges","_groupsFlat","_appendToGroupsFlat","_updateOuterRangesLength","_getGroupByUid","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_updateTotalForAction","parseInt","isPushed","handler","first","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","resultData","modelIsInView","dataToAggregate","_setView","_setFilterTotal","_mergeState","_currentRangeStart","remote","moreItemsCount","_hasExpandedSubGroups","_findGroupedRange","parents","itemsLength","groupCount","itemsToSkip","taken","_fetchGroupItems","_fetchingGroupItems","skipped","includeParents","excludeHeader","currentItems","_expandedSubGroupItemsCount","includeCurrentItems","subGroup","endSpecified","temp","groupItemsSkip","firstItem","lastItem","groupItemCount","expandedSubGroupItemsCount","getGroupItems","notFetched","floor","round","subgroups","_composeItemsFilter","findSubgroups","clearTimeout","_timeout","setTimeout","_groupItemsSuccessHandler","totalField","totalCount","_updateRangePristineData","countAdded","_currentRequestTimeStamp","_skipRequestsInProgress","indexOfCurrentGroup","g","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","size","_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","force","_multiplePrefetch","prevRange","_getPrevRange","_getNextRange","availableItemsCount","_removeModelFromRange","_updateRangesLength","mismatchFound","mismatchLength","lengthDifference","rangeLength","abs","inferSelect","firstField","secondField","optgroup","parentNode","disabled","label","text","attributes","specified","inferTable","table","tbody","tBodies","rows","fieldIndex","fieldCount","cells","cell","nodeName","innerHTML","dataSource","transportOptions","transports","schemas","logToConsole","Node","hasChildren","childrenField","childrenOptions","hasChildrenObject","_childrenOptions","_initChildren","_loaded","HierarchicalDataSource","_updateChildrenField","append","loaded","level","_childrenLoaded","load","one","_matchFilter","dataMethod","_attachBubbleHandlers","_hierarchicalFilter","_childrenLoading","isLoading","_markHierarchicalQuery","_updateHierarchicalFilter","_find","inferList","list","textField","urlField","spriteCssClassField","imageUrlField","textChild","className","elements","tagName","firstChild","attr","nodeType","nodeValue","trim","_dataSource","Buffer","viewSize","disablePrefetch","_prefetching","buffer","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","offset","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","BatchBuffer","batchSize","batchBuffer","endreached","prefetching","prefetched","reset","resize","amd","a1","a2","a3"],"mappings":"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"}