/**
 * This class generates a '.rels' file that contain all links to related objects.
 *
 * i.e. a worksheet may have a pivot table or the workbook has multiple sheets
 *
 * @private
 */
Ext.define('Ext.exporter.file.ooxml.Relationships', {
    extend: 'Ext.exporter.file.ooxml.Xml',
 
    isRelationships: true,
    currentIndex: 1,
 
    config: {
        /**
         * @private
         * All relationships targets should be relative paths to this parent folder
         * when the file is generated otherwise iOS Safari won't display the file
         */
        parentFolder: null,
 
        items: []
    },
 
    contentType: {
        contentType: 'application/vnd.openxmlformats-package.relationships+xml'
    },
 
    fileNameTemplate: '{fileName}.rels',
 
    tpl: [
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>',
        '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">',
        '<tpl if="items"><tpl for="items.getRange()">{[values.render()]}</tpl></tpl>',
        '</Relationships>'
    ],
 
    collectFiles: function(files) {
        var items = this.getItems(),
            length = items.length,
            folder = this.getParentFolder(),
            i;
 
        if (length) {
            for (= 0; i < length; i++) {
                items.getAt(i).setParentFolder(folder);
            }
 
            files[this.getPath()] = this.render();
        }
    },
 
    applyFolder: function(folder, oldFolder) {
        folder = this.callParent([folder, oldFolder]);
 
        return folder + '_rels/';
    },
 
    applyItems: function(data, dataCollection) {
        return this.checkCollection(data, dataCollection, 'Ext.exporter.file.ooxml.Relationship');
    },
 
    updateItems: function(collection, oldCollection) {
        var me = this;
 
        if (oldCollection) {
            oldCollection.un({
                add: me.updateIds,
                remove: me.updateIds,
                scope: me
            });
        }
 
        if (collection) {
            collection.on({
                add: me.updateIds,
                remove: me.updateIds,
                scope: me
            });
        }
    },
 
    updateIds: function(items) {
        var i, len, item;
 
        if (!items) {
            return;
        }
 
        len = items.length;
 
        for (= 0; i < len; i++) {
            item = items.getAt(i);
            item.setId('rId' + (+ 1));
        }
    },
 
    /**
     * Convenience method to add relationships.
     * @param {Object/Array} config
     * @return {Ext.exporter.file.ooxml.Relationship/Ext.exporter.file.ooxml.Relationship[]}
     */
    addRelationship: function(config) {
        return this.getItems().add(config || {});
    },
 
    removeRelationship: function(config) {
        return this.getItems().remove(config);
    }
});