insideout10/wordlift-plugin-js

View on GitHub
bower_components/leaflet/src/dom/DomEvent.DoubleTap.js

Summary

Maintainability
C
7 hrs
Test Coverage
/*
 * Extends the event handling code with double tap support for mobile browsers.
 */

L.extend(L.DomEvent, {

    _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
    _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',

    // inspired by Zepto touch code by Thomas Fuchs
    addDoubleTapListener: function (obj, handler, id) {
        var last,
            doubleTap = false,
            delay = 250,
            touch,
            pre = '_leaflet_',
            touchstart = this._touchstart,
            touchend = this._touchend,
            trackedTouches = [];

        function onTouchStart(e) {
            var count;

            if (L.Browser.pointer) {
                trackedTouches.push(e.pointerId);
                count = trackedTouches.length;
            } else {
                count = e.touches.length;
            }
            if (count > 1) {
                return;
            }

            var now = Date.now(),
                delta = now - (last || now);

            touch = e.touches ? e.touches[0] : e;
            doubleTap = (delta > 0 && delta <= delay);
            last = now;
        }

        function onTouchEnd(e) {
            if (L.Browser.pointer) {
                var idx = trackedTouches.indexOf(e.pointerId);
                if (idx === -1) {
                    return;
                }
                trackedTouches.splice(idx, 1);
            }

            if (doubleTap) {
                if (L.Browser.pointer) {
                    // work around .type being readonly with MSPointer* events
                    var newTouch = { },
                        prop;

                    // jshint forin:false
                    for (var i in touch) {
                        prop = touch[i];
                        if (typeof prop === 'function') {
                            newTouch[i] = prop.bind(touch);
                        } else {
                            newTouch[i] = prop;
                        }
                    }
                    touch = newTouch;
                }
                touch.type = 'dblclick';
                handler(touch);
                last = null;
            }
        }
        obj[pre + touchstart + id] = onTouchStart;
        obj[pre + touchend + id] = onTouchEnd;

        // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen
        // will not come through to us, so we will lose track of how many touches are ongoing
        var endElement = L.Browser.pointer ? document.documentElement : obj;

        obj.addEventListener(touchstart, onTouchStart, false);
        endElement.addEventListener(touchend, onTouchEnd, false);

        if (L.Browser.pointer) {
            endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);
        }

        return this;
    },

    removeDoubleTapListener: function (obj, id) {
        var pre = '_leaflet_';

        obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
        (L.Browser.pointer ? document.documentElement : obj).removeEventListener(
                this._touchend, obj[pre + this._touchend + id], false);

        if (L.Browser.pointer) {
            document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],
                false);
        }

        return this;
    }
});