/**
 * @private
 */
Ext.define('Ext.exporter.file.ooxml.Base', {
    extend: 'Ext.exporter.file.Base',

    config: {
        /**
         * @private
         */
        tplAttributes: {
            $value: [],
            merge: function(newValue, oldValue) {
                return [].concat(newValue, oldValue);
            }
        },

        /**
         * @private
         */
        tplNonAttributes: {
            $value: [
                'idPrefix', 'id', 'autoGenerateId', 'self',
                'tplAttributes', 'tplNonAttributes'
            ],
            merge: function(newValue, oldValue) {
                return [].concat(newValue, oldValue);
            }
        }
    },

    /**
     * Set to `true` if you want to generate an `attributes` key on the template render data.
     * The value of this key is a concatenated string of pairs `config_name=config_value`.
     * This means that each config that will participate in the `attributes` has the same name
     * as the expected XML attribute. Changing the config name will have an impact on the XML
     * attribute.
     *
     * In `tplNonAttributes` there is a list of configs that should not be part of attributes.
     *
     * In `tplAttributes` define the configs that should be part of attributes.
     *
     * If `tplAttributes` is empty then the all configs are used except for `tplNonAttributes`
     * defined.
     *
     * @private
     */
    generateTplAttributes: false,

    processRenderData: function(data) {
        var attr = this.getTplAttributes(),
            nonAttr = this.getTplNonAttributes(),
            keys = Ext.Object.getAllKeys(data),
            len = keys.length,
            str = '',
            i, key;

        if (!this.generateTplAttributes) {
            data.attributes = '';

            return data;
        }

        for (i = 0; i < len; i++) {
            key = keys[i];

            if (attr && attr.length) {
                if (Ext.Array.indexOf(attr, key) >= 0 && data[key] !== null) {
                    str += (str.length ? ' ' : '') + this.processTplAttribute(key, data[key]);
                }
            }
            else if (nonAttr && nonAttr.length) {
                if (Ext.Array.indexOf(nonAttr, key) < 0 && data[key] !== null) {
                    str += (str.length ? ' ' : '') + this.processTplAttribute(key, data[key]);
                }
            }

        }

        data.attributes = str;

        return data;
    },

    processTplAttribute: function(attr, value) {
        var v = value;

        if (typeof value === 'boolean') {
            v = Number(value);
        }
        else if (typeof value === 'string') {
            v = Ext.util.Base64._utf8_encode(Ext.util.Format.htmlEncode(value || ''));
        }

        return (attr + '="' + v + '"');
    }
});
