Retrieves the fields in the form as a set of key/value pairs, using their
{@link Ext.form.field.Field#getSubmitData getSubmitData()} method to collect the values.
If multiple fields return values under the same name those values will be combined into an Array.
This is similar to {@link Ext.form.Basic#getFieldValues getFieldValues} except that this method
collects only String values for submission, while getFieldValues collects type-specific data
values (e.g. Date objects for date fields.)

@param {Boolean} [asString=false] If true, will return the key/value collection as a single
URL-encoded param string.
@param {Boolean} [dirtyOnly=false] If true, only fields that are dirty will be included in the result.
@param {Boolean} [includeEmptyText=false] If true, the configured emptyText of empty fields will be used.
@param {Boolean} [useDataValues=false] If true, the {@link Ext.form.field.Field#getModelData getModelData}
method is used to retrieve values from fields, otherwise the {@link Ext.form.field.Field#getSubmitData getSubmitData}
method is used.
@return {String/Object}
function(asString, dirtyOnly, includeEmptyText, useDataValues) {
        var values  = {},
            fields  = this.getFields().items,
            f,
            fLen    = fields.length,
            isArray = Ext.isArray,
            field, data, val, bucket, name;

        for (f = 0; f < fLen; f++) {
            field = fields[f];

            if (!dirtyOnly || field.isDirty()) {
                data = field[useDataValues ? 'getModelData' : 'getSubmitData'](includeEmptyText);

                if (Ext.isObject(data)) {
                    for (name in data) {
                        if (data.hasOwnProperty(name)) {
                            val = data[name];

                            if (includeEmptyText && val === '') {
                                val = field.emptyText || '';
                            }

                            if (values.hasOwnProperty(name)) {
                                bucket = values[name];

                                if (!isArray(bucket)) {
                                    bucket = values[name] = [bucket];
                                }

                                if (isArray(val)) {
                                    values[name] = bucket.concat(val);
                                } else {
                                    bucket.push(val);
                                }
                            } else {
                                values[name] = val;
                            }
                        }
                    }
                }
            }
        }

        if (asString) {
            values = Ext.Object.toQueryString(values);
        }
        return values;
    }