jquery-tablesorter 1.17.2 → 1.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/jquery-tablesorter/version.rb +1 -1
  4. data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +76 -71
  5. data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.dragtable.mod.js +1 -1
  6. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +2647 -2576
  7. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +174 -119
  8. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +2487 -2471
  9. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-extract.js +15 -15
  10. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-iso8601.js +1 -1
  11. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-month.js +4 -4
  12. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-range.js +1 -1
  13. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-two-digit-year.js +12 -12
  14. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-weekday.js +4 -4
  15. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date.js +1 -1
  16. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-duration.js +1 -1
  17. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-feet-inch-fraction.js +6 -6
  18. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-file-type.js +22 -22
  19. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-globalize.js +1 -1
  20. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ignore-articles.js +15 -15
  21. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-image.js +3 -3
  22. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +10 -3
  23. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +2 -2
  24. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-named-numbers.js +3 -3
  25. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-network.js +1 -1
  26. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-roman.js +4 -4
  27. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +122 -121
  28. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +13 -13
  29. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-chart.js +2 -2
  30. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +324 -324
  31. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columns.js +60 -60
  32. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +219 -219
  33. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-html5.js +360 -361
  34. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-jui.js +666 -666
  35. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-select2.js +124 -124
  36. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-type-insideRange.js +1 -1
  37. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +1448 -1433
  38. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-formatter.js +1 -1
  39. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +213 -213
  40. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-headerTitles.js +3 -3
  41. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +271 -216
  42. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +339 -320
  43. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +1057 -1045
  44. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-print.js +109 -109
  45. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-reflow.js +114 -115
  46. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +360 -359
  47. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-saveSort.js +59 -59
  48. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +818 -806
  49. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sort2Hash.js +128 -0
  50. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sortTbodies.js +195 -195
  51. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-staticRow.js +90 -90
  52. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +257 -257
  53. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-storage.js +76 -76
  54. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-uitheme.js +170 -170
  55. metadata +3 -3
  56. data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.quicksearch.js +0 -195
@@ -1,4 +1,4 @@
1
- /*! Widget: output - updated 5/17/2015 (v2.22.0) *//*
1
+ /*! Widget: output - updated 7/28/2015 (v2.22.4) *//*
2
2
  * Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * Modified from:
4
4
  * HTML Table to CSV: http://www.kunalbabre.com/projects/table2CSV.php (License unknown?)
@@ -7,352 +7,371 @@
7
7
  /*jshint browser:true, jquery:true, unused:false */
8
8
  /*global jQuery: false */
9
9
  ;(function($){
10
- "use strict";
11
-
12
- var ts = $.tablesorter,
13
-
14
- output = ts.output = {
15
-
16
- event : 'outputTable',
17
-
18
- // wrap line breaks & tabs in quotes
19
- regexQuote : /([\n\t\x09\x0d\x0a]|<[^<]+>)/, // test if cell needs wrapping quotes
20
- regexBR : /(<br([\s\/])?>|\n)/g, // replace
21
- regexIMG : /<img[^>]+alt\s*=\s*['"]([^'"]+)['"][^>]*>/i, // match
22
- regexHTML : /<[^<]+>/g, // replace
23
-
24
- replaceCR : '\x0d\x0a',
25
- replaceTab : '\x09',
26
-
27
- popupTitle : 'Output',
28
- popupStyle : 'width:100%;height:100%;', // for textarea
29
- message : 'Your device does not support downloading. Please try again in desktop browser.',
30
-
31
- init : function(c) {
32
- c.$table
33
- .off(output.event)
34
- .on(output.event, function( e ) {
35
- e.stopPropagation();
36
- // explicitly use table.config.widgetOptions because we want
37
- // the most up-to-date values; not the "wo" from initialization
38
- output.process(c, c.widgetOptions);
39
- });
40
- },
41
-
42
- processRow: function(c, $rows, isHeader, isJSON) {
43
- var $cell, $cells, cellsLen, rowIndex, row, col, indx, rowspanLen, colspanLen, txt,
44
- wo = c.widgetOptions,
45
- tmpRow = [],
46
- dupe = wo.output_duplicateSpans,
47
- addSpanIndex = isHeader && isJSON && wo.output_headerRows && $.isFunction(wo.output_callbackJSON),
48
- cellIndex = 0,
49
- rowsLength = $rows.length;
50
-
51
- for ( rowIndex = 0; rowIndex < rowsLength; rowIndex++ ) {
52
- if (!tmpRow[rowIndex]) { tmpRow[rowIndex] = []; }
53
- cellIndex = 0;
54
- $cells = $rows.eq( rowIndex ).children();
55
- cellsLen = $cells.length;
56
- for ( indx = 0; indx < cellsLen; indx++ ) {
57
- $cell = $cells.eq( indx );
58
- // process rowspans
59
- if ($cell.filter('[rowspan]').length) {
60
- rowspanLen = parseInt( $cell.attr('rowspan'), 10) - 1;
61
- txt = output.formatData( wo, $cell, isHeader );
62
- for (row = 1; row <= rowspanLen; row++) {
63
- if (!tmpRow[rowIndex + row]) { tmpRow[rowIndex + row] = []; }
64
- tmpRow[rowIndex + row][cellIndex] = isHeader ? txt : dupe ? txt : '';
10
+ 'use strict';
11
+
12
+ var ts = $.tablesorter,
13
+
14
+ output = ts.output = {
15
+
16
+ event : 'outputTable',
17
+
18
+ // wrap line breaks & tabs in quotes
19
+ regexQuote : /([\n\t\x09\x0d\x0a]|<[^<]+>)/, // test if cell needs wrapping quotes
20
+ regexBR : /(<br([\s\/])?>|\n)/g, // replace
21
+ regexIMG : /<img[^>]+alt\s*=\s*['"]([^'"]+)['"][^>]*>/i, // match
22
+ regexHTML : /<[^<]+>/g, // replace
23
+
24
+ replaceCR : '\x0d\x0a',
25
+ replaceTab : '\x09',
26
+
27
+ popupTitle : 'Output',
28
+ popupStyle : 'width:100%;height:100%;', // for textarea
29
+ message : 'Your device does not support downloading. Please try again in desktop browser.',
30
+
31
+ init : function(c) {
32
+ c.$table
33
+ .off(output.event)
34
+ .on(output.event, function( e ) {
35
+ e.stopPropagation();
36
+ // explicitly use table.config.widgetOptions because we want
37
+ // the most up-to-date values; not the 'wo' from initialization
38
+ output.process(c, c.widgetOptions);
39
+ });
40
+ },
41
+
42
+ processRow: function(c, $rows, isHeader, isJSON) {
43
+ var $cell, $cells, cellsLen, rowIndex, row, col, indx, rowspanLen, colspanLen, txt,
44
+ wo = c.widgetOptions,
45
+ tmpRow = [],
46
+ dupe = wo.output_duplicateSpans,
47
+ addSpanIndex = isHeader && isJSON && wo.output_headerRows && $.isFunction(wo.output_callbackJSON),
48
+ cellIndex = 0,
49
+ rowsLength = $rows.length;
50
+
51
+ for ( rowIndex = 0; rowIndex < rowsLength; rowIndex++ ) {
52
+ if (!tmpRow[rowIndex]) { tmpRow[rowIndex] = []; }
53
+ cellIndex = 0;
54
+ $cells = $rows.eq( rowIndex ).children();
55
+ cellsLen = $cells.length;
56
+ for ( indx = 0; indx < cellsLen; indx++ ) {
57
+ $cell = $cells.eq( indx );
58
+ // process rowspans
59
+ if ($cell.filter('[rowspan]').length) {
60
+ rowspanLen = parseInt( $cell.attr('rowspan'), 10) - 1;
61
+ txt = output.formatData( c, wo, $cell, isHeader );
62
+ for (row = 1; row <= rowspanLen; row++) {
63
+ if (!tmpRow[rowIndex + row]) { tmpRow[rowIndex + row] = []; }
64
+ tmpRow[rowIndex + row][cellIndex] = isHeader ? txt : dupe ? txt : '';
65
+ }
65
66
  }
66
- }
67
- // process colspans
68
- if ($cell.filter('[colspan]').length) {
69
- colspanLen = parseInt( $cell.attr('colspan'), 10) - 1;
70
- // allow data-attribute to be an empty string
71
- txt = output.formatData( wo, $cell, isHeader );
72
- for (col = 1; col <= colspanLen; col++) {
73
- // if we're processing the header & making JSON, the header names need to be unique
74
- if ($cell.filter('[rowspan]').length) {
75
- rowspanLen = parseInt( $cell.attr('rowspan'), 10);
76
- for (row = 0; row < rowspanLen; row++) {
77
- if (!tmpRow[rowIndex + row]) { tmpRow[rowIndex + row] = []; }
78
- tmpRow[rowIndex + row][cellIndex + col] = addSpanIndex ?
67
+ // process colspans
68
+ if ($cell.filter('[colspan]').length) {
69
+ colspanLen = parseInt( $cell.attr('colspan'), 10) - 1;
70
+ // allow data-attribute to be an empty string
71
+ txt = output.formatData( c, wo, $cell, isHeader );
72
+ for (col = 1; col <= colspanLen; col++) {
73
+ // if we're processing the header & making JSON, the header names need to be unique
74
+ if ($cell.filter('[rowspan]').length) {
75
+ rowspanLen = parseInt( $cell.attr('rowspan'), 10);
76
+ for (row = 0; row < rowspanLen; row++) {
77
+ if (!tmpRow[rowIndex + row]) { tmpRow[rowIndex + row] = []; }
78
+ tmpRow[rowIndex + row][cellIndex + col] = addSpanIndex ?
79
+ wo.output_callbackJSON($cell, txt, cellIndex + col) ||
80
+ txt + '(' + (cellIndex + col) + ')' : isHeader ? txt : dupe ? txt : '';
81
+ }
82
+ } else {
83
+ tmpRow[rowIndex][cellIndex + col] = addSpanIndex ?
79
84
  wo.output_callbackJSON($cell, txt, cellIndex + col) ||
80
85
  txt + '(' + (cellIndex + col) + ')' : isHeader ? txt : dupe ? txt : '';
81
86
  }
82
- } else {
83
- tmpRow[rowIndex][cellIndex + col] = addSpanIndex ?
84
- wo.output_callbackJSON($cell, txt, cellIndex + col) ||
85
- txt + '(' + (cellIndex + col) + ')' : isHeader ? txt : dupe ? txt : '';
86
87
  }
87
88
  }
88
- }
89
89
 
90
- // skip column if already defined
91
- while (typeof tmpRow[rowIndex][cellIndex] !== 'undefined') { cellIndex++; }
90
+ // skip column if already defined
91
+ while (typeof tmpRow[rowIndex][cellIndex] !== 'undefined') { cellIndex++; }
92
92
 
93
- tmpRow[rowIndex][cellIndex] = tmpRow[rowIndex][cellIndex] ||
94
- output.formatData( wo, $cell, isHeader );
95
- cellIndex++;
93
+ tmpRow[rowIndex][cellIndex] = tmpRow[rowIndex][cellIndex] ||
94
+ output.formatData( c, wo, $cell, isHeader );
95
+ cellIndex++;
96
+ }
96
97
  }
97
- }
98
- return ts.output.removeColumns( c, wo, tmpRow );
99
- },
100
-
101
- // remove hidden/ignored columns
102
- removeColumns : function( c, wo, arry ) {
103
- var rowIndex, row, colIndex,
104
- data = [],
105
- len = arry.length;
106
- for ( rowIndex = 0; rowIndex < len; rowIndex++ ) {
107
- row = arry[ rowIndex ];
108
- data[ rowIndex ] = [];
109
- for ( colIndex = 0; colIndex < c.columns; colIndex++ ) {
110
- if ( !wo.output_hiddenColumnArray[ colIndex ] ) {
111
- data[ rowIndex ].push( row[ colIndex ] );
98
+ return ts.output.removeColumns( c, wo, tmpRow );
99
+ },
100
+
101
+ // remove hidden/ignored columns
102
+ removeColumns : function( c, wo, arry ) {
103
+ var rowIndex, row, colIndex,
104
+ data = [],
105
+ len = arry.length;
106
+ for ( rowIndex = 0; rowIndex < len; rowIndex++ ) {
107
+ row = arry[ rowIndex ];
108
+ data[ rowIndex ] = [];
109
+ for ( colIndex = 0; colIndex < c.columns; colIndex++ ) {
110
+ if ( !wo.output_hiddenColumnArray[ colIndex ] ) {
111
+ data[ rowIndex ].push( row[ colIndex ] );
112
+ }
112
113
  }
113
114
  }
114
- }
115
- return data;
116
- },
117
-
118
- process : function(c, wo) {
119
- var mydata, $this, $rows, headers, csvData, len, rowsLen, tmp,
120
- hasStringify = window.JSON && JSON.hasOwnProperty('stringify'),
121
- indx = 0,
122
- tmpData = (wo.output_separator || ',').toLowerCase(),
123
- outputJSON = tmpData === 'json',
124
- outputArray = tmpData === 'array',
125
- separator = outputJSON || outputArray ? ',' : wo.output_separator,
126
- saveRows = wo.output_saveRows,
127
- $el = c.$table;
128
- // regex to look for the set separator or HTML
129
- wo.output_regex = new RegExp('(' + (/\\/.test(separator) ? '\\' : '' ) + separator + ')' );
130
-
131
- // make a list of hidden columns
132
- wo.output_hiddenColumnArray = [];
133
- for ( indx = 0; indx < c.columns; indx++ ) {
134
- wo.output_hiddenColumnArray[ indx ] = $.inArray( indx, wo.output_ignoreColumns ) > -1 ||
135
- c.$headerIndexed[ indx ].css( 'display' ) === 'none';
136
- }
115
+ return data;
116
+ },
117
+
118
+ process : function(c, wo) {
119
+ var mydata, $this, $rows, headers, csvData, len, rowsLen, tmp,
120
+ hasStringify = window.JSON && JSON.hasOwnProperty('stringify'),
121
+ indx = 0,
122
+ tmpData = (wo.output_separator || ',').toLowerCase(),
123
+ outputJSON = tmpData === 'json',
124
+ outputArray = tmpData === 'array',
125
+ separator = outputJSON || outputArray ? ',' : wo.output_separator,
126
+ saveRows = wo.output_saveRows,
127
+ $el = c.$table;
128
+ // regex to look for the set separator or HTML
129
+ wo.output_regex = new RegExp('(' + (/\\/.test(separator) ? '\\' : '' ) + separator + ')' );
130
+
131
+ // make a list of hidden columns
132
+ wo.output_hiddenColumnArray = [];
133
+ for ( indx = 0; indx < c.columns; indx++ ) {
134
+ wo.output_hiddenColumnArray[ indx ] = $.inArray( indx, wo.output_ignoreColumns ) > -1 ||
135
+ ( !wo.output_hiddenColumns && c.$headerIndexed[ indx ].css( 'display' ) === 'none' &&
136
+ !c.$headerIndexed[ indx ].hasClass( 'tablesorter-scroller-hidden-column' ) );
137
+ }
137
138
 
138
- // get header cells
139
- $this = $el.find('thead tr:visible').not('.' + (ts.css.filterRow || 'tablesorter-filter-row') );
140
- headers = output.processRow(c, $this, true, outputJSON);
141
-
142
- // all tbody rows
143
- $rows = $el.children('tbody').children('tr');
144
-
145
- // get (f)iltered, (v)isible, all rows (look for the first letter only), or jQuery filter selector
146
- $rows = /^f/.test(saveRows) ? $rows.not('.' + (wo.filter_filteredRow || 'filtered') ) :
147
- /^v/.test(saveRows) ? $rows.filter(':visible') :
148
- // look for '.' (class selector), '#' (id selector),
149
- // ':' (basic filters, e.g. ':not()') or '[' (attribute selector start)
150
- /^[.#:\[]/.test(saveRows) ? $rows.filter(saveRows) :
151
- // default to all rows
152
- $rows;
153
-
154
- // process to array of arrays
155
- csvData = output.processRow(c, $rows);
156
-
157
- if (wo.output_includeFooter) {
158
- // clone, to force the tfoot rows to the end of this selection of rows
159
- // otherwise they appear after the thead (the order in the HTML)
160
- csvData = csvData.concat( output.processRow( c, $el.children('tfoot').children('tr:visible') ) );
161
- }
139
+ // get header cells
140
+ $this = $el
141
+ .find('thead tr')
142
+ .not('.' + (ts.css.filterRow || 'tablesorter-filter-row') )
143
+ .filter( function() {
144
+ return wo.output_hiddenColumns || $(this).css('display') !== 'none';
145
+ });
146
+ headers = output.processRow(c, $this, true, outputJSON);
147
+
148
+ // all tbody rows
149
+ $rows = $el.children('tbody').children('tr');
150
+
151
+ // get (f)iltered, (v)isible, all rows (look for the first letter only), or jQuery filter selector
152
+ $rows = /^f/.test(saveRows) ? $rows.not('.' + (wo.filter_filteredRow || 'filtered') ) :
153
+ /^v/.test(saveRows) ? $rows.filter(':visible') :
154
+ // look for '.' (class selector), '#' (id selector),
155
+ // ':' (basic filters, e.g. ':not()') or '[' (attribute selector start)
156
+ /^[.#:\[]/.test(saveRows) ? $rows.filter(saveRows) :
157
+ // default to all rows
158
+ $rows;
159
+
160
+ // process to array of arrays
161
+ csvData = output.processRow(c, $rows);
162
+
163
+ if (wo.output_includeFooter) {
164
+ // clone, to force the tfoot rows to the end of this selection of rows
165
+ // otherwise they appear after the thead (the order in the HTML)
166
+ csvData = csvData.concat( output.processRow( c, $el.children('tfoot').children('tr:visible') ) );
167
+ }
162
168
 
163
- len = headers.length;
169
+ len = headers.length;
164
170
 
165
- if (outputJSON) {
166
- tmpData = [];
167
- rowsLen = csvData.length;
168
- for ( indx = 0; indx < rowsLen; indx++ ) {
169
- // multiple header rows & output_headerRows = true, pick the last row...
170
- tmp = headers[ ( len > 1 && wo.output_headerRows ) ? indx % len : len - 1 ];
171
- tmpData.push( output.row2Hash( tmp, csvData[ indx ] ) );
172
- }
171
+ if (outputJSON) {
172
+ tmpData = [];
173
+ rowsLen = csvData.length;
174
+ for ( indx = 0; indx < rowsLen; indx++ ) {
175
+ // multiple header rows & output_headerRows = true, pick the last row...
176
+ tmp = headers[ ( len > 1 && wo.output_headerRows ) ? indx % len : len - 1 ];
177
+ tmpData.push( output.row2Hash( tmp, csvData[ indx ] ) );
178
+ }
173
179
 
174
- // requires JSON stringify; if it doesn't exist, the output will show [object Object],... in the output window
175
- mydata = hasStringify ? JSON.stringify(tmpData) : tmpData;
176
- } else {
177
- tmp = [ headers[ ( len > 1 && wo.output_headerRows ) ? indx % len : len - 1 ] ];
178
- tmpData = output.row2CSV(wo, wo.output_headerRows ? headers : tmp, outputArray)
179
- .concat( output.row2CSV(wo, csvData, outputArray) );
180
+ // requires JSON stringify; if it doesn't exist, the output will show [object Object],... in the output window
181
+ mydata = hasStringify ? JSON.stringify(tmpData) : tmpData;
182
+ } else {
183
+ tmp = [ headers[ ( len > 1 && wo.output_headerRows ) ? indx % len : len - 1 ] ];
184
+ tmpData = output.row2CSV(wo, wo.output_headerRows ? headers : tmp, outputArray)
185
+ .concat( output.row2CSV(wo, csvData, outputArray) );
180
186
 
181
- // stringify the array; if stringify doesn't exist the array will be flattened
182
- mydata = outputArray && hasStringify ? JSON.stringify(tmpData) : tmpData.join('\n');
183
- }
187
+ // stringify the array; if stringify doesn't exist the array will be flattened
188
+ mydata = outputArray && hasStringify ? JSON.stringify(tmpData) : tmpData.join('\n');
189
+ }
184
190
 
185
- // callback; if true returned, continue processing
186
- if ($.isFunction(wo.output_callback) && !wo.output_callback(c, mydata)) { return; }
191
+ // callback; if true returned, continue processing
192
+ if ($.isFunction(wo.output_callback) && !wo.output_callback(c, mydata)) { return; }
187
193
 
188
- if ( /p/i.test( wo.output_delivery || '' ) ) {
189
- output.popup(mydata, wo.output_popupStyle, outputJSON || outputArray);
190
- } else {
191
- output.download(wo, mydata);
192
- }
194
+ if ( /p/i.test( wo.output_delivery || '' ) ) {
195
+ output.popup(mydata, wo.output_popupStyle, outputJSON || outputArray);
196
+ } else {
197
+ output.download(wo, mydata);
198
+ }
193
199
 
194
- }, // end process
195
-
196
- row2CSV : function(wo, tmpRow, outputArray) {
197
- var tmp, rowIndex,
198
- csvData = [],
199
- rowLen = tmpRow.length;
200
- for (rowIndex = 0; rowIndex < rowLen; rowIndex++) {
201
- // remove any blank rows
202
- tmp = ( tmpRow[rowIndex] || [] ).join('').replace(/\"/g,'');
203
- if ( ( tmpRow[rowIndex] || [] ).length > 0 && tmp !== '' ) {
204
- csvData[csvData.length] = outputArray ? tmpRow[rowIndex] : tmpRow[rowIndex].join(wo.output_separator);
200
+ }, // end process
201
+
202
+ row2CSV : function(wo, tmpRow, outputArray) {
203
+ var tmp, rowIndex,
204
+ csvData = [],
205
+ rowLen = tmpRow.length;
206
+ for (rowIndex = 0; rowIndex < rowLen; rowIndex++) {
207
+ // remove any blank rows
208
+ tmp = ( tmpRow[rowIndex] || [] ).join('').replace(/\"/g, '');
209
+ if ( ( tmpRow[rowIndex] || [] ).length > 0 && tmp !== '' ) {
210
+ csvData[csvData.length] = outputArray ? tmpRow[rowIndex] : tmpRow[rowIndex].join(wo.output_separator);
211
+ }
205
212
  }
206
- }
207
- return csvData;
208
- },
209
-
210
- row2Hash : function( keys, values ) {
211
- var indx,
212
- json = {},
213
- len = values.length;
214
- for ( indx = 0; indx < len; indx++ ) {
215
- if ( indx < keys.length ) {
216
- json[ keys[ indx ] ] = values[ indx ];
213
+ return csvData;
214
+ },
215
+
216
+ row2Hash : function( keys, values ) {
217
+ var indx,
218
+ json = {},
219
+ len = values.length;
220
+ for ( indx = 0; indx < len; indx++ ) {
221
+ if ( indx < keys.length ) {
222
+ json[ keys[ indx ] ] = values[ indx ];
223
+ }
224
+ }
225
+ return json;
226
+ },
227
+
228
+ formatData : function(c, wo, $el, isHeader) {
229
+ var attr = $el.attr(wo.output_dataAttrib),
230
+ txt = typeof attr !== 'undefined' ? attr : $el.html(),
231
+ quotes = (wo.output_separator || ',').toLowerCase(),
232
+ separator = quotes === 'json' || quotes === 'array',
233
+ // replace " with “ if undefined
234
+ result = txt.replace(/\"/g, wo.output_replaceQuote || '\u201c');
235
+ // replace line breaks with \\n & tabs with \\t
236
+ if (!wo.output_trimSpaces) {
237
+ result = result.replace(output.regexBR, output.replaceCR).replace(/\t/g, output.replaceTab);
238
+ } else {
239
+ result = result.replace(output.regexBR, '');
240
+ }
241
+ // extract img alt text
242
+ txt = result.match(output.regexIMG);
243
+ if (!wo.output_includeHTML && txt !== null) {
244
+ result = txt[1];
245
+ }
246
+ // replace/remove html
247
+ result = wo.output_includeHTML && !isHeader ? result : result.replace(output.regexHTML, '');
248
+ result = wo.output_trimSpaces || isHeader ? $.trim(result) : result;
249
+ // JSON & array outputs don't need quotes
250
+ quotes = separator ? false : wo.output_wrapQuotes || wo.output_regex.test(result) || output.regexQuote.test(result);
251
+ result = quotes ? '"' + result + '"' : result;
252
+
253
+ // formatting callback - added v2.22.4
254
+ if ( typeof wo.output_formatContent === 'function' ) {
255
+ return wo.output_formatContent( c, wo, {
256
+ isHeader : isHeader,
257
+ $cell : $el,
258
+ content : result
259
+ });
217
260
  }
218
- }
219
- return json;
220
- },
221
-
222
- formatData : function(wo, $el, isHeader) {
223
- var attr = $el.attr(wo.output_dataAttrib),
224
- txt = typeof attr !== 'undefined' ? attr : $el.html(),
225
- quotes = (wo.output_separator || ',').toLowerCase(),
226
- separator = quotes === 'json' || quotes === 'array',
227
- // replace " with “ if undefined
228
- result = txt.replace(/\"/g, wo.output_replaceQuote || '\u201c');
229
- // replace line breaks with \\n & tabs with \\t
230
- if (!wo.output_trimSpaces) {
231
- result = result.replace(output.regexBR, output.replaceCR).replace(/\t/g, output.replaceTab);
232
- } else {
233
- result = result.replace(output.regexBR, '');
234
- }
235
- // extract img alt text
236
- txt = result.match(output.regexIMG);
237
- if (!wo.output_includeHTML && txt !== null) {
238
- result = txt[1];
239
- }
240
- // replace/remove html
241
- result = wo.output_includeHTML && !isHeader ? result : result.replace(output.regexHTML, '');
242
- result = wo.output_trimSpaces || isHeader ? $.trim(result) : result;
243
- // JSON & array outputs don't need quotes
244
- quotes = separator ? false : wo.output_wrapQuotes || wo.output_regex.test(result) || output.regexQuote.test(result);
245
- return quotes ? '"' + result + '"' : result;
246
- },
247
-
248
- popup : function(data, style, wrap) {
249
- var generator = window.open('', output.popupTitle, style);
250
- generator.document.write(
251
- '<html><head><title>' + output.popupTitle + '</title></head><body>' +
252
- '<textarea wrap="' + (wrap ? 'on' : 'off') + '" style="' + output.popupStyle + '">' + data + '\n</textarea>' +
253
- '</body></html>'
254
- );
255
- generator.document.close();
256
- generator.focus();
257
- // select all text and focus within the textarea in the popup
258
- // $(generator.document).find('textarea').select().focus();
259
- return true;
260
- },
261
-
262
- // modified from https://github.com/PixelsCommander/Download-File-JS
263
- // & http://html5-demos.appspot.com/static/a.download.html
264
- download : function (wo, data){
265
-
266
- var e, blob, gotBlob,
267
- nav = window.navigator,
268
- link = document.createElement('a');
269
-
270
- // iOS devices do not support downloading. We have to inform user about this.
271
- if (/(iP)/g.test(nav.userAgent)) {
272
- alert(output.message);
273
- return false;
274
- }
275
-
276
- // test for blob support
277
- try {
278
- gotBlob = !!new Blob();
279
- } catch (err) {
280
- gotBlob = false;
281
- }
282
261
 
283
- // Use HTML5 Blob if browser supports it
284
- if ( gotBlob ) {
262
+ return result;
263
+ },
264
+
265
+ popup : function(data, style, wrap) {
266
+ var generator = window.open('', output.popupTitle, style);
267
+ generator.document.write(
268
+ '<html><head><title>' + output.popupTitle + '</title></head><body>' +
269
+ '<textarea wrap="' + (wrap ? 'on' : 'off') + '" style="' + output.popupStyle + '">' + data + '\n</textarea>' +
270
+ '</body></html>'
271
+ );
272
+ generator.document.close();
273
+ generator.focus();
274
+ // select all text and focus within the textarea in the popup
275
+ // $(generator.document).find('textarea').select().focus();
276
+ return true;
277
+ },
278
+
279
+ // modified from https://github.com/PixelsCommander/Download-File-JS
280
+ // & http://html5-demos.appspot.com/static/a.download.html
281
+ download : function (wo, data){
282
+
283
+ var e, blob, gotBlob,
284
+ nav = window.navigator,
285
+ link = document.createElement('a');
286
+
287
+ // iOS devices do not support downloading. We have to inform user about this.
288
+ if (/(iP)/g.test(nav.userAgent)) {
289
+ alert(output.message);
290
+ return false;
291
+ }
285
292
 
286
- window.URL = window.URL || window.webkitURL;
287
- // prepend BOM for utf-8 encoding - see https://github.com/eligrey/FileSaver.js/blob/master/FileSaver.js#L140
288
- blob = new Blob( [ '\ufeff', data ], { type: wo.output_encoding } );
293
+ // test for blob support
294
+ try {
295
+ gotBlob = !!new Blob();
296
+ } catch (err) {
297
+ gotBlob = false;
298
+ }
289
299
 
290
- if (nav.msSaveBlob) {
291
- // IE 10+
292
- nav.msSaveBlob(blob, wo.output_saveFileName);
293
- } else {
294
- // all other browsers
295
- link.href = window.URL.createObjectURL(blob);
296
- link.download = wo.output_saveFileName;
297
- // Dispatching click event; using $(link).trigger() won't work
298
- if (document.createEvent) {
299
- e = document.createEvent('MouseEvents');
300
- // event.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY,
301
- // ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
302
- e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
303
- link.dispatchEvent(e);
300
+ // Use HTML5 Blob if browser supports it
301
+ if ( gotBlob ) {
302
+
303
+ window.URL = window.URL || window.webkitURL;
304
+ // prepend BOM for utf-8 encoding - see https://github.com/eligrey/FileSaver.js/blob/master/FileSaver.js#L140
305
+ blob = new Blob( [ '\ufeff', data ], { type: wo.output_encoding } );
306
+
307
+ if (nav.msSaveBlob) {
308
+ // IE 10+
309
+ nav.msSaveBlob(blob, wo.output_saveFileName);
310
+ } else {
311
+ // all other browsers
312
+ link.href = window.URL.createObjectURL(blob);
313
+ link.download = wo.output_saveFileName;
314
+ // Dispatching click event; using $(link).trigger() won't work
315
+ if (document.createEvent) {
316
+ e = document.createEvent('MouseEvents');
317
+ // event.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY,
318
+ // ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
319
+ e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
320
+ link.dispatchEvent(e);
321
+ }
304
322
  }
323
+ return false;
305
324
  }
306
- return false;
325
+
326
+ // fallback to force file download (whether supported by server).
327
+ // not sure if this actually works in IE9 and older...
328
+ window.open( wo.output_encoding + encodeURIComponent(data) + '?download', '_self');
329
+ return true;
330
+
331
+ },
332
+
333
+ remove : function(c) {
334
+ c.$table.off(output.event);
335
+ }
336
+
337
+ };
338
+
339
+ ts.addWidget({
340
+ id: 'output',
341
+ options: {
342
+ output_separator : ',', // set to 'json', 'array' or any separator
343
+ output_ignoreColumns : [], // columns to ignore [0, 1,... ] (zero-based index)
344
+ output_hiddenColumns : false, // include hidden columns in the output
345
+ output_includeFooter : false, // include footer rows in the output
346
+ output_dataAttrib : 'data-name', // header attrib containing modified header name
347
+ output_headerRows : false, // if true, include multiple header rows (JSON only)
348
+ output_delivery : 'popup', // popup, download
349
+ output_saveRows : 'filtered', // (a)ll, (v)isible, (f)iltered or jQuery filter selector
350
+ output_duplicateSpans : true, // duplicate output data in tbody colspan/rowspan
351
+ output_replaceQuote : '\u201c;', // left double quote
352
+ output_includeHTML : false,
353
+ output_trimSpaces : true,
354
+ output_wrapQuotes : false,
355
+ output_popupStyle : 'width=500,height=300',
356
+ output_saveFileName : 'mytable.csv',
357
+ // format $cell content callback
358
+ output_formatContent : null, // function(config, data){ return data.content; }
359
+ // callback executed when processing completes
360
+ // return true to continue download/output
361
+ // return false to stop delivery & do something else with the data
362
+ output_callback : function(config, data){ return true; },
363
+ // JSON callback executed when a colspan is encountered in the header
364
+ output_callbackJSON : function($cell, txt, cellIndex) { return txt + '(' + (cellIndex) + ')'; },
365
+ // the need to modify this for Excel no longer exists
366
+ output_encoding : 'data:application/octet-stream;charset=utf8,'
367
+ },
368
+ init: function(table, thisWidget, c) {
369
+ output.init(c);
370
+ },
371
+ remove: function(table, c){
372
+ output.remove(c);
307
373
  }
308
374
 
309
- // fallback to force file download (whether supported by server).
310
- // not sure if this actually works in IE9 and older...
311
- window.open( wo.output_encoding + encodeURIComponent(data) + '?download' , '_self');
312
- return true;
313
-
314
- },
315
-
316
- remove : function(c) {
317
- c.$table.off(output.event);
318
- }
319
-
320
- };
321
-
322
- ts.addWidget({
323
- id: "output",
324
- options: {
325
- output_separator : ',', // set to "json", "array" or any separator
326
- output_ignoreColumns : [], // columns to ignore [0, 1,... ] (zero-based index)
327
- output_hiddenColumns : false, // include hidden columns in the output
328
- output_includeFooter : false, // include footer rows in the output
329
- output_dataAttrib : 'data-name', // header attrib containing modified header name
330
- output_headerRows : false, // if true, include multiple header rows (JSON only)
331
- output_delivery : 'popup', // popup, download
332
- output_saveRows : 'filtered', // (a)ll, (v)isible, (f)iltered or jQuery filter selector
333
- output_duplicateSpans: true, // duplicate output data in tbody colspan/rowspan
334
- output_replaceQuote : '\u201c;', // left double quote
335
- output_includeHTML : false,
336
- output_trimSpaces : true,
337
- output_wrapQuotes : false,
338
- output_popupStyle : 'width=500,height=300',
339
- output_saveFileName : 'mytable.csv',
340
- // callback executed when processing completes
341
- // return true to continue download/output
342
- // return false to stop delivery & do something else with the data
343
- output_callback : function(config, data){ return true; },
344
- // JSON callback executed when a colspan is encountered in the header
345
- output_callbackJSON : function($cell, txt, cellIndex) { return txt + '(' + (cellIndex) + ')'; },
346
- // the need to modify this for Excel no longer exists
347
- output_encoding : 'data:application/octet-stream;charset=utf8,'
348
- },
349
- init: function(table, thisWidget, c) {
350
- output.init(c);
351
- },
352
- remove: function(table, c){
353
- output.remove(c);
354
- }
355
-
356
- });
375
+ });
357
376
 
358
377
  })(jQuery);