{"version":3,"file":"kendo.menu.min.js","sources":["kendo.menu.js"],"sourcesContent":["(function(f, define) {\n define('kendo.menu',[ \"kendo.popup\", \"kendo.data\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"menu\",\n name: \"Menu\",\n category: \"web\",\n description: \"The Menu widget displays hierarchical data as a multi-level menu.\",\n depends: [ \"popup\", \"data\", \"data.odata\" ]\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n ui = kendo.ui,\n activeElement = kendo._activeElement,\n touch = (kendo.support.touch && kendo.support.mobileOS),\n isArray = Array.isArray,\n HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n MOUSEDOWN = \"mousedown\",\n CLICK = \"click\",\n DELAY = 30,\n SCROLLSPEED = 50,\n extend = $.extend,\n each = $.each,\n template = kendo.template,\n keys = kendo.keys,\n Widget = ui.Widget,\n excludedNodesRegExp = /^(ul|a|div)$/i,\n NS = \".kendoMenu\",\n IMG = \"img\",\n OPEN = \"open\",\n MENU = \"k-menu\",\n LINK = \"k-link k-menu-link\",\n LINK_SELECTOR = \".k-link\",\n ICON_SELECTOR = \".k-menu-expand-arrow-icon\",\n LAST = \"k-last\",\n CLOSE = \"close\",\n TIMER = \"timer\",\n FIRST = \"k-first\",\n IMAGE = \"k-image\",\n SELECT = \"select\",\n ZINDEX = \"zIndex\",\n ACTIVATE = \"activate\",\n DEACTIVATE = \"deactivate\",\n POINTERDOWN = \"touchstart\" + NS + \" MSPointerDown\" + NS + \" pointerdown\" + NS,\n pointers = kendo.support.pointers,\n msPointers = kendo.support.msPointers,\n allPointers = msPointers || pointers,\n CHANGE = \"change\",\n ERROR = \"error\",\n TOUCHSTART = kendo.support.touch ? \"touchstart\" : \"\",\n MOUSEENTER = pointers ? \"pointerover\" : (msPointers ? \"MSPointerOver\" : \"mouseenter\"),\n MOUSELEAVE = pointers ? \"pointerout\" : (msPointers ? \"MSPointerOut\" : \"mouseleave\"),\n MOUSEWHEEL = \"DOMMouseScroll\" + NS + \" mousewheel\" + NS,\n RESIZE = kendo.support.resize + NS,\n SCROLLWIDTH = \"scrollWidth\",\n SCROLLHEIGHT = \"scrollHeight\",\n OFFSETWIDTH = \"offsetWidth\",\n OFFSETHEIGHT = \"offsetHeight\",\n POPUP_ID_ATTR = \"group\",\n POPUP_OPENER_ATTR = \"groupparent\",\n DOCUMENT_ELEMENT = $(document.documentElement),\n KENDOPOPUP = \"kendoPopup\",\n HOVERSTATE = \"k-hover\",\n FOCUSEDSTATE = \"k-focus\",\n DISABLEDSTATE = \"k-disabled\",\n SELECTEDSTATE = \"k-selected\",\n menuSelector = \".k-menu\",\n groupSelector = \".k-menu-group\",\n animationContainerSelector = \".k-animation-container\",\n popupSelector = groupSelector + \",\" + animationContainerSelector,\n allItemsSelector = \":not(.k-list) > .k-item:not([role='treeitem'])\",\n disabledSelector = \".k-item.k-disabled\",\n itemSelector = \".k-item\",\n availableItemsSelector = \".k-item:not(.k-disabled)\",\n linkSelector = \".k-item:not(.k-disabled) > .k-link\",\n exclusionSelector = \":not(.k-item.k-separator)\",\n templateSelector = \"div:not(.k-animation-container,.k-list-container)\",\n scrollButtonSelector = \".k-menu-scroll-button\",\n touchPointerTypes = { \"2\": 1, \"touch\": 1 },\n STRING = \"string\",\n DATABOUND = \"dataBound\",\n ARIA_EXPANDED = \"aria-expanded\",\n ROLE = \"role\",\n\n bindings = {\n text: \"dataTextField\",\n url: \"dataUrlField\",\n spriteCssClass: \"dataSpriteCssClassField\",\n imageUrl: \"dataImageUrlField\",\n imageAttr: \"dataImageAttrField\",\n content: \"dataContentField\"\n },\n\n rendering = {\n wrapperCssClass: function(group, item) {\n var result = \"k-item k-menu-item\",\n index = item.index;\n\n if (item.enabled === false) {\n result += \" k-disabled\";\n }\n\n if (group.firstLevel && index === 0) {\n result += \" k-first\";\n }\n\n if (index == group.length - 1) {\n result += \" k-last\";\n }\n\n if (item.cssClass) {\n result += \" \" + item.cssClass;\n }\n\n if (item.attr && item.attr.hasOwnProperty(\"class\")) {\n result += \" \" + item.attr[\"class\"];\n }\n\n if (item.selected) {\n result += \" \" + SELECTEDSTATE;\n }\n\n return result;\n },\n\n itemCssAttributes: function(item) {\n var result = \"\";\n var attributes = item.attr || {};\n\n for (var attr in attributes) {\n if (attributes.hasOwnProperty(attr) && attr !== \"class\") {\n result += attr + \"=\\\"\" + attributes[attr] + \"\\\" \";\n }\n }\n\n return result;\n },\n\n imageCssAttributes: function(imgAttributes) {\n var result = \"\";\n var attributes = imgAttributes && imgAttributes.toJSON ? imgAttributes.toJSON() : {};\n\n if (!attributes['class']) {\n attributes['class'] = IMAGE;\n } else {\n attributes['class'] += \" \" + IMAGE;\n }\n\n for (var attr in attributes) {\n if (attributes.hasOwnProperty(attr)) {\n result += attr + \"=\\\"\" + attributes[attr] + \"\\\" \";\n }\n }\n\n return result;\n },\n\n contentCssAttributes: function(item) {\n var result = \"\";\n var attributes = item.contentAttr || {};\n var defaultClasses = \"k-content k-group k-menu-group k-menu-group-md\";\n\n if (!attributes['class']) {\n attributes['class'] = defaultClasses;\n } else {\n attributes['class'] += \" \" + defaultClasses;\n }\n\n for (var attr in attributes) {\n if (attributes.hasOwnProperty(attr)) {\n result += attr + \"=\\\"\" + attributes[attr] + \"\\\" \";\n }\n }\n\n return result;\n },\n\n textClass: function() {\n return LINK;\n },\n\n arrowClass: function(item, group) {\n var result = \"k-menu-expand-arrow-icon k-icon\";\n\n if (group.horizontal) {\n result += \" k-i-arrow-s\";\n } else {\n result += \" k-i-arrow-e\";\n }\n\n return result;\n },\n\n groupAttributes: function(group) {\n return group.expanded !== true ? \" style='display:none'\" : \"\";\n },\n\n groupCssClass: function() {\n return \"k-group k-menu-group k-menu-group-md\";\n },\n\n content: function(item) {\n return item.content ? item.content : \" \";\n }\n };\n\n function getEffectDirection(direction, root) {\n direction = direction.split(\" \")[!root + 0] || direction;\n return direction.replace(\"top\", \"up\").replace(\"bottom\", \"down\");\n }\n\n function parseDirection(direction, root, isRtl) {\n direction = direction.split(\" \")[!root + 0] || direction;\n var output = { origin: [\"bottom\", (isRtl ? \"right\" : \"left\")], position: [\"top\", (isRtl ? \"right\" : \"left\")] },\n horizontal = /left|right/.test(direction);\n\n if (horizontal) {\n output.origin = [ \"top\", direction ];\n output.position[1] = kendo.directions[direction].reverse;\n } else {\n output.origin[0] = direction;\n output.position[0] = kendo.directions[direction].reverse;\n }\n\n output.origin = output.origin.join(\" \");\n output.position = output.position.join(\" \");\n\n return output;\n }\n\n function contains(parent, child) {\n try {\n return $.contains(parent, child);\n } catch (e) {\n return false;\n }\n }\n\n function updateItemClasses(item) {\n item = $(item);\n var omitWrap = item.attr(kendo.attr(\"omit-wrap\"));\n\n if (omitWrap) {\n return;\n }\n\n item.addClass(\"k-item k-menu-item\")\n .children(IMG)\n .addClass(IMAGE);\n\n item\n .children(\"a\")\n .addClass(LINK)\n .children(IMG)\n .addClass(IMAGE);\n\n item\n .filter(\":not([disabled])\");\n\n item\n .filter(\".k-separator\")\n .removeClass(\"k-menu-item\")\n .addClass(\"k-menu-separator\")\n .empty()\n .append(\" \");\n\n item\n .filter(\"li[disabled]\")\n .addClass(DISABLEDSTATE)\n .prop(\"disabled\", false)\n .attr(\"aria-disabled\", true);\n\n if (!item.filter(\"[role]\").length) {\n item.attr(ROLE, \"menuitem\");\n }\n\n if (!item.children(LINK_SELECTOR).length) {\n item.contents() // exclude groups, real links, templates and empty text nodes\n .filter(function() { return (!this.nodeName.match(excludedNodesRegExp) && !(this.nodeType === 3 && !kendo.trim(this.nodeValue))); })\n .wrapAll(\"\")\n .filter(function(idx, elm) { return elm.nodeType === 3; })\n .wrap(\"\");\n }\n\n updateArrow(item);\n updateFirstLast(item);\n }\n\n function updateArrow(item) {\n item = $(item);\n\n item.find(\"> .k-link > .k-menu-expand-arrow > [class*=k-i-arrow]:not(.k-sprite)\").parent().remove();\n\n item.filter(\":has(.k-menu-group)\")\n .children(\".k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))\")\n .each(function() {\n var item = $(this),\n arrowCssClass = getArrowCssClass(item);\n\n item.append(\"\");\n });\n }\n\n function getArrowCssClass(item) {\n var arrowCssClass,\n parent = item.parent().parent(),\n isRtl = kendo.support.isRtl(parent);\n\n if (parent.hasClass(MENU + \"-horizontal\")) {\n arrowCssClass = \"k-i-arrow-s\";\n } else {\n if (isRtl) {\n arrowCssClass = \"k-i-arrow-w\";\n }\n else {\n arrowCssClass = \"k-i-arrow-e\";\n }\n }\n return arrowCssClass;\n }\n\n function updateFirstLast(item) {\n item = $(item);\n\n item.filter(\".k-first:not(:first-child)\").removeClass(FIRST);\n item.filter(\".k-last:not(:last-child)\").removeClass(LAST);\n item.filter(\":first-child\").addClass(FIRST);\n item.filter(\":last-child\").addClass(LAST);\n }\n\n function updateHasAriaPopup(parents) {\n if (parents && parents.length) {\n for (var index in parents) {\n var parentLi = parents.eq(index);\n if (parentLi.find(\"ul\").length) {\n parentLi.attr(\"aria-haspopup\", true);\n } else {\n parentLi.removeAttr(\"aria-haspopup\");\n }\n }\n }\n }\n\n function getParentLiItems(group) {\n if (!group.hasClass(MENU)) {\n return group.parentsUntil(\".\" + MENU, \"li\");\n }\n }\n\n function storeItemSelectEventHandler(element, options) {\n var selectHandler = getItemSelectEventHandler(options);\n if (selectHandler) {\n setItemData(element, selectHandler);\n }\n\n if (options.items) {\n $(element).children(\"ul\").children(\"li\").each(function(i) {\n storeItemSelectEventHandler(this, options.items[i]);\n });\n }\n }\n\n function setItemData(element, selectHandler) {\n $(element).children(\".k-link\").data({\n selectHandler: selectHandler\n });\n }\n\n function getItemSelectEventHandler(options) {\n var selectHandler = options.select,\n isFunction = kendo.isFunction;\n\n if (selectHandler && isFunction(selectHandler)) {\n return selectHandler;\n }\n return null;\n }\n\n function popupOpenerSelector(id) {\n return id ? \"li[data-groupparent='\" + id + \"']\" : \"li[data-groupparent]\";\n }\n function popupGroupSelector(id) {\n var selector = id ? \"[data-group='\" + id + \"']\" : \"[data-group]\";\n return \"ul\" + selector + \",div\" + selector;\n }\n function getChildPopups(currentPopup, overflowWrapper) {\n var childPopupOpener = currentPopup.find(popupOpenerSelector());\n var result = [];\n childPopupOpener.each(function(i, opener) {\n opener = $(opener);\n var popupId = opener.data(POPUP_OPENER_ATTR);\n var popup = currentPopup;\n while (popupId) {\n popup = overflowWrapper.find(popupGroupSelector(popupId) + \":visible\");\n if (popup.length) {\n result.push(popup);\n }\n opener = popup.find(popupOpenerSelector());\n popupId = opener.data(POPUP_OPENER_ATTR);\n }\n });\n\n return result;\n }\n\n function popupParentItem(popupElement, overflowWrapper) {\n var popupId = popupElement.data(POPUP_ID_ATTR);\n return popupId ? overflowWrapper.find(popupOpenerSelector(popupId)) : $([]);\n }\n\n function itemPopup(item, overflowWrapper) {\n var popupId = item.data(POPUP_OPENER_ATTR);\n return popupId ? overflowWrapper.children(animationContainerSelector).children(popupGroupSelector(popupId)) : $([]);\n }\n\n function overflowMenuParents(current, overflowWrapper) {\n var parents = [];\n var getParents = function(item) {\n while (item.parentNode && !overflowWrapper.is(item.parentNode)) {\n parents.push(item.parentNode);\n item = item.parentNode;\n }\n };\n var elem = current[0] || current;\n getParents(elem);\n var last = parents[parents.length - 1];\n while ($(last).is(animationContainerSelector)) {\n var popupElement = $(last).children(\"ul\");\n elem = popupParentItem(popupElement, overflowWrapper)[0];\n if (!elem) {\n break;\n }\n parents.push(elem);\n getParents(elem);\n last = parents[parents.length - 1];\n }\n return parents;\n }\n\n function mousewheelDelta(e) {\n var delta = 0;\n\n if (e.wheelDelta) {\n delta = -e.wheelDelta / 120;\n delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n }\n\n if (e.detail) {\n delta = Math.round(e.detail / 3);\n }\n\n return delta;\n }\n\n function parentsScroll(current, scrollDirection) {\n var scroll = 0;\n var parent = current.parentNode;\n while (parent && !isNaN(parent[scrollDirection])) {\n scroll += parent[scrollDirection];\n parent = parent.parentNode;\n }\n return scroll;\n }\n\n function isPointerTouch(e) {\n return allPointers && e.originalEvent && e.originalEvent.pointerType in touchPointerTypes;\n }\n\n function isTouch(e) {\n var ev = e.originalEvent;\n return touch && /touch/i.test(ev.type || \"\");\n }\n\n function removeSpacesBetweenItems(ul) {\n ul.contents().filter(function() { return this.nodeName != \"LI\"; }).remove();\n }\n\n var Menu = kendo.ui.DataBoundWidget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n element = that.wrapper = that.element;\n options = that.options;\n that._accessors();\n that._templates();\n that._dataSource();\n\n that._updateClasses();\n\n that._animations(options);\n\n that.nextItemZIndex = 100;\n\n that._tabindex();\n\n that._initOverflow(options);\n\n that._attachMenuEventsHandlers();\n\n if (options.openOnClick) {\n that.clicked = false;\n }\n\n element.attr(ROLE, \"menubar\");\n\n if (element[0].id) {\n that._ariaId = kendo.format(\"{0}_mn_active\", element[0].id);\n }\n\n kendo.notify(that);\n },\n\n events: [\n OPEN,\n CLOSE,\n ACTIVATE,\n DEACTIVATE,\n SELECT,\n DATABOUND\n ],\n\n options: {\n name: \"Menu\",\n animation: {\n open: {\n duration: 200\n },\n close: { // if close animation effects are defined, they will be used instead of open.reverse\n duration: 100\n }\n },\n orientation: \"horizontal\",\n direction: \"default\",\n openOnClick: false,\n closeOnClick: true,\n hoverDelay: 100,\n scrollable: false,\n popupCollision: undefined\n },\n\n _initData: function() {\n var that = this;\n\n if (that.dataSource) {\n that.angular(\"cleanup\", function() {\n return {\n elements: that.element.children()\n };\n });\n that.element.empty();\n\n that.append(that.dataSource.view(), that.element);\n that.angular(\"compile\", function() {\n return {\n elements: that.element.children()\n };\n });\n }\n },\n\n _attachMenuEventsHandlers: function() {\n var that = this;\n var element = that.element;\n var options = that.options;\n var overflowWrapper = that._overflowWrapper();\n\n that._checkActiveProxy = that._checkActiveElement.bind(that);\n\n (overflowWrapper || element).on(POINTERDOWN, itemSelector, that._focusHandler.bind(that))\n .on(CLICK + NS, disabledSelector, false)\n .on(CLICK + NS, itemSelector, that._click.bind(that))\n .on(POINTERDOWN + \" \" + MOUSEDOWN + NS, \".k-content\", that._preventClose.bind(that))\n .on(MOUSEENTER + NS, availableItemsSelector, that._mouseenter.bind(that))\n .on(MOUSELEAVE + NS, availableItemsSelector, that._mouseleave.bind(that))\n .on(MOUSEDOWN + NS, availableItemsSelector, that._mousedown.bind(that))\n .on(TOUCHSTART + NS + \" \" + MOUSEENTER + NS + \" \" + MOUSELEAVE + NS + \" \" +\n MOUSEDOWN + NS + \" \" + CLICK + NS, linkSelector, that._toggleHover.bind(that));\n\n element.on(\"keydown\" + NS, that._keydown.bind(that))\n .on(\"focus\" + NS, that._focus.bind(that))\n .on(\"focus\" + NS, \".k-content\", that._focus.bind(that))\n .on(\"blur\" + NS, that._removeHoverItem.bind(that))\n .on(\"blur\" + NS, \"[tabindex]\", that._checkActiveProxy);\n\n if (overflowWrapper) {\n overflowWrapper\n .on(MOUSELEAVE + NS, popupSelector, that._mouseleavePopup.bind(that))\n .on(MOUSEENTER + NS, popupSelector, that._mouseenterPopup.bind(that));\n }\n\n if (options.openOnClick) {\n that._documentClickHandler = that._documentClick.bind(that);\n $(document).on(\"click\", that._documentClickHandler);\n }\n },\n\n _detachMenuEventsHandlers: function() {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n\n if (overflowWrapper) {\n overflowWrapper.off(NS);\n }\n\n that.element.off(NS);\n\n if (that._documentClickHandler) {\n $(document).off(\"click\", that._documentClickHandler);\n }\n },\n\n _initOverflow: function(options) {\n var that = this;\n var isHorizontal = options.orientation == \"horizontal\";\n var backwardBtn, forwardBtn;\n\n if (options.scrollable) {\n that._openedPopups = {};\n that._scrollWrapper = that.element.wrap(\"
\").parent();\n if (isHorizontal) {\n removeSpacesBetweenItems(that.element);\n }\n\n backwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? \"left\" : \"up\" }));\n forwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? \"right\" : \"down\" }));\n backwardBtn.add(forwardBtn).appendTo(that._scrollWrapper);\n\n that._initScrolling(that.element, backwardBtn, forwardBtn, isHorizontal);\n\n var initialWidth = that.element.outerWidth();\n var initialCssWidth = that.element[0].style.width;\n initialCssWidth = initialCssWidth === \"auto\" ? \"\" : initialCssWidth;\n\n if (isHorizontal) {\n $(window).on(RESIZE, function() {\n setTimeout(function() {\n that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n }, 300);\n });\n }\n\n that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n }\n },\n\n _overflowWrapper: function() {\n return this._scrollWrapper || this._popupsWrapper;\n },\n\n _setOverflowWrapperWidth: function(initialWidth, initialCssWidth) {\n var that = this;\n var wrapperCssWidth = that._scrollWrapper.css(\"width\");\n\n that._scrollWrapper.css({ width: \"\" });\n var wrapperWidth = that._scrollWrapper.outerWidth();\n that._scrollWrapper.css({ width: wrapperCssWidth });\n\n var menuWidth = that.element.outerWidth();\n var borders = that.element[0].offsetWidth - that.element[0].clientWidth;\n\n if (menuWidth != wrapperWidth && wrapperWidth > 0) {\n var width = initialCssWidth ? Math.min(initialWidth, wrapperWidth) : wrapperWidth;\n that.element.width(width - borders);\n that._scrollWrapper.width(width);\n }\n },\n\n _reinitOverflow: function(options) {\n var that = this;\n var overflowChanged = ((options.scrollable && !that.options.scrollable) || (!options.scrollable && that.options.scrollable)) ||\n (options.scrollable && that.options.scrollable && options.scrollable.distance != that.options.scrollable.distance) ||\n options.orientation != that.options.orientation;\n\n if (overflowChanged) {\n that._detachMenuEventsHandlers();\n that._destroyOverflow();\n that._initOverflow(options);\n that._attachMenuEventsHandlers();\n }\n },\n\n _destroyOverflow: function() {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n if (overflowWrapper) {\n overflowWrapper.off(NS);\n overflowWrapper.find(scrollButtonSelector).off(NS).remove();\n overflowWrapper.children(animationContainerSelector).each(function(i, popupWrapper) {\n var ul = $(popupWrapper).children(groupSelector);\n ul.off(MOUSEWHEEL);\n var popupParentLi = popupParentItem(ul, overflowWrapper);\n if (popupParentLi.length) {\n popupParentLi.append(popupWrapper);\n }\n });\n\n overflowWrapper.find(popupOpenerSelector()).removeAttr(\"data-groupparent\");\n overflowWrapper.find(popupGroupSelector()).removeAttr(\"data-group\");\n that.element.off(MOUSEWHEEL);\n $(window).off(RESIZE);\n overflowWrapper.contents().unwrap();\n\n that._scrollWrapper = that._popupsWrapper = that._openedPopups = undefined;\n }\n },\n\n _initScrolling: function(scrollElement, backwardBtn, forwardBtn, isHorizontal) {\n var that = this;\n var scrollable = that.options.scrollable;\n var distance = that.isNumeric(scrollable.distance) ? scrollable.distance : SCROLLSPEED;\n var mouseWheelDistance = distance / 2;\n var backward = \"-=\" + distance;\n var forward = \"+=\" + distance;\n var backwardDouble = \"-=\" + distance * 2;\n var forwardDouble = \"+=\" + distance * 2;\n var scrolling = false;\n var touchEvents = false;\n\n var scroll = function(value) {\n var scrollValue = isHorizontal ? { \"scrollLeft\": value } : { \"scrollTop\": value };\n scrollElement.finish().animate(scrollValue, \"fast\", \"linear\", function() {\n if (scrolling) {\n scroll(value);\n }\n });\n that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n };\n\n var mouseenterHandler = function(e) {\n if (!scrolling && !touchEvents) {\n scroll(e.data.direction);\n scrolling = true;\n }\n };\n\n var mousedownHandler = function(e) {\n var scrollValue = isHorizontal ? { \"scrollLeft\": e.data.direction } : { \"scrollTop\": e.data.direction };\n touchEvents = isTouch(e) || isPointerTouch(e);\n scrollElement.stop().animate(scrollValue, \"fast\", \"linear\", function() {\n if (!touchEvents) {\n $(e.currentTarget).trigger(MOUSEENTER);\n } else {\n that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n scrolling = true;\n }\n });\n scrolling = false;\n\n e.stopPropagation();\n e.preventDefault();\n };\n\n backwardBtn.on(MOUSEENTER + NS, { direction: backward }, mouseenterHandler)\n .on(kendo.eventMap.down + NS, { direction: backwardDouble }, mousedownHandler);\n\n forwardBtn.on(MOUSEENTER + NS, { direction: forward }, mouseenterHandler)\n .on(kendo.eventMap.down + NS, { direction: forwardDouble }, mousedownHandler);\n\n backwardBtn.add(forwardBtn)\n .on(MOUSELEAVE + NS, function() {\n scrollElement.stop();\n scrolling = false;\n that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n });\n\n scrollElement.on(MOUSEWHEEL, function(e) {\n if (!e.ctrlKey && !e.shiftKey && !e.altKey) {\n var wheelDelta = mousewheelDelta(e.originalEvent);\n var scrollSpeed = Math.abs(wheelDelta) * mouseWheelDistance;\n var value = (wheelDelta > 0 ? \"+=\" : \"-=\") + scrollSpeed;\n var scrollValue = isHorizontal ? { \"scrollLeft\": value } : { \"scrollTop\": value };\n\n that._closeChildPopups(scrollElement);\n\n scrollElement.finish().animate(scrollValue, \"fast\", \"linear\", function() {\n that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n });\n e.preventDefault();\n }\n });\n },\n\n isNumeric: function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n },\n\n _toggleScrollButtons: function(scrollElement, backwardBtn, forwardBtn, horizontal) {\n var currentScroll = horizontal ? kendo.scrollLeft(scrollElement) : scrollElement.scrollTop();\n var scrollSize = horizontal ? SCROLLWIDTH : SCROLLHEIGHT;\n var offset = horizontal ? OFFSETWIDTH : OFFSETHEIGHT;\n\n backwardBtn.toggle(currentScroll !== 0);\n forwardBtn.toggle(currentScroll < scrollElement[0][scrollSize] - scrollElement[0][offset] - 1);\n },\n\n setOptions: function(options) {\n var animation = this.options.animation;\n\n this._animations(options);\n\n options.animation = extend(true, animation, options.animation);\n\n if (\"dataSource\" in options) {\n this._dataSource(options);\n }\n\n this._updateClasses();\n this._reinitOverflow(options);\n\n Widget.fn.setOptions.call(this, options);\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that._detachMenuEventsHandlers();\n\n that._destroyOverflow();\n\n kendo.destroy(that.element);\n },\n\n enable: function(element, enable) {\n this._toggleDisabled(element, enable !== false);\n\n return this;\n },\n\n disable: function(element) {\n this._toggleDisabled(element, false);\n\n return this;\n },\n\n attemptGetItem: function(candidate) {\n candidate = candidate || this.element;\n var item = this.element.find(candidate);\n var overflowWrapper = this._overflowWrapper();\n\n if (item.length || candidate === this.element) {\n return item;\n } else if (overflowWrapper) {\n return overflowWrapper.find(candidate);\n } else {\n return $();\n }\n },\n\n append: function(item, referenceItem) {\n referenceItem = this.attemptGetItem(referenceItem);\n\n var inserted = this._insert(item, referenceItem, referenceItem.length ? this._childPopupElement(referenceItem) : null);\n\n each(inserted.items, function(i) {\n inserted.group.append(this);\n updateArrow(this);\n storeItemSelectEventHandler(this, item[i] || item);\n });\n\n updateArrow(referenceItem);\n updateFirstLast(inserted.group.find(\".k-first, .k-last\").add(inserted.items));\n updateHasAriaPopup(getParentLiItems(inserted.group));\n\n return this;\n },\n\n insertBefore: function(item, referenceItem) {\n referenceItem = this.attemptGetItem(referenceItem);\n\n var inserted = this._insert(item, referenceItem, referenceItem.parent());\n\n each(inserted.items, function(i) {\n referenceItem.before(this);\n updateArrow(this);\n updateFirstLast(this);\n storeItemSelectEventHandler(this, item[i] || item);\n });\n\n updateFirstLast(referenceItem);\n\n return this;\n },\n\n insertAfter: function(item, referenceItem) {\n referenceItem = this.attemptGetItem(referenceItem);\n\n var inserted = this._insert(item, referenceItem, referenceItem.parent());\n\n each(inserted.items, function(i) {\n referenceItem.after(this);\n updateArrow(this);\n updateFirstLast(this);\n storeItemSelectEventHandler(this, item[i] || item);\n });\n\n updateFirstLast(referenceItem);\n\n return this;\n },\n\n _insert: function(item, referenceItem, parent) {\n var that = this,\n items, groups;\n\n if (!referenceItem || !referenceItem.length) {\n parent = that.element;\n }\n\n var plain = $.isPlainObject(item) || item instanceof kendo.data.ObservableObject,\n groupData = {\n firstLevel: parent.hasClass(MENU),\n horizontal: parent.hasClass(MENU + \"-horizontal\"),\n expanded: true,\n length: parent.children().length\n };\n\n if (referenceItem && !parent.length) {\n parent = $(that.renderGroup({ group: groupData, options: that.options })).appendTo(referenceItem);\n }\n\n if (plain || isArray(item) || item instanceof kendo.data.ObservableArray) { // is JSON\n items = $($.map(plain ? [ item ] : item, function(value, idx) {\n if (typeof value === \"string\") {\n return $(value).get();\n } else {\n return $(that.renderItem({\n group: groupData,\n item: extend(value, { index: idx })\n })).get();\n }\n }));\n } else {\n if (typeof item == \"string\" && item.charAt(0) != \"<\") {\n items = that.element.find(item);\n } else {\n items = $(item);\n }\n\n groups = items.find(\"> ul\")\n .addClass(\"k-menu-group k-menu-group-md\")\n .attr(ROLE, \"menu\");\n\n items = items.filter(\"li\");\n\n items.add(groups.find(\"> li\")).each(function() {\n updateItemClasses(this);\n });\n }\n\n return { items: items, group: parent };\n },\n\n remove: function(element) {\n element = this.attemptGetItem(element);\n\n var that = this,\n parent = element.parentsUntil(that.element, allItemsSelector),\n group = element.parent(\"ul:not(.k-menu)\");\n\n element.remove();\n\n if (group && !group.children(allItemsSelector).length) {\n var parentItems = getParentLiItems(group);\n\n var container = group.parent(animationContainerSelector);\n\n if (container.length) {\n container.remove();\n } else {\n group.remove();\n }\n\n updateHasAriaPopup(parentItems);\n }\n\n if (parent.length) {\n parent = parent.eq(0);\n\n updateArrow(parent);\n updateFirstLast(parent);\n }\n\n return that;\n },\n\n _openAfterLoad: function(element, dataItem) {\n var that = this;\n if (dataItem.loaded()) {\n that.open(element);\n that._loading = false;\n } else {\n dataItem.one(CHANGE, function() {\n element.find(ICON_SELECTOR).removeClass(\"k-i-loading\");\n if (that._loading) {\n that.open(element);\n that._loading = false;\n }\n });\n }\n },\n\n open: function(element) {\n var that = this;\n var options = that.options;\n var horizontal = options.orientation == \"horizontal\";\n var direction = options.direction;\n var isRtl = kendo.support.isRtl(that.wrapper);\n var overflowWrapper = that._overflowWrapper();\n element = (overflowWrapper || that.element).find(element);\n\n var dataItem = that.dataSource && that.dataSource.getByUid(element.data(kendo.ns + \"uid\"));\n\n if (dataItem && dataItem.hasChildren && !dataItem.loaded() && !that._loading) {\n that._loading = true;\n element.find(ICON_SELECTOR).addClass(\"k-i-loading\");\n dataItem.load();\n that._openAfterLoad(element, dataItem);\n return;\n }\n\n if (/^(top|bottom|default)$/.test(direction)) {\n if (isRtl) {\n direction = horizontal ? (direction + \" left\").replace(\"default\", \"bottom\") : \"left\";\n } else {\n direction = horizontal ? (direction + \" right\").replace(\"default\", \"bottom\") : \"right\";\n }\n }\n\n var visiblePopups = \">.k-popup:visible,>.k-animation-container>.k-popup:visible\";\n var closePopup = function() {\n var popup = $(this).data(KENDOPOPUP);\n if (popup) {\n // Use the built-in close method to play the hoverDelay from the options\n that.close($(this).closest(\"li.k-item\"), true);\n }\n };\n\n element.siblings()\n .find(visiblePopups)\n .each(closePopup);\n\n if (overflowWrapper) {\n element.find(visiblePopups).each(closePopup);\n }\n\n if (that.options.openOnClick) {\n that.clicked = true;\n }\n\n element.each(function() {\n var li = $(this);\n\n clearTimeout(li.data(TIMER));\n\n li.data(TIMER, setTimeout(function() {\n var ul = li.find(\"> .k-menu-group, > .k-animation-container > .k-menu-group\").filter(\":hidden\").first();\n var popup;\n var overflowPopup;\n\n if (!ul[0] && overflowWrapper) {\n overflowPopup = that._getPopup(li);\n ul = overflowPopup && overflowPopup.element;\n }\n if (ul.is(\":visible\")) {\n return;\n }\n\n if (ul[0] && that._triggerEvent({ item: li[0], type: OPEN }) === false) {\n\n if (!ul.find(\".k-menu-group\")[0] && ul.children(\".k-item\").length > 1) {\n var windowHeight = $(window).height(),\n setScrolling = function() {\n ul.css({ maxHeight: windowHeight - (kendo._outerHeight(ul) - ul.height()) - kendo.getShadows(ul).bottom, overflow: \"auto\" });\n };\n\n setScrolling();\n } else {\n ul.css({ maxHeight: \"\", overflow: \"\" });\n }\n\n li.data(ZINDEX, li.css(ZINDEX));\n var nextZindex = that.nextItemZIndex++;\n li.css(ZINDEX, nextZindex);\n\n if (that.options.scrollable) {\n li.parent().siblings(scrollButtonSelector).css({ zIndex: ++nextZindex });\n }\n\n popup = ul.data(KENDOPOPUP);\n var root = li.parent().hasClass(MENU),\n parentHorizontal = root && horizontal,\n directions = parseDirection(direction, root, isRtl),\n effects = options.animation.open.effects,\n openEffects = effects !== undefined ? effects : \"slideIn:\" + getEffectDirection(direction, root);\n\n if (!popup) {\n popup = ul.kendoPopup({\n activate: function() { that._triggerEvent({ item: this.wrapper.parent(), type: ACTIVATE }); },\n deactivate: function(e) {\n that._closing = false;\n e.sender.element // Restore opacity after fade.\n .removeData(\"targetTransform\")\n .css({ opacity: \"\" });\n that._triggerEvent({ item: this.wrapper.parent(), type: DEACTIVATE });\n },\n origin: directions.origin,\n position: directions.position,\n collision: options.popupCollision !== undefined ? options.popupCollision : (parentHorizontal ? \"fit\" : \"fit flip\"),\n anchor: li,\n appendTo: overflowWrapper || li,\n animation: {\n open: extend(true, { effects: openEffects }, options.animation.open),\n close: options.animation.close\n },\n open: that._popupOpen.bind(that),\n close: function(e) {\n that._closing = e.sender.element;\n var li = e.sender.wrapper.parent();\n\n if (overflowWrapper) {\n var popupId = e.sender.element.data(POPUP_ID_ATTR);\n if (popupId) {\n li = (overflowWrapper || that.element).find(popupOpenerSelector(popupId));\n }\n e.sender.wrapper.children(scrollButtonSelector).hide();\n }\n\n if (!that._triggerEvent({ item: li[0], type: CLOSE })) {\n li.css(ZINDEX, li.data(ZINDEX));\n li.removeData(ZINDEX);\n\n if (that.options.scrollable) {\n li.parent().siblings(scrollButtonSelector).css({ zIndex: \"\" });\n }\n\n if (touch || allPointers || kendo.support.mouseAndTouchPresent) {\n li.removeClass(HOVERSTATE);\n that._removeHoverItem();\n }\n } else {\n e.preventDefault();\n }\n }\n }).data(KENDOPOPUP);\n\n ul.closest(animationContainerSelector).removeAttr(ROLE);\n } else {\n popup = ul.data(KENDOPOPUP);\n popup.options.origin = directions.origin;\n popup.options.position = directions.position;\n popup.options.animation.open.effects = openEffects;\n }\n ul.removeAttr(\"aria-hidden\");\n li.attr(ARIA_EXPANDED, true);\n\n that._configurePopupOverflow(popup, li);\n\n popup._hovered = true;\n popup.open();\n\n that._initPopupScrolling(popup);\n }\n\n }, that.options.hoverDelay));\n });\n\n return that;\n },\n\n _configurePopupOverflow: function(popup, popupOpener) {\n var that = this;\n if (that.options.scrollable) {\n that._wrapPopupElement(popup);\n if (!popupOpener.attr(\"data-groupparent\")) {\n var groupId = new Date().getTime();\n popupOpener.attr(\"data-groupparent\", groupId);\n popup.element.attr(\"data-group\", groupId);\n }\n }\n },\n\n _wrapPopupElement: function(popup) {\n if (!popup.element.parent().is(animationContainerSelector)) {\n popup.wrapper = kendo.wrap(popup.element, popup.options.autosize)\n .css({\n overflow: \"hidden\",\n display: \"block\",\n position: \"absolute\"\n });\n }\n },\n\n _initPopupScrolling: function(popup, isHorizontal, skipMouseEvents) {\n var that = this;\n\n if (that.options.scrollable && popup.element[0].scrollHeight > popup.element[0].offsetHeight) {\n that._initPopupScrollButtons(popup, isHorizontal, skipMouseEvents);\n }\n },\n\n _initPopupScrollButtons: function(popup, isHorizontal, skipMouseEvents) {\n var that = this;\n var scrollButtons = popup.wrapper.children(scrollButtonSelector);\n var animation = that.options.animation;\n var timeout = ((animation && animation.open && animation.open.duration) || 0) + DELAY;\n setTimeout(function() {\n if (!scrollButtons.length) {\n var backwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? \"left\" : \"up\" }));\n var forwardBtn = $(that.templates.scrollButton({ direction: isHorizontal ? \"right\" : \"down\" }));\n\n scrollButtons = backwardBtn.add(forwardBtn).appendTo(popup.wrapper);\n\n that._initScrolling(popup.element, backwardBtn, forwardBtn, isHorizontal);\n if (!skipMouseEvents) {\n scrollButtons.on(MOUSEENTER + NS, function() {\n var overflowWrapper = that._overflowWrapper();\n $(getChildPopups(popup.element, overflowWrapper)).each(function(i, p) {\n var popupOpener = overflowWrapper.find(popupOpenerSelector(p.data(POPUP_ID_ATTR)));\n that.close(popupOpener);\n });\n })\n .on(MOUSELEAVE + NS, function() {\n setTimeout(function() {\n if ($.isEmptyObject(that._openedPopups)) {\n that._closeParentPopups(popup.element);\n }\n }, DELAY);\n });\n }\n }\n that._toggleScrollButtons(popup.element, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n }, timeout);\n },\n\n _popupOpen: function(e) {\n if (!this._keyTriggered) {\n e.sender.element.children(\".\" + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n }\n if (this.options.scrollable) {\n this._setPopupHeight(e.sender);\n }\n },\n\n _setPopupHeight: function(popup, isFixed) {\n var popupElement = popup.element;\n var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n\n popups.height((popupElement.hasClass(MENU) && this._initialHeight) || \"\");\n\n var location = popup._location(isFixed);\n var windowHeight = $(window).height();\n var popupOuterHeight = location.height;\n var popupOffsetTop = isFixed ? 0 : Math.max(location.top, 0);\n var scrollTop = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], \"scrollTop\");\n var bottomScrollbar = window.innerHeight - windowHeight;\n var maxHeight = windowHeight - kendo.getShadows(popupElement).bottom + bottomScrollbar;\n var canFit = maxHeight + scrollTop > popupOuterHeight + popupOffsetTop;\n\n if (!canFit) {\n var height = Math.min(maxHeight, maxHeight - popupOffsetTop + scrollTop);\n popups.css({ overflow: \"hidden\", height: height + \"px\" });\n }\n },\n\n close: function(items, dontClearClose) {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n var element = (overflowWrapper || that.element);\n\n items = element.find(items);\n\n if (!items.length) {\n items = element.find(\">.k-item\");\n }\n\n var hasChildPopupsHovered = function(currentPopup) {\n var result = false;\n if ($.isEmptyObject(that._openedPopups)) {\n return result;\n }\n $(getChildPopups(currentPopup, overflowWrapper)).each(function(i, popup) {\n result = !!that._openedPopups[popup.data(POPUP_ID_ATTR).toString()];\n return !result;\n });\n return result;\n };\n\n var isPopupMouseLeaved = function(opener) {\n var groupId = opener.data(POPUP_OPENER_ATTR);\n return (!overflowWrapper || !groupId || !that._openedPopups[groupId.toString()]);\n };\n\n items.each(function() {\n var li = $(this);\n\n li.attr(ARIA_EXPANDED, false);\n\n if (!dontClearClose && that._isRootItem(li)) {\n that.clicked = false;\n }\n\n clearTimeout(li.data(TIMER));\n\n li.data(TIMER, setTimeout(function() {\n var popup = that._getPopup(li);\n if (popup && (isPopupMouseLeaved(li) || that._forceClose)) {\n if (!that._forceClose && hasChildPopupsHovered(popup.element)) {\n return;\n }\n\n popup.close();\n popup.element.attr(\"aria-hidden\", true);\n\n if (overflowWrapper) {\n if (that._forceClose && items.last().is(li[0])) {\n delete that._forceClose;\n }\n }\n }\n }, that.options.hoverDelay));\n });\n\n return that;\n },\n\n _getPopup: function(li) {\n var that = this;\n var popup = li.find(\".k-menu-group:not(.k-list-container):not(.k-calendar-container):visible\").first().data(KENDOPOPUP);\n var overflowWrapper = that._overflowWrapper();\n\n if (!popup && overflowWrapper) {\n var groupId = li.data(POPUP_OPENER_ATTR);\n if (groupId) {\n var popupElement = overflowWrapper.find(popupGroupSelector(groupId));\n popup = popupElement.data(KENDOPOPUP);\n }\n }\n return popup;\n },\n\n _toggleDisabled: function(items, enable) {\n this.element.find(items).each(function() {\n $(this)\n .toggleClass(DISABLEDSTATE, !enable)\n .attr(\"aria-disabled\", !enable);\n });\n },\n\n _toggleHover: function(e) {\n var target = $(kendo.eventTarget(e) || e.target).closest(allItemsSelector),\n isEnter = e.type == MOUSEENTER || MOUSEDOWN.indexOf(e.type) !== -1;\n\n target.siblings().removeClass(HOVERSTATE);\n\n if (!target.parents(\"li.\" + DISABLEDSTATE).length) {\n target.toggleClass(HOVERSTATE, isEnter || e.type == \"mousedown\" || e.type == \"pointerover\" || e.type == TOUCHSTART);\n }\n\n this._removeHoverItem();\n },\n\n _preventClose: function() {\n if (!this.options.closeOnClick) {\n this._closurePrevented = true;\n }\n },\n\n _checkActiveElement: function(e) {\n var that = this,\n hoverItem = $(e ? e.currentTarget : this._hoverItem()),\n target = that._findRootParent(hoverItem)[0];\n\n if (!this._closurePrevented) {\n setTimeout(function() {\n if (!document.hasFocus() || (!contains(target, kendo._activeElement()) && e && !contains(target, e.currentTarget))) {\n that.close(target);\n }\n }, 0);\n }\n\n this._closurePrevented = false;\n },\n\n _removeHoverItem: function() {\n var oldHoverItem = this._hoverItem();\n\n if (oldHoverItem && oldHoverItem.hasClass(FOCUSEDSTATE)) {\n oldHoverItem.removeClass(FOCUSEDSTATE);\n this._oldHoverItem = null;\n }\n },\n\n _updateClasses: function() {\n var element = this.element,\n nonContentGroupsSelector = \".k-menu-init div ul\",\n items;\n\n element.removeClass(\"k-menu-horizontal k-menu-vertical\");\n element.addClass(\"k-widget k-reset k-menu-init \" + MENU).addClass(MENU + \"-\" + this.options.orientation);\n\n if (this.options.orientation === \"vertical\") {\n element.attr(\"aria-orientation\", \"vertical\");\n } else {\n element.attr(\"aria-orientation\", \"horizontal\");\n }\n\n element.find(\"li > ul\")\n .filter(function() {\n return !kendo.support.matchesSelector.call(this, nonContentGroupsSelector);\n })\n .addClass(\"k-group k-menu-group k-menu-group-md\")\n .attr(ROLE, \"menu\")\n .hide()\n .attr(\"aria-hidden\", element.is(\":visible\"))\n .parent(\"li\")\n .attr(\"aria-haspopup\", \"true\")\n .end()\n .find(\"li > div\")\n .addClass(\"k-content\")\n .attr(\"tabindex\", \"-1\"); // Capture the focus before the Menu\n\n element.find(\"li[aria-haspopup]\").attr(ARIA_EXPANDED, false);\n\n items = element.find(\"> li,.k-menu-group > li\");\n\n element.removeClass(\"k-menu-init\");\n\n items.each(function() {\n updateItemClasses(this);\n });\n },\n\n _mouseenter: function(e) {\n var that = this;\n var element = $(e.currentTarget);\n var hasChildren = that._itemHasChildren(element);\n var popupId = element.data(POPUP_OPENER_ATTR) || element.parent().data(POPUP_ID_ATTR);\n var pointerTouch = isPointerTouch(e);\n var isParentClosing = false;\n\n if (popupId) {\n that._openedPopups[popupId.toString()] = true;\n }\n\n if (that._closing) {\n isParentClosing = !!that._closing.find(element).length;\n }\n\n if (isParentClosing || (e.delegateTarget != element.parents(menuSelector)[0] && e.delegateTarget != element.parents(\".k-menu-scroll-wrapper,.k-popups-wrapper\")[0])) {\n return;\n }\n\n that._keyTriggered = false;\n\n if ((that.options.openOnClick.rootMenuItems && that._isRootItem(element.closest(allItemsSelector))) ||\n (that.options.openOnClick.subMenuItems && !that._isRootItem(element.closest(allItemsSelector)))) {\n return;\n }\n\n if ((that.options.openOnClick === false ||\n (that.options.openOnClick.rootMenuItems === false && that._isRootItem(element.closest(allItemsSelector))) ||\n (that.options.openOnClick.subMenuItems === false && !that._isRootItem(element.closest(allItemsSelector))) || that.clicked) && !touch &&\n !(pointerTouch && that._isRootItem(element.closest(allItemsSelector)))) {\n\n if (!contains(e.currentTarget, e.relatedTarget) && hasChildren) {\n that.open(element);\n }\n }\n\n if (that.options.openOnClick === true && that.clicked || touch) {\n element.siblings().each(function(_, sibling) {\n that.close(sibling, true);\n });\n }\n },\n\n _mousedown: function(e) {\n var that = this;\n var element = $(e.currentTarget);\n // needs to close subMenuItems\n if (that.options.openOnClick.subMenuItems && !that._isRootItem(element) || touch) {\n element.siblings().each(function(_, sibling) {\n that.close(sibling, true);\n });\n }\n },\n\n _mouseleave: function(e) {\n var that = this;\n var element = $(e.currentTarget);\n var popupOpener = element.data(POPUP_OPENER_ATTR);\n var hasChildren = (element.children(animationContainerSelector).length || element.children(groupSelector).length) || popupOpener;\n var $window = $(window);\n\n if (popupOpener) {\n delete that._openedPopups[popupOpener.toString()];\n }\n\n if (element.parentsUntil(animationContainerSelector, \".k-list-container,.k-calendar-container\")[0]) {\n e.stopImmediatePropagation();\n return;\n }\n\n if ((that.options.openOnClick === false || (!that.options.openOnClick.rootMenuItems && that._isRootItem(element)) ||\n (!that.options.openOnClick.subMenuItems && !that._isRootItem(element))) && !touch && !isPointerTouch(e) &&\n !contains(e.currentTarget, e.relatedTarget || e.target) && hasChildren &&\n !contains(e.currentTarget, kendo._activeElement())) {\n that.close(element, true);\n that._loading = false;\n return;\n }\n\n // Detect if cursor goes outside the viewport of the browser\n if ( (kendo.support.browser.msie && !e.toElement && !e.relatedTarget && !isPointerTouch(e)) ||\n e.clientX < 0 || e.clientY < 0 ||\n e.clientY > $window.height() ||\n e.clientX > $window.width()) {\n that.close(element);\n }\n },\n\n _mouseenterPopup: function(e) {\n var that = this;\n var popupElement = $(e.currentTarget);\n\n if (popupElement.parent().is(animationContainerSelector)) {\n return;\n }\n\n popupElement = popupElement.children(\"ul\");\n var popupId = popupElement.data(POPUP_ID_ATTR);\n\n if (popupId) {\n that._openedPopups[popupId.toString()] = true;\n }\n },\n\n _mouseleavePopup: function(e) {\n var that = this;\n var popupElement = $(e.currentTarget);\n\n if (!isPointerTouch(e) && popupElement.is(animationContainerSelector)) {\n that._closePopups(popupElement.children(\"ul\"));\n }\n },\n\n _closePopups: function(rootPopup) {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n var popupId = rootPopup.data(POPUP_ID_ATTR);\n\n if (popupId) {\n delete that._openedPopups[popupId.toString()];\n var groupParent = overflowWrapper.find(popupOpenerSelector(popupId));\n\n setTimeout(function() {\n if (that.options.openOnClick) {\n that._closeChildPopups(rootPopup);\n } else {\n if ($.isEmptyObject(that._openedPopups)) {\n var innerPopup = that._innerPopup(rootPopup);\n that._closeParentPopups(innerPopup);\n } else {\n that.close(groupParent, true);\n }\n }\n }, 0);\n }\n },\n\n _closeChildPopups: function(current) {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n $(getChildPopups(current, overflowWrapper)).each(function() {\n var popupOpener = overflowWrapper.find(popupOpenerSelector(this.data(POPUP_ID_ATTR)));\n that.close(popupOpener, true);\n });\n },\n\n _innerPopup: function(current) {\n var overflowWrapper = this._overflowWrapper();\n var popups = getChildPopups(current, overflowWrapper);\n return popups[popups.length - 1] || current;\n },\n\n _closeParentPopups: function(current) {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n var popupId = current.data(POPUP_ID_ATTR);\n var popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n that.close(popupOpener, true);\n while (popupId && !that._openedPopups[popupId]) {\n if (popupOpener.parent().is(menuSelector)) {\n break;\n }\n popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n that.close(popupOpener, true);\n popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n }\n },\n\n _click: function(e) {\n var that = this, openHandle,\n options = that.options,\n target = $(kendo.eventTarget(e)),\n targetElement = target[0],\n nodeName = target[0] ? target[0].nodeName.toUpperCase() : \"\",\n formNode = (nodeName == \"INPUT\" || nodeName == \"SELECT\" || nodeName == \"BUTTON\" || nodeName == \"LABEL\"),\n link = target.closest(LINK_SELECTOR),\n element = target.closest(allItemsSelector),\n itemElement = element[0],\n href = link.attr(\"href\"), childGroup, childGroupVisible,\n targetHref = target.attr(\"href\"),\n sampleHref = $(\"\").attr(\"href\"),\n isLink = (!!href && href !== sampleHref),\n isLocalLink = isLink && !!href.match(/^#/),\n isTargetLink = (!!targetHref && targetHref !== sampleHref),\n overflowWrapper = that._overflowWrapper(),\n shouldCloseTheRootItem;\n\n if (targetElement && (!targetElement.parentNode || !itemElement)) {\n return;\n }\n\n if ($(target).hasClass('k-menu-expand-arrow-icon')) {\n this._lastClickedElement = itemElement;\n }\n\n while (targetElement && targetElement.parentNode != itemElement) {\n targetElement = targetElement.parentNode;\n }\n\n if ($(targetElement).is(templateSelector)) {\n return;\n }\n\n if (element.hasClass(DISABLEDSTATE)) {\n e.preventDefault();\n return;\n }\n\n if (!e.handled && that._triggerSelect(target, itemElement) && !formNode) { // We shouldn't stop propagation and shoudn't prevent form elements.\n e.preventDefault();\n }\n\n e.handled = true;\n\n childGroup = element.children(popupSelector);\n if (overflowWrapper) {\n var childPopupId = element.data(POPUP_OPENER_ATTR);\n if (childPopupId) {\n childGroup = overflowWrapper.find(popupGroupSelector(childPopupId));\n }\n }\n childGroupVisible = childGroup.is(\":visible\");\n shouldCloseTheRootItem = options.openOnClick && childGroupVisible && that._isRootItem(element);\n\n if (options.closeOnClick && (!isLink || isLocalLink) && (!childGroup.length || shouldCloseTheRootItem)) {\n element.removeClass(HOVERSTATE).css(\"height\"); // Force refresh for Chrome\n that._oldHoverItem = that._findRootParent(element);\n var item = that._parentsUntil(link, that.element, allItemsSelector);\n that._forceClose = !!overflowWrapper;\n that.close(item);\n that.clicked = false;\n if (\"MSPointerUp\".indexOf(e.type) != -1) {\n e.preventDefault();\n }\n return;\n }\n\n if (isLink && e.enterKey) {\n link[0].click();\n }\n\n if (((!that._isRootItem(element) || options.openOnClick === false) && !options.openOnClick.subMenuItems) && !kendo.support.touch && !(isPointerTouch(e) && that._isRootItem(element.closest(allItemsSelector)))) {\n return;\n }\n\n if (!isLink && !formNode && !isTargetLink) {\n e.preventDefault();\n }\n\n that.clicked = true;\n openHandle = childGroup.is(\":visible\") ? CLOSE : OPEN;\n if (!options.closeOnClick && openHandle == CLOSE) {\n return;\n }\n that[openHandle](element);\n },\n\n _parentsUntil: function(context, top, selector) {\n var overflowWrapper = this._overflowWrapper();\n if (!overflowWrapper) {\n return context.parentsUntil(top, selector);\n } else {\n var parents = overflowMenuParents(context, overflowWrapper);\n var result = [];\n $(parents).each(function() {\n var parent = $(this);\n if (parent.is(top)) {\n return false;\n }\n if (parent.is(selector)) {\n result.push(this);\n }\n });\n return $(result);\n }\n },\n\n _triggerSelect: function(target, itemElement) {\n target = target.is(\".k-link\") ? target : target.closest(\".k-link\");\n\n var selectHandler = target.data(\"selectHandler\"),\n itemSelectEventData;\n\n if (selectHandler) {\n itemSelectEventData = this._getEventData(target);\n selectHandler.call(this, itemSelectEventData);\n }\n\n var isSelectItemDefaultPrevented = itemSelectEventData && itemSelectEventData.isDefaultPrevented();\n var isSelectDefaultPrevented = this._triggerEvent({ item: itemElement, type: SELECT });\n return isSelectItemDefaultPrevented || isSelectDefaultPrevented;\n },\n\n _getEventData: function(target) {\n var eventData = {\n sender: this,\n target: target,\n _defaultPrevented: false,\n preventDefault: function() {\n this._defaultPrevented = true;\n },\n isDefaultPrevented: function() {\n return this._defaultPrevented;\n }\n };\n return eventData;\n },\n\n _documentClick: function(e) {\n var that = this;\n var target = $(e.target).hasClass('k-menu-expand-arrow-icon') ? that._lastClickedElement : e.target;\n\n if (contains((that._overflowWrapper() || that.element)[0], target)) {\n that._lastClickedElement = undefined;\n return;\n }\n\n that.clicked = false;\n },\n\n _focus: function(e) {\n var that = this,\n target = e.target,\n hoverItem = that._hoverItem(),\n active = activeElement();\n\n if (target != that.wrapper[0] && !$(target).is(\":kendoFocusable\")) {\n e.stopPropagation();\n $(target).closest(\".k-content\").closest(\".k-menu-group\").closest(\".k-item\").addClass(FOCUSEDSTATE);\n that.wrapper.trigger(\"focus\");\n return;\n }\n\n if (active === e.currentTarget) {\n if (hoverItem.length) {\n that._moveHover([], hoverItem);\n } else if (!that._oldHoverItem) {\n that._moveHover([], that.wrapper.children().first());\n }\n }\n },\n\n _keydown: function(e) {\n var that = this,\n key = e.keyCode,\n hoverItem = that._oldHoverItem,\n target,\n belongsToVertical,\n hasChildren,\n isRtl = kendo.support.isRtl(that.wrapper);\n\n if (e.target != e.currentTarget && key != keys.ESC) {\n return;\n }\n\n if (!hoverItem) {\n hoverItem = that._oldHoverItem = that._hoverItem();\n }\n\n belongsToVertical = that._itemBelongsToVertival(hoverItem);\n hasChildren = that._itemHasChildren(hoverItem);\n that._keyTriggered = true;\n\n if (key == keys.RIGHT) {\n target = that[isRtl ? \"_itemLeft\" : \"_itemRight\"](hoverItem, belongsToVertical, hasChildren);\n } else if (key == keys.LEFT) {\n target = that[isRtl ? \"_itemRight\" : \"_itemLeft\"](hoverItem, belongsToVertical, hasChildren);\n } else if (key == keys.DOWN) {\n target = that._itemDown(hoverItem, belongsToVertical, hasChildren);\n } else if (key == keys.UP) {\n target = that._itemUp(hoverItem, belongsToVertical, hasChildren);\n } else if (key == keys.HOME) {\n that._moveHover(hoverItem, hoverItem.parent().children().first());\n e.preventDefault();\n } else if (key == keys.END) {\n that._moveHover(hoverItem, hoverItem.parent().children().last());\n e.preventDefault();\n } else if (key == keys.ESC) {\n target = that._itemEsc(hoverItem, belongsToVertical);\n } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n target = hoverItem.children(\".k-link\");\n if (target.length > 0) {\n that._click({ target: target[0], preventDefault: function() {}, enterKey: true });\n if (hasChildren && !hoverItem.hasClass(DISABLEDSTATE)) {\n that.open(hoverItem);\n that._moveHover(hoverItem, that._childPopupElement(hoverItem).children().first());\n } else if (hoverItem.is(\"li\") && hoverItem.attr(\"role\") === \"menuitemcheckbox\") {\n hoverItem.find(\".k-checkbox\").attr(\"checked\", true);\n } else {\n that._moveHoverToRoot(hoverItem, that._findRootParent(hoverItem));\n }\n }\n } else if (key == keys.TAB) {\n target = that._findRootParent(hoverItem);\n that._moveHover(hoverItem, target);\n that._checkActiveElement();\n return;\n }\n\n if (target && target[0]) {\n e.preventDefault();\n e.stopPropagation(); // needed to handle ESC in column menu only when a root item is focused\n }\n },\n\n _hoverItem: function() {\n return this.wrapper.find(\".k-item.k-hover,.k-item.k-focus\").filter(\":visible\");\n },\n\n _itemBelongsToVertival: function(item) {\n var menuIsVertical = this.wrapper.hasClass(\"k-menu-vertical\");\n\n if (!item.length) {\n return menuIsVertical;\n }\n return item.parent().hasClass(\"k-menu-group\") || menuIsVertical;\n },\n\n _itemHasChildren: function(item) {\n if (!item || !item.length || !item[0].nodeType) {\n return false;\n }\n return item.children(\".k-menu-group, div.k-animation-container\").length > 0 ||\n (!!item.data(POPUP_OPENER_ATTR) && !!this._overflowWrapper().children(popupGroupSelector(item.data(POPUP_OPENER_ATTR))));\n },\n\n _moveHover: function(item, nextItem) {\n var that = this,\n id = that._ariaId;\n\n if (item.length && nextItem.length) {\n item.removeClass(FOCUSEDSTATE);\n }\n\n if (nextItem.length) {\n if (nextItem[0].id) {\n id = nextItem[0].id;\n }\n\n nextItem.addClass(FOCUSEDSTATE);\n that._oldHoverItem = nextItem;\n\n if (id) {\n that.element.removeAttr(\"aria-activedescendant\");\n $(\"#\" + id).removeAttr(\"id\");\n nextItem.attr(\"id\", id);\n that.element.attr(\"aria-activedescendant\", id);\n }\n that._scrollToItem(nextItem);\n }\n },\n\n _moveHoverToRoot: function(item, nextItem) {\n this._moveHover(item, nextItem);\n },\n\n _findRootParent: function(item) {\n if (this._isRootItem(item)) {\n return item;\n } else {\n return this._parentsUntil(item, menuSelector, \"li.k-item\").last();\n }\n },\n\n _isRootItem: function(item) {\n return item.parent().hasClass(MENU);\n },\n\n _itemRight: function(item, belongsToVertical, hasChildren) {\n var that = this,\n nextItem,\n parentItem,\n overflowWrapper;\n\n if (!belongsToVertical) {\n nextItem = item.nextAll(itemSelector + exclusionSelector).eq(0);\n if (!nextItem.length) {\n nextItem = item.prevAll(itemSelector + exclusionSelector).last();\n }\n that.close(item);\n } else if (hasChildren && !item.hasClass(DISABLEDSTATE)) {\n that.open(item);\n nextItem = that._childPopupElement(item).children().first();\n } else if (that.options.orientation == \"horizontal\") {\n parentItem = that._findRootParent(item);\n overflowWrapper = that._overflowWrapper();\n if (overflowWrapper) {\n var rootPopup = itemPopup(parentItem, overflowWrapper);\n that._closeChildPopups(rootPopup);\n }\n that.close(parentItem);\n nextItem = parentItem.nextAll(itemSelector + exclusionSelector).eq(0);\n }\n\n if (nextItem && !nextItem.length) {\n nextItem = that.wrapper.children(\".k-item\").first();\n } else if (!nextItem) {\n nextItem = [];\n }\n\n that._moveHover(item, nextItem);\n return nextItem;\n },\n\n _itemLeft: function(item, belongsToVertical) {\n var that = this,\n nextItem,\n overflowWrapper;\n\n if (!belongsToVertical) {\n nextItem = item.prevAll(itemSelector + exclusionSelector).eq(0);\n if (!nextItem.length) {\n nextItem = item.nextAll(itemSelector + exclusionSelector).last();\n }\n that.close(item);\n } else {\n nextItem = item.parent().closest(\".k-item\");\n overflowWrapper = that._overflowWrapper();\n if (!nextItem.length && overflowWrapper) {\n nextItem = popupParentItem(item.parent(), overflowWrapper);\n }\n that.close(nextItem);\n if (that._isRootItem(nextItem) && that.options.orientation == \"horizontal\") {\n nextItem = nextItem.prevAll(itemSelector + exclusionSelector).eq(0);\n }\n }\n\n if (!nextItem.length) {\n nextItem = that.wrapper.children(\".k-item\").last();\n }\n\n that._moveHover(item, nextItem);\n return nextItem;\n },\n\n _itemDown: function(item, belongsToVertical, hasChildren) {\n var that = this,\n nextItem;\n\n if (!belongsToVertical) {\n if (!hasChildren || item.hasClass(DISABLEDSTATE)) {\n return;\n } else {\n that.open(item);\n nextItem = that._childPopupElement(item).children().first();\n }\n } else {\n nextItem = item.nextAll(itemSelector + exclusionSelector).eq(0);\n }\n\n if (!nextItem.length && item.length) {\n nextItem = item.parent().children().first();\n } else if (!item.length) {\n nextItem = that.wrapper.children(\".k-item\").first();\n }\n\n that._moveHover(item, nextItem);\n return nextItem;\n },\n\n _itemUp: function(item, belongsToVertical) {\n var that = this,\n nextItem;\n\n if (!belongsToVertical) {\n return;\n } else {\n nextItem = item.prevAll(itemSelector + exclusionSelector).eq(0);\n }\n\n if (!nextItem.length && item.length) {\n nextItem = item.parent().children().last();\n } else if (!item.length) {\n nextItem = that.wrapper.children(\".k-item\").last();\n }\n\n that._moveHover(item, nextItem);\n return nextItem;\n },\n\n _scrollToItem: function(item) {\n var that = this;\n if (that.options.scrollable && item && item.length) {\n var ul = item.parent();\n var isHorizontal = ul.hasClass(MENU) ? that.options.orientation == \"horizontal\" : false;\n var scrollDir = isHorizontal ? \"scrollLeft\" : \"scrollTop\";\n var getSize = isHorizontal ? kendo._outerWidth : kendo._outerHeight;\n var currentScrollOffset = ul[scrollDir]();\n var itemSize = getSize(item);\n var itemOffset = item[0][isHorizontal ? \"offsetLeft\" : \"offsetTop\"];\n var ulSize = getSize(ul);\n var scrollButtons = ul.siblings(scrollButtonSelector);\n var scrollButtonSize = scrollButtons.length ? getSize(scrollButtons.first()) : 0;\n var itemPosition;\n\n if (currentScrollOffset + ulSize < itemOffset + itemSize + scrollButtonSize) {\n itemPosition = itemOffset + itemSize - ulSize + scrollButtonSize;\n } else if (currentScrollOffset > itemOffset - scrollButtonSize) {\n itemPosition = itemOffset - scrollButtonSize;\n }\n\n if (!isNaN(itemPosition)) {\n var scrolling = {};\n scrolling[scrollDir] = itemPosition;\n ul.finish().animate(scrolling, \"fast\", \"linear\", function() {\n that._toggleScrollButtons(ul, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n });\n }\n }\n },\n\n _itemEsc: function(item, belongsToVertical) {\n var that = this,\n nextItem, groupId;\n\n if (!belongsToVertical) {\n return item;\n } else {\n nextItem = item.parent().closest(\".k-item\");\n\n if (nextItem.length === 0) {\n groupId = item.closest(\".k-group\").data(\"group\");\n nextItem = that.wrapper.find(\".k-item[data-groupparent='\" + groupId + \"']\");\n }\n\n that.close(nextItem);\n that._moveHover(item, nextItem);\n }\n\n return nextItem;\n },\n\n _childPopupElement: function(item) {\n var popupElement = item.find(\".k-menu-group\");\n var wrapper = this._overflowWrapper();\n if (!popupElement.length && wrapper) {\n popupElement = itemPopup(item, wrapper);\n }\n return popupElement;\n },\n\n _triggerEvent: function(e) {\n var that = this;\n\n return that.trigger(e.type, { type: e.type, item: e.item });\n },\n\n _focusHandler: function(e) {\n var that = this,\n item = $(kendo.eventTarget(e)).closest(allItemsSelector);\n\n if (item.hasClass(DISABLEDSTATE)) {\n return;\n }\n\n setTimeout(function() {\n that._moveHover([], item);\n if (item.children(\".k-content\")[0]) {\n item.parent().closest(\".k-item\").removeClass(FOCUSEDSTATE);\n }\n }, 200);\n },\n\n _animations: function(options) {\n if (options && (\"animation\" in options) && !options.animation) {\n options.animation = { open: { effects: {} }, close: { hide: true, effects: {} } };\n }\n },\n _dataSource: function(options) {\n var that = this,\n dataSource = options ? options.dataSource : that.options.dataSource;\n\n if (!dataSource) {\n return;\n }\n\n dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n\n that._unbindDataSource();\n\n if (!dataSource.fields) {\n dataSource.fields = [\n { field: \"uid\" },\n { field: \"text\" },\n { field: \"url\" },\n { field: \"cssClass\" },\n { field: \"spriteCssClass\" },\n { field: \"imageUrl\" },\n { field: \"imageAttr\" },\n { field: \"attr\" },\n { field: \"contentAttr\" },\n { field: \"content\" },\n { field: \"encoded\" },\n { field: \"items\" },\n { field: \"select\" }\n ];\n }\n\n that.dataSource = HierarchicalDataSource.create(dataSource);\n\n that._bindDataSource();\n\n that.dataSource.fetch();\n },\n\n _bindDataSource: function() {\n this._refreshHandler = this.refresh.bind(this);\n this._errorHandler = this._error.bind(this);\n\n this.dataSource.bind(CHANGE, this._refreshHandler);\n this.dataSource.bind(ERROR, this._errorHandler);\n },\n\n _unbindDataSource: function() {\n var dataSource = this.dataSource;\n\n if (dataSource) {\n dataSource.unbind(CHANGE, this._refreshHandler);\n dataSource.unbind(ERROR, this._errorHandler);\n }\n },\n\n _error: function() {\n\n },\n\n findByUid: function(uid) {\n var wrapperElement = this._overflowWrapper() || this.element;\n return wrapperElement.find(\"[\" + kendo.attr(\"uid\") + \"=\" + uid + \"]\");\n },\n\n refresh: function(ev) {\n var that = this;\n var node = ev.node;\n var action = ev.action;\n var parentElement = node ? that.findByUid(node.uid) : that.element;\n var itemsToUpdate = ev.items;\n var index = ev.index;\n var updateProxy = that._updateItem.bind(that);\n var removeProxy = that._removeItem.bind(that);\n\n if (action == \"add\") {\n that._appendItems(itemsToUpdate, index, parentElement);\n } else if (action == \"remove\") {\n itemsToUpdate.forEach(removeProxy);\n } else if (action == \"itemchange\") {\n itemsToUpdate.forEach(updateProxy);\n } else if (action === \"itemloaded\") {\n that.append(ev.items, parentElement);\n } else {\n this._initData();\n }\n\n this.trigger(DATABOUND, { item: parentElement, dataItem: node });\n },\n\n _appendItems: function(items, index, parent) {\n var that = this;\n var referenceItem = parent.find(itemSelector).eq(index);\n\n if (referenceItem.length) {\n that.insertBefore(items, referenceItem);\n } else {\n that.append(items, parent);\n }\n },\n\n _removeItem: function(item) {\n var that = this;\n var element = that.findByUid(item.uid);\n that.remove(element);\n },\n\n _updateItem: function(item) {\n var that = this;\n var element = that.findByUid(item.uid);\n var nextElement = element.next();\n var parentNode = item.parentNode();\n\n that.remove(element);\n\n if (nextElement.length) {\n that.insertBefore(item, nextElement);\n } else {\n that.append(item, parentNode && that.findByUid(parentNode.uid));\n }\n },\n\n _accessors: function() {\n var that = this,\n options = that.options,\n i, field, textField,\n element = that.element;\n\n for (i in bindings) {\n field = options[bindings[i]];\n textField = element.attr(kendo.attr(i + \"-field\"));\n\n if (!field && textField) {\n field = textField;\n }\n\n if (!field) {\n field = i;\n }\n\n if (!isArray(field)) {\n field = [field];\n }\n\n options[bindings[i]] = field;\n }\n },\n\n _fieldAccessor: function(fieldName) {\n var fieldBindings = this.options[bindings[fieldName]] || [],\n count = fieldBindings.length,\n result = \"(function(item) {\";\n\n if (count === 0) {\n result += \"return item['\" + fieldName + \"'];\";\n } else {\n result += \"var levels = [\" +\n $.map(fieldBindings, function(x) {\n return \"function(d){ return \" + kendo.expr(x) + \"}\";\n }).join(\",\") + \"];\";\n result += \"if(item.level){return levels[Math.min(item.level(), \" + count + \"-1)](item);}else\";\n result += \"{return levels[\" + count + \"-1](item)}\";\n }\n\n result += \"})\";\n\n return result;\n },\n\n _templates: function() {\n var that = this,\n options = that.options,\n fieldAccessor = that._fieldAccessor.bind(that);\n\n if (options.template && typeof options.template == STRING) {\n options.template = template(options.template);\n } else if (!options.template) {\n options.template = template(\n \"\" +\n \"# var text = \" + fieldAccessor(\"text\") + \"(data.item); #\" +\n \"# if (typeof data.item.encoded != 'undefined' && data.item.encoded === false) {#\" +\n \"#= text #\" +\n \"# } else { #\" +\n \"#: text #\" +\n \"# } #\"\n );\n }\n\n that.templates = {\n content: template(\n \"#var contentHtml = \" + fieldAccessor(\"content\") + \"(item);#\" +\n \"
#= contentHtml || '' #
\"\n ),\n group: template(\n \"\"\n ),\n itemWrapper: template(\n \"# var url = \" + fieldAccessor(\"url\") + \"(item); #\" +\n \"# var imageUrl = \" + fieldAccessor(\"imageUrl\") + \"(item); #\" +\n \"# var imgAttributes = \" + fieldAccessor(\"imageAttr\") + \"(item);#\" +\n \"# var tag = url ? 'a' : 'span' #\" +\n \"<#= tag # class='#= textClass(item) #' #if(url){#href='#= url #'#}#>\" +\n\n \"# if (imageUrl) { #\" +\n \"\" +\n \"# } #\" +\n\n \"#= sprite(item) #\" +\n \"#= data.menu.options.template(data) #\" +\n \"#= arrow(data) #\" +\n \"\"\n ),\n item: template(\n \"#var contentHtml = \" + fieldAccessor(\"content\") + \"(item);#\" +\n \"\"\n ),\n scrollButton: template(\n \"\" +\n \"\" +\n \"\"\n ),\n arrow: template(\"\"),\n sprite: template(\"# var spriteCssClass = \" + fieldAccessor(\"spriteCssClass\") + \"(data); if(spriteCssClass) {##}#\"),\n empty: template(\"\")\n };\n },\n\n renderItem: function(options) {\n var that = this;\n options = extend({ menu: that, group: {} }, options);\n\n var empty = that.templates.empty,\n item = options.item;\n\n return that.templates.item(extend(options, {\n sprite: that.templates.sprite,\n itemWrapper: that.templates.itemWrapper,\n renderContent: that.renderContent,\n arrow: item.items || item.content || item[that.options.dataContentField[0]] ? that.templates.arrow : empty,\n subGroup: that.renderGroup\n }, rendering));\n },\n\n renderGroup: function(options) {\n var that = this;\n var templates = that.templates || options.menu.templates;\n\n return templates.group(extend({\n renderItems: function(options) {\n var html = \"\",\n i = 0,\n items = options.items,\n len = items ? items.length : 0,\n group = extend({ length: len }, options.group);\n\n for (; i < len; i++) {\n html += options.menu.renderItem(extend(options, {\n group: group,\n item: extend({ index: i }, items[i])\n }));\n }\n\n return html;\n }\n }, options, rendering));\n },\n\n renderContent: function(options) {\n return options.menu.templates.content(extend(options, rendering));\n }\n });\n\n var ContextMenu = Menu.extend({\n init: function(element, options) {\n var that = this;\n\n Menu.fn.init.call(that, element, options);\n\n that.element.attr(ROLE, \"menu\");\n\n that._marker = kendo.guid().substring(0, 8);\n\n that.target = $(that.options.target);\n\n that._popup();\n that._wire();\n },\n\n _initOverflow: function(options) {\n var that = this;\n if (options.scrollable && !that._overflowWrapper()) {\n that._openedPopups = {};\n\n that._popupsWrapper = (that.element.parent().is(animationContainerSelector) ? that.element.parent() : that.element)\n .wrap(\"
\").parent();\n\n if (that.options.orientation == \"horizontal\") {\n removeSpacesBetweenItems(that.element);\n }\n\n if (options.appendTo) {\n options.appendTo = $(options.appendTo);\n options.appendTo.append(that._popupsWrapper);\n }\n\n that._initialHeight = that.element[0].style.height;\n that._initialWidth = that.element[0].style.width;\n }\n },\n\n options: {\n name: \"ContextMenu\",\n filter: null,\n showOn: \"contextmenu\",\n orientation: \"vertical\",\n alignToAnchor: false,\n copyAnchorStyles: true,\n target: \"body\"\n },\n\n events: [\n OPEN,\n CLOSE,\n ACTIVATE,\n DEACTIVATE,\n SELECT\n ],\n\n setOptions: function(options) {\n var that = this;\n\n Menu.fn.setOptions.call(that, options);\n\n that.target.off(that.showOn + NS + that._marker, that._showProxy);\n\n if (that.userEvents) {\n that.userEvents.destroy();\n }\n\n that.target = $(that.options.target);\n if (options.orientation && that.popup.wrapper[0]) {\n that.popup.element.unwrap();\n }\n\n that._wire();\n\n Menu.fn.setOptions.call(this, options);\n },\n\n destroy: function() {\n var that = this;\n\n that.target.off(that.options.showOn + NS + that._marker);\n DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n\n if (that.userEvents) {\n that.userEvents.destroy();\n }\n\n Menu.fn.destroy.call(that);\n },\n\n open: function(x, y) {\n var that = this;\n\n x = $(x)[0];\n\n if (contains(that.element[0], $(x)[0]) || that._itemHasChildren($(x))) { // call parent open for children elements\n Menu.fn.open.call(that, x);\n } else {\n if (that._triggerEvent({ item: that.element, type: OPEN }) === false) {\n if (that.popup.visible() && that.options.filter) {\n that.popup.close(true);\n that.popup.element.kendoStop(true);\n }\n\n if (y !== undefined) {\n var overflowWrapper = that._overflowWrapper();\n if (overflowWrapper) {\n var offset = overflowWrapper.offset();\n x -= offset.left;\n y -= offset.top;\n }\n that.popup.wrapper.hide();\n that._configurePopupScrolling(x, y);\n that.popup.open(x, y);\n } else {\n that.popup.options.anchor = (x ? x : that.popup.anchor) || that.target;\n that.popup.element.kendoStop(true);\n that._configurePopupScrolling();\n that.popup.open();\n }\n\n DOCUMENT_ELEMENT.off(that.popup.downEvent, that.popup._mousedownProxy);\n DOCUMENT_ELEMENT\n .on(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n\n that.element.trigger(\"focus\");\n }\n }\n\n return that;\n },\n\n _configurePopupScrolling: function(x, y) {\n var that = this;\n var popup = that.popup;\n var isHorizontal = that.options.orientation == \"horizontal\";\n\n if (that.options.scrollable) {\n that._wrapPopupElement(popup);\n\n popup.element.parent().css({\n position: \"\",\n height: \"\"\n });\n\n popup.element.css({\n visibility: \"hidden\",\n display: \"\",\n position: \"\"\n });\n\n if (isHorizontal) {\n that._setPopupWidth(popup, isNaN(x) ? undefined : { isFixed: true, x: x, y: y });\n } else {\n that._setPopupHeight(popup, isNaN(x) ? undefined : { isFixed: true, x: x, y: y });\n }\n\n popup.element.css({\n visibility: \"\",\n display: \"none\",\n position: \"absolute\"\n });\n\n that._initPopupScrollButtons(popup, isHorizontal, true);\n popup.element.siblings(scrollButtonSelector).hide();\n }\n },\n\n _setPopupWidth: function(popup, isFixed) {\n var popupElement = popup.element;\n var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n\n popups.width(this._initialWidth || \"\");\n\n var location = popup._location(isFixed);\n var windowWidth = $(window).width();\n var popupOuterWidth = location.width;\n var popupOffsetLeft = Math.max(location.left, 0);\n var scrollLeft = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], \"scrollLeft\");\n var shadow = kendo.getShadows(popupElement);\n var maxWidth = windowWidth - shadow.left - shadow.right;\n var canFit = maxWidth + scrollLeft > popupOuterWidth + popupOffsetLeft;\n\n if (!canFit) {\n popups.css({ overflow: \"hidden\", width: (maxWidth - popupOffsetLeft + scrollLeft) + \"px\" });\n }\n },\n\n close: function() {\n var that = this;\n\n if (contains(that.element[0], $(arguments[0])[0]) || that._itemHasChildren(arguments[0])) {\n Menu.fn.close.call(that, arguments[0]);\n } else {\n if (that.popup.visible()) {\n if (that._triggerEvent({ item: that.element, type: CLOSE }) === false) {\n that._removeHoverItem();\n that.element.find(\"#\" + that._ariaId).removeAttr(\"id\");\n that.popup.close();\n DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n that.unbind(SELECT, that._closeTimeoutProxy);\n that.popup.options.anchor.focus();\n }\n }\n }\n },\n\n _showHandler: function(e) {\n var ev = e, offset,\n that = this,\n options = that.options,\n target = kendo.support.mobileOS ? $(ev.target) : $(ev.currentTarget);\n\n if (e.event) {\n ev = e.event;\n ev.pageX = e.x.location;\n ev.pageY = e.y.location;\n }\n\n if (contains(that.element[0], e.relatedTarget || e.target)) {\n return;\n }\n\n that._eventOrigin = ev;\n\n ev.preventDefault();\n ev.stopImmediatePropagation();\n\n that.element.find(\".\" + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n\n if ((options.filter && target.is(options.filter)) || !options.filter) {\n if (options.alignToAnchor) {\n that.popup.options.anchor = ev.currentTarget;\n that.open(ev.currentTarget);\n } else {\n that.popup.options.anchor = ev.currentTarget;\n\n if (that._targetChild) {\n offset = that.target.offset();\n that.open(ev.pageX - offset.left, ev.pageY - offset.top);\n } else {\n that.open(ev.pageX, ev.pageY);\n }\n }\n }\n },\n\n _closeHandler: function(e) {\n var that = this,\n target = $(e.relatedTarget || e.target),\n sameTarget = target.closest(that.target.selector)[0] == that.target[0],\n item = target.closest(itemSelector),\n children = that._itemHasChildren(item),\n overflowWrapper = that._overflowWrapper(),\n containment = contains(that.element[0], target[0]) || (overflowWrapper && contains(overflowWrapper[0], target[0]));\n\n that._eventOrigin = e;\n\n var normalClick = e.which !== 3;\n\n if (that.popup.visible() && ((normalClick && sameTarget) || !sameTarget) && ((that.options.closeOnClick && !children && containment) || !containment)) {\n if (containment) {\n this.unbind(SELECT, this._closeTimeoutProxy);\n that.bind(SELECT, that._closeTimeoutProxy);\n } else {\n that.close();\n }\n }\n },\n\n _wire: function() {\n var that = this,\n options = that.options,\n target = that.target;\n\n that._preventProxy = null;\n that._showProxy = that._showHandler.bind(that);\n that._closeProxy = that._closeHandler.bind(that);\n that._closeTimeoutProxy = that.close.bind(that);\n\n if (target[0]) {\n if (kendo.support.mobileOS && options.showOn == \"contextmenu\") {\n that.userEvents = new kendo.UserEvents(target, {\n filter: options.filter,\n allowSelection: false\n });\n\n that._preventProxy = function() { return false; };\n\n that.userEvents.bind(\"hold\", that._showProxy);\n }\n\n if (options.filter) {\n target.on(options.showOn + NS + that._marker, options.filter, that._preventProxy || that._showProxy);\n } else {\n target.on(options.showOn + NS + that._marker, that._preventProxy || that._showProxy);\n }\n }\n },\n\n _triggerEvent: function(e) {\n var that = this,\n anchor = $(that.popup.options.anchor)[0],\n origin = that._eventOrigin;\n\n that._eventOrigin = undefined;\n\n return that.trigger(e.type, extend({ type: e.type, item: e.item || this.element[0], target: anchor }, origin ? { event: origin } : {} ));\n },\n\n _popup: function() {\n var that = this;\n var overflowWrapper = that._overflowWrapper();\n\n that._triggerProxy = that._triggerEvent.bind(that);\n\n that.popup = that.element\n .addClass(\"k-context-menu\")\n .kendoPopup({\n autosize: that.options.orientation === \"horizontal\",\n anchor: that.target || \"body\",\n copyAnchorStyles: that.options.copyAnchorStyles,\n collision: that.options.popupCollision || \"fit\",\n animation: that.options.animation,\n activate: that._triggerProxy,\n deactivate: that._triggerProxy,\n appendTo: overflowWrapper || that.options.appendTo,\n close: !overflowWrapper ? $.noop : function(e) {\n $(getChildPopups(e.sender.element, overflowWrapper)).each(function(i, p) {\n var popup = p.data(KENDOPOPUP);\n if (popup) {\n popup.close(true);\n }\n });\n }\n }).data(KENDOPOPUP);\n\n that._targetChild = contains(that.target[0], that.popup.element[0]);\n },\n\n _moveHoverToRoot: function(item, nextItem) {\n this._moveHover(item, nextItem);\n this.close();\n },\n\n _focus: function(e) {\n var hoverItem = this._oldHoverItem = this._hoverItem() || [];\n\n Menu.fn._focus.call(this, e);\n\n if (activeElement() === e.currentTarget) {\n this._moveHover(hoverItem, this.wrapper.children().first());\n }\n }\n });\n\n ui.plugin(Menu);\n ui.plugin(ContextMenu);\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3) { (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","depends","$","window","kendo","jQuery","undefined","ui","activeElement","_activeElement","touch","support","mobileOS","isArray","Array","HierarchicalDataSource","data","MOUSEDOWN","CLICK","DELAY","SCROLLSPEED","extend","each","template","keys","Widget","excludedNodesRegExp","NS","IMG","OPEN","MENU","LINK","LINK_SELECTOR","ICON_SELECTOR","LAST","CLOSE","TIMER","FIRST","IMAGE","SELECT","ZINDEX","ACTIVATE","DEACTIVATE","POINTERDOWN","pointers","msPointers","allPointers","CHANGE","ERROR","TOUCHSTART","MOUSEENTER","MOUSELEAVE","MOUSEWHEEL","RESIZE","resize","SCROLLWIDTH","SCROLLHEIGHT","OFFSETWIDTH","OFFSETHEIGHT","POPUP_ID_ATTR","POPUP_OPENER_ATTR","DOCUMENT_ELEMENT","document","documentElement","KENDOPOPUP","HOVERSTATE","FOCUSEDSTATE","DISABLEDSTATE","SELECTEDSTATE","menuSelector","groupSelector","animationContainerSelector","popupSelector","allItemsSelector","disabledSelector","itemSelector","availableItemsSelector","linkSelector","exclusionSelector","templateSelector","scrollButtonSelector","touchPointerTypes","2","STRING","DATABOUND","ARIA_EXPANDED","ROLE","bindings","text","url","spriteCssClass","imageUrl","imageAttr","content","rendering","wrapperCssClass","group","item","result","index","enabled","firstLevel","length","cssClass","attr","hasOwnProperty","selected","itemCssAttributes","attributes","imageCssAttributes","imgAttributes","toJSON","contentCssAttributes","contentAttr","defaultClasses","textClass","arrowClass","horizontal","groupAttributes","expanded","groupCssClass","getEffectDirection","direction","root","split","replace","parseDirection","isRtl","output","origin","position","test","directions","reverse","join","contains","parent","child","e","updateItemClasses","omitWrap","addClass","children","filter","removeClass","empty","append","prop","contents","this","nodeName","match","nodeType","trim","nodeValue","wrapAll","idx","elm","wrap","updateArrow","updateFirstLast","find","remove","arrowCssClass","getArrowCssClass","hasClass","updateHasAriaPopup","parents","parentLi","eq","removeAttr","getParentLiItems","parentsUntil","storeItemSelectEventHandler","element","options","selectHandler","getItemSelectEventHandler","setItemData","items","i","select","isFunction","popupOpenerSelector","popupGroupSelector","selector","getChildPopups","currentPopup","overflowWrapper","childPopupOpener","opener","popupId","popup","push","popupParentItem","popupElement","itemPopup","overflowMenuParents","current","getParents","parentNode","is","elem","last","mousewheelDelta","delta","wheelDelta","Math","ceil","floor","detail","round","parentsScroll","scrollDirection","scroll","isNaN","isPointerTouch","originalEvent","pointerType","isTouch","ev","type","removeSpacesBetweenItems","ul","Menu","DataBoundWidget","init","that","fn","call","wrapper","_accessors","_templates","_dataSource","_updateClasses","_animations","nextItemZIndex","_tabindex","_initOverflow","_attachMenuEventsHandlers","openOnClick","clicked","_ariaId","format","notify","events","animation","open","duration","close","orientation","closeOnClick","hoverDelay","scrollable","popupCollision","_initData","dataSource","angular","elements","view","_overflowWrapper","_checkActiveProxy","_checkActiveElement","bind","on","_focusHandler","_click","_preventClose","_mouseenter","_mouseleave","_mousedown","_toggleHover","_keydown","_focus","_removeHoverItem","_mouseleavePopup","_mouseenterPopup","_documentClickHandler","_documentClick","_detachMenuEventsHandlers","off","isHorizontal","backwardBtn","forwardBtn","_openedPopups","_scrollWrapper","templates","scrollButton","add","appendTo","_initScrolling","initialWidth","outerWidth","initialCssWidth","style","width","setTimeout","_setOverflowWrapperWidth","_toggleScrollButtons","_popupsWrapper","wrapperCssWidth","css","wrapperWidth","menuWidth","borders","offsetWidth","clientWidth","min","_reinitOverflow","overflowChanged","distance","_destroyOverflow","popupWrapper","popupParentLi","unwrap","scrollElement","isNumeric","mouseWheelDistance","backward","forward","backwardDouble","forwardDouble","scrolling","touchEvents","value","scrollValue","scrollLeft","scrollTop","finish","animate","mouseenterHandler","mousedownHandler","stop","currentTarget","trigger","stopPropagation","preventDefault","eventMap","down","ctrlKey","shiftKey","altKey","scrollSpeed","abs","_closeChildPopups","n","parseFloat","isFinite","currentScroll","scrollSize","offset","toggle","setOptions","destroy","enable","_toggleDisabled","disable","attemptGetItem","candidate","referenceItem","inserted","_insert","_childPopupElement","insertBefore","before","insertAfter","after","groups","plain","isPlainObject","ObservableObject","groupData","renderGroup","ObservableArray","map","get","renderItem","charAt","parentItems","container","_openAfterLoad","dataItem","loaded","_loading","one","getByUid","ns","hasChildren","load","visiblePopups","closePopup","closest","siblings","li","clearTimeout","first","overflowPopup","_getPopup","_triggerEvent","windowHeight","height","setScrolling","maxHeight","_outerHeight","getShadows","bottom","overflow","nextZindex","zIndex","parentHorizontal","effects","openEffects","kendoPopup","activate","deactivate","_closing","sender","removeData","opacity","collision","anchor","_popupOpen","hide","mouseAndTouchPresent","_configurePopupOverflow","_hovered","_initPopupScrolling","popupOpener","_wrapPopupElement","groupId","Date","getTime","autosize","display","skipMouseEvents","scrollHeight","offsetHeight","_initPopupScrollButtons","scrollButtons","timeout","p","isEmptyObject","_closeParentPopups","_keyTriggered","_setPopupHeight","isFixed","popups","_initialHeight","location","_location","popupOuterHeight","popupOffsetTop","max","top","bottomScrollbar","innerHeight","canFit","dontClearClose","hasChildPopupsHovered","toString","isPopupMouseLeaved","_isRootItem","_forceClose","toggleClass","target","eventTarget","isEnter","indexOf","_closurePrevented","hoverItem","_hoverItem","_findRootParent","hasFocus","oldHoverItem","_oldHoverItem","nonContentGroupsSelector","matchesSelector","end","_itemHasChildren","pointerTouch","isParentClosing","delegateTarget","rootMenuItems","subMenuItems","relatedTarget","_","sibling","$window","stopImmediatePropagation","browser","msie","toElement","clientX","clientY","_closePopups","rootPopup","groupParent","innerPopup","_innerPopup","openHandle","targetElement","toUpperCase","formNode","link","itemElement","href","childGroup","childGroupVisible","targetHref","sampleHref","isLink","isLocalLink","isTargetLink","shouldCloseTheRootItem","_lastClickedElement","handled","_triggerSelect","childPopupId","_parentsUntil","enterKey","click","context","itemSelectEventData","_getEventData","isSelectItemDefaultPrevented","isDefaultPrevented","isSelectDefaultPrevented","eventData","_defaultPrevented","active","_moveHover","key","keyCode","belongsToVertical","ESC","_itemBelongsToVertival","RIGHT","LEFT","DOWN","_itemDown","UP","_itemUp","HOME","END","_itemEsc","ENTER","SPACEBAR","_moveHoverToRoot","TAB","menuIsVertical","nextItem","_scrollToItem","_itemRight","parentItem","nextAll","prevAll","_itemLeft","scrollDir","getSize","_outerWidth","currentScrollOffset","itemSize","itemOffset","ulSize","scrollButtonSize","itemPosition","_unbindDataSource","fields","field","create","_bindDataSource","fetch","_refreshHandler","refresh","_errorHandler","_error","unbind","findByUid","uid","wrapperElement","node","action","parentElement","itemsToUpdate","updateProxy","_updateItem","removeProxy","_removeItem","_appendItems","forEach","nextElement","next","textField","_fieldAccessor","fieldName","fieldBindings","count","x","expr","fieldAccessor","itemWrapper","arrow","sprite","menu","renderContent","dataContentField","subGroup","renderItems","html","len","ContextMenu","_marker","guid","substring","_popup","_wire","_initialWidth","showOn","alignToAnchor","copyAnchorStyles","_showProxy","userEvents","mousedown","_closeProxy","y","visible","kendoStop","left","_configurePopupScrolling","downEvent","_mousedownProxy","visibility","_setPopupWidth","windowWidth","popupOuterWidth","popupOffsetLeft","shadow","maxWidth","right","arguments","_closeTimeoutProxy","focus","_showHandler","event","pageX","pageY","_eventOrigin","_targetChild","_closeHandler","sameTarget","containment","normalClick","which","_preventProxy","UserEvents","allowSelection","_triggerProxy","noop","plugin","amd","a1","a2","a3"],"mappings":"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"}