/**
 * Ext.ux.GridCsv - Get CSV Data
 * Version 1.0
 * James Dempster letssurf@gmail.com
 * http://code.jdempster.com/
 */

/*global Ext*/
Ext.override(Ext.grid.GridPanel, (function() {

    var csvEnclose = (function() {
        var regQuote = /"/gm;
        var fixQuotes = function(v) {
            return String(v).replace(regQuote, '""');
        };

        var regMatchEscapees = /"|,|\n|^\s|\s$/;
        var enclose = function(v) {
            if (regMatchEscapees.test(v)) {
                return '"'+v+'"';
            }
            return v;
        };

        return function(v) {
            return enclose(fixQuotes(v));
        };
    }());

    return {

        /**
         * Get the generated csv
         * @return {String} data The generated csv
         */
        getCsvData: function() {
            var rows = [], headers = [], columns = [];
            var cm = this.getColumnModel();
            cm.getColumnsBy(function(columnConfig, index) {
                if (!cm.isHidden(index)) {
                    headers.push(csvEnclose(columnConfig.header));
                    columns.push({
                        columnIndex: index,
                        dataIndex: columnConfig.dataIndex,
                        renderer: cm.getRenderer(index)
                    });
                }
            });
            rows.push(headers.join(','));

            var store = this.getStore();
            store.each(function(r, rowIndex) {
                var row = [];
                Ext.each(columns, function(col) {
                    var value = r.get(col.dataIndex);
                    value = col.renderer(value, {}, r, rowIndex, col.columnIndex, store);
                    value = csvEnclose(value);
                    row.push(value);
                });
                rows.push(row.join(','));
            });

            return rows.join('\n');
        }
    };
}()));