/**
* Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)
* Copyright 2016 Telerik AD. All rights reserved.
*
* Kendo UI commercial licenses may be obtained at
* http://www.telerik.com/purchase/license-agreement/kendo-ui-complete
* If you do not own a commercial license, this file shall be governed by the trial license terms.
*/
(function (f, define) {
define('kendo.selectable', [
'kendo.core',
'kendo.userevents'
], f);
}(function () {
var __meta__ = {
id: 'selectable',
name: 'Selectable',
category: 'framework',
depends: [
'core',
'userevents'
],
advanced: true
};
(function ($, undefined) {
var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, ARIASELECTED = 'aria-selected', SELECTED = 'k-state-selected', ACTIVE = 'k-state-selecting', SELECTABLE = 'k-selectable', CHANGE = 'change', NS = '.kendoSelectable', UNSELECTING = 'k-state-unselecting', INPUTSELECTOR = 'input,a,textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,button.k-button>.k-icon,span.k-icon.k-i-expand,span.k-icon.k-i-collapse', msie = kendo.support.browser.msie, supportEventDelegation = false;
(function ($) {
(function () {
$('
').on('click', '>*', function () {
supportEventDelegation = true;
}).find('span').click().end().off();
}());
}($));
var Selectable = Widget.extend({
init: function (element, options) {
var that = this, multiple;
Widget.fn.init.call(that, element, options);
that._marquee = $('');
that._lastActive = null;
that.element.addClass(SELECTABLE);
that.relatedTarget = that.options.relatedTarget;
multiple = that.options.multiple;
if (this.options.aria && multiple) {
that.element.attr('aria-multiselectable', true);
}
that.userEvents = new kendo.UserEvents(that.element, {
global: true,
allowSelection: true,
filter: (!supportEventDelegation ? '.' + SELECTABLE + ' ' : '') + that.options.filter,
tap: proxy(that._tap, that)
});
if (multiple) {
that.userEvents.bind('start', proxy(that._start, that)).bind('move', proxy(that._move, that)).bind('end', proxy(that._end, that)).bind('select', proxy(that._select, that));
}
},
events: [CHANGE],
options: {
name: 'Selectable',
filter: '>*',
multiple: false,
relatedTarget: $.noop
},
_isElement: function (target) {
var elements = this.element;
var idx, length = elements.length, result = false;
target = target[0];
for (idx = 0; idx < length; idx++) {
if (elements[idx] === target) {
result = true;
break;
}
}
return result;
},
_tap: function (e) {
var target = $(e.target), that = this, ctrlKey = e.event.ctrlKey || e.event.metaKey, multiple = that.options.multiple, shiftKey = multiple && e.event.shiftKey, selected, whichCode = e.event.which, buttonCode = e.event.button;
if (!that._isElement(target.closest('.' + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {
return;
}
if (!this._allowSelection(e.event.target)) {
return;
}
selected = target.hasClass(SELECTED);
if (!multiple || !ctrlKey) {
that.clear();
}
target = target.add(that.relatedTarget(target));
if (shiftKey) {
that.selectRange(that._firstSelectee(), target);
} else {
if (selected && ctrlKey) {
that._unselect(target);
that._notify(CHANGE);
} else {
that.value(target);
}
that._lastActive = that._downTarget = target;
}
},
_start: function (e) {
var that = this, target = $(e.target), selected = target.hasClass(SELECTED), currentElement, ctrlKey = e.event.ctrlKey || e.event.metaKey;
if (!this._allowSelection(e.event.target)) {
return;
}
that._downTarget = target;
if (!that._isElement(target.closest('.' + SELECTABLE))) {
that.userEvents.cancel();
return;
}
if (that.options.useAllItems) {
that._items = that.element.find(that.options.filter);
} else {
currentElement = target.closest(that.element);
that._items = currentElement.find(that.options.filter);
}
e.sender.capture();
that._marquee.appendTo(document.body).css({
left: e.x.client + 1,
top: e.y.client + 1,
width: 0,
height: 0
});
if (!ctrlKey) {
that.clear();
}
target = target.add(that.relatedTarget(target));
if (selected) {
that._selectElement(target, true);
if (ctrlKey) {
target.addClass(UNSELECTING);
}
}
},
_move: function (e) {
var that = this, position = {
left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,
top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,
width: abs(e.x.initialDelta),
height: abs(e.y.initialDelta)
};
that._marquee.css(position);
that._invalidateSelectables(position, e.event.ctrlKey || e.event.metaKey);
e.preventDefault();
},
_end: function () {
var that = this;
that._marquee.remove();
that._unselect(that.element.find(that.options.filter + '.' + UNSELECTING)).removeClass(UNSELECTING);
var target = that.element.find(that.options.filter + '.' + ACTIVE);
target = target.add(that.relatedTarget(target));
that.value(target);
that._lastActive = that._downTarget;
that._items = null;
},
_invalidateSelectables: function (position, ctrlKey) {
var idx, length, target = this._downTarget[0], items = this._items, related, toSelect;
for (idx = 0, length = items.length; idx < length; idx++) {
toSelect = items.eq(idx);
related = toSelect.add(this.relatedTarget(toSelect));
if (collision(toSelect, position)) {
if (toSelect.hasClass(SELECTED)) {
if (ctrlKey && target !== toSelect[0]) {
related.removeClass(SELECTED).addClass(UNSELECTING);
}
} else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) {
related.addClass(ACTIVE);
}
} else {
if (toSelect.hasClass(ACTIVE)) {
related.removeClass(ACTIVE);
} else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {
related.removeClass(UNSELECTING).addClass(SELECTED);
}
}
}
},
value: function (val) {
var that = this, selectElement = proxy(that._selectElement, that);
if (val) {
val.each(function () {
selectElement(this);
});
that._notify(CHANGE);
return;
}
return that.element.find(that.options.filter + '.' + SELECTED);
},
_firstSelectee: function () {
var that = this, selected;
if (that._lastActive !== null) {
return that._lastActive;
}
selected = that.value();
return selected.length > 0 ? selected[0] : that.element.find(that.options.filter)[0];
},
_selectElement: function (element, preventNotify) {
var toSelect = $(element), isPrevented = !preventNotify && this._notify('select', { element: element });
toSelect.removeClass(ACTIVE);
if (!isPrevented) {
toSelect.addClass(SELECTED);
if (this.options.aria) {
toSelect.attr(ARIASELECTED, true);
}
}
},
_notify: function (name, args) {
args = args || {};
return this.trigger(name, args);
},
_unselect: function (element) {
element.removeClass(SELECTED);
if (this.options.aria) {
element.attr(ARIASELECTED, false);
}
return element;
},
_select: function (e) {
if (this._allowSelection(e.event.target)) {
if (!msie || msie && !$(kendo._activeElement()).is(INPUTSELECTOR)) {
e.preventDefault();
}
}
},
_allowSelection: function (target) {
if ($(target).is(INPUTSELECTOR)) {
this.userEvents.cancel();
this._downTarget = null;
return false;
}
return true;
},
resetTouchEvents: function () {
this.userEvents.cancel();
},
clear: function () {
var items = this.element.find(this.options.filter + '.' + SELECTED);
this._unselect(items);
},
selectRange: function (start, end) {
var that = this, idx, tmp, items;
that.clear();
if (that.element.length > 1) {
items = that.options.continuousItems();
}
if (!items || !items.length) {
items = that.element.find(that.options.filter);
}
start = $.inArray($(start)[0], items);
end = $.inArray($(end)[0], items);
if (start > end) {
tmp = start;
start = end;
end = tmp;
}
if (!that.options.useAllItems) {
end += that.element.length - 1;
}
for (idx = start; idx <= end; idx++) {
that._selectElement(items[idx]);
}
that._notify(CHANGE);
},
destroy: function () {
var that = this;
Widget.fn.destroy.call(that);
that.element.off(NS);
that.userEvents.destroy();
that._marquee = that._lastActive = that.element = that.userEvents = null;
}
});
Selectable.parseOptions = function (selectable) {
var asLowerString = typeof selectable === 'string' && selectable.toLowerCase();
return {
multiple: asLowerString && asLowerString.indexOf('multiple') > -1,
cell: asLowerString && asLowerString.indexOf('cell') > -1
};
};
function collision(element, position) {
if (!element.is(':visible')) {
return false;
}
var elementPosition = kendo.getOffset(element), right = position.left + position.width, bottom = position.top + position.height;
elementPosition.right = elementPosition.left + element.outerWidth();
elementPosition.bottom = elementPosition.top + element.outerHeight();
return !(elementPosition.left > right || elementPosition.right < position.left || elementPosition.top > bottom || elementPosition.bottom < position.top);
}
kendo.ui.plugin(Selectable);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));