{"version":3,"file":"kendo.selectable.min.js","sources":["kendo.selectable.js"],"sourcesContent":["(function(f, define) {\n define('kendo.selectable',[ \"kendo.core\", \"kendo.userevents\" ], f);\n})(function() {\n\nvar __meta__ = {\n id: \"selectable\",\n name: \"Selectable\",\n category: \"framework\",\n depends: [ \"core\", \"userevents\" ],\n advanced: true\n};\n\n(function($, undefined) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n abs = Math.abs,\n ARIASELECTED = \"aria-selected\",\n SELECTED = \"k-selected\",\n ACTIVE = \"k-selecting\",\n SELECTABLE = \"k-selectable\",\n CHANGE = \"change\",\n NS = \".kendoSelectable\",\n UNSELECT = \"unselect\",\n UNSELECTING = \"k-unselecting\",\n INPUTSELECTOR = \"input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up,label.k-checkbox-label.k-no-text,.k-icon.k-i-collapse,.k-icon.k-i-expand,span.k-numeric-wrap,.k-focusable\",\n msie = kendo.support.browser.msie,\n supportEventDelegation = false,\n extend = $.extend;\n\n (function($) {\n (function() {\n $('
')\n .on(\"click\", \">*\", function() {\n supportEventDelegation = true;\n })\n .find(\"span\")\n .trigger(\"click\")\n .end()\n .off();\n })();\n })($);\n\n var Selectable = Widget.extend({\n init: function(element, options) {\n var that = this,\n multiple,\n dragToSelect;\n\n Widget.fn.init.call(that, element, options);\n\n that._marquee = $(\"
\");\n that._lastActive = null;\n that.element.addClass(SELECTABLE);\n\n that.relatedTarget = that.options.relatedTarget;\n\n multiple = that.options.multiple;\n dragToSelect = that.options.dragToSelect;\n\n that.userEvents = new kendo.UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: (!supportEventDelegation ? \".\" + SELECTABLE + \" \" : \"\") + that.options.filter,\n tap: that._tap.bind(that),\n touchAction: multiple ? \"none\" : \"pan-x pan-y\"\n });\n\n if (multiple) {\n if (dragToSelect) {\n that.userEvents\n .bind(\"start\", that._start.bind(that))\n .bind(\"move\", that._move.bind(that))\n .bind(\"end\", that._end.bind(that));\n }\n that.userEvents\n .bind(\"select\", that._select.bind(that));\n }\n },\n\n events: [CHANGE, UNSELECT],\n\n options: {\n name: \"Selectable\",\n filter: \">*\",\n inputSelectors: INPUTSELECTOR,\n multiple: false,\n dragToSelect: true,\n relatedTarget: $.noop,\n ignoreOverlapped: false,\n addIdToRanges: false\n },\n\n _isElement: function(target) {\n var elements = this.element;\n var idx, length = elements.length, result = false;\n\n target = target[0];\n\n for (idx = 0; idx < length; idx ++) {\n if (elements[idx] === target) {\n result = true;\n break;\n }\n }\n\n return result;\n },\n\n _tap: function(e) {\n var target = $(e.target),\n that = this,\n ctrlKey = e.event.ctrlKey || e.event.metaKey,\n multiple = that.options.multiple,\n shiftKey = multiple && e.event.shiftKey,\n selectedClass = that.options.selectedClass || SELECTED,\n selected,\n whichCode = e.event.which,\n buttonCode = e.event.button;\n\n //in case of hierarchy or right-click\n if (!that._isElement(target.closest(\".\" + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\n return;\n }\n\n if (!this._allowSelection(e.event.target)) {\n return;\n }\n\n selected = target.hasClass(selectedClass);\n\n target = target.add(that.relatedTarget(target));\n\n if (!multiple) {\n if (selected && ctrlKey) {\n that._unselect(target);\n that._notify(CHANGE, e);\n } else if (!selected) {\n that.clear();\n that.value(target, e);\n that._notify(CHANGE, e);\n }\n } else {\n if (shiftKey) {\n if (!that._lastRange || !compareElements(that._lastRange, target)) {\n that.selectRange(that._firstSelectee(), target, e);\n that._notify(CHANGE, e);\n }\n that._lastRange = target;\n } else {\n that._lastRange = null;\n if (selected && ctrlKey) {\n that._unselect(target);\n that._notify(CHANGE, e);\n } else if (ctrlKey) {\n that.value(target, e);\n that._notify(CHANGE, e);\n } else if (!selected || that.value().length > 1) {\n that.clear();\n that.value(target, e);\n that._notify(CHANGE, e);\n }\n\n that._lastActive = that._downTarget = target;\n }\n }\n },\n\n _start: function(e) {\n var that = this,\n target = $(e.target),\n selectedClass = that.options.selectedClass || SELECTED,\n selected = target.hasClass(selectedClass),\n currentElement,\n ctrlKey = e.event.ctrlKey || e.event.metaKey;\n\n if (!this._allowSelection(e.event.target)) {\n return;\n }\n\n that._downTarget = target;\n\n //in case of hierarchy\n if (!that._isElement(target.closest(\".\" + SELECTABLE))) {\n that.userEvents.cancel();\n return;\n }\n\n if (that.options.useAllItems) {\n that._items = that.element.find(that.options.filter);\n } else {\n currentElement = target.closest(that.element);\n that._items = currentElement.find(that.options.filter);\n }\n\n e.sender.capture();\n\n that._marquee\n .appendTo(document.body)\n .css({\n left: e.x.client + 1,\n top: e.y.client + 1,\n width: 0,\n height: 0\n });\n\n if (!ctrlKey) {\n that.clear();\n }\n\n target = target.add(that.relatedTarget(target));\n if (selected) {\n that._selectElement(target, true);\n if (ctrlKey) {\n target.addClass(UNSELECTING);\n }\n }\n },\n\n _move: function(e) {\n var that = this,\n position = {\n left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\n top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\n width: abs(e.x.initialDelta),\n height: abs(e.y.initialDelta)\n };\n\n that._marquee.css(position);\n\n that._invalidateSelectables(position, (e.event.ctrlKey || e.event.metaKey));\n\n e.preventDefault();\n },\n\n _end: function(e) {\n var that = this,\n rangeSelectedAttr = kendo.attr(\"range-selected\"),\n uid = kendo.guid();\n\n that._marquee.remove();\n\n that._unselect(that.element\n .find(that.options.filter + \".\" + UNSELECTING))\n .removeClass(UNSELECTING);\n\n\n var target = that.element.find(that.options.filter + \".\" + ACTIVE);\n target = target.add(that.relatedTarget(target));\n\n if (that.options.addIdToRanges) {\n for (var i = 0; i < that._currentlyActive.length; i++) {\n $(that._currentlyActive[i]).attr(rangeSelectedAttr, uid);\n }\n }\n\n if (!that._lastRange || !compareElements(that._lastRange, target)) {\n that.value(target, e);\n that._notify(CHANGE, e);\n }\n that._lastRange = target;\n that._lastActive = that._downTarget;\n that._items = null;\n },\n\n _invalidateSelectables: function(position, ctrlKey) {\n var idx,\n length,\n target = this._downTarget[0],\n items = this._items,\n selectedClass = this.options.selectedClass || SELECTED,\n related,\n toSelect;\n\n this._currentlyActive = [];\n\n for (idx = 0, length = items.length; idx < length; idx ++) {\n toSelect = items.eq(idx);\n related = toSelect.add(this.relatedTarget(toSelect));\n\n if (collision(toSelect, position)) {\n if (toSelect.hasClass(selectedClass)) {\n if (ctrlKey && target !== toSelect[0]) {\n related.removeClass(selectedClass).addClass(UNSELECTING);\n }\n } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING) && !this._collidesWithActiveElement(related, position)) {\n related.addClass(ACTIVE);\n }\n this._currentlyActive.push(related[0]);\n } else {\n if (toSelect.hasClass(ACTIVE)) {\n related.removeClass(ACTIVE);\n } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\n related.removeClass(UNSELECTING).addClass(selectedClass);\n }\n }\n }\n },\n\n _collidesWithActiveElement: function(element, marqueeRect) {\n if (!this.options.ignoreOverlapped) {\n return false;\n }\n\n var activeElements = this._currentlyActive;\n var elemRect = element[0].getBoundingClientRect();\n var activeElementRect;\n var collision = false;\n var isRtl = kendo.support.isRtl(element);\n var leftRight = isRtl ? \"right\" : \"left\";\n var tempRect = {};\n\n marqueeRect.right = marqueeRect.left + marqueeRect.width;\n marqueeRect.bottom = marqueeRect.top + marqueeRect.height;\n\n for (var i = 0; i < activeElements.length; i++) {\n activeElementRect = activeElements[i].getBoundingClientRect();\n if (overlaps(elemRect, activeElementRect)) {\n tempRect[leftRight] = leftRight === \"left\" ? activeElementRect.right : activeElementRect.left;\n elemRect = extend({}, elemRect, tempRect);\n if (elemRect.left > elemRect.right) {\n return true;\n }\n collision = !overlaps(elemRect, marqueeRect);\n }\n }\n return collision;\n },\n\n value: function(val) {\n var that = this,\n selectElement = that._selectElement.bind(that);\n\n if (val) {\n val.each(function() {\n selectElement(this);\n });\n\n return;\n }\n\n return that.element.find(that.options.filter + \".\" + (that.options.selectedClass || SELECTED));\n },\n\n selectedRanges: function() {\n var that = this;\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\n var map = {};\n\n that.element.find(\"[\" + rangeSelectedAttr + \"]\").each(function(_, elem) {\n var rangeId = $(elem).attr(rangeSelectedAttr);\n var mapLocation = map[rangeId];\n\n if (!mapLocation) {\n mapLocation = map[rangeId] = [];\n }\n\n mapLocation.push($(elem));\n });\n\n return map;\n },\n\n selectedSingleItems: function() {\n var that = this;\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\n\n return that.element.find(that.options.filter + \".\" + (that.options.selectedClass || SELECTED) + \":not([\" + rangeSelectedAttr + \"])\").toArray().map(function(elem) {\n return $(elem);\n });\n },\n\n _firstSelectee: function() {\n var that = this,\n selected;\n\n if (that._lastActive !== null) {\n return that._lastActive;\n }\n\n selected = that.value();\n return selected.length > 0 ?\n selected[0] :\n that.element.find(that.options.filter)[0];\n },\n\n _selectElement: function(element, preventNotify) {\n var toSelect = $(element),\n selectedClass = this.options.selectedClass || SELECTED,\n isPrevented = !preventNotify && this._notify(\"select\", { element: element });\n\n toSelect.removeClass(ACTIVE);\n if (!isPrevented) {\n toSelect.addClass(selectedClass);\n\n if (this.options.aria) {\n toSelect.attr(ARIASELECTED, true);\n }\n }\n },\n\n _notify: function(name, args) {\n args = args || { };\n return this.trigger(name, args);\n },\n\n _unselect: function(element) {\n if (this.trigger(UNSELECT, { element: element })) {\n return;\n }\n\n var rangeSelectedAttr = kendo.attr(\"range-selected\");\n\n element.removeClass(this.options.selectedClass || SELECTED).removeAttr(rangeSelectedAttr);\n\n if (this.options.aria) {\n element.attr(ARIASELECTED, false);\n }\n\n return element;\n },\n\n _select: function(e) {\n if (this._allowSelection(e.event.target)) {\n if (!msie || (msie && !$(kendo._activeElement()).is(this.options.inputSelectors))) {\n e.preventDefault();\n }\n }\n },\n\n _allowSelection: function(target) {\n if ($(target).is(this.options.inputSelectors)) {\n this.userEvents.cancel();\n this._downTarget = null;\n return false;\n }\n\n return true;\n },\n\n resetTouchEvents: function() {\n this.userEvents.cancel();\n },\n\n clear: function() {\n var items = this.element.find(this.options.filter + \".\" + (this.options.selectedClass || SELECTED));\n this._unselect(items);\n },\n\n selectRange: function(start, end) {\n var that = this,\n idx,\n tmp,\n items;\n\n that.clear();\n\n if (that.element.length > 1) {\n items = that.options.continuousItems();\n }\n\n if (!items || !items.length) {\n items = that.element.find(that.options.filter);\n }\n\n start = $.inArray($(start)[0], items);\n end = $.inArray($(end)[0], items);\n\n if (start > end) {\n tmp = start;\n start = end;\n end = tmp;\n }\n\n if (!that.options.useAllItems) {\n end += that.element.length - 1;\n }\n\n for (idx = start; idx <= end; idx ++ ) {\n that._selectElement(items[idx], true);\n }\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that.element.off(NS);\n\n that.userEvents.destroy();\n\n that._marquee = that._lastActive = that.element = that.userEvents = null;\n }\n });\n\n Selectable.parseOptions = function(selectable) {\n var selectableMode = selectable.mode || selectable;\n var asLowerString = typeof selectableMode === \"string\" && selectableMode.toLowerCase();\n return {\n multiple: asLowerString && asLowerString.indexOf(\"multiple\") > -1,\n cell: asLowerString && asLowerString.indexOf(\"cell\") > -1\n };\n };\n\n function compareElements(element, toCompare) {\n\n if (element.length !== toCompare.length) {\n return false;\n }\n\n for (var i = 0; i < element.length; i++) {\n if (element[i] !== toCompare[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function collision(element, position) {\n if (!element.is(\":visible\")) {\n return false;\n }\n\n var elementPosition = kendo.getOffset(element),\n right = position.left + position.width,\n bottom = position.top + position.height;\n\n elementPosition.right = elementPosition.left + kendo._outerWidth(element);\n elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\n\n return !(elementPosition.left > right ||\n elementPosition.right < position.left ||\n elementPosition.top > bottom ||\n elementPosition.bottom < position.top);\n }\n\n function overlaps(firstRect, secondRect) {\n return !(firstRect.right <= secondRect.left ||\n firstRect.left >= secondRect.right ||\n firstRect.bottom <= secondRect.top ||\n firstRect.top >= secondRect.bottom);\n }\n\n kendo.ui.plugin(Selectable);\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","depends","advanced","$","window","kendo","jQuery","undefined","Widget","ui","abs","Math","ARIASELECTED","SELECTED","ACTIVE","SELECTABLE","CHANGE","NS","UNSELECT","UNSELECTING","INPUTSELECTOR","msie","support","browser","supportEventDelegation","extend","Selectable","on","find","trigger","end","off","init","element","options","that","this","multiple","dragToSelect","fn","call","_marquee","_lastActive","addClass","relatedTarget","userEvents","UserEvents","global","allowSelection","filter","tap","_tap","bind","touchAction","_start","_move","_end","_select","events","inputSelectors","noop","ignoreOverlapped","addIdToRanges","_isElement","target","elements","idx","length","result","e","ctrlKey","event","metaKey","shiftKey","selectedClass","selected","whichCode","which","buttonCode","button","closest","_allowSelection","hasClass","add","_unselect","_notify","clear","value","_lastRange","compareElements","selectRange","_firstSelectee","_downTarget","currentElement","cancel","useAllItems","_items","sender","capture","appendTo","document","body","css","left","x","client","top","y","width","height","_selectElement","position","startLocation","location","initialDelta","_invalidateSelectables","preventDefault","rangeSelectedAttr","attr","uid","guid","remove","removeClass","i","_currentlyActive","items","related","toSelect","eq","collision","_collidesWithActiveElement","push","marqueeRect","activeElements","elemRect","getBoundingClientRect","activeElementRect","isRtl","leftRight","tempRect","right","bottom","overlaps","val","selectElement","each","selectedRanges","map","_","elem","rangeId","mapLocation","selectedSingleItems","toArray","preventNotify","isPrevented","aria","args","removeAttr","_activeElement","is","resetTouchEvents","start","tmp","continuousItems","inArray","destroy","toCompare","elementPosition","getOffset","_outerWidth","_outerHeight","firstRect","secondRect","parseOptions","selectable","selectableMode","mode","asLowerString","toLowerCase","indexOf","cell","plugin","amd","a1","a2","a3"],"mappings":"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"}