jquery-datatables-rails 1.11.2 → 1.11.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/lib/jquery/datatables/rails/engine.rb +1 -1
  3. data/lib/jquery/datatables/rails/version.rb +1 -1
  4. data/vendor/assets/images/dataTables/extras/button.png +0 -0
  5. data/vendor/assets/images/dataTables/extras/insert.png +0 -0
  6. data/vendor/assets/images/dataTables/foundation/sort_asc.png +0 -0
  7. data/vendor/assets/images/dataTables/foundation/sort_asc_disabled.png +0 -0
  8. data/vendor/assets/images/dataTables/foundation/sort_both.png +0 -0
  9. data/vendor/assets/images/dataTables/foundation/sort_desc.png +0 -0
  10. data/vendor/assets/images/dataTables/foundation/sort_desc_disabled.png +0 -0
  11. data/vendor/assets/images/dataTables/minus.png +0 -0
  12. data/vendor/assets/images/dataTables/plus.png +0 -0
  13. data/vendor/assets/javascripts/dataTables/extras/ColReorder.js +41 -15
  14. data/vendor/assets/javascripts/dataTables/extras/ColVis.js +1 -9
  15. data/vendor/assets/javascripts/dataTables/extras/TableTools.js +121 -69
  16. data/vendor/assets/javascripts/dataTables/extras/TableTools.min.js +50 -49
  17. data/vendor/assets/javascripts/dataTables/jquery.dataTables.bootstrap.js +2 -2
  18. data/vendor/assets/javascripts/dataTables/jquery.dataTables.bootstrap3.js +152 -0
  19. data/vendor/assets/javascripts/dataTables/jquery.dataTables.foundation.js +186 -0
  20. data/vendor/assets/javascripts/dataTables/jquery.dataTables.responsive.js +435 -0
  21. data/vendor/assets/media/dataTables/extras/as3/ZeroClipboard.as +1 -1
  22. data/vendor/assets/media/dataTables/extras/as3/ZeroClipboardPdf.as +1 -1
  23. data/vendor/assets/media/dataTables/extras/swf/copy_csv_xls.swf +0 -0
  24. data/vendor/assets/media/dataTables/extras/swf/copy_csv_xls_pdf.swf +0 -0
  25. data/vendor/assets/stylesheets/dataTables/extras/ColReorder.css.erb +21 -0
  26. data/vendor/assets/stylesheets/dataTables/extras/ColVis.css +76 -0
  27. data/vendor/assets/stylesheets/dataTables/extras/ColVisAlt.css.erb +104 -0
  28. data/vendor/assets/stylesheets/dataTables/extras/{TableTools.css → TableTools.css.erb} +39 -31
  29. data/vendor/assets/stylesheets/dataTables/jquery.dataTables.bootstrap.css.scss +5 -0
  30. data/vendor/assets/stylesheets/dataTables/jquery.dataTables.bootstrap3.css.scss +216 -0
  31. data/vendor/assets/stylesheets/dataTables/jquery.dataTables.foundation.css.scss +211 -0
  32. data/vendor/assets/stylesheets/dataTables/jquery.dataTables.responsive.css.scss +22 -0
  33. metadata +28 -15
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 037dfdbef8b4ecec1f3529c3748a8265e48d6569
4
+ data.tar.gz: 7cf9eb12d937c254ce8a49e2362af6d88f8094a1
5
+ SHA512:
6
+ metadata.gz: 93b9dfe61876537f5058e7f9905f3254aa80970a18624efd54e0ac0e0fdc909a8e14a9d00ad61ee23c45a74f7eae4dbf7cd2526707da7da057e1e3d7ca953a33
7
+ data.tar.gz: ec194243411f26c77e9c3bb929815248db9f1de06cc0ffc178f1873febc8b32991e70d91c35c4da7b03e2b22043ad0baa162881177b2b4290b92c7e8f6d9003b
@@ -1,7 +1,7 @@
1
1
  # Configure for Rails 3.1
2
2
  module Jquery
3
3
  module Datatables
4
- if defined?(::Rails) and ::Rails.version >= "3.1"
4
+ if defined?(::Rails) and Gem::Requirement.new('>= 3.1').satisfied_by?(Gem::Version.new ::Rails.version)
5
5
  module Rails
6
6
  class Engine < ::Rails::Engine
7
7
  end
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Datatables
3
3
  module Rails
4
- VERSION = "1.11.2"
4
+ VERSION = "1.11.3"
5
5
  end
6
6
  end
7
7
  end
@@ -1,8 +1,8 @@
1
1
  /*
2
2
  * File: ColReorder.js
3
- * Version: 1.0.6
3
+ * Version: 1.0.8
4
4
  * CVS: $Id$
5
- * Description: Controls for column visiblity in DataTables
5
+ * Description: Allow columns to be reordered in a DataTable
6
6
  * Author: Allan Jardine (www.sprymedia.co.uk)
7
7
  * Created: Wed Sep 15 18:23:29 BST 2010
8
8
  * Modified: $Date$ by $Author$
@@ -174,10 +174,10 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
174
174
  for ( i=0, iLen=iCols ; i<iLen ; i++ )
175
175
  {
176
176
  oCol = oSettings.aoColumns[i];
177
- if ( typeof oCol.mDataProp == 'number' ) {
178
- oCol.mDataProp = aiInvertMapping[ oCol.mDataProp ];
179
- oCol.fnGetData = oSettings.oApi._fnGetObjectDataFn( oCol.mDataProp );
180
- oCol.fnSetData = oSettings.oApi._fnSetObjectDataFn( oCol.mDataProp );
177
+ if ( typeof oCol.mData == 'number' ) {
178
+ oCol.mData = aiInvertMapping[ oCol.mData ];
179
+ oCol.fnGetData = oSettings.oApi._fnGetObjectDataFn( oCol.mData );
180
+ oCol.fnSetData = oSettings.oApi._fnSetObjectDataFn( oCol.mData );
181
181
  }
182
182
  }
183
183
 
@@ -294,10 +294,10 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
294
294
  * ColReorder provides column visiblity control for DataTables
295
295
  * @class ColReorder
296
296
  * @constructor
297
- * @param {object} DataTables object
297
+ * @param {object} DataTables settings object
298
298
  * @param {object} ColReorder options
299
299
  */
300
- ColReorder = function( oTable, oOpts )
300
+ ColReorder = function( oDTSettings, oOpts )
301
301
  {
302
302
  /* Santiy check that we are a new instance */
303
303
  if ( !this.CLASS || this.CLASS != "ColReorder" )
@@ -400,9 +400,12 @@ ColReorder = function( oTable, oOpts )
400
400
 
401
401
 
402
402
  /* Constructor logic */
403
- this.s.dt = oTable.fnSettings();
403
+ this.s.dt = oDTSettings.oInstance.fnSettings();
404
404
  this._fnConstruct();
405
405
 
406
+ /* Add destroy callback */
407
+ oDTSettings.oApi._fnCallbackReg(oDTSettings, 'aoDestroyCallback', jQuery.proxy(this._fnDestroy, this), 'ColReorder');
408
+
406
409
  /* Store the instance for later use */
407
410
  ColReorder.aoInstances.push( this );
408
411
  return this;
@@ -811,7 +814,7 @@ ColReorder.prototype = {
811
814
  }
812
815
 
813
816
  $('thead tr:eq(0)', this.dom.drag).each( function () {
814
- $('th:not(:eq('+that.s.mouse.targetIndex+'))', this).remove();
817
+ $('th', this).eq(that.s.mouse.targetIndex).siblings().remove();
815
818
  } );
816
819
  $('tr', this.dom.drag).height( $('tr:eq(0)', that.s.dt.nTHead).height() );
817
820
 
@@ -844,6 +847,29 @@ ColReorder.prototype = {
844
847
 
845
848
  document.body.appendChild( this.dom.pointer );
846
849
  document.body.appendChild( this.dom.drag );
850
+ },
851
+
852
+ /**
853
+ * Clean up ColReorder memory references and event handlers
854
+ * @method _fnDestroy
855
+ * @returns void
856
+ * @private
857
+ */
858
+ "_fnDestroy": function ()
859
+ {
860
+ for ( var i=0, iLen=ColReorder.aoInstances.length ; i<iLen ; i++ )
861
+ {
862
+ if ( ColReorder.aoInstances[i] === this )
863
+ {
864
+ ColReorder.aoInstances.splice( i, 1 );
865
+ break;
866
+ }
867
+ }
868
+
869
+ $(this.s.dt.nTHead).find( '*' ).unbind( '.ColReorder' );
870
+
871
+ this.s.dt.oInstance._oPluginColReorder = null;
872
+ this.s = null;
847
873
  }
848
874
  };
849
875
 
@@ -913,7 +939,7 @@ ColReorder.prototype.CLASS = "ColReorder";
913
939
  * @type String
914
940
  * @default As code
915
941
  */
916
- ColReorder.VERSION = "1.0.6";
942
+ ColReorder.VERSION = "1.0.8";
917
943
  ColReorder.prototype.VERSION = ColReorder.VERSION;
918
944
 
919
945
 
@@ -929,7 +955,7 @@ ColReorder.prototype.VERSION = ColReorder.VERSION;
929
955
  */
930
956
  if ( typeof $.fn.dataTable == "function" &&
931
957
  typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
932
- $.fn.dataTableExt.fnVersionCheck('1.9.0') )
958
+ $.fn.dataTableExt.fnVersionCheck('1.9.3') )
933
959
  {
934
960
  $.fn.dataTableExt.aoFeatures.push( {
935
961
  "fnInit": function( oDTSettings ) {
@@ -937,7 +963,7 @@ if ( typeof $.fn.dataTable == "function" &&
937
963
  if ( typeof oTable._oPluginColReorder == 'undefined' ) {
938
964
  var opts = typeof oDTSettings.oInit.oColReorder != 'undefined' ?
939
965
  oDTSettings.oInit.oColReorder : {};
940
- oTable._oPluginColReorder = new ColReorder( oDTSettings.oInstance, opts );
966
+ oTable._oPluginColReorder = new ColReorder( oDTSettings, opts );
941
967
  } else {
942
968
  oTable.oApi._fnLog( oDTSettings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
943
969
  }
@@ -950,7 +976,7 @@ if ( typeof $.fn.dataTable == "function" &&
950
976
  }
951
977
  else
952
978
  {
953
- alert( "Warning: ColReorder requires DataTables 1.9.0 or greater - www.datatables.net/download");
979
+ alert( "Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download");
954
980
  }
955
981
 
956
- })(jQuery, window, document);
982
+ })(jQuery, window, document);
@@ -849,15 +849,7 @@ ColVis.prototype = {
849
849
  */
850
850
  setTimeout( function () {
851
851
  $(nHidden).animate({"opacity": 1}, that.s.iOverlayFade);
852
- $(nBackground).animate({"opacity": 0.1}, that.s.iOverlayFade, 'linear', function () {
853
- /* In IE6 if you set the checked attribute of a hidden checkbox, then this is not visually
854
- * reflected. As such, we need to do it here, once it is visible. Unbelievable.
855
- */
856
- if ( jQuery.browser.msie && jQuery.browser.version == "6.0" )
857
- {
858
- that._fnDrawCallback();
859
- }
860
- });
852
+ $(nBackground).animate({"opacity": 0.1}, that.s.iOverlayFade, 'linear');
861
853
  }, 10 );
862
854
 
863
855
  this.s.hidden = false;
@@ -1,13 +1,13 @@
1
1
  /*
2
2
  * File: TableTools.js
3
- * Version: 2.1.3
3
+ * Version: 2.1.5
4
4
  * Description: Tools and buttons for DataTables
5
5
  * Author: Allan Jardine (www.sprymedia.co.uk)
6
6
  * Language: Javascript
7
7
  * License: GPL v2 or BSD 3 point style
8
8
  * Project: DataTables
9
9
  *
10
- * Copyright 2009-2012 Allan Jardine, all rights reserved.
10
+ * Copyright 2009-2013 Allan Jardine, all rights reserved.
11
11
  *
12
12
  * This source file is free software, under either the GPL v2 license or a
13
13
  * BSD style license, available at:
@@ -323,18 +323,39 @@ TableTools.prototype = {
323
323
  /**
324
324
  * Retreieve the settings object from an instance
325
325
  * @returns {array} List of TR nodes which are currently selected
326
+ * @param {boolean} [filtered=false] Get only selected rows which are
327
+ * available given the filtering applied to the table. By default
328
+ * this is false - i.e. all rows, regardless of filtering are
329
+ selected.
326
330
  */
327
- "fnGetSelected": function ()
331
+ "fnGetSelected": function ( filtered )
328
332
  {
329
- var out=[];
330
- var data=this.s.dt.aoData;
331
- var i, iLen;
333
+ var
334
+ out = [],
335
+ data = this.s.dt.aoData,
336
+ displayed = this.s.dt.aiDisplay,
337
+ i, iLen;
332
338
 
333
- for ( i=0, iLen=data.length ; i<iLen ; i++ )
339
+ if ( filtered )
334
340
  {
335
- if ( data[i]._DTTT_selected )
341
+ // Only consider filtered rows
342
+ for ( i=0, iLen=displayed.length ; i<iLen ; i++ )
336
343
  {
337
- out.push( data[i].nTr );
344
+ if ( data[ displayed[i] ]._DTTT_selected )
345
+ {
346
+ out.push( data[ displayed[i] ].nTr );
347
+ }
348
+ }
349
+ }
350
+ else
351
+ {
352
+ // Use all rows
353
+ for ( i=0, iLen=data.length ; i<iLen ; i++ )
354
+ {
355
+ if ( data[i]._DTTT_selected )
356
+ {
357
+ out.push( data[i].nTr );
358
+ }
338
359
  }
339
360
  }
340
361
 
@@ -404,10 +425,7 @@ TableTools.prototype = {
404
425
  {
405
426
  var s = this._fnGetMasterSettings();
406
427
 
407
- this._fnRowDeselect( (filtered === true) ?
408
- s.dt.aiDisplay :
409
- s.dt.aoData
410
- );
428
+ this._fnRowDeselect( this.fnGetSelected(filtered) );
411
429
  },
412
430
 
413
431
 
@@ -655,11 +673,12 @@ TableTools.prototype = {
655
673
  /* Buttons */
656
674
  this._fnButtonDefinations( this.s.buttonSet, this.dom.container );
657
675
 
658
- /* Destructor - need to wipe the DOM for IE's garbage collector */
676
+ /* Destructor */
659
677
  this.s.dt.aoDestroyCallback.push( {
660
678
  "sName": "TableTools",
661
679
  "fn": function () {
662
- that.dom.container.innerHTML = "";
680
+ $(that.s.dt.nTBody).off( 'click.DTTT_Select', 'tr' );
681
+ $(that.dom.container).empty();
663
682
  }
664
683
  } );
665
684
  },
@@ -1006,7 +1025,7 @@ TableTools.prototype = {
1006
1025
 
1007
1026
  $(dt.nTable).addClass( this.classes.select.table );
1008
1027
 
1009
- $('tr', dt.nTBody).live( 'click', function(e) {
1028
+ $(dt.nTBody).on( 'click.DTTT_Select', 'tr', function(e) {
1010
1029
  /* Sub-table must be ignored (odd that the selector won't do this with >) */
1011
1030
  if ( this.parentNode != dt.nTBody )
1012
1031
  {
@@ -1018,25 +1037,19 @@ TableTools.prototype = {
1018
1037
  {
1019
1038
  return;
1020
1039
  }
1021
-
1022
- /* User defined selection function */
1023
- if ( that.s.select.preRowSelect !== null && !that.s.select.preRowSelect.call(that, e) )
1024
- {
1025
- return;
1026
- }
1027
1040
 
1028
1041
  if ( that.fnIsSelected( this ) )
1029
1042
  {
1030
- that._fnRowDeselect( this );
1043
+ that._fnRowDeselect( this, e );
1031
1044
  }
1032
1045
  else if ( that.s.select.type == "single" )
1033
1046
  {
1034
1047
  that.fnSelectNone();
1035
- that._fnRowSelect( this );
1048
+ that._fnRowSelect( this, e );
1036
1049
  }
1037
1050
  else if ( that.s.select.type == "multi" )
1038
1051
  {
1039
- that._fnRowSelect( this );
1052
+ that._fnRowSelect( this, e );
1040
1053
  }
1041
1054
  } );
1042
1055
 
@@ -1056,27 +1069,48 @@ TableTools.prototype = {
1056
1069
  * @param {*} src Rows to select - see _fnSelectData for a description of valid inputs
1057
1070
  * @private
1058
1071
  */
1059
- "_fnRowSelect": function ( src )
1072
+ "_fnRowSelect": function ( src, e )
1060
1073
  {
1061
- var data = this._fnSelectData( src );
1062
- var firstTr = data.length===0 ? null : data[0].nTr;
1074
+ var
1075
+ that = this,
1076
+ data = this._fnSelectData( src ),
1077
+ firstTr = data.length===0 ? null : data[0].nTr,
1078
+ anSelected = [],
1079
+ i, len;
1080
+
1081
+ // Get all the rows that will be selected
1082
+ for ( i=0, len=data.length ; i<len ; i++ )
1083
+ {
1084
+ if ( data[i].nTr )
1085
+ {
1086
+ anSelected.push( data[i].nTr );
1087
+ }
1088
+ }
1089
+
1090
+ // User defined pre-selection function
1091
+ if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anSelected, true) )
1092
+ {
1093
+ return;
1094
+ }
1063
1095
 
1064
- for ( var i=0, iLen=data.length ; i<iLen ; i++ )
1096
+ // Mark them as selected
1097
+ for ( i=0, len=data.length ; i<len ; i++ )
1065
1098
  {
1066
1099
  data[i]._DTTT_selected = true;
1067
1100
 
1068
1101
  if ( data[i].nTr )
1069
1102
  {
1070
- $(data[i].nTr).addClass( this.classes.select.row );
1103
+ $(data[i].nTr).addClass( that.classes.select.row );
1071
1104
  }
1072
1105
  }
1073
1106
 
1107
+ // Post-selection function
1074
1108
  if ( this.s.select.postSelected !== null )
1075
1109
  {
1076
- this.s.select.postSelected.call( this, firstTr );
1110
+ this.s.select.postSelected.call( this, anSelected );
1077
1111
  }
1078
1112
 
1079
- TableTools._fnEventDispatch( this, 'select', firstTr );
1113
+ TableTools._fnEventDispatch( this, 'select', anSelected, true );
1080
1114
  },
1081
1115
 
1082
1116
  /**
@@ -1084,27 +1118,48 @@ TableTools.prototype = {
1084
1118
  * @param {*} src Rows to deselect - see _fnSelectData for a description of valid inputs
1085
1119
  * @private
1086
1120
  */
1087
- "_fnRowDeselect": function ( src )
1121
+ "_fnRowDeselect": function ( src, e )
1088
1122
  {
1089
- var data = this._fnSelectData( src );
1090
- var firstTr = data.length===0 ? null : data[0].nTr;
1123
+ var
1124
+ that = this,
1125
+ data = this._fnSelectData( src ),
1126
+ firstTr = data.length===0 ? null : data[0].nTr,
1127
+ anDeselectedTrs = [],
1128
+ i, len;
1091
1129
 
1092
- for ( var i=0, iLen=data.length ; i<iLen ; i++ )
1130
+ // Get all the rows that will be deselected
1131
+ for ( i=0, len=data.length ; i<len ; i++ )
1093
1132
  {
1094
- if ( data[i].nTr && data[i]._DTTT_selected )
1133
+ if ( data[i].nTr )
1095
1134
  {
1096
- $(data[i].nTr).removeClass( this.classes.select.row );
1135
+ anDeselectedTrs.push( data[i].nTr );
1097
1136
  }
1137
+ }
1098
1138
 
1139
+ // User defined pre-selection function
1140
+ if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anDeselectedTrs, false) )
1141
+ {
1142
+ return;
1143
+ }
1144
+
1145
+ // Mark them as deselected
1146
+ for ( i=0, len=data.length ; i<len ; i++ )
1147
+ {
1099
1148
  data[i]._DTTT_selected = false;
1149
+
1150
+ if ( data[i].nTr )
1151
+ {
1152
+ $(data[i].nTr).removeClass( that.classes.select.row );
1153
+ }
1100
1154
  }
1101
1155
 
1156
+ // Post-deselection function
1102
1157
  if ( this.s.select.postDeselected !== null )
1103
1158
  {
1104
- this.s.select.postDeselected.call( this, firstTr );
1159
+ this.s.select.postDeselected.call( this, anDeselectedTrs );
1105
1160
  }
1106
1161
 
1107
- TableTools._fnEventDispatch( this, 'select', firstTr );
1162
+ TableTools._fnEventDispatch( this, 'select', anDeselectedTrs, false );
1108
1163
  },
1109
1164
 
1110
1165
  /**
@@ -1206,7 +1261,7 @@ TableTools.prototype = {
1206
1261
 
1207
1262
  if ( oConfig.fnClick !== null )
1208
1263
  {
1209
- oConfig.fnClick.call( that, nButton, oConfig, null );
1264
+ oConfig.fnClick.call( that, nButton, oConfig, null, e );
1210
1265
  }
1211
1266
 
1212
1267
  /* Provide a complete function to match the behaviour of the flash elements */
@@ -1633,36 +1688,24 @@ TableTools.prototype = {
1633
1688
  */
1634
1689
  "_fnHtmlDecode": function ( sData )
1635
1690
  {
1636
- if ( sData.indexOf('&') == -1 )
1691
+ if ( sData.indexOf('&') === -1 )
1637
1692
  {
1638
1693
  return sData;
1639
1694
  }
1640
1695
 
1641
- var
1642
- aData = this._fnChunkData( sData, 2048 ),
1643
- n = document.createElement('div'),
1644
- i, iLen, iIndex,
1645
- sReturn = "", sInner;
1646
-
1647
- /* nodeValue has a limit in browsers - so we chunk the data into smaller segments to build
1648
- * up the string. Note that the 'trick' here is to remember than we might have split over
1649
- * an HTML entity, so we backtrack a little to make sure this doesn't happen
1650
- */
1651
- for ( i=0, iLen=aData.length ; i<iLen ; i++ )
1652
- {
1653
- /* Magic number 8 is because no entity is longer then strlen 8 in ISO 8859-1 */
1654
- iIndex = aData[i].lastIndexOf( '&' );
1655
- if ( iIndex != -1 && aData[i].length >= 8 && iIndex > aData[i].length - 8 )
1696
+ var n = document.createElement('div');
1697
+
1698
+ return sData.replace( /&([^\s]*);/g, function( match, match2 ) {
1699
+ if ( match.substr(1, 1) === '#' )
1656
1700
  {
1657
- sInner = aData[i].substr( iIndex );
1658
- aData[i] = aData[i].substr( 0, iIndex );
1701
+ return String.fromCharCode( Number(match2.substr(1)) );
1659
1702
  }
1660
-
1661
- n.innerHTML = aData[i];
1662
- sReturn += n.childNodes[0].nodeValue;
1663
- }
1664
-
1665
- return sReturn;
1703
+ else
1704
+ {
1705
+ n.innerHTML = match;
1706
+ return n.childNodes[0].nodeValue;
1707
+ }
1708
+ } );
1666
1709
  },
1667
1710
 
1668
1711
 
@@ -1703,6 +1746,12 @@ TableTools.prototype = {
1703
1746
  if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
1704
1747
  {
1705
1748
  this._fnPrintScrollStart( oSetDT );
1749
+
1750
+ // If the table redraws while in print view, the DataTables scrolling
1751
+ // setup would hide the header, so we need to readd it on draw
1752
+ $(this.s.dt.nTable).bind('draw.DTTT_Print', function () {
1753
+ that._fnPrintScrollStart( oSetDT );
1754
+ } );
1706
1755
  }
1707
1756
 
1708
1757
  /* Remove the other DataTables feature nodes - but leave the table! and info div */
@@ -1778,6 +1827,8 @@ TableTools.prototype = {
1778
1827
  /* Restore DataTables' scrolling */
1779
1828
  if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
1780
1829
  {
1830
+ $(this.s.dt.nTable).unbind('draw.DTTT_Print');
1831
+
1781
1832
  this._fnPrintScrollEnd();
1782
1833
  }
1783
1834
 
@@ -2044,18 +2095,19 @@ TableTools._fnEventListen = function ( that, type, fn )
2044
2095
  * @param {Object} that Scope of the listening function (i.e. 'this' in the caller)
2045
2096
  * @param {String} type Event type
2046
2097
  * @param {Node} node Element that the event occurred on (may be null)
2098
+ * @param {boolean} [selected] Indicate if the node was selected (true) or deselected (false)
2047
2099
  * @returns void
2048
2100
  * @private
2049
2101
  * @static
2050
2102
  */
2051
- TableTools._fnEventDispatch = function ( that, type, node )
2103
+ TableTools._fnEventDispatch = function ( that, type, node, selected )
2052
2104
  {
2053
2105
  var listeners = TableTools._aListeners;
2054
2106
  for ( var i=0, iLen=listeners.length ; i<iLen ; i++ )
2055
2107
  {
2056
2108
  if ( that.dom.table == listeners[i].that.dom.table && listeners[i].type == type )
2057
2109
  {
2058
- listeners[i].fn( node );
2110
+ listeners[i].fn( node, selected );
2059
2111
  }
2060
2112
  }
2061
2113
  };
@@ -2347,7 +2399,7 @@ TableTools.classes_themeroller = {
2347
2399
  * @namespace TableTools default settings for initialisation
2348
2400
  */
2349
2401
  TableTools.DEFAULTS = {
2350
- "sSwfPath": "/assets/dataTables/extras/swf/copy_csv_xls_pdf.swf",
2402
+ "sSwfPath": "media/swf/copy_csv_xls_pdf.swf",
2351
2403
  "sRowSelect": "none",
2352
2404
  "sSelectedClass": null,
2353
2405
  "fnPreRowSelect": null,
@@ -2383,7 +2435,7 @@ TableTools.prototype.CLASS = "TableTools";
2383
2435
  * @type String
2384
2436
  * @default See code
2385
2437
  */
2386
- TableTools.VERSION = "2.1.3";
2438
+ TableTools.VERSION = "2.1.5";
2387
2439
  TableTools.prototype.VERSION = TableTools.VERSION;
2388
2440
 
2389
2441