/**
 * @private
 */
Ext.define('Ext.util.Offset', {
 
    /* Begin Definitions */
 
    statics: {
        fromObject: function(obj) {
            if (obj instanceof this) {
                return obj;
            }
 
            if (typeof obj === 'number') {
                return new this(obj, obj);
            }
 
            if (obj.length) {
                return new this(obj[0], obj[1]);
            }
 
            return new this(obj.x, obj.y);
        }
    },
 
    /* End Definitions */
 
    constructor: function(x, y) {
        this.x = (!= null && !isNaN(x)) ? x : 0;
        this.y = (!= null && !isNaN(y)) ? y : 0;
 
        return this;
    },
 
    copy: function() {
        return new Ext.util.Offset(this.x, this.y);
    },
 
    copyFrom: function(p) {
        this.x = p.x;
        this.y = p.y;
    },
 
    toString: function() {
        return "Offset[" + this.x + "," + this.y + "]";
    },
 
    equals: function(offset) {
        //<debug>
        if (!(offset instanceof this.statics())) {
            Ext.raise('Offset must be an instance of Ext.util.Offset');
        }
        //</debug>
 
        return (this.x === offset.x && this.y === offset.y);
    },
 
    add: function(offset) {
        //<debug>
        if (!(offset instanceof this.statics())) {
            Ext.raise('Offset must be an instance of Ext.util.Offset');
        }
        //</debug>
 
        this.x += offset.x;
        this.y += offset.y;
    },
 
    round: function(to) {
        var factor;
 
        if (!isNaN(to)) {
            factor = Math.pow(10, to);
 
            this.x = Math.round(this.x * factor) / factor;
            this.y = Math.round(this.y * factor) / factor;
        }
        else {
            this.x = Math.round(this.x);
            this.y = Math.round(this.y);
        }
    },
 
    isZero: function() {
        return this.x === 0 && this.y === 0;
    }
});