{"version":3,"file":"kendo.virtuallist.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendovirtuallist","js","this","$","undefined$1","kendo","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","success","response","mapValueToIndex","mapValueToDataItem","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","callback","_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","jQuery","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 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 var 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 var 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: function (data) { return encode(data); },\n placeholderTemplate: function () { return \"loading...\"; },\n groupTemplate: function (data) { return encode(data); },\n fixedGroupTemplate: function (data) { return 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 that.options.valueMapper({\n value: (this.options.selectable === \"multiple\") ? value : value[0],\n success: function(response) {\n if (mapValueTo === \"index\") {\n that.mapValueToIndex(response);\n } else if (mapValueTo === \"dataItem\") {\n that.mapValueToDataItem(response);\n }\n }\n });\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(function (column, i) {\n var templateText = column.field ? column.field.toString() : \"text\";\n var templateFunc = function (data) { return 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"]}