/**
 * @private
 */
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;
    }
});