/**
 * A simple event recogniser which knows when you tap.
 */
Ext.define('Ext.event.gesture.Tap', {
    extend: 'Ext.event.gesture.SingleTouch',
 
    priority: 200,
 
    handledEvents: ['tap', 'tapcancel'],
 
    config: {
        /**
         * @cfg {Number} moveDistance
         * The maximimum distance in pixels a touchstart event can travel and still be considered
         * a tap event.
         */
 
        moveDistance: 8
    },
 
    onTouchStart: function(e) {
        var me = this,
            ret = me.callParent([e]);
 
        if (ret !== false) {
            me.isStarted = true;
            me.startPoint = e.changedTouches[0].point;
        }
 
        return ret;
    },
 
    onTouchMove: function(e) {
        var me = this,
            point = e.changedTouches[0].point,
            scale = Ext.Element.getViewportScale(),
            // account for scale so that move distance is actual screen pixels, not page pixels
            distance = Math.round(Math.abs(point.getDistanceTo(me.startPoint) * scale));
 
        if (distance >= me.getMoveDistance()) {
            return me.cancel(e);
        }
    },
 
    onTouchEnd: function(e) {
        this.fire('tap', e, {
            touch: e.changedTouches[0]
        });
 
        return this.callParent([e]);
    },
 
    onCancel: function(e) {
        this.fire('tapcancel', e, {
            touch: e.changedTouches[0]
        }, true);
    },
 
    reset: function() {
        this.startPoint = null;
        
        return this.callParent();
    }
}, function(Tap) {
    var gestures = Ext.manifest.gestures;
    
    Tap.instance = new Tap(gestures && gestures.tap);
});