\")\n\t .appendTo(loading)\n\t .kendoProgressBar({\n\t type: \"chunk\",\n\t chunkCount: 10,\n\t min: 0,\n\t max: 1,\n\t value: 0\n\t }).data(\"kendoProgressBar\");\n\n\t deferred.progress(function(e) {\n\t pb.value(e.progress);\n\t })\n\t .always(function() {\n\t kendo.destroy(loading);\n\t loading.remove();\n\t });\n\t };\n\t }\n\n\t function syncTableHeight(table1, table2) {\n\t table1 = table1[0];\n\t table2 = table2[0];\n\n\t if (table1.rows.length !== table2.rows.length) {\n\t var lockedHeigth = table1.offsetHeight;\n\t var tableHeigth = table2.offsetHeight;\n\n\t var row;\n\t var diff;\n\t if (lockedHeigth > tableHeigth) {\n\t row = table2.rows[table2.rows.length - 1];\n\n\t if (filterRowRegExp.test(row.className)) {\n\t row = table2.rows[table2.rows.length - 2];\n\t }\n\n\t diff = lockedHeigth - tableHeigth;\n\t } else {\n\t row = table1.rows[table1.rows.length - 1];\n\n\t if (filterRowRegExp.test(row.className)) {\n\t row = table1.rows[table1.rows.length - 2];\n\t }\n\n\t diff = tableHeigth - lockedHeigth;\n\t }\n\t row.style.height = row.offsetHeight + diff + \"px\";\n\t }\n\t }\n\n\t function adjustRowHeight(row1, row2) {\n\t var height;\n\t var offsetHeight1 = row1.offsetHeight;\n\t var offsetHeight2 = row2.offsetHeight;\n\n\t if (offsetHeight1 > offsetHeight2) {\n\t height = offsetHeight1 + \"px\";\n\t } else if (offsetHeight1 < offsetHeight2) {\n\t height = offsetHeight2 + \"px\";\n\t }\n\n\t if (height) {\n\t row1.style.height = row2.style.height = height;\n\t }\n\t }\n\n\t function getCommand(commands, name) {\n\t var idx, length, command;\n\n\t if (typeof commands === STRING && commands === name) {\n\t return commands;\n\t }\n\n\t if (isPlainObject(commands) && commands.name === name) {\n\t return commands;\n\t }\n\n\t if (isArray(commands)) {\n\t for (idx = 0, length = commands.length; idx < length; idx++) {\n\t command = commands[idx];\n\n\t if ((typeof command === STRING && command === name) || (command.name === name)) {\n\t return command;\n\t }\n\t }\n\t }\n\t return null;\n\t }\n\n\t function focusTable(table, direct) {\n\t if (direct === true) {\n\t table = $(table);\n\t var scrollLeft = kendo.scrollLeft(table.parent());\n\n\t kendo.focusElement(table);\n\t kendo.scrollLeft(table.parent(), scrollLeft);\n\t } else {\n\t $(table).one(\"focusin\", function(e) { e.preventDefault(); }).focus();\n\t }\n\t }\n\n\t function isColumnGroupable(grid, column) {\n\t return grid.options.groupable && (column.groupable || column.groupable === undefined);\n\t }\n\n\t function isGroupedBy(groups, field) {\n\t return !!$.grep(groups, function (item) {\n\t return item.field === field;\n\t }).length;\n\t }\n\n\t function isColumnEditable(column, model) {\n\t if(!column.field || column.selectable) {\n\t return false;\n\t }\n\t if(model.editable && !model.editable(column.field)) {\n\t return false;\n\t }\n\t if(column.editable && !column.editable(model)) {\n\t return false;\n\t }\n\t return true;\n\t }\n\n\t function isInputElement(element) {\n\t return $(element).is(\":button,a,:input,a>.k-icon,textarea,span.k-select,span.k-icon,span.k-link,label.k-checkbox-label,.k-input,.k-multiselect-wrap,.k-picker-wrap,.k-picker-wrap>.k-selected-color,.k-tool-icon,.k-dropdown\");\n\t }\n\n\t function tableClick(e) {\n\t var currentTarget = $(e.currentTarget),\n\t isHeader = currentTarget.is(\"th\"),\n\t table = this.table.add(this.lockedTable),\n\t headerTable = this.thead.parent().add($(\">table\", this.lockedHeader)),\n\t isInput = isInputElement(e.target),\n\t preventScroll = $(e.target).is('.k-checkbox'),\n\t target = $(e.target),\n\t currentTable = currentTarget.closest(\"table\")[0];\n\n\t if (isInput && currentTarget.find(kendo.roleSelector(\"filtercell\")).length) {\n\t this._setCurrent(currentTarget);\n\t return;\n\t }\n\n\t if (currentTable !== table[0] && currentTable !== table[1] && currentTable !== headerTable[0] && currentTable !== headerTable[1]) {\n\t return;\n\t }\n\n\t if (target.is(\"a.k-i-expand, a.k-i-collapse\")) {\n\t return;\n\t }\n\n\t if (this.options.navigatable) {\n\t this._setCurrent(currentTarget, false, preventScroll);\n\t }\n\n\t if (isHeader || !isInput) {\n\t setTimeout(function() {\n\t if ($(kendo._activeElement()).hasClass(\"k-widget\")) {\n\t return;\n\t }\n\n\t //Only if input element is not selected yet and it is not descendant of the grid's table\n\t if ($(kendo._activeElement()).is(CHECKBOXINPUT) || !isInputElement(kendo._activeElement()) || !$.contains(currentTable, kendo._activeElement())) {\n\t //DOMElement.focus() only for header, because IE doesn't really focus the table\n\t focusTable(currentTable, true);\n\t }\n\t });\n\t }\n\n\t if (isHeader && !kendo.support.touch) {\n\t e.preventDefault(); //if any problem occurs, call preventDefault only for the clicked header links\n\t }\n\t }\n\n\t function leftMostPosition(element, rtl) {\n\t if (!rtl) {\n\t return 0;\n\t }\n\n\t var result = 0;\n\n\t if (kendo.support.browser.webkit) {\n\t result = element.width();\n\t }\n\n\t return result;\n\t }\n\n\t function parseVirtualSettings(options) {\n\t var asLowerString;\n\n\t if (typeof options === \"string\") {\n\t asLowerString = options.toLowerCase();\n\t if (asLowerString === \"true\") {\n\t return {\n\t rows: true\n\t };\n\t } else {\n\t return {\n\t rows: asLowerString.indexOf(\"rows\") > -1,\n\t columns: asLowerString.indexOf(\"columns\") > -1\n\t };\n\t }\n\n\t } else if (options === true) {\n\t return {\n\t rows: true\n\t };\n\t }\n\t }\n\n\t function isElementVisibleInWrapper(wrapper, element) {\n\t var offsetTop;\n\t var halfHeight;\n\n\t if (!wrapper) {\n\t return false;\n\t }\n\n\t element = $(element);\n\n\t if (element[0] && contains(wrapper[0], element[0])) {\n\t offsetTop = element.offset().top - wrapper.offset().top;\n\t halfHeight = element.outerHeight() / 2;\n\n\t if ((offsetTop >= 0 || math.abs(offsetTop) <= halfHeight) && (math.floor(offsetTop + halfHeight) <= wrapper.height())) {\n\t return true;\n\t }\n\t }\n\n\t return false;\n\t }\n\n\t function isInEdit(cell) {\n\t return cell &&\n\t (cell.hasClass(\"k-edit-cell\") ||\n\t cell.parent().hasClass(\"k-grid-edit-row\"));\n\t }\n\n\t function groupCellBuilder(headerTemplateIndex) {\n\t return '
';\n\t }\n\n\t function groupCellLockedContentBuilder(headerTemplateIndex) {\n\t return '
';\n\t }\n\n\t function groupRowBuilder(colspan, level, text, expanded, uid, includeAdditionalData) {\n\t return '
';\n\t }\n\n\t function groupRowLockedContentBuilder(colspan) {\n\t return '
';\n\t }\n\n\t function toggleRow(row, visible) {\n\t row = $(row)[0];\n\t if (visible) {\n\t row.style.display = \"\";\n\t } else {\n\t row.style.display = \"none\";\n\t }\n\t }\n\n\t function htmlEncode(value, backslashEscapeQuotes) {\n\t var ampRegExp = /&/g,\n\t ltRegExp = //g;\n\n\t return (\"\" + value)\n\t .replace(ampRegExp, \"&\")\n\t .replace(ltRegExp, \"<\")\n\t .replace(gtRegExp, \">\")\n\t .replace(quoteRegExp, function (match) {\n\t if (backslashEscapeQuotes) {\n\t return \"\\\\\" + match;\n\t }\n\t return \""\";\n\t })\n\t .replace(aposRegExp, \"'\");\n\t }\n\n\t ui.plugin(Grid);\n\t ui.plugin(VirtualScrollable);\n\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1048)))\n\n/***/ }),\n\n/***/ 1274:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.reorderable\");\n\n/***/ }),\n\n/***/ 1275:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.columnsorter\");\n\n/***/ }),\n\n/***/ 1276:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.columnmenu\");\n\n/***/ }),\n\n/***/ 1277:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.groupable\");\n\n/***/ }),\n\n/***/ 1278:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.pager\");\n\n/***/ }),\n\n/***/ 1279:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.sortable\");\n\n/***/ }),\n\n/***/ 1280:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.ooxml\");\n\n/***/ }),\n\n/***/ 1281:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.excel\");\n\n/***/ }),\n\n/***/ 1282:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.pane\");\n\n/***/ }),\n\n/***/ 1283:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.progressbar\");\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1284);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1049:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1113:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.draganddrop\");\n\n/***/ }),\n\n/***/ 1284:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1049), __webpack_require__(1113) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"groupable\",\n\t name: \"Groupable\",\n\t category: \"framework\",\n\t depends: [ \"core\", \"draganddrop\" ],\n\t advanced: true\n\t};\n\n\t(function ($, undefined) {\n\t var kendo = window.kendo,\n\t Widget = kendo.ui.Widget,\n\t outerWidth = kendo._outerWidth,\n\t kendoAttr = kendo.attr,\n\t extend = $.extend,\n\t each = $.each,\n\t proxy = $.proxy,\n\t isRtl = false,\n\n\t DIR = \"dir\",\n\t FIELD = \"field\",\n\t TITLE = \"title\",\n\t ASCENDING = \"asc\",\n\t DESCENDING = \"desc\",\n\t GROUP_SORT = \"group-sort\",\n\t NS = \".kendoGroupable\",\n\t CHANGE = \"change\",\n\t indicatorTmpl = kendo.template('
', { useWithBlock:false }),\n\t hint = function(target) {\n\t var title = target.attr(kendo.attr(\"title\"));\n\t if (title) {\n\t title = kendo.htmlEncode(title);\n\t }\n\n\t return $('')\n\t .html(title || target.attr(kendo.attr(\"field\")))\n\t .prepend('
');\n\n\t var Groupable = Widget.extend({\n\t init: function(element, options) {\n\t var that = this,\n\t group = kendo.guid(),\n\t intializePositions = proxy(that._intializePositions, that),\n\t draggable,\n\t horizontalCuePosition,\n\t dropCuePositions = that._dropCuePositions = [];\n\n\t Widget.fn.init.call(that, element, options);\n\n\t isRtl = kendo.support.isRtl(element);\n\t horizontalCuePosition = isRtl ? \"right\" : \"left\";\n\n\t that.draggable = draggable = that.options.draggable || new kendo.ui.Draggable(that.element, {\n\t filter: that.options.draggableElements,\n\t hint: hint,\n\t group: group\n\t });\n\n\t that.groupContainer = $(that.options.groupContainer, that.element)\n\t .kendoDropTarget({\n\t group: draggable.options.group,\n\t dragenter: function(e) {\n\t if (that._canDrag(e.draggable.currentTarget)) {\n\t e.draggable.hint.find(\".k-drag-status\").removeClass(\"k-i-cancel\").addClass(\"k-i-plus\");\n\t dropCue.css(horizontalCuePosition, 0).appendTo(that.groupContainer);\n\t }\n\t },\n\t dragleave: function(e) {\n\t e.draggable.hint.find(\".k-drag-status\").removeClass(\"k-i-plus\").addClass(\"k-i-cancel\");\n\t dropCue.remove();\n\t },\n\t drop: function(e) {\n\t var targetElement = e.draggable.currentTarget,\n\t field = targetElement.attr(kendo.attr(\"field\")),\n\t title = targetElement.attr(kendo.attr(\"title\")),\n\t sourceIndicator = that.indicator(field),\n\t dropCuePositions = that._dropCuePositions,\n\t lastCuePosition = dropCuePositions[dropCuePositions.length - 1],\n\t position;\n\t var sortOptions = extend({}, that.options.sort, targetElement.data(GROUP_SORT));\n\t var dir = sortOptions.dir;\n\n\t if (!targetElement.hasClass(\"k-group-indicator\") && !that._canDrag(targetElement)) {\n\t return;\n\t }\n\t if(lastCuePosition) {\n\t position = that._dropCuePosition(kendo.getOffset(dropCue).left + parseInt(lastCuePosition.element.css(\"marginLeft\"), 10) * (isRtl ? -1 : 1) + parseInt(lastCuePosition.element.css(\"marginRight\"), 10));\n\t if(position && that._canDrop($(sourceIndicator), position.element, position.left)) {\n\t if(position.before) {\n\t position.element.before(sourceIndicator || that.buildIndicator(field, title, dir));\n\t } else {\n\t position.element.after(sourceIndicator || that.buildIndicator(field, title, dir));\n\t }\n\n\t that._setIndicatorSortOptions(field, sortOptions);\n\t that._change();\n\t }\n\t } else {\n\t that.groupContainer.empty();\n\t that.groupContainer.append(that.buildIndicator(field, title, dir));\n\t that._setIndicatorSortOptions(field, sortOptions);\n\t that._change();\n\t }\n\t }\n\t })\n\t .kendoDraggable({\n\t filter: \"div.k-group-indicator\",\n\t hint: hint,\n\t group: draggable.options.group,\n\t dragcancel: proxy(that._dragCancel, that),\n\t dragstart: function(e) {\n\t var element = e.currentTarget,\n\t marginLeft = parseInt(element.css(\"marginLeft\"), 10),\n\t elementPosition = element.position(),\n\t left = isRtl ? elementPosition.left - marginLeft : elementPosition.left + outerWidth(element);\n\n\t intializePositions();\n\t dropCue.css(\"left\", left).appendTo(that.groupContainer);\n\t this.hint.find(\".k-drag-status\").removeClass(\"k-i-cancel\").addClass(\"k-i-plus\");\n\t },\n\t dragend: function() {\n\t that._dragEnd(this);\n\t },\n\t drag: proxy(that._drag, that)\n\t })\n\t .on(\"click\" + NS, \".k-button\", function(e) {\n\t e.preventDefault();\n\t that._removeIndicator($(this).parent());\n\t })\n\t .on(\"click\" + NS,\".k-link\", function(e) {\n\t var indicator = $(this).parent();\n\t var newDir = indicator.attr(kendoAttr(DIR)) === ASCENDING ? DESCENDING : ASCENDING;\n\n\t indicator.attr(kendoAttr(DIR), newDir);\n\t that._change();\n\t e.preventDefault();\n\t });\n\n\t draggable.bind([ \"dragend\", \"dragcancel\", \"dragstart\", \"drag\" ],\n\t {\n\t dragend: function() {\n\t that._dragEnd(this);\n\t },\n\t dragcancel: proxy(that._dragCancel, that),\n\t dragstart: function(e) {\n\t var element, marginRight, left;\n\n\t if (!that.options.allowDrag && !that._canDrag(e.currentTarget)) {\n\t e.preventDefault();\n\t return;\n\t }\n\n\t intializePositions();\n\t if(dropCuePositions.length) {\n\t element = dropCuePositions[dropCuePositions.length - 1].element;\n\t marginRight = parseInt(element.css(\"marginRight\"), 10);\n\t left = element.position().left + outerWidth(element) + marginRight;\n\t } else {\n\t left = 0;\n\t }\n\t },\n\t drag: proxy(that._drag, that)\n\t });\n\n\t that.dataSource = that.options.dataSource;\n\n\t if (that.dataSource && that._refreshHandler) {\n\t that.dataSource.unbind(CHANGE, that._refreshHandler);\n\t } else {\n\t that._refreshHandler = proxy(that.refresh, that);\n\t }\n\n\t if(that.dataSource) {\n\t that.dataSource.bind(\"change\", that._refreshHandler);\n\t that.refresh();\n\t }\n\t },\n\n\t refresh: function() {\n\t var that = this,\n\t dataSource = that.dataSource;\n\t var groups = dataSource.group() || [];\n\t var fieldAttr = kendoAttr(FIELD);\n\t var titleAttr = kendoAttr(TITLE);\n\t var indicatorHtml;\n\n\t if (that.groupContainer) {\n\t that.groupContainer.empty();\n\n\t each(groups, function(index, group) {\n\t var field = group.field;\n\t var dir =group.dir;\n\t var element = that.element\n\t .find(that.options.filter)\n\t .filter(function() {\n\t return $(this).attr(fieldAttr) === field;\n\t });\n\n\t indicatorHtml = that.buildIndicator(field, element.attr(titleAttr), dir);\n\t that.groupContainer.append(indicatorHtml);\n\t that._setIndicatorSortOptions(field, extend({}, that.options.sort, { dir: dir, compare: group.compare }));\n\t });\n\t }\n\n\t that._invalidateGroupContainer();\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\n\t Widget.fn.destroy.call(that);\n\n\t that.groupContainer.off(NS);\n\n\t if (that.groupContainer.data(\"kendoDropTarget\")) {\n\t that.groupContainer.data(\"kendoDropTarget\").destroy();\n\t }\n\n\t if (that.groupContainer.data(\"kendoDraggable\")) {\n\t that.groupContainer.data(\"kendoDraggable\").destroy();\n\t }\n\n\t if (!that.options.draggable) {\n\t that.draggable.destroy();\n\t }\n\n\t if (that.dataSource && that._refreshHandler) {\n\t that.dataSource.unbind(\"change\", that._refreshHandler);\n\t that._refreshHandler = null;\n\t }\n\n\t that.groupContainer = that.element = that.draggable = null;\n\t },\n\n\t events: [\"change\"],\n\n\t options: {\n\t name: \"Groupable\",\n\t filter: \"th\",\n\t draggableElements: \"th\",\n\t messages: {\n\t empty: \"Drag a column header and drop it here to group by that column\"\n\t },\n\t sort: {\n\t dir: ASCENDING,\n\t compare: null\n\t }\n\t },\n\n\t indicator: function(field) {\n\t var indicators = $(\".k-group-indicator\", this.groupContainer);\n\t return $.grep(indicators, function (item)\n\t {\n\t return $(item).attr(kendo.attr(\"field\")) === field;\n\t })[0];\n\t },\n\n\t buildIndicator: function(field, title, dir) {\n\t var that = this;\n\t var indicator = indicatorTmpl({\n\t ns: kendo.ns,\n\t field: field.replace(/\"/g, \"'\"),\n\t title: title,\n\t dir: dir || (that.options.sort || {}).dir || ASCENDING\n\t });\n\n\t return indicator;\n\t },\n\n\t _setIndicatorSortOptions: function(field, options) {\n\t var indicator = $(this.indicator(field));\n\t indicator.data(GROUP_SORT, options);\n\t },\n\n\t aggregates: function() {\n\t var that = this;\n\t var names;\n\t var idx;\n\t var length;\n\n\t return that.element.find(that.options.filter).map(function() {\n\t var cell = $(this),\n\t aggregate = cell.attr(kendo.attr(\"aggregates\")),\n\t member = cell.attr(kendo.attr(\"field\"));\n\n\t if (aggregate && aggregate !== \"\") {\n\t names = aggregate.split(\",\");\n\t aggregate = [];\n\t for (idx = 0, length = names.length; idx < length; idx++) {\n\t aggregate.push({ field: member, aggregate: names[idx] });\n\t }\n\t }\n\t return aggregate;\n\t }).toArray();\n\t },\n\n\t descriptors: function() {\n\t var that = this,\n\t indicators = $(\".k-group-indicator\", that.groupContainer),\n\t field,\n\t aggregates = that.aggregates();\n\n\t return $.map(indicators, function(item) {\n\t item = $(item);\n\t field = item.attr(kendo.attr(\"field\"));\n\t var sortOptions = that.options.sort || {};\n\t var indicatorSortOptions = item.data(GROUP_SORT) || {};\n\n\t return {\n\t field: field,\n\t dir: item.attr(kendo.attr(\"dir\")),\n\t aggregates: aggregates || [],\n\t compare: indicatorSortOptions.compare || sortOptions.compare\n\t };\n\t });\n\t },\n\n\t _removeIndicator: function(indicator) {\n\t var that = this;\n\t indicator.off();\n\t indicator.removeData();\n\t indicator.remove();\n\t that._invalidateGroupContainer();\n\t that._change();\n\t },\n\n\t _change: function() {\n\t var that = this;\n\t if(that.dataSource) {\n\t var descriptors = that.descriptors();\n\t if (that.trigger(\"change\", { groups: descriptors })) {\n\t that.refresh();\n\t return;\n\t }\n\t that.dataSource.group(descriptors);\n\t }\n\t },\n\n\t _dropCuePosition: function(position) {\n\t var dropCuePositions = this._dropCuePositions;\n\t if(!dropCue.is(\":visible\") || dropCuePositions.length === 0) {\n\t return;\n\t }\n\n\t position = Math.ceil(position);\n\n\t var lastCuePosition = dropCuePositions[dropCuePositions.length - 1],\n\t left = lastCuePosition.left,\n\t right = lastCuePosition.right,\n\t marginLeft = parseInt(lastCuePosition.element.css(\"marginLeft\"), 10),\n\t marginRight = parseInt(lastCuePosition.element.css(\"marginRight\"), 10);\n\n\t if(position >= right && !isRtl || position < left && isRtl) {\n\t position = {\n\t left: lastCuePosition.element.position().left + (!isRtl ? outerWidth(lastCuePosition.element) + marginRight : - marginLeft),\n\t element: lastCuePosition.element,\n\t before: false\n\t };\n\t } else {\n\t position = $.grep(dropCuePositions, function(item) {\n\t return (item.left <= position && position <= item.right) || (isRtl && position > item.right);\n\t })[0];\n\n\t if(position) {\n\t position = {\n\t left: isRtl ? position.element.position().left + outerWidth(position.element) + marginRight : position.element.position().left - marginLeft,\n\t element: position.element,\n\t before: true\n\t };\n\t }\n\t }\n\n\t return position;\n\t },\n\t _drag: function(event) {\n\t var position = this._dropCuePosition(event.x.location);\n\n\t if (position) {\n\t dropCue.css({ left: position.left, right: \"auto\" });\n\t }\n\t },\n\t _canDrag: function(element) {\n\t var field = element.attr(kendo.attr(\"field\"));\n\n\t return element.attr(kendo.attr(\"groupable\")) != \"false\" &&\n\t field &&\n\t (element.hasClass(\"k-group-indicator\") ||\n\t !this.indicator(field));\n\t },\n\t _canDrop: function(source, target, position) {\n\t var next = source.next(),\n\t result = source[0] !== target[0] && (!next[0] || target[0] !== next[0] || (!isRtl && position > next.position().left || isRtl && position < next.position().left));\n\t return result;\n\t },\n\t _dragEnd: function(draggable) {\n\t var that = this,\n\t field = draggable.currentTarget.attr(kendo.attr(\"field\")),\n\t sourceIndicator = that.indicator(field);\n\n\t if (draggable !== that.options.draggable && !draggable.dropped && sourceIndicator) {\n\t that._removeIndicator($(sourceIndicator));\n\t }\n\n\t that._dragCancel();\n\t },\n\t _dragCancel: function() {\n\t dropCue.remove();\n\t this._dropCuePositions = [];\n\t },\n\t _intializePositions: function() {\n\t var that = this,\n\t indicators = $(\".k-group-indicator\", that.groupContainer),\n\t left;\n\n\t that._dropCuePositions = $.map(indicators, function(item) {\n\t item = $(item);\n\t left = kendo.getOffset(item).left;\n\t return {\n\t left: parseInt(left, 10),\n\t right: parseInt(left + outerWidth(item), 10),\n\t element: item\n\t };\n\t });\n\t },\n\t _invalidateGroupContainer: function() {\n\t var groupContainer = this.groupContainer;\n\t if(groupContainer && groupContainer.is(\":empty\")) {\n\t groupContainer.html(this.options.messages.empty);\n\t }\n\t }\n\t });\n\n\t kendo.ui.plugin(Groupable);\n\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1285);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1285:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1286) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"imagebrowser\",\n\t name: \"ImageBrowser\",\n\t category: \"web\",\n\t description: \"\",\n\t hidden: true,\n\t depends: [ \"filebrowser\" ]\n\t};\n\n\t(function($, undefined) {\n\t var kendo = window.kendo,\n\t FileBrowser = kendo.ui.FileBrowser,\n\t isPlainObject = $.isPlainObject,\n\t proxy = $.proxy,\n\t extend = $.extend,\n\t isFunction = kendo.isFunction,\n\t trimSlashesRegExp = /(^\\/|\\/$)/g,\n\t ERROR = \"error\",\n\t NS = \".kendoImageBrowser\",\n\t NAMEFIELD = \"name\",\n\t SIZEFIELD = \"size\",\n\t TYPEFIELD = \"type\",\n\t DEFAULTSORTORDER = { field: TYPEFIELD, dir: \"asc\" },\n\t EMPTYTILE = kendo.template('
${text}
');\n\n\t extend(true, kendo.data, {\n\t schemas: {\n\t \"imagebrowser\": {\n\t data: function(data) {\n\t return data.items || data || [];\n\t },\n\t model: {\n\t id: \"name\",\n\t fields: {\n\t name: \"name\",\n\t size: \"size\",\n\t type: \"type\"\n\t }\n\t }\n\t }\n\t }\n\t });\n\n\t extend(true, kendo.data, {\n\t transports: {\n\t \"imagebrowser\": kendo.data.RemoteTransport.extend({\n\t init: function(options) {\n\t kendo.data.RemoteTransport.fn.init.call(this, $.extend(true, {}, this.options, options));\n\t },\n\t _call: function(type, options) {\n\t options.data = $.extend({}, options.data, { path: this.options.path() });\n\n\t if (isFunction(this.options[type])) {\n\t this.options[type].call(this, options);\n\t } else {\n\t kendo.data.RemoteTransport.fn[type].call(this, options);\n\t }\n\t },\n\t read: function(options) {\n\t this._call(\"read\", options);\n\t },\n\t create: function(options) {\n\t this._call(\"create\", options);\n\t },\n\t destroy: function(options) {\n\t this._call(\"destroy\", options);\n\t },\n\t update: function() {\n\t //updates are handled by the upload\n\t },\n\t options: {\n\t read: {\n\t type: \"POST\"\n\t },\n\t update: {\n\t type: \"POST\"\n\t },\n\t create: {\n\t type: \"POST\"\n\t },\n\t destroy: {\n\t type: \"POST\"\n\t }\n\t }\n\t })\n\t }\n\t });\n\n\t function offsetTop(element) {\n\t return element.offsetTop - $(element).height();\n\t }\n\n\t function concatPaths(path, name) {\n\t if(path === undefined || !path.match(/\\/$/)) {\n\t path = (path || \"\") + \"/\";\n\t }\n\t return path + name;\n\t }\n\n\t function sizeFormatter(value) {\n\t if(!value) {\n\t return \"\";\n\t }\n\n\t var suffix = \" bytes\";\n\n\t if (value >= 1073741824) {\n\t suffix = \" GB\";\n\t value /= 1073741824;\n\t } else if (value >= 1048576) {\n\t suffix = \" MB\";\n\t value /= 1048576;\n\t } else if (value >= 1024) {\n\t suffix = \" KB\";\n\t value /= 1024;\n\t }\n\n\t return Math.round(value * 100) / 100 + suffix;\n\t }\n\n\t var ImageBrowser = FileBrowser.extend({\n\t init: function(element, options) {\n\t var that = this;\n\n\t options = options || {};\n\n\t FileBrowser.fn.init.call(that, element, options);\n\n\t that.element.addClass(\"k-imagebrowser\");\n\t },\n\n\t options: {\n\t name: \"ImageBrowser\",\n\t fileTypes: \"*.png,*.gif,*.jpg,*.jpeg\"\n\t },\n\n\t value: function () {\n\t var that = this,\n\t selected = that._selectedItem(),\n\t path,\n\t imageUrl = that.options.transport.imageUrl;\n\n\t if (selected && selected.get(TYPEFIELD) === \"f\") {\n\t path = concatPaths(that.path(), selected.get(NAMEFIELD)).replace(trimSlashesRegExp, \"\");\n\t if (imageUrl) {\n\t path = isFunction(imageUrl) ? imageUrl(path) : kendo.format(imageUrl, encodeURIComponent(path));\n\t }\n\t return path;\n\t }\n\t },\n\n\t _fileUpload: function(e) {\n\t var that = this,\n\t options = that.options,\n\t fileTypes = options.fileTypes,\n\t filterRegExp = new RegExp((\"(\" + fileTypes.split(\",\").join(\")|(\") + \")\").replace(/\\*\\./g , \".*.\"), \"i\"),\n\t fileName = e.files[0].name,\n\t fileSize = e.files[0].size,\n\t fileNameField = NAMEFIELD,\n\t sizeField = SIZEFIELD,\n\t file;\n\n\t if (filterRegExp.test(fileName)) {\n\t e.data = { path: that.path() };\n\n\t file = that._createFile(fileName, fileSize);\n\n\t if (!file) {\n\t e.preventDefault();\n\t } else {\n\t file._uploading = true;\n\n\t that.upload.one(\"error\", function() {\n\t file = undefined;\n\t });\n\n\t that.upload.one(\"success\", function(e) {\n\t if (file) {\n\t delete file._uploading;\n\n\t var model = that._insertFileToList(file);\n\n\t model.set(fileNameField, e.response[that._getFieldName(fileNameField)]);\n\t model.set(sizeField, e.response[that._getFieldName(sizeField)]);\n\n\t that._tiles = that.listView.items().filter(\"[\" + kendo.attr(\"type\") + \"=f]\");\n\t that._scroll();\n\t }\n\t });\n\t }\n\t } else {\n\t e.preventDefault();\n\t that._showMessage(kendo.format(options.messages.invalidFileType, fileName, fileTypes));\n\t }\n\t },\n\n\t _content: function() {\n\t var that = this;\n\n\t that.list = $('
')\n\t .appendTo(that.element)\n\t .on(\"dblclick\" + NS, \".k-listview-item\", proxy(that._dblClick, that));\n\n\t that.listView = new kendo.ui.ListView(that.list, {\n\t layout: \"flex\",\n\t flex: {\n\t direction: \"row\",\n\t wrap: \"wrap\"\n\t },\n\t dataSource: that.dataSource,\n\t template: that._itemTmpl(),\n\t editTemplate: that._editTmpl(),\n\t selectable: true,\n\t autoBind: false,\n\t dataBinding: function(e) {\n\n\t that.toolbar.find(\".k-i-close\").parent().addClass(\"k-state-disabled\");\n\n\t if (e.action === \"remove\" || e.action === \"sync\") {\n\t e.preventDefault();\n\t kendo.ui.progress(that.listView.content, false);\n\t }\n\t },\n\t dataBound: function() {\n\t if (that.dataSource.view().length) {\n\t that._tiles = this.items().filter(\"[\" + kendo.attr(\"type\") + \"=f]\");\n\t that._scroll();\n\t } else {\n\t this.content.append(EMPTYTILE({ text: that.options.messages.emptyFolder }));\n\t }\n\t },\n\t change: proxy(that._listViewChange, that)\n\t });\n\n\t that.listView.content.on(\"scroll\" + NS, proxy(that._scroll, that));\n\t },\n\n\t _dataSource: function() {\n\t var that = this,\n\t options = that.options,\n\t transport = options.transport,\n\t typeSortOrder = extend({}, DEFAULTSORTORDER),\n\t nameSortOrder = { field: NAMEFIELD, dir: \"asc\" },\n\t schema,\n\t dataSource = {\n\t type: transport.type || \"imagebrowser\",\n\t sort: [typeSortOrder, nameSortOrder]\n\t };\n\n\t if (isPlainObject(transport)) {\n\t transport.path = proxy(that.path, that);\n\t dataSource.transport = transport;\n\t }\n\n\t if (isPlainObject(options.schema)) {\n\t dataSource.schema = options.schema;\n\t } else if (transport.type && isPlainObject(kendo.data.schemas[transport.type])) {\n\t schema = kendo.data.schemas[transport.type];\n\t }\n\n\t if (that.dataSource && that._errorHandler) {\n\t that.dataSource.unbind(ERROR, that._errorHandler);\n\t } else {\n\t that._errorHandler = proxy(that._error, that);\n\t }\n\n\t that.dataSource = kendo.data.DataSource.create(dataSource)\n\t .bind(ERROR, that._errorHandler);\n\t },\n\n\t _loadImage: function(li) {\n\t var that = this,\n\t element = $(li),\n\t dataItem = that.dataSource.getByUid(element.attr(kendo.attr(\"uid\"))),\n\t name = dataItem.get(NAMEFIELD),\n\t thumbnailUrl = that.options.transport.thumbnailUrl,\n\t img = $(\"
![]()
\", { alt: name }),\n\t urlJoin = \"?\";\n\n\t if (dataItem._uploading) {\n\t return;\n\t }\n\n\t img.hide()\n\t .on(\"load\" + NS, function() {\n\t $(this).prev().remove().end().addClass(\"k-image k-file-image\").fadeIn();\n\t });\n\n\t element.find(\".k-i-loading\").after(img);\n\n\t if (isFunction(thumbnailUrl)) {\n\t thumbnailUrl = thumbnailUrl(that.path(), encodeURIComponent(name));\n\t } else {\n\t if (thumbnailUrl.indexOf(\"?\") >= 0) {\n\t urlJoin = \"&\";\n\t }\n\n\t thumbnailUrl = thumbnailUrl + urlJoin + \"path=\" + encodeURIComponent(that.path() + name);\n\t if (dataItem._override) {\n\t thumbnailUrl += \"&_=\" + new Date().getTime();\n\t delete dataItem._override;\n\t }\n\t }\n\n\t // IE8 will trigger the load event immediately when the src is assigned\n\t // if the image is loaded from the cache\n\t img.attr(\"src\", thumbnailUrl);\n\n\t li.loaded = true;\n\t },\n\n\t _scroll: function() {\n\t var that = this;\n\t if (that.options.transport && that.options.transport.thumbnailUrl) {\n\t clearTimeout(that._timeout);\n\n\t that._timeout = setTimeout(function() {\n\n\t var height = kendo._outerHeight(that.listView.content),\n\t viewTop = that.listView.content.scrollTop(),\n\t viewBottom = viewTop + height;\n\n\t that._tiles.each(function() {\n\t var top = offsetTop(this),\n\t bottom = top + this.offsetHeight;\n\n\t if ((top >= viewTop && top < viewBottom) || (bottom >= viewTop && bottom < viewBottom)) {\n\t that._loadImage(this);\n\t }\n\n\t if (top > viewBottom) {\n\t return false;\n\t }\n\t });\n\n\t that._tiles = that._tiles.filter(function() {\n\t return !this.loaded;\n\t });\n\n\t }, 250);\n\t }\n\t },\n\n\t _itemTmpl: function() {\n\t var that = this,\n\t html = '
';\n\t html += '#if(' + TYPEFIELD + ' == \"d\") { #';\n\t html += '
';\n\t html += \"#}else{#\";\n\t if (that.options.transport && that.options.transport.thumbnailUrl) {\n\t html += '
';\n\t } else {\n\t html += '
';\n\t }\n\t html += \"#}#\";\n\t html += '
${' + NAMEFIELD + '}';\n\t html += '#if(' + TYPEFIELD + ' == \"f\") { #
${this.sizeFormatter(' + SIZEFIELD + ')} #}#';\n\t html += '
';\n\n\t return proxy(kendo.template(html), { sizeFormatter: sizeFormatter } );\n\t }\n\t });\n\n\t kendo.ui.plugin(ImageBrowser);\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ }),\n\n/***/ 1286:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.filebrowser\");\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1291);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1059:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.data\");\n\n/***/ }),\n\n/***/ 1089:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.popup\");\n\n/***/ }),\n\n/***/ 1291:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1059), __webpack_require__(1089) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"list\",\n\t name: \"List\",\n\t category: \"framework\",\n\t depends: [ \"data\", \"popup\" ],\n\t hidden: true\n\t};\n\n\t/*jshint evil: true*/\n\t(function($, undefined) {\n\t var kendo = window.kendo,\n\t ui = kendo.ui,\n\t outerHeight = kendo._outerHeight,\n\t percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i,\n\t Widget = ui.Widget,\n\t keys = kendo.keys,\n\t support = kendo.support,\n\t htmlEncode = kendo.htmlEncode,\n\t activeElement = kendo._activeElement,\n\t outerWidth = kendo._outerWidth,\n\t ObservableArray = kendo.data.ObservableArray,\n\t ID = \"id\",\n\t CHANGE = \"change\",\n\t FOCUSED = \"k-state-focused\",\n\t HOVER = \"k-state-hover\",\n\t LOADING = \"k-i-loading\",\n\t GROUPHEADER = \".k-group-header\",\n\t ITEMSELECTOR = \".k-item\",\n\t LABELIDPART = \"_label\",\n\t OPEN = \"open\",\n\t CLOSE = \"close\",\n\t CASCADE = \"cascade\",\n\t SELECT = \"select\",\n\t SELECTED = \"selected\",\n\t REQUESTSTART = \"requestStart\",\n\t REQUESTEND = \"requestEnd\",\n\t BLUR = \"blur\",\n\t FOCUS = \"focus\",\n\t FOCUSOUT = \"focusout\",\n\t extend = $.extend,\n\t proxy = $.proxy,\n\t isArray = $.isArray,\n\t browser = support.browser,\n\t HIDDENCLASS = \"k-hidden\",\n\t WIDTH = \"width\",\n\t isIE = browser.msie,\n\t quotRegExp = /\"/g,\n\t alternativeNames = {\n\t \"ComboBox\": [ \"DropDownList\", \"MultiColumnComboBox\" ],\n\t \"DropDownList\": [ \"ComboBox\", \"MultiColumnComboBox\" ],\n\t \"MultiColumnComboBox\": [ \"ComboBox\", \"DropDownList\" ]\n\t };\n\n\t var List = kendo.ui.DataBoundWidget.extend({\n\t init: function(element, options) {\n\t var that = this,\n\t ns = that.ns,\n\t id;\n\n\t Widget.fn.init.call(that, element, options);\n\t element = that.element;\n\t options = that.options;\n\n\t that._isSelect = element.is(SELECT);\n\n\t if (that._isSelect && that.element[0].length) {\n\t if (!options.dataSource) {\n\t options.dataTextField = options.dataTextField || \"text\";\n\t options.dataValueField = options.dataValueField || \"value\";\n\t }\n\t }\n\n\t that.ul = $('
')\n\t .attr({\n\t tabIndex: -1,\n\t \"aria-hidden\": true\n\t });\n\n\t that.list = $(\"
\")\n\t .append(that.ul)\n\t .on(\"mousedown\" + ns, proxy(that._listMousedown, that));\n\n\t id = element.attr(ID);\n\n\t if (!id) {\n\t id = kendo.guid();\n\t }\n\n\t that.list.attr(ID, id + \"-list\");\n\t that.ul.attr(ID, id + \"_listbox\");\n\n\t if (options.columns && options.columns.length) {\n\t that.ul.removeClass(\"k-list\").addClass(\"k-grid-list\");\n\t that._columnsHeader();\n\t }\n\n\t that._header();\n\t that._noData();\n\t that._footer();\n\t that._accessors();\n\t that._initValue();\n\t },\n\n\t options: {\n\t valuePrimitive: false,\n\t footerTemplate: \"\",\n\t headerTemplate: \"\",\n\t noDataTemplate: true,\n\t messages: {\n\t \"noData\": \"No data found.\",\n\t \"clear\": \"clear\"\n\t }\n\t },\n\n\t setOptions: function(options) {\n\t Widget.fn.setOptions.call(this, options);\n\n\t if (options && options.enable !== undefined) {\n\t options.enabled = options.enable;\n\t }\n\n\t if (options.columns && options.columns.length) {\n\t this._columnsHeader();\n\t }\n\n\t this._header();\n\t this._noData();\n\t this._footer();\n\n\t this._renderFooter();\n\t this._renderNoData();\n\t },\n\n\t focus: function() {\n\t this._focused.focus();\n\t },\n\n\t readonly: function(readonly) {\n\t this._editable({\n\t readonly: readonly === undefined ? true : readonly,\n\t disable: false\n\t });\n\t },\n\n\t enable: function(enable) {\n\t this._editable({\n\t readonly: false,\n\t disable: !(enable = enable === undefined ? true : enable)\n\t });\n\t },\n\n\t _header: function() {\n\t var list = this;\n\t var header = $(list.header);\n\t var template = list.options.headerTemplate;\n\n\t this._angularElement(header, \"cleanup\");\n\t kendo.destroy(header);\n\t header.remove();\n\n\t if (!template) {\n\t list.header = null;\n\t return;\n\t }\n\n\t var headerTemplate = typeof template !== \"function\" ? kendo.template(template) : template;\n\t header = $(headerTemplate({}));\n\n\t list.header = header[0] ? header : null;\n\t list.list.prepend(header);\n\n\t this._angularElement(list.header, \"compile\");\n\t },\n\n\t _columnsHeader: function() {\n\t var list = this;\n\t var columnsHeader = $(list.columnsHeader);\n\n\t this._angularElement(columnsHeader, \"cleanup\");\n\t kendo.destroy(columnsHeader);\n\t columnsHeader.remove();\n\n\t var header = \"\";\n\n\t list.columnsHeader = columnsHeader = $(header);\n\t list.list.prepend(columnsHeader);\n\n\t this._angularElement(list.columnsHeader, \"compile\");\n\t },\n\n\t _noData: function() {\n\t var list = this;\n\t var noData = $(list.noData);\n\t var template = list.options.noDataTemplate === true ? list.options.messages.noData : list.options.noDataTemplate;\n\n\t list.angular(\"cleanup\", function() { return { elements: noData }; });\n\t kendo.destroy(noData);\n\t noData.remove();\n\n\t if (!template) {\n\t list.noData = null;\n\t return;\n\t }\n\n\t list.noData = $('
').appendTo(list.list);\n\t list.noDataTemplate = typeof template !== \"function\" ? kendo.template(template) : template;\n\t },\n\n\t _footer: function() {\n\t var list = this;\n\t var footer = $(list.footer);\n\t var template = list.options.footerTemplate;\n\n\t this._angularElement(footer, \"cleanup\");\n\t kendo.destroy(footer);\n\t footer.remove();\n\n\t if (!template) {\n\t list.footer = null;\n\t return;\n\t }\n\n\t list.footer = $('').appendTo(list.list);\n\t list.footerTemplate = typeof template !== \"function\" ? kendo.template(template) : template;\n\t },\n\n\t _listOptions: function(options) {\n\t var that = this;\n\t var currentOptions = that.options;\n\t var virtual = currentOptions.virtual;\n\t var changeEventOption = {change: proxy(that._listChange, that)};\n\t var listBoundHandler = proxy(that._listBound, that);\n\n\t virtual = typeof virtual === \"object\" ? virtual : {};\n\n\t options = $.extend({\n\t autoBind: false,\n\t selectable: true,\n\t dataSource: that.dataSource,\n\t click: proxy(that._click, that),\n\t activate: proxy(that._activateItem, that),\n\t columns: currentOptions.columns,\n\t deactivate: proxy(that._deactivateItem, that),\n\t dataBinding: function() {\n\t that.trigger(\"dataBinding\");\n\t },\n\t dataBound: listBoundHandler,\n\t height: currentOptions.height,\n\t dataValueField: currentOptions.dataValueField,\n\t dataTextField: currentOptions.dataTextField,\n\t groupTemplate: currentOptions.groupTemplate,\n\t fixedGroupTemplate: currentOptions.fixedGroupTemplate,\n\t template: currentOptions.template\n\t }, options, virtual, changeEventOption);\n\n\t if (!options.template) {\n\t options.template = \"#:\" + kendo.expr(options.dataTextField, \"data\") + \"#\";\n\t }\n\n\t if (currentOptions.$angular) {\n\t options.$angular = currentOptions.$angular;\n\t }\n\n\t return options;\n\t },\n\n\t _initList: function() {\n\t var that = this;\n\t var listOptions = that._listOptions({\n\t selectedItemChange: proxy(that._listChange, that)\n\t });\n\n\t if (!that.options.virtual) {\n\t that.listView = new kendo.ui.StaticList(that.ul, listOptions);\n\t } else {\n\t that.listView = new kendo.ui.VirtualList(that.ul, listOptions);\n\t }\n\n\t that.listView.bind(\"listBound\", proxy(that._listBound, that));\n\t that._setListValue();\n\t },\n\n\t _setListValue: function(value) {\n\t value = value || this.options.value;\n\n\t if (value !== undefined) {\n\t this.listView.value(value)\n\t .done(proxy(this._updateSelectionState, this));\n\t }\n\t },\n\n\t _updateSelectionState: $.noop,\n\n\t _listMousedown: function(e) {\n\t if (!this.filterInput || this.filterInput[0] !== e.target) {\n\t e.preventDefault();\n\t }\n\t },\n\n\t _isFilterEnabled: function() {\n\t var filter = this.options.filter;\n\t return filter && filter !== \"none\";\n\t },\n\n\t _hideClear: function() {\n\t var list = this;\n\n\t if (list._clear) {\n\t list._clear.addClass(HIDDENCLASS);\n\t }\n\t },\n\n\t _showClear: function() {\n\t if (this._clear) {\n\t this._clear.removeClass(HIDDENCLASS);\n\t }\n\t },\n\n\t _clearValue: function() {\n\t this._clearText();\n\t this._accessor(\"\");\n\t this.listView.value([]);\n\n\t if (this._isSelect) {\n\t this._customOption = undefined;\n\t }\n\n\t if (this._isFilterEnabled() && !this.options.enforceMinLength) {\n\t this._filter({word: \"\", open: false});\n\n\t if (this.options.highlightFirst) {\n\t this.listView.focus(0);\n\t }\n\t }\n\t this._change();\n\t },\n\n\t _clearText: function() {\n\t this.text(\"\");\n\t },\n\n\t _clearFilter: function() {\n\t if (!this.options.virtual) {\n\t this.listView.bound(false);\n\t }\n\n\t this._filterSource();\n\t },\n\n\t _filterSource: function(filter, force) {\n\t var that = this;\n\t var options = that.options;\n\t var isMultiColumnFiltering = options.filterFields && filter && filter.logic && filter.filters && filter.filters.length;\n\t var dataSource = that.dataSource;\n\t var expression = extend({}, dataSource.filter() || {});\n\t var resetPageSettings = filter || (expression.filters && expression.filters.length && !filter);\n\n\t var removed = removeFiltersForField(expression, options.dataTextField);\n\n\t this._clearFilterExpressions(expression);\n\n\t if ((filter || removed) && that.trigger(\"filtering\", { filter: filter })) {\n\t return $.Deferred().reject().promise();\n\t }\n\n\t var newExpression = {\n\t filters: [],\n\t logic: \"and\"\n\t };\n\n\t if (isMultiColumnFiltering) {\n\t newExpression.filters.push(filter);\n\t } else {\n\t this._pushFilterExpression(newExpression, filter);\n\t }\n\n\t if (isValidFilterExpr(expression)) {\n\t if (newExpression.logic === expression.logic) {\n\t newExpression.filters = newExpression.filters.concat(expression.filters);\n\t } else {\n\t newExpression.filters.push(expression);\n\t }\n\t }\n\n\t if (that._cascading) {\n\t this.listView.setDSFilter(newExpression);\n\t }\n\n\t var dataSourceState = extend({}, {\n\t page: resetPageSettings ? 1 : dataSource.page(),\n\t pageSize: resetPageSettings ? dataSource.options.pageSize : dataSource.pageSize(),\n\t sort: dataSource.sort(),\n\t filter: dataSource.filter(),\n\t group: dataSource.group(),\n\t aggregate: dataSource.aggregate()\n\t }, { filter: newExpression });\n\n\t return dataSource[force ? \"read\" : \"query\"](dataSource._mergeState(dataSourceState));\n\t },\n\n\t _pushFilterExpression: function (newExpression, filter) {\n\t if (isValidFilterExpr(filter) && filter.value !== \"\") {\n\t newExpression.filters.push(filter);\n\t }\n\t },\n\n\t _clearFilterExpressions: function (expression) {\n\t if (!expression.filters) {\n\t return;\n\t }\n\n\t var filtersToRemove;\n\n\t for(var i = 0; i < expression.filters.length; i++) {\n\t if (\"fromFilter\" in expression.filters[i]) {\n\t filtersToRemove = i;\n\t }\n\t }\n\n\t if (!isNaN(filtersToRemove)){\n\t expression.filters.splice(filtersToRemove, 1);\n\t }\n\t },\n\n\t _angularElement: function(element, action) {\n\t if (!element) {\n\t return;\n\t }\n\n\t this.angular(action, function() {\n\t return { elements: element };\n\t });\n\t },\n\n\t _renderNoData: function() {\n\t var list = this;\n\t var noData = list.noData;\n\n\t if (!noData) {\n\t return;\n\t }\n\n\t this._angularElement(noData, \"cleanup\");\n\t noData.children(\":first\").html(list.noDataTemplate({ instance: list }));\n\t this._angularElement(noData, \"compile\");\n\t },\n\n\t _toggleNoData: function(show) {\n\t $(this.noData).toggle(show);\n\t },\n\n\t _toggleHeader: function(show) {\n\t var groupHeader = this.listView.content.prev(GROUPHEADER);\n\t groupHeader.toggle(show);\n\t },\n\n\t _renderFooter: function() {\n\t var list = this;\n\t var footer = list.footer;\n\n\t if (!footer) {\n\t return;\n\t }\n\n\t this._angularElement(footer, \"cleanup\");\n\t footer.html(list.footerTemplate({ instance: list }));\n\t this._angularElement(footer, \"compile\");\n\t },\n\n\t _allowOpening: function() {\n\t return this.options.noDataTemplate || this.dataSource.flatView().length;\n\t },\n\n\t _initValue: function() {\n\t var that = this,\n\t value = that.options.value;\n\n\t if (value !== null) {\n\t that.element.val(value);\n\t } else {\n\t value = that._accessor();\n\t that.options.value = value;\n\t }\n\n\t that._old = value;\n\t },\n\n\t _ignoreCase: function() {\n\t var that = this,\n\t model = that.dataSource.reader.model,\n\t field;\n\n\t if (model && model.fields) {\n\t field = model.fields[that.options.dataTextField];\n\n\t if (field && field.type && field.type !== \"string\") {\n\t that.options.ignoreCase = false;\n\t }\n\t }\n\t },\n\n\t _focus: function(candidate) {\n\t return this.listView.focus(candidate);\n\t },\n\n\t _filter: function(options) {\n\t var that = this;\n\t var widgetOptions = that.options;\n\t var word = options.word;\n\t var filterFields = widgetOptions.filterFields;\n\t var field = widgetOptions.dataTextField;\n\t var expression;\n\n\t if (filterFields && filterFields.length) {\n\t expression = {\n\t logic: \"or\",\n\t filters: [],\n\t fromFilter: true\n\t };\n\t for(var i = 0; i < filterFields.length; i++) {\n\t this._pushFilterExpression(expression, that._buildExpression(word, filterFields[i]));\n\t }\n\t } else {\n\t expression = that._buildExpression(word, field);\n\t }\n\n\t that._open = options.open;\n\t that._filterSource(expression);\n\t },\n\n\t _buildExpression: function(value, field) {\n\t var that = this;\n\t var widgetOptions = that.options;\n\t var ignoreCase = widgetOptions.ignoreCase;\n\t var accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n\n\t return {\n\t value: ignoreCase ? (accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase()) : value,\n\t field: field,\n\t operator: widgetOptions.filter,\n\t ignoreCase: ignoreCase\n\t };\n\t },\n\n\t _clearButton: function() {\n\t var list = this;\n\t var clearTitle = list.options.messages.clear;\n\n\t if (!list._clear){\n\t list._clear = $('
').attr({\n\t \"role\": \"button\",\n\t \"tabIndex\": -1\n\t });\n\t }\n\n\t if (!list.options.clearButton) {\n\t list._clear.remove();\n\t }\n\t this._hideClear();\n\t },\n\n\t search: function(word) {\n\t var options = this.options;\n\n\t word = typeof word === \"string\" ? word : this._inputValue();\n\n\t clearTimeout(this._typingTimeout);\n\n\t if ((!options.enforceMinLength && !word.length) || word.length >= options.minLength) {\n\t this._state = \"filter\";\n\t if (this.listView){\n\t this.listView._emptySearch = !kendo.trim(word).length;\n\t }\n\n\t if (!this._isFilterEnabled()) {\n\t this._searchByWord(word);\n\t } else {\n\t this._filter({word: word, open: true});\n\t }\n\t }\n\t },\n\n\t current: function(candidate) {\n\t return this._focus(candidate);\n\t },\n\n\t items: function() {\n\t return this.ul[0].children;\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\t var ns = that.ns;\n\n\t Widget.fn.destroy.call(that);\n\n\t that._unbindDataSource();\n\n\t that.listView.destroy();\n\t that.list.off(ns);\n\n\t that.popup.destroy();\n\n\t if (that._form) {\n\t that._form.off(\"reset\", that._resetHandler);\n\t }\n\t },\n\n\t dataItem: function(index) {\n\t var that = this;\n\n\t if (index === undefined) {\n\t return that.listView.selectedDataItems()[0];\n\t }\n\n\t if (typeof index !== \"number\") {\n\t if (that.options.virtual) {\n\t return that.dataSource.getByUid($(index).data(\"uid\"));\n\t }\n\n\t index = $(that.items()).index(index);\n\t }\n\n\t return that.dataSource.flatView()[index];\n\t },\n\n\t _activateItem: function() {\n\t var current = this.listView.focus();\n\t if (current) {\n\t this._focused.add(this.filterInput).attr(\"aria-activedescendant\", current.attr(\"id\"));\n\t }\n\t },\n\n\t _deactivateItem: function() {\n\t this._focused.add(this.filterInput).removeAttr(\"aria-activedescendant\");\n\t },\n\n\t _accessors: function() {\n\t var that = this;\n\t var element = that.element;\n\t var options = that.options;\n\t var getter = kendo.getter;\n\t var textField = element.attr(kendo.attr(\"text-field\"));\n\t var valueField = element.attr(kendo.attr(\"value-field\"));\n\n\t if (!options.dataTextField && textField) {\n\t options.dataTextField = textField;\n\t }\n\n\t if (!options.dataValueField && valueField) {\n\t options.dataValueField = valueField;\n\t }\n\n\t that._text = getter(options.dataTextField);\n\t that._value = getter(options.dataValueField);\n\t },\n\n\t _aria: function(id) {\n\t var that = this,\n\t options = that.options,\n\t element = that._focused.add(that.filterInput);\n\n\t if (options.suggest !== undefined) {\n\t element.attr(\"aria-autocomplete\", options.suggest ? \"both\" : \"list\");\n\t }\n\n\t id = id ? id + \" \" + that.ul[0].id : that.ul[0].id;\n\n\t element.attr(\"aria-owns\", id);\n\n\t that.ul.attr(\"aria-live\", !that._isFilterEnabled() ? \"off\" : \"polite\");\n\n\t that._ariaLabel();\n\t },\n\n\t _ariaLabel: function(){\n\t var that = this;\n\t var focusedElm = that._focused;\n\t var inputElm = that.element;\n\t var inputId = inputElm.attr(\"id\");\n\t var labelElm = $(\"label[for=\\\"\" + inputId + \"\\\"]\");\n\t var ariaLabel = inputElm.attr(\"aria-label\");\n\t var ariaLabelledBy = inputElm.attr(\"aria-labelledby\");\n\n\t if (focusedElm === inputElm) {\n\t return;\n\t }\n\n\t if (ariaLabel) {\n\t focusedElm.attr(\"aria-label\", ariaLabel);\n\t } else if (ariaLabelledBy){\n\t focusedElm.attr(\"aria-labelledby\", ariaLabelledBy);\n\t } else if (labelElm.length){\n\t var labelId = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\n\t focusedElm.attr(\"aria-labelledby\", labelId);\n\t }\n\t },\n\n\t _generateLabelId: function(label, inputId){\n\t var labelId = inputId + LABELIDPART;\n\t label.attr(\"id\", labelId);\n\n\t return labelId;\n\t },\n\n\t _blur: function() {\n\t var that = this;\n\n\t that._change();\n\t that.close();\n\t that._userTriggered = false;\n\t },\n\n\t _isValueChanged: function(value) {\n\t return value !== unifyType(this._old, typeof value);\n\t },\n\n\t _change: function() {\n\t var that = this;\n\t var index = that.selectedIndex;\n\t var optionValue = that.options.value;\n\t var value = that.value();\n\t var trigger;\n\n\t if (that._isSelect && !that.listView.bound() && optionValue) {\n\t value = optionValue;\n\t }\n\n\t if (that._isValueChanged(value)) {\n\t trigger = true;\n\t } else if (that._valueBeforeCascade !== undefined && that._valueBeforeCascade !== unifyType(that._old, typeof that._valueBeforeCascade) && that._userTriggered) {\n\t trigger = true;\n\t } else if (index !== undefined && index !== that._oldIndex && !that.listView.isFiltered()) {\n\t trigger = true;\n\t }\n\n\t if (trigger) {\n\n\t if (that._old === null || that._old === \"\" || value === \"\") {\n\t that._valueBeforeCascade = that._old = value;\n\t } else {\n\t if (that.dataItem()) {\n\t that._valueBeforeCascade = that._old = that.options.dataValueField ? that.dataItem()[that.options.dataValueField] : that.dataItem();\n\t } else {\n\t that._valueBeforeCascade = that._old = null;\n\t }\n\t }\n\t that._oldIndex = index;\n\n\t if (!that._typing) {\n\t // trigger the DOM change event so any subscriber gets notified\n\t that.element.trigger(CHANGE);\n\t }\n\n\t that.trigger(CHANGE);\n\t }\n\n\t that.typing = false;\n\t },\n\n\t _data: function() {\n\t return this.dataSource.view();\n\t },\n\n\t _enable: function() {\n\t var that = this,\n\t options = that.options,\n\t disabled = that.element.is(\"[disabled]\");\n\n\t if (options.enable !== undefined) {\n\t options.enabled = options.enable;\n\t }\n\n\t if (!options.enabled || disabled) {\n\t that.enable(false);\n\t } else {\n\t that.readonly(that.element.is(\"[readonly]\"));\n\t }\n\t },\n\n\t _dataValue: function(dataItem) {\n\t var value = this._value(dataItem);\n\n\t if (value === undefined) {\n\t value = this._text(dataItem);\n\t }\n\n\t return value;\n\t },\n\n\t _offsetHeight: function() {\n\t var offsetHeight = 0;\n\t var siblings = this.listView.content.prevAll(\":visible\");\n\n\t siblings.each(function() {\n\t var element = $(this);\n\n\t offsetHeight += outerHeight(element, true);\n\t });\n\n\t return offsetHeight;\n\t },\n\n\t _height: function(length) {\n\t var that = this;\n\t var list = that.list;\n\t var height = that.options.height;\n\t var visible = that.popup.visible();\n\t var offsetTop;\n\t var popups;\n\t var footerHeight;\n\n\t if (length || that.options.noDataTemplate) {\n\t popups = list.add(list.parent(\".k-animation-container\")).show();\n\n\t if (!list.is(\":visible\")) {\n\t popups.hide();\n\t return;\n\t }\n\n\t height = that.listView.content[0].scrollHeight > height ? height : \"auto\";\n\n\t popups.height(height);\n\n\t if (height !== \"auto\") {\n\t offsetTop = that._offsetHeight();\n\t footerHeight = outerHeight($(that.footer)) || 0;\n\t height = height - offsetTop - footerHeight;\n\t }\n\n\t that.listView.content.height(height);\n\n\t if (!visible) {\n\t popups.hide();\n\t }\n\t }\n\n\t return height;\n\t },\n\n\t _openHandler: function(e) {\n\t this._adjustListWidth();\n\n\t if (this.trigger(OPEN)) {\n\t e.preventDefault();\n\t } else {\n\t this._focused.attr(\"aria-expanded\", true);\n\t this.ul.attr(\"aria-hidden\", false);\n\t }\n\t },\n\n\t _adjustListWidth: function() {\n\t var that = this,\n\t list = that.list,\n\t width = list[0].style.width,\n\t wrapper = that.wrapper,\n\t computedStyle, computedWidth;\n\n\t if (!list.data(WIDTH) && width) {\n\t return;\n\t }\n\n\t computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n\t computedWidth = parseFloat(computedStyle && computedStyle.width) || outerWidth(wrapper);\n\n\t if (computedStyle && browser.msie) { // getComputedStyle returns different box in IE.\n\t computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n\t }\n\n\t if (list.css(\"box-sizing\") !== \"border-box\") {\n\t width = computedWidth - (outerWidth(list) - list.width());\n\t } else {\n\t width = computedWidth;\n\t }\n\n\t list.css({\n\t fontFamily: wrapper.css(\"font-family\"),\n\t width: that.options.autoWidth ? \"auto\" : width,\n\t minWidth: width,\n\t whiteSpace: that.options.autoWidth ? \"nowrap\" : \"normal\"\n\t })\n\t .data(WIDTH, width);\n\n\t return true;\n\t },\n\n\t _closeHandler: function(e) {\n\t if (this.trigger(CLOSE)) {\n\t e.preventDefault();\n\t } else {\n\t this._focused.attr(\"aria-expanded\", false);\n\t this.ul.attr(\"aria-hidden\", true);\n\t }\n\t },\n\n\t _focusItem: function() {\n\t var listView = this.listView;\n\t var noFocusedItem = !listView.focus();\n\t var index = last(listView.select());\n\n\t if (index === undefined && this.options.highlightFirst && noFocusedItem) {\n\t index = 0;\n\t }\n\n\t if (index !== undefined) {\n\t listView.focus(index);\n\t } else if (noFocusedItem) {\n\t listView.scrollToIndex(0);\n\t }\n\t },\n\n\t _calculateGroupPadding: function(height) {\n\t var li = this.ul.children(\".k-first:first\");\n\t var groupHeader = this.listView.content.prev(GROUPHEADER);\n\t var padding = 0;\n\t var direction = 'right';\n\n\t if (groupHeader[0] && groupHeader[0].style.display !== \"none\") {\n\t if (height !== \"auto\") {\n\t padding = kendo.support.scrollbar();\n\t }\n\n\t if(this.element.parents('.k-rtl').length) {\n\t direction = 'left';\n\t }\n\n\t padding += parseFloat(li.css(\"border-\" + direction + \"-width\"), 10) + parseFloat(li.children(\".k-group\").css(\"padding-\" + direction), 10);\n\t groupHeader.css(\"padding-\" + direction, padding);\n\t }\n\t },\n\n\t _calculatePopupHeight: function(force) {\n\t var height = this._height(this.dataSource.flatView().length || force);\n\t this._calculateGroupPadding(height);\n\t this._calculateColumnsHeaderPadding(height);\n\t },\n\n\t _calculateColumnsHeaderPadding: function(height){\n\t if (this.options.columns && this.options.columns.length) {\n\t var list = this;\n\t var isRtl = support.isRtl(list.wrapper);\n\t var scrollbar = kendo.support.scrollbar();\n\n\t list.columnsHeader.css((isRtl ? \"padding-left\" : \"padding-right\"), height !== \"auto\" ? scrollbar : 0);\n\t }\n\t },\n\n\t _refreshScroll: function () {\n\t var listView = this.listView;\n\t var enableYScroll = listView.element.height() > listView.content.height();\n\n\t if (this.options.autoWidth) {\n\t listView.content.css({\n\t overflowX: \"hidden\",\n\t overflowY: enableYScroll ? \"scroll\" : \"auto\"\n\t });\n\t }\n\t },\n\n\t _resizePopup: function(force) {\n\t if (this.options.virtual) {\n\t return;\n\t }\n\n\t if (!this.popup.element.is(\":visible\")) {\n\t this.popup.one(\"open\", (function(force) {\n\t return proxy(function() {\n\t this._calculatePopupHeight(force);\n\t }, this);\n\t }).call(this, force));\n\n\t this.popup.one(\"activate\", proxy(this._refreshScroll, this));\n\t } else {\n\t this._calculatePopupHeight(force);\n\t }\n\t },\n\n\t _popup: function() {\n\t var list = this;\n\n\t list.popup = new ui.Popup(list.list, extend({}, list.options.popup, {\n\t anchor: list.wrapper,\n\t open: proxy(list._openHandler, list),\n\t close: proxy(list._closeHandler, list),\n\t animation: list.options.animation,\n\t isRtl: support.isRtl(list.wrapper),\n\t autosize :list.options.autoWidth\n\t }));\n\t },\n\n\t _toggleHover: function(e) {\n\t $(e.currentTarget).toggleClass(HOVER, e.type === \"mouseenter\");\n\t },\n\n\t _toggle: function(open, preventFocus) {\n\t var that = this;\n\t var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n\n\t open = open !== undefined? open : !that.popup.visible();\n\n\t if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) {\n\t that._prevent = true;\n\t that._focused.focus();\n\t that._prevent = false;\n\t }\n\n\t that[open ? OPEN : CLOSE]();\n\t },\n\n\t _triggerCascade: function() {\n\t var that = this;\n\n\t if (!that._cascadeTriggered || that.value() !== unifyType(that._cascadedValue, typeof that.value())) {\n\t that._cascadedValue = that.value();\n\t that._cascadeTriggered = true;\n\t that.trigger(CASCADE, { userTriggered: that._userTriggered });\n\t }\n\t },\n\n\t _triggerChange: function() {\n\t if (this._valueBeforeCascade !== this.value()) {\n\t this.trigger(CHANGE);\n\t }\n\t },\n\n\t _unbindDataSource: function() {\n\t var that = this;\n\n\t that.dataSource.unbind(REQUESTSTART, that._requestStartHandler)\n\t .unbind(REQUESTEND, that._requestEndHandler)\n\t .unbind(\"error\", that._errorHandler);\n\t },\n\n\t requireValueMapper: function(options, value) {\n\t var hasValue = (options.value instanceof Array ? options.value.length : options.value) || (value instanceof Array ? value.length : value);\n\t if (hasValue && options.virtual && typeof options.virtual.valueMapper !== \"function\") {\n\t throw new Error(\"ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function\");\n\t }\n\t }\n\t });\n\n\t function unifyType(value, type) {\n\t if (value !== undefined && value !== \"\" && value !== null) {\n\t if (type === \"boolean\") {\n\t if (typeof value !== \"boolean\") {\n\t value = value.toString().toLowerCase() === \"true\";\n\t }\n\t value = Boolean(value);\n\t } else if (type === \"number\") {\n\t value = Number(value);\n\t } else if (type === \"string\") {\n\t value = value.toString();\n\t }\n\t }\n\n\t return value;\n\t }\n\n\t extend(List, {\n\t inArray: function(node, parentNode) {\n\t var idx, length, siblings = parentNode.children;\n\n\t if (!node || node.parentNode !== parentNode) {\n\t return -1;\n\t }\n\n\t for (idx = 0, length = siblings.length; idx < length; idx++) {\n\t if (node === siblings[idx]) {\n\t return idx;\n\t }\n\t }\n\n\t return -1;\n\t },\n\t unifyType: unifyType\n\t });\n\n\t kendo.ui.List = List;\n\n\t ui.Select = List.extend({\n\t init: function(element, options) {\n\t List.fn.init.call(this, element, options);\n\t this._initial = this.element.val();\n\t },\n\n\t setDataSource: function(dataSource) {\n\t var that = this;\n\t var parent;\n\n\t that.options.dataSource = dataSource;\n\n\t that._dataSource();\n\n\t if (that.listView.bound()) {\n\t that._initialIndex = null;\n\t that.listView._current = null;\n\t }\n\n\t that.listView.setDataSource(that.dataSource);\n\n\t if (that.options.autoBind) {\n\t that.dataSource.fetch();\n\t }\n\n\t parent = that._parentWidget();\n\n\t if (parent) {\n\t that._cascadeSelect(parent);\n\t }\n\t },\n\n\t close: function() {\n\t this.popup.close();\n\t },\n\n\t select: function(candidate) {\n\t var that = this;\n\n\t if (candidate === undefined) {\n\t return that.selectedIndex;\n\t } else {\n\t return that._select(candidate).done(function() {\n\t that._cascadeValue = that._old = that._accessor();\n\t that._oldIndex = that.selectedIndex;\n\t });\n\t }\n\t },\n\n\t _accessor: function(value, idx) {\n\t return this[this._isSelect ? \"_accessorSelect\" : \"_accessorInput\"](value, idx);\n\t },\n\n\t _accessorInput: function(value) {\n\t var element = this.element[0];\n\n\t if (value === undefined) {\n\t return element.value;\n\t } else {\n\t if (value === null) {\n\t value = \"\";\n\t }\n\t element.value = value;\n\t }\n\t },\n\n\t _accessorSelect: function(value, idx) {\n\t var element = this.element[0];\n\t var hasValue;\n\n\t if (value === undefined) {\n\t return getSelectedOption(element).value || \"\";\n\t }\n\n\t getSelectedOption(element).selected = false;\n\n\t if (idx === undefined) {\n\t idx = -1;\n\t }\n\n\t hasValue = (value !== null && value !== \"\");\n\n\t if (hasValue && idx == -1) {\n\t this._custom(value);\n\t } else {\n\t if (value) {\n\t element.value = value;\n\t } else {\n\t element.selectedIndex = idx;\n\t }\n\t }\n\t },\n\n\t _syncValueAndText: function () {\n\t return true;\n\t },\n\n\t _custom: function(value) {\n\t var that = this;\n\t var element = that.element;\n\t var custom = that._customOption;\n\n\t if (!custom) {\n\t custom = $(\"
\");\n\t that._customOption = custom;\n\n\t element.append(custom);\n\t }\n\n\t custom.text(value);\n\t custom[0].selected = true;\n\t },\n\n\t _hideBusy: function () {\n\t var that = this;\n\t clearTimeout(that._busy);\n\t that._arrowIcon.removeClass(LOADING);\n\t that._focused.attr(\"aria-busy\", false);\n\t that._busy = null;\n\t that._showClear();\n\t },\n\n\t _showBusy: function (e) {\n\t var that = this;\n\n\t if (e.isDefaultPrevented()) {\n\t return;\n\t }\n\n\t that._request = true;\n\n\t if (that._busy) {\n\t return;\n\t }\n\n\t that._busy = setTimeout(function () {\n\t if (that._arrowIcon) { //destroyed after request start\n\t that._focused.attr(\"aria-busy\", true);\n\t that._arrowIcon.addClass(LOADING);\n\t that._hideClear();\n\t }\n\t }, 100);\n\t },\n\n\t _requestEnd: function() {\n\t this._request = false;\n\t this._hideBusy();\n\t },\n\n\t _dataSource: function() {\n\t var that = this,\n\t element = that.element,\n\t options = that.options,\n\t dataSource = options.dataSource || {},\n\t idx;\n\n\t dataSource = $.isArray(dataSource) ? {data: dataSource} : dataSource;\n\n\t if (that._isSelect) {\n\t idx = element[0].selectedIndex;\n\t if (idx > -1) {\n\t options.index = idx;\n\t }\n\n\t dataSource.select = element;\n\t dataSource.fields = [{ field: options.dataTextField },\n\t { field: options.dataValueField }];\n\t }\n\n\t if (that.dataSource) {\n\t that._unbindDataSource();\n\t } else {\n\t that._requestStartHandler = proxy(that._showBusy, that);\n\t that._requestEndHandler = proxy(that._requestEnd, that);\n\t that._errorHandler = proxy(that._hideBusy, that);\n\t }\n\n\t that.dataSource = kendo.data.DataSource.create(dataSource)\n\t .bind(REQUESTSTART, that._requestStartHandler)\n\t .bind(REQUESTEND, that._requestEndHandler)\n\t .bind(\"error\", that._errorHandler);\n\t },\n\n\t _firstItem: function() {\n\t this.listView.focusFirst();\n\t },\n\n\t _lastItem: function() {\n\t this.listView.focusLast();\n\t },\n\n\t _nextItem: function() {\n\t return this.listView.focusNext();\n\t },\n\n\t _prevItem: function() {\n\t return this.listView.focusPrev();\n\t },\n\n\t _getNormalizedDataItem: function(candidate) {\n\t var that = this,\n\t listView = that.listView,\n\t isIndex = typeof candidate === \"number\",\n\t hasOptionLabel = that.optionLabel && that.optionLabel.length,\n\t index;\n\n\t if (isIndex) {\n\t index = hasOptionLabel ? --candidate : candidate;\n\t } else {\n\t index = listView.getElementIndex(candidate);\n\t }\n\n\t return listView.dataItemByIndex(index);\n\t },\n\n\t _getNormalizedSelectCandidate: function(candidate) {\n\t var that = this,\n\t hasOptionLabel = that.optionLabel && that.optionLabel.length,\n\t isIndex = typeof candidate === \"number\",\n\t normalizedCandidate = candidate;\n\n\t if (hasOptionLabel && isIndex) {\n\t normalizedCandidate++;\n\t }\n\n\t return normalizedCandidate;\n\t },\n\n\t _move: function(e) {\n\t var that = this;\n\t var listView = that.listView;\n\t var key = e.keyCode;\n\t var down = key === keys.DOWN;\n\t var isVirtual = that.options.virtual;\n\t var dataItem;\n\t var pressed;\n\t var current;\n\t var moveIndex;\n\t var selectCandidate;\n\n\t if (key === keys.UP || down) {\n\t if (e.altKey) {\n\t that.toggle(down);\n\t } else {\n\t if (!listView.bound() && !that.ul[0].firstChild) {\n\t if (!that._fetch) {\n\t that.dataSource.one(CHANGE, function() {\n\t that._fetch = false;\n\t that._move(e);\n\t });\n\n\t that._fetch = true;\n\t that._filterSource();\n\t }\n\n\t e.preventDefault();\n\n\t return true; //pressed\n\t }\n\n\t current = that._focus();\n\n\t if (!that._fetch && (!current || current.hasClass(\"k-state-selected\"))) {\n\t if (down) {\n\t moveIndex = that._nextItem();\n\n\t if ((isVirtual && moveIndex <= 0) || (!that._focus() && !moveIndex) ) {\n\t that._lastItem();\n\t }\n\t } else {\n\t moveIndex = that._prevItem();\n\n\t if ((isVirtual && moveIndex >= listView.dataSource.total() - 1) || (!that._focus() && !moveIndex)) {\n\t that._firstItem();\n\t }\n\t }\n\t }\n\n\t selectCandidate = that._getNormalizedSelectCandidate(that._get(that._focus()) || moveIndex || 0);\n\n\t that._select(selectCandidate, true).done(function() {\n\t var done = function() {\n\t if (!that.popup.visible()) {\n\t that._blur();\n\t }\n\n\t if (that._cascadedValue === null) {\n\t that._cascadedValue = that.value();\n\t } else {\n\t that._cascadedValue = that.dataItem() ? that.dataItem()[that.options.dataValueField] || that.dataItem() : null;\n\t }\n\t };\n\n\t if (that.trigger(SELECT, { dataItem: that._getNormalizedDataItem(selectCandidate), item: that._focus() })) {\n\t that._select(current).done(done);\n\t } else {\n\t done();\n\t }\n\t });\n\t }\n\n\t e.preventDefault();\n\t pressed = true;\n\t } else if (key === keys.ENTER || key === keys.TAB) {\n\t if (that.popup.visible()) {\n\t e.preventDefault();\n\t }\n\n\t current = that._focus();\n\t dataItem = that.dataItem();\n\n\t if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n\t current = null;\n\t }\n\n\t var activeFilter = that.filterInput && that.filterInput[0] === activeElement();\n\t var selection;\n\n\t if (current) {\n\t dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n\t var shouldTrigger = true;\n\n\t if (dataItem) {\n\t shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n\t }\n\n\t if (shouldTrigger && that.trigger(SELECT, { dataItem: dataItem, item: current })) {\n\t return;\n\t }\n\n\t selection = that._select(current);\n\t } else if (that.input) {\n\t if (that._syncValueAndText() || that._isSelect) {\n\t that._accessor(that.input.val());\n\t }\n\t that.listView.value(that.input.val());\n\t }\n\n\t if (that._focusElement) {\n\t that._focusElement(that.wrapper);\n\t }\n\n\t if (activeFilter && key === keys.TAB) {\n\t that.wrapper.focusout();\n\t } else {\n\t if (selection && typeof selection.done === \"function\") {\n\t selection.done(function () {\n\t that._blur();\n\t });\n\t } else {\n\t that._blur();\n\t }\n\t }\n\n\t that.close();\n\t pressed = true;\n\t } else if (key === keys.ESC) {\n\t if (that.popup.visible()) {\n\t e.preventDefault();\n\t }\n\t that.close();\n\t pressed = true;\n\t } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n\t e.preventDefault();\n\n\t var direction = key === keys.PAGEDOWN ? 1 : -1;\n\t listView.scrollWith(direction * listView.screenHeight());\n\n\t pressed = true;\n\t }\n\n\t return pressed;\n\t },\n\n\t _fetchData: function() {\n\t var that = this;\n\t var hasItems = !!that.dataSource.view().length;\n\n\t if (that._request || that.options.cascadeFrom) {\n\t return;\n\t }\n\n\t if (!that.listView.bound() && !that._fetch && !hasItems) {\n\t that._fetch = true;\n\t that.dataSource.fetch().done(function() {\n\t that._fetch = false;\n\t });\n\t }\n\t },\n\n\t _options: function(data, optionLabel, value) {\n\t var that = this,\n\t element = that.element,\n\t htmlElement = element[0],\n\t length = data.length,\n\t options = \"\",\n\t option,\n\t dataItem,\n\t dataText,\n\t dataValue,\n\t idx = 0;\n\n\t if (optionLabel) {\n\t options = optionLabel;\n\t }\n\n\t for (; idx < length; idx++) {\n\t option = \"
\";\n\t options += option;\n\t }\n\n\t element.html(options);\n\n\t if (value !== undefined) {\n\t htmlElement.value = value;\n\t if (htmlElement.value && !value) {\n\t htmlElement.selectedIndex = -1;\n\t }\n\t }\n\n\t if (htmlElement.selectedIndex !== -1) {\n\t option = getSelectedOption(htmlElement);\n\n\t if (option) {\n\t option.setAttribute(SELECTED, SELECTED);\n\t }\n\t }\n\t },\n\n\t _reset: function() {\n\t var that = this,\n\t element = that.element,\n\t formId = element.attr(\"form\"),\n\t form = formId ? $(\"#\" + formId) : element.closest(\"form\");\n\n\t if (form[0]) {\n\t that._resetHandler = function() {\n\t setTimeout(function() {\n\t that.value(that._initial);\n\t });\n\t };\n\n\t that._form = form.on(\"reset\", that._resetHandler);\n\t }\n\t },\n\n\t _parentWidget: function() {\n\t var name = this.options.name;\n\n\t if (!this.options.cascadeFrom) {\n\t return;\n\t }\n\n\t var parentElement = $(\"#\" + this.options.cascadeFrom);\n\t var parent = parentElement.data(\"kendo\" + name);\n\n\t if (!parent) {\n\t for(var i = 0; i < alternativeNames[name].length; i+=1) {\n\t parent = parentElement.data(\"kendo\" + alternativeNames[name][i]);\n\n\t if (!!parent) {\n\t break;\n\t }\n\t }\n\t }\n\n\t return parent;\n\t },\n\n\t _cascade: function() {\n\t var that = this;\n\t var options = that.options;\n\t var cascade = options.cascadeFrom;\n\t var parent;\n\n\t if (cascade) {\n\t parent = that._parentWidget();\n\n\t if (!parent) {\n\t return;\n\t }\n\n\t that._cascadeHandlerProxy = proxy(that._cascadeHandler, that);\n\t that._cascadeFilterRequests = [];\n\n\t options.autoBind = false;\n\n\t parent.bind(\"set\", function() { //will cascade\n\t that.one(\"set\", function(e) { //get your value\n\t that._selectedValue = e.value || that._accessor();\n\t });\n\t });\n\n\t parent.first(CASCADE, that._cascadeHandlerProxy);\n\n\t //refresh was called\n\t if (parent.listView.bound()) {\n\t that._toggleCascadeOnFocus();\n\t that._cascadeSelect(parent);\n\t } else {\n\t parent.one(\"dataBound\", function() {\n\t that._toggleCascadeOnFocus();\n\t if (parent.popup.visible()) {\n\t parent._focused.focus();\n\t }\n\t });\n\n\t if (!parent.value()) {\n\t that.enable(false);\n\t }\n\t }\n\t }\n\t },\n\n\t _toggleCascadeOnFocus: function() {\n\t var that = this;\n\t var parent = that._parentWidget();\n\t var focusout = isIE && parent instanceof ui.DropDownList ? BLUR : FOCUSOUT;\n\n\t parent._focused.add(parent.filterInput).bind(FOCUS, function() {\n\t parent.unbind(CASCADE, that._cascadeHandlerProxy);\n\t parent.first(CHANGE, that._cascadeHandlerProxy);\n\t });\n\n\t parent._focused.add(parent.filterInput).bind(focusout, function() {\n\t parent.unbind(CHANGE, that._cascadeHandlerProxy);\n\t parent.first(CASCADE, that._cascadeHandlerProxy);\n\t });\n\t },\n\n\t _cascadeHandler: function(e) {\n\t var parent = this._parentWidget();\n\t var valueBeforeCascade = this.value();\n\n\t this._userTriggered = e.userTriggered || parent._userTriggered;\n\n\t if (this.listView.bound()) {\n\t this._clearSelection(parent, true);\n\t }\n\n\t this._cascadeSelect(parent, valueBeforeCascade);\n\t },\n\n\t _cascadeChange: function(parent) {\n\t var that = this;\n\t var value = that._accessor() || that._selectedValue;\n\n\t if (!that._cascadeFilterRequests.length) {\n\t that._selectedValue = null;\n\t }\n\n\t if (that._userTriggered) {\n\t that._clearSelection(parent, true);\n\t } else if (value) {\n\t if (value !== unifyType(that.listView.value()[0], typeof value)) {\n\t that.value(value);\n\t }\n\n\t if (!that.dataSource.view()[0] || that.selectedIndex === -1) {\n\t that._clearSelection(parent, true);\n\t }\n\t } else if (that.dataSource.flatView().length) {\n\t that.select(that.options.index);\n\t }\n\n\t that.enable();\n\t that._triggerCascade();\n\t that._triggerChange();\n\t that._userTriggered = false;\n\t },\n\n\t _cascadeSelect: function(parent, valueBeforeCascade) {\n\t var that = this;\n\t var dataItem = parent.dataItem();\n\t var filterValue = dataItem ? dataItem[that.options.cascadeFromParentField] || parent._value(dataItem) : null;\n\t var valueField = that.options.cascadeFromField || parent.options.dataValueField;\n\t var expressions;\n\n\t that._valueBeforeCascade = valueBeforeCascade !== undefined ? valueBeforeCascade : that.value();\n\n\t if (filterValue || filterValue === 0) {\n\t expressions = that.dataSource.filter() || {};\n\t removeFiltersForField(expressions, valueField);\n\n\t var handler = function () {\n\t var currentHandler = that._cascadeFilterRequests.shift();\n\t if (currentHandler) {\n\t that.unbind('dataBound', currentHandler);\n\t }\n\n\t currentHandler = that._cascadeFilterRequests[0];\n\t if (currentHandler) {\n\t that.first('dataBound', currentHandler);\n\t }\n\n\t that._cascadeChange(parent);\n\t };\n\n\t that._cascadeFilterRequests.push(handler);\n\n\t if (that._cascadeFilterRequests.length === 1) {\n\t that.first('dataBound', handler);\n\t }\n\n\t that._cascading = true;\n\t that._filterSource({\n\t field: valueField,\n\t operator: \"eq\",\n\t value: filterValue\n\t });\n\t that._cascading = false;\n\t } else {\n\t that.enable(false);\n\t that._clearSelection(parent);\n\t that._triggerCascade();\n\t that._triggerChange();\n\t that._userTriggered = false;\n\t }\n\t }\n\t });\n\n\t var STATIC_LIST_NS = \".StaticList\";\n\n\t var StaticList = kendo.ui.DataBoundWidget.extend({\n\t init: function(element, options) {\n\t Widget.fn.init.call(this, element, options);\n\n\t this.element.attr(\"role\", \"listbox\")\n\t .on(\"click\" + STATIC_LIST_NS, \"li\", proxy(this._click, this))\n\t .on(\"mouseenter\" + STATIC_LIST_NS, \"li\", function() { $(this).addClass(HOVER); })\n\t .on(\"mouseleave\" + STATIC_LIST_NS, \"li\", function() { $(this).removeClass(HOVER); });\n\n\t if (support.touch) {\n\t this._touchHandlers();\n\t }\n\n\t if (this.options.selectable === \"multiple\") {\n\t this.element.attr(\"aria-multiselectable\", true);\n\t }\n\n\t this.content = this.element.wrap(\"
\").parent();\n\t this.header = this.content.before('').prev();\n\n\t this.bound(false);\n\n\t this._optionID = kendo.guid();\n\n\t this._selectedIndices = [];\n\n\t this._view = [];\n\t this._dataItems = [];\n\t this._values = [];\n\n\t var value = this.options.value;\n\n\t if (value) {\n\t this._values = $.isArray(value) ? value.slice(0) : [value];\n\t }\n\n\t this._getter();\n\t this._templates();\n\n\t this.setDataSource(this.options.dataSource);\n\n\t this._onScroll = proxy(function() {\n\t var that = this;\n\t clearTimeout(that._scrollId);\n\n\t that._scrollId = setTimeout(function() {\n\t that._renderHeader();\n\t }, 50);\n\t }, this);\n\t },\n\n\t options: {\n\t name: \"StaticList\",\n\t dataValueField: null,\n\t valuePrimitive: false,\n\t selectable: true,\n\t template: null,\n\t groupTemplate: null,\n\t fixedGroupTemplate: null\n\t },\n\n\t events: [\n\t \"click\",\n\t CHANGE,\n\t \"activate\",\n\t \"deactivate\",\n\t \"dataBinding\",\n\t \"dataBound\",\n\t \"selectedItemChange\"\n\t ],\n\n\t setDataSource: function(source) {\n\t var that = this;\n\t var dataSource = source || {};\n\t var value;\n\n\t dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n\t dataSource = kendo.data.DataSource.create(dataSource);\n\n\t if (that.dataSource) {\n\t that.dataSource.unbind(CHANGE, that._refreshHandler);\n\n\t value = that.value();\n\n\t that.value([]);\n\t that.bound(false);\n\n\t that.value(value);\n\t } else {\n\t that._refreshHandler = proxy(that.refresh, that);\n\t }\n\n\t that.setDSFilter(dataSource.filter());\n\n\t that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n\t that._fixedHeader();\n\t },\n\n\t _touchHandlers: function () {\n\t var that = this;\n\t var startY;\n\t var endY;\n\t var tapPosition = function (event) {\n\t return (event.originalEvent || event).changedTouches[0].pageY;\n\t };\n\n\t that.element.on(\"touchstart\" + STATIC_LIST_NS, function (e) {\n\t startY = tapPosition(e);\n\t });\n\n\t that.element.on(\"touchend\" + STATIC_LIST_NS, function (e) {\n\t if (e.isDefaultPrevented()) {\n\t return;\n\t }\n\n\t endY = tapPosition(e);\n\n\t if (Math.abs(endY - startY) < 10) {\n\t that._touchTriggered = true;\n\t that._triggerClick($(e.target).closest(ITEMSELECTOR).get(0));\n\t }\n\t });\n\t },\n\n\t skip: function() {\n\t return this.dataSource.skip();\n\t },\n\n\t setOptions: function(options) {\n\t Widget.fn.setOptions.call(this, options);\n\n\t this._getter();\n\t this._templates();\n\t this._render();\n\t },\n\n\t destroy: function() {\n\t this.element.off(STATIC_LIST_NS);\n\n\t if (this._refreshHandler) {\n\t this.dataSource.unbind(CHANGE, this._refreshHandler);\n\t }\n\n\t clearTimeout(this._scrollId);\n\n\t Widget.fn.destroy.call(this);\n\t },\n\n\t dataItemByIndex: function(index) {\n\t return this.dataSource.flatView()[index];\n\t },\n\n\t screenHeight: function() {\n\t return this.content[0].clientHeight;\n\t },\n\n\t scrollToIndex: function(index) {\n\t var item = this.element[0].children[index];\n\n\t if (item) {\n\t this.scroll(item);\n\t }\n\t },\n\n\t scrollWith: function(value) {\n\t this.content.scrollTop(this.content.scrollTop() + value);\n\t },\n\n\t scroll: function (item) {\n\t if (!item) {\n\t return;\n\t }\n\n\t if (item[0]) {\n\t item = item[0];\n\t }\n\n\t var content = this.content[0],\n\t itemOffsetTop = item.offsetTop,\n\t itemOffsetHeight = item.offsetHeight,\n\t contentScrollTop = content.scrollTop,\n\t contentOffsetHeight = content.clientHeight,\n\t bottomDistance = itemOffsetTop + itemOffsetHeight;\n\n\t if (contentScrollTop > itemOffsetTop) {\n\t contentScrollTop = itemOffsetTop;\n\t } else if (bottomDistance > (contentScrollTop + contentOffsetHeight)) {\n\t contentScrollTop = (bottomDistance - contentOffsetHeight);\n\t }\n\n\t content.scrollTop = contentScrollTop;\n\t },\n\n\t selectedDataItems: function(dataItems) {\n\t if (dataItems === undefined) {\n\t return this._dataItems.slice();\n\t }\n\n\t this._dataItems = dataItems;\n\t this._values = this._getValues(dataItems);\n\t },\n\n\t _getValues: function(dataItems) {\n\t var getter = this._valueGetter;\n\n\t return $.map(dataItems, function(dataItem) {\n\t return getter(dataItem);\n\t });\n\t },\n\n\t focusNext: function() {\n\t var current = this.focus();\n\n\t if (!current) {\n\t current = 0;\n\t } else {\n\t current = current.next();\n\t }\n\n\t this.focus(current);\n\t },\n\n\t focusPrev: function() {\n\t var current = this.focus();\n\n\t if (!current) {\n\t current = this.element[0].children.length - 1;\n\t } else {\n\t current = current.prev();\n\t }\n\n\t this.focus(current);\n\t },\n\n\t focusFirst: function() {\n\t this.focus(this.element[0].children[0]);\n\t },\n\n\t focusLast: function() {\n\t this.focus(last(this.element[0].children));\n\t },\n\n\t focus: function(candidate) {\n\t var that = this;\n\t var id = that._optionID;\n\t var hasCandidate;\n\n\t if (candidate === undefined) {\n\t return that._current;\n\t }\n\n\t candidate = last(that._get(candidate));\n\t candidate = $(this.element[0].children[candidate]);\n\n\t if (that._current) {\n\t that._current\n\t .removeClass(FOCUSED)\n\t .removeAttr(ID);\n\n\t that.trigger(\"deactivate\");\n\t }\n\n\t hasCandidate = !!candidate[0];\n\n\t if (hasCandidate) {\n\t candidate.addClass(FOCUSED);\n\t that.scroll(candidate);\n\n\t candidate.attr(\"id\", id);\n\t }\n\n\t that._current = hasCandidate ? candidate : null;\n\t that.trigger(\"activate\");\n\t },\n\n\t focusIndex: function() {\n\t return this.focus() ? this.focus().index() : undefined;\n\t },\n\n\t skipUpdate: function(skipUpdate) {\n\t this._skipUpdate = skipUpdate;\n\t },\n\n\t select: function(indices) {\n\t var that = this;\n\t var selectable = that.options.selectable;\n\t var singleSelection = selectable !== \"multiple\" && selectable !== false;\n\t var selectedIndices = that._selectedIndices;\n\t var uiSelectedIndices = [this.element.find(\".k-state-selected\").index()];\n\n\t var added = [];\n\t var removed = [];\n\t var result;\n\n\t if (indices === undefined) {\n\t return selectedIndices.slice();\n\t }\n\n\t indices = that._get(indices);\n\n\t if (indices.length === 1 && indices[0] === -1) {\n\t indices = [];\n\t }\n\n\t var deferred = $.Deferred().resolve();\n\t var filtered = that.isFiltered();\n\n\t if (filtered && !singleSelection && that._deselectFiltered(indices)) {\n\t return deferred;\n\t }\n\n\t if (singleSelection && !filtered &&\n\t $.inArray(last(indices), selectedIndices) !== -1 && $.inArray(last(indices), uiSelectedIndices) !== -1) {\n\n\t if (that._dataItems.length && that._view.length) {\n\t that._dataItems = [that._view[selectedIndices[0]].item];\n\t }\n\n\t return deferred;\n\t }\n\n\t result = that._deselect(indices);\n\n\t removed = result.removed;\n\t indices = result.indices;\n\n\t if (indices.length) {\n\t if (singleSelection) {\n\t indices = [last(indices)];\n\t }\n\n\t added = that._select(indices);\n\t }\n\n\t if (added.length || removed.length) {\n\t that._valueComparer = null;\n\t that.trigger(CHANGE, {\n\t added: added,\n\t removed: removed\n\t });\n\t }\n\n\t return deferred;\n\t },\n\n\t removeAt: function(position) {\n\t this._selectedIndices.splice(position, 1);\n\t this._values.splice(position, 1);\n\t this._valueComparer = null;\n\n\t return {\n\t position: position,\n\t dataItem: this._dataItems.splice(position, 1)[0]\n\t };\n\t },\n\n\t setValue: function(value) {\n\t value = $.isArray(value) || value instanceof ObservableArray ? value.slice(0) : [value];\n\n\t this._values = value;\n\n\t this._valueComparer = null;\n\t },\n\n\t value: function(value) {\n\t var that = this;\n\t var deferred = that._valueDeferred;\n\t var indices;\n\n\t if (value === undefined) {\n\t return that._values.slice();\n\t }\n\n\t that.setValue(value);\n\n\t if (!deferred || deferred.state() === \"resolved\") {\n\t that._valueDeferred = deferred = $.Deferred();\n\t }\n\n\t if (that.bound()) {\n\t indices = that._valueIndices(that._values);\n\n\t if (that.options.selectable === \"multiple\") {\n\t that.select(-1);\n\t }\n\n\t that.select(indices);\n\n\t deferred.resolve();\n\t }\n\n\t that._skipUpdate = false;\n\n\t return deferred;\n\t },\n\n\t items: function() {\n\t return this.element.children(ITEMSELECTOR);\n\t },\n\n\t _click: function(e) {\n\t if (this._touchTriggered)\n\t {\n\t this._touchTriggered = false;\n\t return;\n\t }\n\n\t if (!e.isDefaultPrevented()) {\n\t this._triggerClick(e.currentTarget);\n\t }\n\t },\n\n\t _triggerClick: function (item) {\n\t if (!this.trigger(\"click\", { item: $(item) })) {\n\t this.select(item);\n\t }\n\t },\n\n\t _valueExpr: function(type, values) {\n\t var that = this;\n\t var idx = 0;\n\n\t var body;\n\t var comparer;\n\t var normalized = [];\n\n\t if (!that._valueComparer || that._valueType !== type) {\n\t that._valueType = type;\n\n\t for (; idx < values.length; idx++) {\n\t normalized.push(unifyType(values[idx], type));\n\t }\n\n\t body = \"for (var idx = 0; idx < \" + normalized.length + \"; idx++) {\" +\n\t \" if (current === values[idx]) {\" +\n\t \" return idx;\" +\n\t \" }\" +\n\t \"} \" +\n\t \"return -1;\";\n\n\t comparer = new Function(\"current\", \"values\", body);\n\n\t that._valueComparer = function(current) {\n\t return comparer(current, normalized);\n\t };\n\t }\n\n\t return that._valueComparer;\n\t },\n\n\t _dataItemPosition: function(dataItem, values) {\n\t var value = this._valueGetter(dataItem);\n\n\t var valueExpr = this._valueExpr(typeof value, values);\n\n\t return valueExpr(value);\n\t },\n\n\t _getter: function() {\n\t this._valueGetter = kendo.getter(this.options.dataValueField);\n\t },\n\n\t _deselect: function(indices) {\n\t var that = this;\n\t var children = that.element[0].children;\n\t var selectable = that.options.selectable;\n\t var selectedIndices = that._selectedIndices;\n\t var dataItems = that._dataItems;\n\t var values = that._values;\n\t var removed = [];\n\t var i = 0;\n\t var j;\n\n\t var index, selectedIndex;\n\t var removedIndices = 0;\n\n\t indices = indices.slice();\n\n\t if (selectable === true || !indices.length) {\n\t for (; i < selectedIndices.length; i++) {\n\t $(children[selectedIndices[i]]).removeClass(\"k-state-selected\").attr(\"aria-selected\", false);\n\n\t removed.push({\n\t position: i,\n\t dataItem: dataItems[i]\n\t });\n\t }\n\n\t that._values = [];\n\t that._dataItems = [];\n\t that._selectedIndices = [];\n\t } else if (selectable === \"multiple\") {\n\t for (; i < indices.length; i++) {\n\t index = indices[i];\n\n\t if (!$(children[index]).hasClass(\"k-state-selected\")) {\n\t continue;\n\t }\n\n\t for (j = 0; j < selectedIndices.length; j++) {\n\t selectedIndex = selectedIndices[j];\n\n\t if (selectedIndex === index) {\n\t $(children[selectedIndex]).removeClass(\"k-state-selected\").attr(\"aria-selected\", false);\n\t var dataItem = this._view[index].item;\n\t var position = this._dataItemPosition(dataItem, this._values);\n\n\t removed.push({\n\t position: position,\n\t dataItem: dataItem\n\t });\n\n\t dataItems.splice(j, 1);\n\t selectedIndices.splice(j, 1);\n\t indices.splice(i, 1);\n\t values.splice(j, 1);\n\n\t removedIndices += 1;\n\t i -= 1;\n\t j -= 1;\n\t break;\n\t }\n\t }\n\t }\n\t }\n\n\t return {\n\t indices: indices,\n\t removed: removed\n\t };\n\t },\n\n\t _deselectFiltered: function(indices) {\n\t var children = this.element[0].children;\n\t var dataItem, index, position;\n\t var removed = [];\n\t var idx = 0;\n\n\t for (; idx < indices.length; idx++) {\n\t index = indices[idx];\n\n\t dataItem = this._view[index].item;\n\t position = this._dataItemPosition(dataItem, this._values);\n\n\t if (position > -1) {\n\t removed.push(this.removeAt(position));\n\t $(children[index]).removeClass(\"k-state-selected\");\n\t }\n\t }\n\n\t if (removed.length) {\n\t this.trigger(CHANGE, {\n\t added: [],\n\t removed: removed\n\t });\n\n\t return true;\n\t }\n\n\t return false;\n\t },\n\n\t _select: function(indices) {\n\t var that = this;\n\t var children = that.element[0].children;\n\t var data = that._view;\n\t var dataItem, index;\n\t var added = [];\n\t var idx = 0;\n\n\t if (last(indices) !== -1) {\n\t that.focus(indices);\n\t }\n\n\t for (; idx < indices.length; idx++) {\n\t index = indices[idx];\n\t dataItem = data[index];\n\n\t if (index === -1 || !dataItem) {\n\t continue;\n\t }\n\n\t dataItem = dataItem.item;\n\n\t that._selectedIndices.push(index);\n\t that._dataItems.push(dataItem);\n\t that._values.push(that._valueGetter(dataItem));\n\n\t $(children[index]).addClass(\"k-state-selected\").attr(\"aria-selected\", true);\n\n\t added.push({\n\t dataItem: dataItem\n\t });\n\t }\n\n\t return added;\n\t },\n\n\t getElementIndex: function(element) {\n\t return $(element).data(\"offset-index\");\n\t },\n\n\t _get: function(candidate) {\n\t if (typeof candidate === \"number\") {\n\t candidate = [candidate];\n\t } else if (!isArray(candidate)) {\n\t candidate = this.getElementIndex(candidate);\n\t candidate = [candidate !== undefined ? candidate : -1];\n\t }\n\n\t return candidate;\n\t },\n\n\t _template: function() {\n\t var that = this;\n\t var options = that.options;\n\t var template = options.template;\n\n\t if (!template) {\n\t template = kendo.template('
${' + kendo.expr(options.dataTextField, \"data\") + \"}\", { useWithBlock: false });\n\t } else {\n\t template = kendo.template(template);\n\t template = function(data) {\n\t return '
' + template(data) + \"\";\n\t };\n\t }\n\n\t return template;\n\t },\n\n\t _templates: function() {\n\t var template;\n\t var options = this.options;\n\t var templates = {\n\t template: options.template,\n\t groupTemplate: options.groupTemplate,\n\t fixedGroupTemplate: options.fixedGroupTemplate\n\t };\n\n\t if (options.columns) {\n\t for (var i = 0; i < options.columns.length; i++) {\n\t var currentColumn = options.columns[i];\n\t var templateText = currentColumn.field ? currentColumn.field.toString(): \"text\";\n\n\t templates[\"column\"+ i] = currentColumn.template || \"#: \" + templateText + \"#\";\n\t }\n\t }\n\n\t for (var key in templates) {\n\t template = templates[key];\n\t if (template && typeof template !== \"function\") {\n\t templates[key] = kendo.template(template);\n\t }\n\t }\n\n\t this.templates = templates;\n\t },\n\n\t _normalizeIndices: function(indices) {\n\t var newIndices = [];\n\t var idx = 0;\n\n\t for (; idx < indices.length; idx++) {\n\t if (indices[idx] !== undefined) {\n\t newIndices.push(indices[idx]);\n\t }\n\t }\n\n\t return newIndices;\n\t },\n\n\t _valueIndices: function(values, indices) {\n\t var data = this._view;\n\t var idx = 0;\n\t var index;\n\n\t indices = indices ? indices.slice() : [];\n\n\t if (!values.length) {\n\t return [];\n\t }\n\n\t for (; idx < data.length; idx++) {\n\t index = this._dataItemPosition(data[idx].item, values);\n\n\t if (index !== -1) {\n\t indices[index] = idx;\n\t }\n\t }\n\n\t return this._normalizeIndices(indices);\n\t },\n\n\t _firstVisibleItem: function() {\n\t var element = this.element[0];\n\t var content = this.content[0];\n\t var scrollTop = content.scrollTop;\n\t var itemHeight = $(element.children[0]).height();\n\t var itemIndex = Math.floor(scrollTop / itemHeight) || 0;\n\t var item = element.children[itemIndex] || element.lastChild;\n\t var forward = item.offsetTop < scrollTop;\n\n\t while (item) {\n\t if (forward) {\n\t if ((item.offsetTop + itemHeight) > scrollTop || !item.nextSibling) {\n\t break;\n\t }\n\n\t item = item.nextSibling;\n\t } else {\n\t if (item.offsetTop <= scrollTop || !item.previousSibling) {\n\t break;\n\t }\n\n\t item = item.previousSibling;\n\t }\n\t }\n\n\t return this._view[$(item).data(\"offset-index\")];\n\t },\n\n\t _fixedHeader: function() {\n\t if (this.isGrouped() && this.templates.fixedGroupTemplate) {\n\t this.header.show();\n\t this.content.scroll(this._onScroll);\n\t } else {\n\t this.header.hide();\n\t this.content.off(\"scroll\", this._onScroll);\n\t }\n\t },\n\n\t _renderHeader: function() {\n\t var template = this.templates.fixedGroupTemplate;\n\t if (!template) {\n\t return;\n\t }\n\n\t var visibleItem = this._firstVisibleItem();\n\n\t if (visibleItem && visibleItem.group.toString().length) {\n\t this.header.html(template(visibleItem.group));\n\t }\n\t },\n\n\t _renderItem: function(context) {\n\t var item = '
';\n\t if (hasColumns) {\n\t item += this._renderColumns(dataItem);\n\t } else {\n\t item += this.templates.template(dataItem);\n\t }\n\n\t if (notFirstItem && context.newGroup) {\n\t if (hasColumns) {\n\t item += '' + this.templates.groupTemplate(context.group) + '
';\n\t } else {\n\t item += '' + this.templates.groupTemplate(context.group) + '
';\n\t }\n\t } else if (isGrouped && hasColumns) {\n\t item += \"\";\n\t }\n\n\t return item + \"\";\n\t },\n\n\t _renderColumns: function(dataItem) {\n\t var item = \"\";\n\n\t for (var i = 0; i < this.options.columns.length; i++) {\n\t var currentWidth = this.options.columns[i].width;\n\t var currentWidthInt = parseInt(currentWidth, 10);\n\t var widthStyle = '';\n\n\t if (currentWidth && !isNaN(currentWidthInt)) {\n\t widthStyle += \"style='width:\";\n\t widthStyle += currentWidthInt;\n\t widthStyle += percentageUnitsRegex.test(currentWidth) ? \"%\" : \"px\";\n\t widthStyle += \";'\";\n\t }\n\t item += \"
\";\n\t item += this.templates[\"column\"+ i](dataItem);\n\t item += \"\";\n\t }\n\n\t return item;\n\t },\n\n\t _render: function() {\n\t var html = \"\";\n\n\t var i = 0;\n\t var idx = 0;\n\t var context;\n\t var dataContext = [];\n\t var view = this.dataSource.view();\n\t var values = this.value();\n\n\t var group, newGroup, j;\n\t var isGrouped = this.isGrouped();\n\n\t if (isGrouped) {\n\t for (i = 0; i < view.length; i++) {\n\t group = view[i];\n\t newGroup = true;\n\n\t for (j = 0; j < group.items.length; j++) {\n\t context = {\n\t selected: this._selected(group.items[j], values),\n\t item: group.items[j],\n\t group: group.value,\n\t newGroup: newGroup,\n\t isLastGroupedItem: j === group.items.length - 1,\n\t index: idx };\n\t dataContext[idx] = context;\n\t idx += 1;\n\n\t html += this._renderItem(context);\n\t newGroup = false;\n\t }\n\t }\n\t } else {\n\t for (i = 0; i < view.length; i++) {\n\t context = { selected: this._selected(view[i], values), item: view[i], index: i };\n\n\t dataContext[i] = context;\n\n\t html += this._renderItem(context);\n\t }\n\t }\n\n\t this._view = dataContext;\n\n\t this.element[0].innerHTML = html;\n\n\t if (isGrouped && dataContext.length) {\n\t this._renderHeader();\n\t }\n\t },\n\n\t _selected: function(dataItem, values) {\n\t var select = !this.isFiltered() || this.options.selectable === \"multiple\";\n\t return select && this._dataItemPosition(dataItem, values) !== -1;\n\t },\n\n\t setDSFilter: function(filter) {\n\t this._lastDSFilter = extend({}, filter);\n\t },\n\n\t isFiltered: function() {\n\t if (!this._lastDSFilter) {\n\t this.setDSFilter(this.dataSource.filter());\n\t }\n\n\t return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n\t },\n\n\t refresh: function(e) {\n\t var that = this;\n\t var action = e && e.action;\n\t var skipUpdateOnBind = that.options.skipUpdateOnBind;\n\t var isItemChange = action === \"itemchange\";\n\t var result;\n\n\t that.trigger(\"dataBinding\");\n\t that._angularItems(\"cleanup\");\n\n\t that._fixedHeader();\n\n\t that._render();\n\n\t that.bound(true);\n\n\t if (isItemChange || action === \"remove\") {\n\t result = mapChangedItems(that._dataItems, e.items);\n\n\t if (result.changed.length) {\n\t if (isItemChange) {\n\t that.trigger(\"selectedItemChange\", {\n\t items: result.changed\n\t });\n\t } else {\n\t that.value(that._getValues(result.unchanged));\n\t }\n\t }\n\t } else if (that.isFiltered() || that._skipUpdate || that._emptySearch) {\n\t that.focus(0);\n\t if (that._skipUpdate) {\n\t that._skipUpdate = false;\n\t that._selectedIndices = that._valueIndices(that._values, that._selectedIndices);\n\t }\n\t } else if (!skipUpdateOnBind && (!action || action === \"add\")) {\n\t that.value(that._values);\n\t }\n\n\t if (that._valueDeferred) {\n\t that._valueDeferred.resolve();\n\t }\n\n\t that._angularItems(\"compile\");\n\t that.trigger(\"dataBound\");\n\t },\n\n\t bound: function(bound) {\n\t if (bound === undefined) {\n\t return this._bound;\n\t }\n\n\t this._bound = bound;\n\t },\n\n\t isGrouped: function() {\n\t return (this.dataSource.group() || []).length;\n\t }\n\t });\n\n\t ui.plugin(StaticList);\n\n\t function last(list) {\n\t return list[list.length - 1];\n\t }\n\n\t function getSelectedOption(select) {\n\t var index = select.selectedIndex;\n\t return index > -1 ? select.options[index] : {};\n\t }\n\n\t function mapChangedItems(selected, itemsToMatch) {\n\t var itemsLength = itemsToMatch.length;\n\t var selectedLength = selected.length;\n\t var dataItem;\n\t var found;\n\t var i, j;\n\n\t var changed = [];\n\t var unchanged = [];\n\n\t if (selectedLength) {\n\t for (i = 0; i < selectedLength; i++) {\n\t dataItem = selected[i];\n\t found = false;\n\n\t for (j = 0; j < itemsLength; j++) {\n\t if (dataItem === itemsToMatch[j]) {\n\t found = true;\n\t changed.push({ index: i, item: dataItem });\n\t break;\n\t }\n\t }\n\n\t if (!found) {\n\t unchanged.push(dataItem);\n\t }\n\t }\n\t }\n\n\t return {\n\t changed: changed,\n\t unchanged: unchanged\n\t };\n\t }\n\n\t function isValidFilterExpr(expression) {\n\t if (!expression || $.isEmptyObject(expression)) {\n\t return false;\n\t }\n\n\t if (expression.filters && !expression.filters.length) {\n\t return false;\n\t }\n\n\t return true;\n\t }\n\n\t function removeFiltersForField(expression, field) {\n\t var filters;\n\t var found = false;\n\n\t if (expression.filters) {\n\t filters = $.grep(expression.filters, function(filter) {\n\t found = removeFiltersForField(filter, field);\n\t if (filter.filters) {\n\t return filter.filters.length;\n\t } else {\n\t return filter.field != field;\n\t }\n\t });\n\n\t if (!found && expression.filters.length !== filters.length) {\n\t found = true;\n\t }\n\n\t expression.filters = filters;\n\t }\n\n\t return found;\n\t }\n\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1293);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1059:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.data\");\n\n/***/ }),\n\n/***/ 1079:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.selectable\");\n\n/***/ }),\n\n/***/ 1255:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.editable\");\n\n/***/ }),\n\n/***/ 1293:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1059), __webpack_require__(1255), __webpack_require__(1079) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"listview\",\n\t name: \"ListView\",\n\t category: \"web\",\n\t description: \"The ListView widget offers rich support for interacting with data.\",\n\t depends: [ \"data\" ],\n\t features: [ {\n\t id: \"listview-editing\",\n\t name: \"Editing\",\n\t description: \"Support for record editing\",\n\t depends: [ \"editable\" ]\n\t }, {\n\t id: \"listview-selection\",\n\t name: \"Selection\",\n\t description: \"Support for selection\",\n\t depends: [ \"selectable\" ]\n\t } ]\n\t};\n\n\t(function($, undefined) {\n\t var kendo = window.kendo,\n\t CHANGE = \"change\",\n\t KENDO_KEYDOWN = \"kendoKeydown\",\n\t CANCEL = \"cancel\",\n\t DATABOUND = \"dataBound\",\n\t DATABINDING = \"dataBinding\",\n\t Widget = kendo.ui.Widget,\n\t keys = kendo.keys,\n\t EMPTY_STRING = \"\",\n\t FOCUSSELECTOR = \"> *:not(.k-loading-mask)\",\n\t PROGRESS = \"progress\",\n\t ERROR = \"error\",\n\t FOCUSED = \"k-state-focused\",\n\t SELECTED = \"k-state-selected\",\n\t KEDITITEM = \"k-edit-item\",\n\t EDIT = \"edit\",\n\t REMOVE = \"remove\",\n\t SAVE = \"save\",\n\t MOUSEDOWN = \"mousedown\",\n\t CLICK = \"click\",\n\t TOUCHSTART = \"touchstart\",\n\t NS = \".kendoListView\",\n\t proxy = $.proxy,\n\t activeElement = kendo._activeElement,\n\t progress = kendo.ui.progress,\n\t DataSource = kendo.data.DataSource;\n\n\t var ListView = kendo.ui.DataBoundWidget.extend( {\n\t init: function(element, options) {\n\t var that = this;\n\n\t options = $.isArray(options) ? { dataSource: options } : options;\n\n\t Widget.fn.init.call(that, element, options);\n\n\t options = that.options;\n\n\t that.wrapper = element = that.element;\n\n\t if (element[0].id) {\n\t that._itemId = element[0].id + \"_lv_active\";\n\t }\n\n\t that._element();\n\n\t that._layout();\n\n\t that._dataSource();\n\n\t that._templates();\n\n\t that._navigatable();\n\n\t that._selectable();\n\n\t that._pageable();\n\n\t that._crudHandlers();\n\n\t that._scrollable();\n\n\t if (that.options.autoBind){\n\t that.dataSource.fetch();\n\t }\n\n\t kendo.notify(that);\n\t },\n\n\t events: [\n\t CHANGE,\n\t CANCEL,\n\t DATABINDING,\n\t DATABOUND,\n\t EDIT,\n\t REMOVE,\n\t SAVE,\n\t KENDO_KEYDOWN\n\t ],\n\n\t options: {\n\t name: \"ListView\",\n\t autoBind: true,\n\t selectable: false,\n\t navigatable: false,\n\t height: null,\n\t template: EMPTY_STRING,\n\t altTemplate: EMPTY_STRING,\n\t editTemplate: EMPTY_STRING,\n\t contentTemplate: \"
\",\n\t contentElement: \"div\",\n\t bordered: true,\n\t borders: \"\",\n\t layout: \"\",\n\t flex: {\n\t direction: \"row\",\n\t wrap: \"nowrap\"\n\t },\n\t grid: {},\n\t scrollable: false\n\t },\n\n\t setOptions: function(options) {\n\t Widget.fn.setOptions.call(this, options);\n\n\t this._layout();\n\n\t this._templates();\n\n\t if (this.selectable) {\n\t this.selectable.destroy();\n\t this.selectable = null;\n\t }\n\n\t this._selectable();\n\t },\n\n\t _templates: function() {\n\t var options = this.options;\n\n\t this.template = kendo.template(options.template || EMPTY_STRING);\n\t this.altTemplate = kendo.template(options.altTemplate || options.template);\n\t this.editTemplate = kendo.template(options.editTemplate || EMPTY_STRING);\n\t },\n\n\t _item: function(action) {\n\t return this.content.children()[action]();\n\t },\n\n\t items: function() {\n\t return this.content.children(\":not(.k-loading-mask)\");\n\t },\n\n\t dataItem: function(element) {\n\t var attr = kendo.attr(\"uid\");\n\t var uid = $(element).closest(\"[\" + attr + \"]\").attr(attr);\n\n\t return this.dataSource.getByUid(uid);\n\t },\n\n\t setDataSource: function(dataSource) {\n\t this.options.dataSource = dataSource;\n\t this._dataSource();\n\n\t if (this.options.autoBind) {\n\t dataSource.fetch();\n\t }\n\n\t if (this.options.scrollable === \"endless\") {\n\t this._bindScrollable();\n\t }\n\t },\n\n\t _unbindDataSource: function() {\n\t var that = this;\n\n\t that.dataSource.unbind(CHANGE, that._refreshHandler)\n\t .unbind(PROGRESS, that._progressHandler)\n\t .unbind(ERROR, that._errorHandler);\n\t },\n\n\t _dataSource: function() {\n\t var that = this;\n\n\t if (that.dataSource && that._refreshHandler) {\n\t that._unbindDataSource();\n\t } else {\n\t that._refreshHandler = proxy(that.refresh, that);\n\t that._progressHandler = proxy(that._progress, that);\n\t that._errorHandler = proxy(that._error, that);\n\t }\n\n\t that.dataSource = DataSource.create(that.options.dataSource)\n\t .bind(CHANGE, that._refreshHandler)\n\t .bind(PROGRESS, that._progressHandler)\n\t .bind(ERROR, that._errorHandler);\n\t },\n\n\t _progress: function(toggle) {\n\t var element = this.content;\n\t progress(element, toggle, { opacity: true});\n\t },\n\n\t _error: function() {\n\t progress(this.content, false);\n\t },\n\n\t _element: function() {\n\t var options = this.options;\n\t var height = options.height;\n\n\t this.element.addClass(\"k-widget k-listview\");\n\n\t if (options.navigatable || options.selectable) {\n\t this.element.attr(\"role\", \"listbox\");\n\t } else {\n\t this.element.attr(\"role\", \"list\");\n\t }\n\n\t if (options.contentElement) {\n\t this.content = $(document.createElement(options.contentElement)).appendTo(this.element);\n\t } else {\n\t this.content = this.element;\n\t }\n\n\t if (height) {\n\t this.element.css(\"height\", height);\n\t }\n\t },\n\n\t _layout: function() {\n\t var that = this;\n\t var options = that.options;\n\t var flex = options.flex;\n\t var grid = options.grid;\n\t var element = that.element;\n\t var elementClassNames = [\"k-widget\", \"k-listview\"];\n\t var content = that.content;\n\t var contentClassNames = [\"k-listview-content\"];\n\n\t element.add(content).removeClass(function (index, className) {\n\t if (className.indexOf(\"k-\") >= 0) {\n\t return true;\n\t }\n\t });\n\n\t // Element class names\n\t if (options.bordered === true) {\n\t elementClassNames.push(\"k-listview-bordered\");\n\t }\n\n\t if (typeof options.borders === \"string\" && options.borders !== EMPTY_STRING) {\n\t elementClassNames.push(\"k-listview-borders-\" + options.borders);\n\t }\n\n\n\t // Content class names\n\t if (typeof options.contentPadding === \"string\" && options.contentPadding !== EMPTY_STRING) {\n\t contentClassNames.push(\"k-listview-content-padding-\" + options.contentPadding);\n\t }\n\n\t if (typeof options.layout === \"string\" && options.layout !== EMPTY_STRING) {\n\t contentClassNames.push(\"k-d-\" + options.layout);\n\t }\n\n\t if (options.layout === \"flex\" && typeof flex === \"object\") {\n\t if (typeof flex.direction === \"string\" && flex.direction !== \"\") {\n\t contentClassNames.push(\"k-flex-\" + flex.direction);\n\t }\n\n\t if (typeof flex.wrap === \"string\" && flex.wrap !== \"\") {\n\t contentClassNames.push(\"k-flex-\" + flex.wrap);\n\t }\n\t }\n\n\t if (options.layout === \"grid\" && typeof grid === \"object\") {\n\t if (typeof grid.cols === \"number\") {\n\t content.css(\"grid-template-columns\", \"repeat(\" + grid.cols + \", 1fr)\");\n\t } else if (typeof grid.cols === \"string\") {\n\t content.css(\"grid-template-columns\", grid.cols);\n\t }\n\n\t if (typeof grid.rows === \"number\") {\n\t content.css(\"grid-template-rows\", \"repeat(\" + grid.rows + \", \" + (grid.rowHeight !== undefined ? grid.rowHeight : \"1fr\") + \")\");\n\t } else if (typeof grid.rows === \"string\") {\n\t content.css(\"grid-template-rows\", grid.rows);\n\t }\n\n\t if (typeof grid.gutter === \"number\") {\n\t content.css(\"grid-gap\", grid.gutter);\n\t } else if (typeof grid.gutter === \"string\") {\n\t content.css(\"grid-gap\", grid.gutter);\n\t }\n\t }\n\n\t that.element.addClass(elementClassNames.join(\" \"));\n\t that.content.addClass(contentClassNames.join(\" \"));\n\n\t },\n\n\t refresh: function(e) {\n\t var that = this,\n\t view = that.dataSource.view(),\n\t data,\n\t items,\n\t item,\n\t html = \"\",\n\t idx,\n\t length,\n\t template = that.template,\n\t altTemplate = that.altTemplate,\n\t options = that.options,\n\t role = (options.selectable || options.navigatable) ? \"option\" : \"listitem\",\n\t active = activeElement(),\n\t endlessAppend = that._endlessFetchInProgress,\n\t index = endlessAppend ? that._skipRerenderItemsCount : 0,\n\t scrollable = that.options.scrollable;\n\n\t e = e || {};\n\n\t if (e.action === \"itemchange\") {\n\t if (!that._hasBindingTarget() && !that.editable) {\n\t data = e.items[0];\n\t item = that.items().filter(\"[\" + kendo.attr(\"uid\") + \"=\" + data.uid + \"]\");\n\n\t if (item.length > 0) {\n\t idx = item.index();\n\n\t that.angular(\"cleanup\", function() {\n\t return { elements: [ item ]};\n\t });\n\n\t item.replaceWith(template(data));\n\t item = that.items().eq(idx);\n\t item.attr(kendo.attr(\"uid\"), data.uid);\n\n\t that.angular(\"compile\", function() {\n\t return { elements: [ item ], data: [ { dataItem: data } ]};\n\t });\n\n\t that.trigger(\"itemChange\", {\n\t item: item,\n\t data: data\n\t });\n\t }\n\t }\n\n\t return;\n\t }\n\n\t if (that.trigger(DATABINDING, { action: e.action || \"rebind\", items: e.items, index: e.index })) {\n\t return;\n\t }\n\n\t that._angularItems(\"cleanup\");\n\n\t if (!endlessAppend) {\n\t that._destroyEditable();\n\t }\n\n\t for (idx = index, length = view.length; idx < length; idx++) {\n\t if (idx % 2) {\n\t html += altTemplate(view[idx]);\n\t } else {\n\t html += template(view[idx]);\n\t }\n\t }\n\n\t if (endlessAppend) {\n\t that.content.append(html);\n\t } else {\n\t that.content.html(html);\n\t }\n\n\t items = that.items().not(\".k-loading-mask\");\n\n\t for (idx = index, length = view.length; idx < length; idx++) {\n\t item = items.eq(idx);\n\t item.attr(kendo.attr(\"uid\"), view[idx].uid)\n\t .attr(\"role\", role);\n\n\t if (that.options.selectable) {\n\t item.attr(\"aria-selected\", \"false\");\n\t }\n\t }\n\n\t if (that.content[0] === active && that.options.navigatable) {\n\t if (that._focusNext) {\n\t that.current(that.current().next());\n\t } else {\n\t if (!scrollable) {\n\t that.current(items.eq(0));\n\t }\n\t }\n\t }\n\n\t that._angularItems(\"compile\");\n\n\t that._progress(false);\n\t that._endlessFetchInProgress = null;\n\n\t that.trigger(DATABOUND, { action: e.action || \"rebind\", items: e.items, index: e.index });\n\t },\n\n\t _pageable: function() {\n\t var that = this,\n\t pageable = that.options.pageable,\n\t settings,\n\t pagerId;\n\n\t if ($.isPlainObject(pageable)) {\n\t pagerId = pageable.pagerId;\n\t settings = $.extend({}, pageable, {\n\t dataSource: that.dataSource,\n\t pagerId: null\n\t });\n\n\t that.pager = new kendo.ui.Pager($(\"#\" + pagerId), settings);\n\t }\n\t },\n\n\t _selectable: function() {\n\t var that = this,\n\t multi,\n\t current,\n\t selectable = that.options.selectable,\n\t navigatable = that.options.navigatable;\n\n\t if (selectable) {\n\t multi = kendo.ui.Selectable.parseOptions(selectable).multiple;\n\n\t that.selectable = new kendo.ui.Selectable(that.element, {\n\t aria: true,\n\t multiple: multi,\n\t filter: that.options.contentElement ? \".k-listview-content \" + FOCUSSELECTOR : FOCUSSELECTOR,\n\t change: function() {\n\t that.trigger(CHANGE);\n\t }\n\t });\n\n\t if (navigatable) {\n\t that.element.on(\"keydown\" + NS, function(e) {\n\t if (e.keyCode === keys.SPACEBAR) {\n\t current = that.current();\n\n\t if (e.target == e.currentTarget) {\n\t e.preventDefault();\n\t }\n\n\t if (multi) {\n\t if (!e.ctrlKey) {\n\t that.selectable.clear();\n\t } else {\n\t if (current && current.hasClass(SELECTED)) {\n\t current.removeClass(SELECTED);\n\t return;\n\t }\n\t }\n\t } else {\n\t that.selectable.clear();\n\t }\n\n\t that.selectable.value(current);\n\t }\n\t });\n\t }\n\t }\n\t },\n\n\t _scrollable: function() {\n\t var that = this;\n\t var scrollable = that.options.scrollable;\n\n\t if (scrollable) {\n\n\t that.content.css({\n\t \"overflow-y\": \"scroll\",\n\t \"position\": \"relative\",\n\t \"-webkit-overflow-scrolling\": \"touch\"\n\t });\n\n\t if (scrollable === \"endless\") {\n\t that._bindScrollable();\n\t }\n\t }\n\t },\n\n\t _bindScrollable: function (){\n\t var that = this;\n\t var originalPageSize = that._endlessPageSize = that.dataSource.options.pageSize;\n\n\t that.content\n\t .off(\"scroll\" + NS)\n\t .on(\"scroll\" + NS, function () {\n\t if (this.scrollTop + this.clientHeight - this.scrollHeight >= -15 &&\n\t !that._endlessFetchInProgress &&\n\t that._endlessPageSize < that.dataSource.total()) {\n\t that._skipRerenderItemsCount = that._endlessPageSize;\n\t that._endlessPageSize = that._skipRerenderItemsCount + originalPageSize;\n\t that.dataSource.options.endless = true;\n\t that._endlessFetchInProgress = true;\n\t that.dataSource.pageSize(that._endlessPageSize);\n\t }\n\t });\n\t },\n\n\t current: function(candidate) {\n\t var that = this,\n\t element = that.element,\n\t current = that._current,\n\t id = that._itemId;\n\n\t if (candidate === undefined) {\n\t return current;\n\t }\n\n\t if (current && current[0]) {\n\t if (current[0].id === id) {\n\t current.removeAttr(\"id\");\n\t }\n\n\t current.removeClass(FOCUSED);\n\t element.removeAttr(\"aria-activedescendant\");\n\t }\n\n\t if (candidate && candidate[0]) {\n\t id = candidate[0].id || id;\n\n\t that._scrollTo(candidate[0]);\n\n\t element.attr(\"aria-activedescendant\", id);\n\t candidate.addClass(FOCUSED).attr(\"id\", id);\n\t }\n\n\t that._current = candidate;\n\t },\n\n\t _scrollTo: function(element) {\n\t var that = this,\n\t content = that.content,\n\t container,\n\t UseJQueryoffset = false,\n\t SCROLL = \"scroll\";\n\n\t if (content.css(\"overflow\") === \"auto\" || content.css(\"overflow\") === SCROLL || content.css(\"overflow-y\") === SCROLL) {\n\t container = content[0];\n\t } else {\n\t container = window;\n\t UseJQueryoffset = true;\n\t }\n\n\t var scrollDirectionFunc = function(direction, dimension) {\n\n\t var elementOffset = UseJQueryoffset ? $(element).offset()[direction.toLowerCase()] : element[\"offset\" + direction],\n\t elementDimension = element[\"client\" + dimension],\n\t containerScrollAmount = $(container)[SCROLL + direction](),\n\t containerDimension = $(container)[dimension.toLowerCase()]();\n\n\t if (elementOffset + elementDimension > containerScrollAmount + containerDimension) {\n\t $(container)[SCROLL + direction](elementOffset + elementDimension - containerDimension);\n\t } else if (elementOffset < containerScrollAmount) {\n\t $(container)[SCROLL + direction](elementOffset);\n\t }\n\t };\n\n\t scrollDirectionFunc(\"Top\", \"Height\");\n\t scrollDirectionFunc(\"Left\", \"Width\");\n\t },\n\n\t _navigatable: function() {\n\t var that = this,\n\t navigatable = that.options.navigatable,\n\t element = that.element,\n\t content = that.content,\n\t clickCallback = function(e) {\n\t that.current($(e.currentTarget));\n\t if (!$(e.target).is(\":button, a, :input, a > .k-icon, textarea\")) {\n\t kendo.focusElement(element);\n\t }\n\t };\n\n\t if (navigatable) {\n\t that._tabindex();\n\n\t element\n\t .on(\"focus\" + NS, function() {\n\t var current = that._current;\n\n\t if (!current || !current.is(\":visible\")) {\n\t current = that._item(\"first\");\n\t }\n\n\t that.current(current);\n\t })\n\t .on(\"focusout\" + NS, function() {\n\t if (that._current) {\n\t that._current.removeClass(FOCUSED);\n\t }\n\t })\n\t .on(\"keydown\" + NS, that, function(e) {\n\t var key = e.keyCode,\n\t current = that.current(),\n\t target = $(e.target),\n\t canHandle = !target.is(\":button, textarea, a, a > .t-icon, input\"),\n\t isTextBox = target.is(\":text, :password\"),\n\t preventDefault = kendo.preventDefault,\n\t editItem = content.find(\".\" + KEDITITEM),\n\t active = activeElement(), idx,\n\t scrollable = that.options.scrollable;\n\n\t if ((!canHandle && !isTextBox && key !== keys.ESC) || (isTextBox && key !== keys.ESC && key !== keys.ENTER)) {\n\t return;\n\t }\n\n\t if (key === keys.UP || key === keys.LEFT) {\n\t if (current && current[0]) {\n\t current = current.prev();\n\t }\n\n\t if (current && current[0]) {\n\t that.current(current);\n\t }\n\t else if (!scrollable) {\n\t that.current(that._item(\"last\"));\n\t }\n\t preventDefault(e);\n\t }\n\n\t if (key === keys.DOWN || key === keys.RIGHT) {\n\t if (scrollable) {\n\t if (that.options.scrollable === \"endless\" && !current.next().length) {\n\t that.content[0].scrollTop = that.content[0].scrollHeight;\n\t that._focusNext = true;\n\t } else {\n\t current = current.next();\n\n\t if (current && current[0]) {\n\t that.current(current);\n\t }\n\t }\n\t }\n\t else {\n\t current = current.next();\n\t that.current(!current || !current[0] ? that._item(\"first\") : current);\n\t }\n\t preventDefault(e);\n\t }\n\n\t if (key === keys.PAGEUP) {\n\t that.current(null);\n\t that.dataSource.page(that.dataSource.page() - 1);\n\t preventDefault(e);\n\t }\n\n\t if (key === keys.PAGEDOWN) {\n\t that.current(null);\n\t that.dataSource.page(that.dataSource.page() + 1);\n\t preventDefault(e);\n\t }\n\n\t if (key === keys.HOME) {\n\t that.current(that._item(\"first\"));\n\t preventDefault(e);\n\t }\n\n\t if (key === keys.END) {\n\t that.current(that._item(\"last\"));\n\t preventDefault(e);\n\t }\n\n\t if (key === keys.ENTER) {\n\t if (editItem.length !== 0 && (canHandle || isTextBox)) {\n\t idx = that.items().index(editItem);\n\n\t if (active) {\n\t active.blur();\n\t }\n\n\t that.save();\n\n\t var focusAgain = function(){\n\t that.element.trigger(\"focus\");\n\t that.current(that.items().eq(idx));\n\t };\n\n\t that.one(\"dataBound\", focusAgain);\n\t } else if (that.options.editTemplate !== \"\") {\n\t that.edit(current);\n\t }\n\t }\n\n\t if (key === keys.ESC) {\n\t editItem = content.find(\".\" + KEDITITEM);\n\n\t if (editItem.length === 0) {\n\t return;\n\t }\n\n\t idx = that.items().index(editItem);\n\t that.cancel();\n\t that.element.trigger(\"focus\");\n\t that.current(that.items().eq(idx));\n\t }\n\t });\n\n\t element.on(MOUSEDOWN + NS + \" \" + TOUCHSTART + NS, that.options.contentElement ? \".k-listview-content \" + FOCUSSELECTOR : FOCUSSELECTOR, proxy(clickCallback, that));\n\t }\n\t },\n\n\t clearSelection: function() {\n\t var that = this;\n\t that.selectable.clear();\n\t that.trigger(CHANGE);\n\t },\n\n\t select: function(items) {\n\t var that = this,\n\t selectable = that.selectable;\n\n\t items = $(items);\n\n\t if (items.length) {\n\t if (!selectable.options.multiple) {\n\t selectable.clear();\n\t items = items.first();\n\t }\n\t selectable.value(items);\n\t return;\n\t }\n\n\t return selectable.value();\n\t },\n\n\t _destroyEditable: function() {\n\t var that = this;\n\t if (that.editable) {\n\t that.editable.destroy();\n\t delete that.editable;\n\t }\n\t },\n\n\t _modelFromElement: function(element) {\n\t var uid = element.attr(kendo.attr(\"uid\"));\n\n\t return this.dataSource.getByUid(uid);\n\t },\n\n\t _closeEditable: function() {\n\t var that = this,\n\t editable = that.editable,\n\t options = that.options,\n\t role = (options.selectable || options.navigatable) ? \"option\" : \"listitem\",\n\t data,\n\t item,\n\t index,\n\t template = that.template;\n\n\t if (editable) {\n\t if (editable.element.index() % 2) {\n\t template = that.altTemplate;\n\t }\n\n\t that.angular(\"cleanup\", function() {\n\t return { elements: [ editable.element ]};\n\t });\n\n\t data = that._modelFromElement(editable.element);\n\t that._destroyEditable();\n\n\t index = editable.element.index();\n\t editable.element.replaceWith(template(data));\n\t item = that.items().eq(index);\n\t item.attr(kendo.attr(\"uid\"), data.uid);\n\t item.attr(\"role\", role);\n\n\t if (that._hasBindingTarget()) {\n\t kendo.bind(item, data);\n\t }\n\n\t that.angular(\"compile\", function() {\n\t return { elements: [ item ], data: [ { dataItem: data } ]};\n\t });\n\t }\n\t return true;\n\t },\n\n\t edit: function(item) {\n\t var that = this,\n\t data = that._modelFromElement(item),\n\t container,\n\t uid = data.uid,\n\t index;\n\n\t that.cancel();\n\n\t item = that.items().filter(\"[\" + kendo.attr(\"uid\") + \"=\" + uid + \"]\");\n\t index = item.index();\n\t item.replaceWith(that.editTemplate(data));\n\t container = that.items().eq(index).addClass(KEDITITEM).attr(kendo.attr(\"uid\"), data.uid);\n\t that.editable = container.kendoEditable({\n\t model: data,\n\t clearContainer: false,\n\t errorTemplate: false,\n\t target: that\n\t }).data(\"kendoEditable\");\n\n\t that.trigger(EDIT, { model: data, item: container });\n\t },\n\n\t save: function() {\n\t var that = this,\n\t editable = that.editable,\n\t model;\n\n\t if (!editable) {\n\t return;\n\t }\n\n\t var container = editable.element;\n\t model = that._modelFromElement(container);\n\n\t if (editable.end() && !that.trigger(SAVE, { model: model, item: container })) {\n\t that._closeEditable();\n\t that.dataSource.sync();\n\t }\n\t },\n\n\t remove: function(item) {\n\t var that = this,\n\t dataSource = that.dataSource,\n\t data = that._modelFromElement(item);\n\n\t if (that.editable) {\n\t dataSource.cancelChanges(that._modelFromElement(that.editable.element));\n\t that._closeEditable();\n\t }\n\n\t if (!that.trigger(REMOVE, { model: data, item: item })) {\n\t item.hide();\n\t dataSource.remove(data);\n\t dataSource.sync();\n\t }\n\t },\n\n\t add: function() {\n\t var that = this,\n\t dataItem,\n\t dataSource = that.dataSource,\n\t index = dataSource.indexOf((dataSource.view() || [])[0]);\n\n\t if (index < 0) {\n\t index = 0;\n\t }\n\n\t that.cancel();\n\t dataItem = dataSource.insert(index, {});\n\t that.edit(that.element.find(\"[data-uid='\" + dataItem.uid + \"']\"));\n\t },\n\n\t cancel: function() {\n\t var that = this,\n\t dataSource = that.dataSource;\n\n\t if (that.editable) {\n\t var container = that.editable.element;\n\t var model = that._modelFromElement(container);\n\n\t if (!that.trigger(CANCEL, { model: model, container: container})) {\n\t dataSource.cancelChanges(model);\n\t that._closeEditable();\n\t }\n\t }\n\t },\n\n\t _crudHandlers: function() {\n\t var that = this,\n\t mousedownNs = MOUSEDOWN + NS,\n\t touchstartNs = TOUCHSTART + NS,\n\t clickNs = CLICK + NS;\n\n\t that.content.on(mousedownNs + \" \" + touchstartNs, \".k-edit-button\", function(e) {\n\t e.preventDefault();\n\t var item = $(this).closest(\"[\" + kendo.attr(\"uid\") + \"]\");\n\t setTimeout(function() {\n\t that.edit(item);\n\t });\n\t });\n\n\n\t that.content.on(mousedownNs + \" \" + touchstartNs, \".k-delete-button\", function(e) {\n\t e.preventDefault();\n\t var item = $(this).closest(\"[\" + kendo.attr(\"uid\") + \"]\");\n\t setTimeout(function() {\n\t that.remove(item);\n\t });\n\t });\n\n\t that.content.on(clickNs, \".k-update-button\", function(e) {\n\t that.save();\n\t e.preventDefault();\n\t });\n\n\t that.content.on(clickNs, \".k-cancel-button\", function(e) {\n\t that.cancel();\n\t e.preventDefault();\n\t });\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\n\t Widget.fn.destroy.call(that);\n\n\t that._unbindDataSource();\n\n\t that._destroyEditable();\n\n\t that.element.off(NS);\n\t that.content.off(NS);\n\n\t that._endlessFetchInProgress = that._endlessPageSize = that._skipRerenderItemsCount = that._focusNext = null;\n\n\t if (that.pager) {\n\t that.pager.destroy();\n\t }\n\n\t kendo.destroy(that.element);\n\t }\n\t });\n\n\t kendo.ui.plugin(ListView);\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1295);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1049:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.core\");\n\n/***/ }),\n\n/***/ 1295:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1049), __webpack_require__(1296) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"maskedtextbox\",\n\t name: \"MaskedTextBox\",\n\t category: \"web\",\n\t description: \"The MaskedTextBox widget allows to specify a mask type on an input field.\",\n\t depends: [\"core\", \"floatinglabel\"]\n\t};\n\n\t(function($, undefined) {\n\t var global = window;\n\t var min = global.Math.min;\n\t var kendo = global.kendo;\n\t var caret = kendo.caret;\n\t var keys = kendo.keys;\n\t var ui = kendo.ui;\n\t var Widget = ui.Widget;\n\t var NS = \".kendoMaskedTextBox\";\n\t var isPlainObject = $.isPlainObject;\n\t var proxy = $.proxy;\n\t var setTimeout = window.setTimeout;\n\n\t var LABELCLASSES = \"k-label k-input-label\";\n\t var STATEDISABLED = \"k-state-disabled\";\n\t var STATEINVALID = \"k-state-invalid\";\n\t var DISABLED = \"disabled\";\n\t var READONLY = \"readonly\";\n\t var CHANGE = \"change\";\n\t var MOUSEUP = \"mouseup\";\n\t var DROP = \"drop\";\n\t var KEYDOWN = \"keydown\";\n\t var PASTE = \"paste\";\n\t var INPUT = \"input\";\n\n\t function ns(name) { return name + NS; }\n\n\t var INPUT_EVENT_NAME = ns(kendo.support.propertyChangeEvent ? \"propertychange\" : INPUT);\n\n\t function stringDiffStart(str1, str2) {\n\t var i = 0;\n\t while (i < str2.length) {\n\t if (str1[i] !== str2[i]) {\n\t break;\n\t }\n\t i++;\n\t }\n\n\t return i;\n\t }\n\t var MaskedTextBox = Widget.extend({\n\t init: function(element, options) {\n\t var that = this;\n\t var DOMElement;\n\n\t Widget.fn.init.call(that, element, options);\n\n\t that._rules = $.extend({}, that.rules, that.options.rules);\n\n\t element = that.element;\n\t DOMElement = element[0];\n\n\t that._wrapper();\n\t that._tokenize();\n\t that._form();\n\n\t that.element\n\t .addClass(\"k-textbox\")\n\t .attr(\"autocomplete\", \"off\")\n\t .on(\"focus\" + NS, function() {\n\t var value = DOMElement.value;\n\n\t if (!value) {\n\t DOMElement.value = that._old = that._emptyMask;\n\t } else {\n\t that._togglePrompt(true);\n\t }\n\n\t that._oldValue = value;\n\n\t that._timeoutId = setTimeout(function() {\n\t caret(element, 0, value ? that._maskLength : 0);\n\t });\n\t })\n\t .on(\"focusout\" + NS, function() {\n\t var value = element.val();\n\n\t clearTimeout(that._timeoutId);\n\t DOMElement.value = that._old = \"\";\n\n\t if (value !== that._emptyMask) {\n\t DOMElement.value = that._old = value;\n\t }\n\n\t that._change();\n\t that._togglePrompt();\n\t });\n\n\t var disabled = element.is(\"[disabled]\") || $(that.element).parents(\"fieldset\").is(':disabled');\n\n\t if (disabled) {\n\t that.enable(false);\n\t } else {\n\t that.readonly(element.is(\"[readonly]\"));\n\t }\n\n\t that.value(that.options.value || element.val());\n\n\t that._validationIcon = $(\"
\")\n\t .insertAfter(element);\n\t that._label();\n\n\t kendo.notify(that);\n\t },\n\n\t options: {\n\t name: \"MaskedTextBox\",\n\t clearPromptChar: false,\n\t unmaskOnPost: false,\n\t promptChar: \"_\",\n\t culture: \"\",\n\t rules: {},\n\t value: \"\",\n\t mask: \"\",\n\t label: null\n\t },\n\n\t events: [\n\t CHANGE\n\t ],\n\n\t rules: {\n\t \"0\": /\\d/,\n\t \"9\": /\\d|\\s/,\n\t \"#\": /\\d|\\s|\\+|\\-/,\n\t \"L\": /[a-zA-Z]/,\n\t \"?\": /[a-zA-Z]|\\s/,\n\t \"&\": /\\S/,\n\t \"C\": /./,\n\t \"A\": /[a-zA-Z0-9]/,\n\t \"a\": /[a-zA-Z0-9]|\\s/\n\t },\n\n\t setOptions: function(options) {\n\t var that = this;\n\n\t Widget.fn.setOptions.call(that, options);\n\n\t that._rules = $.extend({}, that.rules, that.options.rules);\n\n\t that._tokenize();\n\n\t this._unbindInput();\n\t this._bindInput();\n\n\t that.value(that.element.val());\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\n\t if (that.floatingLabel) {\n\t that.floatingLabel.destroy();\n\t }\n\n\t that.element.off(NS);\n\n\t if (that._formElement) {\n\t that._formElement.off(\"reset\", that._resetHandler);\n\t that._formElement.off(\"submit\", that._submitHandler);\n\t }\n\n\t Widget.fn.destroy.call(that);\n\t },\n\n\t raw: function() {\n\t var unmasked = this._unmask(this.element.val(), 0);\n\t return unmasked.replace(new RegExp(escapeRegExp(this.options.promptChar), \"g\"), \"\");\n\t },\n\n\t value: function(value) {\n\t var element = this.element;\n\t var emptyMask = this._emptyMask;\n\n\t if (value === undefined) {\n\t return this.element.val();\n\t }\n\n\t if (value === null) {\n\t value = \"\";\n\t }\n\n\t if (!emptyMask) {\n\t this._oldValue = value;\n\t element.val(value);\n\t return;\n\t }\n\n\t value = this._unmask(value + \"\");\n\n\t element.val(value ? emptyMask : \"\");\n\n\t this._mask(0, this._maskLength, value);\n\t this._unmaskedValue = null;\n\n\t value = element.val();\n\t this._oldValue = value;\n\n\t if (kendo._activeElement() !== element) {\n\t if (value === emptyMask) {\n\t element.val(\"\");\n\t } else {\n\t this._togglePrompt();\n\t }\n\t }\n\t },\n\n\t _togglePrompt: function(show) {\n\t var DOMElement = this.element[0];\n\t var value = DOMElement.value;\n\n\t if (this.options.clearPromptChar) {\n\t if (!show) {\n\t value = value.replace(new RegExp(escapeRegExp(this.options.promptChar), \"g\"), \" \");\n\t } else {\n\t value = this._oldValue;\n\t }\n\n\t DOMElement.value = this._old = value;\n\t }\n\t },\n\n\t readonly: function(readonly) {\n\t var that = this;\n\n\t this._editable({\n\t readonly: readonly === undefined ? true : readonly,\n\t disable: false\n\t });\n\n\t if (that.floatingLabel) {\n\t that.floatingLabel.readonly(readonly === undefined ? true : readonly);\n\t }\n\t },\n\n\t enable: function(enable) {\n\t var that = this;\n\n\t this._editable({\n\t readonly: false,\n\t disable: !(enable = enable === undefined ? true : enable)\n\t });\n\n\t if (that.floatingLabel) {\n\t that.floatingLabel.enable(enable = enable === undefined ? true : enable);\n\t }\n\t },\n\n\t _bindInput: function() {\n\t var that = this;\n\n\t if (that._maskLength) {\n\t if(that.options.$angular) {//detach \"input\" event in angular scenario to keep the ng-model consistent and updated only when the change event of the textbox is raised.\n\t that.element.off(INPUT);\n\t }\n\t that.element\n\t .on(ns(KEYDOWN), proxy(that._keydown, that))\n\t .on(ns(DROP), proxy(that._drop, that))\n\t .on(ns(CHANGE), proxy(that._trackChange, that))\n\t .on(INPUT_EVENT_NAME, proxy(that._inputHandler, that));\n\n\n\t if (kendo.support.browser.msie) {\n\t var version = kendo.support.browser.version;\n\t if (version > 8 && version < 11) {\n\t var events = [ns(MOUSEUP), ns(DROP), ns(KEYDOWN), ns(PASTE)].join(\" \");\n\t that.element.on(events, proxy(that._legacyIEInputHandler, that));\n\t }\n\t }\n\t }\n\t },\n\n\t _unbindInput: function() {\n\t var events = [INPUT_EVENT_NAME, ns(KEYDOWN), ns(MOUSEUP), ns(DROP), ns(PASTE)].join(\" \");\n\n\t this.element.off(events);\n\t },\n\n\t _editable: function(options) {\n\t var that = this;\n\t var element = that.element;\n\t var wrapper = that.wrapper;\n\t var disable = options.disable;\n\t var readonly = options.readonly;\n\n\t that._unbindInput();\n\n\t if (!readonly && !disable) {\n\t element.removeAttr(DISABLED)\n\t .removeAttr(READONLY);\n\n\t wrapper.removeClass(STATEDISABLED);\n\n\t that._bindInput();\n\t } else {\n\t element.attr(DISABLED, disable)\n\t .attr(READONLY, readonly);\n\n\t wrapper.toggleClass(STATEDISABLED, disable);\n\t }\n\t },\n\n\t _change: function() {\n\t var that = this;\n\t var value = that.value();\n\n\t if (value !== that._oldValue) {\n\t that._oldValue = value;\n\n\t that.trigger(CHANGE);\n\t that.element.trigger(CHANGE);\n\t }\n\t else if (value === \"\" && that.__changing) {//ensure change is raised when empty value (mask is stripped from input content) for consistent ngjs model update\n\t that.element.trigger(CHANGE);\n\t }\n\t },\n\n\t inputChange: function(backward) {\n\t var that = this;\n\t var old = that._old;\n\t var element = that.element[0];\n\t var value = element.value;\n\t var selection = caret(element);\n\t var cursor = selection[1];\n\t var lengthDiff = value.length - old.length;\n\t var mobile = kendo.support.mobileOS;\n\n\t if (that.__dropping && lengthDiff < 0) {//dropping in same input on WebKit is raised once for the removal phase and once for the adding phase\n\t return;\n\t }\n\n\t if (lengthDiff === -1 && mobile.android && mobile.browser === \"chrome\") {\n\t backward = true;\n\t }\n\n\t var contentStart = min(cursor, stringDiffStart(value, old));\n\t var content = value.substring(contentStart, cursor);\n\n\t element.value = value.substring(0, contentStart) + that._emptyMask.substring(contentStart);\n\n\t var caretPos = that._mask(contentStart, cursor, content);\n\t var endContent = that._trimStartPromptChars(value.substring(cursor), min(lengthDiff, caretPos - contentStart));\n\n\t var unmasked = that._unmask(endContent, old.length - endContent.length);\n\t that._mask(caretPos, caretPos, unmasked);\n\n\t if (backward) {\n\t caretPos = that._findCaretPosBackwards(contentStart);\n\t }\n\n\t caret(element, caretPos);\n\n\t //clean-up flags\n\t that.__dropping = false;\n\t },\n\n\t _trimStartPromptChars: function(content, count) {\n\t var promptChar = this.options.promptChar;\n\n\t while (count-- > 0 && content.indexOf(promptChar) === 0) {\n\t content = content.substring(1);\n\t }\n\n\t return content;\n\t },\n\n\t _findCaretPosBackwards: function(pos) {\n\t var caretStart = this._find(pos, true);\n\t if (caretStart < pos) {\n\t caretStart += 1;\n\t }\n\n\t return caretStart;\n\t },\n\n\t _inputHandler: function() {\n\t if (kendo._activeElement() !== this.element[0]) {\n\t return;\n\t }\n\n\t this.inputChange(this.__backward);\n\t },\n\n\t _legacyIEInputHandler: function(e) {\n\t var that = this;\n\t var input = that.element[0];\n\t var value = input.value;\n\t var type = e.type;\n\n\t that.__pasting = (type === \"paste\");\n\n\t setTimeout(function() {\n\t if(type === \"mouseup\" && that.__pasting) {\n\t return;\n\t }\n\t if (input.value && input.value !== value) {\n\t that.inputChange(that.__backward);\n\t }\n\t });\n\t },\n\n\t _trackChange: function() {\n\t var that = this;\n\n\t that.__changing = true;\n\t setTimeout(function() { that.__changing = false; });\n\t },\n\n\t _form: function() {\n\t var that = this;\n\t var element = that.element;\n\t var formId = element.attr(\"form\");\n\t var form = formId ? $(\"#\" + formId) : element.closest(\"form\");\n\n\t if (form[0]) {\n\t that._resetHandler = function() {\n\t setTimeout(function() {\n\t that.value(element[0].value);\n\t });\n\t };\n\n\t that._submitHandler = function() {\n\t that.element[0].value = that._old = that.raw();\n\t };\n\n\t if (that.options.unmaskOnPost) {\n\t form.on(\"submit\", that._submitHandler);\n\t }\n\n\t that._formElement = form.on(\"reset\", that._resetHandler);\n\t }\n\t },\n\n\t _keydown: function(e) {\n\t var key = e.keyCode;\n\n\t this.__backward = key === keys.BACKSPACE;\n\n\t if (key === keys.ENTER) {\n\t this._change();\n\t }\n\t },\n\n\t _drop: function() {\n\t this.__dropping = true;\n\t },\n\n\t _find: function(idx, backward) {\n\t var value = this.element.val() || this._emptyMask;\n\t var step = 1;\n\n\t if (backward === true) {\n\t step = -1;\n\t }\n\n\t while (idx > -1 || idx <= this._maskLength) {\n\t if (value.charAt(idx) !== this.tokens[idx]) {\n\t return idx;\n\t }\n\n\t idx += step;\n\t }\n\n\t return -1;\n\t },\n\n\t _mask: function(start, end, value, backward) {\n\t var element = this.element[0];\n\t var current = element.value || this._emptyMask;\n\t var empty = this.options.promptChar;\n\t var valueLength;\n\t var chrIdx = 0;\n\t var unmasked;\n\t var chr;\n\t var idx;\n\n\t start = this._find(start, backward);\n\n\t if (start > end) {\n\t end = start;\n\t }\n\n\t unmasked = this._unmask(current.substring(end), end);\n\t value = this._unmask(value, start);\n\t valueLength = value.length;\n\n\t if (value) {\n\t unmasked = unmasked.replace(new RegExp(\"^_{0,\" + valueLength + \"}\"), \"\");\n\t }\n\n\t value += unmasked;\n\t current = current.split(\"\");\n\t chr = value.charAt(chrIdx);\n\n\t while (start < this._maskLength) {\n\t current[start] = chr || empty;\n\t chr = value.charAt(++chrIdx);\n\n\t if (idx === undefined && chrIdx > valueLength) {\n\t idx = start;\n\t }\n\n\t start = this._find(start + 1);\n\t }\n\n\t element.value = this._old = current.join(\"\");\n\n\t if (kendo._activeElement() === element) {\n\t if (idx === undefined) {\n\t idx = this._maskLength;\n\t }\n\n\t caret(element, idx);\n\t }\n\n\t return idx;\n\t },\n\n\t _unmask: function(value, idx) {\n\t if (!value) {\n\t return \"\";\n\t }\n\n\t if (this._unmaskedValue === value) {\n\t return this._unmaskedValue;\n\t }\n\t value = (value + \"\").split(\"\");\n\n\t var chr;\n\t var token;\n\t var chrIdx = 0;\n\t var tokenIdx = idx || 0;\n\n\t var empty = this.options.promptChar;\n\n\t var valueLength = value.length;\n\t var tokensLength = this.tokens.length;\n\n\t var result = \"\";\n\n\t while (tokenIdx < tokensLength) {\n\t chr = value[chrIdx];\n\t token = this.tokens[tokenIdx];\n\n\t if (chr === token || chr === empty) {\n\t result += chr === empty ? empty : \"\";\n\n\t chrIdx += 1;\n\t tokenIdx += 1;\n\t } else if (typeof token !== \"string\") {\n\t if ((token && token.test && token.test(chr)) || ($.isFunction(token) && token(chr))) {\n\t result += chr;\n\t tokenIdx += 1;\n\t } else {\n\t if (valueLength === 1) {\n\t this._blinkInvalidState();\n\t }\n\t }\n\n\t chrIdx += 1;\n\t } else {\n\t tokenIdx += 1;\n\t }\n\n\t if (chrIdx >= valueLength) {\n\t break;\n\t }\n\t }\n\t this._unmaskedValue = result;\n\t return result;\n\t },\n\n\t _label: function() {\n\t var that = this;\n\t var element = that.element;\n\t var options = that.options;\n\t var id = element.attr(\"id\");\n\t var floating;\n\t var labelText;\n\n\t if (options.label !== null) {\n\t floating = isPlainObject(options.label) ? options.label.floating : false;\n\t labelText = isPlainObject(options.label) ? options.label.content : options.label;\n\n\t if (floating) {\n\t that._floatingLabelContainer = that.wrapper.wrap(\"
\").parent();\n\t that.floatingLabel = new kendo.ui.FloatingLabel(that._floatingLabelContainer, { widget: that });\n\t }\n\n\t if (kendo.isFunction(labelText)) {\n\t labelText = labelText.call(that);\n\t }\n\n\t if (!labelText) {\n\t labelText = \"\";\n\t }\n\n\t if (!id) {\n\t id = options.name + \"_\" + kendo.guid();\n\t element.attr(\"id\", id);\n\t }\n\n\t that._inputLabel = $(\"
'\").insertBefore(that.wrapper);\n\t }\n\t },\n\n\t _wrapper: function () {\n\t var that = this;\n\t var element = that.element;\n\t var DOMElement = element[0];\n\n\t var wrapper = element.wrap(\"
\").parent();\n\t wrapper[0].style.cssText = DOMElement.style.cssText;\n\t DOMElement.style.width = \"100%\";\n\t that.wrapper = wrapper.addClass(DOMElement.className).removeClass('input-validation-error');\n\t },\n\n\t _blinkInvalidState: function () {\n\t var that = this;\n\n\t that.wrapper.addClass(STATEINVALID);\n\t clearTimeout(that._invalidStateTimeout);\n\t that._invalidStateTimeout = setTimeout(proxy(that._removeInvalidState, that), 100);\n\t },\n\n\t _removeInvalidState: function () {\n\t var that = this;\n\n\t that.wrapper.removeClass(STATEINVALID);\n\t that._invalidStateTimeout = null;\n\t },\n\n\t _tokenize: function() {\n\t var tokens = [];\n\t var tokenIdx = 0;\n\n\t var mask = this.options.mask || \"\";\n\t var maskChars = mask.split(\"\");\n\t var length = maskChars.length;\n\t var idx = 0;\n\t var chr;\n\t var rule;\n\n\t var emptyMask = \"\";\n\t var promptChar = this.options.promptChar;\n\t var numberFormat = kendo.getCulture(this.options.culture).numberFormat;\n\t var rules = this._rules;\n\n\t for (; idx < length; idx++) {\n\t chr = maskChars[idx];\n\t rule = rules[chr];\n\n\t if (rule) {\n\t tokens[tokenIdx] = rule;\n\t emptyMask += promptChar;\n\t tokenIdx += 1;\n\t } else {\n\t if (chr === \".\" || chr === \",\") {\n\t chr = numberFormat[chr];\n\t } else if (chr === \"$\") {\n\t chr = numberFormat.currency.symbol;\n\t } else if (chr === \"\\\\\") {\n\t idx += 1;\n\t chr = maskChars[idx];\n\t }\n\n\t chr = chr.split(\"\");\n\n\t for (var i = 0, l = chr.length; i < l; i++) {\n\t tokens[tokenIdx] = chr[i];\n\t emptyMask += chr[i];\n\t tokenIdx += 1;\n\t }\n\t }\n\t }\n\n\t this.tokens = tokens;\n\n\t this._emptyMask = emptyMask;\n\t this._maskLength = emptyMask.length;\n\t }\n\t });\n\n\t function escapeRegExp(text) {\n\t return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n\t }\n\n\t ui.plugin(MaskedTextBox);\n\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ }),\n\n/***/ 1296:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.floatinglabel\");\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1299);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1059:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.data\");\n\n/***/ }),\n\n/***/ 1089:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.popup\");\n\n/***/ }),\n\n/***/ 1299:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1089), __webpack_require__(1059) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"menu\",\n\t name: \"Menu\",\n\t category: \"web\",\n\t description: \"The Menu widget displays hierarchical data as a multi-level menu.\",\n\t depends: [ \"popup\", \"data\", \"data.odata\" ]\n\t};\n\n\t(function ($, undefined) {\n\t var kendo = window.kendo,\n\t ui = kendo.ui,\n\t activeElement = kendo._activeElement,\n\t touch = (kendo.support.touch && kendo.support.mobileOS),\n\t isArray = $.isArray,\n\t HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n\t MOUSEDOWN = \"mousedown\",\n\t CLICK = \"click\",\n\t DELAY = 30,\n\t SCROLLSPEED = 50,\n\t extend = $.extend,\n\t proxy = $.proxy,\n\t each = $.each,\n\t template = kendo.template,\n\t keys = kendo.keys,\n\t Widget = ui.Widget,\n\t excludedNodesRegExp = /^(ul|a|div)$/i,\n\t NS = \".kendoMenu\",\n\t IMG = \"img\",\n\t OPEN = \"open\",\n\t MENU = \"k-menu\",\n\t LINK = \"k-link k-menu-link\",\n\t LINK_SELECTOR = \".k-link\",\n\t ICON_SELECTOR = \".k-menu-expand-arrow\",\n\t LAST = \"k-last\",\n\t CLOSE = \"close\",\n\t TIMER = \"timer\",\n\t FIRST = \"k-first\",\n\t IMAGE = \"k-image\",\n\t SELECT = \"select\",\n\t ZINDEX = \"zIndex\",\n\t ACTIVATE = \"activate\",\n\t DEACTIVATE = \"deactivate\",\n\t POINTERDOWN = \"touchstart\" + NS + \" MSPointerDown\" + NS + \" pointerdown\" + NS,\n\t pointers = kendo.support.pointers,\n\t msPointers = kendo.support.msPointers,\n\t allPointers = msPointers || pointers,\n\t CHANGE = \"change\",\n\t ERROR = \"error\",\n\t TOUCHSTART = kendo.support.touch ? \"touchstart\" : \"\",\n\t MOUSEENTER = pointers ? \"pointerover\" : (msPointers ? \"MSPointerOver\" : \"mouseenter\"),\n\t MOUSELEAVE = pointers ? \"pointerout\" : (msPointers ? \"MSPointerOut\" : \"mouseleave\"),\n\t MOUSEWHEEL = \"DOMMouseScroll\" + NS + \" mousewheel\" + NS,\n\t RESIZE = kendo.support.resize + NS,\n\t SCROLLWIDTH = \"scrollWidth\",\n\t SCROLLHEIGHT = \"scrollHeight\",\n\t OFFSETWIDTH = \"offsetWidth\",\n\t OFFSETHEIGHT = \"offsetHeight\",\n\t POPUP_ID_ATTR = \"group\",\n\t POPUP_OPENER_ATTR = \"groupparent\",\n\t DOCUMENT_ELEMENT = $(document.documentElement),\n\t KENDOPOPUP = \"kendoPopup\",\n\t DEFAULTSTATE = \"k-state-default\",\n\t HOVERSTATE = \"k-state-hover\",\n\t FOCUSEDSTATE = \"k-state-focused\",\n\t DISABLEDSTATE = \"k-state-disabled\",\n\t SELECTEDSTATE = \"k-state-selected\",\n\t menuSelector = \".k-menu\",\n\t groupSelector = \".k-menu-group\",\n\t animationContainerSelector = \".k-animation-container\",\n\t popupSelector = groupSelector + \",\" + animationContainerSelector,\n\t allItemsSelector = \":not(.k-list) > .k-item\",\n\t disabledSelector = \".k-item.k-state-disabled\",\n\t itemSelector = \".k-item\",\n\t availableItemsSelector = \".k-item:not(.k-state-disabled)\",\n\t linkSelector = \".k-item:not(.k-state-disabled) > .k-link\",\n\t exclusionSelector = \":not(.k-item.k-separator)\",\n\t nextSelector = itemSelector + exclusionSelector + \":eq(0)\",\n\t lastSelector = itemSelector + exclusionSelector + \":last\",\n\t templateSelector = \"div:not(.k-animation-container,.k-list-container)\",\n\t scrollButtonSelector = \".k-menu-scroll-button\",\n\t touchPointerTypes = { \"2\": 1, \"touch\": 1 },\n\t STRING = \"string\",\n\t DATABOUND = \"dataBound\",\n\n\t bindings = {\n\t text: \"dataTextField\",\n\t url: \"dataUrlField\",\n\t spriteCssClass: \"dataSpriteCssClassField\",\n\t imageUrl: \"dataImageUrlField\",\n\t imageAttr: \"dataImageAttrField\",\n\t content: \"dataContentField\"\n\t },\n\n\t rendering = {\n\t wrapperCssClass: function(group, item) {\n\t var result = \"k-item k-menu-item\",\n\t index = item.index;\n\n\t if (item.enabled === false) {\n\t result += \" k-state-disabled\";\n\t } else {\n\t result += \" k-state-default\";\n\t }\n\n\t if (group.firstLevel && index === 0) {\n\t result += \" k-first\";\n\t }\n\n\t if (index == group.length - 1) {\n\t result += \" k-last\";\n\t }\n\n\t if (item.cssClass) {\n\t result += \" \" + item.cssClass;\n\t }\n\n\t if (item.attr && item.attr.hasOwnProperty(\"class\")) {\n\t result += \" \" + item.attr[\"class\"];\n\t }\n\n\t if (item.selected) {\n\t result += \" \" + SELECTEDSTATE;\n\t }\n\n\t return result;\n\t },\n\n\t itemCssAttributes: function (item) {\n\t var result = \"\";\n\t var attributes = item.attr || {};\n\n\t for (var attr in attributes) {\n\t if(attributes.hasOwnProperty(attr) && attr !== \"class\") {\n\t result += attr + \"=\\\"\" + attributes[attr] + \"\\\" \";\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t imageCssAttributes: function (imgAttributes) {\n\t var result = \"\";\n\t var attributes = imgAttributes && imgAttributes.toJSON ? imgAttributes.toJSON() : {};\n\n\t if (!attributes['class']) {\n\t attributes['class'] = IMAGE;\n\t } else {\n\t attributes['class'] += \" \" + IMAGE;\n\t }\n\n\t for (var attr in attributes) {\n\t if(attributes.hasOwnProperty(attr)) {\n\t result += attr + \"=\\\"\" + attributes[attr] + \"\\\" \";\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t contentCssAttributes: function (item) {\n\t var result = \"\";\n\t var attributes = item.contentAttr || {};\n\t var defaultClasses = \"k-content k-group k-menu-group\";\n\n\t if (!attributes['class']) {\n\t attributes['class'] = defaultClasses;\n\t } else {\n\t attributes['class'] += \" \" + defaultClasses;\n\t }\n\n\t for (var attr in attributes) {\n\t if(attributes.hasOwnProperty(attr)) {\n\t result += attr + \"=\\\"\" + attributes[attr] + \"\\\" \";\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t textClass: function() {\n\t return LINK;\n\t },\n\n\t arrowClass: function(item, group) {\n\t var result = \"k-menu-expand-arrow k-icon\";\n\n\t if (group.horizontal) {\n\t result += \" k-i-arrow-60-down\";\n\t } else {\n\t result += \" k-i-arrow-60-right\";\n\t }\n\n\t return result;\n\t },\n\n\t groupAttributes: function(group) {\n\t return group.expanded !== true ? \" style='display:none'\" : \"\";\n\t },\n\n\t groupCssClass: function() {\n\t return \"k-group k-menu-group\";\n\t },\n\n\t content: function(item) {\n\t return item.content ? item.content : \" \";\n\t }\n\t };\n\n\t function getEffectDirection(direction, root) {\n\t direction = direction.split(\" \")[!root+0] || direction;\n\t return direction.replace(\"top\", \"up\").replace(\"bottom\", \"down\");\n\t }\n\n\t function parseDirection(direction, root, isRtl) {\n\t direction = direction.split(\" \")[!root+0] || direction;\n\t var output = { origin: [\"bottom\", (isRtl ? \"right\" : \"left\")], position: [\"top\", (isRtl ? \"right\" : \"left\")] },\n\t horizontal = /left|right/.test(direction);\n\n\t if (horizontal) {\n\t output.origin = [ \"top\", direction ];\n\t output.position[1] = kendo.directions[direction].reverse;\n\t } else {\n\t output.origin[0] = direction;\n\t output.position[0] = kendo.directions[direction].reverse;\n\t }\n\n\t output.origin = output.origin.join(\" \");\n\t output.position = output.position.join(\" \");\n\n\t return output;\n\t }\n\n\t function contains(parent, child) {\n\t try {\n\t return $.contains(parent, child);\n\t } catch (e) {\n\t return false;\n\t }\n\t }\n\n\t function updateItemClasses(item) {\n\t item = $(item);\n\t var omitWrap = item.attr(kendo.attr(\"omit-wrap\"));\n\n\t if (omitWrap) {\n\t return;\n\t }\n\n\t item.addClass(\"k-item k-menu-item\")\n\t .children(IMG)\n\t .addClass(IMAGE);\n\n\t item\n\t .children(\"a\")\n\t .addClass(LINK)\n\t .children(IMG)\n\t .addClass(IMAGE);\n\n\t item\n\t .filter(\":not([disabled])\")\n\t .addClass(DEFAULTSTATE);\n\n\t item\n\t .filter(\".k-separator\")\n\t .removeClass(\"k-menu-item\")\n\t .addClass(\"k-menu-separator\")\n\t .empty()\n\t .append(\" \");\n\n\t item\n\t .filter(\"li[disabled]\")\n\t .addClass(DISABLEDSTATE)\n\t .removeAttr(\"disabled\")\n\t .attr(\"aria-disabled\", true);\n\n\t if (!item.filter(\"[role]\").length) {\n\t item.attr(\"role\", \"menuitem\");\n\t }\n\n\t if (!item.children(LINK_SELECTOR).length) {\n\t item\n\t .contents() // exclude groups, real links, templates and empty text nodes\n\t .filter(function() { return (!this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !kendo.trim(this.nodeValue))); })\n\t .wrapAll(\"
\");\n\t }\n\n\t updateArrow(item);\n\t updateFirstLast(item);\n\t }\n\n\t function updateArrow(item) {\n\t item = $(item);\n\n\t item.find(\"> .k-link > [class*=k-i-arrow-60]:not(.k-sprite)\").remove();\n\n\t item.filter(\":has(.k-menu-group)\")\n\t .children(\".k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))\")\n\t .each(function () {\n\t var item = $(this),\n\t arrowCssClass = getArrowCssClass(item);\n\n\t item.append(\"
\");\n\t });\n\t }\n\n\t function getArrowCssClass(item) {\n\t var arrowCssClass,\n\t parent = item.parent().parent(),\n\t isRtl = kendo.support.isRtl(parent);\n\n\t if (parent.hasClass(MENU + \"-horizontal\")) {\n\t arrowCssClass = \"k-i-arrow-60-down\";\n\t } else {\n\t if (isRtl) {\n\t arrowCssClass = \"k-i-arrow-60-left\";\n\t }\n\t else {\n\t arrowCssClass = \"k-i-arrow-60-right\";\n\t }\n\t }\n\t return arrowCssClass;\n\t }\n\n\t function updateFirstLast (item) {\n\t item = $(item);\n\n\t item.filter(\".k-first:not(:first-child)\").removeClass(FIRST);\n\t item.filter(\".k-last:not(:last-child)\").removeClass(LAST);\n\t item.filter(\":first-child\").addClass(FIRST);\n\t item.filter(\":last-child\").addClass(LAST);\n\t }\n\n\t function updateHasAriaPopup (parents) {\n\t if (parents && parents.length) {\n\t for (var index in parents) {\n\t var parentLi = parents.eq(index);\n\t if (parentLi.find(\"ul\").length) {\n\t parentLi.attr(\"aria-haspopup\", true);\n\t } else {\n\t parentLi.removeAttr(\"aria-haspopup\");\n\t }\n\t }\n\t }\n\t }\n\n\t function getParentLiItems(group) {\n\t if (!group.hasClass(MENU)) {\n\t return group.parentsUntil(\".\" + MENU, \"li\");\n\t }\n\t }\n\n\t function storeItemSelectEventHandler (element, options) {\n\t var selectHandler = getItemSelectEventHandler(options);\n\t if(selectHandler) {\n\t setItemData(element, selectHandler);\n\t }\n\n\t if (options.items) {\n\t $(element).children(\"ul\").children(\"li\").each(function(i){\n\t storeItemSelectEventHandler(this, options.items[i]);\n\t });\n\t }\n\t }\n\n\t function setItemData (element, selectHandler) {\n\t $(element).children(\".k-link\").data({\n\t selectHandler : selectHandler\n\t });\n\t }\n\n\t function getItemSelectEventHandler (options) {\n\t var selectHandler = options.select,\n\t isFunction = kendo.isFunction;\n\n\t if (selectHandler && isFunction(selectHandler)) {\n\t return selectHandler;\n\t }\n\t return null;\n\t }\n\n\t function popupOpenerSelector(id){\n\t return id ? \"li[data-groupparent='\" + id + \"']\" : \"li[data-groupparent]\";\n\t }\n\t function popupGroupSelector(id) {\n\t var selector = id ? \"[data-group='\" + id + \"']\" : \"[data-group]\";\n\t return \"ul\" + selector + \",div\" + selector;\n\t }\n\t function getChildPopups (currentPopup, overflowWrapper) {\n\t var childPopupOpener = currentPopup.find(popupOpenerSelector());\n\t var result = [];\n\t childPopupOpener.each(function(i, opener){\n\t opener = $(opener);\n\t var popupId = opener.data(POPUP_OPENER_ATTR);\n\t var popup = currentPopup;\n\t while(popupId) {\n\t popup = overflowWrapper.find(popupGroupSelector(popupId) + \":visible\");\n\t if (popup.length) {\n\t result.push(popup);\n\t }\n\t opener = popup.find(popupOpenerSelector());\n\t popupId = opener.data(POPUP_OPENER_ATTR);\n\t }\n\t });\n\n\t return result;\n\t }\n\n\t function popupParentItem(popupElement, overflowWrapper) {\n\t var popupId = popupElement.data(POPUP_ID_ATTR);\n\t return popupId ? overflowWrapper.find(popupOpenerSelector(popupId)) : $([]);\n\t }\n\n\t function itemPopup(item, overflowWrapper) {\n\t var popupId = item.data(POPUP_OPENER_ATTR);\n\t return popupId ? overflowWrapper.children(animationContainerSelector).children(popupGroupSelector(popupId)) : $([]);\n\t }\n\n\t function overflowMenuParents(current, overflowWrapper) {\n\t var parents = [];\n\t var getParents = function(item){\n\t while (item.parentNode && !overflowWrapper.is(item.parentNode)) {\n\t parents.push(item.parentNode);\n\t item = item.parentNode;\n\t }\n\t };\n\t var elem = current[0] || current;\n\t getParents(elem);\n\t var last = parents[parents.length - 1];\n\t while($(last).is(animationContainerSelector)){\n\t var popupElement = $(last).children(\"ul\");\n\t elem = popupParentItem(popupElement, overflowWrapper)[0];\n\t if (!elem) {\n\t break;\n\t }\n\t parents.push(elem);\n\t getParents(elem);\n\t last = parents[parents.length - 1];\n\t }\n\t return parents;\n\t }\n\n\t function mousewheelDelta(e) {\n\t var delta = 0;\n\n\t if (e.wheelDelta) {\n\t delta = -e.wheelDelta / 120;\n\t delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t }\n\n\t if (e.detail) {\n\t delta = Math.round(e.detail / 3);\n\t }\n\n\t return delta;\n\t }\n\n\t function parentsScroll(current, scrollDirection) {\n\t var scroll = 0;\n\t var parent = current.parentNode;\n\t while(parent && !isNaN(parent[scrollDirection])) {\n\t scroll += parent[scrollDirection];\n\t parent = parent.parentNode;\n\t }\n\t return scroll;\n\t }\n\n\t function isPointerTouch(e){\n\t return allPointers && e.originalEvent && e.originalEvent.pointerType in touchPointerTypes;\n\t }\n\n\t function isTouch(e){\n\t var ev = e.originalEvent;\n\t return touch && /touch/i.test(ev.type || \"\");\n\t }\n\n\t function removeSpacesBetweenItems(ul){\n\t ul.contents().filter(function(){ return this.nodeName != \"LI\"; }).remove();\n\t }\n\n\t var Menu = kendo.ui.DataBoundWidget.extend({\n\t init: function(element, options) {\n\t var that = this;\n\n\t Widget.fn.init.call(that, element, options);\n\n\t element = that.wrapper = that.element;\n\t options = that.options;\n\t that._accessors();\n\t that._templates();\n\t that._dataSource();\n\n\t that._updateClasses();\n\n\t that._animations(options);\n\n\t that.nextItemZIndex = 100;\n\n\t that._tabindex();\n\n\t that._initOverflow(options);\n\n\t that._attachMenuEventsHandlers();\n\n\t if (options.openOnClick) {\n\t that.clicked = false;\n\t }\n\n\t element.attr(\"role\", \"menubar\");\n\n\t if (element[0].id) {\n\t that._ariaId = kendo.format(\"{0}_mn_active\", element[0].id);\n\t }\n\n\t kendo.notify(that);\n\t },\n\n\t events: [\n\t OPEN,\n\t CLOSE,\n\t ACTIVATE,\n\t DEACTIVATE,\n\t SELECT,\n\t DATABOUND\n\t ],\n\n\t options: {\n\t name: \"Menu\",\n\t animation: {\n\t open: {\n\t duration: 200\n\t },\n\t close: { // if close animation effects are defined, they will be used instead of open.reverse\n\t duration: 100\n\t }\n\t },\n\t orientation: \"horizontal\",\n\t direction: \"default\",\n\t openOnClick: false,\n\t closeOnClick: true,\n\t hoverDelay: 100,\n\t scrollable: false,\n\t popupCollision: undefined\n\t },\n\n\t _initData: function() {\n\t var that = this;\n\n\t if (that.dataSource) {\n\t that.angular(\"cleanup\", function(){\n\t return {\n\t elements: that.element.children()\n\t };\n\t });\n\t that.element.empty();\n\n\t that.append(that.dataSource.view(), that.element);\n\t that.angular(\"compile\", function(){\n\t return {\n\t elements: that.element.children()\n\t };\n\t });\n\t }\n\t },\n\n\t _attachMenuEventsHandlers: function() {\n\t var that = this;\n\t var element = that.element;\n\t var options = that.options;\n\t var overflowWrapper = that._overflowWrapper();\n\n\t (overflowWrapper || element).on(POINTERDOWN, itemSelector, proxy(that._focusHandler, that))\n\t .on(CLICK + NS, disabledSelector, false)\n\t .on(CLICK + NS, itemSelector, proxy(that._click , that))\n\t .on(POINTERDOWN + \" \" + MOUSEDOWN + NS, \".k-content\", proxy(that._preventClose, that))\n\t .on(MOUSEENTER + NS, availableItemsSelector, proxy(that._mouseenter, that))\n\t .on(MOUSELEAVE + NS, availableItemsSelector, proxy(that._mouseleave, that))\n\t .on(MOUSEDOWN + NS, availableItemsSelector, proxy(that._mousedown, that))\n\t .on(TOUCHSTART + NS + \" \" + MOUSEENTER + NS + \" \" + MOUSELEAVE + NS + \" \" +\n\t MOUSEDOWN + NS + \" \" + CLICK + NS, linkSelector, proxy(that._toggleHover, that));\n\n\t element.on(\"keydown\" + NS, proxy(that._keydown, that))\n\t .on(\"focus\" + NS, proxy(that._focus, that))\n\t .on(\"focus\" + NS, \".k-content\", proxy(that._focus, that))\n\t .on(\"blur\" + NS, proxy(that._removeHoverItem, that))\n\t .on(\"blur\" + NS, \"[tabindex]\", proxy(that._checkActiveElement, that));\n\n\t if (overflowWrapper) {\n\t overflowWrapper\n\t .on(MOUSELEAVE + NS, popupSelector, proxy(that._mouseleavePopup, that))\n\t .on(MOUSEENTER + NS, popupSelector, proxy(that._mouseenterPopup, that));\n\t }\n\n\t if (options.openOnClick) {\n\t that._documentClickHandler = proxy(that._documentClick, that);\n\t $(document).click(that._documentClickHandler);\n\t }\n\t },\n\n\t _detachMenuEventsHandlers: function() {\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\n\t if (overflowWrapper) {\n\t overflowWrapper.off(NS);\n\t }\n\n\t that.element.off(NS);\n\n\t if (that._documentClickHandler) {\n\t $(document).unbind(\"click\", that._documentClickHandler);\n\t }\n\t },\n\n\t _initOverflow: function(options) {\n\t var that = this;\n\t var isHorizontal = options.orientation == \"horizontal\";\n\t var backwardBtn, forwardBtn;\n\n\t if (options.scrollable) {\n\t that._openedPopups = {};\n\t that._scrollWrapper = that.element.wrap(\"\").parent();\n\t if (isHorizontal) {\n\t removeSpacesBetweenItems(that.element);\n\t }\n\n\t backwardBtn = $(that.templates.scrollButton({direction: isHorizontal ? \"left\" : \"up\"}));\n\t forwardBtn = $(that.templates.scrollButton({direction: isHorizontal ? \"right\": \"down\"}));\n\t backwardBtn.add(forwardBtn).appendTo(that._scrollWrapper);\n\n\t that._initScrolling(that.element, backwardBtn, forwardBtn, isHorizontal);\n\n\t var initialWidth = that.element.outerWidth();\n\t var initialCssWidth = that.element[0].style.width;\n\t initialCssWidth = initialCssWidth === \"auto\" ? \"\" : initialCssWidth;\n\n\t if (isHorizontal) {\n\t $(window).on(RESIZE, kendo.throttle(function(){\n\t that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n\t that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n\t }, 100));\n\t }\n\n\t that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n\t that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n\t }\n\t },\n\n\t _overflowWrapper: function(){\n\t return this._scrollWrapper || this._popupsWrapper;\n\t },\n\n\t _setOverflowWrapperWidth: function(initialWidth, initialCssWidth) {\n\t var that = this;\n\t var wrapperCssWidth = that._scrollWrapper.css(\"width\");\n\n\t that._scrollWrapper.css({width: \"\"});\n\t var wrapperWidth = that._scrollWrapper.outerWidth();\n\t that._scrollWrapper.css({ width: wrapperCssWidth });\n\n\t var menuWidth = that.element.outerWidth();\n\t var borders = that.element[0].offsetWidth - that.element[0].clientWidth;\n\n\t if (menuWidth != wrapperWidth && wrapperWidth > 0) {\n\t var width = initialCssWidth ? Math.min(initialWidth, wrapperWidth) : wrapperWidth;\n\t that.element.width(width - borders);\n\t that._scrollWrapper.width(width);\n\t }\n\t },\n\n\t _reinitOverflow: function(options) {\n\t var that = this;\n\t var overflowChanged = ((options.scrollable && !that.options.scrollable) || (!options.scrollable && that.options.scrollable)) ||\n\t (options.scrollable && that.options.scrollable && options.scrollable.distance != that.options.scrollable.distance) ||\n\t options.orientation != that.options.orientation;\n\n\t if (overflowChanged) {\n\t that._detachMenuEventsHandlers();\n\t that._destroyOverflow();\n\t that._initOverflow(options);\n\t that._attachMenuEventsHandlers();\n\t }\n\t },\n\n\t _destroyOverflow: function() {\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\t if(overflowWrapper) {\n\t overflowWrapper.off(NS);\n\t overflowWrapper.find(scrollButtonSelector).off(NS).remove();\n\t overflowWrapper.children(animationContainerSelector).each(function(i, popupWrapper){\n\t var ul = $(popupWrapper).children(groupSelector);\n\t ul.off(MOUSEWHEEL);\n\t var popupParentLi = popupParentItem(ul, overflowWrapper);\n\t if (popupParentLi.length) {\n\t popupParentLi.append(popupWrapper);\n\t }\n\t });\n\n\t overflowWrapper.find(popupOpenerSelector()).removeAttr(\"data-groupparent\");\n\t overflowWrapper.find(popupGroupSelector()).removeAttr(\"data-group\");\n\t that.element.off(MOUSEWHEEL);\n\t $(window).off(RESIZE);\n\t overflowWrapper.contents().unwrap();\n\n\t that._scrollWrapper = that._popupsWrapper = that._openedPopups = undefined;\n\t }\n\t },\n\n\t _initScrolling: function(scrollElement, backwardBtn, forwardBtn, isHorizontal) {\n\t var that = this;\n\t var scrollable = that.options.scrollable;\n\t var distance = $.isNumeric(scrollable.distance) ? scrollable.distance : SCROLLSPEED;\n\t var mouseWheelDistance = distance / 2;\n\t var backward = \"-=\" + distance;\n\t var forward = \"+=\" + distance;\n\t var backwardDouble = \"-=\" + distance * 2;\n\t var forwardDouble = \"+=\" + distance * 2;\n\t var scrolling = false;\n\t var touchEvents = false;\n\n\t var scroll = function(value) {\n\t var scrollValue = isHorizontal ? {\"scrollLeft\": value} : { \"scrollTop\": value };\n\t scrollElement.finish().animate(scrollValue, \"fast\", \"linear\", function () {\n\t if (scrolling) {\n\t scroll(value);\n\t }\n\t });\n\t that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n\t };\n\n\t var mouseenterHandler = function(e) {\n\t if (!scrolling && !touchEvents) {\n\t scroll(e.data.direction);\n\t scrolling = true;\n\t }\n\t };\n\n\t var mousedownHandler = function(e) {\n\t var scrollValue = isHorizontal ? {\"scrollLeft\": e.data.direction} : { \"scrollTop\": e.data.direction };\n\t touchEvents = isTouch(e) || isPointerTouch(e);\n\t scrollElement.stop().animate(scrollValue, \"fast\", \"linear\", function(){\n\t if (!touchEvents) {\n\t $(e.currentTarget).trigger(MOUSEENTER);\n\t } else {\n\t that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n\t scrolling = true;\n\t }\n\t });\n\t scrolling = false;\n\n\t e.stopPropagation();\n\t e.preventDefault();\n\t };\n\n\t backwardBtn.on(MOUSEENTER + NS, {direction: backward}, mouseenterHandler)\n\t .on(kendo.eventMap.down + NS, {direction: backwardDouble}, mousedownHandler);\n\n\t forwardBtn.on(MOUSEENTER + NS, {direction: forward}, mouseenterHandler)\n\t .on(kendo.eventMap.down + NS, {direction: forwardDouble}, mousedownHandler);\n\n\t backwardBtn.add(forwardBtn)\n\t .on(MOUSELEAVE + NS, function() {\n\t scrollElement.stop();\n\t scrolling = false;\n\t that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n\t });\n\n\t scrollElement.on(MOUSEWHEEL, function(e){\n\t if (!e.ctrlKey && !e.shiftKey && !e.altKey) {\n\t var wheelDelta = mousewheelDelta(e.originalEvent);\n\t var scrollSpeed = Math.abs(wheelDelta) * mouseWheelDistance;\n\t var value = (wheelDelta > 0 ? \"+=\" : \"-=\") + scrollSpeed;\n\t var scrollValue = isHorizontal ? {\"scrollLeft\": value} : {\"scrollTop\": value };\n\n\t that._closeChildPopups(scrollElement);\n\n\t scrollElement.finish().animate(scrollValue, \"fast\", \"linear\", function(){\n\t that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n\t });\n\t e.preventDefault();\n\t }\n\t });\n\t },\n\n\t _toggleScrollButtons: function(scrollElement, backwardBtn, forwardBtn, horizontal) {\n\t var currentScroll = horizontal ? kendo.scrollLeft(scrollElement) : scrollElement.scrollTop();\n\t var scrollSize = horizontal ? SCROLLWIDTH : SCROLLHEIGHT;\n\t var offset = horizontal ? OFFSETWIDTH : OFFSETHEIGHT;\n\n\t backwardBtn.toggle(currentScroll !== 0);\n\t forwardBtn.toggle(currentScroll < scrollElement[0][scrollSize] - scrollElement[0][offset] - 1);\n\t },\n\n\t setOptions: function(options) {\n\t var animation = this.options.animation;\n\n\t this._animations(options);\n\n\t options.animation = extend(true, animation, options.animation);\n\n\t if (\"dataSource\" in options) {\n\t this._dataSource(options);\n\t }\n\n\t this._updateClasses();\n\t this._reinitOverflow(options);\n\n\t Widget.fn.setOptions.call(this, options);\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\n\t Widget.fn.destroy.call(that);\n\n\t that._detachMenuEventsHandlers();\n\n\t that._destroyOverflow();\n\n\t kendo.destroy(that.element);\n\t },\n\n\t enable: function (element, enable) {\n\t this._toggleDisabled(element, enable !== false);\n\n\t return this;\n\t },\n\n\t disable: function (element) {\n\t this._toggleDisabled(element, false);\n\n\t return this;\n\t },\n\n\t attemptGetItem: function (candidate) {\n\t candidate = candidate || this.element;\n\t var item = this.element.find(candidate);\n\t var overflowWrapper = this._overflowWrapper();\n\n\t if (item.length || candidate === this.element){\n\t return item;\n\t } else if (overflowWrapper) {\n\t return overflowWrapper.find(candidate);\n\t } else {\n\t return $();\n\t }\n\t },\n\n\t append: function (item, referenceItem) {\n\t referenceItem = this.attemptGetItem(referenceItem);\n\n\t var inserted = this._insert(item, referenceItem, referenceItem.length ? this._childPopupElement(referenceItem) : null);\n\n\t each(inserted.items, function (i) {\n\t inserted.group.append(this);\n\t updateArrow(this);\n\t storeItemSelectEventHandler(this, item[i] || item);\n\t });\n\n\t updateArrow(referenceItem);\n\t updateFirstLast(inserted.group.find(\".k-first, .k-last\").add(inserted.items));\n\t updateHasAriaPopup(getParentLiItems(inserted.group));\n\n\t return this;\n\t },\n\n\t insertBefore: function (item, referenceItem) {\n\t referenceItem = this.attemptGetItem(referenceItem);\n\n\t var inserted = this._insert(item, referenceItem, referenceItem.parent());\n\n\t each(inserted.items, function (i) {\n\t referenceItem.before(this);\n\t updateArrow(this);\n\t updateFirstLast(this);\n\t storeItemSelectEventHandler(this, item[i] || item);\n\t });\n\n\t updateFirstLast(referenceItem);\n\n\t return this;\n\t },\n\n\t insertAfter: function (item, referenceItem) {\n\t referenceItem = this.attemptGetItem(referenceItem);\n\n\t var inserted = this._insert(item, referenceItem, referenceItem.parent());\n\n\t each(inserted.items, function (i) {\n\t referenceItem.after(this);\n\t updateArrow(this);\n\t updateFirstLast(this);\n\t storeItemSelectEventHandler(this, item[i] || item);\n\t });\n\n\t updateFirstLast(referenceItem);\n\n\t return this;\n\t },\n\n\t _insert: function (item, referenceItem, parent) {\n\t var that = this,\n\t items, groups;\n\n\t if (!referenceItem || !referenceItem.length) {\n\t parent = that.element;\n\t }\n\n\t var plain = $.isPlainObject(item) || item instanceof kendo.data.ObservableObject,\n\t groupData = {\n\t firstLevel: parent.hasClass(MENU),\n\t horizontal: parent.hasClass(MENU + \"-horizontal\"),\n\t expanded: true,\n\t length: parent.children().length\n\t };\n\n\t if (referenceItem && !parent.length) {\n\t parent = $(that.renderGroup({ group: groupData, options: that.options })).appendTo(referenceItem);\n\t }\n\n\t if (plain || isArray(item) || item instanceof kendo.data.ObservableArray) { // is JSON\n\t items = $($.map(plain ? [ item ] : item, function (value, idx) {\n\t if (typeof value === \"string\") {\n\t return $(value).get();\n\t } else {\n\t return $(that.renderItem({\n\t group: groupData,\n\t item: extend(value, { index: idx })\n\t })).get();\n\t }\n\t }));\n\t } else {\n\t if (typeof item == \"string\" && item.charAt(0) != \"<\") {\n\t items = that.element.find(item);\n\t } else {\n\t items = $(item);\n\t }\n\n\t groups = items.find(\"> ul\")\n\t .addClass(\"k-menu-group\")\n\t .attr(\"role\", \"menu\");\n\n\t items = items.filter(\"li\");\n\n\t items.add(groups.find(\"> li\")).each(function () {\n\t updateItemClasses(this);\n\t });\n\t }\n\n\t return { items: items, group: parent };\n\t },\n\n\t remove: function (element) {\n\t element = this.attemptGetItem(element);\n\n\t var that = this,\n\t parent = element.parentsUntil(that.element, allItemsSelector),\n\t group = element.parent(\"ul:not(.k-menu)\");\n\n\t element.remove();\n\n\t if (group && !group.children(allItemsSelector).length) {\n\t var parentItems = getParentLiItems(group);\n\n\t var container = group.parent(animationContainerSelector);\n\n\t if (container.length) {\n\t container.remove();\n\t } else {\n\t group.remove();\n\t }\n\n\t updateHasAriaPopup(parentItems);\n\t }\n\n\t if (parent.length) {\n\t parent = parent.eq(0);\n\n\t updateArrow(parent);\n\t updateFirstLast(parent);\n\t }\n\n\t return that;\n\t },\n\n\t _openAfterLoad: function (element, dataItem) {\n\t var that = this;\n\t if(dataItem.loaded()) {\n\t that.open(element);\n\t that._loading = false;\n\t } else {\n\t dataItem.one(CHANGE, function(){\n\t element.find(ICON_SELECTOR).removeClass(\"k-i-loading\");\n\t if(that._loading) {\n\t that.open(element);\n\t that._loading = false;\n\t }\n\t });\n\t }\n\t },\n\n\t open: function (element) {\n\t var that = this;\n\t var options = that.options;\n\t var horizontal = options.orientation == \"horizontal\";\n\t var direction = options.direction;\n\t var isRtl = kendo.support.isRtl(that.wrapper);\n\t var overflowWrapper = that._overflowWrapper();\n\t element = (overflowWrapper || that.element).find(element);\n\n\t var dataItem = that.dataSource && that.dataSource.getByUid(element.data(kendo.ns + \"uid\"));\n\n\t if(dataItem && dataItem.hasChildren && !dataItem.loaded() && !that._loading){\n\t that._loading = true;\n\t element.find(ICON_SELECTOR).addClass(\"k-i-loading\");\n\t dataItem.load();\n\t that._openAfterLoad(element, dataItem);\n\t return;\n\t }\n\n\t if (/^(top|bottom|default)$/.test(direction)) {\n\t if (isRtl) {\n\t direction = horizontal ? (direction + \" left\").replace(\"default\", \"bottom\") : \"left\";\n\t } else {\n\t direction = horizontal ? (direction + \" right\").replace(\"default\", \"bottom\") : \"right\";\n\t }\n\t }\n\n\t var visiblePopups = \">.k-popup:visible,>.k-animation-container>.k-popup:visible\";\n\t var closePopup = function () {\n\t var popup = $(this).data(KENDOPOPUP);\n\t if (popup) {\n\t // Use the built-in close method to play the hoverDelay from the options\n\t that.close($(this).closest(\"li.k-item\"), true);\n\t }\n\t };\n\n\t element.siblings()\n\t .find(visiblePopups)\n\t .each(closePopup);\n\n\t if (overflowWrapper) {\n\t element.find(visiblePopups).each(closePopup);\n\t }\n\n\t if (that.options.openOnClick) {\n\t that.clicked = true;\n\t }\n\n\t element.each(function () {\n\t var li = $(this);\n\n\t clearTimeout(li.data(TIMER));\n\n\t li.data(TIMER, setTimeout(function () {\n\t var ul = li.find(\".k-menu-group:first:hidden\");\n\t var popup;\n\t var overflowPopup;\n\n\t if (!ul[0] && overflowWrapper) {\n\t overflowPopup = that._getPopup(li);\n\t ul = overflowPopup && overflowPopup.element;\n\t }\n\t if (ul.is(\":visible\")) {\n\t return;\n\t }\n\n\t if (ul[0] && that._triggerEvent({ item: li[0], type: OPEN }) === false) {\n\n\t if (!ul.find(\".k-menu-group\")[0] && ul.children(\".k-item\").length > 1) {\n\t var windowHeight = $(window).height(),\n\t setScrolling = function(){\n\t ul.css({maxHeight: windowHeight - (kendo._outerHeight(ul) - ul.height()) - kendo.getShadows(ul).bottom, overflow: \"auto\"});\n\t };\n\n\t setScrolling();\n\t } else {\n\t ul.css({maxHeight: \"\", overflow: \"\"});\n\t }\n\n\t li.data(ZINDEX, li.css(ZINDEX));\n\t var nextZindex = that.nextItemZIndex++;\n\t li.css(ZINDEX, nextZindex);\n\n\t if (that.options.scrollable) {\n\t li.parent().siblings(scrollButtonSelector).css({zIndex: ++nextZindex});\n\t }\n\n\t popup = ul.data(KENDOPOPUP);\n\t var root = li.parent().hasClass(MENU),\n\t parentHorizontal = root && horizontal,\n\t directions = parseDirection(direction, root, isRtl),\n\t effects = options.animation.open.effects,\n\t openEffects = effects !== undefined ? effects : \"slideIn:\" + getEffectDirection(direction, root);\n\n\t if (!popup) {\n\t popup = ul.kendoPopup({\n\t activate: function() { that._triggerEvent({ item: this.wrapper.parent(), type: ACTIVATE }); },\n\t deactivate: function(e) {\n\t that._closing = false;\n\t e.sender.element // Restore opacity after fade.\n\t .removeData(\"targetTransform\")\n\t .css({ opacity: \"\" });\n\t that._triggerEvent({ item: this.wrapper.parent(), type: DEACTIVATE });\n\t },\n\t origin: directions.origin,\n\t position: directions.position,\n\t collision: options.popupCollision !== undefined ? options.popupCollision : (parentHorizontal ? \"fit\" : \"fit flip\"),\n\t anchor: li,\n\t appendTo: overflowWrapper || li,\n\t animation: {\n\t open: extend(true, { effects: openEffects }, options.animation.open),\n\t close: options.animation.close\n\t },\n\t open: proxy(that._popupOpen, that),\n\t close: function (e) {\n\t that._closing = true;\n\t var li = e.sender.wrapper.parent();\n\n\t if (overflowWrapper) {\n\t var popupId = e.sender.element.data(POPUP_ID_ATTR);\n\t if (popupId) {\n\t li = (overflowWrapper || that.element).find(popupOpenerSelector(popupId));\n\t }\n\t e.sender.wrapper.children(scrollButtonSelector).hide();\n\t }\n\n\t if (!that._triggerEvent({ item: li[0], type: CLOSE })) {\n\t li.css(ZINDEX, li.data(ZINDEX));\n\t li.removeData(ZINDEX);\n\n\t if (that.options.scrollable) {\n\t li.parent().siblings(scrollButtonSelector).css({zIndex: \"\"});\n\t }\n\n\t if (touch || allPointers || kendo.support.mouseAndTouchPresent) {\n\t li.removeClass(HOVERSTATE);\n\t that._removeHoverItem();\n\t }\n\t } else {\n\t e.preventDefault();\n\t }\n\t }\n\t }).data(KENDOPOPUP);\n\t } else {\n\t popup = ul.data(KENDOPOPUP);\n\t popup.options.origin = directions.origin;\n\t popup.options.position = directions.position;\n\t popup.options.animation.open.effects = openEffects;\n\t }\n\t ul.removeAttr(\"aria-hidden\");\n\n\t that._configurePopupOverflow(popup, li);\n\n\t popup._hovered = true;\n\t popup.open();\n\n\t that._initPopupScrolling(popup);\n\t }\n\n\t }, that.options.hoverDelay));\n\t });\n\n\t return that;\n\t },\n\n\t _configurePopupOverflow: function(popup, popupOpener) {\n\t var that = this;\n\t if (that.options.scrollable) {\n\t that._wrapPopupElement(popup);\n\t if (!popupOpener.attr(\"data-groupparent\")) {\n\t var groupId = new Date().getTime();\n\t popupOpener.attr(\"data-groupparent\", groupId);\n\t popup.element.attr(\"data-group\", groupId);\n\t }\n\t }\n\t },\n\n\t _wrapPopupElement: function(popup){\n\t if (!popup.element.parent().is(animationContainerSelector)) {\n\t popup.wrapper = kendo.wrap(popup.element, popup.options.autosize)\n\t .css({\n\t overflow: \"hidden\",\n\t display: \"block\",\n\t position: \"absolute\"\n\t });\n\t }\n\t },\n\n\t _initPopupScrolling: function(popup, isHorizontal, skipMouseEvents) {\n\t var that = this;\n\n\t if (that.options.scrollable && popup.element[0].scrollHeight > popup.element[0].offsetHeight) {\n\t that._initPopupScrollButtons(popup, isHorizontal, skipMouseEvents);\n\t }\n\t },\n\n\t _initPopupScrollButtons: function(popup, isHorizontal, skipMouseEvents) {\n\t var that = this;\n\t var scrollButtons = popup.wrapper.children(scrollButtonSelector);\n\t var animation = that.options.animation;\n\t var timeout = ((animation && animation.open && animation.open.duration) || 0) + DELAY;\n\t setTimeout(function() {\n\t if (!scrollButtons.length) {\n\t var backwardBtn = $(that.templates.scrollButton({direction: isHorizontal ? \"left\" : \"up\"}));\n\t var forwardBtn = $(that.templates.scrollButton({direction: isHorizontal ? \"right\": \"down\"}));\n\n\t scrollButtons = backwardBtn.add(forwardBtn).appendTo(popup.wrapper);\n\n\t that._initScrolling(popup.element, backwardBtn, forwardBtn, isHorizontal);\n\t if (!skipMouseEvents) {\n\t scrollButtons.on(MOUSEENTER + NS, function() {\n\t var overflowWrapper = that._overflowWrapper();\n\t $(getChildPopups(popup.element, overflowWrapper)).each(function(i, p){\n\t var popupOpener = overflowWrapper.find(popupOpenerSelector(p.data(POPUP_ID_ATTR)));\n\t that.close(popupOpener);\n\t });\n\t })\n\t .on(MOUSELEAVE + NS, function(){\n\t setTimeout(function(){\n\t if ($.isEmptyObject(that._openedPopups)) {\n\t that._closeParentPopups(popup.element);\n\t }\n\t }, DELAY);\n\t });\n\t }\n\t }\n\t that._toggleScrollButtons(popup.element, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n\t }, timeout);\n\t },\n\n\t _popupOpen: function(e) {\n\t if (!this._keyTriggered) {\n\t e.sender.element.children(\".\" + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n\t }\n\t if (this.options.scrollable) {\n\t this._setPopupHeight(e.sender);\n\t }\n\t },\n\n\t _setPopupHeight: function(popup, isFixed){\n\t var popupElement = popup.element;\n\t var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n\n\t popups.height((popupElement.hasClass(MENU) && this._initialHeight) || \"\");\n\n\t var location = popup._location(isFixed);\n\t var windowHeight = $(window).height();\n\t var popupOuterHeight = location.height;\n\t var popupOffsetTop = isFixed ? 0 : Math.max(location.top, 0);\n\t var scrollTop = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], \"scrollTop\");\n\t var bottomScrollbar = window.innerHeight - windowHeight;\n\t var maxHeight = windowHeight - kendo.getShadows(popupElement).bottom + bottomScrollbar;\n\t var canFit = maxHeight + scrollTop > popupOuterHeight + popupOffsetTop;\n\n\t if (!canFit) {\n\t var height = Math.min(maxHeight, maxHeight - popupOffsetTop + scrollTop);\n\t popups.css({overflow: \"hidden\", height: height + \"px\"});\n\t }\n\t },\n\n\t close: function (items, dontClearClose) {\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\t var element = (overflowWrapper || that.element);\n\n\t items = element.find(items);\n\n\t if (!items.length) {\n\t items = element.find(\">.k-item\");\n\t }\n\n\t var hasChildPopupsHovered = function(currentPopup){\n\t var result = false;\n\t if ($.isEmptyObject(that._openedPopups)) {\n\t return result;\n\t }\n\t $(getChildPopups(currentPopup, overflowWrapper)).each(function(i, popup){\n\t result = !!that._openedPopups[popup.data(POPUP_ID_ATTR).toString()];\n\t return !result;\n\t });\n\t return result;\n\t };\n\n\t var isPopupMouseLeaved = function(opener) {\n\t var groupId = opener.data(POPUP_OPENER_ATTR);\n\t return (!overflowWrapper || !groupId || !that._openedPopups[groupId.toString()]);\n\t };\n\n\t items.each(function () {\n\t var li = $(this);\n\n\t if (!dontClearClose && that._isRootItem(li)) {\n\t that.clicked = false;\n\t }\n\n\t clearTimeout(li.data(TIMER));\n\n\t li.data(TIMER, setTimeout(function () {\n\t var popup = that._getPopup(li);\n\t if (popup && (isPopupMouseLeaved(li) || that._forceClose)) {\n\t if (!that._forceClose && hasChildPopupsHovered(popup.element)) {\n\t return;\n\t }\n\n\t popup.close();\n\t popup.element.attr(\"aria-hidden\", true);\n\n\t if (overflowWrapper) {\n\t if (that._forceClose && items.last().is(li[0])) {\n\t delete that._forceClose;\n\t }\n\t }\n\t }\n\t }, that.options.hoverDelay));\n\t });\n\n\t return that;\n\t },\n\n\t _getPopup: function(li) {\n\t var that = this;\n\t var popup = li.find(\".k-menu-group:not(.k-list-container):not(.k-calendar-container):first:visible\").data(KENDOPOPUP);\n\t var overflowWrapper = that._overflowWrapper();\n\n\t if (!popup && overflowWrapper) {\n\t var groupId = li.data(POPUP_OPENER_ATTR);\n\t if (groupId) {\n\t var popupElement = overflowWrapper.find(popupGroupSelector(groupId));\n\t popup = popupElement.data(KENDOPOPUP);\n\t }\n\t }\n\t return popup;\n\t },\n\n\t _toggleDisabled: function (items, enable) {\n\t this.element.find(items).each(function () {\n\t $(this)\n\t .toggleClass(DEFAULTSTATE, enable)\n\t .toggleClass(DISABLEDSTATE, !enable)\n\t .attr(\"aria-disabled\", !enable);\n\t });\n\t },\n\n\t _toggleHover: function(e) {\n\t var target = $(kendo.eventTarget(e) || e.target).closest(allItemsSelector),\n\t isEnter = e.type == MOUSEENTER || MOUSEDOWN.indexOf(e.type) !== -1;\n\n\t target.siblings().removeClass(HOVERSTATE);\n\n\t if (!target.parents(\"li.\" + DISABLEDSTATE).length) {\n\t target.toggleClass(HOVERSTATE, isEnter || e.type == \"mousedown\" || e.type == \"pointerover\" || e.type == TOUCHSTART);\n\t }\n\n\t this._removeHoverItem();\n\t },\n\n\t _preventClose: function() {\n\t if (!this.options.closeOnClick) {\n\t this._closurePrevented = true;\n\t }\n\t },\n\n\t _checkActiveElement: function(e) {\n\t var that = this,\n\t hoverItem = $(e ? e.currentTarget : this._hoverItem()),\n\t target = that._findRootParent(hoverItem)[0];\n\n\t if (!this._closurePrevented) {\n\t setTimeout(function() {\n\t if (!document.hasFocus() || (!contains(target, kendo._activeElement()) && e && !contains(target, e.currentTarget))) {\n\t that.close(target);\n\t }\n\t }, 0);\n\t }\n\n\t this._closurePrevented = false;\n\t },\n\n\t _removeHoverItem: function() {\n\t var oldHoverItem = this._hoverItem();\n\n\t if (oldHoverItem && oldHoverItem.hasClass(FOCUSEDSTATE)) {\n\t oldHoverItem.removeClass(FOCUSEDSTATE);\n\t this._oldHoverItem = null;\n\t }\n\t },\n\n\t _updateClasses: function() {\n\t var element = this.element,\n\t nonContentGroupsSelector = \".k-menu-init div ul\",\n\t items;\n\n\t element.removeClass(\"k-menu-horizontal k-menu-vertical\");\n\t element.addClass(\"k-widget k-reset k-header k-menu-init \" + MENU).addClass(MENU + \"-\" + this.options.orientation);\n\n\t element.find(\"li > ul\")\n\t .filter(function() {\n\t return !kendo.support.matchesSelector.call(this, nonContentGroupsSelector);\n\t })\n\t .addClass(\"k-group k-menu-group\")\n\t .attr(\"role\", \"menu\")\n\t .attr(\"aria-hidden\", element.is(\":visible\"))\n\t .parent(\"li\")\n\t .attr(\"aria-haspopup\", \"true\")\n\t .end()\n\t .find(\"li > div\")\n\t .addClass(\"k-content\")\n\t .attr(\"tabindex\", \"-1\"); // Capture the focus before the Menu\n\n\t items = element.find(\"> li,.k-menu-group > li\");\n\n\t element.removeClass(\"k-menu-init\");\n\n\t items.each(function () {\n\t updateItemClasses(this);\n\t });\n\t },\n\n\t _mouseenter: function (e) {\n\t var that = this;\n\t var element = $(e.currentTarget);\n\t var hasChildren = that._itemHasChildren(element);\n\t var popupId = element.data(POPUP_OPENER_ATTR) || element.parent().data(POPUP_ID_ATTR);\n\t var pointerTouch = isPointerTouch(e);\n\n\t if (popupId) {\n\t that._openedPopups[popupId.toString()] = true;\n\t }\n\n\t if (that._closing || (e.delegateTarget != element.parents(menuSelector)[0] && e.delegateTarget != element.parents(\".k-menu-scroll-wrapper,.k-popups-wrapper\")[0])) {\n\t return;\n\t }\n\n\t that._keyTriggered = false;\n\n\t if ((that.options.openOnClick.rootMenuItems && that._isRootItem(element.closest(allItemsSelector))) ||\n\t (that.options.openOnClick.subMenuItems && !that._isRootItem(element.closest(allItemsSelector)))) {\n\t return;\n\t }\n\n\t if ((that.options.openOnClick === false ||\n\t (that.options.openOnClick.rootMenuItems === false && that._isRootItem(element.closest(allItemsSelector))) ||\n\t (that.options.openOnClick.subMenuItems === false && !that._isRootItem(element.closest(allItemsSelector))) || that.clicked) && !touch &&\n\t !(pointerTouch && that._isRootItem(element.closest(allItemsSelector)))) {\n\t if (!contains(e.currentTarget, e.relatedTarget) && hasChildren) {\n\t that.open(element);\n\t }\n\t }\n\n\t if (that.options.openOnClick === true && that.clicked || touch) {\n\t element.siblings().each(proxy(function (_, sibling) {\n\t that.close(sibling, true);\n\t }, that));\n\t }\n\t },\n\n\t _mousedown: function (e) {\n\t var that = this;\n\t var element = $(e.currentTarget);\n\t // needs to close subMenuItems\n\t if (that.options.openOnClick.subMenuItems && !that._isRootItem(element) || touch) {\n\t element.siblings().each(proxy(function (_, sibling) {\n\t that.close(sibling, true);\n\t }, that));\n\t }\n\t },\n\n\t _mouseleave: function (e) {\n\t var that = this;\n\t var element = $(e.currentTarget);\n\t var popupOpener = element.data(POPUP_OPENER_ATTR);\n\t var hasChildren = (element.children(animationContainerSelector).length || element.children(groupSelector).length) || popupOpener;\n\t var $window = $(window);\n\n\t if (popupOpener) {\n\t delete that._openedPopups[popupOpener.toString()];\n\t }\n\n\t if (element.parentsUntil(animationContainerSelector, \".k-list-container,.k-calendar-container\")[0]) {\n\t e.stopImmediatePropagation();\n\t return;\n\t }\n\n\t if ((that.options.openOnClick === false || (!that.options.openOnClick.rootMenuItems && that._isRootItem(element)) ||\n\t (!that.options.openOnClick.subMenuItems && !that._isRootItem(element))) && !touch && !isPointerTouch(e) &&\n\t !contains(e.currentTarget, e.relatedTarget || e.target) && hasChildren &&\n\t !contains(e.currentTarget, kendo._activeElement())) {\n\t that.close(element, true);\n\t that._loading = false;\n\t return;\n\t }\n\n\t // Detect if cursor goes outside the viewport of the browser\n\t if( (kendo.support.browser.msie && !e.toElement && !e.relatedTarget && !isPointerTouch(e)) ||\n\t e.clientX < 0 || e.clientY < 0 ||\n\t e.clientY > $window.height() ||\n\t e.clientX > $window.width()){\n\t that.close(element);\n\t }\n\t },\n\n\t _mouseenterPopup: function(e){\n\t var that = this;\n\t var popupElement = $(e.currentTarget);\n\n\t if (popupElement.parent().is(animationContainerSelector)) {\n\t return;\n\t }\n\n\t popupElement = popupElement.children(\"ul\");\n\t var popupId = popupElement.data(POPUP_ID_ATTR);\n\n\t if (popupId) {\n\t that._openedPopups[popupId.toString()] = true;\n\t }\n\t },\n\n\t _mouseleavePopup: function (e) {\n\t var that = this;\n\t var popupElement = $(e.currentTarget);\n\n\t if (!isPointerTouch(e) && popupElement.is(animationContainerSelector)) {\n\t that._closePopups(popupElement.children(\"ul\"));\n\t }\n\t },\n\n\t _closePopups: function(rootPopup) {\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\t var popupId = rootPopup.data(POPUP_ID_ATTR);\n\n\t if (popupId) {\n\t delete that._openedPopups[popupId.toString()];\n\t var groupParent = overflowWrapper.find(popupOpenerSelector(popupId));\n\n\t setTimeout(function() {\n\t if (that.options.openOnClick) {\n\t that._closeChildPopups(rootPopup);\n\t } else {\n\t if ($.isEmptyObject(that._openedPopups)) {\n\t var innerPopup = that._innerPopup(rootPopup);\n\t that._closeParentPopups(innerPopup);\n\t } else {\n\t that.close(groupParent, true);\n\t }\n\t }\n\t }, 0);\n\t }\n\t },\n\n\t _closeChildPopups: function(current){\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\t $(getChildPopups(current, overflowWrapper)).each(function(){\n\t var popupOpener = overflowWrapper.find(popupOpenerSelector(this.data(POPUP_ID_ATTR)));\n\t that.close(popupOpener, true);\n\t });\n\t },\n\n\t _innerPopup: function(current) {\n\t var overflowWrapper = this._overflowWrapper();\n\t var popups = getChildPopups(current, overflowWrapper);\n\t return popups[popups.length - 1] || current;\n\t },\n\n\t _closeParentPopups: function (current) {\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\t var popupId = current.data(POPUP_ID_ATTR);\n\t var popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n\t popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n\t that.close(popupOpener, true);\n\t while (popupId && !that._openedPopups[popupId]) {\n\t if (popupOpener.parent().is(menuSelector)) {\n\t break;\n\t }\n\t popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n\t that.close(popupOpener, true);\n\t popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n\t }\n\t },\n\n\t _click: function (e) {\n\t var that = this, openHandle,\n\t options = that.options,\n\t target = $(kendo.eventTarget(e)),\n\t targetElement = target[0],\n\t nodeName = target[0] ? target[0].nodeName.toUpperCase() : \"\",\n\t formNode = (nodeName == \"INPUT\" || nodeName == \"SELECT\" || nodeName == \"BUTTON\" || nodeName == \"LABEL\"),\n\t link = target.closest(LINK_SELECTOR),\n\t element = target.closest(allItemsSelector),\n\t itemElement = element[0],\n\t href = link.attr(\"href\"), childGroup, childGroupVisible,\n\t targetHref = target.attr(\"href\"),\n\t sampleHref = $(\"
\").attr(\"href\"),\n\t isLink = (!!href && href !== sampleHref),\n\t isLocalLink = isLink && !!href.match(/^#/),\n\t isTargetLink = (!!targetHref && targetHref !== sampleHref),\n\t overflowWrapper = that._overflowWrapper(),\n\t shouldCloseTheRootItem;\n\n\t if(targetElement && !targetElement.parentNode){\n\t return;\n\t }\n\n\t if($(target).hasClass('k-menu-expand-arrow')){\n\t this._lastClickedElement = targetElement.parentElement;\n\t }\n\n\t while (targetElement && targetElement.parentNode != itemElement) {\n\t targetElement = targetElement.parentNode;\n\t }\n\n\t if ($(targetElement).is(templateSelector)) {\n\t return;\n\t }\n\n\t if (element.hasClass(DISABLEDSTATE)) {\n\t e.preventDefault();\n\t return;\n\t }\n\n\t if (!e.handled && that._triggerSelect(target, itemElement) && !formNode) { // We shouldn't stop propagation and shoudn't prevent form elements.\n\t e.preventDefault();\n\t }\n\n\t e.handled = true;\n\n\t childGroup = element.children(popupSelector);\n\t if (overflowWrapper) {\n\t var childPopupId = element.data(POPUP_OPENER_ATTR);\n\t if (childPopupId) {\n\t childGroup = overflowWrapper.find(popupGroupSelector(childPopupId));\n\t }\n\t }\n\t childGroupVisible = childGroup.is(\":visible\");\n\t shouldCloseTheRootItem = options.openOnClick && childGroupVisible && that._isRootItem(element);\n\n\t if (options.closeOnClick && (!isLink || isLocalLink) && (!childGroup.length || shouldCloseTheRootItem)) {\n\t element.removeClass(HOVERSTATE).css(\"height\"); // Force refresh for Chrome\n\t that._oldHoverItem = that._findRootParent(element);\n\t var item = that._parentsUntil(link, that.element, allItemsSelector);\n\t that._forceClose = !!overflowWrapper;\n\t that.close(item);\n\t that.clicked = false;\n\t if (\"MSPointerUp\".indexOf(e.type) != -1) {\n\t e.preventDefault();\n\t }\n\t return;\n\t }\n\n\t if (isLink && e.enterKey) {\n\t link[0].click();\n\t }\n\n\t if (((!that._isRootItem(element) || options.openOnClick === false) && !options.openOnClick.subMenuItems) && !kendo.support.touch && !(isPointerTouch(e) && that._isRootItem(element.closest(allItemsSelector)))) {\n\t return;\n\t }\n\n\t if (!isLink && !formNode && !isTargetLink) {\n\t e.preventDefault();\n\t }\n\n\t that.clicked = true;\n\t openHandle = childGroup.is(\":visible\") ? CLOSE : OPEN;\n\t if (!options.closeOnClick && openHandle == CLOSE) {\n\t return;\n\t }\n\t that[openHandle](element);\n\t },\n\n\t _parentsUntil: function(context, top, selector) {\n\t var overflowWrapper = this._overflowWrapper();\n\t if (!overflowWrapper) {\n\t return context.parentsUntil(top, selector);\n\t } else {\n\t var parents = overflowMenuParents(context, overflowWrapper);\n\t var result = [];\n\t $(parents).each(function(){\n\t var parent = $(this);\n\t if (parent.is(top)) {\n\t return false;\n\t }\n\t if (parent.is(selector)) {\n\t result.push(this);\n\t }\n\t });\n\t return $(result);\n\t }\n\t },\n\n\t _triggerSelect: function (target, itemElement) {\n\t target = target.is(\".k-link\") ? target : target.closest(\".k-link\");\n\n\t var selectHandler = target.data(\"selectHandler\"),\n\t itemSelectEventData;\n\n\t if (selectHandler) {\n\t itemSelectEventData = this._getEventData(target);\n\t selectHandler.call(this, itemSelectEventData);\n\t }\n\n\t var isSelectItemDefaultPrevented = itemSelectEventData && itemSelectEventData.isDefaultPrevented();\n\t var isSelectDefaultPrevented = this._triggerEvent({ item: itemElement, type: SELECT });\n\t return isSelectItemDefaultPrevented || isSelectDefaultPrevented;\n\t },\n\n\t _getEventData: function (target) {\n\t var eventData = {\n\t sender: this,\n\t target: target,\n\t _defaultPrevented: false,\n\t preventDefault: function () {\n\t this._defaultPrevented = true;\n\t },\n\t isDefaultPrevented: function () {\n\t return this._defaultPrevented;\n\t }\n\t };\n\t return eventData;\n\t },\n\n\t _documentClick: function (e) {\n\t var that = this;\n\t var target = $(e.target).hasClass('k-menu-expand-arrow') ? that._lastClickedElement : e.target;\n\n\t if (contains((that._overflowWrapper() || that.element)[0], target)) {\n\t that._lastClickedElement = undefined;\n\t return;\n\t }\n\n\t that.clicked = false;\n\t },\n\n\t _focus: function (e) {\n\t var that = this,\n\t target = e.target,\n\t hoverItem = that._hoverItem(),\n\t active = activeElement();\n\n\t if (target != that.wrapper[0] && !$(target).is(\":kendoFocusable\")) {\n\t e.stopPropagation();\n\t $(target).closest(\".k-content\").closest(\".k-menu-group\").closest(\".k-item\").addClass(FOCUSEDSTATE);\n\t that.wrapper.focus();\n\t return;\n\t }\n\n\t if (active === e.currentTarget) {\n\t if (hoverItem.length) {\n\t that._moveHover([], hoverItem);\n\t } else if (!that._oldHoverItem) {\n\t that._moveHover([], that.wrapper.children().first());\n\t }\n\t }\n\t },\n\n\t _keydown: function (e) {\n\t var that = this,\n\t key = e.keyCode,\n\t hoverItem = that._oldHoverItem,\n\t target,\n\t belongsToVertical,\n\t hasChildren,\n\t isRtl = kendo.support.isRtl(that.wrapper);\n\n\t if (e.target != e.currentTarget && key != keys.ESC) {\n\t return;\n\t }\n\n\t if (!hoverItem) {\n\t hoverItem = that._oldHoverItem = that._hoverItem();\n\t }\n\n\t belongsToVertical = that._itemBelongsToVertival(hoverItem);\n\t hasChildren = that._itemHasChildren(hoverItem);\n\t that._keyTriggered = true;\n\n\t if (key == keys.RIGHT) {\n\t target = that[isRtl ? \"_itemLeft\" : \"_itemRight\"](hoverItem, belongsToVertical, hasChildren);\n\t } else if (key == keys.LEFT) {\n\t target = that[isRtl ? \"_itemRight\" : \"_itemLeft\"](hoverItem, belongsToVertical, hasChildren);\n\t } else if (key == keys.DOWN) {\n\t target = that._itemDown(hoverItem, belongsToVertical, hasChildren);\n\t } else if (key == keys.UP) {\n\t target = that._itemUp(hoverItem, belongsToVertical, hasChildren);\n\t } else if (key == keys.HOME) {\n\t that._moveHover(hoverItem, hoverItem.parent().children().first());\n\t e.preventDefault();\n\t } else if (key == keys.END) {\n\t that._moveHover(hoverItem, hoverItem.parent().children().last());\n\t e.preventDefault();\n\t } else if (key == keys.ESC) {\n\t target = that._itemEsc(hoverItem, belongsToVertical);\n\t } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n\t target = hoverItem.children(\".k-link\");\n\t if (target.length > 0) {\n\t that._click({ target: target[0], preventDefault: function () {}, enterKey: true });\n\t if (hasChildren && !hoverItem.hasClass(DISABLEDSTATE)) {\n\t that.open(hoverItem);\n\t that._moveHover(hoverItem, that._childPopupElement(hoverItem).children().first());\n\t } else {\n\t that._moveHover(hoverItem, that._findRootParent(hoverItem));\n\t }\n\t }\n\t } else if (key == keys.TAB) {\n\t target = that._findRootParent(hoverItem);\n\t that._moveHover(hoverItem, target);\n\t that._checkActiveElement();\n\t return;\n\t }\n\n\t if (target && target[0]) {\n\t e.preventDefault();\n\t e.stopPropagation(); // needed to handle ESC in column menu only when a root item is focused\n\t }\n\t },\n\n\t _hoverItem: function() {\n\t return this.wrapper.find(\".k-item.k-state-hover,.k-item.k-state-focused\").filter(\":visible\");\n\t },\n\n\t _itemBelongsToVertival: function (item) {\n\t var menuIsVertical = this.wrapper.hasClass(\"k-menu-vertical\");\n\n\t if (!item.length) {\n\t return menuIsVertical;\n\t }\n\t return item.parent().hasClass(\"k-menu-group\") || menuIsVertical;\n\t },\n\n\t _itemHasChildren: function (item) {\n\t if (!item || !item.length || !item[0].nodeType) {\n\t return false;\n\t }\n\t return item.children(\".k-menu-group, div.k-animation-container\").length > 0 ||\n\t (!!item.data(POPUP_OPENER_ATTR) && !!this._overflowWrapper().children(popupGroupSelector(item.data(POPUP_OPENER_ATTR))));\n\t },\n\n\t _moveHover: function (item, nextItem) {\n\t var that = this,\n\t id = that._ariaId;\n\n\t if (item.length && nextItem.length) {\n\t item.removeClass(FOCUSEDSTATE);\n\t }\n\n\t if (nextItem.length) {\n\t if (nextItem[0].id) {\n\t id = nextItem[0].id;\n\t }\n\n\t nextItem.addClass(FOCUSEDSTATE);\n\t that._oldHoverItem = nextItem;\n\n\t if (id) {\n\t that.element.removeAttr(\"aria-activedescendant\");\n\t $(\"#\" + id).removeAttr(\"id\");\n\t nextItem.attr(\"id\", id);\n\t that.element.attr(\"aria-activedescendant\", id);\n\t }\n\t that._scrollToItem(nextItem);\n\t }\n\t },\n\n\t _findRootParent: function (item) {\n\t if (this._isRootItem(item)) {\n\t return item;\n\t } else {\n\t return this._parentsUntil(item, menuSelector, \"li.k-item\").last();\n\t }\n\t },\n\n\t _isRootItem: function (item) {\n\t return item.parent().hasClass(MENU);\n\t },\n\n\t _itemRight: function (item, belongsToVertical, hasChildren) {\n\t var that = this,\n\t nextItem,\n\t parentItem,\n\t overflowWrapper;\n\n\t if (!belongsToVertical) {\n\t nextItem = item.nextAll(nextSelector);\n\t if (!nextItem.length) {\n\t nextItem = item.prevAll(lastSelector);\n\t }\n\t that.close(item);\n\t } else if (hasChildren && !item.hasClass(DISABLEDSTATE)) {\n\t that.open(item);\n\t nextItem = that._childPopupElement(item).children().first();\n\t } else if (that.options.orientation == \"horizontal\") {\n\t parentItem = that._findRootParent(item);\n\t overflowWrapper = that._overflowWrapper();\n\t if (overflowWrapper) {\n\t var rootPopup = itemPopup(parentItem, overflowWrapper);\n\t that._closeChildPopups(rootPopup);\n\t }\n\t that.close(parentItem);\n\t nextItem = parentItem.nextAll(nextSelector);\n\t }\n\n\t if (nextItem && !nextItem.length) {\n\t nextItem = that.wrapper.children(\".k-item\").first();\n\t } else if (!nextItem) {\n\t nextItem = [];\n\t }\n\n\t that._moveHover(item, nextItem);\n\t return nextItem;\n\t },\n\n\t _itemLeft: function (item, belongsToVertical) {\n\t var that = this,\n\t nextItem,\n\t overflowWrapper;\n\n\t if (!belongsToVertical) {\n\t nextItem = item.prevAll(nextSelector);\n\t if (!nextItem.length) {\n\t nextItem = item.nextAll(lastSelector);\n\t }\n\t that.close(item);\n\t } else {\n\t nextItem = item.parent().closest(\".k-item\");\n\t overflowWrapper = that._overflowWrapper();\n\t if (!nextItem.length && overflowWrapper) {\n\t nextItem = popupParentItem(item.parent(), overflowWrapper);\n\t }\n\t that.close(nextItem);\n\t if (that._isRootItem(nextItem) && that.options.orientation == \"horizontal\") {\n\t nextItem = nextItem.prevAll(nextSelector);\n\t }\n\t }\n\n\t if (!nextItem.length) {\n\t nextItem = that.wrapper.children(\".k-item\").last();\n\t }\n\n\t that._moveHover(item, nextItem);\n\t return nextItem;\n\t },\n\n\t _itemDown: function (item, belongsToVertical, hasChildren) {\n\t var that = this,\n\t nextItem;\n\n\t if (!belongsToVertical) {\n\t if (!hasChildren || item.hasClass(DISABLEDSTATE)) {\n\t return;\n\t } else {\n\t that.open(item);\n\t nextItem = that._childPopupElement(item).children().first();\n\t }\n\t } else {\n\t nextItem = item.nextAll(nextSelector);\n\t }\n\n\t if (!nextItem.length && item.length) {\n\t nextItem = item.parent().children().first();\n\t } else if (!item.length) {\n\t nextItem = that.wrapper.children(\".k-item\").first();\n\t }\n\n\t that._moveHover(item, nextItem);\n\t return nextItem;\n\t },\n\n\t _itemUp: function (item, belongsToVertical) {\n\t var that = this,\n\t nextItem;\n\n\t if (!belongsToVertical) {\n\t return;\n\t } else {\n\t nextItem = item.prevAll(nextSelector);\n\t }\n\n\t if (!nextItem.length && item.length) {\n\t nextItem = item.parent().children().last();\n\t } else if (!item.length) {\n\t nextItem = that.wrapper.children(\".k-item\").last();\n\t }\n\n\t that._moveHover(item, nextItem);\n\t return nextItem;\n\t },\n\n\t _scrollToItem: function(item){\n\t var that = this;\n\t if (that.options.scrollable && item && item.length) {\n\t var ul = item.parent();\n\t var isHorizontal = ul.hasClass(MENU) ? that.options.orientation == \"horizontal\" : false;\n\t var scrollDir = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n\t var getSize = isHorizontal ? kendo._outerWidth : kendo._outerHeight;\n\t var currentScrollOffset = ul[scrollDir]();\n\t var itemSize = getSize(item);\n\t var itemOffset = item[0][isHorizontal ? \"offsetLeft\" : \"offsetTop\"];\n\t var ulSize = getSize(ul);\n\t var scrollButtons = ul.siblings(scrollButtonSelector);\n\t var scrollButtonSize = scrollButtons.length ? getSize(scrollButtons.first()) : 0;\n\t var itemPosition;\n\n\t if (currentScrollOffset + ulSize < itemOffset + itemSize + scrollButtonSize) {\n\t itemPosition = itemOffset + itemSize - ulSize + scrollButtonSize;\n\t } else if (currentScrollOffset > itemOffset - scrollButtonSize) {\n\t itemPosition = itemOffset - scrollButtonSize;\n\t }\n\n\t if (!isNaN(itemPosition)) {\n\t var scrolling = {};\n\t scrolling[scrollDir] = itemPosition;\n\t ul.finish().animate(scrolling, \"fast\", \"linear\", function () {\n\t that._toggleScrollButtons(ul, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n\t });\n\t }\n\t }\n\t },\n\n\t _itemEsc: function (item, belongsToVertical) {\n\t var that = this,\n\t nextItem;\n\n\t if (!belongsToVertical) {\n\t return item;\n\t } else {\n\t nextItem = item.parent().closest(\".k-item\");\n\t that.close(nextItem);\n\t that._moveHover(item, nextItem);\n\t }\n\n\t return nextItem;\n\t },\n\n\t _childPopupElement: function(item) {\n\t var popupElement = item.find(\".k-menu-group\");\n\t var wrapper = this._overflowWrapper();\n\t if (!popupElement.length && wrapper) {\n\t popupElement = itemPopup(item, wrapper);\n\t }\n\t return popupElement;\n\t },\n\n\t _triggerEvent: function(e) {\n\t var that = this;\n\n\t return that.trigger(e.type, { type: e.type, item: e.item });\n\t },\n\n\t _focusHandler: function (e) {\n\t var that = this,\n\t item = $(kendo.eventTarget(e)).closest(allItemsSelector);\n\n\t if (item.hasClass(DISABLEDSTATE)) {\n\t return;\n\t }\n\n\t setTimeout(function () {\n\t that._moveHover([], item);\n\t if (item.children(\".k-content\")[0]) {\n\t item.parent().closest(\".k-item\").removeClass(FOCUSEDSTATE);\n\t }\n\t }, 200);\n\t },\n\n\t _animations: function(options) {\n\t if (options && (\"animation\" in options) && !options.animation) {\n\t options.animation = { open: { effects: {} }, close: { hide: true, effects: {} } };\n\t }\n\t },\n\t _dataSource: function(options) {\n\t var that = this,\n\t dataSource = options ? options.dataSource : that.options.dataSource;\n\n\t if (!dataSource) {\n\t return;\n\t }\n\n\t dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n\n\t that._unbindDataSource();\n\n\t if (!dataSource.fields) {\n\t dataSource.fields = [\n\t { field: \"uid\" },\n\t { field: \"text\" },\n\t { field: \"url\" },\n\t { field: \"cssClass\" },\n\t { field: \"spriteCssClass\" },\n\t { field: \"imageUrl\" },\n\t { field: \"imageAttr\" },\n\t { field: \"attr\" },\n\t { field: \"contentAttr\" },\n\t { field: \"content\" },\n\t { field: \"encoded\" },\n\t { field: \"items\" },\n\t { field: \"select\" }\n\t ];\n\t }\n\n\t that.dataSource = HierarchicalDataSource.create(dataSource);\n\n\t that._bindDataSource();\n\n\t that.dataSource.fetch();\n\t },\n\n\t _bindDataSource: function() {\n\t this._refreshHandler = proxy(this.refresh, this);\n\t this._errorHandler = proxy(this._error, this);\n\n\t this.dataSource.bind(CHANGE, this._refreshHandler);\n\t this.dataSource.bind(ERROR, this._errorHandler);\n\t },\n\n\t _unbindDataSource: function() {\n\t var dataSource = this.dataSource;\n\n\t if (dataSource) {\n\t dataSource.unbind(CHANGE, this._refreshHandler);\n\t dataSource.unbind(ERROR, this._errorHandler);\n\t }\n\t },\n\n\t _error: function () {\n\n\t },\n\n\t findByUid: function (uid) {\n\t var wrapperElement = this._overflowWrapper() || this.element;\n\t return wrapperElement.find(\"[\" + kendo.attr(\"uid\") + \"=\" + uid + \"]\");\n\t },\n\n\t refresh: function (ev) {\n\t var that = this;\n\t var node = ev.node;\n\t var action = ev.action;\n\t var parentElement = node ? that.findByUid(node.uid) : that.element;\n\t var itemsToUpdate = ev.items;\n\t var index = ev.index;\n\t var updateProxy = $.proxy(that._updateItem, that);\n\t var removeProxy = $.proxy(that._removeItem, that);\n\n\t if (action == \"add\") {\n\t that._appendItems(itemsToUpdate, index, parentElement);\n\t } else if (action == \"remove\") {\n\t itemsToUpdate.forEach(removeProxy);\n\t } else if (action == \"itemchange\") {\n\t itemsToUpdate.forEach(updateProxy);\n\t } else if (action === \"itemloaded\") {\n\t that.append(ev.items, parentElement);\n\t } else {\n\t this._initData();\n\t }\n\n\t this.trigger(DATABOUND, { item: parentElement, dataItem: node });\n\t },\n\n\t _appendItems: function(items, index, parent) {\n\t var that = this;\n\t var referenceItem = parent.find(itemSelector).eq(index);\n\n\t if(referenceItem.length){\n\t that.insertBefore(items, referenceItem);\n\t } else {\n\t that.append(items, parent);\n\t }\n\t },\n\n\t _removeItem: function(item) {\n\t var that = this;\n\t var element = that.findByUid(item.uid);\n\t that.remove(element);\n\t },\n\n\t _updateItem: function(item) {\n\t var that = this;\n\t var element = that.findByUid(item.uid);\n\t var nextElement = element.next();\n\t var parentNode = item.parentNode();\n\n\t that.remove(element);\n\n\t if(nextElement.length) {\n\t that.insertBefore(item, nextElement);\n\t } else {\n\t that.append(item, parentNode && that.findByUid(parentNode.uid));\n\t }\n\t },\n\n\t _accessors: function() {\n\t var that = this,\n\t options = that.options,\n\t i, field, textField,\n\t element = that.element;\n\n\t for (i in bindings) {\n\t field = options[bindings[i]];\n\t textField = element.attr(kendo.attr(i + \"-field\"));\n\n\t if (!field && textField) {\n\t field = textField;\n\t }\n\n\t if (!field) {\n\t field = i;\n\t }\n\n\t if (!isArray(field)) {\n\t field = [field];\n\t }\n\n\t options[bindings[i]] = field;\n\t }\n\t },\n\n\t _fieldAccessor: function(fieldName) {\n\t var fieldBindings = this.options[bindings[fieldName]] || [],\n\t count = fieldBindings.length,\n\t result = \"(function(item) {\";\n\n\t if (count === 0) {\n\t result += \"return item['\" + fieldName + \"'];\";\n\t } else {\n\t result += \"var levels = [\" +\n\t $.map(fieldBindings, function(x) {\n\t return \"function(d){ return \" + kendo.expr(x) + \"}\";\n\t }).join(\",\") + \"];\";\n\t result += \"if(item.level){return levels[Math.min(item.level(), \" + count + \"-1)](item);}else\";\n\t result += \"{return levels[\"+ count + \"-1](item)}\";\n\t }\n\n\t result += \"})\";\n\n\t return result;\n\t },\n\n\t _templates: function () {\n\t var that = this,\n\t options = that.options,\n\t fieldAccessor = proxy(that._fieldAccessor, that);\n\n\t if (options.template && typeof options.template == STRING) {\n\t options.template = template(options.template);\n\t } else if (!options.template) {\n\t options.template = template(\n\t \"# var text = \" + fieldAccessor(\"text\") + \"(data.item); #\" +\n\t \"# if (typeof data.item.encoded != 'undefined' && data.item.encoded === false) {#\" +\n\t \"#= text #\" +\n\t \"# } else { #\" +\n\t \"#: text #\" +\n\t \"# } #\"\n\t );\n\t }\n\n\t that.templates = {\n\t content: template(\n\t \"#var contentHtml = \" + fieldAccessor(\"content\") + \"(item);#\" +\n\t \"
#= contentHtml || '' #
\"\n\t ),\n\t group: template(\n\t \"
\" +\n\t \"#= renderItems(data) #\" +\n\t \"
\"\n\t ),\n\t itemWrapper: template(\n\t \"# var url = \" + fieldAccessor(\"url\") + \"(item); #\" +\n\t \"# var imageUrl = \" + fieldAccessor(\"imageUrl\") + \"(item); #\" +\n\t \"# var imgAttributes = \" + fieldAccessor(\"imageAttr\") + \"(item);#\" +\n\t \"# var tag = url ? 'a' : 'span' #\" +\n\t \"<#= tag # class='#= textClass(item) #' #if(url){#href='#= url #'#}#>\" +\n\n\t \"# if (imageUrl) { #\" +\n\t \"

\" +\n\t \"# } #\" +\n\n\t \"#= sprite(item) ##= data.menu.options.template(data) #\" +\n\t \"#= arrow(data) #\" +\n\t \"#= tag #>\"\n\t ),\n\t item: template(\n\t \"#var contentHtml = \" + fieldAccessor(\"content\") + \"(item);#\" +\n\t \"
\" +\n\t \"#= itemWrapper(data) #\" +\n\t \"#if (item.hasChildren || item.items) { #\" +\n\t \"#= subGroup({ items: item.items, menu: menu, group: { expanded: item.expanded } }) #\" +\n\t \"# } else if (item.content || item.contentUrl || contentHtml) { #\" +\n\t \"#= renderContent(data) #\" +\n\t \"# } #\" +\n\t \"\"\n\t ),\n\t scrollButton: template(\n\t \"\"\n\t ),\n\t arrow: template(\"
\"),\n\t sprite: template(\"# var spriteCssClass = \" + fieldAccessor(\"spriteCssClass\") + \"(data); if(spriteCssClass) {#
#}#\"),\n\t empty: template(\"\")\n\t };\n\t },\n\n\t renderItem: function (options) {\n\t var that = this;\n\t options = extend({ menu: that, group: {} }, options);\n\n\t var empty = that.templates.empty,\n\t item = options.item;\n\n\t return that.templates.item(extend(options, {\n\t sprite: that.templates.sprite,\n\t itemWrapper: that.templates.itemWrapper,\n\t renderContent: that.renderContent,\n\t arrow: item.items || item.content || item[that.options.dataContentField[0]] ? that.templates.arrow : empty,\n\t subGroup: that.renderGroup\n\t }, rendering));\n\t },\n\n\t renderGroup: function (options) {\n\t var that = this;\n\t var templates = that.templates || options.menu.templates;\n\n\t return templates.group(extend({\n\t renderItems: function(options) {\n\t var html = \"\",\n\t i = 0,\n\t items = options.items,\n\t len = items ? items.length : 0,\n\t group = extend({ length: len }, options.group);\n\n\t for (; i < len; i++) {\n\t html += options.menu.renderItem(extend(options, {\n\t group: group,\n\t item: extend({ index: i }, items[i])\n\t }));\n\t }\n\n\t return html;\n\t }\n\t }, options, rendering));\n\t },\n\n\t renderContent: function (options) {\n\t return options.menu.templates.content(extend(options, rendering));\n\t }\n\t });\n\n\t var ContextMenu = Menu.extend({\n\t init: function(element, options) {\n\t var that = this;\n\n\t Menu.fn.init.call(that, element, options);\n\n\t that._marker = kendo.guid().substring(0, 8);\n\n\t that.target = $(that.options.target);\n\n\t that._popup();\n\t that._wire();\n\t },\n\n\t _initOverflow: function(options){\n\t var that = this;\n\t if (options.scrollable && !that._overflowWrapper()) {\n\t that._openedPopups = {};\n\n\t that._popupsWrapper = (that.element.parent().is(animationContainerSelector) ? that.element.parent() : that.element)\n\t .wrap(\"\").parent();\n\n\t if (that.options.orientation == \"horizontal\") {\n\t removeSpacesBetweenItems(that.element);\n\t }\n\n\t if (options.appendTo) {\n\t options.appendTo = $(options.appendTo);\n\t options.appendTo.append(that._popupsWrapper);\n\t }\n\n\t that._initialHeight = that.element[0].style.height;\n\t that._initialWidth = that.element[0].style.width;\n\t }\n\t },\n\n\t options: {\n\t name: \"ContextMenu\",\n\t filter: null,\n\t showOn: \"contextmenu\",\n\t orientation: \"vertical\",\n\t alignToAnchor: false,\n\t copyAnchorStyles : true,\n\t target: \"body\"\n\t },\n\n\t events: [\n\t OPEN,\n\t CLOSE,\n\t ACTIVATE,\n\t DEACTIVATE,\n\t SELECT\n\t ],\n\n\t setOptions: function(options) {\n\t var that = this;\n\n\t Menu.fn.setOptions.call(that, options);\n\n\t that.target.off(that.showOn + NS + that._marker, that._showProxy);\n\n\t if (that.userEvents) {\n\t that.userEvents.destroy();\n\t }\n\n\t that.target = $(that.options.target);\n\t if (options.orientation && that.popup.wrapper[0]) {\n\t that.popup.element.unwrap();\n\t }\n\n\t that._wire();\n\n\t Menu.fn.setOptions.call(this, options);\n\t },\n\n\t destroy: function() {\n\t var that = this;\n\n\t that.target.off(that.options.showOn + NS + that._marker);\n\t DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n\n\t if (that.userEvents) {\n\t that.userEvents.destroy();\n\t }\n\n\t Menu.fn.destroy.call(that);\n\t },\n\n\t open: function(x, y) {\n\t var that = this;\n\n\t x = $(x)[0];\n\n\t if (contains(that.element[0], $(x)[0]) || that._itemHasChildren($(x))) { // call parent open for children elements\n\t Menu.fn.open.call(that, x);\n\t } else {\n\t if (that._triggerEvent({ item: that.element, type: OPEN }) === false) {\n\t if (that.popup.visible() && that.options.filter) {\n\t that.popup.close(true);\n\t that.popup.element.kendoStop(true);\n\t }\n\n\t if (y !== undefined) {\n\t var overflowWrapper = that._overflowWrapper();\n\t if (overflowWrapper) {\n\t var offset = overflowWrapper.offset();\n\t x -= offset.left;\n\t y -= offset.top;\n\t }\n\t that.popup.wrapper.hide();\n\t that._configurePopupScrolling(x, y);\n\t that.popup.open(x, y);\n\t } else {\n\t that.popup.options.anchor = (x ? x : that.popup.anchor) || that.target;\n\t that.popup.element.kendoStop(true);\n\t that._configurePopupScrolling();\n\t that.popup.open();\n\t }\n\n\t DOCUMENT_ELEMENT.off(that.popup.downEvent, that.popup._mousedownProxy);\n\t DOCUMENT_ELEMENT\n\t .on(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n\t }\n\t }\n\n\t return that;\n\t },\n\n\t _configurePopupScrolling: function(x, y){\n\t var that = this;\n\t var popup = that.popup;\n\t var isHorizontal = that.options.orientation == \"horizontal\";\n\n\t if (that.options.scrollable) {\n\t that._wrapPopupElement(popup);\n\n\t popup.element.parent().css({\n\t position: \"\",\n\t height: \"\"\n\t });\n\n\t popup.element.css({\n\t visibility: \"hidden\",\n\t display: \"\",\n\t position: \"\"\n\t });\n\n\t if (isHorizontal) {\n\t that._setPopupWidth(popup, isNaN(x) ? undefined : {isFixed: true, x: x, y: y});\n\t } else {\n\t that._setPopupHeight(popup, isNaN(x) ? undefined : {isFixed: true, x: x, y: y});\n\t }\n\n\t popup.element.css({\n\t visibility: \"\",\n\t display: \"none\",\n\t position: \"absolute\"\n\t });\n\n\t that._initPopupScrollButtons(popup, isHorizontal, true);\n\t popup.element.siblings(scrollButtonSelector).hide();\n\t }\n\t },\n\n\t _setPopupWidth: function(popup, isFixed){\n\t var popupElement = popup.element;\n\t var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n\n\t popups.width(this._initialWidth || \"\");\n\n\t var location = popup._location(isFixed);\n\t var windowWidth = $(window).width();\n\t var popupOuterWidth = location.width;\n\t var popupOffsetLeft = Math.max(location.left, 0);\n\t var scrollLeft = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], \"scrollLeft\");\n\t var shadow = kendo.getShadows(popupElement);\n\t var maxWidth = windowWidth - shadow.left - shadow.right;\n\t var canFit = maxWidth + scrollLeft > popupOuterWidth + popupOffsetLeft;\n\n\t if (!canFit) {\n\t popups.css({overflow: \"hidden\", width: (maxWidth - popupOffsetLeft + scrollLeft) + \"px\"});\n\t }\n\t },\n\n\t close: function() {\n\t var that = this;\n\n\t if (contains(that.element[0], $(arguments[0])[0]) || that._itemHasChildren(arguments[0])) {\n\t Menu.fn.close.call(that, arguments[0]);\n\t } else {\n\t if (that.popup.visible()) {\n\t if (that._triggerEvent({ item: that.element, type: CLOSE }) === false) {\n\t that.popup.close();\n\t DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n\t that.unbind(SELECT, that._closeTimeoutProxy);\n\t }\n\t }\n\t }\n\t },\n\n\t _showHandler: function (e) {\n\t var ev = e, offset,\n\t that = this,\n\t options = that.options,\n\t target = kendo.support.mobileOS ? $(ev.target) : $(ev.currentTarget);\n\n\t if (e.event) {\n\t ev = e.event;\n\t ev.pageX = e.x.location;\n\t ev.pageY = e.y.location;\n\t }\n\n\t if (contains(that.element[0], e.relatedTarget || e.target)) {\n\t return;\n\t }\n\n\t that._eventOrigin = ev;\n\n\t ev.preventDefault();\n\t ev.stopImmediatePropagation();\n\n\t that.element.find(\".\" + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n\n\t if ((options.filter && target.is(options.filter)) || !options.filter) {\n\t if (options.alignToAnchor) {\n\t that.popup.options.anchor = ev.currentTarget;\n\t that.open(ev.currentTarget);\n\t } else {\n\t that.popup.options.anchor = ev.currentTarget;\n\n\t if (that._targetChild) {\n\t offset = that.target.offset();\n\t that.open(ev.pageX - offset.left, ev.pageY - offset.top);\n\t } else {\n\t that.open(ev.pageX, ev.pageY);\n\t }\n\t }\n\t }\n\t },\n\n\t _closeHandler: function (e) {\n\t var that = this,\n\t target = $(e.relatedTarget || e.target),\n\t sameTarget = target.closest(that.target.selector)[0] == that.target[0],\n\t item = target.closest(itemSelector),\n\t children = that._itemHasChildren(item),\n\t overflowWrapper = that._overflowWrapper(),\n\t containment = contains(that.element[0], target[0]) || (overflowWrapper && contains(overflowWrapper[0], target[0]));\n\n\t that._eventOrigin = e;\n\n\t var normalClick = e.which !== 3;\n\n\t if (that.popup.visible() && ((normalClick && sameTarget) || !sameTarget) && ((that.options.closeOnClick && !children && containment) || !containment)) {\n\t if (containment) {\n\t this.unbind(SELECT, this._closeTimeoutProxy);\n\t that.bind(SELECT, that._closeTimeoutProxy);\n\t } else {\n\t that.close();\n\t }\n\t }\n\t },\n\n\t _wire: function() {\n\t var that = this,\n\t options = that.options,\n\t target = that.target;\n\n\t that._preventProxy = null;\n\t that._showProxy = proxy(that._showHandler, that);\n\t that._closeProxy = proxy(that._closeHandler, that);\n\t that._closeTimeoutProxy = proxy(that.close, that);\n\n\t if (target[0]) {\n\t if (kendo.support.mobileOS && options.showOn == \"contextmenu\") {\n\t that.userEvents = new kendo.UserEvents(target, {\n\t filter: options.filter,\n\t allowSelection: false\n\t });\n\n\t that._preventProxy = function() { return false; };\n\n\t that.userEvents.bind(\"hold\", that._showProxy);\n\t }\n\n\t if (options.filter) {\n\t target.on(options.showOn + NS + that._marker, options.filter, that._preventProxy || that._showProxy);\n\t } else {\n\t target.on(options.showOn + NS + that._marker, that._preventProxy || that._showProxy);\n\t }\n\t }\n\t },\n\n\t _triggerEvent: function(e) {\n\t var that = this,\n\t anchor = $(that.popup.options.anchor)[0],\n\t origin = that._eventOrigin;\n\n\t that._eventOrigin = undefined;\n\n\t return that.trigger(e.type, extend({ type: e.type, item: e.item || this.element[0], target: anchor }, origin ? { event: origin } : {} ));\n\t },\n\n\t _popup: function() {\n\t var that = this;\n\t var overflowWrapper = that._overflowWrapper();\n\n\t that._triggerProxy = proxy(that._triggerEvent, that);\n\n\t that.popup = that.element\n\t .addClass(\"k-context-menu\")\n\t .kendoPopup({\n\t autosize: that.options.orientation === \"horizontal\",\n\t anchor: that.target || \"body\",\n\t copyAnchorStyles: that.options.copyAnchorStyles,\n\t collision: that.options.popupCollision || \"fit\",\n\t animation: that.options.animation,\n\t activate: that._triggerProxy,\n\t deactivate: that._triggerProxy,\n\t appendTo: overflowWrapper || that.options.appendTo,\n\t close: !overflowWrapper ? $.noop : function(e) {\n\t $(getChildPopups(e.sender.element, overflowWrapper)).each(function(i, p) {\n\t var popup = p.data(KENDOPOPUP);\n\t if (popup) {\n\t popup.close(true);\n\t }\n\t });\n\t }\n\t }).data(KENDOPOPUP);\n\n\t that._targetChild = contains(that.target[0], that.popup.element[0]);\n\t }\n\t });\n\n\t ui.plugin(Menu);\n\t ui.plugin(ContextMenu);\n\n\t})(window.kendo.jQuery);\n\n\treturn window.kendo;\n\n\t}, __webpack_require__(3));\n\n\n/***/ })\n\n/******/ });","module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1331);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 1108:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.fx\");\n\n/***/ }),\n\n/***/ 1113:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"./kendo.draganddrop\");\n\n/***/ }),\n\n/***/ 1331:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1108), __webpack_require__(1113) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\tvar __meta__ = { // jshint ignore:line\n\t id: \"mobile.scroller\",\n\t name: \"Scroller\",\n\t category: \"mobile\",\n\t description: \"The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.\",\n\t depends: [ \"fx\", \"draganddrop\" ]\n\t};\n\n\t(function($, undefined) {\n\t var kendo = window.kendo,\n\t mobile = kendo.mobile,\n\t fx = kendo.effects,\n\t ui = mobile.ui,\n\t proxy = $.proxy,\n\t extend = $.extend,\n\t Widget = ui.Widget,\n\t Class = kendo.Class,\n\t Movable = kendo.ui.Movable,\n\t Pane = kendo.ui.Pane,\n\t PaneDimensions = kendo.ui.PaneDimensions,\n\t Transition = fx.Transition,\n\t Animation = fx.Animation,\n\t abs = Math.abs,\n\t SNAPBACK_DURATION = 500,\n\t SCROLLBAR_OPACITY = 0.7,\n\t FRICTION = 0.96,\n\t VELOCITY_MULTIPLIER = 10,\n\t MAX_VELOCITY = 55,\n\t OUT_OF_BOUNDS_FRICTION = 0.5,\n\t ANIMATED_SCROLLER_PRECISION = 5,\n\t RELEASECLASS = \"km-scroller-release\",\n\t REFRESHCLASS = \"km-scroller-refresh\",\n\t PULL = \"pull\",\n\t CHANGE = \"change\",\n\t RESIZE = \"resize\",\n\t SCROLL = \"scroll\",\n\t MOUSE_WHEEL_ID = 2;\n\n\t var ZoomSnapBack = Animation.extend({\n\t init: function(options) {\n\t var that = this;\n\t Animation.fn.init.call(that);\n\t extend(that, options);\n\n\t that.userEvents.bind(\"gestureend\", proxy(that.start, that));\n\t that.tapCapture.bind(\"press\", proxy(that.cancel, that));\n\t },\n\n\t enabled: function() {\n\t return this.movable.scale < this.dimensions.minScale;\n\t },\n\n\t done: function() {\n\t return this.dimensions.minScale - this.movable.scale < 0.01;\n\t },\n\n\t tick: function() {\n\t var movable = this.movable;\n\t movable.scaleWith(1.1);\n\t this.dimensions.rescale(movable.scale);\n\t },\n\n\t onEnd: function() {\n\t var movable = this.movable;\n\t movable.scaleTo(this.dimensions.minScale);\n\t this.dimensions.rescale(movable.scale);\n\t }\n\t });\n\n\t var DragInertia = Animation.extend({\n\t init: function(options) {\n\t var that = this;\n\n\t Animation.fn.init.call(that);\n\n\t extend(that, options, {\n\t transition: new Transition({\n\t axis: options.axis,\n\t movable: options.movable,\n\t onEnd: function() { that._end(); }\n\t })\n\t });\n\n\t that.tapCapture.bind(\"press\", function() { that.cancel(); });\n\t that.userEvents.bind(\"end\", proxy(that.start, that));\n\t that.userEvents.bind(\"gestureend\", proxy(that.start, that));\n\t that.userEvents.bind(\"tap\", proxy(that.onEnd, that));\n\t },\n\n\t onCancel: function() {\n\t this.transition.cancel();\n\t },\n\n\t freeze: function(location) {\n\t var that = this;\n\t that.cancel();\n\t that._moveTo(location);\n\t },\n\n\t onEnd: function() {\n\t var that = this;\n\t if (that.paneAxis.outOfBounds()) {\n\t that._snapBack();\n\t } else {\n\t that._end();\n\t }\n\t },\n\n\t done: function() {\n\t return abs(this.velocity) < 1;\n\t },\n\n\t start: function(e) {\n\t var that = this,\n\t velocity;\n\n\t if (!that.dimension.enabled) { return; }\n\n\t if (that.paneAxis.outOfBounds()) {\n\t if(that.transition._started){\n\t that.transition.cancel();\n\t that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\n\n\t Animation.fn.start.call(that);\n\t }else{\n\t that._snapBack();\n\t }\n\t } else {\n\t velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n\t that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n\n\t that.tapCapture.captureNext();\n\t Animation.fn.start.call(that);\n\t }\n\t },\n\n\t tick: function() {\n\t var that = this,\n\t dimension = that.dimension,\n\t friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction,\n\t delta = (that.velocity *= friction),\n\t location = that.movable[that.axis] + delta;\n\n\t if (!that.elastic && dimension.outOfBounds(location)) {\n\t location = Math.max(Math.min(location, dimension.max), dimension.min);\n\t that.velocity = 0;\n\t }\n\n\t that.movable.moveAxis(that.axis, location);\n\t },\n\n\t _end: function() {\n\t this.tapCapture.cancelCapture();\n\t this.end();\n\t },\n\n\t _snapBack: function() {\n\t var that = this,\n\t dimension = that.dimension,\n\t snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n\t that._moveTo(snapBack);\n\t },\n\n\t _moveTo: function(location) {\n\t this.transition.moveTo({ location: location, duration: SNAPBACK_DURATION, ease: Transition.easeOutExpo });\n\t }\n\t });\n\n\t var AnimatedScroller = Animation.extend({\n\t init: function(options) {\n\t var that = this;\n\n\t kendo.effects.Animation.fn.init.call(this);\n\n\t extend(that, options, {\n\t origin: {},\n\t destination: {},\n\t offset: {}\n\t });\n\t },\n\n\t tick: function() {\n\t this._updateCoordinates();\n\t this.moveTo(this.origin);\n\t },\n\n\t done: function() {\n\t return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n\t },\n\n\t onEnd: function() {\n\t this.moveTo(this.destination);\n\t if (this.callback) {\n\t this.callback.call();\n\t }\n\t },\n\n\t setCoordinates: function(from, to) {\n\t this.offset = {};\n\t this.origin = from;\n\t this.destination = to;\n\t },\n\n\t setCallback: function(callback) {\n\t if (callback && kendo.isFunction(callback)) {\n\t this.callback = callback;\n\t } else {\n\t callback = undefined;\n\t }\n\t },\n\n\t _updateCoordinates: function() {\n\t this.offset = {\n\t x: (this.destination.x - this.origin.x) / 4,\n\t y: (this.destination.y - this.origin.y) / 4\n\t };\n\n\t this.origin = {\n\t y: this.origin.y + this.offset.y,\n\t x: this.origin.x + this.offset.x\n\t };\n\t }\n\t });\n\n\t var ScrollBar = Class.extend({\n\t init: function(options) {\n\t var that = this,\n\t horizontal = options.axis === \"x\",\n\t element = $('
');\n\n\t extend(that, options, {\n\t element: element,\n\t elementSize: 0,\n\t movable: new Movable(element),\n\t scrollMovable: options.movable,\n\t alwaysVisible: options.alwaysVisible,\n\t size: horizontal ? \"width\" : \"height\"\n\t });\n\n\t that.scrollMovable.bind(CHANGE, proxy(that.refresh, that));\n\t that.container.append(element);\n\t if (options.alwaysVisible) {\n\t that.show();\n\t }\n\t },\n\n\t refresh: function() {\n\t var that = this,\n\t axis = that.axis,\n\t dimension = that.dimension,\n\t paneSize = dimension.size,\n\t scrollMovable = that.scrollMovable,\n\t sizeRatio = paneSize / dimension.total,\n\t position = Math.round(-scrollMovable[axis] * sizeRatio),\n\t size = Math.round(paneSize * sizeRatio);\n\n\t if (sizeRatio >= 1) {\n\t this.element.css(\"display\", \"none\");\n\t } else {\n\t this.element.css(\"display\", \"\");\n\t }\n\n\t if (position + size > paneSize) {\n\t size = paneSize - position;\n\t } else if (position < 0) {\n\t size += position;\n\t position = 0;\n\t }\n\n\t if (that.elementSize != size) {\n\t that.element.css(that.size, size + \"px\");\n\t that.elementSize = size;\n\t }\n\n\t that.movable.moveAxis(axis, position);\n\t },\n\n\t show: function() {\n\t this.element.css({opacity: SCROLLBAR_OPACITY, visibility: \"visible\"});\n\t },\n\n\t hide: function() {\n\t if (!this.alwaysVisible) {\n\t this.element.css({opacity: 0});\n\t }\n\t }\n\t });\n\n\t var Scroller = Widget.extend({\n\t init: function(element, options) {\n\t var that = this;\n\t Widget.fn.init.call(that, element, options);\n\n\t element = that.element;\n\n\t that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n\t if (that._native) {\n\t element.addClass(\"km-native-scroller\")\n\t .prepend('