/** * 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.touch', [ 'kendo.core', 'kendo.userevents' ], f); }(function () { var __meta__ = { id: 'touch', name: 'Touch', category: 'mobile', description: 'The kendo Touch widget provides a cross-platform compatible API for handling user-initiated touch events, multi-touch gestures and event sequences (drag, swipe, etc.). ', depends: [ 'core', 'userevents' ] }; (function ($, undefined) { var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, MAX_DOUBLE_TAP_DISTANCE = 20; var Touch = Widget.extend({ init: function (element, options) { var that = this; Widget.fn.init.call(that, element, options); options = that.options; element = that.element; that.wrapper = element; function eventProxy(name) { return function (e) { that._triggerTouch(name, e); }; } function gestureEventProxy(name) { return function (e) { that.trigger(name, { touches: e.touches, distance: e.distance, center: e.center, event: e.event }); }; } that.events = new kendo.UserEvents(element, { filter: options.filter, surface: options.surface, minHold: options.minHold, multiTouch: options.multiTouch, allowSelection: true, fastTap: options.fastTap, press: eventProxy('touchstart'), hold: eventProxy('hold'), tap: proxy(that, '_tap'), gesturestart: gestureEventProxy('gesturestart'), gesturechange: gestureEventProxy('gesturechange'), gestureend: gestureEventProxy('gestureend') }); if (options.enableSwipe) { that.events.bind('start', proxy(that, '_swipestart')); that.events.bind('move', proxy(that, '_swipemove')); } else { that.events.bind('start', proxy(that, '_dragstart')); that.events.bind('move', eventProxy('drag')); that.events.bind('end', eventProxy('dragend')); } kendo.notify(that); }, events: [ 'touchstart', 'dragstart', 'drag', 'dragend', 'tap', 'doubletap', 'hold', 'swipe', 'gesturestart', 'gesturechange', 'gestureend' ], options: { name: 'Touch', surface: null, global: false, fastTap: false, multiTouch: false, enableSwipe: false, minXDelta: 30, maxYDelta: 20, maxDuration: 1000, minHold: 800, doubleTapTimeout: 800 }, cancel: function () { this.events.cancel(); }, _triggerTouch: function (type, e) { if (this.trigger(type, { touch: e.touch, event: e.event })) { e.preventDefault(); } }, _tap: function (e) { var that = this, lastTap = that.lastTap, touch = e.touch; if (lastTap && touch.endTime - lastTap.endTime < that.options.doubleTapTimeout && kendo.touchDelta(touch, lastTap).distance < MAX_DOUBLE_TAP_DISTANCE) { that._triggerTouch('doubletap', e); that.lastTap = null; } else { that._triggerTouch('tap', e); that.lastTap = touch; } }, _dragstart: function (e) { this._triggerTouch('dragstart', e); }, _swipestart: function (e) { if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) { e.sender.capture(); } }, _swipemove: function (e) { var that = this, options = that.options, touch = e.touch, duration = e.event.timeStamp - touch.startTime, direction = touch.x.initialDelta > 0 ? 'right' : 'left'; if (abs(touch.x.initialDelta) >= options.minXDelta && abs(touch.y.initialDelta) < options.maxYDelta && duration < options.maxDuration) { that.trigger('swipe', { direction: direction, touch: e.touch }); touch.cancel(); } } }); kendo.ui.plugin(Touch); }(window.kendo.jQuery)); return window.kendo; }, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) { (a3 || a2)(); }));