# Source: input/MSPointer.js

    /**
    * @author       Richard Davey <rich@photonstorm.com>
    * @copyright    2014 Photon Storm Ltd.
    * @license      {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
    */

    /**
    * Phaser - MSPointer constructor.
    *
    * @class Phaser.MSPointer
    * @classdesc The MSPointer class handles touch interactions with the game and the resulting Pointer objects.
    * It will work only in Internet Explorer 10 and Windows Store or Windows Phone 8 apps using JavaScript.
    * http://msdn.microsoft.com/en-us/library/ie/hh673557(v=vs.85).aspx
    * @constructor
    * @param {Phaser.Game} game - A reference to the currently running game.
    */
    Phaser.MSPointer = function (game) {

        /**
        * @property {Phaser.Game} game - A reference to the currently running game.
        */
        this.game = game;

        /**
        * @property {Object} callbackContext - The context under which callbacks are called (defaults to game).
        */
        this.callbackContext = this.game;

        /**
        * You can disable all Input by setting disabled = true. While set all new input related events will be ignored.
        * @property {boolean} disabled
        */
        this.disabled = false;

        /**
        * @property {function} _onMSPointerDown - Internal function to handle MSPointer events.
        * @private
        */
        this._onMSPointerDown = null;

        /**
        * @property {function} _onMSPointerMove - Internal function to handle MSPointer events.
        * @private
        */
        this._onMSPointerMove = null;

        /**
        * @property {function} _onMSPointerUp - Internal function to handle MSPointer events.
        * @private
        */
        this._onMSPointerUp = null;

    };

    Phaser.MSPointer.prototype = {

        /**
        * Starts the event listeners running.
        * @method Phaser.MSPointer#start
        */
        start: function () {

            if (this._onMSPointerDown !== null)
            {
                //  Avoid setting multiple listeners
                return;
            }

            var _this = this;

            if (this.game.device.mspointer === true)
            {
                this._onMSPointerDown = function (event) {
                    return _this.onPointerDown(event);
                };

                this._onMSPointerMove = function (event) {
                    return _this.onPointerMove(event);
                };

                this._onMSPointerUp = function (event) {
                    return _this.onPointerUp(event);
                };

                this.game.renderer.view.addEventListener('MSPointerDown', this._onMSPointerDown, false);
                this.game.renderer.view.addEventListener('MSPointerMove', this._onMSPointerMove, false);
                this.game.renderer.view.addEventListener('MSPointerUp', this._onMSPointerUp, false);

                //  IE11+ uses non-prefix events
                this.game.renderer.view.addEventListener('pointerDown', this._onMSPointerDown, false);
                this.game.renderer.view.addEventListener('pointerMove', this._onMSPointerMove, false);
                this.game.renderer.view.addEventListener('pointerUp', this._onMSPointerUp, false);

                this.game.renderer.view.style['-ms-content-zooming'] = 'none';
                this.game.renderer.view.style['-ms-touch-action'] = 'none';

            }

        },

        /**
        * The function that handles the PointerDown event.
        * @method Phaser.MSPointer#onPointerDown
        * @param {PointerEvent} event
        */
        onPointerDown: function (event) {

            if (this.game.input.disabled || this.disabled)
            {
                return;
            }

            event.preventDefault();
            event.identifier = event.pointerId;

            this.game.input.startPointer(event);

        },

        /**
        * The function that handles the PointerMove event.
        * @method Phaser.MSPointer#onPointerMove
        * @param {PointerEvent } event
        */
        onPointerMove: function (event) {

            if (this.game.input.disabled || this.disabled)
            {
                return;
            }

            event.preventDefault();
            event.identifier = event.pointerId;

            this.game.input.updatePointer(event);

        },

        /**
        * The function that handles the PointerUp event.
        * @method Phaser.MSPointer#onPointerUp
        * @param {PointerEvent} event
        */
        onPointerUp: function (event) {

            if (this.game.input.disabled || this.disabled)
            {
                return;
            }

            event.preventDefault();
            event.identifier = event.pointerId;

            this.game.input.stopPointer(event);

        },

        /**
        * Stop the event listeners.
        * @method Phaser.MSPointer#stop
        */
        stop: function () {

            this.game.canvas.removeEventListener('MSPointerDown', this._onMSPointerDown);
            this.game.canvas.removeEventListener('MSPointerMove', this._onMSPointerMove);
            this.game.canvas.removeEventListener('MSPointerUp', this._onMSPointerUp);

            this.game.canvas.removeEventListener('pointerDown', this._onMSPointerDown);
            this.game.canvas.removeEventListener('pointerMove', this._onMSPointerMove);
            this.game.canvas.removeEventListener('pointerUp', this._onMSPointerUp);

        }

    };

    Phaser.MSPointer.prototype.constructor = Phaser.MSPointer;