{"version":3,"file":"kendo.virtuallist.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendovirtuallist","js","this","kendo","jQuery","$","undefined$1","window","ui","encode","htmlEncode","Widget","DataBoundWidget","percentageUnitsRegex","LIST_ITEM","TABLE_ITEM","GROUPITEM","SELECTED","FOCUSED","HOVER","CHANGE","CLICK","LISTBOUND","ITEMCHANGE","ACTIVATE","DEACTIVATE","GROUP_ROW_SEL","VIRTUAL_LIST_NS","lastFrom","array","length","toArray","value","Array","isPrimitive","dataItem","appendChild","parent","className","tagName","element","document","createElement","render","data","templates","itemTemplate","template","hasColumns","options","columns","altRow","index","item","placeholderTemplate","header","group","html","fixedGroupTemplate","attr","uid","addClass","removeClass","renderedColumns","i","currentWidth","width","currentWidthInt","parseInt","widthStyle","widthValue","test","renderColumns","applyStylesFromKendoAttributes","empty","append","find","remove","toggleClass","current","selected","newGroup","isLastGroupedItem","groupTemplate","appendTo","top","y","style","webkitTransform","transform","position","isActivePromise","promise","state","VirtualList","extend","init","listSize","lineHeight","mockList","that","contentClasses","bound","_fetching","fn","call","itemHeight","css","left","visibility","body","parseFloat","getComputedStyles","height","contentSelector","split","join","wrapper","closest","content","wrap","thead","row","TABLE_LIST","before","prev","ariaLabel","ariaLabelledBy","on","_values","_selectedDataItems","_selectedIndexes","_rangesList","_promisesList","_optionID","guid","_templates","setDataSource","dataSource","throttle","_renderItems","_triggerListBound","delay","_selectable","name","autoBind","listScreens","threshold","oppositeBuffer","type","selectable","dataValueField","mapValueTo","valueMapper","events","setOptions","itemClass","_selectProxy","off","refresh","items","_items","destroy","unbind","_refreshHandler","source","isArray","DataSource","create","_clean","_deferValueSet","mute","bind","setDSFilter","filter","view","fetch","skip","currentRangeStart","_selectingValue","_skip","trigger","_getValues","dataItems","getter","_valueGetter","map","_highlightSelectedItems","_getElementByDataItem","e","result","action","isItemChange","filtered","isFiltered","_mute","focus","_createList","skipUpdateOnBind","_emptySearch","done","itemsToMatch","found","j","itemsLength","selectedLength","changed","unchanged","push","mapChangedItems","removeAt","splice","_removeSelectedDataItem","valueGetter","idx","setValue","_forcePrefetch","slice","_valueDeferred","Deferred","select","_prefetchByValue","_checkValuesOrder","_removedAddedIndexes","newValue","dataView","_dataView","forSelection","callback","mapValueToIndex","mapValueToDataItem","checkboxes","success","response","valueMapperOptions","indexes","removed","_deselect","_triggerChange","added","_getIndecies","resolve","deferredRange","take","itemCount","ranges","defs","low","Math","floor","high","ceil","pages","each","_","deferred","end","existingRange","_multiplePrefetch","when","apply","prefetch","isEmptyList","_activeDeferred","_getSkip","_findDataItem","_getRange","_findRange","min","total","dataItemByIndex","progress","range","selectedDataItems","scrollWith","scrollTop","scrollTo","scrollToIndex","candidate","id","triggerEvent","flatView","isNaN","_getElementByIndex","_focusedIndex","hasClass","removeAttr","_getElementLocation","_screenHeight","focusIndex","focusFirst","focusLast","lastIndex","heightContainer","offsetHeight","focusPrev","focusNext","indices","initialIndices","isAlreadySelected","singleSelection","prefetchStarted","_selectDeferred","_deselectCurrentValues","_select","_listCreated","_lastDSFilter","Query","compareFilters","skipUpdate","noop","_lastScrollTop","_height","hasData","setScreenHeight","screenHeight","yPosition","yDownPostion","screenEnd","key","forEach","column","templateText","field","toString","_generateItems","count","text","tabIndex","setAttribute","minHeight","_saveInitialRanges","_ranges","start","reorder","get","_buildValueGetter","_setHeight","hide","show","_getter","_onScroll","force","getList","_listItems","_fixedHeader","_whenChanged","_reorderList","list","_calculateGroupPadding","_calculateColumnsHeaderPadding","currentHeight","innerHTML","padHeight","lastRequestedRange","lastRangeStart","pageSize","flatGroups","rangeStart","inRange","flatGroup","groups","len","groupLength","_getterDeferred","reject","then","firstItemIndex","_indexConstraint","currentVisibleGroup","firstVisibleDataItemIndex","firstVisibleDataItem","firstVisibleGroup","fixedGroupText","_itemMapper","listType","currentIndex","_currentGroup","_range","_view","_getDataItemsCollection","lastScrollTop","_listIndex","theValidator","downThreshold","upThreshold","listValidator","theNew","currentOffset","Infinity","arr1","arr2","ns","list2","offset","range2","diff","abs","unshift","reshift","_bufferSizes","opposite","down","up","max","buffers","_clickHandler","getElementIndex","elementIndex","selectedIndex","selectedIndexes","removedindexesCounter","inArray","_deselectSingleItem","children","values","oldSkip","currentTarget","isDefaultPrevented","firstItem","first","groupHeader","padding","display","support","scrollbar","isRtl","columnsHeader","plugin"],"sources":["kendo.virtuallist.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.data.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.data'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendovirtuallist = global.kendovirtuallist || {}, global.kendovirtuallist.js = factory()));\n})(this, (function () {\n let $ = kendo.jQuery;\n\n function valueMapperOptions(options, value, callback) {\n return {\n value: (options.selectable === \"multiple\" || options.checkboxes) ? value : value[0],\n success: function(response) {\n callback(response);\n }\n };\n }\n\n var __meta__ = {\n id: \"virtuallist\",\n name: \"VirtualList\",\n category: \"framework\",\n depends: [ \"data\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n encode = kendo.htmlEncode,\n Widget = ui.Widget,\n DataBoundWidget = ui.DataBoundWidget,\n percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i,\n LIST_CONTENT = \"k-list-content k-virtual-content\",\n TABLE_CONTENT = \"k-table-body k-table-scroller\",\n HEADER = \"k-list-group-sticky-header\",\n LIST_ITEM = \"k-list-item\",\n TABLE_ITEM = \"k-table-row\",\n HEIGHTCONTAINER = \"k-height-container\",\n GROUPITEM = \"k-list-item-group-label\",\n LIST_UL = \"k-list-ul\",\n TABLE_LIST = \"k-table-list\",\n\n SELECTED = \"k-selected\",\n FOCUSED = \"k-focus\",\n HOVER = \"k-hover\",\n CHANGE = \"change\",\n CLICK = \"click\",\n LISTBOUND = \"listBound\",\n ITEMCHANGE = \"itemChange\",\n\n ACTIVATE = \"activate\",\n DEACTIVATE = \"deactivate\",\n\n GROUP_ROW_SEL = \".k-table-group-row\",\n\n VIRTUAL_LIST_NS = \".VirtualList\";\n\n function lastFrom(array) {\n return array[array.length - 1];\n }\n\n function toArray(value) {\n return value instanceof Array ? value : [value];\n }\n\n function isPrimitive(dataItem) {\n return typeof dataItem === \"string\" || typeof dataItem === \"number\" || typeof dataItem === \"boolean\";\n }\n\n function getItemCount(screenHeight, listScreens, itemHeight) {\n return Math.ceil(screenHeight * listScreens / itemHeight);\n }\n\n function appendChild(parent, className, tagName) {\n var element = document.createElement(tagName || \"div\");\n if (className) {\n element.className = className;\n }\n parent.appendChild(element);\n\n return element;\n }\n\n function getDefaultItemHeight(listSize) {\n var mockList = $('
' +\n '
' +\n '' +\n '
' +\n '
');\n var lineHeight;\n\n mockList.css({\n position: \"absolute\",\n left: \"-200000px\",\n visibility: \"hidden\"\n });\n mockList.appendTo(document.body);\n lineHeight = parseFloat(kendo.getComputedStyles(mockList.find(\".k-list-item\")[0], [\"height\"]).height);\n mockList.remove();\n\n return lineHeight;\n }\n\n function bufferSizes(screenHeight, listScreens, opposite) { //in pixels\n return {\n down: screenHeight * opposite,\n up: screenHeight * (listScreens - 1 - opposite)\n };\n }\n\n function listValidator(options, screenHeight) {\n var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\n var upThreshold = options.threshold * screenHeight;\n\n return function(list, scrollTop, lastScrollTop) {\n if (scrollTop > lastScrollTop) {\n return scrollTop - list.top < downThreshold;\n } else {\n return list.top === 0 || scrollTop - list.top > upThreshold;\n }\n };\n }\n\n function scrollCallback(element, callback) {\n return function(force) {\n return callback(element.scrollTop, force);\n };\n }\n\n function syncList(reorder) {\n return function(list, force) {\n reorder(list.items, list.index, force);\n return list;\n };\n }\n\n function position(element, y) {\n element.style.webkitTransform = 'translateY(' + y + \"px)\";\n element.style.transform = 'translateY(' + y + \"px)\";\n }\n\n function map2(callback, templates) {\n return function(arr1, arr2) {\n for (var i = 0, len = arr1.length; i < len; i++) {\n callback(arr1[i], arr2[i], templates);\n if (arr2[i].item) {\n this.trigger(ITEMCHANGE, { item: $(arr1[i]), data: arr2[i].item, ns: kendo.ui });\n }\n }\n };\n }\n\n function reshift(items, diff) {\n var range;\n\n if (diff > 0) { // down\n range = items.splice(0, diff);\n items.push.apply(items, range);\n } else { // up\n range = items.splice(diff, -diff);\n items.unshift.apply(items, range);\n }\n\n return range;\n }\n\n function render(element, data, templates) {\n var itemTemplate = templates.template,\n hasColumns = this.options.columns && this.options.columns.length,\n altRow = data.index % 2 === 1 ? \"k-table-alt-row\" : \"\";\n\n element = $(element);\n\n if (!data.item) {\n itemTemplate = templates.placeholderTemplate;\n }\n\n if (data.index === 0 && this.header && data.group) {\n this.header.html(templates.fixedGroupTemplate(data.group));\n }\n\n element\n .attr(\"data-uid\", data.item ? data.item.uid : \"\")\n .attr(\"data-offset-index\", data.index);\n\n if (hasColumns && data.item) {\n if (altRow.length > 0) {\n element.addClass(altRow);\n } else {\n element.removeClass(\"k-table-alt-row\");\n }\n\n let renderedColumns = $(renderColumns(this.options, data.item, templates));\n kendo.applyStylesFromKendoAttributes(renderedColumns, [\"width\", \"max-width\"]);\n element.empty().append(renderedColumns);\n } else {\n element.find(\".\" + GROUPITEM).remove();\n element.find(\".k-list-item-text\").html(itemTemplate(data.item || {}));\n }\n\n element.toggleClass(FOCUSED, data.current);\n element.toggleClass(SELECTED, data.selected);\n element.toggleClass(\"k-first\", data.newGroup);\n element.toggleClass(\"k-last\", data.isLastGroupedItem);\n element.toggleClass(\"k-loading-item\", !data.item);\n\n if (data.index !== 0 && data.newGroup) {\n if (hasColumns) {\n $('' + templates.groupTemplate(data.group) + '')\n .appendTo(element);\n } else {\n $(\"
\")\n .appendTo(element)\n .html(templates.groupTemplate(data.group));\n }\n } else if (data.group && hasColumns) {\n element.append($(''));\n }\n\n if (data.top !== undefined$1) {\n position(element[0], data.top);\n }\n }\n\n function renderColumns(options, dataItem, templates) {\n var item = \"\";\n\n for (var i = 0; i < options.columns.length; i++) {\n var currentWidth = options.columns[i].width;\n var currentWidthInt = parseInt(currentWidth, 10);\n var widthStyle = '';\n\n if (currentWidth) {\n let widthValue = `${currentWidthInt}${percentageUnitsRegex.test(currentWidth) ? \"%\" : \"px\"}`;\n widthStyle = `${kendo.attr(\"style-width\")}=\"${widthValue}\" ${kendo.attr(\"style-max-width\")}=\"${widthValue}\"`;\n }\n\n item += \"\";\n item += templates[\"column\" + i](dataItem);\n item += \"\";\n }\n\n return item;\n }\n\n function mapChangedItems(selected, itemsToMatch) {\n var itemsLength = itemsToMatch.length;\n var selectedLength = selected.length;\n var dataItem;\n var found;\n var i, j;\n\n var changed = [];\n var unchanged = [];\n\n if (selectedLength) {\n for (i = 0; i < selectedLength; i++) {\n dataItem = selected[i];\n found = false;\n\n for (j = 0; j < itemsLength; j++) {\n if (dataItem === itemsToMatch[j]) {\n found = true;\n changed.push({ index: i, item: dataItem });\n break;\n }\n }\n\n if (!found) {\n unchanged.push(dataItem);\n }\n }\n }\n\n return {\n changed: changed,\n unchanged: unchanged\n };\n }\n\n function isActivePromise(promise) {\n return promise && promise.state() !== \"resolved\";\n }\n\n var VirtualList = DataBoundWidget.extend({\n init: function(element, options) {\n var that = this,\n contentClasses = options.columns && options.columns.length ? TABLE_CONTENT : LIST_CONTENT;\n\n that.bound(false);\n that._fetching = false;\n\n Widget.fn.init.call(that, element, options);\n\n if (!that.options.itemHeight) {\n that.options.itemHeight = getDefaultItemHeight(options.listSize);\n }\n\n options = that.options;\n\n that.element.attr(\"role\", \"listbox\");\n\n var contentSelector = \".\" + contentClasses.split(' ').join('.');\n var wrapper = that.element.closest(contentSelector);\n\n that.content = that.wrapper = wrapper.length ? wrapper : that.element.wrap(\"
\").parent();\n\n if (that.options.columns && that.options.columns.length) {\n var thead = that.element.closest(\".k-data-table\").find('.k-table-thead');\n var row = $('' +\n '' +\n '');\n\n thead.append(row);\n\n that.header = row.find(\".k-table-th\");\n that.element.addClass(TABLE_LIST + \" k-virtual-table\");\n } else {\n that.header = that.content.before(\"
\").prev();\n that.element.addClass(LIST_UL);\n }\n\n if (options.ariaLabel) {\n this.element.attr(\"aria-label\", options.ariaLabel);\n } else if (options.ariaLabelledBy) {\n this.element.attr(\"aria-labelledby\", options.ariaLabelledBy);\n }\n\n that.element.on(\"mouseenter\" + VIRTUAL_LIST_NS, \"li:not(.k-loading-item)\", function() { $(this).addClass(HOVER); })\n .on(\"mouseleave\" + VIRTUAL_LIST_NS, \"li\", function() { $(this).removeClass(HOVER); });\n\n that._values = toArray(that.options.value);\n that._selectedDataItems = [];\n that._selectedIndexes = [];\n that._rangesList = {};\n that._promisesList = [];\n that._optionID = kendo.guid();\n\n that._templates();\n\n that.setDataSource(options.dataSource);\n\n that.content.on(\"scroll\" + VIRTUAL_LIST_NS, kendo.throttle(function() {\n that._renderItems();\n that._triggerListBound();\n }, options.delay));\n\n that._selectable();\n },\n\n options: {\n name: \"VirtualList\",\n autoBind: true,\n delay: 100,\n height: null,\n listScreens: 4,\n threshold: 0.5,\n itemHeight: null,\n oppositeBuffer: 1,\n type: \"flat\",\n selectable: false,\n value: [],\n dataValueField: null,\n template: (data) => encode(data),\n placeholderTemplate: () => \"loading...\",\n groupTemplate: (data) => encode(data),\n fixedGroupTemplate: (data) => encode(data),\n mapValueTo: \"index\",\n valueMapper: null,\n ariaLabel: null,\n ariaLabelledBy: null\n },\n\n events: [\n CHANGE,\n CLICK,\n LISTBOUND,\n ITEMCHANGE,\n ACTIVATE,\n DEACTIVATE\n ],\n\n setOptions: function(options) {\n var itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\n\n Widget.fn.setOptions.call(this, options);\n\n if (this._selectProxy && this.options.selectable === false) {\n this.element.off(CLICK, \".\" + itemClass, this._selectProxy);\n } else if (!this._selectProxy && this.options.selectable) {\n this._selectable();\n }\n\n this._templates();\n this.refresh();\n },\n\n items: function() {\n return $(this._items);\n },\n\n destroy: function() {\n this.wrapper.off(VIRTUAL_LIST_NS);\n this.dataSource.unbind(CHANGE, this._refreshHandler);\n Widget.fn.destroy.call(this);\n },\n\n setDataSource: function(source) {\n var that = this;\n var dataSource = source || {};\n var value;\n\n dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n dataSource = kendo.data.DataSource.create(dataSource);\n\n if (that.dataSource) {\n that.dataSource.unbind(CHANGE, that._refreshHandler);\n\n that._clean();\n that.bound(false);\n\n that._deferValueSet = true;\n value = that.value();\n\n that.value([]);\n that.mute(function() {\n that.value(value);\n });\n } else {\n that._refreshHandler = that.refresh.bind(that);\n }\n\n that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n\n that.setDSFilter(dataSource.filter());\n\n if (dataSource.view().length !== 0) {\n that.refresh();\n } else if (that.options.autoBind) {\n dataSource.fetch();\n }\n },\n\n skip: function() {\n return this.dataSource.currentRangeStart();\n },\n\n _triggerListBound: function() {\n var that = this;\n var skip = that.skip();\n\n if (that.bound() && !that._selectingValue && that._skip !== skip) {\n that._skip = skip;\n that.trigger(LISTBOUND);\n }\n },\n\n _getValues: function(dataItems) {\n var getter = this._valueGetter;\n\n return $.map(dataItems, function(dataItem) {\n return getter(dataItem);\n });\n },\n\n _highlightSelectedItems: function() {\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\n if (item.length) {\n item.addClass(SELECTED);\n }\n }\n },\n\n refresh: function(e) {\n var that = this;\n var action = e && e.action;\n var isItemChange = action === \"itemchange\";\n var filtered = this.isFiltered();\n var result;\n\n if (that._mute) { return; }\n\n that._deferValueSet = false;\n\n if (!that._fetching) {\n if (filtered) {\n that.focus(0);\n }\n\n that._createList();\n if (!action && that._values.length && !filtered &&\n !that.options.skipUpdateOnBind && !that._emptySearch) {\n that._selectingValue = true;\n\n that.bound(true);\n that.value(that._values, true).done(function() {\n that._selectingValue = false;\n that._triggerListBound();\n });\n } else {\n that.bound(true);\n that._highlightSelectedItems();\n that._triggerListBound();\n }\n } else {\n if (that._renderItems) {\n that._renderItems(true);\n }\n\n that._triggerListBound();\n }\n\n if (isItemChange || action === \"remove\") {\n result = mapChangedItems(that._selectedDataItems, e.items);\n if (result.changed.length) {\n if (isItemChange) {\n that.trigger(\"selectedItemChange\", {\n items: result.changed\n });\n } else {\n that.value(that._getValues(result.unchanged));\n }\n }\n }\n\n that._fetching = false;\n },\n\n removeAt: function(position) {\n var value = this._values.splice(position, 1)[0];\n\n return {\n position: position,\n dataItem: this._removeSelectedDataItem(value)\n };\n },\n\n _removeSelectedDataItem: function(value) {\n var that = this,\n valueGetter = that._valueGetter;\n\n for (var idx in that._selectedDataItems) {\n if (valueGetter(that._selectedDataItems[idx]) === value) {\n that._selectedIndexes.splice(idx, 1);\n return that._selectedDataItems.splice(idx, 1)[0];\n }\n }\n },\n\n setValue: function(value) {\n this._values = toArray(value);\n },\n\n value: function(value, _forcePrefetch) {\n var that = this;\n\n if (value === undefined$1) {\n return that._values.slice();\n }\n\n if (value === null) {\n value = [];\n }\n\n value = toArray(value);\n\n if (!that._valueDeferred || that._valueDeferred.state() === \"resolved\") {\n that._valueDeferred = $.Deferred();\n }\n\n var shouldClear = that.options.selectable === \"multiple\" && that.select().length && value.length;\n\n if (shouldClear || !value.length) {\n that.select(-1);\n }\n\n that._values = value;\n\n if ((that.bound() && !that._mute && !that._deferValueSet) || _forcePrefetch) {\n that._prefetchByValue(value);\n }\n\n return that._valueDeferred;\n },\n\n _checkValuesOrder: function(value) {\n if (this._removedAddedIndexes &&\n this._removedAddedIndexes.length === value.length) {\n var newValue = this._removedAddedIndexes.slice();\n this._removedAddedIndexes = null;\n return newValue;\n }\n\n return value;\n },\n\n _prefetchByValue: function(value) {\n var that = this,\n dataView = that._dataView,\n valueGetter = that._valueGetter,\n mapValueTo = that.options.mapValueTo,\n item, match = false,\n forSelection = [];\n\n //try to find the items in the loaded data\n for (var i = 0; i < value.length; i++) {\n for (var idx = 0; idx < dataView.length; idx++) {\n item = dataView[idx].item;\n if (item) {\n match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n\n if (match) {\n forSelection.push(dataView[idx].index);\n }\n }\n }\n }\n\n if (forSelection.length === value.length) {\n that._values = [];\n that.select(forSelection);\n return;\n }\n\n //prefetch the items\n if (typeof that.options.valueMapper === \"function\") {\n const callback = mapValueTo === 'index' ? that.mapValueToIndex : that.mapValueToDataItem;\n that.options.valueMapper(valueMapperOptions(this.options, value, callback.bind(that)));\n } else {\n if (!that.value()[0]) {\n that.select([-1]);\n } else {\n that._selectingValue = false;\n that._triggerListBound();\n }\n }\n },\n\n mapValueToIndex: function(indexes) {\n if (indexes === undefined$1 || indexes === -1 || indexes === null) {\n indexes = [];\n } else {\n indexes = toArray(indexes);\n }\n\n if (!indexes.length) {\n indexes = [-1];\n } else {\n var removed = this._deselect([]).removed;\n if (removed.length) {\n this._triggerChange(removed, []);\n }\n }\n\n this.select(indexes);\n },\n\n mapValueToDataItem: function(dataItems) {\n var removed, added;\n\n if (dataItems === undefined$1 || dataItems === null) {\n dataItems = [];\n } else {\n dataItems = toArray(dataItems);\n }\n\n if (!dataItems.length) {\n this.select([-1]);\n } else {\n removed = $.map(this._selectedDataItems, function(item, index) {\n return { index: index, dataItem: item };\n });\n\n added = $.map(dataItems, function(item, index) {\n return { index: index, dataItem: item };\n });\n\n this._selectedDataItems = dataItems;\n\n this._selectedIndexes = [];\n\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n var item = this._getElementByDataItem(this._selectedDataItems[i]);\n this._selectedIndexes.push(this._getIndecies(item)[0]);\n item.addClass(SELECTED);\n }\n\n this._triggerChange(removed, added);\n\n if (this._valueDeferred) {\n this._valueDeferred.resolve();\n }\n }\n },\n\n deferredRange: function(index) {\n var dataSource = this.dataSource;\n var take = this.itemCount;\n var ranges = this._rangesList;\n var result = $.Deferred();\n var defs = [];\n\n var low = Math.floor(index / take) * take;\n var high = Math.ceil(index / take) * take;\n\n var pages = high === low ? [ high ] : [ low, high ];\n\n $.each(pages, function(_, skip) {\n var end = skip + take;\n var existingRange = ranges[skip];\n var deferred;\n\n if (!existingRange || (existingRange.end !== end)) {\n deferred = $.Deferred();\n ranges[skip] = { end: end, deferred: deferred };\n\n dataSource._multiplePrefetch(skip, take, function() {\n deferred.resolve();\n });\n } else {\n deferred = existingRange.deferred;\n }\n\n defs.push(deferred);\n });\n\n $.when.apply($, defs).done(function() {\n result.resolve();\n });\n\n return result;\n },\n\n prefetch: function(indexes) {\n var that = this,\n take = this.itemCount,\n isEmptyList = !that._promisesList.length;\n\n if (!isActivePromise(that._activeDeferred)) {\n that._activeDeferred = $.Deferred();\n that._promisesList = [];\n }\n\n $.each(indexes, function(_, index) {\n that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\n });\n\n if (isEmptyList) {\n $.when.apply($, that._promisesList).done(function() {\n that._promisesList = [];\n that._activeDeferred.resolve();\n });\n }\n\n return that._activeDeferred;\n },\n\n _findDataItem: function(view, index) {\n var group;\n\n //find in grouped view\n if (this.options.type === \"group\") {\n for (var i = 0; i < view.length; i++) {\n group = view[i].items;\n if (group.length <= index) {\n index = index - group.length;\n } else {\n return group[index];\n }\n }\n }\n\n //find in flat view\n return view[index];\n },\n\n _getRange: function(skip, take) {\n return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\n },\n\n dataItemByIndex: function(index) {\n var that = this;\n var take = that.itemCount;\n var skip = that._getSkip(index, take);\n var view = this._getRange(skip, take);\n\n //should not return item if data is not loaded\n if (!that._getRange(skip, take).length) {\n return null;\n }\n\n if (that.options.type === \"group\") {\n kendo.ui.progress($(that.wrapper), true);\n that.mute(function() {\n that.dataSource.range(skip, take, function() {\n kendo.ui.progress($(that.wrapper), false);\n });\n view = that.dataSource.view();\n });\n }\n\n return that._findDataItem(view, [index - skip]);\n },\n\n selectedDataItems: function() {\n return this._selectedDataItems.slice();\n },\n\n scrollWith: function(value) {\n this.content.scrollTop(this.content.scrollTop() + value);\n },\n\n scrollTo: function(y) {\n this.content.scrollTop(y); //works only if the element is visible\n },\n\n scrollToIndex: function(index) {\n this.scrollTo(index * this.options.itemHeight);\n },\n\n focus: function(candidate) {\n var element,\n index,\n data,\n current,\n itemHeight = this.options.itemHeight,\n id = this._optionID,\n triggerEvent = true;\n\n if (candidate === undefined$1) {\n current = this.element.find(\".\" + FOCUSED);\n return current.length ? current : null;\n }\n\n if (typeof candidate === \"function\") {\n data = this.dataSource.flatView();\n for (var idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n candidate = idx;\n break;\n }\n }\n }\n\n if (candidate instanceof Array) {\n candidate = lastFrom(candidate);\n }\n\n if (isNaN(candidate)) {\n element = $(candidate);\n index = parseInt($(element).attr(\"data-offset-index\"), 10);\n } else {\n index = candidate;\n element = this._getElementByIndex(index);\n }\n\n if (index === -1) {\n this.element.find(\".\" + FOCUSED).removeClass(FOCUSED);\n this._focusedIndex = undefined$1;\n return;\n }\n\n if (element.length) { /*focus rendered item*/\n if (element.hasClass(FOCUSED)) {\n triggerEvent = false;\n }\n if (this._focusedIndex !== undefined$1) {\n current = this._getElementByIndex(this._focusedIndex);\n current\n .removeClass(FOCUSED)\n .removeAttr(\"id\");\n\n if (triggerEvent) {\n this.trigger(DEACTIVATE);\n }\n }\n\n this._focusedIndex = index;\n\n element\n .addClass(FOCUSED)\n .attr(\"id\", id);\n\n var position = this._getElementLocation(index);\n\n if (position === \"top\") {\n this.scrollTo(index * itemHeight);\n } else if (position === \"bottom\") {\n this.scrollTo((index * itemHeight + itemHeight) - this._screenHeight);\n } else if (position === \"outScreen\") {\n this.scrollTo(index * itemHeight);\n }\n\n if (triggerEvent) {\n this.trigger(ACTIVATE);\n }\n } else { /*focus non rendered item*/\n this._focusedIndex = index;\n this.items().removeClass(FOCUSED);\n this.scrollToIndex(index);\n }\n },\n\n focusIndex: function() {\n return this._focusedIndex;\n },\n\n focusFirst: function() {\n this.scrollTo(0);\n this.focus(0);\n },\n\n focusLast: function() {\n var lastIndex = this.dataSource.total();\n this.scrollTo(this.heightContainer.offsetHeight);\n this.focus(lastIndex - 1);\n },\n\n focusPrev: function() {\n var index = this._focusedIndex;\n var current;\n\n if (!isNaN(index) && index > 0) {\n index -= 1;\n this.focus(index);\n\n current = this.focus();\n if (current && current.hasClass(\"k-loading-item\")) {\n index += 1;\n this.focus(index);\n }\n\n return index;\n } else {\n index = this.dataSource.total() - 1;\n this.focus(index);\n return index;\n }\n },\n\n focusNext: function() {\n var index = this._focusedIndex;\n var lastIndex = this.dataSource.total() - 1;\n var current;\n\n if (!isNaN(index) && index < lastIndex) {\n index += 1;\n this.focus(index);\n\n current = this.focus();\n if (current && current.hasClass(\"k-loading-item\")) {\n index -= 1;\n this.focus(index);\n }\n\n return index;\n } else {\n index = 0;\n this.focus(index);\n return index;\n }\n },\n\n _triggerChange: function(removed, added) {\n removed = removed || [];\n added = added || [];\n\n if (removed.length || added.length) {\n this.trigger(CHANGE, {\n removed: removed,\n added: added\n });\n }\n },\n\n select: function(candidate) {\n var that = this,\n indices,\n initialIndices,\n singleSelection = that.options.selectable !== \"multiple\",\n prefetchStarted = isActivePromise(that._activeDeferred),\n filtered = this.isFiltered(),\n isAlreadySelected,\n deferred,\n result,\n removed = [];\n\n if (candidate === undefined$1) {\n return that._selectedIndexes.slice();\n }\n\n if (!that._selectDeferred || that._selectDeferred.state() === \"resolved\") {\n that._selectDeferred = $.Deferred();\n }\n\n indices = that._getIndecies(candidate);\n isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\n removed = that._deselectCurrentValues(indices);\n\n if (removed.length || !indices.length || isAlreadySelected) {\n that._triggerChange(removed);\n\n if (that._valueDeferred) {\n that._valueDeferred.resolve().promise();\n }\n\n return that._selectDeferred.resolve().promise();\n }\n\n if (indices.length === 1 && indices[0] === -1) {\n indices = [];\n }\n\n initialIndices = indices;\n result = that._deselect(indices);\n removed = result.removed;\n indices = result.indices;\n\n if (singleSelection) {\n prefetchStarted = false;\n if (indices.length) {\n indices = [lastFrom(indices)];\n }\n }\n\n var done = function() {\n var added = that._select(indices);\n\n if (initialIndices.length === indices.length || singleSelection) {\n that.focus(indices);\n }\n\n that._triggerChange(removed, added);\n\n if (that._valueDeferred) {\n that._valueDeferred.resolve();\n }\n\n that._selectDeferred.resolve();\n };\n\n deferred = that.prefetch(indices);\n\n if (!prefetchStarted) {\n if (deferred) {\n deferred.done(done);\n } else {\n done();\n }\n }\n\n return that._selectDeferred.promise();\n },\n\n bound: function(bound) {\n if (bound === undefined$1) {\n return this._listCreated;\n }\n\n this._listCreated = bound;\n },\n\n mute: function(callback) {\n this._mute = true;\n callback();\n this._mute = false;\n },\n\n setDSFilter: function(filter) {\n this._lastDSFilter = $.extend({}, filter);\n },\n\n isFiltered: function() {\n if (!this._lastDSFilter) {\n this.setDSFilter(this.dataSource.filter());\n }\n\n return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n },\n\n skipUpdate: $.noop,\n\n _getElementByIndex: function(index) {\n return this.items().filter(function(idx, element) {\n return index === parseInt($(element).attr(\"data-offset-index\"), 10);\n });\n },\n\n _getElementByDataItem: function(dataItem) {\n var dataView = this._dataView,\n valueGetter = this._valueGetter,\n element, match;\n\n for (var i = 0; i < dataView.length; i++) {\n match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : dataView[i].item && dataItem && valueGetter(dataView[i].item) == valueGetter(dataItem);\n if (match) {\n element = dataView[i];\n break;\n }\n }\n\n return element ? this._getElementByIndex(element.index) : $();\n },\n\n _clean: function() {\n this.result = undefined$1;\n this._lastScrollTop = undefined$1;\n this._skip = undefined$1;\n $(this.heightContainer).remove();\n this.heightContainer = undefined$1;\n this.element.empty();\n },\n\n _height: function() {\n var hasData = !!this.dataSource.view().length,\n height = this.options.height,\n itemHeight = this.options.itemHeight,\n total = this.dataSource.total();\n\n if (!hasData) {\n height = 0;\n } else if (height / itemHeight > total) {\n height = total * itemHeight;\n }\n\n return height;\n },\n\n setScreenHeight: function() {\n var height = this._height();\n\n this.content.height(height);\n this._screenHeight = height;\n },\n\n screenHeight: function() {\n return this._screenHeight;\n },\n\n _getElementLocation: function(index) {\n var scrollTop = this.content.scrollTop(),\n screenHeight = this._screenHeight,\n itemHeight = this.options.itemHeight,\n yPosition = index * itemHeight,\n yDownPostion = yPosition + itemHeight,\n screenEnd = scrollTop + screenHeight,\n position;\n\n if (yPosition === (scrollTop - itemHeight) || (yDownPostion > scrollTop && yPosition < scrollTop)) {\n position = \"top\";\n } else if (yPosition === screenEnd || (yPosition < screenEnd && screenEnd < yDownPostion)) {\n position = \"bottom\";\n } else if ((yPosition >= scrollTop) && (yPosition <= scrollTop + (screenHeight - itemHeight))) {\n position = \"inScreen\";\n } else {\n position = \"outScreen\";\n }\n\n return position;\n },\n\n _templates: function() {\n var options = this.options;\n var templates = {\n template: options.template,\n placeholderTemplate: options.placeholderTemplate,\n groupTemplate: options.groupTemplate,\n fixedGroupTemplate: options.fixedGroupTemplate\n };\n\n if (options.columns) {\n options.columns.forEach((column, i) => {\n var templateText = column.field ? column.field.toString() : \"text\";\n var templateFunc = data => encode(kendo.getter(templateText)(data));\n\n templates[\"column\" + i] = column.template || templateFunc;\n });\n }\n\n for (var key in templates) {\n if (typeof templates[key] !== \"function\") {\n templates[key] = kendo.template(templates[key] || \"\");\n }\n }\n\n this.templates = templates;\n },\n\n _generateItems: function(element, count) {\n var items = [],\n item, text,\n itemHeight = this.options.itemHeight + \"px\",\n itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\n\n while (count-- > 0) {\n text = document.createElement(\"span\");\n text.className = \"k-list-item-text\";\n\n item = document.createElement(\"li\");\n item.tabIndex = -1;\n item.className = itemClass;\n item.setAttribute(\"role\", \"option\");\n item.style.height = itemHeight;\n item.style.minHeight = itemHeight;\n item.appendChild(text);\n\n element.appendChild(item);\n\n items.push(item);\n }\n\n return items;\n },\n\n _saveInitialRanges: function() {\n var ranges = this.dataSource._ranges;\n var deferred = $.Deferred();\n deferred.resolve();\n\n this._rangesList = {};\n for (var i = 0; i < ranges.length; i++) {\n this._rangesList[ranges[i].start] = { end: ranges[i].end, deferred: deferred };\n }\n },\n\n _createList: function() {\n var that = this,\n content = that.content.get(0),\n options = that.options,\n dataSource = that.dataSource;\n\n if (that.bound()) {\n that._clean();\n }\n\n that._saveInitialRanges();\n that._buildValueGetter();\n that.setScreenHeight();\n that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\n\n if (that.itemCount > dataSource.total()) {\n that.itemCount = dataSource.total();\n }\n\n that._items = that._generateItems(that.element[0], that.itemCount);\n\n that._setHeight(options.itemHeight * dataSource.total());\n that.options.type = (dataSource.group() || []).length ? \"group\" : \"flat\";\n\n if (that.options.type === \"flat\") {\n if (that.header.closest(GROUP_ROW_SEL).length) {\n that.header.closest(GROUP_ROW_SEL).hide();\n } else {\n that.header.hide();\n }\n } else {\n if (that.header.closest(GROUP_ROW_SEL).length) {\n that.header.closest(GROUP_ROW_SEL).show();\n } else {\n that.header.show();\n }\n }\n\n that.getter = that._getter(function() {\n that._renderItems(true);\n });\n\n that._onScroll = function(scrollTop, force) {\n var getList = that._listItems(that.getter);\n return that._fixedHeader(scrollTop, getList(scrollTop, force));\n };\n\n that._renderItems = that._whenChanged(\n scrollCallback(content, that._onScroll),\n syncList(that._reorderList(that._items, render.bind(that)))\n );\n\n that._renderItems();\n that._calculateGroupPadding(that._screenHeight);\n that._calculateColumnsHeaderPadding();\n },\n\n _setHeight: function(height) {\n var currentHeight,\n heightContainer = this.heightContainer;\n\n if (!heightContainer) {\n heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\n } else {\n currentHeight = heightContainer.offsetHeight;\n }\n\n if (height !== currentHeight) {\n heightContainer.innerHTML = \"\";\n\n while (height > 0) {\n var padHeight = Math.min(height, 250000); //IE workaround, should not create elements with height larger than 250000px\n appendChild(heightContainer).style.height = padHeight + \"px\";\n height -= padHeight;\n }\n }\n },\n\n _getter: function() {\n var lastRequestedRange = null,\n dataSource = this.dataSource,\n lastRangeStart = dataSource.skip(),\n type = this.options.type,\n pageSize = this.itemCount,\n flatGroups = {};\n\n if (dataSource.pageSize() < pageSize) {\n this.mute(function() {\n dataSource.pageSize(pageSize);\n });\n }\n\n return function(index, rangeStart) {\n var that = this;\n if (!dataSource.inRange(rangeStart, pageSize)) {\n if (lastRequestedRange !== rangeStart) {\n lastRequestedRange = rangeStart;\n lastRangeStart = rangeStart;\n\n if (that._getterDeferred) {\n that._getterDeferred.reject();\n }\n\n that._getterDeferred = that.deferredRange(rangeStart);\n that._getterDeferred.then(function() {\n var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\n\n that._getterDeferred = null;\n\n if (rangeStart <= firstItemIndex && firstItemIndex <= (rangeStart + pageSize)) {\n that._fetching = true;\n dataSource.range(rangeStart, pageSize);\n }\n });\n }\n\n return null;\n } else {\n if (lastRangeStart !== rangeStart) {\n this.mute(function() {\n dataSource.range(rangeStart, pageSize);\n lastRangeStart = rangeStart;\n });\n }\n\n var result;\n if (type === \"group\") { //grouped list\n if (!flatGroups[rangeStart]) {\n var flatGroup = flatGroups[rangeStart] = [];\n var groups = dataSource.view();\n for (var i = 0, len = groups.length; i < len; i++) {\n var group = groups[i];\n for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\n flatGroup.push({ item: group.items[j], group: group.value });\n }\n }\n }\n\n result = flatGroups[rangeStart][index - rangeStart];\n } else { //flat list\n result = dataSource.view()[index - rangeStart];\n }\n\n return result;\n }\n };\n },\n\n _fixedHeader: function(scrollTop, list) {\n var group = this.currentVisibleGroup,\n itemHeight = this.options.itemHeight,\n firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight),\n firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\n\n if (firstVisibleDataItem && firstVisibleDataItem.item) {\n var firstVisibleGroup = firstVisibleDataItem.group;\n\n if (firstVisibleGroup !== group) {\n var fixedGroupText = firstVisibleGroup || \"\";\n this.header.html(this.templates.fixedGroupTemplate(fixedGroupText));\n this.currentVisibleGroup = firstVisibleGroup;\n }\n }\n\n return list;\n },\n\n _itemMapper: function(item, index, value) {\n var listType = this.options.type,\n itemHeight = this.options.itemHeight,\n currentIndex = this._focusedIndex,\n selected = false,\n current = false,\n newGroup = false,\n group = null,\n match = false,\n valueGetter = this._valueGetter;\n\n if (listType === \"group\") {\n if (item) {\n newGroup = index === 0 || (this._currentGroup !== false && this._currentGroup !== item.group);\n this._currentGroup = item.group;\n }\n\n group = item ? item.group : null;\n item = item ? item.item : null;\n }\n\n if (this.options.mapValueTo === \"dataItem\" && this._selectedDataItems.length && item) {\n for (var i = 0; i < this._selectedDataItems.length; i++) {\n match = valueGetter(this._selectedDataItems[i]) === valueGetter(item);\n if (match) {\n selected = true;\n break;\n }\n }\n } else if (!this.isFiltered() && value.length && item) {\n for (var j = 0; j < value.length; j++) {\n match = isPrimitive(item) ? value[j] === item : value[j] === valueGetter(item);\n if (match) {\n value.splice(j , 1);\n selected = true;\n break;\n }\n }\n }\n\n if (currentIndex === index) {\n current = true;\n }\n\n return {\n item: item ? item : null,\n group: group,\n newGroup: newGroup,\n selected: selected,\n current: current,\n index: index,\n top: index * itemHeight\n };\n },\n\n _range: function(index) {\n var itemCount = this.itemCount,\n value = this._values.slice(),\n items = [],\n item;\n\n this._view = {};\n this._currentGroup = false;\n\n for (var i = index, length = index + itemCount; i < length; i++) {\n item = this._itemMapper(this.getter(i, index), i, value);\n if (items[items.length - 1]) {\n items[items.length - 1].isLastGroupedItem = item.newGroup;\n }\n items.push(item);\n this._view[item.index] = item;\n }\n\n this._dataView = items;\n return items;\n },\n\n _getDataItemsCollection: function(scrollTop, lastScrollTop) {\n var items = this._range(this._listIndex(scrollTop, lastScrollTop));\n return {\n index: items.length ? items[0].index : 0,\n top: items.length ? items[0].top : 0,\n items: items\n };\n },\n\n _listItems: function() {\n var screenHeight = this._screenHeight,\n options = this.options;\n\n var theValidator = listValidator(options, screenHeight);\n\n return (function(value, force) {\n var result = this.result,\n lastScrollTop = this._lastScrollTop;\n\n if (force || !result || !theValidator(result, value, lastScrollTop)) {\n result = this._getDataItemsCollection(value, lastScrollTop);\n }\n\n this._lastScrollTop = value;\n this.result = result;\n\n return result;\n }).bind(this);\n },\n\n _whenChanged: function(getter, callback) {\n var current;\n\n return function(force) {\n var theNew = getter(force);\n\n if (theNew !== current) {\n current = theNew;\n callback(theNew, force);\n }\n };\n },\n\n _reorderList: function(list, reorder) {\n var that = this;\n var length = list.length;\n var currentOffset = -Infinity;\n reorder = map2(reorder, this.templates).bind(this);\n\n return function(list2, offset, force) {\n var diff = offset - currentOffset;\n var range, range2;\n\n if (force || Math.abs(diff) >= length) { // full reorder\n range = list;\n range2 = list2;\n } else { // partial reorder\n range = reshift(list, diff);\n range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\n }\n\n reorder(range, range2, that.bound());\n\n currentOffset = offset;\n };\n },\n\n _bufferSizes: function() {\n var options = this.options;\n\n return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\n },\n\n _indexConstraint: function(position) {\n var itemCount = this.itemCount,\n itemHeight = this.options.itemHeight,\n total = this.dataSource.total();\n\n return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight )));\n },\n\n _listIndex: function(scrollTop, lastScrollTop) {\n var buffers = this._bufferSizes(),\n position;\n\n position = scrollTop - ((scrollTop > lastScrollTop) ? buffers.down : buffers.up);\n\n return this._indexConstraint(position);\n },\n\n _selectable: function() {\n var itemClass = this.options.columns && this.options.columns.length ? TABLE_ITEM : LIST_ITEM;\n\n if (this.options.selectable) {\n this._selectProxy = this._clickHandler.bind(this);\n this.element.on(CLICK + VIRTUAL_LIST_NS, \".\" + itemClass, this._selectProxy);\n }\n },\n\n getElementIndex: function(element) {\n if (!(element instanceof jQuery)) {\n return undefined$1;\n }\n\n return parseInt(element.attr(\"data-offset-index\"), 10);\n },\n\n _getIndecies: function(candidate) {\n var result = [], data;\n\n if (typeof candidate === \"function\") {\n data = this.dataSource.flatView();\n for (var idx = 0; idx < data.length; idx++) {\n if (candidate(data[idx])) {\n result.push(idx);\n break;\n }\n }\n }\n\n if (typeof candidate === \"number\") {\n result.push(candidate);\n }\n\n var elementIndex = this.getElementIndex(candidate);\n if (!isNaN(elementIndex)) {\n result.push(elementIndex);\n }\n\n if (candidate instanceof Array) {\n result = candidate;\n }\n\n return result;\n },\n\n _deselect: function(indices) {\n var removed = [],\n selectedIndex,\n dataItem,\n selectedIndexes = this._selectedIndexes,\n selectedDataItems = this._selectedDataItems,\n position = 0,\n selectable = this.options.selectable,\n removedindexesCounter = 0,\n valueGetter = this._valueGetter,\n item, match,\n result = null;\n\n indices = indices.slice();\n\n if (selectable === true || !indices.length) { //deselect everything\n for (var idx = 0; idx < selectedIndexes.length; idx++) {\n if (selectedIndexes[idx] !== undefined$1) {\n this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\n } else if (selectedDataItems[idx]) {\n this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\n }\n\n removed.push({\n index: selectedIndexes[idx],\n position: idx,\n dataItem: selectedDataItems[idx]\n });\n }\n\n this._values = [];\n this._selectedDataItems = [];\n this._selectedIndexes = [];\n } else if (selectable === \"multiple\") {\n for (var i = 0; i < indices.length; i++) {\n result = null;\n position = $.inArray(indices[i], selectedIndexes);\n dataItem = this.dataItemByIndex(indices[i]);\n\n if (position === -1 && dataItem) {\n for (var j = 0; j < selectedDataItems.length; j++) {\n match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\n if (match) {\n item = this._getElementByIndex(indices[i]);\n result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\n }\n }\n } else {\n selectedIndex = selectedIndexes[position];\n\n if (selectedIndex !== undefined$1) {\n item = this._getElementByIndex(selectedIndex);\n result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\n }\n }\n\n if (result) {\n indices.splice(i, 1);\n removed.push(result);\n\n removedindexesCounter++;\n i--;\n }\n }\n }\n\n return {\n indices: indices,\n removed: removed\n };\n },\n\n _deselectSingleItem: function(item, position, selectedIndex, removedindexesCounter) {\n var dataItem;\n\n if (!item.hasClass(SELECTED)) {\n return;\n }\n\n item.removeClass(SELECTED);\n this._values.splice(position, 1);\n this._selectedIndexes.splice(position, 1);\n dataItem = this._selectedDataItems.splice(position, 1)[0];\n\n return {\n index: selectedIndex,\n position: position + removedindexesCounter,\n dataItem: dataItem\n };\n },\n\n _deselectCurrentValues: function(indices) {\n var children = this.element[0].children;\n var value, index, position;\n var values = this._values;\n var removed = [];\n var idx = 0;\n var j;\n\n if (this.options.selectable !== \"multiple\" || !this.isFiltered()) {\n return [];\n }\n\n if (indices[0] === -1) {\n $(children).removeClass(SELECTED);\n removed = $.map(this._selectedDataItems.slice(0), function(dataItem, idx) {\n return {\n dataItem: dataItem,\n position: idx\n };\n });\n this._selectedIndexes = [];\n this._selectedDataItems = [];\n this._values = [];\n return removed;\n }\n\n for (; idx < indices.length; idx++) {\n position = -1;\n index = indices[idx];\n if (this.dataItemByIndex(index)) {\n value = this._valueGetter(this.dataItemByIndex(index));\n }\n\n for (j = 0; j < values.length; j++) {\n if (value == values[j]) {\n position = j;\n break;\n }\n }\n\n if (position > -1) {\n removed.push(this.removeAt(position));\n $(children[index]).removeClass(SELECTED);\n }\n }\n\n return removed;\n },\n\n _getSkip: function(index, take) {\n var page = index < take ? 1 : Math.floor(index / take) + 1;\n\n return (page - 1) * take;\n },\n\n _select: function(indexes) {\n var that = this,\n singleSelection = this.options.selectable !== \"multiple\",\n dataSource = this.dataSource,\n dataItem, oldSkip,\n take = this.itemCount,\n valueGetter = this._valueGetter,\n added = [];\n\n if (singleSelection) {\n that._selectedIndexes = [];\n that._selectedDataItems = [];\n that._values = [];\n }\n\n oldSkip = dataSource.skip();\n\n $.each(indexes, function(_, index) {\n var skip = that._getSkip(index, take);\n\n that.mute(function() {\n dataSource.range(skip, take); //switch the range to get the dataItem\n\n dataItem = that._findDataItem(dataSource.view(), [index - skip]);\n that._selectedIndexes.push(index);\n that._selectedDataItems.push(dataItem);\n that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\n\n added.push({\n index: index,\n dataItem: dataItem\n });\n\n that._getElementByIndex(index).addClass(SELECTED);\n\n dataSource.range(oldSkip, take); //switch back the range\n });\n });\n\n that._values = that._checkValuesOrder(that._values);\n\n return added;\n },\n\n _clickHandler: function(e) {\n var item = $(e.currentTarget);\n\n if (!e.isDefaultPrevented() && item.attr(\"data-uid\")) {\n this.trigger(CLICK, { item: item });\n }\n },\n\n _buildValueGetter: function() {\n this._valueGetter = kendo.getter(this.options.dataValueField);\n },\n\n _calculateGroupPadding: function(height) {\n var firstItem = this.items().first(),\n groupHeader = this.header,\n padding = 0;\n\n if (groupHeader[0] && groupHeader[0].style.display !== \"none\") {\n if (height !== \"auto\") {\n padding = kendo.support.scrollbar();\n }\n\n padding += parseFloat(firstItem.css(\"border-right-width\"), 10) + parseFloat(firstItem.children(\".k-group\").css(\"right\"), 10);\n\n groupHeader.css(\"padding-right\", padding);\n }\n },\n\n _calculateColumnsHeaderPadding: function() {\n if (this.options.columns && this.options.columns.length) {\n var isRtl = kendo.support.isRtl(this.wrapper);\n var scrollbar = kendo.support.scrollbar();\n var columnsHeader = this.content.parent().parent().find(\".k-table-header\");\n var total = this.dataSource.total();\n\n columnsHeader.css((isRtl ? \"padding-left\" : \"padding-right\"), total ? scrollbar : 0);\n }\n }\n\n });\n\n kendo.ui.VirtualList = VirtualList;\n kendo.ui.plugin(VirtualList);\n\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}