{"version":3,"sources":["kendo.data.js"],"names":["f","define","$","undefined","eventHandler","context","type","field","prefix","e","key","event","CHANGE","_notifyChange","trigger","equal","x","y","xtype","ytype","getTime","getFieldByName","obj","name","fieldName","isPlainObject","Query","data","this","normalizeSort","dir","descriptor","STRING","descriptors","isArray","grep","d","normalizeOperator","expression","idx","length","filter","operator","filters","operatorMap","toLowerCase","normalizeFilter","isEmptyObject","logic","compareDescriptor","f1","f2","value","normalizeDescriptor","fieldComparer","a","b","compareFilters","expr1","expr2","filters1","filters2","slice","sort","normalizeAggregate","expressions","normalizeGroup","map","aggregates","groupValueComparer","calculateAggregate","accumulator","item","index","state","aggr","functionName","len","aggregate","functions","kendo","accessor","isNumber","val","isNaN","isDate","toJSON","array","result","Array","serializeRecords","getters","modelInstance","originalFieldNames","fieldNames","record","getter","originalName","setters","setter","convertRecords","_parse","convertGroup","hasSubgroups","items","wrapDataAccess","originalFunction","model","converter","toString","call","ObservableArray","mergeGroups","target","dest","skip","take","group","concat","splice","flattenGroups","itemIndex","at","push","wrapGroupItems","LazyObservableArray","eachGroupItems","func","replaceInRanges","ranges","observable","replaceInRange","replaceWithObservable","view","serverGrouping","viewIndex","removeModel","dataItem","uid","indexOfPristineModel","indexOf","idField","id","_defaultId","indexOfModel","comparer","fieldNameFromModel","fields","from","isFunction","convertFilterDescriptorsField","convertDescriptorsField","inferSelect","select","options","firstField","secondField","optgroup","option","parentNode","disabled","label","text","attributes","specified","inferTable","table","fieldIndex","cells","cell","empty","tbody","tBodies","rows","fieldCount","nodeName","innerHTML","dataMethod","_data","DataSource","fn","apply","arguments","_attachBubbleHandlers","inferList","list","elements","collection","tagName","add","find","textChild","className","children","textField","urlField","spriteCssClassField","imageUrlField","_loaded","eq","firstChild","attr","nodeType","nodeValue","prop","trim","replace","hasChildren","ObservableObject","parsers","defaultValues","Model","Comparer","StableComparer","operators","LocalTransport","RemoteTransport","Cache","DataReader","Transport","Node","HierarchicalDataSource","Buffer","BatchBuffer","extend","proxy","ajax","each","noop","window","Observable","Class","FUNCTION","CREATE","READ","UPDATE","DESTROY","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","stringify","math","Math","join","pop","shift","unshift","stableSort","support","dateRegExp","newLineRegExp","quoteRegExp","init","that","wrapAll","json","parent","source","wrap","object","bind","node","action","howMany","i","unbind","forEach","callback","reduce","reduceRight","every","some","remove","Symbol","iterator","prototype","_parent","member","_handlers","charAt","guid","shouldSerialize","hasOwnProperty","get","_set","paths","path","composite","split","set","isSetPrevented","current","change","isObservableArray","isDataSource","number","parseFloat","date","parseDate","boolean","string","default","Date","defaults","_initializers","dirty","parse","editable","initiator","accept","isNew","base","proto","functionFields","nullable","defaultValue","selector","compare","localeCompare","create","combine","comparers","asc","valueA","valueB","__position","desc","quote","op","ignore","exec","neq","gt","gte","lt","lte","startswith","doesnotstartwith","endswith","doesnotendwith","contains","doesnotcontain","isempty","isnotempty","isnull","isnotnull","filterExpr","expr","and","or","fieldFunctions","operatorFunctions","match","ignoreCase","==","equals","isequalto","equalto","!=","ne","notequals","isnotequalto","notequalto","notequal","<","islessthan","lessthan","less","<=","le","islessthanorequalto","lessthanequal",">","isgreaterthan","greaterthan","greater",">=","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","toArray","range","count","order","orderBy","orderByDescending","compiled","predicate","Function","allData","groupBy","currentValue","sorted","_sortForGrouping","groupValue","sum","average","max","min","process","total","query","filterCallback","read","success","update","destroy","parameterMap","url","cache","setup","error","parameters","operation","_store","clear","store","inmemory","schema","dataFunction","groupsFunction","serializeFunction","serializeGetters","modelBase","_dataAccessFunction","groups","serialize","fromName","errors","_map","_prefetch","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","pageSize","_page","page","_sort","_filter","_group","_aggregate","_total","_shouldDetachObservableParents","transport","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","JSON","localStorage","setItem","reader","readers","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","batch","clone","online","sync","Deferred","resolve","promise","offlineData","_isServerGrouped","_push","_readData","_flatData","getByUid","_storeData","_addRange","_process","_observeView","flatView","insert","_createNewModel","_wrapInEmptyGroup","pushed","autoSync","pristine","_updatePristineForModel","_removeItems","destroyed","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","_updateRangesLength","created","updated","promises","submit","_sendSubmit","_send","when","then","_accept","_change","cancelChanges","_cancelModel","_markOfflineUpdatesAsDirty","__state__","hasChanges","models","response","serverGroup","_handleCustomErrors","values","_executeOnPristineForModel","deepExtend","_eachPristineItem","_pristineForModel","_submit","status","reject","deferred","_promise","method","converted","params","_params","_queueRequest","isPrevented","_dequeueRequest","args","_readAggregates","itemIds","_aggregateResult","updatePristine","start","_skip","end","timestamp","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_changeHandler","_updateTotalForAction","parseInt","handler","first","_calculateAggregates","_take","_queryProcess","_mergeState","_currentRangeStart","remote","fetch","_query","next","totalPages","prev","round","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_timeStamp","pageSkip","size","paging","sorting","filtering","_currentRequestTimeStamp","floor","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","_mergeGroups","prevGroup","temp","currentRangeStart","_prefetchSuccessHandler","force","clearTimeout","_timeout","setTimeout","_multiplePrefetch","rangeLength","startOffset","dataSource","transportOptions","transports","schemas","logToConsole","childrenField","childrenOptions","_childrenOptions","_initChildren","_updateChildrenField","append","loaded","level","_childrenLoaded","load","one","_find","_dataSource","viewSize","disablePrefetch","_prefetching","buffer","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","useRanges","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","offset","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","batchSize","batchBuffer","endreached","prefetching","prefetched","reset","resize","jQuery","amd","a1","a2","a3"],"mappings":"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","file":"kendo.data.min.js","sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function (f, define) {\n define('kendo.data', [\n 'kendo.core',\n 'kendo.data.odata',\n 'kendo.data.xml'\n ], f);\n}(function () {\n var __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 {\n id: 'data-odata',\n name: 'OData',\n description: 'Support for accessing Open Data Protocol (OData) services.',\n depends: ['data.odata']\n },\n {\n id: 'data-signalr',\n name: 'SignalR',\n description: 'Support for binding to SignalR hubs.',\n depends: ['data.signalr']\n },\n {\n id: 'data-XML',\n name: 'XML',\n description: 'Support for binding to XML.',\n depends: ['data.xml']\n }\n ]\n };\n (function ($, undefined) {\n var extend = $.extend, proxy = $.proxy, isPlainObject = $.isPlainObject, isEmptyObject = $.isEmptyObject, isArray = $.isArray, grep = $.grep, ajax = $.ajax, map, each = $.each, noop = $.noop, kendo = window.kendo, isFunction = kendo.isFunction, Observable = kendo.Observable, Class = kendo.Class, STRING = 'string', FUNCTION = 'function', CREATE = 'create', READ = 'read', UPDATE = 'update', DESTROY = 'destroy', CHANGE = 'change', SYNC = 'sync', GET = 'get', ERROR = 'error', REQUESTSTART = 'requestStart', PROGRESS = 'progress', REQUESTEND = 'requestEnd', crud = [\n CREATE,\n READ,\n UPDATE,\n DESTROY\n ], identity = function (o) {\n return o;\n }, getter = kendo.getter, stringify = kendo.stringify, math = Math, push = [].push, join = [].join, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, toString = {}.toString, stableSort = kendo.support.stableSort, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/, newLineRegExp = /(\\r+|\\n+)/g, quoteRegExp = /(?=['\\\\])/g;\n var ObservableArray = Observable.extend({\n init: function (array, type) {\n var that = this;\n that.type = type || ObservableObject;\n Observable.fn.init.call(that);\n that.length = array.length;\n that.wrapAll(array, that);\n },\n at: function (index) {\n return this[index];\n },\n toJSON: function () {\n var idx, length = this.length, value, json = new Array(length);\n for (idx = 0; idx < length; idx++) {\n value = this[idx];\n if (value instanceof ObservableObject) {\n value = value.toJSON();\n }\n json[idx] = value;\n }\n return json;\n },\n parent: noop,\n wrapAll: function (source, target) {\n var that = this, idx, length, parent = function () {\n return that;\n };\n target = target || [];\n for (idx = 0, length = source.length; idx < length; idx++) {\n target[idx] = that.wrap(source[idx], parent);\n }\n return target;\n },\n wrap: function (object, parent) {\n var that = this, observable;\n if (object !== null && toString.call(object) === '[object Object]') {\n observable = object instanceof that.type || object instanceof Model;\n if (!observable) {\n object = object instanceof ObservableObject ? object.toJSON() : object;\n object = new that.type(object);\n }\n object.parent = parent;\n object.bind(CHANGE, function (e) {\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 ? e.action || 'itemloaded' : 'itemchange'\n });\n });\n }\n return object;\n },\n push: function () {\n var index = this.length, items = this.wrapAll(arguments), result;\n result = push.apply(this, items);\n this.trigger(CHANGE, {\n action: 'add',\n index: index,\n items: items\n });\n return result;\n },\n slice: slice,\n sort: [].sort,\n join: join,\n pop: function () {\n var length = this.length, result = pop.apply(this);\n if (length) {\n this.trigger(CHANGE, {\n action: 'remove',\n index: length - 1,\n items: [result]\n });\n }\n return result;\n },\n splice: function (index, howMany, item) {\n var items = this.wrapAll(slice.call(arguments, 2)), result, i, len;\n result = splice.apply(this, [\n index,\n howMany\n ].concat(items));\n if (result.length) {\n this.trigger(CHANGE, {\n action: 'remove',\n index: index,\n items: result\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 if (item) {\n this.trigger(CHANGE, {\n action: 'add',\n index: index,\n items: items\n });\n }\n return result;\n },\n shift: function () {\n var length = this.length, result = shift.apply(this);\n if (length) {\n this.trigger(CHANGE, {\n action: 'remove',\n index: 0,\n items: [result]\n });\n }\n return result;\n },\n unshift: function () {\n var items = this.wrapAll(arguments), result;\n result = unshift.apply(this, items);\n this.trigger(CHANGE, {\n action: 'add',\n index: 0,\n items: items\n });\n return result;\n },\n indexOf: function (item) {\n var that = this, idx, length;\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 forEach: function (callback) {\n var idx = 0, length = this.length;\n for (; idx < length; idx++) {\n callback(this[idx], idx, this);\n }\n },\n map: function (callback) {\n var idx = 0, result = [], length = this.length;\n for (; idx < length; idx++) {\n result[idx] = callback(this[idx], idx, this);\n }\n return result;\n },\n reduce: function (callback) {\n var idx = 0, result, length = this.length;\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx < length) {\n result = this[idx++];\n }\n for (; idx < length; idx++) {\n result = callback(result, this[idx], idx, this);\n }\n return result;\n },\n reduceRight: function (callback) {\n var idx = this.length - 1, result;\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx > 0) {\n result = this[idx--];\n }\n for (; idx >= 0; idx--) {\n result = callback(result, this[idx], idx, this);\n }\n return result;\n },\n filter: function (callback) {\n var idx = 0, result = [], item, length = this.length;\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback(item, idx, this)) {\n result[result.length] = item;\n }\n }\n return result;\n },\n find: function (callback) {\n var idx = 0, item, length = this.length;\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback(item, idx, this)) {\n return item;\n }\n }\n },\n every: function (callback) {\n var idx = 0, item, length = this.length;\n for (; idx < length; idx++) {\n item = this[idx];\n if (!callback(item, idx, this)) {\n return false;\n }\n }\n return true;\n },\n some: function (callback) {\n var idx = 0, item, length = this.length;\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback(item, idx, this)) {\n return true;\n }\n }\n return false;\n },\n remove: function (item) {\n var idx = this.indexOf(item);\n if (idx !== -1) {\n this.splice(idx, 1);\n }\n },\n empty: function () {\n this.splice(0, this.length);\n }\n });\n if (typeof Symbol !== 'undefined' && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n }\n var LazyObservableArray = ObservableArray.extend({\n init: function (data, type) {\n Observable.fn.init.call(this);\n this.type = type || ObservableObject;\n for (var idx = 0; idx < data.length; idx++) {\n this[idx] = data[idx];\n }\n this.length = idx;\n this._parent = proxy(function () {\n return this;\n }, this);\n },\n at: function (index) {\n var item = this[index];\n if (!(item instanceof this.type)) {\n item = this[index] = this.wrap(item, this._parent);\n } else {\n item.parent = this._parent;\n }\n return item;\n }\n });\n function eventHandler(context, type, field, prefix) {\n return function (e) {\n var event = {}, key;\n for (key in e) {\n event[key] = e[key];\n }\n if (prefix) {\n event.field = field + '.' + e.field;\n } else {\n event.field = field;\n }\n if (type == CHANGE && context._notifyChange) {\n context._notifyChange(event);\n }\n context.trigger(type, event);\n };\n }\n var ObservableObject = Observable.extend({\n init: function (value) {\n var that = this, member, field, parent = function () {\n return that;\n };\n Observable.fn.init.call(this);\n this._handlers = {};\n for (field in value) {\n member = value[field];\n if (typeof member === 'object' && member && !member.getTime && field.charAt(0) != '_') {\n member = that.wrap(member, field, parent);\n }\n that[field] = member;\n }\n that.uid = kendo.guid();\n },\n shouldSerialize: function (field) {\n return this.hasOwnProperty(field) && field !== '_handlers' && field !== '_events' && typeof this[field] !== FUNCTION && field !== 'uid';\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 toJSON: function () {\n var result = {}, value, field;\n for (field in this) {\n if (this.shouldSerialize(field)) {\n value = this[field];\n if (value instanceof ObservableObject || value instanceof ObservableArray) {\n value = value.toJSON();\n }\n result[field] = value;\n }\n }\n return result;\n },\n get: function (field) {\n var that = this, result;\n that.trigger(GET, { field: field });\n if (field === 'this') {\n result = that;\n } else {\n result = kendo.getter(field, true)(that);\n }\n return result;\n },\n _set: function (field, value) {\n var that = this;\n var composite = field.indexOf('.') >= 0;\n if (composite) {\n var paths = field.split('.'), path = '';\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 kendo.setter(field)(that, value);\n return composite;\n },\n set: function (field, value) {\n var that = this, isSetPrevented = false, composite = field.indexOf('.') >= 0, current = kendo.getter(field, true)(that);\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 isSetPrevented = that.trigger('set', {\n field: field,\n value: value\n });\n if (!isSetPrevented) {\n if (!composite) {\n value = that.wrap(value, field, function () {\n return that;\n });\n }\n if (!that._set(field, value) || field.indexOf('(') >= 0 || field.indexOf('[') >= 0) {\n that.trigger(CHANGE, { field: field });\n }\n }\n }\n return isSetPrevented;\n },\n parent: noop,\n wrap: function (object, field, parent) {\n var that = this;\n var get;\n var change;\n var type = toString.call(object);\n if (object != null && (type === '[object Object]' || type === '[object Array]')) {\n var isObservableArray = object instanceof ObservableArray;\n var isDataSource = object instanceof DataSource;\n if (type === '[object Object]' && !isDataSource && !isObservableArray) {\n if (!(object instanceof ObservableObject)) {\n object = new ObservableObject(object);\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 that._handlers[field] = {\n get: get,\n change: change\n };\n } else if (type === '[object Array]' || isObservableArray || isDataSource) {\n if (!isObservableArray && !isDataSource) {\n object = new ObservableArray(object);\n }\n change = eventHandler(that, CHANGE, field, false);\n object.bind(CHANGE, change);\n that._handlers[field] = { change: change };\n }\n object.parent = parent;\n }\n return object;\n }\n });\n function equal(x, y) {\n if (x === y) {\n return true;\n }\n var xtype = $.type(x), ytype = $.type(y), field;\n if (xtype !== ytype) {\n return false;\n }\n if (xtype === 'date') {\n return x.getTime() === y.getTime();\n }\n if (xtype !== 'object' && xtype !== 'array') {\n return false;\n }\n for (field in x) {\n if (!equal(x[field], y[field])) {\n return false;\n }\n }\n return true;\n }\n var parsers = {\n 'number': function (value) {\n return kendo.parseFloat(value);\n },\n 'date': function (value) {\n return kendo.parseDate(value);\n },\n 'boolean': function (value) {\n if (typeof value === STRING) {\n return value.toLowerCase() === 'true';\n }\n return value != null ? !!value : value;\n },\n 'string': function (value) {\n return value != null ? value + '' : value;\n },\n 'default': function (value) {\n return value;\n }\n };\n var defaultValues = {\n 'string': '',\n 'number': 0,\n 'date': new Date(),\n 'boolean': false,\n 'default': ''\n };\n function getFieldByName(obj, name) {\n var field, fieldName;\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 var Model = ObservableObject.extend({\n init: function (data) {\n var that = this;\n if (!data || $.isEmptyObject(data)) {\n data = $.extend({}, that.defaults, data);\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 ObservableObject.fn.init.call(that, data);\n that.dirty = false;\n if (that.idField) {\n that.id = that.get(that.idField);\n if (that.id === undefined) {\n that.id = that._defaultId;\n }\n }\n },\n shouldSerialize: function (field) {\n return ObservableObject.fn.shouldSerialize.call(this, field) && field !== 'uid' && !(this.idField !== 'id' && field === 'id') && field !== 'dirty' && field !== '_accessors';\n },\n _parse: function (field, value) {\n var that = this, fieldName = field, fields = that.fields || {}, parse;\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 return parse ? parse(value) : value;\n },\n _notifyChange: function (e) {\n var action = e.action;\n if (action == 'add' || action == 'remove') {\n this.dirty = true;\n }\n },\n editable: function (field) {\n field = (this.fields || {})[field];\n return field ? field.editable !== false : true;\n },\n set: function (field, value, initiator) {\n var that = this;\n var dirty = that.dirty;\n if (that.editable(field)) {\n value = that._parse(field, value);\n if (!equal(value, that.get(field))) {\n that.dirty = true;\n if (ObservableObject.fn.set.call(that, field, value, initiator) && !dirty) {\n that.dirty = dirty;\n }\n }\n }\n },\n accept: function (data) {\n var that = this, parent = function () {\n return that;\n }, field;\n for (field in data) {\n var value = data[field];\n if (field.charAt(0) != '_') {\n value = that.wrap(data[field], field, parent);\n }\n that._set(field, value);\n }\n if (that.idField) {\n that.id = that.get(that.idField);\n }\n that.dirty = false;\n },\n isNew: function () {\n return this.id === this._defaultId;\n }\n });\n Model.define = function (base, options) {\n if (options === undefined) {\n options = base;\n base = Model;\n }\n var model, proto = extend({ defaults: {} }, options), name, field, type, value, idx, length, fields = {}, originalName, id = proto.id, functionFields = [];\n if (id) {\n proto.idField = id;\n }\n if (proto.id) {\n delete proto.id;\n }\n if (id) {\n proto.defaults[id] = proto._defaultId = '';\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 for (name in proto.fields) {\n field = proto.fields[name];\n type = field.type || 'default';\n value = null;\n originalName = name;\n name = typeof field.field === STRING ? field.field : name;\n if (!field.nullable) {\n value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n if (typeof value === 'function') {\n functionFields.push(name);\n }\n }\n if (options.id === name) {\n proto._defaultId = value;\n }\n proto.defaults[originalName !== name ? originalName : name] = value;\n field.parse = field.parse || parsers[type];\n }\n if (functionFields.length > 0) {\n proto._initializers = functionFields;\n }\n model = base.extend(proto);\n model.define = function (options) {\n return Model.define(model, options);\n };\n if (proto.fields) {\n model.fields = proto.fields;\n model.idField = proto.idField;\n }\n return model;\n };\n var Comparer = {\n selector: function (field) {\n return isFunction(field) ? field : getter(field);\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 if (a == null && b == null) {\n return 0;\n }\n if (a == null) {\n return -1;\n }\n if (b == null) {\n return 1;\n }\n if (a.localeCompare) {\n return a.localeCompare(b);\n }\n return a > b ? 1 : a < b ? -1 : 0;\n };\n },\n create: function (sort) {\n var compare = sort.compare || this.compare(sort.field);\n if (sort.dir == 'desc') {\n return function (a, b) {\n return compare(b, a, true);\n };\n }\n return compare;\n },\n combine: function (comparers) {\n return function (a, b) {\n var result = comparers[0](a, b), idx, length;\n for (idx = 1, length = comparers.length; idx < length; idx++) {\n result = result || comparers[idx](a, b);\n }\n return result;\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 if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n if (valueA == null) {\n return -1;\n }\n if (valueB == null) {\n return 1;\n }\n if (valueA.localeCompare) {\n return valueA.localeCompare(valueB);\n }\n return valueA > valueB ? 1 : -1;\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 if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n if (valueA == null) {\n return 1;\n }\n if (valueB == null) {\n return -1;\n }\n if (valueB.localeCompare) {\n return valueB.localeCompare(valueA);\n }\n return valueA < valueB ? 1 : -1;\n };\n },\n create: function (sort) {\n return this[sort.dir](sort.field);\n }\n });\n map = function (array, callback) {\n var idx, length = array.length, result = new Array(length);\n for (idx = 0; idx < length; idx++) {\n result[idx] = callback(array[idx], idx, array);\n }\n return result;\n };\n var operators = function () {\n function quote(value) {\n return value.replace(quoteRegExp, '\\\\').replace(newLineRegExp, '');\n }\n function operator(op, a, b, ignore) {\n var date;\n if (b != null) {\n if (typeof b === STRING) {\n b = quote(b);\n date = dateRegExp.exec(b);\n if (date) {\n b = new Date(+date[1]);\n } else if (ignore) {\n b = '\\'' + b.toLowerCase() + '\\'';\n a = '((' + a + ' || \\'\\')+\\'\\').toLowerCase()';\n } else {\n b = '\\'' + b + '\\'';\n }\n }\n if (b.getTime) {\n a = '(' + a + '&&' + a + '.getTime?' + a + '.getTime():' + a + ')';\n b = b.getTime();\n }\n }\n return a + ' ' + op + ' ' + b;\n }\n return {\n quote: function (value) {\n if (value && value.getTime) {\n return 'new Date(' + value.getTime() + ')';\n }\n if (typeof value == 'string') {\n return '\\'' + quote(value) + '\\'';\n }\n return '' + value;\n },\n eq: function (a, b, ignore) {\n return operator('==', a, b, ignore);\n },\n neq: function (a, b, ignore) {\n return operator('!=', a, b, ignore);\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: function (a, b, ignore) {\n if (ignore) {\n a = '(' + a + ' || \\'\\').toLowerCase()';\n if (b) {\n b = b.toLowerCase();\n }\n }\n if (b) {\n b = quote(b);\n }\n return a + '.lastIndexOf(\\'' + b + '\\', 0) == 0';\n },\n doesnotstartwith: function (a, b, ignore) {\n if (ignore) {\n a = '(' + a + ' || \\'\\').toLowerCase()';\n if (b) {\n b = b.toLowerCase();\n }\n }\n if (b) {\n b = quote(b);\n }\n return a + '.lastIndexOf(\\'' + b + '\\', 0) == -1';\n },\n endswith: function (a, b, ignore) {\n if (ignore) {\n a = '(' + a + ' || \\'\\').toLowerCase()';\n if (b) {\n b = b.toLowerCase();\n }\n }\n if (b) {\n b = quote(b);\n }\n return a + '.indexOf(\\'' + b + '\\', ' + a + '.length - ' + (b || '').length + ') >= 0';\n },\n doesnotendwith: function (a, b, ignore) {\n if (ignore) {\n a = '(' + a + ' || \\'\\').toLowerCase()';\n if (b) {\n b = b.toLowerCase();\n }\n }\n if (b) {\n b = quote(b);\n }\n return a + '.indexOf(\\'' + b + '\\', ' + a + '.length - ' + (b || '').length + ') < 0';\n },\n contains: function (a, b, ignore) {\n if (ignore) {\n a = '(' + a + ' || \\'\\').toLowerCase()';\n if (b) {\n b = b.toLowerCase();\n }\n }\n if (b) {\n b = quote(b);\n }\n return a + '.indexOf(\\'' + b + '\\') >= 0';\n },\n doesnotcontain: function (a, b, ignore) {\n if (ignore) {\n a = '(' + a + ' || \\'\\').toLowerCase()';\n if (b) {\n b = b.toLowerCase();\n }\n }\n if (b) {\n b = quote(b);\n }\n return a + '.indexOf(\\'' + b + '\\') == -1';\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 || ' + a + ' === undefined)';\n },\n isnotnull: function (a) {\n return '(' + a + ' !== null && ' + a + ' !== undefined)';\n }\n };\n }();\n function Query(data) {\n this.data = data || [];\n }\n Query.filterExpr = function (expression) {\n var expressions = [], logic = {\n and: ' && ',\n or: ' || '\n }, idx, length, filter, expr, fieldFunctions = [], operatorFunctions = [], field, operator, filters = expression.filters;\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n operator = filter.operator;\n if (filter.filters) {\n expr = Query.filterExpr(filter);\n filter = expr.expression.replace(/__o\\[(\\d+)\\]/g, function (match, index) {\n index = +index;\n return '__o[' + (operatorFunctions.length + index) + ']';\n }).replace(/__f\\[(\\d+)\\]/g, function (match, index) {\n index = +index;\n return '__f[' + (fieldFunctions.length + index) + ']';\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 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);\n }\n }\n expressions.push(filter);\n }\n return {\n expression: '(' + expressions.join(logic[expression.logic]) + ')',\n fields: fieldFunctions,\n operators: operatorFunctions\n };\n };\n function normalizeSort(field, dir) {\n if (field) {\n var descriptor = typeof field === STRING ? {\n field: field,\n dir: dir\n } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n return grep(descriptors, function (d) {\n return !!d.dir;\n });\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 function normalizeOperator(expression) {\n var idx, length, filter, operator, filters = expression.filters;\n if (filters) {\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n operator = filter.operator;\n if (operator && typeof operator === STRING) {\n filter.operator = operatorMap[operator.toLowerCase()] || operator;\n }\n normalizeOperator(filter);\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 normalizeOperator(expression);\n return expression;\n }\n }\n Query.normalizeFilter = normalizeFilter;\n function compareDescriptor(f1, f2) {\n if (f1.logic || f2.logic) {\n return false;\n }\n return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n }\n function normalizeDescriptor(filter) {\n filter = filter || {};\n if (isEmptyObject(filter)) {\n return {\n logic: 'and',\n filters: []\n };\n }\n return normalizeFilter(filter);\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 function compareFilters(expr1, expr2) {\n expr1 = normalizeDescriptor(expr1);\n expr2 = normalizeDescriptor(expr2);\n if (expr1.logic !== expr2.logic) {\n return false;\n }\n var f1, f2;\n var filters1 = (expr1.filters || []).slice();\n var filters2 = (expr2.filters || []).slice();\n if (filters1.length !== filters2.length) {\n return false;\n }\n filters1 = filters1.sort(fieldComparer);\n filters2 = filters2.sort(fieldComparer);\n for (var idx = 0; idx < filters1.length; idx++) {\n f1 = filters1[idx];\n f2 = filters2[idx];\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 return true;\n }\n Query.compareFilters = compareFilters;\n function normalizeAggregate(expressions) {\n return isArray(expressions) ? expressions : [expressions];\n }\n function normalizeGroup(field, dir) {\n var descriptor = typeof field === STRING ? {\n field: field,\n dir: dir\n } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n return map(descriptors, function (d) {\n return {\n field: d.field,\n dir: d.dir || 'asc',\n aggregates: d.aggregates\n };\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) {\n var sort = { dir: dir };\n if (selector) {\n if (selector.compare) {\n sort.compare = selector.compare;\n } else {\n sort.field = selector;\n }\n }\n return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n },\n orderBy: function (selector) {\n return this.order(selector, 'asc');\n },\n orderByDescending: function (selector) {\n return this.order(selector, 'desc');\n },\n sort: function (field, dir, comparer) {\n var idx, length, descriptors = normalizeSort(field, dir), comparers = [];\n comparer = comparer || Comparer;\n if (descriptors.length) {\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\n comparers.push(comparer.create(descriptors[idx]));\n }\n return this.orderBy({ compare: comparer.combine(comparers) });\n }\n return this;\n },\n filter: function (expressions) {\n var idx, current, length, compiled, predicate, data = this.data, fields, operators, result = [], filter;\n expressions = normalizeFilter(expressions);\n if (!expressions || expressions.filters.length === 0) {\n return this;\n }\n compiled = Query.filterExpr(expressions);\n fields = compiled.fields;\n operators = compiled.operators;\n predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n if (fields.length || operators.length) {\n filter = function (d) {\n return predicate(d, fields, operators);\n };\n }\n for (idx = 0, length = data.length; idx < length; idx++) {\n current = data[idx];\n if (filter(current)) {\n result.push(current);\n }\n }\n return new Query(result);\n },\n group: function (descriptors, allData) {\n descriptors = normalizeGroup(descriptors || []);\n allData = allData || this.data;\n var that = this, result = new Query(that.data), descriptor;\n if (descriptors.length > 0) {\n descriptor = descriptors[0];\n result = result.groupBy(descriptor).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 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 return result;\n },\n groupBy: function (descriptor) {\n if (isEmptyObject(descriptor) || !this.data.length) {\n return new Query([]);\n }\n var field = descriptor.field, sorted = this._sortForGrouping(field, descriptor.dir || 'asc'), accessor = kendo.accessor(field), item, groupValue = accessor.get(sorted[0], field), group = {\n field: field,\n value: groupValue,\n items: []\n }, currentValue, idx, len, result = [group];\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 return new Query(result);\n },\n _sortForGrouping: function (field, dir) {\n var idx, length, data = this.data;\n if (!stableSort) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n data[idx].__position = idx;\n }\n data = new Query(data).sort(field, dir, StableComparer).toArray();\n for (idx = 0, length = data.length; idx < length; idx++) {\n delete data[idx].__position;\n }\n return data;\n }\n return this.sort(field, dir).toArray();\n },\n aggregate: function (aggregates) {\n var idx, len, result = {}, state = {};\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 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 function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n aggregates = aggregates || [];\n var idx, aggr, functionName, len = aggregates.length;\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 var functions = {\n sum: function (accumulator, item, accessor) {\n var value = accessor.get(item);\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\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 if (state.count === undefined) {\n state.count = 0;\n }\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n if (isNumber(value)) {\n state.count++;\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 if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\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 if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n }\n };\n function isNumber(val) {\n return typeof val === 'number' && !isNaN(val);\n }\n function isDate(val) {\n return val && val.getTime;\n }\n function toJSON(array) {\n var idx, length = array.length, result = new Array(length);\n for (idx = 0; idx < length; idx++) {\n result[idx] = array[idx].toJSON();\n }\n return result;\n }\n Query.process = function (data, options) {\n options = options || {};\n var query = new Query(data), group = options.group, sort = normalizeGroup(group || []).concat(normalizeSort(options.sort || [])), total, filterCallback = options.filterCallback, filter = options.filter, skip = options.skip, take = options.take;\n if (filter) {\n query = query.filter(filter);\n if (filterCallback) {\n query = filterCallback(query);\n }\n total = query.toArray().length;\n }\n if (sort) {\n query = query.sort(sort);\n if (group) {\n data = query.toArray();\n }\n }\n if (skip !== undefined && take !== undefined) {\n query = query.range(skip, take);\n }\n if (group) {\n query = query.group(group, data);\n }\n return {\n total: total,\n data: query.toArray()\n };\n };\n var LocalTransport = Class.extend({\n init: function (options) {\n this.data = options.data;\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 var RemoteTransport = Class.extend({\n init: function (options) {\n var that = this, parameterMap;\n options = that.options = extend({}, that.options, options);\n each(crud, function (index, type) {\n if (typeof options[type] === STRING) {\n options[type] = { url: options[type] };\n }\n });\n that.cache = options.cache ? Cache.create(options.cache) : {\n find: noop,\n add: noop\n };\n parameterMap = options.parameterMap;\n if (isFunction(options.push)) {\n that.push = options.push;\n }\n if (!that.push) {\n that.push = identity;\n }\n that.parameterMap = isFunction(parameterMap) ? parameterMap : function (options) {\n var result = {};\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 result[option] = value;\n });\n return result;\n };\n },\n options: { parameterMap: identity },\n create: function (options) {\n return ajax(this.setup(options, CREATE));\n },\n read: function (options) {\n var that = this, success, error, result, cache = that.cache;\n options = that.setup(options, READ);\n success = options.success || noop;\n error = options.error || noop;\n result = cache.find(options.data);\n if (result !== undefined) {\n success(result);\n } else {\n options.success = function (result) {\n cache.add(options.data, result);\n success(result);\n };\n $.ajax(options);\n }\n },\n update: function (options) {\n return ajax(this.setup(options, UPDATE));\n },\n destroy: function (options) {\n return ajax(this.setup(options, DESTROY));\n },\n setup: function (options, type) {\n options = options || {};\n var that = this, parameters, operation = that.options[type], data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n options = extend(true, {}, operation, options);\n parameters = extend(true, {}, data, options.data);\n options.data = that.parameterMap(parameters, type);\n if (isFunction(options.url)) {\n options.url = options.url(parameters);\n }\n return options;\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 Cache.create = function (options) {\n var store = {\n 'inmemory': function () {\n return new Cache();\n }\n };\n if (isPlainObject(options) && isFunction(options.find)) {\n return options;\n }\n if (options === true) {\n return new Cache();\n }\n return store[options]();\n };\n function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record, getter, originalName, idx, setters = {}, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n originalName = fieldNames[getter];\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 function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record, getter, originalName, idx, length;\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 originalName = fieldNames[getter];\n if (originalName && originalName !== getter) {\n delete record[originalName];\n }\n }\n }\n }\n function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record, idx, fieldName, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n fieldName = originalFieldNames[record.field];\n if (fieldName && fieldName != record.field) {\n record.field = fieldName;\n }\n record.value = modelInstance._parse(record.field, record.value);\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 function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n return function (data) {\n data = originalFunction(data);\n if (data && !isEmptyObject(getters)) {\n if (toString.call(data) !== '[object Array]' && !(data instanceof ObservableArray)) {\n data = [data];\n }\n converter(data, getters, new model(), originalFieldNames, fieldNames);\n }\n return data || [];\n };\n }\n var DataReader = Class.extend({\n init: function (schema) {\n var that = this, member, get, model, base;\n schema = schema || {};\n for (member in schema) {\n get = schema[member];\n that[member] = typeof get === STRING ? getter(get) : get;\n }\n base = schema.modelBase || Model;\n if (isPlainObject(that.model)) {\n that.model = model = base.define(that.model);\n }\n var dataFunction = proxy(that.data, that);\n that._dataAccessFunction = dataFunction;\n if (that.model) {\n var groupsFunction = proxy(that.groups, that), serializeFunction = proxy(that.serialize, that), originalFieldNames = {}, getters = {}, serializeGetters = {}, fieldNames = {}, shouldSerialize = false, fieldName;\n model = that.model;\n if (model.fields) {\n each(model.fields, function (field, value) {\n var fromName;\n fieldName = field;\n if (isPlainObject(value) && value.field) {\n fieldName = value.field;\n } else if (typeof value === STRING) {\n fieldName = value;\n }\n if (isPlainObject(value) && value.from) {\n fromName = value.from;\n }\n shouldSerialize = shouldSerialize || fromName && fromName !== field || fieldName !== field;\n getters[field] = getter(fromName || fieldName);\n serializeGetters[field] = getter(field);\n originalFieldNames[fromName || fieldName] = field;\n fieldNames[field] = fromName || fieldName;\n });\n if (!schema.serialize && shouldSerialize) {\n that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n }\n }\n that._dataAccessFunction = dataFunction;\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 function mergeGroups(target, dest, skip, take) {\n var group, idx = 0, items;\n while (dest.length && take) {\n group = dest[idx];\n items = group.items;\n var length = items.length;\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 if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n }\n if (items.length === 0) {\n skip -= length;\n } else {\n skip = 0;\n take -= items.length;\n }\n if (++idx >= dest.length) {\n break;\n }\n }\n if (idx < dest.length) {\n dest.splice(idx, dest.length - idx);\n }\n }\n function flattenGroups(data) {\n var idx, result = [], length, items, itemIndex;\n for (idx = 0, length = data.length; idx < length; idx++) {\n var group = data.at(idx);\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 return result;\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.hasSubgroups) {\n wrapGroupItems(group.items, model);\n } else {\n group.items = new LazyObservableArray(group.items, model);\n }\n }\n }\n }\n function eachGroupItems(data, func) {\n for (var idx = 0, length = data.length; idx < 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 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 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 function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n var item = view[viewIndex];\n if (!item || item instanceof type) {\n continue;\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 function removeModel(data, model) {\n var idx, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n var dataItem = data.at(idx);\n if (dataItem.uid == model.uid) {\n data.splice(idx, 1);\n return dataItem;\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 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 function indexOf(data, comparer) {\n var idx, length;\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (comparer(data[idx])) {\n return idx;\n }\n }\n return -1;\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 if (isFunction(fieldName)) {\n return name;\n }\n return fieldName;\n }\n return name;\n }\n function convertFilterDescriptorsField(descriptor, model) {\n var idx, length, target = {};\n for (var field in descriptor) {\n if (field !== 'filters') {\n target[field] = descriptor[field];\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 function convertDescriptorsField(descriptors, model) {\n var idx, length, result = [], target, descriptor;\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\n target = {};\n descriptor = descriptors[idx];\n for (var field in descriptor) {\n target[field] = descriptor[field];\n }\n target.field = fieldNameFromModel(model.fields, target.field);\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 var DataSource = Observable.extend({\n init: function (options) {\n var that = this, model, data;\n if (options) {\n data = options.data;\n }\n options = that.options = extend({}, that.options, options);\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._filter = normalizeFilter(options.filter);\n that._group = normalizeGroup(options.group);\n that._aggregate = options.aggregate;\n that._total = options.total;\n that._shouldDetachObservableParents = true;\n Observable.fn.init.call(that);\n that.transport = Transport.create(options, data, that);\n if (isFunction(that.transport.push)) {\n that.transport.push({\n pushCreate: proxy(that._pushCreate, that),\n pushUpdate: proxy(that._pushUpdate, that),\n pushDestroy: proxy(that._pushDestroy, that)\n });\n }\n if (options.offlineStorage != null) {\n if (typeof options.offlineStorage == 'string') {\n var key = options.offlineStorage;\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 that.reader = new kendo.data.readers[options.schema.type || 'json'](options.schema);\n model = that.reader.model || {};\n that._detachObservableParents();\n that._data = that._observe(that._data);\n that._online = true;\n that.bind([\n 'push',\n ERROR,\n CHANGE,\n REQUESTSTART,\n SYNC,\n REQUESTEND,\n PROGRESS\n ], options);\n },\n options: {\n data: null,\n schema: { modelBase: Model },\n offlineStorage: null,\n serverSorting: false,\n serverPaging: false,\n serverFiltering: false,\n serverGrouping: false,\n serverAggregates: false,\n batch: false\n },\n clone: function () {\n return this;\n },\n online: function (value) {\n if (value !== undefined) {\n if (this._online != value) {\n this._online = value;\n if (value) {\n return this.sync();\n }\n }\n return $.Deferred().resolve().promise();\n } else {\n return this._online;\n }\n },\n offlineData: function (state) {\n if (this.options.offlineStorage == null) {\n return null;\n }\n if (state !== undefined) {\n return this._storage.setItem(state);\n }\n return this._storage.getItem() || [];\n },\n _isServerGrouped: function () {\n var group = this.group() || [];\n return this.options.serverGrouping && group.length;\n },\n _pushCreate: function (result) {\n this._push(result, 'pushCreate');\n },\n _pushUpdate: function (result) {\n this._push(result, 'pushUpdate');\n },\n _pushDestroy: function (result) {\n this._push(result, 'pushDestroy');\n },\n _push: function (result, operation) {\n var data = this._readData(result);\n if (!data) {\n data = result;\n }\n this[operation](data);\n },\n _flatData: function (data, skip) {\n if (data) {\n if (this._isServerGrouped()) {\n return flattenGroups(data);\n }\n if (!skip) {\n for (var idx = 0; idx < data.length; idx++) {\n data.at(idx);\n }\n }\n }\n return data;\n },\n parent: noop,\n get: function (id) {\n var idx, length, data = this._flatData(this._data);\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].id == id) {\n return data[idx];\n }\n }\n },\n getByUid: function (id) {\n var idx, length, data = this._flatData(this._data);\n if (!data) {\n return;\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 indexOf: function (model) {\n return indexOfModel(this._data, model);\n },\n at: function (index) {\n return this._data.at(index);\n },\n data: function (value) {\n var that = this;\n if (value !== undefined) {\n that._detachObservableParents();\n that._data = this._observe(value);\n that._pristineData = value.slice(0);\n that._storeData();\n that._ranges = [];\n that.trigger('reset');\n that._addRange(that._data);\n that._total = that._data.length;\n that._pristineTotal = that._total;\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 return that._data;\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 _observeView: function (data) {\n var that = this;\n replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n var view = new LazyObservableArray(data, that.reader.model);\n view.parent = function () {\n return that.parent();\n };\n return view;\n },\n flatView: function () {\n var groups = this.group() || [];\n if (groups.length) {\n return flattenGroups(this._view);\n } else {\n return this._view;\n }\n },\n add: function (model) {\n return this.insert(this._data.length, model);\n },\n _createNewModel: function (model) {\n if (this.reader.model) {\n return new this.reader.model(model);\n }\n if (model instanceof ObservableObject) {\n return model;\n }\n return new ObservableObject(model);\n },\n insert: function (index, model) {\n if (!model) {\n model = index;\n index = 0;\n }\n if (!(model instanceof Model)) {\n model = this._createNewModel(model);\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 return model;\n },\n pushCreate: function (items) {\n if (!isArray(items)) {\n items = [items];\n }\n var pushed = [];\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 result = this.add(item);\n pushed.push(result);\n var pristine = result.toJSON();\n if (this._isServerGrouped()) {\n pristine = this._wrapInEmptyGroup(pristine);\n }\n this._pristineData.push(pristine);\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n if (pushed.length) {\n this.trigger('push', {\n type: 'create',\n items: pushed\n });\n }\n },\n pushUpdate: function (items) {\n if (!isArray(items)) {\n items = [items];\n }\n var pushed = [];\n for (var idx = 0; idx < items.length; idx++) {\n var item = items[idx];\n var model = this._createNewModel(item);\n var target = this.get(model.id);\n if (target) {\n pushed.push(target);\n target.accept(item);\n target.trigger(CHANGE);\n this._updatePristineForModel(target, item);\n } else {\n this.pushCreate(item);\n }\n }\n if (pushed.length) {\n this.trigger('push', {\n type: 'update',\n items: pushed\n });\n }\n },\n pushDestroy: function (items) {\n var pushed = this._removeItems(items);\n if (pushed.length) {\n this.trigger('push', {\n type: 'destroy',\n items: pushed\n });\n }\n },\n _removeItems: function (items) {\n if (!isArray(items)) {\n items = [items];\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 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 if (found) {\n this._removePristineForModel(model);\n this._destroyed.pop();\n }\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n return destroyed;\n },\n remove: function (model) {\n var result, that = this, hasGroups = that._isServerGrouped();\n this._eachItem(that._data, function (items) {\n result = removeModel(items, model);\n if (result && hasGroups) {\n if (!result.isNew || !result.isNew()) {\n that._destroyed.push(result);\n }\n return true;\n }\n });\n this._removeModelFromRanges(model);\n this._updateRangesLength();\n return model;\n },\n destroyed: function () {\n return this._destroyed;\n },\n created: function () {\n var idx, length, result = [], data = this._flatData(this._data);\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 updated: function () {\n var idx, length, result = [], data = this._flatData(this._data);\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 sync: function () {\n var that = this, created = [], updated = [], destroyed = that._destroyed;\n var promise = $.Deferred().resolve().promise();\n if (that.online()) {\n if (!that.reader.model) {\n return promise;\n }\n created = that.created();\n updated = that.updated();\n var promises = [];\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 promise = $.when.apply(null, promises).then(function () {\n var idx, length;\n for (idx = 0, length = arguments.length; idx < length; idx++) {\n if (arguments[idx]) {\n that._accept(arguments[idx]);\n }\n }\n that._storeData(true);\n that._change({ action: 'sync' });\n that.trigger(SYNC);\n });\n } else {\n that._storeData(true);\n that._change({ action: 'sync' });\n }\n return promise;\n },\n cancelChanges: function (model) {\n var that = this;\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 that._ranges = [];\n that._addRange(that._data);\n that._change();\n that._markOfflineUpdatesAsDirty();\n }\n },\n _markOfflineUpdatesAsDirty: function () {\n var that = this;\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 hasChanges: function () {\n var idx, length, data = this._flatData(this._data);\n if (this._destroyed.length) {\n return true;\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 return false;\n },\n _accept: function (result) {\n var that = this, models = result.models, response = result.response, idx = 0, serverGroup = that._isServerGrouped(), pristine = that._pristineData, type = result.type, length;\n that.trigger(REQUESTEND, {\n response: response,\n type: type\n });\n if (response && !isEmptyObject(response)) {\n response = that.reader.parse(response);\n if (that._handleCustomErrors(response)) {\n return;\n }\n response = that.reader.data(response);\n if (!isArray(response)) {\n response = [response];\n }\n } else {\n response = $.map(models, function (model) {\n return model.toJSON();\n });\n }\n if (type === 'destroy') {\n that._destroyed = [];\n }\n for (idx = 0, length = models.length; idx < length; idx++) {\n if (type !== 'destroy') {\n models[idx].accept(response[idx]);\n if (type === 'create') {\n pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx]) : 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 _updatePristineForModel: function (model, values) {\n this._executeOnPristineForModel(model, function (index, items) {\n kendo.deepExtend(items[index], values);\n });\n },\n _executeOnPristineForModel: function (model, callback) {\n this._eachPristineItem(function (items) {\n var index = indexOfPristineModel(items, model);\n if (index > -1) {\n callback(index, items);\n return true;\n }\n });\n },\n _removePristineForModel: function (model) {\n this._executeOnPristineForModel(model, function (index, items) {\n items.splice(index, 1);\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 _eachPristineItem: function (callback) {\n this._eachItem(this._pristineData, callback);\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 _pristineForModel: function (model) {\n var pristine, idx, callback = function (items) {\n idx = indexOfPristineModel(items, model);\n if (idx > -1) {\n pristine = items[idx];\n return true;\n }\n };\n this._eachPristineItem(callback);\n return pristine;\n },\n _cancelModel: function (model) {\n var pristine = this._pristineForModel(model);\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 if (pristine.__state__ == 'update') {\n items[idx].dirty = true;\n }\n } else {\n items.splice(idx, 1);\n }\n }\n });\n },\n _submit: function (promises, data) {\n var that = this;\n that.trigger(REQUESTSTART, { type: 'submit' });\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 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 that.error(response, status, error);\n }\n }, data));\n },\n _sendSubmit: function (created, updated, destroyed) {\n var that = this, promises = [];\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 if (updated.length) {\n promises.push($.Deferred(function (deferred) {\n deferred.type = 'update';\n deferred.models = updated;\n }));\n }\n if (destroyed.length) {\n promises.push($.Deferred(function (deferred) {\n deferred.type = 'destroy';\n deferred.models = destroyed;\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 return promises;\n },\n _promise: function (data, models, type) {\n var that = this;\n return $.Deferred(function (deferred) {\n that.trigger(REQUESTSTART, { type: type });\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 _send: function (method, data) {\n var that = this, idx, length, promises = [], converted = that.reader.serialize(toJSON(data));\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 return promises;\n },\n read: function (data) {\n var that = this, params = that._params(data);\n var deferred = $.Deferred();\n that._queueRequest(params, function () {\n var isPrevented = that.trigger(REQUESTSTART, { type: 'read' });\n if (!isPrevented) {\n that.trigger(PROGRESS);\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 deferred.resolve();\n },\n error: function () {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n deferred.reject.apply(deferred, args);\n }\n });\n } else if (that.options.offlineStorage != null) {\n that.success(that.offlineData(), params);\n deferred.resolve();\n }\n } else {\n that._dequeueRequest();\n deferred.resolve(isPrevented);\n }\n });\n return deferred.promise();\n },\n _readAggregates: function (data) {\n return this.reader.aggregates(data);\n },\n success: function (data) {\n var that = this, options = that.options;\n that.trigger(REQUESTEND, {\n response: data,\n type: 'read'\n });\n if (that.online()) {\n data = that.reader.parse(data);\n if (that._handleCustomErrors(data)) {\n that._dequeueRequest();\n return;\n }\n that._total = that.reader.total(data);\n if (that._aggregate && options.serverAggregates) {\n that._aggregateResult = that._readAggregates(data);\n }\n data = that._readData(data);\n that._destroyed = [];\n } else {\n data = that._readData(data);\n var items = [];\n var itemIds = {};\n var model = that.reader.model;\n var idField = model ? model.idField : 'id';\n var idx;\n for (idx = 0; idx < this._destroyed.length; idx++) {\n var id = this._destroyed[idx][idField];\n itemIds[id] = id;\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._destroyed.push(this._createNewModel(item));\n }\n } else {\n items.push(item);\n }\n }\n data = items;\n that._total = data.length;\n }\n that._pristineTotal = that._total;\n that._pristineData = data.slice(0);\n that._detachObservableParents();\n that._data = that._observe(data);\n that._markOfflineUpdatesAsDirty();\n that._storeData();\n that._addRange(that._data);\n that._process(that._data);\n that._dequeueRequest();\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 _storeData: function (updatePristine) {\n var serverGrouping = this._isServerGrouped();\n var model = this.reader.model;\n function items(data) {\n var state = [];\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data.at(idx);\n var item = dataItem.toJSON();\n if (serverGrouping && dataItem.items) {\n item.items = items(dataItem.items);\n } else {\n item.uid = dataItem.uid;\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 return state;\n }\n if (this.options.offlineStorage != null) {\n var state = items(this._data);\n var destroyed = [];\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 this.offlineData(state.concat(destroyed));\n if (updatePristine) {\n this._pristineData = this._readData(state);\n }\n }\n },\n _addRange: function (data) {\n var that = this, start = that._skip || 0, end = start + that._flatData(data, true).length;\n that._ranges.push({\n start: start,\n end: end,\n data: data,\n timestamp: new Date().getTime()\n });\n that._ranges.sort(function (x, y) {\n return x.start - y.start;\n });\n },\n error: function (xhr, status, errorThrown) {\n this._dequeueRequest();\n this.trigger(REQUESTEND, {});\n this.trigger(ERROR, {\n xhr: xhr,\n status: status,\n errorThrown: errorThrown\n });\n },\n _params: function (data) {\n var that = this, 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 }, data);\n if (!that.options.serverPaging) {\n delete options.take;\n delete options.skip;\n delete options.page;\n delete options.pageSize;\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 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 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 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 return options;\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 = {\n callback: proxy(callback, that),\n 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 _handleCustomErrors: function (response) {\n if (this.reader.errors) {\n var errors = this.reader.errors(response);\n if (errors) {\n this.trigger(ERROR, {\n xhr: null,\n status: 'customerror',\n errorThrown: 'custom error',\n errors: errors\n });\n return true;\n }\n }\n return false;\n },\n _shouldWrap: function (data) {\n var model = this.reader.model;\n if (model && data.length) {\n return !(data[0] instanceof model);\n }\n return false;\n },\n _observe: function (data) {\n var that = this, model = that.reader.model;\n that._shouldDetachObservableParents = true;\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 () {\n return that.parent();\n };\n }\n if (that._isServerGrouped()) {\n wrapGroupItems(data, model);\n }\n if (that._changeHandler && that._data && that._data instanceof ObservableArray) {\n that._data.unbind(CHANGE, that._changeHandler);\n } else {\n that._changeHandler = proxy(that._change, that);\n }\n return data.bind(CHANGE, that._changeHandler);\n },\n _updateTotalForAction: function (action, items) {\n var that = this;\n var total = parseInt(that._total, 10);\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 that._total = total;\n },\n _change: function (e) {\n var that = this, idx, length, action = e ? e.action : '';\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._destroyed.push(e.items[idx]);\n }\n }\n }\n if (that.options.autoSync && (action === 'add' || action === 'remove' || action === 'itemchange')) {\n var handler = function (args) {\n if (args.action === 'sync') {\n that.unbind('change', handler);\n that._updateTotalForAction(action, e.items);\n }\n };\n that.first('change', handler);\n that.sync();\n } else {\n that._updateTotalForAction(action, e ? e.items : []);\n that._process(that._data, e);\n }\n },\n _calculateAggregates: function (data, options) {\n options = options || {};\n var query = new Query(data), aggregates = options.aggregate, filter = options.filter;\n if (filter) {\n query = query.filter(filter);\n }\n return query.aggregate(aggregates);\n },\n _process: function (data, e) {\n var that = this, options = {}, result;\n if (that.options.serverPaging !== true) {\n options.skip = that._skip;\n options.take = that._take || that._pageSize;\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.serverSorting !== true) {\n options.sort = that._sort;\n }\n if (that.options.serverFiltering !== true) {\n options.filter = that._filter;\n }\n if (that.options.serverGrouping !== true) {\n options.group = that._group;\n }\n if (that.options.serverAggregates !== true) {\n options.aggregate = that._aggregate;\n that._aggregateResult = that._calculateAggregates(data, options);\n }\n result = that._queryProcess(data, options);\n that.view(result.data);\n if (result.total !== undefined && !that.options.serverFiltering) {\n that._total = result.total;\n }\n e = e || {};\n e.items = e.items || that._view;\n that.trigger(CHANGE, e);\n },\n _queryProcess: function (data, options) {\n return Query.process(data, options);\n },\n _mergeState: function (options) {\n var that = this;\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 if (that._skip === undefined) {\n that._skip = that._currentRangeStart = that.skip();\n options.skip = that.skip();\n }\n if (that._take === undefined && that._pageSize !== undefined) {\n that._take = that._pageSize;\n options.take = that._take;\n }\n if (options.sort) {\n that._sort = options.sort = normalizeSort(options.sort);\n }\n if (options.filter) {\n that._filter = options.filter = normalizeFilter(options.filter);\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 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 if (remote || (this._data === undefined || this._data.length === 0) && !this._destroyed.length) {\n return this.read(this._mergeState(options));\n }\n var isPrevented = this.trigger(REQUESTSTART, { type: 'read' });\n if (!isPrevented) {\n this.trigger(PROGRESS);\n result = this._queryProcess(this._data, this._mergeState(options));\n if (!this.options.serverFiltering) {\n if (result.total !== undefined) {\n this._total = result.total;\n } else {\n this._total = this._data.length;\n }\n }\n this._aggregateResult = this._calculateAggregates(this._data, options);\n this.view(result.data);\n this.trigger(REQUESTEND, { type: 'read' });\n this.trigger(CHANGE, { items: result.data });\n }\n return $.Deferred().resolve(isPrevented).promise();\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 return this._query().then(fn);\n },\n _query: function (options) {\n var that = this;\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 next: function (options) {\n var that = this, page = that.page(), total = that.total();\n options = options || {};\n if (!page || total && page + 1 > that.totalPages()) {\n return;\n }\n that._skip = that._currentRangeStart = page * that.take();\n page += 1;\n options.page = page;\n that._query(options);\n return page;\n },\n prev: function (options) {\n var that = this, page = that.page();\n options = options || {};\n if (!page || page === 1) {\n return;\n }\n that._skip = that._currentRangeStart = that._skip - that.take();\n page -= 1;\n options.page = page;\n that._query(options);\n return page;\n },\n page: function (val) {\n var that = this, skip;\n if (val !== undefined) {\n val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n that._query({ page: val });\n return;\n }\n skip = that.skip();\n return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n },\n pageSize: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query({\n pageSize: val,\n page: 1\n });\n return;\n }\n return that.take();\n },\n sort: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query({ sort: val });\n return;\n }\n return that._sort;\n },\n filter: function (val) {\n var that = this;\n if (val === undefined) {\n return that._filter;\n }\n that.trigger('reset');\n that._query({\n filter: val,\n page: 1\n });\n },\n group: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query({ group: val });\n return;\n }\n return that._group;\n },\n total: function () {\n return parseInt(this._total || 0, 10);\n },\n aggregate: function (val) {\n var that = this;\n if (val !== undefined) {\n that._query({ aggregate: val });\n return;\n }\n return that._aggregate;\n },\n aggregates: function () {\n var result = this._aggregateResult;\n if (isEmptyObject(result)) {\n result = this._emptyAggregates(this.aggregate());\n }\n return result;\n },\n _emptyAggregates: function (aggregates) {\n var result = {};\n if (!isEmptyObject(aggregates)) {\n var aggregate = {};\n if (!isArray(aggregates)) {\n aggregates = [aggregates];\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 return result;\n },\n _wrapInEmptyGroup: function (model) {\n var groups = this.group(), parent, group, idx, length;\n for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n group = groups[idx];\n parent = {\n value: model.get(group.field),\n field: group.field,\n items: parent ? [parent] : [model],\n hasSubgroups: !!parent,\n aggregates: this._emptyAggregates(group.aggregates)\n };\n }\n return parent;\n },\n totalPages: function () {\n var that = this, pageSize = that.pageSize() || that.total();\n return math.ceil((that.total() || 0) / pageSize);\n },\n inRange: function (skip, take) {\n var that = this, end = math.min(skip + take, that.total());\n if (!that.options.serverPaging && that._data.length > 0) {\n return true;\n }\n return that._findRange(skip, end).length > 0;\n },\n lastRange: function () {\n var ranges = this._ranges;\n return ranges[ranges.length - 1] || {\n start: 0,\n end: 0,\n 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 enableRequestsInProgress: function () {\n this._skipRequestsInProgress = false;\n },\n _timeStamp: function () {\n return new Date().getTime();\n },\n range: function (skip, take) {\n this._currentRequestTimeStamp = this._timeStamp();\n this._skipRequestsInProgress = true;\n skip = math.min(skip || 0, this.total());\n var that = this, pageSkip = math.max(math.floor(skip / take), 0) * take, size = math.min(pageSkip + take, that.total()), data;\n data = that._findRange(skip, math.min(skip + take, that.total()));\n if (data.length) {\n that._pending = undefined;\n that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n that._currentRangeStart = skip;\n that._take = take;\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 if (paging) {\n that._detachObservableParents();\n that._data = data = that._observe(data);\n }\n that._process(data);\n } finally {\n that.options.serverPaging = paging;\n that.options.serverSorting = sorting;\n that.options.serverFiltering = filtering;\n that.options.serverAggregates = aggregates;\n }\n return;\n }\n if (take !== undefined) {\n if (!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);\n });\n } else {\n that.range(skip, take);\n }\n });\n } else if (pageSkip < skip) {\n that.prefetch(size, take, function () {\n that.range(skip, take);\n });\n }\n }\n },\n _findRange: function (start, end) {\n var that = this, ranges = that._ranges, range, data = [], skipIdx, takeIdx, startIndex, endIndex, rangeData, rangeEnd, processed, options = that.options, remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates, flatData, count, length;\n for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n range = ranges[skipIdx];\n if (start >= range.start && start <= range.end) {\n count = 0;\n for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n range = ranges[takeIdx];\n flatData = that._flatData(range.data, true);\n if (flatData.length && start + count >= range.start) {\n rangeData = range.data;\n rangeEnd = range.end;\n if (!remote) {\n var sort = normalizeGroup(that.group() || []).concat(normalizeSort(that.sort() || []));\n processed = that._queryProcess(range.data, {\n sort: sort,\n filter: that.filter()\n });\n flatData = rangeData = processed.data;\n if (processed.total !== undefined) {\n rangeEnd = processed.total;\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 if (end <= range.end && count == end - start) {\n return data;\n }\n }\n }\n break;\n }\n }\n return [];\n },\n _mergeGroups: function (data, range, skip, take) {\n if (this._isServerGrouped()) {\n var temp = range.toJSON(), prevGroup;\n if (data.length) {\n prevGroup = data[data.length - 1];\n }\n mergeGroups(prevGroup, temp, skip, take);\n return data.concat(temp);\n }\n return data.concat(range.slice(skip, take));\n },\n skip: function () {\n var that = this;\n if (that._skip === undefined) {\n return that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined;\n }\n return that._skip;\n },\n currentRangeStart: function () {\n return this._currentRangeStart || 0;\n },\n take: function () {\n return this._take || this._pageSize;\n },\n _prefetchSuccessHandler: function (skip, size, callback, force) {\n var that = this;\n var timestamp = that._timeStamp();\n return function (data) {\n var found = false, range = {\n start: skip,\n end: size,\n data: [],\n timestamp: that._timeStamp()\n }, idx, length, temp;\n that._dequeueRequest();\n that.trigger(REQUESTEND, {\n response: data,\n type: 'read'\n });\n data = that.reader.parse(data);\n temp = that._readData(data);\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 break;\n }\n }\n if (!found) {\n that._ranges.push(range);\n }\n }\n range.data = that._observe(temp);\n range.end = range.start + that._flatData(range.data, true).length;\n that._ranges.sort(function (x, y) {\n return x.start - y.start;\n });\n that._total = that.reader.total(data);\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 prefetch: function (skip, take, callback) {\n var that = this, size = math.min(skip + take, that.total()), 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 if (!that._rangeExists(skip, size)) {\n clearTimeout(that._timeout);\n that._timeout = setTimeout(function () {\n that._queueRequest(options, function () {\n if (!that.trigger(REQUESTSTART, { type: 'read' })) {\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 _multiplePrefetch: function (skip, take, callback) {\n var that = this, size = math.min(skip + take, that.total()), 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 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 _rangeExists: function (start, end) {\n var that = this, ranges = that._ranges, idx, length;\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 return false;\n },\n _removeModelFromRanges: function (model) {\n var result, found, range;\n for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n range = this._ranges[idx];\n this._eachItem(range.data, function (items) {\n result = removeModel(items, model);\n if (result) {\n found = true;\n }\n });\n if (found) {\n break;\n }\n }\n },\n _updateRangesLength: function () {\n var startOffset = 0, range, rangeLength;\n for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n range = this._ranges[idx];\n range.start = range.start - startOffset;\n rangeLength = this._flatData(range.data, true).length;\n startOffset = range.end - rangeLength;\n range.end = range.start + rangeLength;\n }\n }\n });\n var Transport = {};\n Transport.create = function (options, data, dataSource) {\n var transport, transportOptions = options.transport ? $.extend({}, options.transport) : null;\n if (transportOptions) {\n transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n if (options.type === 'jsdo') {\n transportOptions.dataSource = dataSource;\n }\n if (options.type) {\n kendo.data.transports = kendo.data.transports || {};\n kendo.data.schemas = kendo.data.schemas || {};\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 options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\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 DataSource.create = function (options) {\n if (isArray(options) || options instanceof ObservableArray) {\n options = { data: options };\n }\n var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, table = dataSource.table, select = dataSource.select, idx, length, model = {}, field;\n if (!data && fields && !dataSource.transport) {\n if (table) {\n data = inferTable(table, fields);\n } else if (select) {\n data = inferSelect(select, fields);\n if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n dataSource.group = 'optgroup';\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 if (!isEmptyObject(model)) {\n dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n }\n }\n dataSource.data = data;\n select = null;\n dataSource.select = null;\n table = null;\n dataSource.table = null;\n return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\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 var data = [];\n var idx, length;\n var optgroup;\n var option;\n var record;\n var value;\n for (idx = 0, length = options.length; idx < length; idx++) {\n record = {};\n option = options[idx];\n optgroup = option.parentNode;\n if (optgroup === select) {\n optgroup = null;\n }\n if (option.disabled || optgroup && optgroup.disabled) {\n continue;\n }\n if (optgroup) {\n record.optgroup = optgroup.label;\n }\n record[firstField.field] = option.text;\n value = option.attributes.value;\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n record[secondField.field] = value;\n data.push(record);\n }\n return data;\n }\n function inferTable(table, fields) {\n var tbody = $(table)[0].tBodies[0], rows = tbody ? tbody.rows : [], idx, length, fieldIndex, fieldCount = fields.length, data = [], cells, record, cell, empty;\n for (idx = 0, length = rows.length; idx < length; idx++) {\n record = {};\n empty = true;\n cells = rows[idx].cells;\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 return data;\n }\n var Node = Model.define({\n idField: 'id',\n init: function (value) {\n var that = this, hasChildren = that.hasChildren || value && value.hasChildren, childrenField = 'items', childrenOptions = {};\n kendo.data.Model.fn.init.call(that, value);\n if (typeof that.children === STRING) {\n childrenField = that.children;\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 if (typeof that.children !== STRING) {\n extend(childrenOptions, that.children);\n }\n childrenOptions.data = value;\n if (!hasChildren) {\n hasChildren = childrenOptions.schema.data;\n }\n if (typeof hasChildren === STRING) {\n hasChildren = kendo.getter(hasChildren);\n }\n if (isFunction(hasChildren)) {\n that.hasChildren = !!hasChildren.call(that, that);\n }\n that._childrenOptions = childrenOptions;\n if (that.hasChildren) {\n that._initChildren();\n }\n that._loaded = !!(value && value._loaded);\n },\n _initChildren: function () {\n var that = this;\n var children, transport, parameterMap;\n if (!(that.children instanceof HierarchicalDataSource)) {\n children = that.children = new HierarchicalDataSource(that._childrenOptions);\n transport = children.transport;\n parameterMap = transport.parameterMap;\n transport.parameterMap = function (data, type) {\n data[that.idField || 'id'] = that.id;\n if (parameterMap) {\n data = parameterMap(data, type);\n }\n return data;\n };\n children.parent = function () {\n return that;\n };\n children.bind(CHANGE, function (e) {\n e.node = e.node || that;\n that.trigger(CHANGE, e);\n });\n children.bind(ERROR, function (e) {\n var collection = that.parent();\n if (collection) {\n e.node = e.node || that;\n collection.trigger(ERROR, e);\n }\n });\n that._updateChildrenField();\n }\n },\n append: function (model) {\n this._initChildren();\n this.loaded(true);\n this.children.add(model);\n },\n hasChildren: false,\n level: function () {\n var parentNode = this.parentNode(), level = 0;\n while (parentNode && parentNode.parentNode) {\n level++;\n parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n }\n return level;\n },\n _updateChildrenField: function () {\n var fieldName = this._childrenOptions.schema.data;\n this[fieldName || 'items'] = this.children.data();\n },\n _childrenLoaded: function () {\n this._loaded = true;\n this._updateChildrenField();\n },\n load: function () {\n var options = {};\n var method = '_query';\n var children, promise;\n if (this.hasChildren) {\n this._initChildren();\n children = this.children;\n options[this.idField || 'id'] = this.id;\n if (!this._loaded) {\n children._data = undefined;\n method = 'read';\n }\n children.one(CHANGE, proxy(this._childrenLoaded, this));\n promise = children[method](options);\n } else {\n this.loaded(true);\n }\n return promise || $.Deferred().resolve().promise();\n },\n parentNode: function () {\n var array = this.parent();\n return array.parent();\n },\n loaded: function (value) {\n if (value !== undefined) {\n this._loaded = value;\n } else {\n return this._loaded;\n }\n },\n shouldSerialize: function (field) {\n return Model.fn.shouldSerialize.call(this, field) && field !== 'children' && field !== '_loaded' && field !== 'hasChildren' && field !== '_childrenOptions';\n }\n });\n function dataMethod(name) {\n return function () {\n var data = this._data, result = DataSource.fn[name].apply(this, slice.call(arguments));\n if (this._data != data) {\n this._attachBubbleHandlers();\n }\n return result;\n };\n }\n var HierarchicalDataSource = DataSource.extend({\n init: function (options) {\n var node = Node.define({ children: options });\n DataSource.fn.init.call(this, extend(true, {}, {\n schema: {\n modelBase: node,\n model: node\n }\n }, options));\n this._attachBubbleHandlers();\n },\n _attachBubbleHandlers: function () {\n var that = this;\n that._data.bind(ERROR, function (e) {\n that.trigger(ERROR, e);\n });\n },\n remove: function (node) {\n var parentNode = node.parentNode(), dataSource = this, result;\n if (parentNode && parentNode._initChildren) {\n dataSource = parentNode.children;\n }\n result = DataSource.fn.remove.call(dataSource, node);\n if (parentNode && !dataSource.data().length) {\n parentNode.hasChildren = false;\n }\n return result;\n },\n success: dataMethod('success'),\n data: dataMethod('data'),\n insert: function (index, model) {\n var parentNode = this.parent();\n if (parentNode && parentNode._initChildren) {\n parentNode.hasChildren = true;\n parentNode._initChildren();\n }\n return DataSource.fn.insert.call(this, index, model);\n },\n _find: function (method, value) {\n var idx, length, node, children;\n var data = this._data;\n if (!data) {\n return;\n }\n node = DataSource.fn[method].call(this, value);\n if (node) {\n return node;\n }\n data = this._flatData(this._data);\n for (idx = 0, length = data.length; idx < length; idx++) {\n children = data[idx].children;\n if (!(children instanceof HierarchicalDataSource)) {\n continue;\n }\n node = children[method](value);\n if (node) {\n return node;\n }\n }\n },\n get: function (id) {\n return this._find('get', id);\n },\n getByUid: function (uid) {\n return this._find('getByUid', uid);\n }\n });\n function inferList(list, fields) {\n var items = $(list).children(), idx, length, data = [], record, textField = fields[0].field, urlField = fields[1] && fields[1].field, spriteCssClassField = fields[2] && fields[2].field, imageUrlField = fields[3] && fields[3].field, item, id, textChild, className, children;\n function elements(collection, tagName) {\n return collection.filter(tagName).add(collection.find(tagName));\n }\n for (idx = 0, length = items.length; idx < length; idx++) {\n record = { _loaded: true };\n item = items.eq(idx);\n textChild = item[0].firstChild;\n children = item.children();\n list = children.filter('ul');\n children = children.filter(':not(ul)');\n id = item.attr('data-id');\n if (id) {\n record.id = id;\n }\n if (textChild) {\n record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n }\n if (urlField) {\n record[urlField] = elements(children, 'a').attr('href');\n }\n if (imageUrlField) {\n record[imageUrlField] = elements(children, 'img').attr('src');\n }\n if (spriteCssClassField) {\n className = elements(children, '.k-sprite').prop('className');\n record[spriteCssClassField] = className && $.trim(className.replace('k-sprite', ''));\n }\n if (list.length) {\n record.items = inferList(list.eq(0), fields);\n }\n if (item.attr('data-hasChildren') == 'true') {\n record.hasChildren = true;\n }\n data.push(record);\n }\n return data;\n }\n HierarchicalDataSource.create = function (options) {\n options = options && options.push ? { data: options } : options;\n var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, list = dataSource.list;\n if (data && data._dataSource) {\n return data._dataSource;\n }\n if (!data && fields && !dataSource.transport) {\n if (list) {\n data = inferList(list, fields);\n }\n }\n dataSource.data = data;\n return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n };\n var Buffer = kendo.Observable.extend({\n init: function (dataSource, viewSize, disablePrefetch) {\n kendo.Observable.fn.init.call(this);\n this._prefetching = false;\n this.dataSource = dataSource;\n this.prefetch = !disablePrefetch;\n var buffer = this;\n dataSource.bind('change', function () {\n buffer._change();\n });\n dataSource.bind('reset', function () {\n buffer._reset();\n });\n this._syncWithDataSource();\n this.setViewSize(viewSize);\n },\n setViewSize: function (viewSize) {\n this.viewSize = viewSize;\n this._recalculate();\n },\n at: function (index) {\n var pageSize = this.pageSize, itemPresent = true;\n if (index >= this.total()) {\n this.trigger('endreached', { index: index });\n return null;\n }\n if (!this.useRanges) {\n return this.dataSource.view()[index];\n }\n if (this.useRanges) {\n if (index < this.dataOffset || index >= this.skip + pageSize) {\n itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n }\n if (index === this.prefetchThreshold) {\n this._prefetch();\n }\n if (index === this.midPageThreshold) {\n this.range(this.nextMidRange, true);\n } else if (index === this.nextPageThreshold) {\n this.range(this.nextFullRange);\n } else if (index === this.pullBackThreshold) {\n if (this.offset === this.skip) {\n this.range(this.previousMidRange);\n } else {\n this.range(this.previousFullRange);\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 indexOf: function (item) {\n return this.dataSource.data().indexOf(item) + this.dataOffset;\n },\n total: function () {\n return parseInt(this.dataSource.total(), 10);\n },\n next: function () {\n var buffer = this, pageSize = buffer.pageSize, offset = buffer.skip - buffer.viewSize + pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n this.offset = offset;\n this.dataSource.prefetch(pageSkip, pageSize, function () {\n buffer._goToRange(offset, true);\n });\n },\n range: function (offset, nextRange) {\n if (this.offset === offset) {\n return true;\n }\n var buffer = this, pageSize = this.pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize, dataSource = this.dataSource;\n if (nextRange) {\n pageSkip += pageSize;\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 return true;\n },\n syncDataSource: function () {\n var offset = this.offset;\n this.offset = null;\n this.range(offset);\n },\n destroy: function () {\n this.unbind();\n },\n _prefetch: function () {\n var buffer = this, pageSize = this.pageSize, prefetchOffset = this.skip + pageSize, dataSource = this.dataSource;\n if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n this._prefetching = true;\n this.trigger('prefetching', {\n skip: prefetchOffset,\n take: pageSize\n });\n dataSource.prefetch(prefetchOffset, pageSize, function () {\n buffer._prefetching = false;\n buffer.trigger('prefetched', {\n skip: prefetchOffset,\n take: pageSize\n });\n });\n }\n },\n _goToRange: function (offset, expanding) {\n if (this.offset !== offset) {\n return;\n }\n this.dataOffset = offset;\n this._expanding = expanding;\n this.dataSource.range(offset, this.pageSize);\n this.dataSource.enableRequestsInProgress();\n },\n _reset: function () {\n this._syncPending = true;\n },\n _change: function () {\n var dataSource = this.dataSource;\n this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n if (this._syncPending) {\n this._syncWithDataSource();\n this._recalculate();\n this._syncPending = false;\n this.trigger('reset', { offset: this.offset });\n }\n this.trigger('resize');\n if (this._expanding) {\n this.trigger('expand');\n }\n delete this._expanding;\n },\n _syncWithDataSource: function () {\n var dataSource = this.dataSource;\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 _recalculate: function () {\n var pageSize = this.pageSize, offset = this.offset, viewSize = this.viewSize, skip = Math.ceil(offset / pageSize) * pageSize;\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 this.nextMidRange = skip + pageSize - viewSize;\n this.nextFullRange = skip;\n this.previousMidRange = offset - viewSize;\n this.previousFullRange = skip - pageSize;\n }\n });\n var BatchBuffer = kendo.Observable.extend({\n init: function (dataSource, batchSize) {\n var batchBuffer = this;\n kendo.Observable.fn.init.call(batchBuffer);\n this.dataSource = dataSource;\n this.batchSize = batchSize;\n this._total = 0;\n this.buffer = new Buffer(dataSource, batchSize * 3);\n this.buffer.bind({\n 'endreached': function (e) {\n batchBuffer.trigger('endreached', { index: e.index });\n },\n 'prefetching': function (e) {\n batchBuffer.trigger('prefetching', {\n skip: e.skip,\n take: e.take\n });\n },\n 'prefetched': function (e) {\n batchBuffer.trigger('prefetched', {\n skip: e.skip,\n take: e.take\n });\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', {\n total: batchBuffer.total(),\n offset: this.offset\n });\n }\n });\n },\n syncDataSource: function () {\n this.buffer.syncDataSource();\n },\n at: function (index) {\n var buffer = this.buffer, skip = index * this.batchSize, take = this.batchSize, view = [], item;\n if (buffer.offset > skip) {\n buffer.at(buffer.offset - 1);\n }\n for (var i = 0; i < take; i++) {\n item = buffer.at(skip + i);\n if (item === null) {\n break;\n }\n view.push(item);\n }\n return view;\n },\n total: function () {\n return this._total;\n },\n destroy: function () {\n this.buffer.destroy();\n this.unbind();\n }\n });\n extend(true, kendo.data, {\n readers: { json: DataReader },\n Query: Query,\n DataSource: DataSource,\n HierarchicalDataSource: HierarchicalDataSource,\n Node: Node,\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 return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n (a3 || a2)();\n}));"],"sourceRoot":"/source/"}