    /**
     *
     */
    Ext.define('Ext.fx.State', {

        isAnimatable: {
            'background-color'   : true,
            'background-image'   : true,
            'background-position': true,
            'border-bottom-color': true,
            'border-bottom-width': true,
            'border-color'       : true,
            'border-left-color'  : true,
            'border-left-width'  : true,
            'border-right-color' : true,
            'border-right-width' : true,
            'border-spacing'     : true,
            'border-top-color'   : true,
            'border-top-width'   : true,
            'border-width'       : true,
            'bottom'             : true,
            'color'              : true,
            'crop'               : true,
            'font-size'          : true,
            'font-weight'        : true,
            'height'             : true,
            'left'               : true,
            'letter-spacing'     : true,
            'line-height'        : true,
            'margin-bottom'      : true,
            'margin-left'        : true,
            'margin-right'       : true,
            'margin-top'         : true,
            'max-height'         : true,
            'max-width'          : true,
            'min-height'         : true,
            'min-width'          : true,
            'opacity'            : true,
            'outline-color'      : true,
            'outline-offset'     : true,
            'outline-width'      : true,
            'padding-bottom'     : true,
            'padding-left'       : true,
            'padding-right'      : true,
            'padding-top'        : true,
            'right'              : true,
            'text-indent'        : true,
            'text-shadow'        : true,
            'top'                : true,
            'vertical-align'     : true,
            'visibility'         : true,
            'width'              : true,
            'word-spacing'       : true,
            'z-index'            : true,
            'zoom'               : true,
            'transform'          : true
        },

        constructor: function(data) {
            this.data = {};

            this.set(data);
        },

        setConfig: function(data) {
            this.set(data);

            return this;
        },

        setRaw: function(data) {
            this.data = data;

            return this;
        },

        clear: function() {
            return this.setRaw({});
        },

        setTransform: function(name, value) {
            var data = this.data,
                isArray = Ext.isArray(value),
                transform = data.transform,
                ln, key;

            if (!transform) {
                transform = data.transform = {
                    translateX: 0,
                    translateY: 0,
                    translateZ: 0,
                    scaleX: 1,
                    scaleY: 1,
                    scaleZ: 1,
                    rotate: 0,
                    rotateX: 0,
                    rotateY: 0,
                    rotateZ: 0,
                    skewX: 0,
                    skewY: 0
                };
            }

            if (typeof name == 'string') {
                switch (name) {
                    case 'translate':
                        if (isArray) {
                            ln = value.length;

                            if (ln == 0) { break; }

                            transform.translateX = value[0];

                            if (ln == 1) { break; }

                            transform.translateY = value[1];

                            if (ln == 2) { break; }

                            transform.translateZ = value[2];
                        }
                        else {
                            transform.translateX = value;
                        }
                        break;

                    case 'rotate':
                        if (isArray) {
                            ln = value.length;

                            if (ln == 0) { break; }

                            transform.rotateX = value[0];

                            if (ln == 1) { break; }

                            transform.rotateY = value[1];

                            if (ln == 2) { break; }

                            transform.rotateZ = value[2];
                        }
                        else {
                            transform.rotate = value;
                        }
                        break;

                    case 'scale':
                        if (isArray) {
                            ln = value.length;

                            if (ln == 0) { break; }

                            transform.scaleX = value[0];

                            if (ln == 1) { break; }

                            transform.scaleY = value[1];

                            if (ln == 2) { break; }

                            transform.scaleZ = value[2];
                        }
                        else {
                            transform.scaleX = value;
                            transform.scaleY = value;
                        }
                        break;

                    case 'skew':
                        if (isArray) {
                            ln = value.length;

                            if (ln == 0) { break; }

                            transform.skewX = value[0];

                            if (ln == 1) { break; }

                            transform.skewY = value[1];
                        }
                        else {
                            transform.skewX = value;
                        }
                        break;

                    default:
                        transform[name] = value;
                }
            }
            else {
                for (key in name) {
                    if (name.hasOwnProperty(key)) {
                        value = name[key];

                        this.setTransform(key, value);
                    }
                }
            }
        },

        set: function(name, value) {
            var data = this.data,
                key;

            if (typeof name != 'string') {
                for (key in name) {
                    value = name[key];

                    if (key === 'transform') {
                        this.setTransform(value);
                    }
                    else {
                        data[key] = value;
                    }
                }
            }
            else {
                if (name === 'transform') {
                    this.setTransform(value);
                }
                else {
                    data[name] = value;
                }
            }

            return this;
        },

        unset: function(name) {
            var data = this.data;

            if (data.hasOwnProperty(name)) {
                delete data[name];
            }

            return this;
        },

        getData: function() {
            return this.data;
        }
    });