/**
 * @private
 * @extends Object
 * DOMイベント。このクラスは、{@link Ext.event.Event}を実際に継承しますが、ドキュメントの用途上、{@link Ext.event.Event}内にメンバーがリスト化されています。
 */
Ext.define('Ext.event.Dom', {
    extend: 'Ext.event.Event',

    constructor: function(event) {
        var target = event.target,
            touches;

        if (target && target.nodeType !== 1) {
            target = target.parentNode;
        }
        touches = event.changedTouches;
        if (touches) {
            touches = touches[0];
            this.pageX = touches.pageX;
            this.pageY = touches.pageY;
        }
        else {
            this.pageX = event.pageX;
            this.pageY = event.pageY;
        }

        this.browserEvent = this.event = event;
        this.target = this.delegatedTarget = target;
        this.type = event.type;

        this.timeStamp = this.time = +event.timeStamp;

        return this;
    },

    /**
     * @property {Number} distance
     * イベントの間隔。
     *
     * **これはイベントのタイプが`swipe`と`pinch`の場合にのみ使用可能です。**
     */

    /**
     * @property {HTMLElement} target
     * このイベントのターゲットのHTML要素。例えば、tapイベントをリッスンしているときに`<div>`要素をタップした場合、これは`<div>`要素を返します。
     */

    /**
     * @property {Number} pageX イベントのブラウザのx座標。
     */

    /**
     * @property {Number} pageY イベントのブラウザのy座標。
     */

    stopEvent: function() {
        this.preventDefault();

        return this.callParent();
    },

    /**
     * ブラウザのデフォルトのイベントハンドリングを防ぎます。
     */
    preventDefault: function() {
        this.browserEvent.preventDefault();
    },

    /**
     * イベントのx座標を取得します。
     * @deprecated 2.0 {@link #pageX}プロパティを直接使用してください。
     * @return {Number}

     */
    getPageX: function() {
        return this.pageX || this.browserEvent.pageX;
    },

    /**
     * イベントのy座標を取得します。
     * @deprecated 2.0 {@link #pageX}プロパティを直接使用してください。
     * @return {Number}

     */
    getPageY: function() {
        return this.pageY || this.browserEvent.pageY;
    },

    /**
     * イベントのXとY座標を取得します。
     * @deprecated 2.0 {@link #pageX}プロパティおよび{@link #pageY}プロパティを直接使用してください。
     * @return {Array}

     */
    getXY: function() {
        if (!this.xy) {
            this.xy = [this.getPageX(), this.getPageY()];
        }

        return this.xy;
    },

    /**
     * イベントのターゲットを取得します。{@link #target}とは違い、これはイベントの主要な要素を返します。このため、Ext.Viewport.element上のタップイベントをリッスンしているときに、Ext.Viewport.elementの内部要素をタップすると、これはExt.Viewport.elementを返します。
     *
     * タップしたい要素がある場合には、{@link #target}を使用してください。
     *
     * @param {String} selector (optional) ターゲットをフィルタリングする、またはターゲットの祖先を検索するためのシンプルなセレクタ。
     * @param {Number/Mixed} [maxDepth=10||document.body] (optional) 検索される最大の深さを数値または要素で指定(デフォルトは10またはdocument.body)。
     * @param {Boolean} returnEl (optional) `true`に設定すると、DOMノードの代わりにExt.Elementオブジェクトを返します。
     * @return {HTMLElement}

     */
    getTarget: function(selector, maxDepth, returnEl) {
        if (arguments.length === 0) {
            return this.delegatedTarget;
        }

        return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
    },

    /**
     * イベントの時刻を返します。
     * @return {Date}

     */
    getTime: function() {
        return this.time;
    },

    setDelegatedTarget: function(target) {
        this.delegatedTarget = target;
    },

    makeUnpreventable: function() {
        this.browserEvent.preventDefault = Ext.emptyFn;
    }
});