/**
 * 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) {
        if (this.callParent([e]) === false) {
            return false;
        }
 
        this.startPoint = e.changedTouches[0].point;
    },
 
    onTouchMove: function(e) {
        var touch = e.changedTouches[0],
            point = touch.point;
 
        if (Math.abs(point.getDistanceTo(this.startPoint)) >= this.getMoveDistance()) {
            this.fire('tapcancel', e, {
                touch: touch
            });
            return this.fail(this.self.TOUCH_MOVED);
        }
    },
 
    onTouchEnd: function(e) {
        this.fire('tap', e, {
            touch: e.changedTouches[0]
        });
    },
 
    onTouchCancel: function(e) {
        this.fire('tapcancel', e, {
            touch: e.changedTouches[0]
        });
        return false;
    },
 
    reset: function() {
        this.startPoint = null;
    }
}, function(Tap) {
    var gestures = Ext.manifest.gestures;
    Tap.instance = new Tap(gestures && gestures.tap);
});