{"version":3,"sources":["webpack:///./node_modules/@progress/kendo-ui/js/kendo.data.xml.js","webpack:///./node_modules/@progress/kendo-ui/js/kendo.data.js","webpack:///./node_modules/@progress/kendo-ui/js/kendo.data.odata.js","webpack:///./node_modules/@progress/kendo-ui/js/kendo.draganddrop.js","webpack:///./node_modules/@progress/kendo-ui/js/kendo.userevents.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","id","loaded","call","m","c","p","0","3","Error","1004","1051","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","undefined","$","kendo","window","isArray","isPlainObject","map","each","extend","getter","XmlDataReader","Class","init","options","that","this","total","model","parse","errors","serialize","data","base","modelBase","Model","fields","field","value","isFunction","idField","xpathToMember","define","parseInt","modelInstance","result","evaluate","record","_parse","xmlParse","xml","length","parseDOM","element","parsedNode","node","nodeType","nodeName","member","attribute","idx","attributes","attributeCount","nodeValue","firstChild","nextSibling","push","expression","intermediateResult","members","split","shift","join","apply","documentElement","tree","parseXML","raw","replace","indexOf","readers","jQuery","1046","proxy","isEmptyObject","grep","ajax","noop","Observable","STRING","FUNCTION","CREATE","READ","UPDATE","DESTROY","CHANGE","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","stringify","math","Math","pop","splice","slice","unshift","toString","stableSort","support","dateRegExp","ObservableArray","array","type","ObservableObject","fn","wrapAll","at","index","toJSON","json","Array","parent","source","target","wrap","object","bind","e","trigger","items","action","arguments","sort","howMany","item","i","len","concat","children","unbind","forEach","callback","thisArg","context","reduce","reduceRight","filter","find","every","some","remove","empty","Symbol","iterator","prototype","LazyObservableArray","events","_events","_parent","eventHandler","prefix","key","event","_notifyChange","_handlers","getTime","charAt","uid","guid","shouldSerialize","hasOwnProperty","f","get","_set","composite","paths","path","obj","set","setter","isSetPrevented","current","change","isObservableArray","isDataSource","DataSource","equal","x","y","xtype","parsers","toLowerCase","parseFloat","parseDate","defaultValues","Date","getFieldByName","name","fieldName","defaults","_initializers","dirty","dirtyFields","_defaultId","editable","initiator","accept","isNew","originalName","proto","functionFields","nullable","defaultValue","Comparer","selector","compare","a","b","localeCompare","create","dir","combine","comparers","StableComparer","asc","valueA","valueB","__position","desc","operators","quote","str","JSON","textOp","impl","ignore","operator","op","date","exec","getMatchRegexp","pattern","rx","esc","ch","eq","neq","gt","gte","lt","lte","startswith","doesnotstartwith","endswith","doesnotendwith","contains","doesnotcontain","matches","substring","doesnotmatch","isempty","isnotempty","isnull","isnotnull","isnullorempty","isnotnullorempty","Query","normalizeSort","descriptor","descriptors","d","filterExpr","expr","expressions","logic","and","or","fieldFunctions","operatorFunctions","filters","match","ignoreCase","operatorMap","equals","isequalto","equalto","ne","notequals","isnotequalto","notequalto","notequal","islessthan","lessthan","less","le","islessthanorequalto","lessthanequal","isgreaterthan","greaterthan","greater","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","normalizeOperator","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","normalizeGroup","aggregates","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","accessor","toArray","range","count","skip","take","select","order","inPlace","orderBy","orderByDescending","comparer","compiled","predicate","Function","group","allData","groupBy","hasSubgroups","currentValue","sorted","_sortForGrouping","groupValue","sum","isNumber","average","max","isDate","min","val","isNaN","process","query","filterCallback","LocalTransport","read","success","update","destroy","RemoteTransport","parameterMap","url","cache","Cache","add","submit","option","setup","error","parameters","operation","_store","clear","serializeRecords","getters","originalFieldNames","fieldNames","setters","convertRecords","convertGroup","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","store","DataReader","schema","dataFunction","_dataAccessFunction","groupsFunction","groups","serializeFunction","serializeGetters","fromName","from","_wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","flattenGroups","itemIndex","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","observable","replaceInRange","replaceWithObservable","view","serverGrouping","viewIndex","removeModel","dataItem","indexOfPristineModel","indexOfModel","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","_map","_prefetch","_data","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","pageSize","_page","page","_sort","_filter","_group","_aggregate","_total","_shouldDetachObservableParents","transport","Transport","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","batch","inPlaceSort","clone","online","sync","Deferred","resolve","promise","offlineData","_isServerGrouped","_push","_readData","_flatData","useRanges","getByUid","_getByUid","dataItems","_storeData","_addRange","_process","_observeView","flatView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","rangeSpan","_getCurrentRangeSpan","pushed","autoSync","pristine","last","pristineData","_updatePristineForModel","_removeItems","removePristine","shouldRemovePristine","destroyed","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","created","updated","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","_change","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","models","response","serverGroup","_handleCustomErrors","values","_executeOnPristineForModel","deepExtend","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","status","reject","deferred","_promise","method","converted","params","_params","_queueRequest","isPrevented","_dequeueRequest","args","_readAggregates","replaceSubset","_aggregateResult","itemIds","_skip","endless","j","_changeHandler","updatePristine","start","end","timestamp","_timeStamp","_sortRanges","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","_updateTotalForAction","handler","first","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","dataToAggregate","_setFilterTotal","_mergeState","_currentRangeStart","moreItemsCount","filterTotal","setDefaultValue","fetch","_query","next","totalPages","prev","_pageableQueryOptions","round","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_currentRequestTimeStamp","pageSkip","floor","size","_processRangeData","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","remote","_mergeGroups","prevGroup","temp","paging","sorting","filtering","_prefetchSuccessHandler","force","clearTimeout","_timeout","setTimeout","_multiplePrefetch","_updateRangesLength","rangesLength","mismatchFound","mismatchLength","lengthDifference","abs","inferSelect","optgroup","firstField","secondField","parentNode","disabled","label","text","specified","inferTable","table","fieldIndex","cells","cell","tbody","tBodies","rows","fieldCount","innerHTML","dataSource","transportOptions","transports","schemas","logToConsole","Node","hasChildren","childrenField","childrenOptions","hasChildrenObject","_childrenOptions","_initChildren","_loaded","HierarchicalDataSource","collection","_updateChildrenField","append","level","_childrenLoaded","load","one","_matchFilter","dataMethod","_attachBubbleHandlers","_hierarchicalFilter","_markHierarchicalQuery","_updateHierarchicalFilter","_find","inferList","list","textChild","className","textField","urlField","spriteCssClassField","imageUrlField","elements","tagName","attr","prop","trim","_dataSource","Buffer","viewSize","disablePrefetch","_prefetching","buffer","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","offset","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","BatchBuffer","batchSize","batchBuffer","1047","1048","1049","NEWLINE","DOUBLELINE","odataFilters","odataFiltersVersionFour","mappers","useVersionFour","toOdataFilter","$filter","orderby","$orderby","$skip","$top","defaultDataType","dataType","useOdataFour","format","timezone","stripMetadata","hex16","random","substr","createBoundary","createDelimeter","boundary","close","createCommand","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","getOperationContent","content","getOperations","skipContent","requestBody","processCollection","colection","getBoundary","createBatchRequest","colections","batchURL","headers","parseBatchResponse","responseText","changeBody","code","marker","jsonModel","responseMarkers","markerIndex","collections","passed","lastIndexOf","odata","results","jsonp","contentType","$inlinecount","$format","$count","responses","1038","1123","lastDropTarget","document","$window","Widget","ui","UserEvents","getOffset","draggables","dropTargets","dropAreas","elementUnderCursor","KEYUP","DRAGSTART","HOLD","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","child","numericCssPropery","property","css","within","containerBoundaries","container","outerWidth","_outerWidth","outerHeight","_outerHeight","minX","left","minY","top","width","height","checkTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","targetElement","matchesSelector","translate","TapCapture","domElement","capture","addEventListener","eventMap","down","_press","up","_release","attachEvent","captureNext","cancelCapture","preventDefault","PaneDimension","forcedEnabled","scale","horizontal","measure","scrollSize","axis","makeVirtual","virtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getSize","getTotal","rescale","silent","scaledTotal","minScale","centerOffset","enabled","PaneDimensions","forcedMinScale","maxScale","newScale","refresh","centerCoordinates","fitScale","PaneAxis","dimension","movable","dragMove","delta","position","resistance","translateAxis","Pane","elastic","dimensions","userEvents","gesturestart","gesture","press","closest","is","sender","cancel","gesturechange","coordinates","previousGesture","previousCenter","center","scaleDelta","distance","offsetX","offsetY","scaleWith","move","touch","TRANSFORM_STYLE","transitions","hasHW3D","Movable","style","webkitTransformOrigin","_saveCoordinates","by","scaleTo","moveAxis","moveTo","newCoordinates","browser","msie","version","destroyDroppable","widget","groupName","droppables","DropTarget","_trigger","eventName","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","_cache","DropTargetArea","Draggable","_activated","global","allowSelection","threshold","_start","hold","_hold","_drag","_end","_cancel","_select","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","keyCode","keys","ESC","_updateHint","boundaries","location","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","initialTouch","currentTarget","currentTargetOffset","stop","zIndex","appendTo","body","angular","removeAttr","scopeTarget","scopeFrom","on","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","findScrollableParent","_lastEvent","_processMovement","velocity","autoScrollVelocity","scrollableViewPort","_scrollCompenstation","_scrollVelocity","clearInterval","_scrollInterval","setInterval","_withDropTarget","_autoScroll","compensation","yIsScrollable","xIsScrollable","isRootNode","scrollableRoot","scrollHeight","scrollWidth","offsetHeight","offsetWidth","yDelta","scrollTop","yInBounds","xDelta","scrollLeft","xInBounds","isDefaultPrevented","animate","initialTarget","hide","show","off","root","bottom","right","edge","safari","isScrollable","mouseX","mouseY","rect","AUTO_SCROLL_AREA","plugin","utils","1350","now","OS","mobileOS","invalidZeroEvents","android","DEFAULT_MIN_HOLD","CLICK_DELAY","DEFAULT_THRESHOLD","PRESS","SELECT","START","MOVE","END","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","ENABLE_GLOBAL_SURFACE","mouseAndTouchPresent","touchDelta","touch1","touch2","x1","y1","x2","y2","dx","dy","sqrt","getTouches","changedTouches","touches","originalEvent","api","identifier","pointers","msPointers","pointerId","TouchAxis","_updateLocationData","startLocation","timeStamp","timeDelta","initialDelta","client","screen","Touch","touchInfo","useClickAsTap","pressEvent","_clicks","supportDoubleTap","_moved","_finished","_holdTimeout","minHold","_tap","_clickTimeout","_withinIgnoreThreshold","dispose","endTime","activeTouches","inArray","isMoved","startTime","jQueryEvent","notify","withEachUpEvent","downEvents","ns","_maxTouches","multiTouch","captureUpIfMoved","fastTap","delayedClick","eventNS","surface","ownerDocument","stopPropagation","pressed","applyEventMap","defaultAction","touchAction","preventDragEvent","eventCapture","surfaceElement","preventIfMovingProxy","preventIfMoving","_isMoved","removeEventListener","kendoDestroy","removeData","_disposeAll","_isMultiTouch","_apiCall","_maxTouchesReached","which","_move","_eachTouch","_click","pageX","clientX","pageY","clientY","methodName","matchingTouch","dict","defaultThreshold"],"mappings":"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","file":"js/kendoCore~kendoTreeView.5fed47f1.js","sourcesContent":["module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1051);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1004:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1051:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\r\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1004) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\t})(function(){\r\n\r\n\tvar __meta__ = { // jshint ignore:line\r\n\t id: \"data.xml\",\r\n\t name: \"XML\",\r\n\t category: \"framework\",\r\n\t depends: [ \"core\" ],\r\n\t hidden: true\r\n\t};\r\n\r\n\t/*jshint eqnull: true, boss: true */\r\n\t(function($, undefined) {\r\n\t var kendo = window.kendo,\r\n\t isArray = $.isArray,\r\n\t isPlainObject = $.isPlainObject,\r\n\t map = $.map,\r\n\t each = $.each,\r\n\t extend = $.extend,\r\n\t getter = kendo.getter,\r\n\t Class = kendo.Class;\r\n\r\n\t var XmlDataReader = Class.extend({\r\n\t init: function(options) {\r\n\t var that = this,\r\n\t total = options.total,\r\n\t model = options.model,\r\n\t parse = options.parse,\r\n\t errors = options.errors,\r\n\t serialize = options.serialize,\r\n\t data = options.data;\r\n\r\n\t if (model) {\r\n\t if (isPlainObject(model)) {\r\n\t var base = options.modelBase || kendo.data.Model;\r\n\r\n\t if (model.fields) {\r\n\t each(model.fields, function(field, value) {\r\n\t if (isPlainObject(value) && value.field) {\r\n\t if (!$.isFunction(value.field)) {\r\n\t value = extend(value, { field: that.getter(value.field) });\r\n\t }\r\n\t } else {\r\n\t value = { field: that.getter(value) };\r\n\t }\r\n\t model.fields[field] = value;\r\n\t });\r\n\t }\r\n\r\n\t var id = model.id;\r\n\t if (id) {\r\n\t var idField = {};\r\n\r\n\t idField[that.xpathToMember(id, true)] = { field : that.getter(id) };\r\n\t model.fields = extend(idField, model.fields);\r\n\t model.id = that.xpathToMember(id);\r\n\t }\r\n\t model = base.define(model);\r\n\t }\r\n\r\n\t that.model = model;\r\n\t }\r\n\r\n\t if (total) {\r\n\t if (typeof total == \"string\") {\r\n\t total = that.getter(total);\r\n\t that.total = function(data) {\r\n\t return parseInt(total(data), 10);\r\n\t };\r\n\t } else if (typeof total == \"function\"){\r\n\t that.total = total;\r\n\t }\r\n\t }\r\n\r\n\t if (errors) {\r\n\t if (typeof errors == \"string\") {\r\n\t errors = that.getter(errors);\r\n\t that.errors = function(data) {\r\n\t return errors(data) || null;\r\n\t };\r\n\t } else if (typeof errors == \"function\"){\r\n\t that.errors = errors;\r\n\t }\r\n\t }\r\n\r\n\t if (data) {\r\n\t if (typeof data == \"string\") {\r\n\t data = that.xpathToMember(data);\r\n\t that.data = function(value) {\r\n\t var result = that.evaluate(value, data),\r\n\t modelInstance;\r\n\r\n\t result = isArray(result) ? result : [result];\r\n\r\n\t if (that.model && model.fields) {\r\n\t modelInstance = new that.model();\r\n\r\n\t return map(result, function(value) {\r\n\t if (value) {\r\n\t var record = {}, field;\r\n\r\n\t for (field in model.fields) {\r\n\t record[field] = modelInstance._parse(field, model.fields[field].field(value));\r\n\t }\r\n\r\n\t return record;\r\n\t }\r\n\t });\r\n\t }\r\n\r\n\t return result;\r\n\t };\r\n\t } else if (typeof data == \"function\") {\r\n\t that.data = data;\r\n\t }\r\n\t }\r\n\r\n\t if (typeof parse == \"function\") {\r\n\t var xmlParse = that.parse;\r\n\r\n\t that.parse = function(data) {\r\n\t var xml = parse.call(that, data);\r\n\t return xmlParse.call(that, xml);\r\n\t };\r\n\t }\r\n\r\n\t if (typeof serialize == \"function\") {\r\n\t that.serialize = serialize;\r\n\t }\r\n\t },\r\n\t total: function(result) {\r\n\t return this.data(result).length;\r\n\t },\r\n\t errors: function(data) {\r\n\t return data ? data.errors : null;\r\n\t },\r\n\t serialize: function(data) {\r\n\t return data;\r\n\t },\r\n\t parseDOM: function(element) {\r\n\t var result = {},\r\n\t parsedNode,\r\n\t node,\r\n\t nodeType,\r\n\t nodeName,\r\n\t member,\r\n\t attribute,\r\n\t attributes = element.attributes,\r\n\t attributeCount = attributes.length,\r\n\t idx;\r\n\r\n\t for (idx = 0; idx < attributeCount; idx++) {\r\n\t attribute = attributes[idx];\r\n\t result[\"@\" + attribute.nodeName] = attribute.nodeValue;\r\n\t }\r\n\r\n\t for (node = element.firstChild; node; node = node.nextSibling) {\r\n\t nodeType = node.nodeType;\r\n\r\n\t if (nodeType === 3 || nodeType === 4) {\r\n\t // text nodes or CDATA are stored as #text field\r\n\t result[\"#text\"] = node.nodeValue;\r\n\t } else if (nodeType === 1) {\r\n\t // elements are stored as fields\r\n\t parsedNode = this.parseDOM(node);\r\n\r\n\t nodeName = node.nodeName;\r\n\r\n\t member = result[nodeName];\r\n\r\n\t if (isArray(member)) {\r\n\t // elements of same nodeName are stored as array\r\n\t member.push(parsedNode);\r\n\t } else if (member !== undefined) {\r\n\t member = [member, parsedNode];\r\n\t } else {\r\n\t member = parsedNode;\r\n\t }\r\n\r\n\t result[nodeName] = member;\r\n\t }\r\n\t }\r\n\t return result;\r\n\t },\r\n\r\n\t evaluate: function(value, expression) {\r\n\t var members = expression.split(\".\"),\r\n\t member,\r\n\t result,\r\n\t length,\r\n\t intermediateResult,\r\n\t idx;\r\n\r\n\t while (member = members.shift()) {\r\n\t value = value[member];\r\n\r\n\t if (isArray(value)) {\r\n\t result = [];\r\n\t expression = members.join(\".\");\r\n\r\n\t for (idx = 0, length = value.length; idx < length; idx++) {\r\n\t intermediateResult = this.evaluate(value[idx], expression);\r\n\r\n\t intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\r\n\r\n\t result.push.apply(result, intermediateResult);\r\n\t }\r\n\r\n\t return result;\r\n\t }\r\n\t }\r\n\r\n\t return value;\r\n\t },\r\n\r\n\t parse: function(xml) {\r\n\t var documentElement,\r\n\t tree,\r\n\t result = {};\r\n\r\n\t documentElement = xml.documentElement || $.parseXML(xml).documentElement;\r\n\r\n\t tree = this.parseDOM(documentElement);\r\n\r\n\t result[documentElement.nodeName] = tree;\r\n\r\n\t return result;\r\n\t },\r\n\r\n\t xpathToMember: function(member, raw) {\r\n\t if (!member) {\r\n\t return \"\";\r\n\t }\r\n\r\n\t member = member.replace(/^\\//, \"\") // remove the first \"/\"\r\n\t .replace(/\\//g, \".\"); // replace all \"/\" with \".\"\r\n\r\n\t if (member.indexOf(\"@\") >= 0) {\r\n\t // replace @attribute with '[\"@attribute\"]'\r\n\t return member.replace(/\\.?(@.*)/, raw? '$1':'[\"$1\"]');\r\n\t }\r\n\r\n\t if (member.indexOf(\"text()\") >= 0) {\r\n\t // replace \".text()\" with '[\"#text\"]'\r\n\t return member.replace(/(\\.?text\\(\\))/, raw? '#text':'[\"#text\"]');\r\n\t }\r\n\r\n\t return member;\r\n\t },\r\n\t getter: function(member) {\r\n\t return getter(this.xpathToMember(member), true);\r\n\t }\r\n\t });\r\n\r\n\t $.extend(true, kendo.data, {\r\n\t XmlDataReader: XmlDataReader,\r\n\t readers: {\r\n\t xml: XmlDataReader\r\n\t }\r\n\t });\r\n\t})(window.kendo.jQuery);\r\n\r\n\treturn window.kendo;\r\n\r\n\t}, __webpack_require__(3));\r\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1046);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1004:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1046:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1004), __webpack_require__(1047), __webpack_require__(1048) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"data\",\n\t name: \"Data source\",\n\t category: \"framework\",\n\t description: \"Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.\",\n\t depends: [ \"core\" ],\n\t features: [ {\n\t id: \"data-odata\",\n\t name: \"OData\",\n\t description: \"Support for accessing Open Data Protocol (OData) services.\",\n\t depends: [ \"data.odata\" ]\n\t }, {\n\t id: \"data-signalr\",\n\t name: \"SignalR\",\n\t description: \"Support for binding to SignalR hubs.\",\n\t depends: [ \"data.signalr\" ]\n\t }, {\n\t id: \"data-XML\",\n\t name: \"XML\",\n\t description: \"Support for binding to XML.\",\n\t depends: [ \"data.xml\" ]\n\t }]\n\t};\n\n\t/*jshint eqnull: true, loopfunc: true, evil: true */\n\t(function($, undefined) {\n\t var extend = $.extend,\n\t proxy = $.proxy,\n\t isPlainObject = $.isPlainObject,\n\t isEmptyObject = $.isEmptyObject,\n\t isArray = $.isArray,\n\t grep = $.grep,\n\t ajax = $.ajax,\n\t map,\n\t each = $.each,\n\t noop = $.noop,\n\t kendo = window.kendo,\n\t isFunction = kendo.isFunction,\n\t Observable = kendo.Observable,\n\t Class = kendo.Class,\n\t STRING = \"string\",\n\t FUNCTION = \"function\",\n\t CREATE = \"create\",\n\t READ = \"read\",\n\t UPDATE = \"update\",\n\t DESTROY = \"destroy\",\n\t CHANGE = \"change\",\n\t SYNC = \"sync\",\n\t GET = \"get\",\n\t ERROR = \"error\",\n\t REQUESTSTART = \"requestStart\",\n\t PROGRESS = \"progress\",\n\t REQUESTEND = \"requestEnd\",\n\t crud = [CREATE, READ, UPDATE, DESTROY],\n\t identity = function(o) { return o; },\n\t getter = kendo.getter,\n\t stringify = kendo.stringify,\n\t math = Math,\n\t push = [].push,\n\t join = [].join,\n\t pop = [].pop,\n\t splice = [].splice,\n\t shift = [].shift,\n\t slice = [].slice,\n\t unshift = [].unshift,\n\t toString = {}.toString,\n\t stableSort = kendo.support.stableSort,\n\t dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\n\n\t var ObservableArray = Observable.extend({\n\t init: function(array, type) {\n\t var that = this;\n\n\t that.type = type || ObservableObject;\n\n\t Observable.fn.init.call(that);\n\n\t that.length = array.length;\n\n\t that.wrapAll(array, that);\n\t },\n\n\t at: function(index) {\n\t return this[index];\n\t },\n\n\t toJSON: function() {\n\t var idx, length = this.length, value, json = new Array(length);\n\n\t for (idx = 0; idx < length; idx++){\n\t value = this[idx];\n\n\t if (value instanceof ObservableObject) {\n\t value = value.toJSON();\n\t }\n\n\t json[idx] = value;\n\t }\n\n\t return json;\n\t },\n\n\t parent: noop,\n\n\t wrapAll: function(source, target) {\n\t var that = this,\n\t idx,\n\t length,\n\t parent = function() {\n\t return that;\n\t };\n\n\t target = target || [];\n\n\t for (idx = 0, length = source.length; idx < length; idx++) {\n\t target[idx] = that.wrap(source[idx], parent);\n\t }\n\n\t return target;\n\t },\n\n\t wrap: function(object, parent) {\n\t var that = this,\n\t observable;\n\n\t if (object !== null && toString.call(object) === \"[object Object]\") {\n\t observable = object instanceof that.type || object instanceof Model;\n\n\t if (!observable) {\n\t object = object instanceof ObservableObject ? object.toJSON() : object;\n\t object = new that.type(object);\n\t }\n\n\t object.parent = parent;\n\n\t object.bind(CHANGE, function(e) {\n\t that.trigger(CHANGE, {\n\t field: e.field,\n\t node: e.node,\n\t index: e.index,\n\t items: e.items || [this],\n\t action: e.node ? (e.action || \"itemloaded\") : \"itemchange\"\n\t });\n\t });\n\t }\n\n\t return object;\n\t },\n\n\t push: function() {\n\t var index = this.length,\n\t items = this.wrapAll(arguments),\n\t result;\n\n\t result = push.apply(this, items);\n\n\t this.trigger(CHANGE, {\n\t action: \"add\",\n\t index: index,\n\t items: items\n\t });\n\n\t return result;\n\t },\n\n\t slice: slice,\n\n\t sort: [].sort,\n\n\t join: join,\n\n\t pop: function() {\n\t var length = this.length, result = pop.apply(this);\n\n\t if (length) {\n\t this.trigger(CHANGE, {\n\t action: \"remove\",\n\t index: length - 1,\n\t items:[result]\n\t });\n\t }\n\n\t return result;\n\t },\n\n\t splice: function(index, howMany, item) {\n\t var items = this.wrapAll(slice.call(arguments, 2)),\n\t result, i, len;\n\n\t result = splice.apply(this, [index, howMany].concat(items));\n\n\t if (result.length) {\n\t this.trigger(CHANGE, {\n\t action: \"remove\",\n\t index: index,\n\t items: result\n\t });\n\n\t for (i = 0, len = result.length; i < len; i++) {\n\t if (result[i] && result[i].children) {\n\t result[i].unbind(CHANGE);\n\t }\n\t }\n\t }\n\n\t if (item) {\n\t this.trigger(CHANGE, {\n\t action: \"add\",\n\t index: index,\n\t items: items\n\t });\n\t }\n\t return result;\n\t },\n\n\t shift: function() {\n\t var length = this.length, result = shift.apply(this);\n\n\t if (length) {\n\t this.trigger(CHANGE, {\n\t action: \"remove\",\n\t index: 0,\n\t items:[result]\n\t });\n\t }\n\n\t return result;\n\t },\n\n\t unshift: function() {\n\t var items = this.wrapAll(arguments),\n\t result;\n\n\t result = unshift.apply(this, items);\n\n\t this.trigger(CHANGE, {\n\t action: \"add\",\n\t index: 0,\n\t items: items\n\t });\n\n\t return result;\n\t },\n\n\t indexOf: function(item) {\n\t var that = this,\n\t idx,\n\t length;\n\n\t for (idx = 0, length = that.length; idx < length; idx++) {\n\t if (that[idx] === item) {\n\t return idx;\n\t }\n\t }\n\t return -1;\n\t },\n\n\t forEach: function(callback, thisArg) {\n\t var idx = 0;\n\t var length = this.length;\n\t var context = thisArg || window;\n\n\t for (; idx < length; idx++) {\n\t callback.call(context, this[idx], idx, this);\n\t }\n\t },\n\n\t map: function(callback, thisArg) {\n\t var idx = 0;\n\t var result = [];\n\t var length = this.length;\n\t var context = thisArg || window;\n\n\t for (; idx < length; idx++) {\n\t result[idx] = callback.call(context, this[idx], idx, this);\n\t }\n\n\t return result;\n\t },\n\n\t reduce: function(callback) {\n\t var idx = 0,\n\t result,\n\t length = this.length;\n\n\t if (arguments.length == 2) {\n\t result = arguments[1];\n\t } else if (idx < length) {\n\t result = this[idx++];\n\t }\n\n\t for (; idx < length; idx++) {\n\t result = callback(result, this[idx], idx, this);\n\t }\n\n\t return result;\n\t },\n\n\t reduceRight: function(callback) {\n\t var idx = this.length - 1,\n\t result;\n\n\t if (arguments.length == 2) {\n\t result = arguments[1];\n\t } else if (idx > 0) {\n\t result = this[idx--];\n\t }\n\n\t for (; idx >= 0; idx--) {\n\t result = callback(result, this[idx], idx, this);\n\t }\n\n\t return result;\n\t },\n\n\t filter: function(callback, thisArg) {\n\t var idx = 0;\n\t var result = [];\n\t var item;\n\t var length = this.length;\n\t var context = thisArg || window;\n\n\t for (; idx < length; idx++) {\n\t item = this[idx];\n\t if (callback.call(context, item, idx, this)) {\n\t result[result.length] = item;\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t find: function(callback, thisArg) {\n\t var idx = 0;\n\t var item;\n\t var length = this.length;\n\t var context = thisArg || window;\n\n\t for (; idx < length; idx++) {\n\t item = this[idx];\n\t if (callback.call(context, item, idx, this)) {\n\t return item;\n\t }\n\t }\n\t },\n\n\t every: function(callback, thisArg) {\n\t var idx = 0;\n\t var item;\n\t var length = this.length;\n\t var context = thisArg || window;\n\n\t for (; idx < length; idx++) {\n\t item = this[idx];\n\t if (!callback.call(context, item, idx, this)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t },\n\n\t some: function(callback, thisArg) {\n\t var idx = 0;\n\t var item;\n\t var length = this.length;\n\t var context = thisArg || window;\n\n\t for (; idx < length; idx++) {\n\t item = this[idx];\n\t if (callback.call(context, item, idx, this)) {\n\t return true;\n\t }\n\t }\n\n\t return false;\n\t },\n\n\t // non-standard collection methods\n\t remove: function(item) {\n\t var idx = this.indexOf(item);\n\n\t if (idx !== -1) {\n\t this.splice(idx, 1);\n\t }\n\t },\n\n\t empty: function() {\n\t this.splice(0, this.length);\n\t }\n\t });\n\n\t // Polyfill for Symbol.iterator\n\t if (typeof Symbol !== \"undefined\" && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n\t ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n\t }\n\n\t var LazyObservableArray = ObservableArray.extend({\n\t init: function (data, type, events) {\n\t Observable.fn.init.call(this);\n\n\t this.type = type || ObservableObject;\n\n\t if (events) {\n\t this._events = events;\n\t }\n\n\t for (var idx = 0; idx < data.length; idx++) {\n\t this[idx] = data[idx];\n\t }\n\n\t this.length = idx;\n\t this._parent = proxy(function() { return this; }, this);\n\t },\n\t at: function(index) {\n\t var item = this[index];\n\n\t if (!(item instanceof this.type)) {\n\t item = this[index] = this.wrap(item, this._parent);\n\t } else {\n\t item.parent = this._parent;\n\t }\n\n\t return item;\n\t }\n\t });\n\n\t function eventHandler(context, type, field, prefix) {\n\t return function(e) {\n\t var event = {}, key;\n\n\t for (key in e) {\n\t event[key] = e[key];\n\t }\n\n\t if (prefix) {\n\t event.field = field + \".\" + e.field;\n\t } else {\n\t event.field = field;\n\t }\n\n\t if (type == CHANGE && context._notifyChange) {\n\t context._notifyChange(event);\n\t }\n\n\t context.trigger(type, event);\n\t };\n\t }\n\n\t var ObservableObject = Observable.extend({\n\t init: function(value) {\n\t var that = this,\n\t member,\n\t field,\n\t parent = function() {\n\t return that;\n\t };\n\n\t Observable.fn.init.call(this);\n\n\t this._handlers = {};\n\n\t for (field in value) {\n\t member = value[field];\n\n\t if (typeof member === \"object\" && member && !member.getTime && field.charAt(0) != \"_\") {\n\t member = that.wrap(member, field, parent);\n\t }\n\n\t that[field] = member;\n\t }\n\n\t that.uid = kendo.guid();\n\t },\n\n\t shouldSerialize: function(field) {\n\t return this.hasOwnProperty(field) && field !== \"_handlers\" && field !== \"_events\" && typeof this[field] !== FUNCTION && field !== \"uid\";\n\t },\n\n\t forEach: function(f) {\n\t for (var i in this) {\n\t if (this.shouldSerialize(i)) {\n\t f(this[i], i);\n\t }\n\t }\n\t },\n\n\t toJSON: function() {\n\t var result = {}, value, field;\n\n\t for (field in this) {\n\t if (this.shouldSerialize(field)) {\n\t value = this[field];\n\n\t if (value instanceof ObservableObject || value instanceof ObservableArray) {\n\t value = value.toJSON();\n\t }\n\n\t result[field] = value;\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t get: function(field) {\n\t var that = this, result;\n\n\t that.trigger(GET, { field: field });\n\n\t if (field === \"this\") {\n\t result = that;\n\t } else {\n\t result = kendo.getter(field, true)(that);\n\t }\n\n\t return result;\n\t },\n\n\t _set: function(field, value) {\n\t var that = this;\n\t var composite = field.indexOf(\".\") >= 0;\n\n\t if (composite) {\n\t var paths = field.split(\".\"),\n\t path = \"\";\n\n\t while (paths.length > 1) {\n\t path += paths.shift();\n\t var obj = kendo.getter(path, true)(that);\n\t if (obj instanceof ObservableObject) {\n\t obj.set(paths.join(\".\"), value);\n\t return composite;\n\t }\n\t path += \".\";\n\t }\n\t }\n\n\t kendo.setter(field)(that, value);\n\n\t return composite;\n\t },\n\n\t set: function(field, value) {\n\t var that = this,\n\t isSetPrevented = false,\n\t composite = field.indexOf(\".\") >= 0,\n\t current = kendo.getter(field, true)(that);\n\n\t if (current !== value) {\n\t if (current instanceof Observable && this._handlers[field]) {\n\t if (this._handlers[field].get) {\n\t current.unbind(GET, this._handlers[field].get);\n\t }\n\t current.unbind(CHANGE, this._handlers[field].change);\n\t }\n\n\t isSetPrevented = that.trigger(\"set\", { field: field, value: value });\n\n\t if (!isSetPrevented) {\n\t if (!composite) {\n\t value = that.wrap(value, field, function() { return that; });\n\t }\n\t if (!that._set(field, value) || field.indexOf(\"(\") >= 0 || field.indexOf(\"[\") >= 0) {\n\t that.trigger(CHANGE, { field: field });\n\t }\n\t }\n\t }\n\n\t return isSetPrevented;\n\t },\n\n\t parent: noop,\n\n\t wrap: function(object, field, parent) {\n\t var that = this;\n\t var get;\n\t var change;\n\t var type = toString.call(object);\n\n\t if (object != null && (type === \"[object Object]\" || type === \"[object Array]\")) {\n\t var isObservableArray = object instanceof ObservableArray;\n\t var isDataSource = object instanceof DataSource;\n\n\t if (type === \"[object Object]\" && !isDataSource && !isObservableArray) {\n\t if (!(object instanceof ObservableObject)) {\n\t object = new ObservableObject(object);\n\t }\n\n\t get = eventHandler(that, GET, field, true);\n\t object.bind(GET, get);\n\t change = eventHandler(that, CHANGE, field, true);\n\t object.bind(CHANGE, change);\n\n\t that._handlers[field] = { get: get, change: change };\n\t } else if (type === \"[object Array]\" || isObservableArray || isDataSource) {\n\t if (!isObservableArray && !isDataSource) {\n\t object = new ObservableArray(object);\n\t }\n\n\t change = eventHandler(that, CHANGE, field, false);\n\n\t object.bind(CHANGE, change);\n\n\t that._handlers[field] = { change: change };\n\t }\n\n\t object.parent = parent;\n\t }\n\n\t return object;\n\t }\n\t });\n\n\t function equal(x, y) {\n\t if (x === y) {\n\t return true;\n\t }\n\n\t var xtype = $.type(x), ytype = $.type(y), field;\n\n\t if (xtype !== ytype) {\n\t return false;\n\t }\n\n\t if (xtype === \"date\") {\n\t return x.getTime() === y.getTime();\n\t }\n\n\t if (xtype !== \"object\" && xtype !== \"array\") {\n\t return false;\n\t }\n\n\t for (field in x) {\n\t if (!equal(x[field], y[field])) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t var parsers = {\n\t \"number\": function(value) {\n\t if (typeof value === STRING && value.toLowerCase() === \"null\") {\n\t return null;\n\t }\n\t return kendo.parseFloat(value);\n\t },\n\n\t \"date\": function(value) {\n\t if (typeof value === STRING && value.toLowerCase() === \"null\") {\n\t return null;\n\t }\n\t return kendo.parseDate(value);\n\t },\n\n\t \"boolean\": function(value) {\n\t if (typeof value === STRING) {\n\t if (value.toLowerCase() === \"null\") {\n\t return null;\n\t } else {\n\t return value.toLowerCase() === \"true\";\n\t }\n\t }\n\t return value != null ? !!value : value;\n\t },\n\n\t \"string\": function(value) {\n\t if (typeof value === STRING && value.toLowerCase() === \"null\") {\n\t return null;\n\t }\n\t return value != null ? (value + \"\") : value;\n\t },\n\n\t \"default\": function(value) {\n\t return value;\n\t }\n\t };\n\n\t var defaultValues = {\n\t \"string\": \"\",\n\t \"number\": 0,\n\t \"date\": new Date(),\n\t \"boolean\": false,\n\t \"default\": \"\"\n\t };\n\n\t function getFieldByName(obj, name) {\n\t var field,\n\t fieldName;\n\n\t for (fieldName in obj) {\n\t field = obj[fieldName];\n\t if (isPlainObject(field) && field.field && field.field === name) {\n\t return field;\n\t } else if (field === name) {\n\t return field;\n\t }\n\t }\n\t return null;\n\t }\n\n\t var Model = ObservableObject.extend({\n\t init: function(data) {\n\t var that = this;\n\n\t if (!data || $.isEmptyObject(data)) {\n\t data = $.extend({}, that.defaults, data);\n\n\t if (that._initializers) {\n\t for (var idx = 0; idx < that._initializers.length; idx++) {\n\t var name = that._initializers[idx];\n\t data[name] = that.defaults[name]();\n\t }\n\t }\n\t }\n\n\t ObservableObject.fn.init.call(that, data);\n\n\t that.dirty = false;\n\t that.dirtyFields = {};\n\n\t if (that.idField) {\n\t that.id = that.get(that.idField);\n\n\t if (that.id === undefined) {\n\t that.id = that._defaultId;\n\t }\n\t }\n\t },\n\n\t shouldSerialize: function(field) {\n\t return ObservableObject.fn.shouldSerialize.call(this, field) &&\n\t field !== \"uid\" && !(this.idField !== \"id\" && field === \"id\") &&\n\t field !== \"dirty\" && field !== \"dirtyFields\" && field !== \"_accessors\";\n\t },\n\n\t _parse: function(field, value) {\n\t var that = this,\n\t fieldName = field,\n\t fields = (that.fields || {}),\n\t parse;\n\n\t field = fields[field];\n\t if (!field) {\n\t field = getFieldByName(fields, fieldName);\n\t }\n\t if (field) {\n\t parse = field.parse;\n\t if (!parse && field.type) {\n\t parse = parsers[field.type.toLowerCase()];\n\t }\n\t }\n\n\t return parse ? parse(value) : value;\n\t },\n\n\t _notifyChange: function(e) {\n\t var action = e.action;\n\n\t if (action == \"add\" || action == \"remove\") {\n\t this.dirty = true;\n\t this.dirtyFields[e.field] = true;\n\t }\n\t },\n\n\t editable: function(field) {\n\t field = (this.fields || {})[field];\n\t return field ? field.editable !== false : true;\n\t },\n\n\t set: function(field, value, initiator) {\n\t var that = this;\n\t var dirty = that.dirty;\n\n\t if (that.editable(field)) {\n\t value = that._parse(field, value);\n\n\t if (!equal(value, that.get(field))) {\n\t that.dirty = true;\n\t that.dirtyFields[field] = true;\n\n\t if (ObservableObject.fn.set.call(that, field, value, initiator) && !dirty) {\n\t that.dirty = dirty;\n\n\t if (!that.dirty) {\n\t that.dirtyFields[field] = false;\n\t }\n\t }\n\t } else {\n\t that.trigger(\"equalSet\", { field: field, value: value });\n\t }\n\t }\n\t },\n\n\t accept: function(data) {\n\t var that = this,\n\t parent = function() { return that; },\n\t field;\n\n\t for (field in data) {\n\t var value = data[field];\n\n\t if (field.charAt(0) != \"_\") {\n\t value = that.wrap(data[field], field, parent);\n\t }\n\n\t that._set(field, value);\n\t }\n\n\t if (that.idField) {\n\t that.id = that.get(that.idField);\n\t }\n\n\t that.dirty = false;\n\t that.dirtyFields = {};\n\t },\n\n\t isNew: function() {\n\t return this.id === this._defaultId;\n\t }\n\t });\n\n\t Model.define = function(base, options) {\n\t if (options === undefined) {\n\t options = base;\n\t base = Model;\n\t }\n\n\t var model,\n\t proto = extend({ defaults: {} }, options),\n\t name,\n\t field,\n\t type,\n\t value,\n\t idx,\n\t length,\n\t fields = {},\n\t originalName,\n\t id = proto.id,\n\t functionFields = [];\n\n\t if (id) {\n\t proto.idField = id;\n\t }\n\n\t if (proto.id) {\n\t delete proto.id;\n\t }\n\n\t if (id) {\n\t proto.defaults[id] = proto._defaultId = \"\";\n\t }\n\n\t if (toString.call(proto.fields) === \"[object Array]\") {\n\t for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n\t field = proto.fields[idx];\n\t if (typeof field === STRING) {\n\t fields[field] = {};\n\t } else if (field.field) {\n\t fields[field.field] = field;\n\t }\n\t }\n\t proto.fields = fields;\n\t }\n\n\t for (name in proto.fields) {\n\t field = proto.fields[name];\n\t type = field.type || \"default\";\n\t value = null;\n\t originalName = name;\n\n\t name = typeof (field.field) === STRING ? field.field : name;\n\n\t if (!field.nullable) {\n\t value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n\n\t if (typeof value === \"function\") {\n\t functionFields.push(name);\n\t }\n\t }\n\n\t if (options.id === name) {\n\t proto._defaultId = value;\n\t }\n\n\t proto.defaults[originalName !== name ? originalName : name] = value;\n\n\t field.parse = field.parse || parsers[type];\n\t }\n\n\t if (functionFields.length > 0) {\n\t proto._initializers = functionFields;\n\t }\n\n\t model = base.extend(proto);\n\t model.define = function(options) {\n\t return Model.define(model, options);\n\t };\n\n\t if (proto.fields) {\n\t model.fields = proto.fields;\n\t model.idField = proto.idField;\n\t }\n\n\t return model;\n\t };\n\n\t var Comparer = {\n\t selector: function(field) {\n\t return isFunction(field) ? field : getter(field);\n\t },\n\n\t compare: function(field) {\n\t var selector = this.selector(field);\n\t return function (a, b) {\n\t a = selector(a);\n\t b = selector(b);\n\n\t if (a == null && b == null) {\n\t return 0;\n\t }\n\n\t if (a == null) {\n\t return -1;\n\t }\n\n\t if (b == null) {\n\t return 1;\n\t }\n\n\t if (a.localeCompare) {\n\t return a.localeCompare(b);\n\t }\n\n\t return a > b ? 1 : (a < b ? -1 : 0);\n\t };\n\t },\n\n\t create: function(sort) {\n\t var compare = sort.compare || this.compare(sort.field);\n\n\t if (sort.dir == \"desc\") {\n\t return function(a, b) {\n\t return compare(b, a, true);\n\t };\n\t }\n\n\t return compare;\n\t },\n\n\t combine: function(comparers) {\n\t return function(a, b) {\n\t var result = comparers[0](a, b),\n\t idx,\n\t length;\n\n\t for (idx = 1, length = comparers.length; idx < length; idx ++) {\n\t result = result || comparers[idx](a, b);\n\t }\n\n\t return result;\n\t };\n\t }\n\t };\n\n\t var StableComparer = extend({}, Comparer, {\n\t asc: function(field) {\n\t var selector = this.selector(field);\n\t return function (a, b) {\n\t var valueA = selector(a);\n\t var valueB = selector(b);\n\n\t if (valueA && valueA.getTime && valueB && valueB.getTime) {\n\t valueA = valueA.getTime();\n\t valueB = valueB.getTime();\n\t }\n\n\t if (valueA === valueB) {\n\t return a.__position - b.__position;\n\t }\n\n\t if (valueA == null) {\n\t return -1;\n\t }\n\n\t if (valueB == null) {\n\t return 1;\n\t }\n\n\t if (valueA.localeCompare) {\n\t return valueA.localeCompare(valueB);\n\t }\n\n\t return valueA > valueB ? 1 : -1;\n\t };\n\t },\n\n\t desc: function(field) {\n\t var selector = this.selector(field);\n\t return function (a, b) {\n\t var valueA = selector(a);\n\t var valueB = selector(b);\n\n\t if (valueA && valueA.getTime && valueB && valueB.getTime) {\n\t valueA = valueA.getTime();\n\t valueB = valueB.getTime();\n\t }\n\n\t if (valueA === valueB) {\n\t return a.__position - b.__position;\n\t }\n\n\t if (valueA == null) {\n\t return 1;\n\t }\n\n\t if (valueB == null) {\n\t return -1;\n\t }\n\n\t if (valueB.localeCompare) {\n\t return valueB.localeCompare(valueA);\n\t }\n\n\t return valueA < valueB ? 1 : -1;\n\t };\n\t },\n\t create: function(sort) {\n\t return this[sort.dir](sort.field);\n\t }\n\t });\n\n\t map = function (array, callback) {\n\t var idx, length = array.length, result = new Array(length);\n\n\t for (idx = 0; idx < length; idx++) {\n\t result[idx] = callback(array[idx], idx, array);\n\t }\n\n\t return result;\n\t };\n\n\t var operators = (function(){\n\n\t function quote(str) {\n\t if (typeof str == \"string\") {\n\t str = str.replace(/[\\r\\n]+/g, \"\");\n\t }\n\t return JSON.stringify(str);\n\t }\n\n\t function textOp(impl) {\n\t return function(a, b, ignore) {\n\t b += \"\";\n\t if (ignore) {\n\t a = \"(\" + a + \" || '').toString().toLowerCase()\";\n\t b = b.toLowerCase();\n\t }\n\t return impl(a, quote(b), ignore);\n\t };\n\t }\n\n\t function operator(op, a, b, ignore) {\n\t if (b != null) {\n\t if (typeof b === STRING) {\n\t var date = dateRegExp.exec(b);\n\t if (date) {\n\t b = new Date(+date[1]);\n\t } else if (ignore) {\n\t b = quote(b.toLowerCase());\n\t a = \"((\" + a + \" || '')+'').toLowerCase()\";\n\t } else {\n\t b = quote(b);\n\t }\n\t }\n\n\t if (b.getTime) {\n\t //b looks like a Date\n\t a = \"(\" + a + \"&&\" + a + \".getTime?\" + a + \".getTime():\" + a + \")\";\n\t b = b.getTime();\n\t }\n\t }\n\n\t return a + \" \" + op + \" \" + b;\n\t }\n\n\t function getMatchRegexp(pattern) {\n\t // take a pattern, as supported by Excel match filter, and\n\t // convert it to the equivalent JS regular expression.\n\t // Excel patterns support:\n\t //\n\t // * - match any sequence of characters\n\t // ? - match a single character\n\t //\n\t // to match a literal * or ?, they must be prefixed by a tilde (~)\n\t for (var rx = \"/^\", esc = false, i = 0; i < pattern.length; ++i) {\n\t var ch = pattern.charAt(i);\n\t if (esc) {\n\t rx += \"\\\\\" + ch;\n\t } else if (ch == \"~\") {\n\t esc = true;\n\t continue;\n\t } else if (ch == \"*\") {\n\t rx += \".*\";\n\t } else if (ch == \"?\") {\n\t rx += \".\";\n\t } else if (\".+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0\".indexOf(ch) >= 0) {\n\t rx += \"\\\\\" + ch;\n\t } else {\n\t rx += ch;\n\t }\n\t esc = false;\n\t }\n\t return rx + \"$/\";\n\t }\n\n\t return {\n\t quote: function(value) {\n\t if (value && value.getTime) {\n\t return \"new Date(\" + value.getTime() + \")\";\n\t }\n\t return quote(value);\n\t },\n\t eq: function(a, b, ignore) {\n\t return operator(\"==\", a, b, ignore);\n\t },\n\t neq: function(a, b, ignore) {\n\t return operator(\"!=\", a, b, ignore);\n\t },\n\t gt: function(a, b, ignore) {\n\t return operator(\">\", a, b, ignore);\n\t },\n\t gte: function(a, b, ignore) {\n\t return operator(\">=\", a, b, ignore);\n\t },\n\t lt: function(a, b, ignore) {\n\t return operator(\"<\", a, b, ignore);\n\t },\n\t lte: function(a, b, ignore) {\n\t return operator(\"<=\", a, b, ignore);\n\t },\n\t startswith: textOp(function(a, b) {\n\t return a + \".lastIndexOf(\" + b + \", 0) == 0\";\n\t }),\n\t doesnotstartwith: textOp(function(a, b) {\n\t return a + \".lastIndexOf(\" + b + \", 0) == -1\";\n\t }),\n\t endswith: textOp(function(a, b) {\n\t var n = b ? b.length - 2 : 0;\n\t return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") >= 0\";\n\t }),\n\t doesnotendwith: textOp(function(a, b) {\n\t var n = b ? b.length - 2 : 0;\n\t return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") < 0\";\n\t }),\n\t contains: textOp(function(a, b) {\n\t return a + \".indexOf(\" + b + \") >= 0\";\n\t }),\n\t doesnotcontain: textOp(function(a, b) {\n\t return a + \".indexOf(\" + b + \") == -1\";\n\t }),\n\t matches: textOp(function(a, b){\n\t b = b.substring(1, b.length - 1);\n\t return getMatchRegexp(b) + \".test(\" + a + \")\";\n\t }),\n\t doesnotmatch: textOp(function(a, b){\n\t b = b.substring(1, b.length - 1);\n\t return \"!\" + getMatchRegexp(b) + \".test(\" + a + \")\";\n\t }),\n\t isempty: function(a) {\n\t return a + \" === ''\";\n\t },\n\t isnotempty: function(a) {\n\t return a + \" !== ''\";\n\t },\n\t isnull: function(a) {\n\t return \"(\" + a + \" == null)\";\n\t },\n\t isnotnull: function(a) {\n\t return \"(\" + a + \" != null)\";\n\t },\n\t isnullorempty: function(a) {\n\t return \"(\" + a + \" === null) || (\" + a + \" === '')\";\n\t },\n\t isnotnullorempty: function(a) {\n\t return \"(\" + a + \" !== null) && (\" + a + \" !== '')\";\n\t }\n\t };\n\t })();\n\n\t function Query(data) {\n\t this.data = data || [];\n\t }\n\n\t Query.filterExpr = function(expression) {\n\t var expressions = [],\n\t logic = { and: \" && \", or: \" || \" },\n\t idx,\n\t length,\n\t filter,\n\t expr,\n\t fieldFunctions = [],\n\t operatorFunctions = [],\n\t field,\n\t operator,\n\t filters = expression.filters;\n\n\t for (idx = 0, length = filters.length; idx < length; idx++) {\n\t filter = filters[idx];\n\t field = filter.field;\n\t operator = filter.operator;\n\n\t if (filter.filters) {\n\t expr = Query.filterExpr(filter);\n\t //Nested function fields or operators - update their index e.g. __o[0] -> __o[1]\n\t filter = expr.expression\n\t .replace(/__o\\[(\\d+)\\]/g, function(match, index) {\n\t index = +index;\n\t return \"__o[\" + (operatorFunctions.length + index) + \"]\";\n\t })\n\t .replace(/__f\\[(\\d+)\\]/g, function(match, index) {\n\t index = +index;\n\t return \"__f[\" + (fieldFunctions.length + index) + \"]\";\n\t });\n\n\t operatorFunctions.push.apply(operatorFunctions, expr.operators);\n\t fieldFunctions.push.apply(fieldFunctions, expr.fields);\n\t } else {\n\t if (typeof field === FUNCTION) {\n\t expr = \"__f[\" + fieldFunctions.length +\"](d)\";\n\t fieldFunctions.push(field);\n\t } else {\n\t expr = kendo.expr(field);\n\t }\n\n\t if (typeof operator === FUNCTION) {\n\t filter = \"__o[\" + operatorFunctions.length + \"](\" + expr + \", \" + operators.quote(filter.value) + \")\";\n\t operatorFunctions.push(operator);\n\t } else {\n\t filter = operators[(operator || \"eq\").toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined? filter.ignoreCase : true);\n\t }\n\t }\n\n\t expressions.push(filter);\n\t }\n\n\t return { expression: \"(\" + expressions.join(logic[expression.logic]) + \")\", fields: fieldFunctions, operators: operatorFunctions };\n\t };\n\n\t function normalizeSort(field, dir) {\n\t if (field) {\n\t var descriptor = typeof field === STRING ? { field: field, dir: dir } : field,\n\t descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []);\n\n\t return grep(descriptors, function(d) { return !!d.dir; });\n\t }\n\t }\n\n\t var operatorMap = {\n\t \"==\": \"eq\",\n\t equals: \"eq\",\n\t isequalto: \"eq\",\n\t equalto: \"eq\",\n\t equal: \"eq\",\n\t \"!=\": \"neq\",\n\t ne: \"neq\",\n\t notequals: \"neq\",\n\t isnotequalto: \"neq\",\n\t notequalto: \"neq\",\n\t notequal: \"neq\",\n\t \"<\": \"lt\",\n\t islessthan: \"lt\",\n\t lessthan: \"lt\",\n\t less: \"lt\",\n\t \"<=\": \"lte\",\n\t le: \"lte\",\n\t islessthanorequalto: \"lte\",\n\t lessthanequal: \"lte\",\n\t \">\": \"gt\",\n\t isgreaterthan: \"gt\",\n\t greaterthan: \"gt\",\n\t greater: \"gt\",\n\t \">=\": \"gte\",\n\t isgreaterthanorequalto: \"gte\",\n\t greaterthanequal: \"gte\",\n\t ge: \"gte\",\n\t notsubstringof: \"doesnotcontain\",\n\t isnull: \"isnull\",\n\t isempty: \"isempty\",\n\t isnotempty: \"isnotempty\"\n\t };\n\n\t function normalizeOperator(expression) {\n\t var idx,\n\t length,\n\t filter,\n\t operator,\n\t filters = expression.filters;\n\n\t if (filters) {\n\t for (idx = 0, length = filters.length; idx < length; idx++) {\n\t filter = filters[idx];\n\t operator = filter.operator;\n\n\t if (operator && typeof operator === STRING) {\n\t filter.operator = operatorMap[operator.toLowerCase()] || operator;\n\t }\n\n\t normalizeOperator(filter);\n\t }\n\t }\n\t }\n\n\t function normalizeFilter(expression) {\n\t if (expression && !isEmptyObject(expression)) {\n\t if (isArray(expression) || !expression.filters) {\n\t expression = {\n\t logic: \"and\",\n\t filters: isArray(expression) ? expression : [expression]\n\t };\n\t }\n\n\t normalizeOperator(expression);\n\n\t return expression;\n\t }\n\t }\n\n\t Query.normalizeFilter = normalizeFilter;\n\n\t function compareDescriptor(f1, f2) {\n\t if (f1.logic || f2.logic) {\n\t return false;\n\t }\n\n\t return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n\t }\n\n\t function normalizeDescriptor(filter) {\n\t filter = filter || {};\n\n\t if (isEmptyObject(filter)) {\n\t return { logic: \"and\", filters: [] };\n\t }\n\n\t return normalizeFilter(filter);\n\t }\n\n\t function fieldComparer(a, b) {\n\t if (b.logic || (a.field > b.field)) {\n\t return 1;\n\t } else if (a.field < b.field) {\n\t return -1;\n\t } else {\n\t return 0;\n\t }\n\t }\n\n\t function compareFilters(expr1, expr2) {\n\t expr1 = normalizeDescriptor(expr1);\n\t expr2 = normalizeDescriptor(expr2);\n\n\t if (expr1.logic !== expr2.logic) {\n\t return false;\n\t }\n\n\t var f1, f2;\n\t var filters1 = (expr1.filters || []).slice();\n\t var filters2 = (expr2.filters || []).slice();\n\n\t if (filters1.length !== filters2.length) {\n\t return false;\n\t }\n\n\t filters1 = filters1.sort(fieldComparer);\n\t filters2 = filters2.sort(fieldComparer);\n\n\t for (var idx = 0; idx < filters1.length; idx++) {\n\t f1 = filters1[idx];\n\t f2 = filters2[idx];\n\n\t if (f1.logic && f2.logic) {\n\t if (!compareFilters(f1, f2)) {\n\t return false;\n\t }\n\t } else if (!compareDescriptor(f1, f2)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t }\n\n\t Query.compareFilters = compareFilters;\n\n\t function normalizeAggregate(expressions) {\n\t return isArray(expressions) ? expressions : [expressions];\n\t }\n\n\t function normalizeGroup(field, dir) {\n\t var descriptor = typeof field === STRING ? { field: field, dir: dir } : field,\n\t descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined ? [descriptor] : []);\n\n\t return map(descriptors, function(d) { return { field: d.field, dir: d.dir || \"asc\", aggregates: d.aggregates }; });\n\t }\n\n\t Query.prototype = {\n\t toArray: function () {\n\t return this.data;\n\t },\n\t range: function(index, count) {\n\t return new Query(this.data.slice(index, index + count));\n\t },\n\t skip: function (count) {\n\t return new Query(this.data.slice(count));\n\t },\n\t take: function (count) {\n\t return new Query(this.data.slice(0, count));\n\t },\n\t select: function (selector) {\n\t return new Query(map(this.data, selector));\n\t },\n\t order: function(selector, dir, inPlace) {\n\t var sort = { dir: dir };\n\n\t if (selector) {\n\t if (selector.compare) {\n\t sort.compare = selector.compare;\n\t } else {\n\t sort.field = selector;\n\t }\n\t }\n\n\t if (inPlace) {\n\t return new Query(this.data.sort(Comparer.create(sort)));\n\t }\n\t return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n\t },\n\t orderBy: function(selector, inPlace) {\n\t return this.order(selector, \"asc\", inPlace);\n\t },\n\t orderByDescending: function(selector, inPlace) {\n\t return this.order(selector, \"desc\", inPlace);\n\t },\n\t sort: function(field, dir, comparer, inPlace) {\n\t var idx,\n\t length,\n\t descriptors = normalizeSort(field, dir),\n\t comparers = [];\n\n\t comparer = comparer || Comparer;\n\n\t if (descriptors.length) {\n\t for (idx = 0, length = descriptors.length; idx < length; idx++) {\n\t comparers.push(comparer.create(descriptors[idx]));\n\t }\n\n\t return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\n\t }\n\n\t return this;\n\t },\n\n\t filter: function(expressions) {\n\t var idx,\n\t current,\n\t length,\n\t compiled,\n\t predicate,\n\t data = this.data,\n\t fields,\n\t operators,\n\t result = [],\n\t filter;\n\n\t expressions = normalizeFilter(expressions);\n\n\t if (!expressions || expressions.filters.length === 0) {\n\t return this;\n\t }\n\n\t compiled = Query.filterExpr(expressions);\n\t fields = compiled.fields;\n\t operators = compiled.operators;\n\n\t predicate = filter = new Function(\"d, __f, __o\", \"return \" + compiled.expression);\n\n\t if (fields.length || operators.length) {\n\t filter = function(d) {\n\t return predicate(d, fields, operators);\n\t };\n\t }\n\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t current = data[idx];\n\n\t if (filter(current)) {\n\t result.push(current);\n\t }\n\t }\n\n\t return new Query(result);\n\t },\n\n\t group: function(descriptors, allData) {\n\t descriptors = normalizeGroup(descriptors || []);\n\t allData = allData || this.data;\n\n\t var that = this,\n\t result = new Query(that.data),\n\t descriptor;\n\n\t if (descriptors.length > 0) {\n\t descriptor = descriptors[0];\n\t result = result.groupBy(descriptor).select(function(group) {\n\t var data = new Query(allData).filter([ { field: group.field, operator: \"eq\", value: group.value, ignoreCase: false } ]);\n\t return {\n\t field: group.field,\n\t value: group.value,\n\t items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n\t hasSubgroups: descriptors.length > 1,\n\t aggregates: data.aggregate(descriptor.aggregates)\n\t };\n\t });\n\t }\n\t return result;\n\t },\n\n\t groupBy: function(descriptor) {\n\t if (isEmptyObject(descriptor) || !this.data.length) {\n\t return new Query([]);\n\t }\n\n\t var field = descriptor.field,\n\t sorted = this._sortForGrouping(field, descriptor.dir || \"asc\"),\n\t accessor = kendo.accessor(field),\n\t item,\n\t groupValue = accessor.get(sorted[0], field),\n\t group = {\n\t field: field,\n\t value: groupValue,\n\t items: []\n\t },\n\t currentValue,\n\t idx,\n\t len,\n\t result = [group];\n\n\t for(idx = 0, len = sorted.length; idx < len; idx++) {\n\t item = sorted[idx];\n\t currentValue = accessor.get(item, field);\n\t if(!groupValueComparer(groupValue, currentValue)) {\n\t groupValue = currentValue;\n\t group = {\n\t field: field,\n\t value: groupValue,\n\t items: []\n\t };\n\t result.push(group);\n\t }\n\t group.items.push(item);\n\t }\n\t return new Query(result);\n\t },\n\n\t _sortForGrouping: function(field, dir) {\n\t var idx, length,\n\t data = this.data;\n\n\t if (!stableSort) {\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t data[idx].__position = idx;\n\t }\n\n\t data = new Query(data).sort(field, dir, StableComparer).toArray();\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t delete data[idx].__position;\n\t }\n\t return data;\n\t }\n\t return this.sort(field, dir).toArray();\n\t },\n\n\t aggregate: function (aggregates) {\n\t var idx,\n\t len,\n\t result = {},\n\t state = {};\n\n\t if (aggregates && aggregates.length) {\n\t for(idx = 0, len = this.data.length; idx < len; idx++) {\n\t calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n\t }\n\t }\n\t return result;\n\t }\n\t };\n\n\t function groupValueComparer(a, b) {\n\t if (a && a.getTime && b && b.getTime) {\n\t return a.getTime() === b.getTime();\n\t }\n\t return a === b;\n\t }\n\n\t function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n\t aggregates = aggregates || [];\n\t var idx,\n\t aggr,\n\t functionName,\n\t len = aggregates.length;\n\n\t for (idx = 0; idx < len; idx++) {\n\t aggr = aggregates[idx];\n\t functionName = aggr.aggregate;\n\t var field = aggr.field;\n\t accumulator[field] = accumulator[field] || {};\n\t state[field] = state[field] || {};\n\t state[field][functionName] = state[field][functionName] || {};\n\t accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n\t }\n\t }\n\n\t var functions = {\n\t sum: function(accumulator, item, accessor) {\n\t var value = accessor.get(item);\n\n\t if (!isNumber(accumulator)) {\n\t accumulator = value;\n\t } else if (isNumber(value)) {\n\t accumulator += value;\n\t }\n\n\t return accumulator;\n\t },\n\t count: function(accumulator) {\n\t return (accumulator || 0) + 1;\n\t },\n\t average: function(accumulator, item, accessor, index, length, state) {\n\t var value = accessor.get(item);\n\n\t if (state.count === undefined) {\n\t state.count = 0;\n\t }\n\n\t if (!isNumber(accumulator)) {\n\t accumulator = value;\n\t } else if (isNumber(value)) {\n\t accumulator += value;\n\t }\n\n\t if (isNumber(value)) {\n\t state.count++;\n\t }\n\n\t if(index == length - 1 && isNumber(accumulator)) {\n\t accumulator = accumulator / state.count;\n\t }\n\t return accumulator;\n\t },\n\t max: function(accumulator, item, accessor) {\n\t var value = accessor.get(item);\n\n\t if (!isNumber(accumulator) && !isDate(accumulator)) {\n\t accumulator = value;\n\t }\n\n\t if(accumulator < value && (isNumber(value) || isDate(value))) {\n\t accumulator = value;\n\t }\n\t return accumulator;\n\t },\n\t min: function(accumulator, item, accessor) {\n\t var value = accessor.get(item);\n\n\t if (!isNumber(accumulator) && !isDate(accumulator)) {\n\t accumulator = value;\n\t }\n\n\t if(accumulator > value && (isNumber(value) || isDate(value))) {\n\t accumulator = value;\n\t }\n\t return accumulator;\n\t }\n\t };\n\n\t function isNumber(val) {\n\t return typeof val === \"number\" && !isNaN(val);\n\t }\n\n\t function isDate(val) {\n\t return val && val.getTime;\n\t }\n\n\t function toJSON(array) {\n\t var idx, length = array.length, result = new Array(length);\n\n\t for (idx = 0; idx < length; idx++) {\n\t result[idx] = array[idx].toJSON();\n\t }\n\n\t return result;\n\t }\n\n\t Query.normalizeGroup = normalizeGroup;\n\t Query.normalizeSort = normalizeSort;\n\n\t Query.process = function(data, options, inPlace) {\n\t options = options || {};\n\n\t var query = new Query(data),\n\t group = options.group,\n\t sort = normalizeGroup(group || []).concat(normalizeSort(options.sort || [])),\n\t total,\n\t filterCallback = options.filterCallback,\n\t filter = options.filter,\n\t skip = options.skip,\n\t take = options.take;\n\n\t if (sort && inPlace) {\n\t query = query.sort(sort, undefined, undefined, inPlace);\n\t }\n\n\t if (filter) {\n\t query = query.filter(filter);\n\n\t if (filterCallback) {\n\t query = filterCallback(query);\n\t }\n\n\t total = query.toArray().length;\n\t }\n\n\t if (sort && !inPlace) {\n\t query = query.sort(sort);\n\n\t if (group) {\n\t data = query.toArray();\n\t }\n\t }\n\n\t if (skip !== undefined && take !== undefined) {\n\t query = query.range(skip, take);\n\t }\n\n\t if (group) {\n\t query = query.group(group, data);\n\t }\n\n\t return {\n\t total: total,\n\t data: query.toArray()\n\t };\n\t };\n\n\t var LocalTransport = Class.extend({\n\t init: function(options) {\n\t this.data = options.data;\n\t },\n\n\t read: function(options) {\n\t options.success(this.data);\n\t },\n\t update: function(options) {\n\t options.success(options.data);\n\t },\n\t create: function(options) {\n\t options.success(options.data);\n\t },\n\t destroy: function(options) {\n\t options.success(options.data);\n\t }\n\t });\n\n\t var RemoteTransport = Class.extend( {\n\t init: function(options) {\n\t var that = this, parameterMap;\n\n\t options = that.options = extend({}, that.options, options);\n\n\t each(crud, function(index, type) {\n\t if (typeof options[type] === STRING) {\n\t options[type] = {\n\t url: options[type]\n\t };\n\t }\n\t });\n\n\t that.cache = options.cache? Cache.create(options.cache) : {\n\t find: noop,\n\t add: noop\n\t };\n\n\t parameterMap = options.parameterMap;\n\n\t if (options.submit) {\n\t that.submit = options.submit;\n\t }\n\n\t if (isFunction(options.push)) {\n\t that.push = options.push;\n\t }\n\n\t if (!that.push) {\n\t that.push = identity;\n\t }\n\n\t that.parameterMap = isFunction(parameterMap) ? parameterMap : function(options) {\n\t var result = {};\n\n\t each(options, function(option, value) {\n\t if (option in parameterMap) {\n\t option = parameterMap[option];\n\t if (isPlainObject(option)) {\n\t value = option.value(value);\n\t option = option.key;\n\t }\n\t }\n\n\t result[option] = value;\n\t });\n\n\t return result;\n\t };\n\t },\n\n\t options: {\n\t parameterMap: identity\n\t },\n\n\t create: function(options) {\n\t return ajax(this.setup(options, CREATE));\n\t },\n\n\t read: function(options) {\n\t var that = this,\n\t success,\n\t error,\n\t result,\n\t cache = that.cache;\n\n\t options = that.setup(options, READ);\n\n\t success = options.success || noop;\n\t error = options.error || noop;\n\n\t result = cache.find(options.data);\n\n\t if(result !== undefined) {\n\t success(result);\n\t } else {\n\t options.success = function(result) {\n\t cache.add(options.data, result);\n\n\t success(result);\n\t };\n\n\t $.ajax(options);\n\t }\n\t },\n\n\t update: function(options) {\n\t return ajax(this.setup(options, UPDATE));\n\t },\n\n\t destroy: function(options) {\n\t return ajax(this.setup(options, DESTROY));\n\t },\n\n\t setup: function(options, type) {\n\t options = options || {};\n\n\t var that = this,\n\t parameters,\n\t operation = that.options[type],\n\t data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n\n\t options = extend(true, {}, operation, options);\n\t parameters = extend(true, {}, data, options.data);\n\n\t options.data = that.parameterMap(parameters, type);\n\n\t if (isFunction(options.url)) {\n\t options.url = options.url(parameters);\n\t }\n\n\t return options;\n\t }\n\t });\n\n\t var Cache = Class.extend({\n\t init: function() {\n\t this._store = {};\n\t },\n\t add: function(key, data) {\n\t if(key !== undefined) {\n\t this._store[stringify(key)] = data;\n\t }\n\t },\n\t find: function(key) {\n\t return this._store[stringify(key)];\n\t },\n\t clear: function() {\n\t this._store = {};\n\t },\n\t remove: function(key) {\n\t delete this._store[stringify(key)];\n\t }\n\t });\n\n\t Cache.create = function(options) {\n\t var store = {\n\t \"inmemory\": function() { return new Cache(); }\n\t };\n\n\t if (isPlainObject(options) && isFunction(options.find)) {\n\t return options;\n\t }\n\n\t if (options === true) {\n\t return new Cache();\n\t }\n\n\t return store[options]();\n\t };\n\n\t function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n\t var record,\n\t getter,\n\t originalName,\n\t idx,\n\t setters = {},\n\t length;\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t record = data[idx];\n\t for (getter in getters) {\n\t originalName = fieldNames[getter];\n\n\t if (originalName && originalName !== getter) {\n\t if (!setters[originalName]) {\n\t setters[originalName] = kendo.setter(originalName);\n\t }\n\t setters[originalName](record, getters[getter](record));\n\t delete record[getter];\n\t }\n\t }\n\t }\n\t }\n\n\t function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n\t var record,\n\t getter,\n\t originalName,\n\t idx,\n\t length;\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t record = data[idx];\n\t for (getter in getters) {\n\t record[getter] = modelInstance._parse(getter, getters[getter](record));\n\n\t originalName = fieldNames[getter];\n\t if (originalName && originalName !== getter) {\n\t delete record[originalName];\n\t }\n\t }\n\t }\n\t }\n\n\t function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n\t var record,\n\t idx,\n\t fieldName,\n\t length;\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t record = data[idx];\n\n\t fieldName = originalFieldNames[record.field];\n\t if (fieldName && fieldName != record.field) {\n\t record.field = fieldName;\n\t }\n\n\t record.value = modelInstance._parse(record.field, record.value);\n\n\t if (record.hasSubgroups) {\n\t convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n\t } else {\n\t convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n\t }\n\t }\n\t }\n\n\t function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n\t return function(data) {\n\t data = originalFunction(data);\n\n\t return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\n\t };\n\t }\n\n\t function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\n\t return function(data) {\n\n\t if (data && !isEmptyObject(getters)) {\n\t if (toString.call(data) !== \"[object Array]\" && !(data instanceof ObservableArray)) {\n\t data = [data];\n\t }\n\n\t converter(data, getters, new model(), originalFieldNames, fieldNames);\n\t }\n\n\t return data || [];\n\t };\n\t }\n\n\t var DataReader = Class.extend({\n\t init: function(schema) {\n\t var that = this, member, get, model, base;\n\n\t schema = schema || {};\n\n\t for (member in schema) {\n\t get = schema[member];\n\n\t that[member] = typeof get === STRING ? getter(get) : get;\n\t }\n\n\t base = schema.modelBase || Model;\n\n\t if (isPlainObject(that.model)) {\n\t that.model = model = base.define(that.model);\n\t }\n\n\t var dataFunction = proxy(that.data, that);\n\n\t that._dataAccessFunction = dataFunction;\n\n\t if (that.model) {\n\t var groupsFunction = proxy(that.groups, that),\n\t serializeFunction = proxy(that.serialize, that),\n\t originalFieldNames = {},\n\t getters = {},\n\t serializeGetters = {},\n\t fieldNames = {},\n\t shouldSerialize = false,\n\t fieldName,\n\t name;\n\n\t model = that.model;\n\n\t if (model.fields) {\n\t each(model.fields, function(field, value) {\n\t var fromName;\n\n\t fieldName = field;\n\n\t if (isPlainObject(value) && value.field) {\n\t fieldName = value.field;\n\t } else if (typeof value === STRING) {\n\t fieldName = value;\n\t }\n\n\t if (isPlainObject(value) && value.from) {\n\t fromName = value.from;\n\t }\n\n\t shouldSerialize = shouldSerialize || (fromName && fromName !== field) || fieldName !== field;\n\t name = fromName || fieldName;\n\t getters[field] = name.indexOf(\".\") !== -1 ? getter(name, true) : getter(name);\n\t serializeGetters[field] = getter(field);\n\t originalFieldNames[fromName || fieldName] = field;\n\t fieldNames[field] = fromName || fieldName;\n\t });\n\n\t if (!schema.serialize && shouldSerialize) {\n\t that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n\t }\n\t }\n\n\t that._dataAccessFunction = dataFunction;\n\t that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\n\t that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n\t that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n\t }\n\t },\n\t errors: function(data) {\n\t return data ? data.errors : null;\n\t },\n\t parse: identity,\n\t data: identity,\n\t total: function(data) {\n\t return data.length;\n\t },\n\t groups: identity,\n\t aggregates: function() {\n\t return {};\n\t },\n\t serialize: function(data) {\n\t return data;\n\t }\n\t });\n\n\t function fillLastGroup(originalGroup, newGroup) {\n\t var currOriginal;\n\t var currentNew;\n\n\t if (newGroup.items && newGroup.items.length) {\n\t for (var i = 0; i < newGroup.items.length; i++) {\n\t currOriginal = originalGroup.items[i];\n\t currentNew = newGroup.items[i];\n\t if (currOriginal && currentNew) {\n\t if (currOriginal.hasSubgroups) {\n\t fillLastGroup(currOriginal, currentNew);\n\t } else if (currOriginal.field && currOriginal.value == currentNew.value) {\n\t currOriginal.items.push.apply(currOriginal.items, currentNew.items);\n\t } else {\n\t originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n\t }\n\t } else if (currentNew) {\n\t originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n\t }\n\t }\n\t }\n\t }\n\t function mergeGroups(target, dest, skip, take) {\n\t var group,\n\t idx = 0,\n\t items;\n\n\t while (dest.length && take) {\n\t group = dest[idx];\n\t items = group.items;\n\n\t var length = items.length;\n\n\t if (target && target.field === group.field && target.value === group.value) {\n\t if (target.hasSubgroups && target.items.length) {\n\t mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n\t } else {\n\t items = items.slice(skip, skip + take);\n\t target.items = target.items.concat(items);\n\t }\n\t dest.splice(idx--, 1);\n\t } else if (group.hasSubgroups && items.length) {\n\t mergeGroups(group, items, skip, take);\n\t if (!group.items.length) {\n\t dest.splice(idx--, 1);\n\t }\n\t } else {\n\t items = items.slice(skip, skip + take);\n\t group.items = items;\n\n\t if (!group.items.length) {\n\t dest.splice(idx--, 1);\n\t }\n\t }\n\n\t if (items.length === 0) {\n\t skip -= length;\n\t } else {\n\t skip = 0;\n\t take -= items.length;\n\t }\n\n\t if (++idx >= dest.length) {\n\t break;\n\t }\n\t }\n\n\t if (idx < dest.length) {\n\t dest.splice(idx, dest.length - idx);\n\t }\n\t }\n\n\t function flattenGroups(data) {\n\t var idx,\n\t result = [],\n\t length,\n\t items,\n\t itemIndex;\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t var group = data.at(idx);\n\t if (group.hasSubgroups) {\n\t result = result.concat(flattenGroups(group.items));\n\t } else {\n\t items = group.items;\n\t for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n\t result.push(items.at(itemIndex));\n\t }\n\t }\n\t }\n\t return result;\n\t }\n\n\t function wrapGroupItems(data, model) {\n\t var idx, length, group;\n\t if (model) {\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t group = data.at(idx);\n\n\t if (group.hasSubgroups) {\n\t wrapGroupItems(group.items, model);\n\t } else {\n\t group.items = new LazyObservableArray(group.items, model, group.items._events);\n\t }\n\t }\n\t }\n\t }\n\n\t function eachGroupItems(data, func) {\n\t for (var idx = 0; idx < data.length; idx++) {\n\t if (data[idx].hasSubgroups) {\n\t if (eachGroupItems(data[idx].items, func)) {\n\t return true;\n\t }\n\t } else if (func(data[idx].items, data[idx])) {\n\t return true;\n\t }\n\t }\n\t }\n\n\t function replaceInRanges(ranges, data, item, observable) {\n\t for (var idx = 0; idx < ranges.length; idx++) {\n\t if (ranges[idx].data === data) {\n\t break;\n\t }\n\t if (replaceInRange(ranges[idx].data, item, observable)) {\n\t break;\n\t }\n\t }\n\t }\n\n\t function replaceInRange(items, item, observable) {\n\t for (var idx = 0, length = items.length; idx < length; idx++) {\n\t if (items[idx] && items[idx].hasSubgroups) {\n\t return replaceInRange(items[idx].items, item, observable);\n\t } else if (items[idx] === item || items[idx] === observable) {\n\t items[idx] = observable;\n\t return true;\n\t }\n\t }\n\t }\n\n\t function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n\t for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n\t var item = view[viewIndex];\n\n\t if (!item || item instanceof type) {\n\t continue;\n\t }\n\n\t if (item.hasSubgroups !== undefined && !serverGrouping) {\n\t replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n\t } else {\n\t for (var idx = 0; idx < data.length; idx++) {\n\t if (data[idx] === item) {\n\t view[viewIndex] = data.at(idx);\n\t replaceInRanges(ranges, data, item, view[viewIndex]);\n\t break;\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t function removeModel(data, model) {\n\t var length = data.length;\n\t var dataItem;\n\t var idx;\n\n\t for (idx = 0; idx < length; idx++) {\n\t dataItem = data[idx];\n\n\t if (dataItem.uid && dataItem.uid == model.uid) {\n\t data.splice(idx, 1);\n\t return dataItem;\n\t }\n\t }\n\t }\n\n\t function indexOfPristineModel(data, model) {\n\t if (model) {\n\t return indexOf(data, function(item) {\n\t return (item.uid && item.uid == model.uid) || (item[model.idField] === model.id && model.id !== model._defaultId);\n\t });\n\t }\n\t return -1;\n\t }\n\n\t function indexOfModel(data, model) {\n\t if (model) {\n\t return indexOf(data, function(item) {\n\t return item.uid == model.uid;\n\t });\n\t }\n\t return -1;\n\t }\n\n\t function indexOf(data, comparer) {\n\t var idx, length;\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t if (comparer(data[idx])) {\n\t return idx;\n\t }\n\t }\n\n\t return -1;\n\t }\n\n\t function fieldNameFromModel(fields, name) {\n\t if (fields && !isEmptyObject(fields)) {\n\t var descriptor = fields[name];\n\t var fieldName;\n\t if (isPlainObject(descriptor)) {\n\t fieldName = descriptor.from || descriptor.field || name;\n\t } else {\n\t fieldName = fields[name] || name;\n\t }\n\n\t if (isFunction(fieldName)) {\n\t return name;\n\t }\n\n\t return fieldName;\n\t }\n\t return name;\n\t }\n\n\t function convertFilterDescriptorsField(descriptor, model) {\n\t var idx,\n\t length,\n\t target = {};\n\n\t for (var field in descriptor) {\n\t if (field !== \"filters\") {\n\t target[field] = descriptor[field];\n\t }\n\t }\n\n\t if (descriptor.filters) {\n\t target.filters = [];\n\t for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n\t target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n\t }\n\t } else {\n\t target.field = fieldNameFromModel(model.fields, target.field);\n\t }\n\t return target;\n\t }\n\n\t function convertDescriptorsField(descriptors, model) {\n\t var idx,\n\t length,\n\t result = [],\n\t target,\n\t descriptor;\n\n\t for (idx = 0, length = descriptors.length; idx < length; idx ++) {\n\t target = {};\n\n\t descriptor = descriptors[idx];\n\n\t for (var field in descriptor) {\n\t target[field] = descriptor[field];\n\t }\n\n\t target.field = fieldNameFromModel(model.fields, target.field);\n\n\t if (target.aggregates && isArray(target.aggregates)) {\n\t target.aggregates = convertDescriptorsField(target.aggregates, model);\n\t }\n\t result.push(target);\n\t }\n\t return result;\n\t }\n\n\t var DataSource = Observable.extend({\n\t init: function(options) {\n\t var that = this, model, data;\n\n\t if (options) {\n\t data = options.data;\n\t }\n\n\t options = that.options = extend({}, that.options, options);\n\n\t that._map = {};\n\t that._prefetch = {};\n\t that._data = [];\n\t that._pristineData = [];\n\t that._ranges = [];\n\t that._view = [];\n\t that._pristineTotal = 0;\n\t that._destroyed = [];\n\t that._pageSize = options.pageSize;\n\t that._page = options.page || (options.pageSize ? 1 : undefined);\n\t that._sort = normalizeSort(options.sort);\n\t that._filter = normalizeFilter(options.filter);\n\t that._group = normalizeGroup(options.group);\n\t that._aggregate = options.aggregate;\n\t that._total = options.total;\n\n\t that._shouldDetachObservableParents = true;\n\n\t Observable.fn.init.call(that);\n\n\t that.transport = Transport.create(options, data, that);\n\n\t if (isFunction(that.transport.push)) {\n\t that.transport.push({\n\t pushCreate: proxy(that._pushCreate, that),\n\t pushUpdate: proxy(that._pushUpdate, that),\n\t pushDestroy: proxy(that._pushDestroy, that)\n\t });\n\t }\n\n\t if (options.offlineStorage != null) {\n\t if (typeof options.offlineStorage == \"string\") {\n\t var key = options.offlineStorage;\n\n\t that._storage = {\n\t getItem: function() {\n\t return JSON.parse(localStorage.getItem(key));\n\t },\n\t setItem: function(item) {\n\t localStorage.setItem(key, stringify(that.reader.serialize(item)));\n\t }\n\t };\n\t } else {\n\t that._storage = options.offlineStorage;\n\t }\n\t }\n\n\t that.reader = new kendo.data.readers[options.schema.type || \"json\" ](options.schema);\n\n\t model = that.reader.model || {};\n\n\t that._detachObservableParents();\n\n\t that._data = that._observe(that._data);\n\t that._online = true;\n\n\t that.bind([\"push\", ERROR, CHANGE, REQUESTSTART, SYNC, REQUESTEND, PROGRESS], options);\n\t },\n\n\t options: {\n\t data: null,\n\t schema: {\n\t modelBase: Model\n\t },\n\t offlineStorage: null,\n\t serverSorting: false,\n\t serverPaging: false,\n\t serverFiltering: false,\n\t serverGrouping: false,\n\t serverAggregates: false,\n\t batch: false,\n\t inPlaceSort: false\n\t },\n\n\t clone: function() {\n\t return this;\n\t },\n\n\t online: function(value) {\n\t if (value !== undefined) {\n\t if (this._online != value) {\n\t this._online = value;\n\n\t if (value) {\n\t return this.sync();\n\t }\n\t }\n\n\t return $.Deferred().resolve().promise();\n\t } else {\n\t return this._online;\n\t }\n\t },\n\n\t offlineData: function(state) {\n\t if (this.options.offlineStorage == null) {\n\t return null;\n\t }\n\n\t if (state !== undefined) {\n\t return this._storage.setItem(state);\n\t }\n\n\t return this._storage.getItem() || [];\n\t },\n\n\t _isServerGrouped: function() {\n\t var group = this.group() || [];\n\n\t return this.options.serverGrouping && group.length;\n\t },\n\n\t _pushCreate: function(result) {\n\t this._push(result, \"pushCreate\");\n\t },\n\n\t _pushUpdate: function(result) {\n\t this._push(result, \"pushUpdate\");\n\t },\n\n\t _pushDestroy: function(result) {\n\t this._push(result, \"pushDestroy\");\n\t },\n\n\t _push: function(result, operation) {\n\t var data = this._readData(result);\n\n\t if (!data) {\n\t data = result;\n\t }\n\n\t this[operation](data);\n\t },\n\n\t _flatData: function(data, skip) {\n\t if (data) {\n\t if (this._isServerGrouped()) {\n\t return flattenGroups(data);\n\t }\n\n\t if (!skip) {\n\t for (var idx = 0; idx < data.length; idx++) {\n\t data.at(idx);\n\t }\n\t }\n\t }\n\n\t return data;\n\t },\n\n\t parent: noop,\n\n\t get: function(id) {\n\t var idx, length, data = this._flatData(this._data, this.options.useRanges);\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t if (data[idx].id == id) {\n\t return data[idx];\n\t }\n\t }\n\t },\n\n\t getByUid: function(id) {\n\t return this._getByUid(id, this._data);\n\t },\n\n\t _getByUid: function(id, dataItems) {\n\t var idx, length, data = this._flatData(dataItems, this.options.useRanges);\n\n\t if (!data) {\n\t return;\n\t }\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t if (data[idx].uid == id) {\n\t return data[idx];\n\t }\n\t }\n\t },\n\n\t indexOf: function(model) {\n\t return indexOfModel(this._data, model);\n\t },\n\n\t at: function(index) {\n\t return this._data.at(index);\n\t },\n\n\t data: function(value) {\n\t var that = this;\n\t if (value !== undefined) {\n\t that._detachObservableParents();\n\t that._data = this._observe(value);\n\n\t that._pristineData = value.slice(0);\n\n\t that._storeData();\n\n\t that._ranges = [];\n\t that.trigger(\"reset\");\n\t that._addRange(that._data);\n\n\t that._total = that._data.length;\n\t that._pristineTotal = that._total;\n\n\t that._process(that._data);\n\t } else {\n\t if (that._data) {\n\t for (var idx = 0; idx < that._data.length; idx++) {\n\t that._data.at(idx);\n\t }\n\t }\n\n\t return that._data;\n\t }\n\t },\n\n\t view: function(value) {\n\t if (value === undefined) {\n\t return this._view;\n\t } else {\n\t this._view = this._observeView(value);\n\t }\n\t },\n\n\t _observeView: function(data) {\n\t var that = this;\n\t replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n\n\t var view = new LazyObservableArray(data, that.reader.model);\n\t view.parent = function() { return that.parent(); };\n\t return view;\n\t },\n\n\t flatView: function() {\n\t var groups = this.group() || [];\n\n\t if (groups.length) {\n\t return flattenGroups(this._view);\n\t } else {\n\t return this._view;\n\t }\n\t },\n\n\t add: function(model) {\n\t return this.insert(this._data.length, model);\n\t },\n\n\t _createNewModel: function(model) {\n\t if (this.reader.model) {\n\t return new this.reader.model(model);\n\t }\n\n\t if (model instanceof ObservableObject) {\n\t return model;\n\t }\n\n\t return new ObservableObject(model);\n\t },\n\n\t insert: function(index, model) {\n\t if (!model) {\n\t model = index;\n\t index = 0;\n\t }\n\n\t if (!(model instanceof Model)) {\n\t model = this._createNewModel(model);\n\t }\n\n\t if (this._isServerGrouped()) {\n\t this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n\t } else {\n\t this._data.splice(index, 0, model);\n\t }\n\n\t this._insertModelInRange(index, model);\n\n\t return model;\n\t },\n\n\t pushInsert: function(index, items) {\n\t var that = this;\n\t var rangeSpan = that._getCurrentRangeSpan();\n\n\t if (!items) {\n\t items = index;\n\t index = 0;\n\t }\n\n\t if (!isArray(items)) {\n\t items = [items];\n\t }\n\n\t var pushed = [];\n\t var autoSync = this.options.autoSync;\n\t this.options.autoSync = false;\n\n\t try {\n\t for (var idx = 0; idx < items.length; idx ++) {\n\t var item = items[idx];\n\n\t var result = this.insert(index, item);\n\n\t pushed.push(result);\n\n\t var pristine = result.toJSON();\n\n\t if (this._isServerGrouped()) {\n\t pristine = this._wrapInEmptyGroup(pristine);\n\t }\n\n\t this._pristineData.push(pristine);\n\n\t if (rangeSpan && rangeSpan.length) {\n\t $(rangeSpan).last()[0].pristineData.push(pristine);\n\t }\n\n\t index++;\n\t }\n\t } finally {\n\t this.options.autoSync = autoSync;\n\t }\n\n\t if (pushed.length) {\n\t this.trigger(\"push\", {\n\t type: \"create\",\n\t items: pushed\n\t });\n\t }\n\t },\n\n\t pushCreate: function(items) {\n\t this.pushInsert(this._data.length, items);\n\t },\n\n\t pushUpdate: function(items) {\n\t if (!isArray(items)) {\n\t items = [items];\n\t }\n\n\t var pushed = [];\n\n\t for (var idx = 0; idx < items.length; idx ++) {\n\t var item = items[idx];\n\t var model = this._createNewModel(item);\n\n\t var target = this.get(model.id);\n\n\t if (target) {\n\t pushed.push(target);\n\n\t target.accept(item);\n\n\t target.trigger(CHANGE);\n\n\t this._updatePristineForModel(target, item);\n\t } else {\n\t this.pushCreate(item);\n\t }\n\t }\n\n\t if (pushed.length) {\n\t this.trigger(\"push\", {\n\t type: \"update\",\n\t items: pushed\n\t });\n\t }\n\t },\n\n\t pushDestroy: function(items) {\n\t var pushed = this._removeItems(items);\n\n\t if (pushed.length) {\n\t this.trigger(\"push\", {\n\t type: \"destroy\",\n\t items: pushed\n\t });\n\t }\n\t },\n\n\t _removeItems: function(items, removePristine) {\n\t if (!isArray(items)) {\n\t items = [items];\n\t }\n\n\t var shouldRemovePristine = typeof removePristine !== \"undefined\" ? removePristine : true;\n\n\t var destroyed = [];\n\t var autoSync = this.options.autoSync;\n\t this.options.autoSync = false;\n\t try {\n\t for (var idx = 0; idx < items.length; idx ++) {\n\t var item = items[idx];\n\t var model = this._createNewModel(item);\n\t var found = false;\n\n\t this._eachItem(this._data, function(items){\n\t for (var idx = 0; idx < items.length; idx++) {\n\t var item = items.at(idx);\n\t if (item.id === model.id) {\n\t destroyed.push(item);\n\t items.splice(idx, 1);\n\t found = true;\n\t break;\n\t }\n\t }\n\t });\n\n\t if (found && shouldRemovePristine) {\n\t this._removePristineForModel(model);\n\t this._destroyed.pop();\n\t }\n\t }\n\t } finally {\n\t this.options.autoSync = autoSync;\n\t }\n\n\t return destroyed;\n\t },\n\n\t remove: function(model) {\n\t var result,\n\t that = this,\n\t hasGroups = that._isServerGrouped();\n\n\t this._eachItem(that._data, function(items) {\n\t result = removeModel(items, model);\n\n\t if (result && hasGroups) {\n\t if (!result.isNew || !result.isNew()) {\n\t that._destroyed.push(result);\n\t }\n\t return true;\n\t }\n\t });\n\n\t this._removeModelFromRanges(model);\n\n\t return model;\n\t },\n\n\t destroyed: function() {\n\t return this._destroyed;\n\t },\n\n\t created: function() {\n\t var idx,\n\t length,\n\t result = [],\n\t data = this._flatData(this._data, this.options.useRanges);\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t if (data[idx].isNew && data[idx].isNew()) {\n\t result.push(data[idx]);\n\t }\n\t }\n\t return result;\n\t },\n\n\t updated: function() {\n\t var idx,\n\t length,\n\t result = [],\n\t data = this._flatData(this._data, this.options.useRanges);\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t if ((data[idx].isNew && !data[idx].isNew()) && data[idx].dirty) {\n\t result.push(data[idx]);\n\t }\n\t }\n\t return result;\n\t },\n\n\t sync: function() {\n\t var that = this,\n\t created = [],\n\t updated = [],\n\t destroyed = that._destroyed;\n\n\t var promise = $.Deferred().resolve().promise();\n\n\t if (that.online()) {\n\n\t if (!that.reader.model) {\n\t return promise;\n\t }\n\n\t created = that.created();\n\t updated = that.updated();\n\n\t var promises = [];\n\n\t if (that.options.batch && that.transport.submit) {\n\t promises = that._sendSubmit(created, updated, destroyed);\n\t } else {\n\t promises.push.apply(promises, that._send(\"create\", created));\n\t promises.push.apply(promises, that._send(\"update\", updated));\n\t promises.push.apply(promises, that._send(\"destroy\", destroyed));\n\t }\n\n\t promise = $.when\n\t .apply(null, promises)\n\t .then(function() {\n\t var idx, length;\n\n\t for (idx = 0, length = arguments.length; idx < length; idx++){\n\t if (arguments[idx]) {\n\t that._accept(arguments[idx]);\n\t }\n\t }\n\n\t that._storeData(true);\n\n\t that._syncEnd();\n\n\t that._change({ action: \"sync\" });\n\n\t that.trigger(SYNC);\n\t });\n\t } else {\n\t that._storeData(true);\n\n\t that._syncEnd();\n\n\t that._change({ action: \"sync\" });\n\t }\n\n\t return promise;\n\t },\n\n\t _syncEnd: noop,\n\n\t cancelChanges: function(model) {\n\t var that = this;\n\n\t if (model instanceof kendo.data.Model) {\n\t that._cancelModel(model);\n\t } else {\n\t that._destroyed = [];\n\t that._detachObservableParents();\n\t that._data = that._observe(that._pristineData);\n\t if (that.options.serverPaging) {\n\t that._total = that._pristineTotal;\n\t }\n\n\t that._ranges = [];\n\t that._addRange(that._data, 0);\n\n\t that._changesCanceled();\n\n\t that._change();\n\n\t that._markOfflineUpdatesAsDirty();\n\t }\n\t },\n\n\t _changesCanceled: noop,\n\n\t _markOfflineUpdatesAsDirty: function() {\n\t var that = this;\n\n\t if (that.options.offlineStorage != null) {\n\t that._eachItem(that._data, function(items) {\n\t for (var idx = 0; idx < items.length; idx++) {\n\t var item = items.at(idx);\n\t if (item.__state__ == \"update\" || item.__state__ == \"create\") {\n\t item.dirty = true;\n\t }\n\t }\n\t });\n\t }\n\t },\n\n\t hasChanges: function() {\n\t var idx,\n\t length,\n\t data = this._flatData(this._data, this.options.useRanges);\n\n\t if (this._destroyed.length) {\n\t return true;\n\t }\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t if ((data[idx].isNew && data[idx].isNew()) || data[idx].dirty) {\n\t return true;\n\t }\n\t }\n\n\t return false;\n\t },\n\n\t _accept: function(result) {\n\t var that = this,\n\t models = result.models,\n\t response = result.response,\n\t idx = 0,\n\t serverGroup = that._isServerGrouped(),\n\t pristine = that._pristineData,\n\t type = result.type,\n\t length;\n\n\t that.trigger(REQUESTEND, { response: response, type: type });\n\n\t if (response && !isEmptyObject(response)) {\n\t response = that.reader.parse(response);\n\n\t if (that._handleCustomErrors(response)) {\n\t return;\n\t }\n\n\t response = that.reader.data(response);\n\n\t if (!isArray(response)) {\n\t response = [response];\n\t }\n\t } else {\n\t response = $.map(models, function(model) { return model.toJSON(); } );\n\t }\n\n\t if (type === \"destroy\") {\n\t that._destroyed = [];\n\t }\n\n\t for (idx = 0, length = models.length; idx < length; idx++) {\n\t if (type !== \"destroy\") {\n\t models[idx].accept(response[idx]);\n\n\t if (type === \"create\") {\n\t pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\n\t } else if (type === \"update\") {\n\t that._updatePristineForModel(models[idx], response[idx]);\n\t }\n\t } else {\n\t that._removePristineForModel(models[idx]);\n\t }\n\t }\n\t },\n\n\t _updatePristineForModel: function(model, values) {\n\t this._executeOnPristineForModel(model, function(index, items) {\n\t kendo.deepExtend(items[index], values);\n\t });\n\t },\n\n\t _executeOnPristineForModel: function(model, callback) {\n\t this._eachPristineItem(\n\t function(items) {\n\t var index = indexOfPristineModel(items, model);\n\t if (index > -1) {\n\t callback(index, items);\n\t return true;\n\t }\n\t });\n\t },\n\n\t _removePristineForModel: function(model) {\n\t this._executeOnPristineForModel(model, function(index, items) {\n\t items.splice(index, 1);\n\t });\n\t },\n\n\t _readData: function(data) {\n\t var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n\t return read.call(this.reader, data);\n\t },\n\n\t _eachPristineItem: function(callback) {\n\t var that = this;\n\t var options = that.options;\n\t var rangeSpan = that._getCurrentRangeSpan();\n\n\t that._eachItem(that._pristineData, callback);\n\n\t if (options.serverPaging && options.useRanges) {\n\t each(rangeSpan, function(i, range) {\n\t that._eachItem(range.pristineData, callback);\n\t });\n\t }\n\t },\n\n\t _eachItem: function(data, callback) {\n\t if (data && data.length) {\n\t if (this._isServerGrouped()) {\n\t eachGroupItems(data, callback);\n\t } else {\n\t callback(data);\n\t }\n\t }\n\t },\n\n\t _pristineForModel: function(model) {\n\t var pristine,\n\t idx,\n\t callback = function(items) {\n\t idx = indexOfPristineModel(items, model);\n\t if (idx > -1) {\n\t pristine = items[idx];\n\t return true;\n\t }\n\t };\n\n\t this._eachPristineItem(callback);\n\n\t return pristine;\n\t },\n\n\t _cancelModel: function(model) {\n\t var that = this;\n\t var pristine = this._pristineForModel(model);\n\n\t this._eachItem(this._data, function(items) {\n\t var idx = indexOfModel(items, model);\n\t if (idx >= 0) {\n\t if (pristine && (!model.isNew() || pristine.__state__)) {\n\t items[idx].accept(pristine);\n\n\t if (pristine.__state__ == \"update\") {\n\t items[idx].dirty = true;\n\t }\n\n\t } else {\n\t that._modelCanceled(model);\n\n\t items.splice(idx, 1);\n\n\t that._removeModelFromRanges(model);\n\t }\n\t }\n\t });\n\t },\n\n\t _modelCanceled: noop,\n\n\t _submit: function(promises, data) {\n\t var that = this;\n\n\t that.trigger(REQUESTSTART, { type: \"submit\" });\n\n\t that.trigger(PROGRESS);\n\n\t that.transport.submit(extend({\n\t success: function(response, type) {\n\t var promise = $.grep(promises, function(x) {\n\t return x.type == type;\n\t })[0];\n\n\t if (promise) {\n\t promise.resolve({\n\t response: response,\n\t models: promise.models,\n\t type: type\n\t });\n\t }\n\t },\n\t error: function(response, status, error) {\n\t for (var idx = 0; idx < promises.length; idx++) {\n\t promises[idx].reject(response);\n\t }\n\n\t that.error(response, status, error);\n\t }\n\t }, data));\n\t },\n\n\t _sendSubmit: function(created, updated, destroyed) {\n\t var that = this,\n\t promises = [];\n\n\t if (that.options.batch) {\n\t if (created.length) {\n\t promises.push($.Deferred(function(deferred) {\n\t deferred.type = \"create\";\n\t deferred.models = created;\n\t }));\n\t }\n\n\t if (updated.length) {\n\t promises.push($.Deferred(function(deferred) {\n\t deferred.type = \"update\";\n\t deferred.models = updated;\n\t }));\n\t }\n\n\t if (destroyed.length) {\n\t promises.push($.Deferred(function(deferred) {\n\t deferred.type = \"destroy\";\n\t deferred.models = destroyed;\n\t }));\n\t }\n\n\t that._submit(promises, {\n\t data: {\n\t created: that.reader.serialize(toJSON(created)),\n\t updated: that.reader.serialize(toJSON(updated)),\n\t destroyed: that.reader.serialize(toJSON(destroyed))\n\t }\n\t });\n\t }\n\n\t return promises;\n\t },\n\n\t _promise: function(data, models, type) {\n\t var that = this;\n\n\t return $.Deferred(function(deferred) {\n\t that.trigger(REQUESTSTART, { type: type });\n\n\t that.trigger(PROGRESS);\n\n\t that.transport[type].call(that.transport, extend({\n\t success: function(response) {\n\t deferred.resolve({\n\t response: response,\n\t models: models,\n\t type: type\n\t });\n\t },\n\t error: function(response, status, error) {\n\t deferred.reject(response);\n\t that.error(response, status, error);\n\t }\n\t }, data));\n\t }).promise();\n\t },\n\n\t _send: function(method, data) {\n\t var that = this,\n\t idx,\n\t length,\n\t promises = [],\n\t converted = that.reader.serialize(toJSON(data));\n\n\t if (that.options.batch) {\n\t if (data.length) {\n\t promises.push(that._promise( { data: { models: converted } }, data , method));\n\t }\n\t } else {\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t promises.push(that._promise( { data: converted[idx] }, [ data[idx] ], method));\n\t }\n\t }\n\n\t return promises;\n\t },\n\n\t read: function(data) {\n\t var that = this, params = that._params(data);\n\t var deferred = $.Deferred();\n\n\t that._queueRequest(params, function() {\n\t var isPrevented = that.trigger(REQUESTSTART, { type: \"read\" });\n\t if (!isPrevented) {\n\t that.trigger(PROGRESS);\n\n\t that._ranges = [];\n\t that.trigger(\"reset\");\n\t if (that.online()) {\n\t that.transport.read({\n\t data: params,\n\t success: function(data) {\n\t that._ranges = [];\n\t that.success(data, params);\n\n\t deferred.resolve();\n\t },\n\t error: function() {\n\t var args = slice.call(arguments);\n\n\t that.error.apply(that, args);\n\n\t deferred.reject.apply(deferred, args);\n\t }\n\t });\n\t } else if (that.options.offlineStorage != null){\n\t that.success(that.offlineData(), params);\n\n\t deferred.resolve();\n\t }\n\t } else {\n\t that._dequeueRequest();\n\n\t deferred.resolve(isPrevented);\n\t }\n\t });\n\n\t return deferred.promise();\n\t },\n\n\t _readAggregates: function(data) {\n\t return this.reader.aggregates(data);\n\t },\n\n\t success: function(data) {\n\t var that = this,\n\t options = that.options,\n\t items,\n\t replaceSubset;\n\n\t that.trigger(REQUESTEND, { response: data, type: \"read\" });\n\n\t if (that.online()) {\n\t data = that.reader.parse(data);\n\n\t if (that._handleCustomErrors(data)) {\n\t that._dequeueRequest();\n\t return;\n\t }\n\n\t that._total = that.reader.total(data);\n\t if (that._pageSize > that._total) {\n\t that._pageSize = that._total;\n\t if (that.options.pageSize && that.options.pageSize > that._pageSize) {\n\t that._pageSize = that.options.pageSize;\n\t }\n\t }\n\n\t if (that._aggregate && options.serverAggregates) {\n\t that._aggregateResult = that._readAggregates(data);\n\t }\n\n\t data = that._readData(data);\n\n\t that._destroyed = [];\n\t } else {\n\t data = that._readData(data);\n\n\t items = [];\n\t var itemIds = {};\n\t var model = that.reader.model;\n\t var idField = model ? model.idField : \"id\";\n\t var idx;\n\n\t for (idx = 0; idx < this._destroyed.length; idx++) {\n\t var id = this._destroyed[idx][idField];\n\t itemIds[id] = id;\n\t }\n\n\t for (idx = 0; idx < data.length; idx++) {\n\t var item = data[idx];\n\t var state = item.__state__;\n\t if (state == \"destroy\") {\n\t if (!itemIds[item[idField]]) {\n\t this._destroyed.push(this._createNewModel(item));\n\t }\n\t } else {\n\t items.push(item);\n\t }\n\t }\n\n\t data = items;\n\n\t that._total = data.length;\n\t }\n\n\t that._pristineTotal = that._total;\n\t replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\n\n\t if (that.options.endless) {\n\t if (replaceSubset) {\n\t that._pristineData.splice(that._skip, that._pristineData.length);\n\t }\n\t items = data.slice(0);\n\t for (var j = 0; j < items.length; j++) {\n\t that._pristineData.push(items[j]);\n\t }\n\t } else {\n\t that._pristineData = data.slice(0);\n\t }\n\n\t that._detachObservableParents();\n\n\t if (that.options.endless) {\n\t that._data.unbind(CHANGE, that._changeHandler);\n\n\t if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\n\t fillLastGroup(that._data[that._data.length - 1], data[0]);\n\t data.shift();\n\t }\n\n\t data = that._observe(data);\n\t if (replaceSubset) {\n\t that._data.splice(that._skip, that._data.length);\n\t }\n\t for (var i = 0; i < data.length; i++) {\n\t that._data.push(data[i]);\n\t }\n\t that._data.bind(CHANGE, that._changeHandler);\n\t } else {\n\t that._data = that._observe(data);\n\t }\n\n\t that._markOfflineUpdatesAsDirty();\n\n\t that._storeData();\n\n\t that._addRange(that._data);\n\n\t that._process(that._data);\n\n\t that._dequeueRequest();\n\t },\n\n\t _detachObservableParents: function() {\n\t if (this._data && this._shouldDetachObservableParents) {\n\t for (var idx = 0; idx < this._data.length; idx++) {\n\t if (this._data[idx].parent) {\n\t this._data[idx].parent = noop;\n\t }\n\t }\n\t }\n\t },\n\n\t _storeData: function(updatePristine) {\n\t var serverGrouping = this._isServerGrouped();\n\t var model = this.reader.model;\n\n\t function items(data) {\n\t var state = [];\n\n\t for (var idx = 0; idx < data.length; idx++) {\n\t var dataItem = data.at(idx);\n\t var item = dataItem.toJSON();\n\n\t if (serverGrouping && dataItem.items) {\n\t item.items = items(dataItem.items);\n\t } else {\n\t item.uid = dataItem.uid;\n\n\t if (model) {\n\t if (dataItem.isNew()) {\n\t item.__state__ = \"create\";\n\t } else if (dataItem.dirty) {\n\t item.__state__ = \"update\";\n\t }\n\t }\n\t }\n\t state.push(item);\n\t }\n\n\t return state;\n\t }\n\n\t if (this.options.offlineStorage != null) {\n\t var state = items(this._data);\n\n\t var destroyed = [];\n\n\t for (var idx = 0; idx < this._destroyed.length; idx++) {\n\t var item = this._destroyed[idx].toJSON();\n\t item.__state__ = \"destroy\";\n\t destroyed.push(item);\n\t }\n\n\t this.offlineData(state.concat(destroyed));\n\n\t if (updatePristine) {\n\t this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\n\t }\n\t }\n\t },\n\n\t _addRange: function(data, skip) {\n\t var that = this,\n\t start = typeof(skip) !== \"undefined\" ? skip : (that._skip || 0),\n\t end = start + that._flatData(data, true).length;\n\n\t that._ranges.push({\n\t start: start,\n\t end: end,\n\t data: data,\n\t pristineData: data.toJSON(),\n\t timestamp: that._timeStamp()\n\t });\n\n\t that._sortRanges();\n\t },\n\n\t _sortRanges: function() {\n\t this._ranges.sort(function(x, y) {\n\t return x.start - y.start;\n\t });\n\t },\n\n\t error: function(xhr, status, errorThrown) {\n\t this._dequeueRequest();\n\t this.trigger(REQUESTEND, { });\n\t this.trigger(ERROR, { xhr: xhr, status: status, errorThrown: errorThrown });\n\t },\n\n\t _params: function(data) {\n\t var that = this,\n\t options = extend({\n\t take: that.take(),\n\t skip: that.skip(),\n\t page: that.page(),\n\t pageSize: that.pageSize(),\n\t sort: that._sort,\n\t filter: that._filter,\n\t group: that._group,\n\t aggregate: that._aggregate\n\t }, data);\n\n\t if (!that.options.serverPaging) {\n\t delete options.take;\n\t delete options.skip;\n\t delete options.page;\n\t delete options.pageSize;\n\t }\n\n\t if (!that.options.serverGrouping) {\n\t delete options.group;\n\t } else if (that.reader.model && options.group) {\n\t options.group = convertDescriptorsField(options.group, that.reader.model);\n\t }\n\n\t if (!that.options.serverFiltering) {\n\t delete options.filter;\n\t } else if (that.reader.model && options.filter) {\n\t options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n\t }\n\n\t if (!that.options.serverSorting) {\n\t delete options.sort;\n\t } else if (that.reader.model && options.sort) {\n\t options.sort = convertDescriptorsField(options.sort, that.reader.model);\n\t }\n\n\t if (!that.options.serverAggregates) {\n\t delete options.aggregate;\n\t } else if (that.reader.model && options.aggregate) {\n\t options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n\t }\n\n\t return options;\n\t },\n\n\t _queueRequest: function(options, callback) {\n\t var that = this;\n\t if (!that._requestInProgress) {\n\t that._requestInProgress = true;\n\t that._pending = undefined;\n\t callback();\n\t } else {\n\t that._pending = { callback: proxy(callback, that), options: options };\n\t }\n\t },\n\n\t _dequeueRequest: function() {\n\t var that = this;\n\t that._requestInProgress = false;\n\t if (that._pending) {\n\t that._queueRequest(that._pending.options, that._pending.callback);\n\t }\n\t },\n\n\t _handleCustomErrors: function(response) {\n\t if (this.reader.errors) {\n\t var errors = this.reader.errors(response);\n\t if (errors) {\n\t this.trigger(ERROR, { xhr: null, status: \"customerror\", errorThrown: \"custom error\", errors: errors });\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\n\t _shouldWrap: function(data) {\n\t var model = this.reader.model;\n\n\t if (model && data.length) {\n\t return !(data[0] instanceof model);\n\t }\n\n\t return false;\n\t },\n\n\t _observe: function(data) {\n\t var that = this,\n\t model = that.reader.model;\n\n\t that._shouldDetachObservableParents = true;\n\n\t if (data instanceof ObservableArray) {\n\t that._shouldDetachObservableParents = false;\n\t if (that._shouldWrap(data)) {\n\t data.type = that.reader.model;\n\t data.wrapAll(data, data);\n\t }\n\t } else {\n\t var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n\t data = new arrayType(data, that.reader.model);\n\t data.parent = function() { return that.parent(); };\n\t }\n\n\t if (that._isServerGrouped()) {\n\t wrapGroupItems(data, model);\n\t }\n\n\t if (that._changeHandler && that._data && that._data instanceof ObservableArray) {\n\t that._data.unbind(CHANGE, that._changeHandler);\n\t } else {\n\t that._changeHandler = proxy(that._change, that);\n\t }\n\n\t return data.bind(CHANGE, that._changeHandler);\n\t },\n\n\t _updateTotalForAction: function(action, items) {\n\t var that = this;\n\n\t var total = parseInt(that._total, 10);\n\n\t if (!isNumber(that._total)) {\n\t total = parseInt(that._pristineTotal, 10);\n\t }\n\t if (action === \"add\") {\n\t total += items.length;\n\t } else if (action === \"remove\") {\n\t total -= items.length;\n\t } else if (action !== \"itemchange\" && action !== \"sync\" && !that.options.serverPaging) {\n\t total = that._pristineTotal;\n\t } else if (action === \"sync\") {\n\t total = that._pristineTotal = parseInt(that._total, 10);\n\t }\n\n\t that._total = total;\n\t },\n\n\t _change: function(e) {\n\t var that = this, idx, length, action = e ? e.action : \"\";\n\n\t if (action === \"remove\") {\n\t for (idx = 0, length = e.items.length; idx < length; idx++) {\n\t if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n\t that._destroyed.push(e.items[idx]);\n\t }\n\t }\n\t }\n\n\t if (that.options.autoSync && (action === \"add\" || action === \"remove\" || action === \"itemchange\")) {\n\n\t var handler = function(args) {\n\t if (args.action === \"sync\") {\n\t that.unbind(\"change\", handler);\n\t that._updateTotalForAction(action, e.items);\n\t }\n\t };\n\n\t that.first(\"change\", handler);\n\n\t that.sync();\n\n\t } else {\n\t that._updateTotalForAction(action, e ? e.items : []);\n\n\t that._process(that._data, e);\n\t }\n\t },\n\n\t _calculateAggregates: function (data, options) {\n\t options = options || {};\n\n\t var query = new Query(data),\n\t aggregates = options.aggregate,\n\t filter = options.filter;\n\n\t if (filter) {\n\t query = query.filter(filter);\n\t }\n\n\t return query.aggregate(aggregates);\n\t },\n\n\t _process: function (data, e) {\n\t var that = this,\n\t options = {},\n\t result;\n\n\t if (that.options.serverPaging !== true) {\n\t options.skip = that._skip;\n\t options.take = that._take || that._pageSize;\n\n\t if(options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) {\n\t options.skip = (that._page - 1) * that._pageSize;\n\t }\n\n\t if (that.options.useRanges) {\n\t options.skip = that.currentRangeStart();\n\t }\n\t }\n\n\t if (that.options.serverSorting !== true) {\n\t options.sort = that._sort;\n\t }\n\n\t if (that.options.serverFiltering !== true) {\n\t options.filter = that._filter;\n\t }\n\n\t if (that.options.serverGrouping !== true) {\n\t options.group = that._group;\n\t }\n\n\t if (that.options.serverAggregates !== true) {\n\t options.aggregate = that._aggregate;\n\t }\n\n\t if (that.options.serverGrouping) {\n\t that._clearEmptyGroups(data);\n\t }\n\n\t result = that._queryProcess(data, options);\n\n\t if (that.options.serverAggregates !== true) {\n\t // for performance reasons, calculate aggregates for part of the data only after query process\n\t // this is necessary in the TreeList when paging\n\t that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\n\t }\n\n\t that.view(result.data);\n\n\t that._setFilterTotal(result.total, false);\n\n\t e = e || {};\n\n\t e.items = e.items || that._view;\n\n\t that.trigger(CHANGE, e);\n\t },\n\n\t _clearEmptyGroups: function(data) {\n\t for (var idx = data.length - 1; idx >=0; idx--) {\n\t var group = data[idx];\n\t if (group.hasSubgroups) {\n\t this._clearEmptyGroups(group.items);\n\t } else {\n\t if (group.items && !group.items.length) {\n\t splice.apply(group.parent(), [idx, 1]);\n\t }\n\t }\n\t }\n\t },\n\n\t _queryProcess: function(data, options) {\n\t if (this.options.inPlaceSort) {\n\t return Query.process(data, options, this.options.inPlaceSort);\n\t }\n\t else {\n\t return Query.process(data, options);\n\t }\n\t },\n\n\t _mergeState: function(options) {\n\t var that = this;\n\n\t if (options !== undefined) {\n\t that._pageSize = options.pageSize;\n\t that._page = options.page;\n\t that._sort = options.sort;\n\t that._filter = options.filter;\n\t that._group = options.group;\n\t that._aggregate = options.aggregate;\n\t that._skip = that._currentRangeStart = options.skip;\n\t that._take = options.take;\n\n\t if(that._skip === undefined) {\n\t that._skip = that._currentRangeStart = that.skip();\n\t options.skip = that.skip();\n\t }\n\n\t if(that._take === undefined && that._pageSize !== undefined) {\n\t that._take = that._pageSize;\n\t options.take = that._take;\n\t }\n\n\t if (options.sort) {\n\t that._sort = options.sort = normalizeSort(options.sort);\n\t }\n\n\t if (options.filter) {\n\t that._filter = options.filter = normalizeFilter(options.filter);\n\t }\n\n\t if (options.group) {\n\t that._group = options.group = normalizeGroup(options.group);\n\t }\n\t if (options.aggregate) {\n\t that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n\t }\n\t }\n\t return options;\n\t },\n\n\t query: function(options) {\n\t var result;\n\t var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n\n\t if (remote || ((this._data === undefined || this._data.length === 0) && !this._destroyed.length)) {\n\t if (this.options.endless) {\n\t var moreItemsCount = options.pageSize - this.pageSize();\n\t if (moreItemsCount > 0) {\n\t moreItemsCount = this.pageSize();\n\t options.page = options.pageSize / moreItemsCount;\n\t options.pageSize = moreItemsCount;\n\t } else {\n\t options.page = 1;\n\t this.options.endless = false;\n\t }\n\t }\n\t return this.read(this._mergeState(options));\n\t }\n\n\t var isPrevented = this.trigger(REQUESTSTART, { type: \"read\" });\n\t if (!isPrevented) {\n\t this.trigger(PROGRESS);\n\n\t result = this._queryProcess(this._data, this._mergeState(options));\n\n\t this._setFilterTotal(result.total, true);\n\n\t this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\n\t this.view(result.data);\n\t this.trigger(REQUESTEND, { type: \"read\" });\n\t this.trigger(CHANGE, { items: result.data });\n\t }\n\n\t return $.Deferred().resolve(isPrevented).promise();\n\t },\n\n\t _setFilterTotal: function(filterTotal, setDefaultValue) {\n\t var that = this;\n\n\t if (!that.options.serverFiltering) {\n\t if (filterTotal !== undefined) {\n\t that._total = filterTotal;\n\t } else if (setDefaultValue) {\n\t that._total = that._data.length;\n\t }\n\t }\n\t },\n\n\t fetch: function(callback) {\n\t var that = this;\n\t var fn = function(isPrevented) {\n\t if (isPrevented !== true && isFunction(callback)) {\n\t callback.call(that);\n\t }\n\t };\n\n\t return this._query().then(fn);\n\t },\n\n\t _query: function(options) {\n\t var that = this;\n\n\t return that.query(extend({}, {\n\t page: that.page(),\n\t pageSize: that.pageSize(),\n\t sort: that.sort(),\n\t filter: that.filter(),\n\t group: that.group(),\n\t aggregate: that.aggregate()\n\t }, options));\n\t },\n\n\t next: function(options) {\n\t var that = this,\n\t page = that.page(),\n\t total = that.total();\n\n\t options = options || {};\n\n\t if (!page || (total && page + 1 > that.totalPages())) {\n\t return;\n\t }\n\n\t that._skip = that._currentRangeStart = page * that.take();\n\n\t page += 1;\n\t options.page = page;\n\n\t that._query(options);\n\n\t return page;\n\t },\n\n\t prev: function(options) {\n\t var that = this,\n\t page = that.page();\n\n\t options = options || {};\n\n\t if (!page || page === 1) {\n\t return;\n\t }\n\n\t that._skip = that._currentRangeStart = that._skip - that.take();\n\n\t page -= 1;\n\t options.page = page;\n\n\t that._query(options);\n\n\t return page;\n\t },\n\n\t page: function(val) {\n\t var that = this,\n\t skip;\n\n\t if(val !== undefined) {\n\t val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n\t that._query(that._pageableQueryOptions({ page: val }));\n\t return;\n\t }\n\t skip = that.skip();\n\n\t return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n\t },\n\n\t pageSize: function(val) {\n\t var that = this;\n\n\t if (val !== undefined) {\n\t that._query(that._pageableQueryOptions({ pageSize: val, page: 1 }));\n\t return;\n\t }\n\n\t return that.take();\n\t },\n\n\t sort: function(val) {\n\t var that = this;\n\n\t if(val !== undefined) {\n\t that._query({ sort: val });\n\t return;\n\t }\n\n\t return that._sort;\n\t },\n\n\t filter: function(val) {\n\t var that = this;\n\n\t if (val === undefined) {\n\t return that._filter;\n\t }\n\n\t that.trigger(\"reset\");\n\t that._query({ filter: val, page: 1 });\n\t },\n\n\t group: function(val) {\n\t var that = this;\n\n\t if(val !== undefined) {\n\t that._query({ group: val });\n\t return;\n\t }\n\n\t return that._group;\n\t },\n\n\t total: function() {\n\t return parseInt(this._total || 0, 10);\n\t },\n\n\t aggregate: function(val) {\n\t var that = this;\n\n\t if(val !== undefined) {\n\t that._query({ aggregate: val });\n\t return;\n\t }\n\n\t return that._aggregate;\n\t },\n\n\t aggregates: function() {\n\t var result = this._aggregateResult;\n\n\t if (isEmptyObject(result)) {\n\t result = this._emptyAggregates(this.aggregate());\n\t }\n\n\t return result;\n\t },\n\n\t _emptyAggregates: function(aggregates) {\n\t var result = {};\n\n\t if (!isEmptyObject(aggregates)) {\n\t var aggregate = {};\n\n\t if (!isArray(aggregates)){\n\t aggregates = [aggregates];\n\t }\n\n\t for (var idx = 0; idx = length; idx--) {\n\t group = groups[idx];\n\t parent = {\n\t value: model.get ? model.get(group.field) : model[group.field],\n\t field: group.field,\n\t items: parent ? [parent] : [model],\n\t hasSubgroups: !!parent,\n\t aggregates: this._emptyAggregates(group.aggregates)\n\t };\n\t }\n\n\t return parent;\n\t },\n\n\t totalPages: function() {\n\t var that = this,\n\t pageSize = that.pageSize() || that.total();\n\n\t return math.ceil((that.total() || 0) / pageSize);\n\t },\n\n\t inRange: function(skip, take) {\n\t var that = this,\n\t end = math.min(skip + take, that.total());\n\n\t if (!that.options.serverPaging && that._data.length > 0) {\n\t return true;\n\t }\n\n\t return that._findRange(skip, end).length > 0;\n\t },\n\n\t lastRange: function() {\n\t var ranges = this._ranges;\n\t return ranges[ranges.length - 1] || { start: 0, end: 0, data: [] };\n\t },\n\n\t firstItemUid: function() {\n\t var ranges = this._ranges;\n\t return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n\t },\n\n\t enableRequestsInProgress: function() {\n\t this._skipRequestsInProgress = false;\n\t },\n\n\t _timeStamp: function() {\n\t return new Date().getTime();\n\t },\n\n\t range: function(skip, take, callback) {\n\t this._currentRequestTimeStamp = this._timeStamp();\n\t this._skipRequestsInProgress = true;\n\n\t skip = math.min(skip || 0, this.total());\n\t callback = isFunction(callback) ? callback : noop;\n\n\t var that = this,\n\t pageSkip = math.max(math.floor(skip / take), 0) * take,\n\t size = math.min(pageSkip + take, that.total()),\n\t data;\n\n\t data = that._findRange(skip, math.min(skip + take, that.total()));\n\n\t if (data.length || that.total() === 0) {\n\t that._processRangeData(data, skip, take, pageSkip, size);\n\t callback();\n\t return;\n\t }\n\n\t if (take !== undefined) {\n\t if (!that._rangeExists(pageSkip, size)) {\n\t that.prefetch(pageSkip, take, function() {\n\t if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n\t that.prefetch(size, take, function() {\n\t that.range(skip, take, callback );\n\t });\n\t } else {\n\t that.range(skip, take, callback);\n\t }\n\t });\n\t } else if (pageSkip < skip) {\n\t that.prefetch(size, take, function() {\n\t that.range(skip, take, callback );\n\t });\n\t }\n\t }\n\t },\n\n\t _findRange: function(start, end) {\n\t var that = this,\n\t ranges = that._ranges,\n\t range,\n\t data = [],\n\t skipIdx,\n\t takeIdx,\n\t startIndex,\n\t endIndex,\n\t rangeData,\n\t rangeEnd,\n\t processed,\n\t options = that.options,\n\t remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates,\n\t flatData,\n\t count,\n\t length;\n\n\t for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n\t range = ranges[skipIdx];\n\t if (start >= range.start && start <= range.end) {\n\t count = 0;\n\n\t for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n\t range = ranges[takeIdx];\n\t flatData = that._flatData(range.data, true);\n\n\t if (flatData.length && start + count >= range.start) {\n\t rangeData = range.data;\n\t rangeEnd = range.end;\n\n\t if (!remote) {\n\t if (options.inPlaceSort) {\n\t processed = that._queryProcess(range.data, { filter: that.filter() });\n\t } else {\n\t var sort = normalizeGroup(that.group() || []).concat(normalizeSort(that.sort() || []));\n\t processed = that._queryProcess(range.data, { sort: sort, filter: that.filter() });\n\t }\n\t flatData = rangeData = processed.data;\n\n\t if (processed.total !== undefined) {\n\t rangeEnd = processed.total;\n\t }\n\t }\n\n\t startIndex = 0;\n\t if (start + count > range.start) {\n\t startIndex = (start + count) - range.start;\n\t }\n\t endIndex = flatData.length;\n\t if (rangeEnd > end) {\n\t endIndex = endIndex - (rangeEnd - end);\n\t }\n\t count += endIndex - startIndex;\n\t data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n\n\t if (end <= range.end && count == end - start) {\n\t return data;\n\t }\n\t }\n\t }\n\t break;\n\t }\n\t }\n\t return [];\n\t },\n\n\t _mergeGroups: function(data, range, skip, take) {\n\t if (this._isServerGrouped()) {\n\t var temp = range.toJSON(),\n\t prevGroup;\n\n\t if (data.length) {\n\t prevGroup = data[data.length - 1];\n\t }\n\n\t mergeGroups(prevGroup, temp, skip, take);\n\n\t return data.concat(temp);\n\t }\n\t return data.concat(range.slice(skip, take));\n\t },\n\n\t _processRangeData: function(data, skip, take, pageSkip, size) {\n\t var that = this;\n\n\t that._pending = undefined;\n\n\t that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n\n\t that._currentRangeStart = skip;\n\n\t that._take = take;\n\n\t var paging = that.options.serverPaging;\n\t var sorting = that.options.serverSorting;\n\t var filtering = that.options.serverFiltering;\n\t var aggregates = that.options.serverAggregates;\n\t try {\n\t that.options.serverPaging = true;\n\t if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n\t that.options.serverSorting = true;\n\t }\n\t that.options.serverFiltering = true;\n\t that.options.serverPaging = true;\n\t that.options.serverAggregates = true;\n\n\t if (paging) {\n\t that._detachObservableParents();\n\t that._data = data = that._observe(data);\n\t }\n\t that._process(data);\n\t } finally {\n\t that.options.serverPaging = paging;\n\t that.options.serverSorting = sorting;\n\t that.options.serverFiltering = filtering;\n\t that.options.serverAggregates = aggregates;\n\t }\n\t },\n\n\t skip: function() {\n\t var that = this;\n\n\t if (that._skip === undefined) {\n\t return (that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined);\n\t }\n\t return that._skip;\n\t },\n\n\t currentRangeStart: function() {\n\t return this._currentRangeStart || 0;\n\t },\n\n\t take: function() {\n\t return this._take || this._pageSize;\n\t },\n\n\t _prefetchSuccessHandler: function (skip, size, callback, force) {\n\t var that = this;\n\t var timestamp = that._timeStamp();\n\n\t return function(data) {\n\t var found = false,\n\t range = { start: skip, end: size, data: [], timestamp: that._timeStamp() },\n\t idx,\n\t length,\n\t temp;\n\n\t that._dequeueRequest();\n\n\t that.trigger(REQUESTEND, { response: data, type: \"read\" });\n\n\t data = that.reader.parse(data);\n\n\t temp = that._readData(data);\n\n\t if (temp.length) {\n\t for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n\t if (that._ranges[idx].start === skip) {\n\t found = true;\n\t range = that._ranges[idx];\n\n\t range.pristineData = temp;\n\t range.data = that._observe(temp);\n\t range.end = range.start + that._flatData(range.data, true).length;\n\t that._sortRanges();\n\n\t break;\n\t }\n\t }\n\n\t if (!found) {\n\t that._addRange(that._observe(temp), skip);\n\t }\n\t }\n\n\t that._total = that.reader.total(data);\n\n\t if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n\t if (callback && temp.length) {\n\t callback();\n\t } else {\n\t that.trigger(CHANGE, {});\n\t }\n\t }\n\t };\n\t },\n\n\t prefetch: function(skip, take, callback) {\n\t var that = this,\n\t size = math.min(skip + take, that.total()),\n\t options = {\n\t take: take,\n\t skip: skip,\n\t page: skip / take + 1,\n\t pageSize: take,\n\t sort: that._sort,\n\t filter: that._filter,\n\t group: that._group,\n\t aggregate: that._aggregate\n\t };\n\n\t if (!that._rangeExists(skip, size)) {\n\t clearTimeout(that._timeout);\n\n\t that._timeout = setTimeout(function() {\n\t that._queueRequest(options, function() {\n\t if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\n\t that.transport.read({\n\t data: that._params(options),\n\t success: that._prefetchSuccessHandler(skip, size, callback),\n\t error: function() {\n\t var args = slice.call(arguments);\n\t that.error.apply(that, args);\n\t }\n\t });\n\t } else {\n\t that._dequeueRequest();\n\t }\n\t });\n\t }, 100);\n\t } else if (callback) {\n\t callback();\n\t }\n\t },\n\n\t _multiplePrefetch: function(skip, take, callback) {\n\t var that = this,\n\t size = math.min(skip + take, that.total()),\n\t options = {\n\t take: take,\n\t skip: skip,\n\t page: skip / take + 1,\n\t pageSize: take,\n\t sort: that._sort,\n\t filter: that._filter,\n\t group: that._group,\n\t aggregate: that._aggregate\n\t };\n\n\t if (!that._rangeExists(skip, size)) {\n\t if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\n\t that.transport.read({\n\t data: that._params(options),\n\t success: that._prefetchSuccessHandler(skip, size, callback, true)\n\t });\n\t }\n\t } else if (callback) {\n\t callback();\n\t }\n\t },\n\n\t _rangeExists: function(start, end) {\n\t var that = this,\n\t ranges = that._ranges,\n\t idx,\n\t length;\n\n\t for (idx = 0, length = ranges.length; idx < length; idx++) {\n\t if (ranges[idx].start <= start && ranges[idx].end >= end) {\n\t return true;\n\t }\n\t }\n\n\t return false;\n\t },\n\n\t _getCurrentRangeSpan: function() {\n\t var that = this;\n\t var ranges = that._ranges;\n\t var start = that.currentRangeStart();\n\t var end = start + (that.take() || 0);\n\t var rangeSpan = [];\n\t var range;\n\t var idx;\n\t var length = ranges.length;\n\n\t for (idx = 0; idx < length; idx++) {\n\t range = ranges[idx];\n\n\t if ((range.start <= start && range.end >= start) || (range.start >= start && range.start <= end)) {\n\t rangeSpan.push(range);\n\t }\n\t }\n\n\t return rangeSpan;\n\t },\n\n\t _removeModelFromRanges: function(model) {\n\t var that = this;\n\t var result,\n\t range;\n\n\t for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n\t range = this._ranges[idx];\n\n\t this._eachItem(range.data, function(items) {\n\t result = removeModel(items, model);\n\t });\n\n\t if (result) {\n\t break;\n\t }\n\t }\n\n\t that._updateRangesLength();\n\t },\n\n\t _insertModelInRange: function(index, model) {\n\t var that = this;\n\t var ranges = that._ranges || [];\n\t var rangesLength = ranges.length;\n\t var range;\n\t var i;\n\n\t for (i = 0; i < rangesLength; i++) {\n\t range = ranges[i];\n\n\t if (range.start <= index && range.end >= index) {\n\t if (!that._getByUid(model.uid, range.data)) {\n\t if (that._isServerGrouped()) {\n\t range.data.splice(index, 0, that._wrapInEmptyGroup(model));\n\t } else {\n\t range.data.splice(index, 0, model);\n\t }\n\t }\n\n\t break;\n\t }\n\t }\n\n\t that._updateRangesLength();\n\t },\n\n\t _updateRangesLength: function() {\n\t var that = this;\n\t var ranges = that._ranges || [];\n\t var rangesLength = ranges.length;\n\t var mismatchFound = false;\n\t var mismatchLength = 0;\n\t var lengthDifference = 0;\n\t var range;\n\t var i;\n\n\t for (i = 0; i < rangesLength; i++) {\n\t range = ranges[i];\n\t lengthDifference = that._flatData(range.data, true).length - math.abs(range.end - range.start);\n\n\t if (!mismatchFound && lengthDifference !== 0) {\n\t mismatchFound = true;\n\t mismatchLength = lengthDifference;\n\t range.end += mismatchLength;\n\t continue;\n\t }\n\n\t if (mismatchFound) {\n\t range.start += mismatchLength;\n\t range.end += mismatchLength;\n\t }\n\t }\n\t }\n\t });\n\n\t var Transport = {};\n\n\t Transport.create = function(options, data, dataSource) {\n\t var transport,\n\t transportOptions = options.transport ? $.extend({}, options.transport) : null;\n\n\t if (transportOptions) {\n\t transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n\n\t if (options.type === \"jsdo\") {\n\t transportOptions.dataSource = dataSource;\n\t }\n\n\t if (options.type) {\n\t kendo.data.transports = kendo.data.transports || {};\n\t kendo.data.schemas = kendo.data.schemas || {};\n\n\t if (!kendo.data.transports[options.type]) {\n\t 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\t } else if (!isPlainObject(kendo.data.transports[options.type])) {\n\t transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n\t } else {\n\t transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n\t }\n\n\t options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n\t }\n\n\t if (!transport) {\n\t transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n\t }\n\t } else {\n\t transport = new LocalTransport({ data: options.data || [] });\n\t }\n\t return transport;\n\t };\n\n\t DataSource.create = function(options) {\n\t if (isArray(options) || options instanceof ObservableArray) {\n\t options = { data: options };\n\t }\n\n\t var dataSource = options || {},\n\t data = dataSource.data,\n\t fields = dataSource.fields,\n\t table = dataSource.table,\n\t select = dataSource.select,\n\t idx,\n\t length,\n\t model = {},\n\t field;\n\n\t if (!data && fields && !dataSource.transport) {\n\t if (table) {\n\t data = inferTable(table, fields);\n\t } else if (select) {\n\t data = inferSelect(select, fields);\n\n\t if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n\t dataSource.group = \"optgroup\";\n\t }\n\t }\n\t }\n\n\t if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n\t for (idx = 0, length = fields.length; idx < length; idx++) {\n\t field = fields[idx];\n\t if (field.type) {\n\t model[field.field] = field;\n\t }\n\t }\n\n\t if (!isEmptyObject(model)) {\n\t dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n\t }\n\t }\n\n\t dataSource.data = data;\n\n\t select = null;\n\t dataSource.select = null;\n\t table = null;\n\t dataSource.table = null;\n\n\t return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n\t };\n\n\t function inferSelect(select, fields) {\n\t select = $(select)[0];\n\t var options = select.options;\n\t var firstField = fields[0];\n\t var secondField = fields[1];\n\n\t var data = [];\n\t var idx, length;\n\t var optgroup;\n\t var option;\n\t var record;\n\t var value;\n\n\t for (idx = 0, length = options.length; idx < length; idx++) {\n\t record = {};\n\t option = options[idx];\n\t optgroup = option.parentNode;\n\n\t if (optgroup === select) {\n\t optgroup = null;\n\t }\n\n\t if (option.disabled || (optgroup && optgroup.disabled)) {\n\t continue;\n\t }\n\n\t if (optgroup) {\n\t record.optgroup = optgroup.label;\n\t }\n\n\t record[firstField.field] = option.text;\n\n\t value = option.attributes.value;\n\n\t if (value && value.specified) {\n\t value = option.value;\n\t } else {\n\t value = option.text;\n\t }\n\n\t record[secondField.field] = value;\n\n\t data.push(record);\n\t }\n\n\t return data;\n\t }\n\n\t function inferTable(table, fields) {\n\t var tbody = $(table)[0].tBodies[0],\n\t rows = tbody ? tbody.rows : [],\n\t idx,\n\t length,\n\t fieldIndex,\n\t fieldCount = fields.length,\n\t data = [],\n\t cells,\n\t record,\n\t cell,\n\t empty;\n\n\t for (idx = 0, length = rows.length; idx < length; idx++) {\n\t record = {};\n\t empty = true;\n\t cells = rows[idx].cells;\n\n\t for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n\t cell = cells[fieldIndex];\n\t if(cell.nodeName.toLowerCase() !== \"th\") {\n\t empty = false;\n\t record[fields[fieldIndex].field] = cell.innerHTML;\n\t }\n\t }\n\t if(!empty) {\n\t data.push(record);\n\t }\n\t }\n\n\t return data;\n\t }\n\n\t var Node = Model.define({\n\t idField: \"id\",\n\n\t init: function(value) {\n\t var that = this,\n\t hasChildren = that.hasChildren || value && value.hasChildren,\n\t childrenField = \"items\",\n\t childrenOptions = {};\n\n\t kendo.data.Model.fn.init.call(that, value);\n\n\t if (typeof that.children === STRING) {\n\t childrenField = that.children;\n\t }\n\n\t childrenOptions = {\n\t schema: {\n\t data: childrenField,\n\t model: {\n\t hasChildren: hasChildren,\n\t id: that.idField,\n\t fields: that.fields\n\t }\n\t }\n\t };\n\n\t if (typeof that.children !== STRING) {\n\t extend(childrenOptions, that.children);\n\t }\n\n\t childrenOptions.data = value;\n\n\t if (!hasChildren) {\n\t hasChildren = childrenOptions.schema.data;\n\t }\n\n\t if (typeof hasChildren === STRING) {\n\t hasChildren = kendo.getter(hasChildren);\n\t }\n\n\t if (isFunction(hasChildren)) {\n\t var hasChildrenObject = hasChildren.call(that, that);\n\n\t if(hasChildrenObject && hasChildrenObject.length === 0){\n\t that.hasChildren = false;\n\t } else{\n\t that.hasChildren = !!hasChildrenObject;\n\t }\n\t }\n\n\t that._childrenOptions = childrenOptions;\n\n\t if (that.hasChildren) {\n\t that._initChildren();\n\t }\n\n\t that._loaded = !!(value && value._loaded);\n\t },\n\n\t _initChildren: function() {\n\t var that = this;\n\t var children, transport, parameterMap;\n\n\t if (!(that.children instanceof HierarchicalDataSource)) {\n\t children = that.children = new HierarchicalDataSource(that._childrenOptions);\n\n\t transport = children.transport;\n\t parameterMap = transport.parameterMap;\n\n\t transport.parameterMap = function(data, type) {\n\t data[that.idField || \"id\"] = that.id;\n\n\t if (parameterMap) {\n\t data = parameterMap(data, type);\n\t }\n\n\t return data;\n\t };\n\n\t children.parent = function(){\n\t return that;\n\t };\n\n\t children.bind(CHANGE, function(e){\n\t e.node = e.node || that;\n\t that.trigger(CHANGE, e);\n\t });\n\n\t children.bind(ERROR, function(e){\n\t var collection = that.parent();\n\n\t if (collection) {\n\t e.node = e.node || that;\n\t collection.trigger(ERROR, e);\n\t }\n\t });\n\n\t that._updateChildrenField();\n\t }\n\t },\n\n\t append: function(model) {\n\t this._initChildren();\n\t this.loaded(true);\n\t this.children.add(model);\n\t },\n\n\t hasChildren: false,\n\n\t level: function() {\n\t var parentNode = this.parentNode(),\n\t level = 0;\n\n\t while (parentNode && parentNode.parentNode) {\n\t level++;\n\t parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n\t }\n\n\t return level;\n\t },\n\n\t _updateChildrenField: function() {\n\t var fieldName = this._childrenOptions.schema.data;\n\n\t this[fieldName || \"items\"] = this.children.data();\n\t },\n\n\t _childrenLoaded: function() {\n\t this._loaded = true;\n\n\t this._updateChildrenField();\n\t },\n\n\t load: function() {\n\t var options = {};\n\t var method = \"_query\";\n\t var children, promise;\n\n\t if (this.hasChildren) {\n\t this._initChildren();\n\n\t children = this.children;\n\n\t options[this.idField || \"id\"] = this.id;\n\n\t if (!this._loaded) {\n\t children._data = undefined;\n\t method = \"read\";\n\t }\n\n\t children.one(CHANGE, proxy(this._childrenLoaded, this));\n\n\t if(this._matchFilter){\n\t options.filter = { field: '_matchFilter', operator: 'eq', value: true };\n\t }\n\n\t promise = children[method](options);\n\t } else {\n\t this.loaded(true);\n\t }\n\n\t return promise || $.Deferred().resolve().promise();\n\t },\n\n\t parentNode: function() {\n\t var array = this.parent();\n\n\t return array.parent();\n\t },\n\n\t loaded: function(value) {\n\t if (value !== undefined) {\n\t this._loaded = value;\n\t } else {\n\t return this._loaded;\n\t }\n\t },\n\n\t shouldSerialize: function(field) {\n\t return Model.fn.shouldSerialize.call(this, field) &&\n\t field !== \"children\" &&\n\t field !== \"_loaded\" &&\n\t field !== \"hasChildren\" &&\n\t field !== \"_childrenOptions\";\n\t }\n\t });\n\n\t function dataMethod(name) {\n\t return function() {\n\t var data = this._data,\n\t result = DataSource.fn[name].apply(this, slice.call(arguments));\n\n\t if (this._data != data) {\n\t this._attachBubbleHandlers();\n\t }\n\n\t return result;\n\t };\n\t }\n\n\t var HierarchicalDataSource = DataSource.extend({\n\t init: function(options) {\n\t var node = Node.define({\n\t children: options\n\t });\n\n\t if(options.filter && !options.serverFiltering){\n\t this._hierarchicalFilter = options.filter;\n\t options.filter = null;\n\t }\n\n\t DataSource.fn.init.call(this, extend(true, {}, { schema: { modelBase: node, model: node } }, options));\n\n\t this._attachBubbleHandlers();\n\t },\n\n\t _attachBubbleHandlers: function() {\n\t var that = this;\n\n\t that._data.bind(ERROR, function(e) {\n\t that.trigger(ERROR, e);\n\t });\n\t },\n\n\t read: function(data) {\n\t var result = DataSource.fn.read.call(this, data);\n\n\t if(this._hierarchicalFilter){\n\t if(this._data && this._data.length > 0){\n\t this.filter(this._hierarchicalFilter);\n\t }else{\n\t this.options.filter = this._hierarchicalFilter;\n\t this._filter = normalizeFilter(this.options.filter);\n\t this._hierarchicalFilter = null;\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t remove: function(node){\n\t var parentNode = node.parentNode(),\n\t dataSource = this,\n\t result;\n\n\t if (parentNode && parentNode._initChildren) {\n\t dataSource = parentNode.children;\n\t }\n\n\t result = DataSource.fn.remove.call(dataSource, node);\n\n\t if (parentNode && !dataSource.data().length) {\n\t parentNode.hasChildren = false;\n\t }\n\n\t return result;\n\t },\n\n\t success: dataMethod(\"success\"),\n\n\t data: dataMethod(\"data\"),\n\n\t insert: function(index, model) {\n\t var parentNode = this.parent();\n\n\t if (parentNode && parentNode._initChildren) {\n\t parentNode.hasChildren = true;\n\t parentNode._initChildren();\n\t }\n\n\t return DataSource.fn.insert.call(this, index, model);\n\t },\n\n\t filter: function(val) {\n\t if (val === undefined) {\n\t return this._filter;\n\t }\n\n\t if(!this.options.serverFiltering && this._markHierarchicalQuery(val)){\n\t val = { logic: \"or\", filters: [val, {field:'_matchFilter', operator: 'equals', value: true }]};\n\t }\n\n\t this.trigger(\"reset\");\n\t this._query({ filter: val, page: 1 });\n\t },\n\n\t _markHierarchicalQuery: function(expressions){\n\t var compiled;\n\t var predicate;\n\t var fields;\n\t var operators;\n\t var filter;\n\n\t expressions = normalizeFilter(expressions);\n\n\t if (!expressions || expressions.filters.length === 0) {\n\t this._updateHierarchicalFilter(function(){return true;});\n\t return false;\n\t }\n\n\t compiled = Query.filterExpr(expressions);\n\t fields = compiled.fields;\n\t operators = compiled.operators;\n\n\t predicate = filter = new Function(\"d, __f, __o\", \"return \" + compiled.expression);\n\n\t if (fields.length || operators.length) {\n\t filter = function(d) {\n\t return predicate(d, fields, operators);\n\t };\n\t }\n\n\t this._updateHierarchicalFilter(filter);\n\t return true;\n\t },\n\n\t _updateHierarchicalFilter: function(filter){\n\t var current;\n\t var data = this._data;\n\t var result = false;\n\n\t for (var idx = 0; idx < data.length; idx++) {\n\t current = data[idx];\n\n\t if(current.hasChildren){\n\t current._matchFilter = current.children._updateHierarchicalFilter(filter);\n\t if(!current._matchFilter){\n\t current._matchFilter = filter(current);\n\t }\n\t }else{\n\t current._matchFilter = filter(current);\n\t }\n\n\t if(current._matchFilter){\n\t result = true;\n\t }\n\t }\n\t return result;\n\t },\n\n\t _find: function(method, value) {\n\t var idx, length, node, children;\n\t var data = this._data;\n\n\t if (!data) {\n\t return;\n\t }\n\n\t node = DataSource.fn[method].call(this, value);\n\n\t if (node) {\n\t return node;\n\t }\n\n\t data = this._flatData(this._data);\n\n\t for (idx = 0, length = data.length; idx < length; idx++) {\n\t children = data[idx].children;\n\n\t if (!(children instanceof HierarchicalDataSource)) {\n\t continue;\n\t }\n\n\t node = children[method](value);\n\n\t if (node) {\n\t return node;\n\t }\n\t }\n\t },\n\n\t get: function(id) {\n\t return this._find(\"get\", id);\n\t },\n\n\t getByUid: function(uid) {\n\t return this._find(\"getByUid\", uid);\n\t }\n\t });\n\n\t function inferList(list, fields) {\n\t var items = $(list).children(),\n\t idx,\n\t length,\n\t data = [],\n\t record,\n\t textField = fields[0].field,\n\t urlField = fields[1] && fields[1].field,\n\t spriteCssClassField = fields[2] && fields[2].field,\n\t imageUrlField = fields[3] && fields[3].field,\n\t item,\n\t id,\n\t textChild,\n\t className,\n\t children;\n\n\t function elements(collection, tagName) {\n\t return collection.filter(tagName).add(collection.find(tagName));\n\t }\n\n\t for (idx = 0, length = items.length; idx < length; idx++) {\n\t record = { _loaded: true };\n\t item = items.eq(idx);\n\n\t textChild = item[0].firstChild;\n\t children = item.children();\n\t list = children.filter(\"ul\");\n\t children = children.filter(\":not(ul)\");\n\n\t id = item.attr(\"data-id\");\n\n\t if (id) {\n\t record.id = id;\n\t }\n\n\t if (textChild) {\n\t record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n\t }\n\n\t if (urlField) {\n\t record[urlField] = elements(children, \"a\").attr(\"href\");\n\t }\n\n\t if (imageUrlField) {\n\t record[imageUrlField] = elements(children, \"img\").attr(\"src\");\n\t }\n\n\t if (spriteCssClassField) {\n\t className = elements(children, \".k-sprite\").prop(\"className\");\n\t record[spriteCssClassField] = className && $.trim(className.replace(\"k-sprite\", \"\"));\n\t }\n\n\t if (list.length) {\n\t record.items = inferList(list.eq(0), fields);\n\t }\n\n\t if (item.attr(\"data-hasChildren\") == \"true\") {\n\t record.hasChildren = true;\n\t }\n\n\t data.push(record);\n\t }\n\n\t return data;\n\t }\n\n\t HierarchicalDataSource.create = function(options) {\n\t options = options && options.push ? { data: options } : options;\n\n\t var dataSource = options || {},\n\t data = dataSource.data,\n\t fields = dataSource.fields,\n\t list = dataSource.list;\n\n\t if (data && data._dataSource) {\n\t return data._dataSource;\n\t }\n\n\t if (!data && fields && !dataSource.transport) {\n\t if (list) {\n\t data = inferList(list, fields);\n\t }\n\t }\n\n\t dataSource.data = data;\n\n\t return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n\t };\n\n\t var Buffer = kendo.Observable.extend({\n\t init: function(dataSource, viewSize, disablePrefetch) {\n\t kendo.Observable.fn.init.call(this);\n\n\t this._prefetching = false;\n\t this.dataSource = dataSource;\n\t this.prefetch = !disablePrefetch;\n\n\t var buffer = this;\n\n\t dataSource.bind(\"change\", function() {\n\t buffer._change();\n\t });\n\n\t dataSource.bind(\"reset\", function() {\n\t buffer._reset();\n\t });\n\n\t this._syncWithDataSource();\n\n\t this.setViewSize(viewSize);\n\t },\n\n\t setViewSize: function(viewSize) {\n\t this.viewSize = viewSize;\n\t this._recalculate();\n\t },\n\n\t at: function(index) {\n\t var pageSize = this.pageSize,\n\t itemPresent = true;\n\n\t if (index >= this.total()) {\n\t this.trigger(\"endreached\", {index: index });\n\t return null;\n\t }\n\n\t if (!this.useRanges) {\n\t return this.dataSource.view()[index];\n\t }\n\t if (this.useRanges) {\n\t // out of range request\n\t if (index < this.dataOffset || index >= this.skip + pageSize) {\n\t itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n\t }\n\n\t // prefetch\n\t if (index === this.prefetchThreshold) {\n\t this._prefetch();\n\t }\n\n\t // mid-range jump - prefetchThreshold and nextPageThreshold may be equal, do not change to else if\n\t if (index === this.midPageThreshold) {\n\t this.range(this.nextMidRange, true);\n\t }\n\t // next range jump\n\t else if (index === this.nextPageThreshold) {\n\t this.range(this.nextFullRange);\n\t }\n\t // pull-back\n\t else if (index === this.pullBackThreshold) {\n\t if (this.offset === this.skip) { // from full range to mid range\n\t this.range(this.previousMidRange);\n\t } else { // from mid range to full range\n\t this.range(this.previousFullRange);\n\t }\n\t }\n\n\t if (itemPresent) {\n\t return this.dataSource.at(index - this.dataOffset);\n\t } else {\n\t this.trigger(\"endreached\", { index: index });\n\t return null;\n\t }\n\t }\n\t },\n\n\t indexOf: function(item) {\n\t return this.dataSource.data().indexOf(item) + this.dataOffset;\n\t },\n\n\t total: function() {\n\t return parseInt(this.dataSource.total(), 10);\n\t },\n\n\t next: function() {\n\t var buffer = this,\n\t pageSize = buffer.pageSize,\n\t offset = buffer.skip - buffer.viewSize + pageSize,\n\t pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n\n\t this.offset = offset;\n\t this.dataSource.prefetch(pageSkip, pageSize, function() {\n\t buffer._goToRange(offset, true);\n\t });\n\t },\n\n\t range: function(offset, nextRange) {\n\t if (this.offset === offset) {\n\t return true;\n\t }\n\n\t var buffer = this,\n\t pageSize = this.pageSize,\n\t pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize,\n\t dataSource = this.dataSource;\n\n\t if (nextRange) {\n\t pageSkip += pageSize;\n\t }\n\n\t if (dataSource.inRange(offset, pageSize)) {\n\t this.offset = offset;\n\t this._recalculate();\n\t this._goToRange(offset);\n\t return true;\n\t } else if (this.prefetch) {\n\t dataSource.prefetch(pageSkip, pageSize, function() {\n\t buffer.offset = offset;\n\t buffer._recalculate();\n\t buffer._goToRange(offset, true);\n\t });\n\t return false;\n\t }\n\n\t return true;\n\t },\n\n\t syncDataSource: function() {\n\t var offset = this.offset;\n\t this.offset = null;\n\t this.range(offset);\n\t },\n\n\t destroy: function() {\n\t this.unbind();\n\t },\n\n\t _prefetch: function() {\n\t var buffer = this,\n\t pageSize = this.pageSize,\n\t prefetchOffset = this.skip + pageSize,\n\t dataSource = this.dataSource;\n\n\t if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n\t this._prefetching = true;\n\t this.trigger(\"prefetching\", { skip: prefetchOffset, take: pageSize });\n\n\t dataSource.prefetch(prefetchOffset, pageSize, function() {\n\t buffer._prefetching = false;\n\t buffer.trigger(\"prefetched\", { skip: prefetchOffset, take: pageSize });\n\t });\n\t }\n\t },\n\n\t _goToRange: function(offset, expanding) {\n\t if (this.offset !== offset) {\n\t return;\n\t }\n\n\t this.dataOffset = offset;\n\t this._expanding = expanding;\n\t this.dataSource.range(offset, this.pageSize);\n\t this.dataSource.enableRequestsInProgress();\n\t },\n\n\t _reset: function() {\n\t this._syncPending = true;\n\t },\n\n\t _change: function() {\n\t var dataSource = this.dataSource;\n\n\t this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n\n\t if (this._syncPending) {\n\t this._syncWithDataSource();\n\t this._recalculate();\n\t this._syncPending = false;\n\t this.trigger(\"reset\", { offset: this.offset });\n\t }\n\n\t this.trigger(\"resize\");\n\n\t if (this._expanding) {\n\t this.trigger(\"expand\");\n\t }\n\n\t delete this._expanding;\n\t },\n\n\t _syncWithDataSource: function() {\n\t var dataSource = this.dataSource;\n\n\t this._firstItemUid = dataSource.firstItemUid();\n\t this.dataOffset = this.offset = dataSource.skip() || 0;\n\t this.pageSize = dataSource.pageSize();\n\t this.useRanges = dataSource.options.serverPaging;\n\t },\n\n\t _recalculate: function() {\n\t var pageSize = this.pageSize,\n\t offset = this.offset,\n\t viewSize = this.viewSize,\n\t skip = Math.ceil(offset / pageSize) * pageSize;\n\n\t this.skip = skip;\n\t this.midPageThreshold = skip + pageSize - 1;\n\t this.nextPageThreshold = skip + viewSize - 1;\n\t this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n\t this.pullBackThreshold = this.offset - 1;\n\n\t this.nextMidRange = skip + pageSize - viewSize;\n\t this.nextFullRange = skip;\n\t this.previousMidRange = offset - viewSize;\n\t this.previousFullRange = skip - pageSize;\n\t }\n\t });\n\n\t var BatchBuffer = kendo.Observable.extend({\n\t init: function(dataSource, batchSize) {\n\t var batchBuffer = this;\n\n\t kendo.Observable.fn.init.call(batchBuffer);\n\n\t this.dataSource = dataSource;\n\t this.batchSize = batchSize;\n\t this._total = 0;\n\n\t this.buffer = new Buffer(dataSource, batchSize * 3);\n\n\t this.buffer.bind({\n\t \"endreached\": function (e) {\n\t batchBuffer.trigger(\"endreached\", { index: e.index });\n\t },\n\t \"prefetching\": function (e) {\n\t batchBuffer.trigger(\"prefetching\", { skip: e.skip, take: e.take });\n\t },\n\t \"prefetched\": function (e) {\n\t batchBuffer.trigger(\"prefetched\", { skip: e.skip, take: e.take });\n\t },\n\t \"reset\": function () {\n\t batchBuffer._total = 0;\n\t batchBuffer.trigger(\"reset\");\n\t },\n\t \"resize\": function () {\n\t batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n\t batchBuffer.trigger(\"resize\", { total: batchBuffer.total(), offset: this.offset });\n\t }\n\t });\n\t },\n\n\t syncDataSource: function() {\n\t this.buffer.syncDataSource();\n\t },\n\n\t at: function(index) {\n\t var buffer = this.buffer,\n\t skip = index * this.batchSize,\n\t take = this.batchSize,\n\t view = [],\n\t item;\n\n\t if (buffer.offset > skip) {\n\t buffer.at(buffer.offset - 1);\n\t }\n\n\t for (var i = 0; i < take; i++) {\n\t item = buffer.at(skip + i);\n\n\t if (item === null) {\n\t break;\n\t }\n\n\t view.push(item);\n\t }\n\n\t return view;\n\t },\n\n\t total: function() {\n\t return this._total;\n\t },\n\n\t destroy: function() {\n\t this.buffer.destroy();\n\t this.unbind();\n\t }\n\t });\n\n\t extend(true, kendo.data, {\n\t readers: {\n\t json: DataReader\n\t },\n\t Query: Query,\n\t DataSource: DataSource,\n\t HierarchicalDataSource: HierarchicalDataSource,\n\t Node: Node,\n\t ObservableObject: ObservableObject,\n\t ObservableArray: ObservableArray,\n\t LazyObservableArray: LazyObservableArray,\n\t LocalTransport: LocalTransport,\n\t RemoteTransport: RemoteTransport,\n\t Cache: Cache,\n\t DataReader: DataReader,\n\t Model: Model,\n\t Buffer: Buffer,\n\t BatchBuffer: BatchBuffer\n\t });\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ }),\n\n/***/ 1047:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.data.odata\");\n\n/***/ }),\n\n/***/ 1048:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.data.xml\");\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1049);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1004:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1049:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1004) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"data.odata\",\n\t name: \"OData\",\n\t category: \"framework\",\n\t depends: [ \"core\" ],\n\t hidden: true\n\t};\n\n\t(function($, undefined) {\n\t var kendo = window.kendo,\n\t extend = $.extend,\n\t NEWLINE = \"\\r\\n\",\n\t DOUBLELINE = \"\\r\\n\\r\\n\",\n\t isFunction = kendo.isFunction,\n\t odataFilters = {\n\t eq: \"eq\",\n\t neq: \"ne\",\n\t gt: \"gt\",\n\t gte: \"ge\",\n\t lt: \"lt\",\n\t lte: \"le\",\n\t contains : \"substringof\",\n\t doesnotcontain: \"substringof\",\n\t endswith: \"endswith\",\n\t startswith: \"startswith\",\n\t isnull: \"eq\",\n\t isnotnull: \"ne\",\n\t isnullorempty: \"eq\",\n\t isnotnullorempty: \"ne\",\n\t isempty: \"eq\",\n\t isnotempty: \"ne\"\n\t },\n\t odataFiltersVersionFour = extend({}, odataFilters, {\n\t contains: \"contains\"\n\t }),\n\t mappers = {\n\t pageSize: $.noop,\n\t page: $.noop,\n\t filter: function(params, filter, useVersionFour) {\n\t if (filter) {\n\t filter = toOdataFilter(filter, useVersionFour);\n\t if (filter) {\n\t params.$filter = filter;\n\t }\n\t }\n\t },\n\t sort: function(params, orderby) {\n\t var expr = $.map(orderby, function(value) {\n\t var order = value.field.replace(/\\./g, \"/\");\n\n\t if (value.dir === \"desc\") {\n\t order += \" desc\";\n\t }\n\n\t return order;\n\t }).join(\",\");\n\n\t if (expr) {\n\t params.$orderby = expr;\n\t }\n\t },\n\t skip: function(params, skip) {\n\t if (skip) {\n\t params.$skip = skip;\n\t }\n\t },\n\t take: function(params, take) {\n\t if (take) {\n\t params.$top = take;\n\t }\n\t }\n\t },\n\t defaultDataType = {\n\t read: {\n\t dataType: \"jsonp\"\n\t }\n\t };\n\n\t function toOdataFilter(filter, useOdataFour) {\n\t var result = [],\n\t logic = filter.logic || \"and\",\n\t idx,\n\t length,\n\t field,\n\t type,\n\t format,\n\t operator,\n\t value,\n\t ignoreCase,\n\t filters = filter.filters;\n\n\t for (idx = 0, length = filters.length; idx < length; idx++) {\n\t filter = filters[idx];\n\t field = filter.field;\n\t value = filter.value;\n\t operator = filter.operator;\n\n\t if (filter.filters) {\n\t filter = toOdataFilter(filter, useOdataFour);\n\t } else {\n\t ignoreCase = filter.ignoreCase;\n\t field = field.replace(/\\./g, \"/\");\n\t filter = odataFilters[operator];\n\t if (useOdataFour) {\n\t filter = odataFiltersVersionFour[operator];\n\t }\n\n\t if (operator === \"isnullorempty\") {\n\t filter = kendo.format(\"{0} {1} null or {0} {1} ''\", field, filter);\n\t } else if(operator === \"isnotnullorempty\") {\n\t filter = kendo.format(\"{0} {1} null and {0} {1} ''\", field, filter);\n\t } else if (operator === \"isnull\" || operator === \"isnotnull\") {\n\t filter = kendo.format(\"{0} {1} null\", field, filter);\n\t } else if (operator === \"isempty\" || operator === \"isnotempty\") {\n\t filter = kendo.format(\"{0} {1} ''\", field, filter);\n\t } else if (filter && value !== undefined) {\n\t type = $.type(value);\n\t if (type === \"string\") {\n\t format = \"'{1}'\";\n\t value = value.replace(/'/g, \"''\");\n\n\t if (ignoreCase === true) {\n\t field = \"tolower(\" + field + \")\";\n\t }\n\n\t } else if (type === \"date\") {\n\t if (useOdataFour) {\n\t format = \"{1:yyyy-MM-ddTHH:mm:ss+00:00}\";\n\t value = kendo.timezone.apply(value, 'Etc/UTC');\n\t } else {\n\t format = \"datetime'{1:yyyy-MM-ddTHH:mm:ss}'\";\n\t }\n\t } else {\n\t format = \"{1}\";\n\t }\n\n\t if (filter.length > 3) {\n\t if (filter !== \"substringof\") {\n\t format = \"{0}({2},\" + format + \")\";\n\t } else {\n\t format = \"{0}(\" + format + \",{2})\";\n\t if (operator === \"doesnotcontain\") {\n\t if (useOdataFour) {\n\t format = \"{0}({2},'{1}') eq -1\";\n\t filter = \"indexof\";\n\t } else {\n\t format += \" eq false\";\n\t }\n\t }\n\t }\n\t } else {\n\t format = \"{2} {0} \" + format;\n\t }\n\n\t filter = kendo.format(format, filter, value, field);\n\t }\n\t }\n\n\t result.push(filter);\n\t }\n\n\t filter = result.join(\" \" + logic + \" \");\n\n\t if (result.length > 1) {\n\t filter = \"(\" + filter + \")\";\n\t }\n\n\t return filter;\n\t }\n\n\t function stripMetadata(obj) {\n\t for (var name in obj) {\n\t if(name.indexOf(\"@odata\") === 0) {\n\t delete obj[name];\n\t }\n\t }\n\t }\n\n\t function hex16() {\n\t return Math.floor((1 + Math.random()) * 0x10000).toString(16).substr(1);\n\t }\n\n\t function createBoundary(prefix) {\n\t return prefix + hex16() + '-' + hex16() + '-' + hex16();\n\t }\n\n\t function createDelimeter(boundary, close) {\n\t var result = NEWLINE + \"--\" + boundary;\n\n\t if (close) {\n\t result += \"--\";\n\t }\n\n\t return result;\n\t }\n\n\t function createCommand(transport, item, httpVerb, command) {\n\t var transportUrl = transport.options[command].url;\n\t var commandPrefix = kendo.format(\"{0} \", httpVerb);\n\n\t if (isFunction(transportUrl)) {\n\t return commandPrefix + transportUrl(item);\n\t } else {\n\t return commandPrefix + transportUrl;\n\t }\n\t }\n\n\t function getOperationHeader(changeset, changeId) {\n\t var header = \"\";\n\n\t header += createDelimeter(changeset, false);\n\t header += NEWLINE + 'Content-Type: application/http';\n\t header += NEWLINE + 'Content-Transfer-Encoding: binary';\n\t header += NEWLINE + 'Content-ID: ' + changeId;\n\n\t return header;\n\t }\n\n\t function getOperationContent(item) {\n\t var content = \"\";\n\n\t content += NEWLINE + \"Content-Type: application/json;odata=minimalmetadata\";\n\t content += NEWLINE + \"Prefer: return=representation\";\n\t content += DOUBLELINE + kendo.stringify(item);\n\n\t return content;\n\t }\n\n\t function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n\t var requestBody = \"\";\n\n\t for (var i = 0; i < collection.length; i++) {\n\t requestBody += getOperationHeader(changeset, changeId);\n\t requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n\t if (!skipContent) {\n\t requestBody += getOperationContent(collection[i]);\n\t }\n\t requestBody += NEWLINE;\n\t changeId++;\n\t }\n\n\t return requestBody;\n\t }\n\n\t function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n\t var requestBody = \"\";\n\n\t requestBody += getBoundary(boundary, changeset);\n\t requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n\t requestBody += createDelimeter(changeset, true);\n\t requestBody += NEWLINE;\n\n\t return requestBody;\n\t }\n\n\t function getBoundary(boundary,changeset) {\n\t var requestBody = \"\";\n\n\t requestBody += \"--\" + boundary + NEWLINE;\n\t requestBody += \"Content-Type: multipart/mixed; boundary=\" + changeset + NEWLINE;\n\n\t return requestBody;\n\t }\n\n\t function createBatchRequest(transport, colections) {\n\t var options = {};\n\t var boundary = createBoundary(\"sf_batch_\");\n\t var requestBody = \"\";\n\t var changeId = 0;\n\t var batchURL = transport.options.batch.url;\n\t var changeset = createBoundary(\"sf_changeset_\");\n\n\t options.type = transport.options.batch.type;\n\t options.url = isFunction(batchURL) ? batchURL() : batchURL;\n\t options.headers = {\n\t \"Content-Type\": \"multipart/mixed; boundary=\" + boundary\n\t };\n\n\t if (colections.updated.length) {\n\t requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, \"update\", false);\n\t changeId += colections.updated.length;\n\t changeset = createBoundary(\"sf_changeset_\");\n\t }\n\n\t if (colections.destroyed.length) {\n\t requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, \"destroy\", true);\n\t changeId += colections.destroyed.length;\n\t changeset = createBoundary(\"sf_changeset_\");\n\t }\n\n\t if (colections.created.length) {\n\t requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, \"create\", false);\n\t }\n\n\t requestBody += createDelimeter(boundary, true);\n\n\t options.data = requestBody;\n\n\t return options;\n\t }\n\n\t function parseBatchResponse(responseText) {\n\t var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n\t var markerIndex = 0;\n\t var collections = [];\n\t var changeBody;\n\t var status;\n\t var code;\n\t var marker;\n\t var jsonModel;\n\n\t collections.push({ models: [], passed: true });\n\n\t for (var i = 0; i < responseMarkers.length; i++) {\n\t marker = responseMarkers[i];\n\t if (marker.lastIndexOf('--', marker.length - 1)) {\n\t if (i < responseMarkers.length - 1) {\n\t collections.push({ models: [], passed: true });\n\t }\n\t continue;\n\t }\n\n\t if (!markerIndex) {\n\t markerIndex = responseText.indexOf(marker);\n\t } else {\n\t markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n\t }\n\n\t changeBody = responseText.substring(markerIndex, responseText.indexOf(\"--\", markerIndex + 1));\n\t status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n\t code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n\n\t if (code >= 200 && code <= 299) {\n\t jsonModel = changeBody.match(/\\{.*\\}/gm);\n\t if (jsonModel) {\n\t collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n\t }\n\t } else {\n\t collections[collections.length - 1].passed = false;\n\t }\n\n\t }\n\n\t return collections;\n\t }\n\n\t extend(true, kendo.data, {\n\t schemas: {\n\t odata: {\n\t type: \"json\",\n\t data: function(data) {\n\t return data.d.results || [data.d];\n\t },\n\t total: \"d.__count\"\n\t }\n\t },\n\t transports: {\n\t odata: {\n\t read: {\n\t cache: true, // to prevent jQuery from adding cache buster\n\t dataType: \"jsonp\",\n\t jsonp: \"$callback\"\n\t },\n\t update: {\n\t cache: true,\n\t dataType: \"json\",\n\t contentType: \"application/json\", // to inform the server the the request body is JSON encoded\n\t type: \"PUT\" // can be PUT or MERGE\n\t },\n\t create: {\n\t cache: true,\n\t dataType: \"json\",\n\t contentType: \"application/json\",\n\t type: \"POST\" // must be POST to create new entity\n\t },\n\t destroy: {\n\t cache: true,\n\t dataType: \"json\",\n\t type: \"DELETE\"\n\t },\n\t parameterMap: function(options, type, useVersionFour) {\n\t var params,\n\t value,\n\t option,\n\t dataType;\n\n\t options = options || {};\n\t type = type || \"read\";\n\t dataType = (this.options || defaultDataType)[type];\n\t dataType = dataType ? dataType.dataType : \"json\";\n\n\t if (type === \"read\") {\n\t params = {\n\t $inlinecount: \"allpages\"\n\t };\n\n\t if (dataType != \"json\") {\n\t params.$format = \"json\";\n\t }\n\n\t for (option in options) {\n\t if (mappers[option]) {\n\t mappers[option](params, options[option], useVersionFour);\n\t } else {\n\t params[option] = options[option];\n\t }\n\t }\n\t } else {\n\t if (dataType !== \"json\") {\n\t throw new Error(\"Only json dataType can be used for \" + type + \" operation.\");\n\t }\n\n\t if (type !== \"destroy\") {\n\t for (option in options) {\n\t value = options[option];\n\t if (typeof value === \"number\") {\n\t options[option] = value + \"\";\n\t }\n\t }\n\n\t params = kendo.stringify(options);\n\t }\n\t }\n\n\t return params;\n\t }\n\t }\n\t }\n\t });\n\n\t extend(true, kendo.data, {\n\t schemas: {\n\t \"odata-v4\": {\n\t type: \"json\",\n\t data: function(data) {\n\t if ($.isArray(data)) {\n\t for (var i = 0; i < data.length; i++) {\n\t stripMetadata(data[i]);\n\t }\n\t return data;\n\t } else {\n\t data = $.extend({}, data);\n\t stripMetadata(data);\n\n\t if (data.value) {\n\t return data.value;\n\t }\n\t return [data];\n\t }\n\t },\n\t total: function(data) {\n\t return data[\"@odata.count\"];\n\t }\n\t }\n\t },\n\t transports: {\n\t \"odata-v4\": {\n\t batch: {\n\t type: \"POST\"\n\t },\n\t read: {\n\t cache: true, // to prevent jQuery from adding cache buster\n\t dataType: \"json\"\n\t },\n\t update: {\n\t cache: true,\n\t dataType: \"json\",\n\t contentType: \"application/json;IEEE754Compatible=true\", // to inform the server the the request body is JSON encoded\n\t type: \"PUT\" // can be PUT or MERGE\n\t },\n\t create: {\n\t cache: true,\n\t dataType: \"json\",\n\t contentType: \"application/json;IEEE754Compatible=true\",\n\t type: \"POST\" // must be POST to create new entity\n\t },\n\t destroy: {\n\t cache: true,\n\t dataType: \"json\",\n\t type: \"DELETE\"\n\t },\n\t parameterMap: function(options, type) {\n\t var result = kendo.data.transports.odata.parameterMap(options, type, true);\n\t if (type == \"read\") {\n\t result.$count = true;\n\t delete result.$inlinecount;\n\t }\n\n\t return result;\n\t },\n\t submit: function(e) {\n\t var that = this;\n\t var options = createBatchRequest(that, e.data);\n\t var collections = e.data;\n\n\t if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n\t return;\n\t }\n\n\t $.ajax(extend(true, {}, {\n\t success: function (response) {\n\t var responses = parseBatchResponse(response);\n\t var index = 0;\n\t var current;\n\n\t if (collections.updated.length) {\n\t current = responses[index];\n\t if (current.passed) {\n\t // Pass either the obtained models or an empty array if only status codes are returned.\n\t e.success(current.models.length ? current.models : [], \"update\");\n\t }\n\t index++;\n\t }\n\t if (collections.destroyed.length) {\n\t current = responses[index];\n\t if (current.passed) {\n\t // For delete operations OData returns only status codes.\n\t // Passing empty array to datasource will force it to correctly remove the deleted items from the pristine collection.\n\t e.success([], \"destroy\");\n\t }\n\t index++;\n\t }\n\t if (collections.created.length) {\n\t current = responses[index];\n\t if (current.passed) {\n\t e.success(current.models, \"create\");\n\t }\n\t }\n\t },\n\t error: function (response, status, error) {\n\t e.error(response, status, error);\n\t }\n\t }, options));\n\t }\n\t }\n\t }\n\t });\n\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1123);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1004:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1038:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.userevents\");\n\n/***/ }),\n\n/***/ 1123:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\r\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1004), __webpack_require__(1038) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\t})(function(){\r\n\r\n\tvar __meta__ = { // jshint ignore:line\r\n\t id: \"draganddrop\",\r\n\t name: \"Drag & drop\",\r\n\t category: \"framework\",\r\n\t description: \"Drag & drop functionality for any DOM element.\",\r\n\t depends: [ \"core\", \"userevents\" ]\r\n\t};\r\n\r\n\t(function ($, undefined) {\r\n\t var kendo = window.kendo,\r\n\t support = kendo.support,\r\n\t document = window.document,\r\n\t $window = $(window),\r\n\t Class = kendo.Class,\r\n\t Widget = kendo.ui.Widget,\r\n\t Observable = kendo.Observable,\r\n\t UserEvents = kendo.UserEvents,\r\n\t proxy = $.proxy,\r\n\t extend = $.extend,\r\n\t getOffset = kendo.getOffset,\r\n\t draggables = {},\r\n\t dropTargets = {},\r\n\t dropAreas = {},\r\n\t lastDropTarget,\r\n\t elementUnderCursor = kendo.elementUnderCursor,\r\n\t KEYUP = \"keyup\",\r\n\t CHANGE = \"change\",\r\n\r\n\t // Draggable events\r\n\t DRAGSTART = \"dragstart\",\r\n\t HOLD = \"hold\",\r\n\t DRAG = \"drag\",\r\n\t DRAGEND = \"dragend\",\r\n\t DRAGCANCEL = \"dragcancel\",\r\n\t HINTDESTROYED = \"hintDestroyed\",\r\n\r\n\t // DropTarget events\r\n\t DRAGENTER = \"dragenter\",\r\n\t DRAGLEAVE = \"dragleave\",\r\n\t DROP = \"drop\";\r\n\r\n\t function contains(parent, child) {\r\n\t try {\r\n\t return $.contains(parent, child) || parent == child;\r\n\t } catch (e) {\r\n\t return false;\r\n\t }\r\n\t }\r\n\r\n\t function numericCssPropery(element, property) {\r\n\t return parseInt(element.css(property), 10) || 0;\r\n\t }\r\n\r\n\t function within(value, range) {\r\n\t return Math.min(Math.max(value, range.min), range.max);\r\n\t }\r\n\r\n\t function containerBoundaries(container, element) {\r\n\t var offset = getOffset(container),\r\n\t outerWidth = kendo._outerWidth,\r\n\t outerHeight = kendo._outerHeight,\r\n\t minX = offset.left + numericCssPropery(container, \"borderLeftWidth\") + numericCssPropery(container, \"paddingLeft\"),\r\n\t minY = offset.top + numericCssPropery(container, \"borderTopWidth\") + numericCssPropery(container, \"paddingTop\"),\r\n\t maxX = minX + container.width() - outerWidth(element, true),\r\n\t maxY = minY + container.height() - outerHeight(element, true);\r\n\r\n\t return {\r\n\t x: { min: minX, max: maxX },\r\n\t y: { min: minY, max: maxY }\r\n\t };\r\n\t }\r\n\r\n\t function checkTarget(target, targets, areas) {\r\n\t var theTarget, theFilter, i = 0,\r\n\t targetLen = targets && targets.length,\r\n\t areaLen = areas && areas.length;\r\n\r\n\t while (target && target.parentNode) {\r\n\t for (i = 0; i < targetLen; i ++) {\r\n\t theTarget = targets[i];\r\n\t if (theTarget.element[0] === target) {\r\n\t return { target: theTarget, targetElement: target };\r\n\t }\r\n\t }\r\n\r\n\t for (i = 0; i < areaLen; i ++) {\r\n\t theFilter = areas[i];\r\n\t if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\r\n\t return { target: theFilter, targetElement: target };\r\n\t }\r\n\t }\r\n\r\n\t target = target.parentNode;\r\n\t }\r\n\r\n\t return undefined;\r\n\t }\r\n\r\n\t var TapCapture = Observable.extend({\r\n\t init: function(element, options) {\r\n\t var that = this,\r\n\t domElement = element[0];\r\n\r\n\t that.capture = false;\r\n\r\n\t if (domElement.addEventListener) {\r\n\t $.each(kendo.eventMap.down.split(\" \"), function() {\r\n\t domElement.addEventListener(this, proxy(that._press, that), true);\r\n\t });\r\n\t $.each(kendo.eventMap.up.split(\" \"), function() {\r\n\t domElement.addEventListener(this, proxy(that._release, that), true);\r\n\t });\r\n\t } else {\r\n\t $.each(kendo.eventMap.down.split(\" \"), function() {\r\n\t domElement.attachEvent(this, proxy(that._press, that));\r\n\t });\r\n\t $.each(kendo.eventMap.up.split(\" \"), function() {\r\n\t domElement.attachEvent(this, proxy(that._release, that));\r\n\t });\r\n\t }\r\n\r\n\t Observable.fn.init.call(that);\r\n\r\n\t that.bind([\"press\", \"release\"], options || {});\r\n\t },\r\n\r\n\t captureNext: function() {\r\n\t this.capture = true;\r\n\t },\r\n\r\n\t cancelCapture: function() {\r\n\t this.capture = false;\r\n\t },\r\n\r\n\t _press: function(e) {\r\n\t var that = this;\r\n\t that.trigger(\"press\");\r\n\t if (that.capture) {\r\n\t e.preventDefault();\r\n\t }\r\n\t },\r\n\r\n\t _release: function(e) {\r\n\t var that = this;\r\n\t that.trigger(\"release\");\r\n\r\n\t if (that.capture) {\r\n\t e.preventDefault();\r\n\t that.cancelCapture();\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t var PaneDimension = Observable.extend({\r\n\t init: function(options) {\r\n\t var that = this;\r\n\t Observable.fn.init.call(that);\r\n\r\n\t that.forcedEnabled = false;\r\n\r\n\t $.extend(that, options);\r\n\r\n\t that.scale = 1;\r\n\r\n\t if (that.horizontal) {\r\n\t that.measure = \"offsetWidth\";\r\n\t that.scrollSize = \"scrollWidth\";\r\n\t that.axis = \"x\";\r\n\t } else {\r\n\t that.measure = \"offsetHeight\";\r\n\t that.scrollSize = \"scrollHeight\";\r\n\t that.axis = \"y\";\r\n\t }\r\n\t },\r\n\r\n\t makeVirtual: function() {\r\n\t $.extend(this, {\r\n\t virtual: true,\r\n\t forcedEnabled: true,\r\n\t _virtualMin: 0,\r\n\t _virtualMax: 0\r\n\t });\r\n\t },\r\n\r\n\t virtualSize: function(min, max) {\r\n\t if (this._virtualMin !== min || this._virtualMax !== max) {\r\n\t this._virtualMin = min;\r\n\t this._virtualMax = max;\r\n\t this.update();\r\n\t }\r\n\t },\r\n\r\n\t outOfBounds: function(offset) {\r\n\t return offset > this.max || offset < this.min;\r\n\t },\r\n\r\n\t forceEnabled: function() {\r\n\t this.forcedEnabled = true;\r\n\t },\r\n\r\n\t getSize: function() {\r\n\t return this.container[0][this.measure];\r\n\t },\r\n\r\n\t getTotal: function() {\r\n\t return this.element[0][this.scrollSize];\r\n\t },\r\n\r\n\t rescale: function(scale) {\r\n\t this.scale = scale;\r\n\t },\r\n\r\n\t update: function(silent) {\r\n\t var that = this,\r\n\t total = that.virtual ? that._virtualMax : that.getTotal(),\r\n\t scaledTotal = total * that.scale,\r\n\t size = that.getSize();\r\n\r\n\t if (total === 0 && !that.forcedEnabled) {\r\n\t return; // we are not visible.\r\n\t }\r\n\r\n\t that.max = that.virtual ? -that._virtualMin : 0;\r\n\t that.size = size;\r\n\t that.total = scaledTotal;\r\n\t that.min = Math.min(that.max, size - scaledTotal);\r\n\t that.minScale = size / total;\r\n\t that.centerOffset = (scaledTotal - size) / 2;\r\n\r\n\t that.enabled = that.forcedEnabled || (scaledTotal > size);\r\n\r\n\t if (!silent) {\r\n\t that.trigger(CHANGE, that);\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t var PaneDimensions = Observable.extend({\r\n\t init: function(options) {\r\n\t var that = this;\r\n\r\n\t Observable.fn.init.call(that);\r\n\r\n\t that.x = new PaneDimension(extend({horizontal: true}, options));\r\n\t that.y = new PaneDimension(extend({horizontal: false}, options));\r\n\t that.container = options.container;\r\n\t that.forcedMinScale = options.minScale;\r\n\t that.maxScale = options.maxScale || 100;\r\n\r\n\t that.bind(CHANGE, options);\r\n\t },\r\n\r\n\t rescale: function(newScale) {\r\n\t this.x.rescale(newScale);\r\n\t this.y.rescale(newScale);\r\n\t this.refresh();\r\n\t },\r\n\r\n\t centerCoordinates: function() {\r\n\t return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) };\r\n\t },\r\n\r\n\t refresh: function() {\r\n\t var that = this;\r\n\t that.x.update();\r\n\t that.y.update();\r\n\t that.enabled = that.x.enabled || that.y.enabled;\r\n\t that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\r\n\t that.fitScale = Math.max(that.x.minScale, that.y.minScale);\r\n\t that.trigger(CHANGE);\r\n\t }\r\n\t });\r\n\r\n\t var PaneAxis = Observable.extend({\r\n\t init: function(options) {\r\n\t var that = this;\r\n\t extend(that, options);\r\n\t Observable.fn.init.call(that);\r\n\t },\r\n\r\n\t outOfBounds: function() {\r\n\t return this.dimension.outOfBounds(this.movable[this.axis]);\r\n\t },\r\n\r\n\t dragMove: function(delta) {\r\n\t var that = this,\r\n\t dimension = that.dimension,\r\n\t axis = that.axis,\r\n\t movable = that.movable,\r\n\t position = movable[axis] + delta;\r\n\r\n\t if (!dimension.enabled) {\r\n\t return;\r\n\t }\r\n\r\n\t if ((position < dimension.min && delta < 0) || (position > dimension.max && delta > 0)) {\r\n\t delta *= that.resistance;\r\n\t }\r\n\r\n\t movable.translateAxis(axis, delta);\r\n\t that.trigger(CHANGE, that);\r\n\t }\r\n\t });\r\n\r\n\t var Pane = Class.extend({\r\n\r\n\t init: function(options) {\r\n\t var that = this,\r\n\t x,\r\n\t y,\r\n\t resistance,\r\n\t movable;\r\n\r\n\t extend(that, {elastic: true}, options);\r\n\r\n\t resistance = that.elastic ? 0.5 : 0;\r\n\t movable = that.movable;\r\n\r\n\t that.x = x = new PaneAxis({\r\n\t axis: \"x\",\r\n\t dimension: that.dimensions.x,\r\n\t resistance: resistance,\r\n\t movable: movable\r\n\t });\r\n\r\n\t that.y = y = new PaneAxis({\r\n\t axis: \"y\",\r\n\t dimension: that.dimensions.y,\r\n\t resistance: resistance,\r\n\t movable: movable\r\n\t });\r\n\r\n\t that.userEvents.bind([\"press\", \"move\", \"end\", \"gesturestart\", \"gesturechange\"], {\r\n\t gesturestart: function(e) {\r\n\t that.gesture = e;\r\n\t that.offset = that.dimensions.container.offset();\r\n\t },\r\n\r\n\t press: function(e) {\r\n\t if ($(e.event.target).closest(\"a\").is(\"[data-navigate-on-press=true]\")) {\r\n\t e.sender.cancel();\r\n\t }\r\n\t },\r\n\r\n\t gesturechange: function(e) {\r\n\t var previousGesture = that.gesture,\r\n\t previousCenter = previousGesture.center,\r\n\r\n\t center = e.center,\r\n\r\n\t scaleDelta = e.distance / previousGesture.distance,\r\n\r\n\t minScale = that.dimensions.minScale,\r\n\t maxScale = that.dimensions.maxScale,\r\n\t coordinates;\r\n\r\n\t if (movable.scale <= minScale && scaleDelta < 1) {\r\n\t // Resist shrinking. Instead of shrinking from 1 to 0.5, it will shrink to 0.5 + (1 /* minScale */ - 0.5) * 0.8 = 0.9;\r\n\t scaleDelta += (1 - scaleDelta) * 0.8;\r\n\t }\r\n\r\n\t if (movable.scale * scaleDelta >= maxScale) {\r\n\t scaleDelta = maxScale / movable.scale;\r\n\t }\r\n\r\n\t var offsetX = movable.x + that.offset.left,\r\n\t offsetY = movable.y + that.offset.top;\r\n\r\n\t coordinates = {\r\n\t x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\r\n\t y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\r\n\t };\r\n\r\n\t movable.scaleWith(scaleDelta);\r\n\r\n\t x.dragMove(coordinates.x);\r\n\t y.dragMove(coordinates.y);\r\n\r\n\t that.dimensions.rescale(movable.scale);\r\n\t that.gesture = e;\r\n\t e.preventDefault();\r\n\t },\r\n\r\n\t move: function(e) {\r\n\t if (e.event.target.tagName.match(/textarea|input/i)) {\r\n\t return;\r\n\t }\r\n\r\n\t if (x.dimension.enabled || y.dimension.enabled) {\r\n\t x.dragMove(e.x.delta);\r\n\t y.dragMove(e.y.delta);\r\n\t e.preventDefault();\r\n\t } else {\r\n\t e.touch.skip();\r\n\t }\r\n\t },\r\n\r\n\t end: function(e) {\r\n\t e.preventDefault();\r\n\t }\r\n\t });\r\n\t }\r\n\t });\r\n\r\n\t var TRANSFORM_STYLE = support.transitions.prefix + \"Transform\",\r\n\t translate;\r\n\r\n\r\n\t if (support.hasHW3D) {\r\n\t translate = function(x, y, scale) {\r\n\t return \"translate3d(\" + x + \"px,\" + y +\"px,0) scale(\" + scale + \")\";\r\n\t };\r\n\t } else {\r\n\t translate = function(x, y, scale) {\r\n\t return \"translate(\" + x + \"px,\" + y +\"px) scale(\" + scale + \")\";\r\n\t };\r\n\t }\r\n\r\n\t var Movable = Observable.extend({\r\n\t init: function(element) {\r\n\t var that = this;\r\n\r\n\t Observable.fn.init.call(that);\r\n\r\n\t that.element = $(element);\r\n\t that.element[0].style.webkitTransformOrigin = \"left top\";\r\n\t that.x = 0;\r\n\t that.y = 0;\r\n\t that.scale = 1;\r\n\t that._saveCoordinates(translate(that.x, that.y, that.scale));\r\n\t },\r\n\r\n\t translateAxis: function(axis, by) {\r\n\t this[axis] += by;\r\n\t this.refresh();\r\n\t },\r\n\r\n\t scaleTo: function(scale) {\r\n\t this.scale = scale;\r\n\t this.refresh();\r\n\t },\r\n\r\n\t scaleWith: function(scaleDelta) {\r\n\t this.scale *= scaleDelta;\r\n\t this.refresh();\r\n\t },\r\n\r\n\t translate: function(coordinates) {\r\n\t this.x += coordinates.x;\r\n\t this.y += coordinates.y;\r\n\t this.refresh();\r\n\t },\r\n\r\n\t moveAxis: function(axis, value) {\r\n\t this[axis] = value;\r\n\t this.refresh();\r\n\t },\r\n\r\n\t moveTo: function(coordinates) {\r\n\t extend(this, coordinates);\r\n\t this.refresh();\r\n\t },\r\n\r\n\t refresh: function() {\r\n\t var that = this,\r\n\t x = that.x,\r\n\t y = that.y,\r\n\t newCoordinates;\r\n\r\n\t if (that.round) {\r\n\t x = Math.round(x);\r\n\t y = Math.round(y);\r\n\t }\r\n\r\n\t newCoordinates = translate(x, y, that.scale);\r\n\r\n\t if (newCoordinates != that.coordinates) {\r\n\t if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\r\n\t that.element[0].style.position = \"absolute\";\r\n\t that.element[0].style.left = that.x + \"px\";\r\n\t that.element[0].style.top = that.y + \"px\";\r\n\r\n\t } else {\r\n\t that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\r\n\t }\r\n\t that._saveCoordinates(newCoordinates);\r\n\t that.trigger(CHANGE);\r\n\t }\r\n\t },\r\n\r\n\t _saveCoordinates: function(coordinates) {\r\n\t this.coordinates = coordinates;\r\n\t }\r\n\t });\r\n\r\n\t function destroyDroppable(collection, widget) {\r\n\t var groupName = widget.options.group,\r\n\t droppables = collection[groupName],\r\n\t i;\r\n\r\n\t Widget.fn.destroy.call(widget);\r\n\r\n\t if (droppables.length > 1) {\r\n\t for (i = 0; i < droppables.length; i++) {\r\n\t if (droppables[i] == widget) {\r\n\t droppables.splice(i, 1);\r\n\t break;\r\n\t }\r\n\t }\r\n\t } else {\r\n\t droppables.length = 0; // WTF, porting this from the previous destroyGroup\r\n\t delete collection[groupName];\r\n\t }\r\n\t }\r\n\r\n\t var DropTarget = Widget.extend({\r\n\t init: function(element, options) {\r\n\t var that = this;\r\n\r\n\t Widget.fn.init.call(that, element, options);\r\n\r\n\t var group = that.options.group;\r\n\r\n\t if (!(group in dropTargets)) {\r\n\t dropTargets[group] = [ that ];\r\n\t } else {\r\n\t dropTargets[group].push( that );\r\n\t }\r\n\t },\r\n\r\n\t events: [\r\n\t DRAGENTER,\r\n\t DRAGLEAVE,\r\n\t DROP\r\n\t ],\r\n\r\n\t options: {\r\n\t name: \"DropTarget\",\r\n\t group: \"default\"\r\n\t },\r\n\r\n\t destroy: function() {\r\n\t destroyDroppable(dropTargets, this);\r\n\t },\r\n\r\n\t _trigger: function(eventName, e) {\r\n\t var that = this,\r\n\t draggable = draggables[that.options.group];\r\n\r\n\t if (draggable) {\r\n\t return that.trigger(eventName, extend({}, e.event, {\r\n\t draggable: draggable,\r\n\t dropTarget: e.dropTarget\r\n\t }));\r\n\t }\r\n\t },\r\n\r\n\t _over: function(e) {\r\n\t this._trigger(DRAGENTER, e);\r\n\t },\r\n\r\n\t _out: function(e) {\r\n\t this._trigger(DRAGLEAVE, e);\r\n\t },\r\n\r\n\t _drop: function(e) {\r\n\t var that = this,\r\n\t draggable = draggables[that.options.group];\r\n\r\n\t if (draggable) {\r\n\t draggable.dropped = !that._trigger(DROP, e);\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t DropTarget.destroyGroup = function(groupName) {\r\n\t var group = dropTargets[groupName] || dropAreas[groupName],\r\n\t i;\r\n\r\n\t if (group) {\r\n\t for (i = 0; i < group.length; i++) {\r\n\t Widget.fn.destroy.call(group[i]);\r\n\t }\r\n\r\n\t group.length = 0;\r\n\t delete dropTargets[groupName];\r\n\t delete dropAreas[groupName];\r\n\t }\r\n\t };\r\n\r\n\t DropTarget._cache = dropTargets;\r\n\r\n\t var DropTargetArea = DropTarget.extend({\r\n\t init: function(element, options) {\r\n\t var that = this;\r\n\r\n\t Widget.fn.init.call(that, element, options);\r\n\r\n\t var group = that.options.group;\r\n\r\n\t if (!(group in dropAreas)) {\r\n\t dropAreas[group] = [ that ];\r\n\t } else {\r\n\t dropAreas[group].push( that );\r\n\t }\r\n\t },\r\n\r\n\t destroy: function() {\r\n\t destroyDroppable(dropAreas, this);\r\n\t },\r\n\r\n\t options: {\r\n\t name: \"DropTargetArea\",\r\n\t group: \"default\",\r\n\t filter: null\r\n\t }\r\n\t });\r\n\r\n\t var Draggable = Widget.extend({\r\n\t init: function (element, options) {\r\n\t var that = this;\r\n\r\n\t Widget.fn.init.call(that, element, options);\r\n\r\n\t that._activated = false;\r\n\r\n\t that.userEvents = new UserEvents(that.element, {\r\n\t global: true,\r\n\t allowSelection: true,\r\n\t filter: that.options.filter,\r\n\t threshold: that.options.distance,\r\n\t start: proxy(that._start, that),\r\n\t hold: proxy(that._hold, that),\r\n\t move: proxy(that._drag, that),\r\n\t end: proxy(that._end, that),\r\n\t cancel: proxy(that._cancel, that),\r\n\t select: proxy(that._select, that)\r\n\t });\r\n\r\n\t that._afterEndHandler = proxy(that._afterEnd, that);\r\n\t that._captureEscape = proxy(that._captureEscape, that);\r\n\t },\r\n\r\n\t events: [\r\n\t HOLD,\r\n\t DRAGSTART,\r\n\t DRAG,\r\n\t DRAGEND,\r\n\t DRAGCANCEL,\r\n\t HINTDESTROYED\r\n\t ],\r\n\r\n\t options: {\r\n\t name: \"Draggable\",\r\n\t distance: ( kendo.support.touch ? 0 : 5),\r\n\t group: \"default\",\r\n\t cursorOffset: null,\r\n\t axis: null,\r\n\t container: null,\r\n\t filter: null,\r\n\t ignore: null,\r\n\t holdToDrag: false,\r\n\t autoScroll: false,\r\n\t dropped: false\r\n\t },\r\n\r\n\t cancelHold: function() {\r\n\t this._activated = false;\r\n\t },\r\n\r\n\t _captureEscape: function(e) {\r\n\t var that = this;\r\n\r\n\t if (e.keyCode === kendo.keys.ESC) {\r\n\t that._trigger(DRAGCANCEL, { event: e });\r\n\t that.userEvents.cancel();\r\n\t }\r\n\t },\r\n\r\n\t _updateHint: function(e) {\r\n\t var that = this,\r\n\t coordinates,\r\n\t options = that.options,\r\n\t boundaries = that.boundaries,\r\n\t axis = options.axis,\r\n\t cursorOffset = that.options.cursorOffset;\r\n\r\n\t if (cursorOffset) {\r\n\t coordinates = { left: e.x.location + cursorOffset.left, top: e.y.location + cursorOffset.top };\r\n\t } else {\r\n\t that.hintOffset.left += e.x.delta;\r\n\t that.hintOffset.top += e.y.delta;\r\n\t coordinates = $.extend({}, that.hintOffset);\r\n\t }\r\n\r\n\t if (boundaries) {\r\n\t coordinates.top = within(coordinates.top, boundaries.y);\r\n\t coordinates.left = within(coordinates.left, boundaries.x);\r\n\t }\r\n\r\n\t if (axis === \"x\") {\r\n\t delete coordinates.top;\r\n\t } else if (axis === \"y\") {\r\n\t delete coordinates.left;\r\n\t }\r\n\r\n\t that.hint.css(coordinates);\r\n\t },\r\n\r\n\t _shouldIgnoreTarget: function(target) {\r\n\t var ignoreSelector = this.options.ignore;\r\n\t return ignoreSelector && $(target).is(ignoreSelector);\r\n\t },\r\n\r\n\t _select: function(e) {\r\n\t if (!this._shouldIgnoreTarget(e.event.target)) {\r\n\t e.preventDefault();\r\n\t }\r\n\t },\r\n\r\n\t _start: function(e) {\r\n\t var that = this,\r\n\t options = that.options,\r\n\t container = options.container ? $(options.container): null,\r\n\t hint = options.hint;\r\n\r\n\t if (this._shouldIgnoreTarget(e.touch.initialTouch) || (options.holdToDrag && !that._activated)) {\r\n\t that.userEvents.cancel();\r\n\t return;\r\n\t }\r\n\r\n\t that.currentTarget = e.target;\r\n\t that.currentTargetOffset = getOffset(that.currentTarget);\r\n\r\n\t if (hint) {\r\n\t if (that.hint) {\r\n\t that.hint.stop(true, true).remove();\r\n\t }\r\n\r\n\t that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\r\n\r\n\t var offset = getOffset(that.currentTarget);\r\n\t that.hintOffset = offset;\r\n\r\n\t that.hint.css( {\r\n\t position: \"absolute\",\r\n\t zIndex: 20000, // the Window's z-index is 10000 and can be raised because of z-stacking\r\n\t left: offset.left,\r\n\t top: offset.top\r\n\t })\r\n\t .appendTo(document.body);\r\n\r\n\t that.angular(\"compile\", function(){\r\n\t that.hint.removeAttr(\"ng-repeat\");\r\n\t var scopeTarget = $(e.target);\r\n\r\n\t while (!scopeTarget.data(\"$$kendoScope\") && scopeTarget.length) {\r\n\t scopeTarget = scopeTarget.parent();\r\n\t }\r\n\r\n\t return {\r\n\t elements: that.hint.get(),\r\n\t scopeFrom: scopeTarget.data(\"$$kendoScope\")\r\n\t };\r\n\t });\r\n\t }\r\n\r\n\t draggables[options.group] = that;\r\n\r\n\t that.dropped = false;\r\n\r\n\t if (container) {\r\n\t that.boundaries = containerBoundaries(container, that.hint);\r\n\t }\r\n\r\n\t $(document).on(KEYUP, that._captureEscape);\r\n\r\n\t if (that._trigger(DRAGSTART, e)) {\r\n\t that.userEvents.cancel();\r\n\t that._afterEnd();\r\n\t }\r\n\r\n\t that.userEvents.capture();\r\n\t },\r\n\r\n\t _hold: function(e) {\r\n\t this.currentTarget = e.target;\r\n\r\n\t if (this._trigger(HOLD, e)) {\r\n\t this.userEvents.cancel();\r\n\t } else {\r\n\t this._activated = true;\r\n\t }\r\n\t },\r\n\r\n\t _drag: function(e) {\r\n\t e.preventDefault();\r\n\r\n\t var cursorElement = this._elementUnderCursor(e);\r\n\r\n\t if (this.options.autoScroll && this._cursorElement !== cursorElement) {\r\n\t this._scrollableParent = findScrollableParent(cursorElement);\r\n\t this._cursorElement = cursorElement;\r\n\t }\r\n\r\n\t this._lastEvent = e;\r\n\t this._processMovement(e, cursorElement);\r\n\r\n\t if (this.options.autoScroll) {\r\n\t // chrome seems to trigger mousemove when mouse is moved outside of the window (over the Chrome), too.\r\n\t if (this._scrollableParent[0]) {\r\n\t var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\r\n\r\n\r\n\t this._scrollCompenstation = $.extend({}, this.hintOffset);\r\n\t this._scrollVelocity = velocity;\r\n\r\n\t if (velocity.y === 0 && velocity.x === 0) {\r\n\t clearInterval(this._scrollInterval);\r\n\t this._scrollInterval = null;\r\n\t } else if(!this._scrollInterval) {\r\n\t this._scrollInterval = setInterval($.proxy(this, \"_autoScroll\"), 50);\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t if (this.hint) {\r\n\t this._updateHint(e);\r\n\t }\r\n\t },\r\n\r\n\t _processMovement: function(e, cursorElement) {\r\n\t this._withDropTarget(cursorElement, function(target, targetElement) {\r\n\t if (!target) {\r\n\t if (lastDropTarget) {\r\n\t lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\r\n\t lastDropTarget = null;\r\n\t }\r\n\t return;\r\n\t }\r\n\r\n\t if (lastDropTarget) {\r\n\t if (targetElement === lastDropTarget.targetElement) {\r\n\t return;\r\n\t }\r\n\r\n\t lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\r\n\t }\r\n\r\n\t target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\r\n\t lastDropTarget = extend(target, { targetElement: targetElement });\r\n\t });\r\n\r\n\t this._trigger(DRAG, extend(e, { dropTarget: lastDropTarget, elementUnderCursor: cursorElement }));\r\n\t },\r\n\r\n\t _autoScroll: function() {\r\n\t var parent = this._scrollableParent[0],\r\n\t velocity = this._scrollVelocity,\r\n\t compensation = this._scrollCompenstation;\r\n\r\n\t if (!parent) {\r\n\t return;\r\n\t }\r\n\r\n\t var cursorElement = this._elementUnderCursor(this._lastEvent);\r\n\t this._processMovement(this._lastEvent, cursorElement);\r\n\r\n\t var yIsScrollable, xIsScrollable;\r\n\r\n\t var isRootNode = parent === scrollableRoot()[0];\r\n\r\n\t if (isRootNode) {\r\n\t yIsScrollable = document.body.scrollHeight > $window.height();\r\n\t xIsScrollable = document.body.scrollWidth > $window.width();\r\n\t } else {\r\n\t yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\r\n\t xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\r\n\t }\r\n\r\n\t var yDelta = parent.scrollTop + velocity.y;\r\n\t var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\r\n\r\n\t var xDelta = parent.scrollLeft + velocity.x;\r\n\t var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\r\n\r\n\t if (yInBounds) {\r\n\t parent.scrollTop += velocity.y;\r\n\t }\r\n\r\n\t if (xInBounds) {\r\n\t parent.scrollLeft += velocity.x;\r\n\t }\r\n\r\n\t if (this.hint && isRootNode && (xInBounds || yInBounds)) {\r\n\t if (yInBounds) {\r\n\t compensation.top += velocity.y;\r\n\t }\r\n\r\n\t if (xInBounds) {\r\n\t compensation.left += velocity.x;\r\n\t }\r\n\r\n\t this.hint.css(compensation);\r\n\t }\r\n\t },\r\n\r\n\t _end: function(e) {\r\n\t this._withDropTarget(this._elementUnderCursor(e), function(target, targetElement) {\r\n\t if (target) {\r\n\t target._drop(extend({}, e, { dropTarget: $(targetElement) }));\r\n\t lastDropTarget = null;\r\n\t }\r\n\t });\r\n\r\n\t this._cancel(this._trigger(DRAGEND, e));\r\n\t },\r\n\r\n\t _cancel: function(isDefaultPrevented) {\r\n\t var that = this;\r\n\r\n\t that._scrollableParent = null;\r\n\t this._cursorElement = null;\r\n\t clearInterval(this._scrollInterval);\r\n\t that._activated = false;\r\n\r\n\t if (that.hint && !that.dropped) {\r\n\t setTimeout(function() {\r\n\t that.hint.stop(true, true);\r\n\r\n\t if (isDefaultPrevented) {\r\n\t that._afterEndHandler();\r\n\t } else {\r\n\t that.hint.animate(that.currentTargetOffset, \"fast\", that._afterEndHandler);\r\n\t }\r\n\t }, 0);\r\n\r\n\t } else {\r\n\t that._afterEnd();\r\n\t }\r\n\t },\r\n\r\n\t _trigger: function(eventName, e) {\r\n\t var that = this;\r\n\r\n\t return that.trigger(\r\n\t eventName, extend(\r\n\t {},\r\n\t e.event,\r\n\t {\r\n\t x: e.x,\r\n\t y: e.y,\r\n\t currentTarget: that.currentTarget,\r\n\t initialTarget: e.touch ? e.touch.initialTouch : null,\r\n\t dropTarget: e.dropTarget,\r\n\t elementUnderCursor: e.elementUnderCursor\r\n\t }\r\n\t ));\r\n\t },\r\n\r\n\t _elementUnderCursor: function(e) {\r\n\t var target = elementUnderCursor(e),\r\n\t hint = this.hint;\r\n\r\n\t if (hint && contains(hint[0], target)) {\r\n\t hint.hide();\r\n\t target = elementUnderCursor(e);\r\n\t // IE8 does not return the element in iframe from first attempt\r\n\t if (!target) {\r\n\t target = elementUnderCursor(e);\r\n\t }\r\n\t hint.show();\r\n\t }\r\n\r\n\t return target;\r\n\t },\r\n\r\n\t _withDropTarget: function(element, callback) {\r\n\t var result,\r\n\t group = this.options.group,\r\n\t targets = dropTargets[group],\r\n\t areas = dropAreas[group];\r\n\r\n\t if (targets && targets.length || areas && areas.length) {\r\n\t result = checkTarget(element, targets, areas);\r\n\r\n\t if (result) {\r\n\t callback(result.target, result.targetElement);\r\n\t } else {\r\n\t callback();\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t destroy: function() {\r\n\t var that = this;\r\n\r\n\t Widget.fn.destroy.call(that);\r\n\r\n\t that._afterEnd();\r\n\r\n\t that.userEvents.destroy();\r\n\r\n\t this._scrollableParent = null;\r\n\t this._cursorElement = null;\r\n\t clearInterval(this._scrollInterval);\r\n\r\n\t that.currentTarget = null;\r\n\t },\r\n\r\n\t _afterEnd: function() {\r\n\t var that = this;\r\n\r\n\t if (that.hint) {\r\n\t that.hint.remove();\r\n\t }\r\n\r\n\t delete draggables[that.options.group];\r\n\r\n\t that.trigger(\"destroy\");\r\n\t that.trigger(HINTDESTROYED);\r\n\t $(document).off(KEYUP, that._captureEscape);\r\n\t }\r\n\t });\r\n\r\n\t kendo.ui.plugin(DropTarget);\r\n\t kendo.ui.plugin(DropTargetArea);\r\n\t kendo.ui.plugin(Draggable);\r\n\t kendo.TapCapture = TapCapture;\r\n\t kendo.containerBoundaries = containerBoundaries;\r\n\r\n\t extend(kendo.ui, {\r\n\t Pane: Pane,\r\n\t PaneDimensions: PaneDimensions,\r\n\t Movable: Movable\r\n\t });\r\n\r\n\t function scrollableViewPort(element) {\r\n\t var root = scrollableRoot()[0],\r\n\t offset,\r\n\t top,\r\n\t left;\r\n\r\n\t if (element[0] === root) {\r\n\t top = root.scrollTop;\r\n\t left = root.scrollLeft;\r\n\r\n\t return {\r\n\t top: top,\r\n\t left: left,\r\n\t bottom: top + $window.height(),\r\n\t right: left + $window.width()\r\n\t };\r\n\t } else {\r\n\t offset = element.offset();\r\n\t offset.bottom = offset.top + element.height();\r\n\t offset.right = offset.left + element.width();\r\n\t return offset;\r\n\t }\r\n\t }\r\n\r\n\t function scrollableRoot() {\r\n\t return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\r\n\t }\r\n\r\n\t function findScrollableParent(element) {\r\n\t var root = scrollableRoot();\r\n\r\n\t if (!element || element === document.body || element === document.documentElement) {\r\n\t return root;\r\n\t }\r\n\r\n\t var parent = $(element)[0];\r\n\r\n\t while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\r\n\t parent = parent.parentNode;\r\n\t }\r\n\r\n\t if (parent === document.body) {\r\n\t return root;\r\n\t }\r\n\r\n\t return $(parent);\r\n\t }\r\n\r\n\t function autoScrollVelocity(mouseX, mouseY, rect) {\r\n\t var velocity = { x: 0, y: 0 };\r\n\r\n\t var AUTO_SCROLL_AREA = 50;\r\n\r\n\t if (mouseX - rect.left < AUTO_SCROLL_AREA) {\r\n\t velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\r\n\t } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\r\n\t velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\r\n\t }\r\n\r\n\t if (mouseY - rect.top < AUTO_SCROLL_AREA) {\r\n\t velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\r\n\t } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\r\n\t velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\r\n\t }\r\n\r\n\t return velocity;\r\n\t }\r\n\r\n\t // export for testing\r\n\t kendo.ui.Draggable.utils = {\r\n\t autoScrollVelocity: autoScrollVelocity,\r\n\t scrollableViewPort: scrollableViewPort,\r\n\t findScrollableParent: findScrollableParent\r\n\t };\r\n\r\n\t })(window.kendo.jQuery);\r\n\r\n\treturn window.kendo;\r\n\r\n\t}, __webpack_require__(3));\r\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1350);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1004:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1350:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1004) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"userevents\",\n\t name: \"User Events\",\n\t category: \"framework\",\n\t depends: [ \"core\" ],\n\t hidden: true\n\t};\n\n\t(function ($, undefined) {\n\t var kendo = window.kendo,\n\t support = kendo.support,\n\t Class = kendo.Class,\n\t Observable = kendo.Observable,\n\t now = $.now,\n\t extend = $.extend,\n\t OS = support.mobileOS,\n\t invalidZeroEvents = OS && OS.android,\n\t DEFAULT_MIN_HOLD = 800,\n\t CLICK_DELAY = 300,\n\t DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, // WP8 and W8 are very sensitive and always report move.\n\n\t // UserEvents events\n\t PRESS = \"press\",\n\t HOLD = \"hold\",\n\t SELECT = \"select\",\n\t START = \"start\",\n\t MOVE = \"move\",\n\t END = \"end\",\n\t CANCEL = \"cancel\",\n\t TAP = \"tap\",\n\t DOUBLETAP = \"doubleTap\",\n\t RELEASE = \"release\",\n\t GESTURESTART = \"gesturestart\",\n\t GESTURECHANGE = \"gesturechange\",\n\t GESTUREEND = \"gestureend\",\n\t GESTURETAP = \"gesturetap\";\n\n\t var THRESHOLD = {\n\t \"api\": 0,\n\t \"touch\": 0,\n\t \"mouse\": 9,\n\t \"pointer\": 9\n\t };\n\n\t var ENABLE_GLOBAL_SURFACE = (!support.touch || support.mouseAndTouchPresent);\n\n\t function touchDelta(touch1, touch2) {\n\t var x1 = touch1.x.location,\n\t y1 = touch1.y.location,\n\t x2 = touch2.x.location,\n\t y2 = touch2.y.location,\n\t dx = x1 - x2,\n\t dy = y1 - y2;\n\n\t return {\n\t center: {\n\t x: (x1 + x2) / 2,\n\t y: (y1 + y2) / 2\n\t },\n\n\t distance: Math.sqrt(dx*dx + dy*dy)\n\t };\n\t }\n\n\t function getTouches(e) {\n\t var touches = [],\n\t originalEvent = e.originalEvent,\n\t currentTarget = e.currentTarget,\n\t idx = 0, length,\n\t changedTouches,\n\t touch;\n\n\t if (e.api) {\n\t touches.push({\n\t id: 2, // hardcoded ID for API call;\n\t event: e,\n\t target: e.target,\n\t currentTarget: e.target,\n\t location: e,\n\t type: \"api\"\n\t });\n\t }\n\t else if (e.type.match(/touch/)) {\n\t changedTouches = originalEvent ? originalEvent.changedTouches : [];\n\t for (length = changedTouches.length; idx < length; idx ++) {\n\t touch = changedTouches[idx];\n\t touches.push({\n\t location: touch,\n\t event: e,\n\t target: touch.target,\n\t currentTarget: currentTarget,\n\t id: touch.identifier,\n\t type: \"touch\"\n\t });\n\t }\n\t }\n\t else if (support.pointers || support.msPointers) {\n\t touches.push({\n\t location: originalEvent,\n\t event: e,\n\t target: e.target,\n\t currentTarget: currentTarget,\n\t id: originalEvent.pointerId,\n\t type: \"pointer\"\n\t });\n\t } else {\n\t touches.push({\n\t id: 1, // hardcoded ID for mouse event;\n\t event: e,\n\t target: e.target,\n\t currentTarget: currentTarget,\n\t location: e,\n\t type: \"mouse\"\n\t });\n\t }\n\n\t return touches;\n\t }\n\n\t var TouchAxis = Class.extend({\n\t init: function(axis, location) {\n\t var that = this;\n\n\t that.axis = axis;\n\n\t that._updateLocationData(location);\n\n\t that.startLocation = that.location;\n\t that.velocity = that.delta = 0;\n\t that.timeStamp = now();\n\t },\n\n\t move: function(location) {\n\t var that = this,\n\t offset = location[\"page\" + that.axis],\n\t timeStamp = now(),\n\t timeDelta = (timeStamp - that.timeStamp) || 1; // Firing manually events in tests can make this 0;\n\n\t if (!offset && invalidZeroEvents) {\n\t return;\n\t }\n\n\t that.delta = offset - that.location;\n\n\t that._updateLocationData(location);\n\n\t that.initialDelta = offset - that.startLocation;\n\t that.velocity = that.delta / timeDelta;\n\t that.timeStamp = timeStamp;\n\t },\n\n\t _updateLocationData: function(location) {\n\t var that = this, axis = that.axis;\n\n\t that.location = location[\"page\" + axis];\n\t that.client = location[\"client\" + axis];\n\t that.screen = location[\"screen\" + axis];\n\t }\n\t });\n\n\t var Touch = Class.extend({\n\t init: function(userEvents, target, touchInfo) {\n\t extend(this, {\n\t x: new TouchAxis(\"X\", touchInfo.location),\n\t y: new TouchAxis(\"Y\", touchInfo.location),\n\t type: touchInfo.type,\n\t useClickAsTap: userEvents.useClickAsTap,\n\t threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n\t userEvents: userEvents,\n\t target: target,\n\t currentTarget: touchInfo.currentTarget,\n\t initialTouch: touchInfo.target,\n\t id: touchInfo.id,\n\t pressEvent: touchInfo,\n\t _clicks: userEvents._clicks,\n\t supportDoubleTap: userEvents.supportDoubleTap,\n\t _moved: false,\n\t _finished: false\n\t });\n\t },\n\n\t press: function() {\n\t this._holdTimeout = setTimeout($.proxy(this, \"_hold\"), this.userEvents.minHold);\n\t this._trigger(PRESS, this.pressEvent);\n\t },\n\n\t _tap: function(touchInfo) {\n\t var that = this;\n\t that.userEvents._clicks++;\n\t if (that.userEvents._clicks == 1) {\n\t that._clickTimeout = setTimeout(function() {\n\t if (that.userEvents._clicks == 1) {\n\t that._trigger(TAP, touchInfo);\n\t }\n\t else {\n\t that._trigger(DOUBLETAP, touchInfo);\n\t }\n\t that.userEvents._clicks = 0;\n\t }, CLICK_DELAY);\n\t }\n\t },\n\n\t _hold: function() {\n\t this._trigger(HOLD, this.pressEvent);\n\t },\n\n\t move: function(touchInfo) {\n\t var that = this;\n\n\t if (that._finished) { return; }\n\n\t that.x.move(touchInfo.location);\n\t that.y.move(touchInfo.location);\n\n\t if (!that._moved) {\n\t if (that._withinIgnoreThreshold()) {\n\t return;\n\t }\n\n\t if (!UserEvents.current || UserEvents.current === that.userEvents) {\n\t that._start(touchInfo);\n\t } else {\n\t return that.dispose();\n\t }\n\t }\n\n\t // Event handlers may cancel the drag in the START event handler, hence the double check for pressed.\n\t if (!that._finished) {\n\t that._trigger(MOVE, touchInfo);\n\t }\n\t },\n\n\t end: function(touchInfo) {\n\t this.endTime = now();\n\n\t if (this._finished) { return; }\n\n\t // Mark the object as finished if there are blocking operations in the event handlers (alert/confirm)\n\t this._finished = true;\n\n\t this._trigger(RELEASE, touchInfo); // Release should be fired before TAP (as click is after mouseup/touchend)\n\n\t if (this._moved) {\n\t this._trigger(END, touchInfo);\n\t } else {\n\t if (!this.useClickAsTap) {\n\t if (this.supportDoubleTap) {\n\t this._tap(touchInfo);\n\t }\n\t else {\n\t this._trigger(TAP, touchInfo);\n\t }\n\t }\n\t }\n\n\t clearTimeout(this._holdTimeout);\n\n\t this.dispose();\n\t },\n\n\t dispose: function() {\n\t var userEvents = this.userEvents,\n\t activeTouches = userEvents.touches;\n\n\t this._finished = true;\n\t this.pressEvent = null;\n\t clearTimeout(this._holdTimeout);\n\n\t activeTouches.splice($.inArray(this, activeTouches), 1);\n\t },\n\n\t skip: function() {\n\t this.dispose();\n\t },\n\n\t cancel: function() {\n\t this.dispose();\n\t },\n\n\t isMoved: function() {\n\t return this._moved;\n\t },\n\n\t _start: function(touchInfo) {\n\t clearTimeout(this._holdTimeout);\n\n\t this.startTime = now();\n\t this._moved = true;\n\t this._trigger(START, touchInfo);\n\t },\n\n\t _trigger: function(name, touchInfo) {\n\t var that = this,\n\t jQueryEvent = touchInfo.event,\n\t data = {\n\t touch: that,\n\t x: that.x,\n\t y: that.y,\n\t target: that.target,\n\t event: jQueryEvent\n\t };\n\n\t if(that.userEvents.notify(name, data)) {\n\t jQueryEvent.preventDefault();\n\t }\n\t },\n\n\t _withinIgnoreThreshold: function() {\n\t var xDelta = this.x.initialDelta,\n\t yDelta = this.y.initialDelta;\n\n\t return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n\t }\n\t });\n\n\t function withEachUpEvent(callback) {\n\t var downEvents = kendo.eventMap.up.split(\" \"),\n\t idx = 0,\n\t length = downEvents.length;\n\n\t for(; idx < length; idx ++) {\n\t callback(downEvents[idx]);\n\t }\n\t }\n\n\t var UserEvents = Observable.extend({\n\t init: function(element, options) {\n\t var that = this,\n\t filter,\n\t ns = kendo.guid();\n\n\t options = options || {};\n\t filter = that.filter = options.filter;\n\t that.threshold = options.threshold || DEFAULT_THRESHOLD;\n\t that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n\t that.touches = [];\n\t that._maxTouches = options.multiTouch ? 2 : 1;\n\t that.allowSelection = options.allowSelection;\n\t that.captureUpIfMoved = options.captureUpIfMoved;\n\t that.useClickAsTap = !options.fastTap && !support.delayedClick();\n\t that.eventNS = ns;\n\t that._clicks = 0;\n\t that.supportDoubleTap = options.supportDoubleTap;\n\n\t element = $(element).handler(that);\n\t Observable.fn.init.call(that);\n\n\t extend(that, {\n\t element: element,\n\t // the touch events lock to the element anyway, so no need for the global setting\n\t surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n\t stopPropagation: options.stopPropagation,\n\t pressed: false\n\t });\n\n\t that.surface.handler(that)\n\t .on(kendo.applyEventMap(\"move\", ns), \"_move\")\n\t .on(kendo.applyEventMap(\"up cancel\", ns), \"_end\");\n\n\t element.on(kendo.applyEventMap(\"down\", ns), filter, \"_start\");\n\n\t if (that.useClickAsTap) {\n\t element.on(kendo.applyEventMap(\"click\", ns), filter, \"_click\");\n\t }\n\n\t if (support.pointers || support.msPointers) {\n\t //touch-action:none will not work for IE10\n\t if (support.browser.version < 11) {\n\t var defaultAction = \"pinch-zoom double-tap-zoom\";\n\t element.css(\"-ms-touch-action\", options.touchAction && options.touchAction != \"none\" ? defaultAction + \" \" + options.touchAction : defaultAction);\n\t } else {\n\t element.css(\"touch-action\", options.touchAction || \"none\");\n\t }\n\t }\n\n\t if (options.preventDragEvent) {\n\t element.on(kendo.applyEventMap(\"dragstart\", ns), kendo.preventDefault);\n\t }\n\n\t element.on(kendo.applyEventMap(\"mousedown\", ns), filter, { root: element }, \"_select\");\n\n\t if (that.captureUpIfMoved && support.eventCapture) {\n\t var surfaceElement = that.surface[0],\n\t preventIfMovingProxy = $.proxy(that.preventIfMoving, that);\n\n\t withEachUpEvent(function(eventName) {\n\t surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n\t });\n\t }\n\n\t that.bind([\n\t PRESS,\n\t HOLD,\n\t TAP,\n\t DOUBLETAP,\n\t START,\n\t MOVE,\n\t END,\n\t RELEASE,\n\t CANCEL,\n\t GESTURESTART,\n\t GESTURECHANGE,\n\t GESTUREEND,\n\t GESTURETAP,\n\t SELECT\n\t ], options);\n\t },\n\n\t preventIfMoving: function(e) {\n\t if (this._isMoved()) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\n\t if (that._destroyed) {\n\t return;\n\t }\n\n\t that._destroyed = true;\n\n\t if (that.captureUpIfMoved && support.eventCapture) {\n\t var surfaceElement = that.surface[0];\n\t withEachUpEvent(function(eventName) {\n\t surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n\t });\n\t }\n\n\t that.element.kendoDestroy(that.eventNS);\n\t that.surface.kendoDestroy(that.eventNS);\n\t that.element.removeData(\"handler\");\n\t that.surface.removeData(\"handler\");\n\t that._disposeAll();\n\n\t that.unbind();\n\t delete that.surface;\n\t delete that.element;\n\t delete that.currentTarget;\n\t },\n\n\t capture: function() {\n\t UserEvents.current = this;\n\t },\n\n\t cancel: function() {\n\t this._disposeAll();\n\t this.trigger(CANCEL);\n\t },\n\n\t notify: function(eventName, data) {\n\t var that = this,\n\t touches = that.touches;\n\n\t if (this._isMultiTouch()) {\n\t switch(eventName) {\n\t case MOVE:\n\t eventName = GESTURECHANGE;\n\t break;\n\t case END:\n\t eventName = GESTUREEND;\n\t break;\n\t case TAP:\n\t eventName = GESTURETAP;\n\t break;\n\t }\n\n\t extend(data, {touches: touches}, touchDelta(touches[0], touches[1]));\n\t }\n\n\t return this.trigger(eventName, extend(data, {type: eventName}));\n\t },\n\n\t // API\n\t press: function(x, y, target) {\n\t this._apiCall(\"_start\", x, y, target);\n\t },\n\n\t move: function(x, y) {\n\t this._apiCall(\"_move\", x, y);\n\t },\n\n\t end: function(x, y) {\n\t this._apiCall(\"_end\", x, y);\n\t },\n\n\t _isMultiTouch: function() {\n\t return this.touches.length > 1;\n\t },\n\n\t _maxTouchesReached: function() {\n\t return this.touches.length >= this._maxTouches;\n\t },\n\n\t _disposeAll: function() {\n\t var touches = this.touches;\n\t while (touches.length > 0) {\n\t touches.pop().dispose();\n\t }\n\t },\n\n\t _isMoved: function() {\n\t return $.grep(this.touches, function(touch) {\n\t return touch.isMoved();\n\t }).length;\n\t },\n\n\t _select: function(e) {\n\t if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t _start: function(e) {\n\t var that = this,\n\t idx = 0,\n\t filter = that.filter,\n\t target,\n\t touches = getTouches(e),\n\t length = touches.length,\n\t touch,\n\t which = e.which;\n\n\t if ((which && which > 1) || (that._maxTouchesReached())){\n\t return;\n\t }\n\n\t UserEvents.current = null;\n\n\t that.currentTarget = e.currentTarget;\n\n\t if (that.stopPropagation) {\n\t e.stopPropagation();\n\t }\n\n\t for (; idx < length; idx ++) {\n\t if (that._maxTouchesReached()) {\n\t break;\n\t }\n\n\t touch = touches[idx];\n\n\t if (filter) {\n\t target = $(touch.currentTarget); // target.is(filter) ? target : target.closest(filter, that.element);\n\t } else {\n\t target = that.element;\n\t }\n\n\t if (!target.length) {\n\t continue;\n\t }\n\n\t touch = new Touch(that, target, touch);\n\t that.touches.push(touch);\n\t touch.press();\n\n\t if (that._isMultiTouch()) {\n\t that.notify(\"gesturestart\", {});\n\t }\n\t }\n\t },\n\n\t _move: function(e) {\n\t this._eachTouch(\"move\", e);\n\t },\n\n\t _end: function(e) {\n\t this._eachTouch(\"end\", e);\n\t },\n\n\t _click: function(e) {\n\t var data = {\n\t touch: {\n\t initialTouch: e.target,\n\t target: $(e.currentTarget),\n\t endTime: now(),\n\t x: {\n\t location: e.pageX,\n\t client: e.clientX\n\t },\n\t y: {\n\t location: e.pageY,\n\t client: e.clientY\n\t }\n\t },\n\t x: e.pageX,\n\t y: e.pageY,\n\t target: $(e.currentTarget),\n\t event: e,\n\t type: \"tap\"\n\t };\n\n\t if (this.trigger(\"tap\", data)) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t _eachTouch: function(methodName, e) {\n\t var that = this,\n\t dict = {},\n\t touches = getTouches(e),\n\t activeTouches = that.touches,\n\t idx,\n\t touch,\n\t touchInfo,\n\t matchingTouch;\n\n\t for (idx = 0; idx < activeTouches.length; idx ++) {\n\t touch = activeTouches[idx];\n\t dict[touch.id] = touch;\n\t }\n\n\t for (idx = 0; idx < touches.length; idx ++) {\n\t touchInfo = touches[idx];\n\t matchingTouch = dict[touchInfo.id];\n\n\t if (matchingTouch) {\n\t matchingTouch[methodName](touchInfo);\n\t }\n\t }\n\t },\n\n\t _apiCall: function(type, x, y, target) {\n\t this[type]({\n\t api: true,\n\t pageX: x,\n\t pageY: y,\n\t clientX: x,\n\t clientY: y,\n\t target: $(target || this.element)[0],\n\t stopPropagation: $.noop,\n\t preventDefault: $.noop\n\t });\n\t }\n\t });\n\n\t UserEvents.defaultThreshold = function(value) {\n\t DEFAULT_THRESHOLD = value;\n\t };\n\n\t UserEvents.minHold = function(value) {\n\t DEFAULT_MIN_HOLD = value;\n\t };\n\n\t kendo.getTouches = getTouches;\n\t kendo.touchDelta = touchDelta;\n\t kendo.UserEvents = UserEvents;\n\t })(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });"],"sourceRoot":""}