jquery-datatables-rails 1.12.2 → 2.1.10.0.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/dataTables/extras/filler.png +0 -0
  3. data/app/assets/images/dataTables/extras/loading-background.png +0 -0
  4. data/app/assets/images/dataTables/sort_asc_disabled.png +0 -0
  5. data/app/assets/javascripts/dataTables/extras/dataTables.autoFill.js +851 -0
  6. data/app/assets/javascripts/dataTables/extras/{ColReorder.js → dataTables.colReorder.js} +558 -223
  7. data/app/assets/javascripts/dataTables/extras/dataTables.colVis.js +1096 -0
  8. data/app/assets/javascripts/dataTables/extras/{FixedColumns.js → dataTables.fixedColumns.js} +163 -113
  9. data/app/assets/javascripts/dataTables/extras/{FixedHeader.js → dataTables.fixedHeader.js} +306 -219
  10. data/app/assets/javascripts/dataTables/extras/{KeyTable.js → dataTables.keyTable.js} +155 -95
  11. data/app/assets/javascripts/dataTables/extras/{Scroller.js → dataTables.scroller.js} +469 -188
  12. data/app/assets/javascripts/dataTables/extras/{TableTools.js → dataTables.tableTools.js} +949 -341
  13. data/app/assets/javascripts/dataTables/jquery.dataTables.foundation.js +4 -4
  14. data/app/assets/javascripts/dataTables/jquery.dataTables.js +10711 -8427
  15. data/app/assets/media/dataTables/extras/swf/copy_csv_xls.swf +0 -0
  16. data/app/assets/media/dataTables/extras/swf/copy_csv_xls_pdf.swf +0 -0
  17. data/app/assets/stylesheets/dataTables/extras/dataTables.autoFill.css.scss +24 -0
  18. data/app/assets/stylesheets/dataTables/extras/dataTables.colReorder.css.scss +14 -0
  19. data/app/assets/stylesheets/dataTables/extras/dataTables.colVis.css.scss +184 -0
  20. data/app/assets/stylesheets/dataTables/extras/dataTables.colvis.jqueryui.css.scss +23 -0
  21. data/app/assets/stylesheets/dataTables/extras/dataTables.fixedColumns.css.scss +24 -0
  22. data/app/assets/stylesheets/dataTables/extras/dataTables.fixedHeader.css.scss +7 -0
  23. data/app/assets/stylesheets/dataTables/extras/dataTables.keyTable.css.scss +7 -0
  24. data/app/assets/stylesheets/dataTables/extras/dataTables.scroller.css.scss +44 -0
  25. data/app/assets/stylesheets/dataTables/extras/{TableTools.css.erb → dataTables.tableTools.css.scss} +30 -15
  26. data/app/assets/stylesheets/dataTables/jquery.dataTables.bootstrap.css.scss +6 -0
  27. data/app/assets/stylesheets/dataTables/jquery.dataTables.css.scss +363 -184
  28. data/app/assets/stylesheets/dataTables/src/jquery.dataTables_themeroller.css +307 -220
  29. data/lib/jquery/datatables/rails/version.rb +1 -1
  30. metadata +42 -22
  31. data/app/assets/javascripts/dataTables/extras/AutoFill.js +0 -820
  32. data/app/assets/javascripts/dataTables/extras/ColVis.js +0 -1005
  33. data/app/assets/javascripts/dataTables/extras/TableTools.min.js +0 -77
  34. data/app/assets/stylesheets/dataTables/extras/ColReorder.css.erb +0 -21
  35. data/app/assets/stylesheets/dataTables/extras/ColVis.css +0 -76
  36. data/app/assets/stylesheets/dataTables/extras/ColVisAlt.css.erb +0 -104
@@ -1,27 +1,27 @@
1
- /*
2
- * File: ColReorder.js
3
- * Version: 1.0.8
4
- * CVS: $Id$
5
- * Description: Allow columns to be reordered in a DataTable
6
- * Author: Allan Jardine (www.sprymedia.co.uk)
7
- * Created: Wed Sep 15 18:23:29 BST 2010
8
- * Modified: $Date$ by $Author$
9
- * Language: Javascript
10
- * License: GPL v2 or BSD 3 point style
11
- * Project: DataTables
12
- * Contact: www.sprymedia.co.uk/contact
1
+ /*! ColReorder 1.1.1
2
+ * ©2010-2014 SpryMedia Ltd - datatables.net/license
3
+ */
4
+
5
+ /**
6
+ * @summary ColReorder
7
+ * @description Provide the ability to reorder columns in a DataTable
8
+ * @version 1.1.1
9
+ * @file dataTables.colReorder.js
10
+ * @author SpryMedia Ltd (www.sprymedia.co.uk)
11
+ * @contact www.sprymedia.co.uk/contact
12
+ * @copyright Copyright 2010-2014 SpryMedia Ltd.
13
13
  *
14
- * Copyright 2010-2011 Allan Jardine, all rights reserved.
14
+ * This source file is free software, available under the following license:
15
+ * MIT license - http://datatables.net/license/mit
15
16
  *
16
- * This source file is free software, under either the GPL v2 license or a
17
- * BSD style license, available at:
18
- * http://datatables.net/license_gpl2
19
- * http://datatables.net/license_bsd
17
+ * This source file is distributed in the hope that it will be useful, but
18
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
20
  *
21
+ * For details please refer to: http://www.datatables.net
21
22
  */
22
23
 
23
-
24
- (function($, window, document) {
24
+ (function(window, document, undefined) {
25
25
 
26
26
 
27
27
  /**
@@ -109,6 +109,7 @@ function fnDomSwitch( nParent, iFrom, iTo )
109
109
  */
110
110
  $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
111
111
  {
112
+ var v110 = $.fn.dataTable.Api ? true : false;
112
113
  var i, iLen, j, jLen, iCols=oSettings.aoColumns.length, nTrs, oCol;
113
114
 
114
115
  /* Sanity check in the input */
@@ -168,6 +169,18 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
168
169
  {
169
170
  oCol.aDataSort[j] = aiInvertMapping[ oCol.aDataSort[j] ];
170
171
  }
172
+
173
+ // Update the column indexes
174
+ if ( v110 ) {
175
+ oCol.idx = aiInvertMapping[ oCol.idx ];
176
+ }
177
+ }
178
+
179
+ if ( v110 ) {
180
+ // Update 1.10 optimised sort class removal variable
181
+ $.each( oSettings.aLastSort, function (i, val) {
182
+ oSettings.aLastSort[i].src = aiInvertMapping[ val.src ];
183
+ } );
171
184
  }
172
185
 
173
186
  /* Update the Get and Set functions for each column */
@@ -176,8 +189,9 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
176
189
  oCol = oSettings.aoColumns[i];
177
190
  if ( typeof oCol.mData == 'number' ) {
178
191
  oCol.mData = aiInvertMapping[ oCol.mData ];
179
- oCol.fnGetData = oSettings.oApi._fnGetObjectDataFn( oCol.mData );
180
- oCol.fnSetData = oSettings.oApi._fnSetObjectDataFn( oCol.mData );
192
+
193
+ // regenerate the get / set functions
194
+ oSettings.oApi._fnColumnOptions( oSettings, i, {} );
181
195
  }
182
196
  }
183
197
 
@@ -228,7 +242,6 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
228
242
  }
229
243
  }
230
244
 
231
-
232
245
  /*
233
246
  * Move the internal array elements
234
247
  */
@@ -241,10 +254,28 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
241
254
  /* Array array - internal data anodes cache */
242
255
  for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
243
256
  {
244
- if ( $.isArray( oSettings.aoData[i]._aData ) ) {
245
- fnArraySwitch( oSettings.aoData[i]._aData, iFrom, iTo );
257
+ var data = oSettings.aoData[i];
258
+
259
+ if ( v110 ) {
260
+ // DataTables 1.10+
261
+ if ( data.anCells ) {
262
+ fnArraySwitch( data.anCells, iFrom, iTo );
263
+ }
264
+
265
+ // For DOM sourced data, the invalidate will reread the cell into
266
+ // the data array, but for data sources as an array, they need to
267
+ // be flipped
268
+ if ( data.src !== 'dom' && $.isArray( data._aData ) ) {
269
+ fnArraySwitch( data._aData, iFrom, iTo );
270
+ }
271
+ }
272
+ else {
273
+ // DataTables 1.9-
274
+ if ( $.isArray( data._aData ) ) {
275
+ fnArraySwitch( data._aData, iFrom, iTo );
276
+ }
277
+ fnArraySwitch( data._anHidden, iFrom, iTo );
246
278
  }
247
- fnArraySwitch( oSettings.aoData[i]._anHidden, iFrom, iTo );
248
279
  }
249
280
 
250
281
  /* Reposition the header elements in the header layout array */
@@ -261,6 +292,11 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
261
292
  }
262
293
  }
263
294
 
295
+ // In 1.10 we need to invalidate row cached data for sorting, filtering etc
296
+ if ( v110 ) {
297
+ var api = new $.fn.dataTable.Api( oSettings );
298
+ api.rows().invalidate();
299
+ }
264
300
 
265
301
  /*
266
302
  * Update DataTables' event handlers
@@ -269,7 +305,7 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
269
305
  /* Sort listener */
270
306
  for ( i=0, iLen=iCols ; i<iLen ; i++ )
271
307
  {
272
- $(oSettings.aoColumns[i].nTh).unbind('click');
308
+ $(oSettings.aoColumns[i].nTh).off('click.DT');
273
309
  this.oApi._fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
274
310
  }
275
311
 
@@ -280,34 +316,58 @@ $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo )
280
316
  "iTo": iTo,
281
317
  "aiInvertMapping": aiInvertMapping
282
318
  } ] );
283
-
284
- if ( typeof oSettings.oInstance._oPluginFixedHeader != 'undefined' )
285
- {
286
- oSettings.oInstance._oPluginFixedHeader.fnUpdate();
287
- }
288
319
  };
289
320
 
290
321
 
291
322
 
323
+ var factory = function( $, DataTable ) {
324
+ "use strict";
292
325
 
293
326
  /**
294
- * ColReorder provides column visiblity control for DataTables
327
+ * ColReorder provides column visibility control for DataTables
295
328
  * @class ColReorder
296
329
  * @constructor
297
- * @param {object} DataTables settings object
298
- * @param {object} ColReorder options
330
+ * @param {object} dt DataTables settings object
331
+ * @param {object} opts ColReorder options
299
332
  */
300
- ColReorder = function( oDTSettings, oOpts )
333
+ var ColReorder = function( dt, opts )
301
334
  {
302
- /* Santiy check that we are a new instance */
303
- if ( !this.CLASS || this.CLASS != "ColReorder" )
304
- {
305
- alert( "Warning: ColReorder must be initialised with the keyword 'new'" );
335
+ var oDTSettings;
336
+
337
+ if ( $.fn.dataTable.Api ) {
338
+ oDTSettings = new $.fn.dataTable.Api( dt ).settings()[0];
339
+ }
340
+ // 1.9 compatibility
341
+ else if ( dt.fnSettings ) {
342
+ // DataTables object, convert to the settings object
343
+ oDTSettings = dt.fnSettings();
344
+ }
345
+ else if ( typeof dt === 'string' ) {
346
+ // jQuery selector
347
+ if ( $.fn.dataTable.fnIsDataTable( $(dt)[0] ) ) {
348
+ oDTSettings = $(dt).eq(0).dataTable().fnSettings();
349
+ }
350
+ }
351
+ else if ( dt.nodeName && dt.nodeName.toLowerCase() === 'table' ) {
352
+ // Table node
353
+ if ( $.fn.dataTable.fnIsDataTable( dt.nodeName ) ) {
354
+ oDTSettings = $(dt.nodeName).dataTable().fnSettings();
355
+ }
356
+ }
357
+ else if ( dt instanceof jQuery ) {
358
+ // jQuery object
359
+ if ( $.fn.dataTable.fnIsDataTable( dt[0] ) ) {
360
+ oDTSettings = dt.eq(0).dataTable().fnSettings();
361
+ }
362
+ }
363
+ else {
364
+ // DataTables settings object
365
+ oDTSettings = dt;
306
366
  }
307
367
 
308
- if ( typeof oOpts == 'undefined' )
309
- {
310
- oOpts = {};
368
+ // Convert from camelCase to Hungarian, just as DataTables does
369
+ if ( $.fn.dataTable.camelToHungarian ) {
370
+ $.fn.dataTable.camelToHungarian( ColReorder.defaults, opts || {} );
311
371
  }
312
372
 
313
373
 
@@ -333,7 +393,7 @@ ColReorder = function( oDTSettings, oOpts )
333
393
  * @type object
334
394
  * @default {}
335
395
  */
336
- "init": oOpts,
396
+ "init": $.extend( true, {}, ColReorder.defaults, opts ),
337
397
 
338
398
  /**
339
399
  * Number of columns to fix (not allow to be reordered)
@@ -343,6 +403,14 @@ ColReorder = function( oDTSettings, oOpts )
343
403
  */
344
404
  "fixed": 0,
345
405
 
406
+ /**
407
+ * Number of columns to fix counting from right (not allow to be reordered)
408
+ * @property fixedRight
409
+ * @type int
410
+ * @default 0
411
+ */
412
+ "fixedRight": 0,
413
+
346
414
  /**
347
415
  * Callback function for once the reorder has been done
348
416
  * @property dropcallback
@@ -401,13 +469,12 @@ ColReorder = function( oDTSettings, oOpts )
401
469
 
402
470
  /* Constructor logic */
403
471
  this.s.dt = oDTSettings.oInstance.fnSettings();
472
+ this.s.dt._colReorder = this;
404
473
  this._fnConstruct();
405
474
 
406
475
  /* Add destroy callback */
407
- oDTSettings.oApi._fnCallbackReg(oDTSettings, 'aoDestroyCallback', jQuery.proxy(this._fnDestroy, this), 'ColReorder');
476
+ oDTSettings.oApi._fnCallbackReg(oDTSettings, 'aoDestroyCallback', $.proxy(this._fnDestroy, this), 'ColReorder');
408
477
 
409
- /* Store the instance for later use */
410
- ColReorder.aoInstances.push( this );
411
478
  return this;
412
479
  };
413
480
 
@@ -418,6 +485,23 @@ ColReorder.prototype = {
418
485
  * Public methods
419
486
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
420
487
 
488
+ /**
489
+ * Reset the column ordering to the original ordering that was detected on
490
+ * start up.
491
+ * @return {this} Returns `this` for chaining.
492
+ *
493
+ * @example
494
+ * // DataTables initialisation with ColReorder
495
+ * var table = $('#example').dataTable( {
496
+ * "sDom": 'Rlfrtip'
497
+ * } );
498
+ *
499
+ * // Add click event to a button to reset the ordering
500
+ * $('#resetOrdering').click( function (e) {
501
+ * e.preventDefault();
502
+ * $.fn.dataTable.ColReorder( table ).fnReset();
503
+ * } );
504
+ */
421
505
  "fnReset": function ()
422
506
  {
423
507
  var a = [];
@@ -427,6 +511,72 @@ ColReorder.prototype = {
427
511
  }
428
512
 
429
513
  this._fnOrderColumns( a );
514
+
515
+ return this;
516
+ },
517
+
518
+ /**
519
+ * `Deprecated` - Get the current order of the columns, as an array.
520
+ * @return {array} Array of column identifiers
521
+ * @deprecated `fnOrder` should be used in preference to this method.
522
+ * `fnOrder` acts as a getter/setter.
523
+ */
524
+ "fnGetCurrentOrder": function ()
525
+ {
526
+ return this.fnOrder();
527
+ },
528
+
529
+ /**
530
+ * Get the current order of the columns, as an array. Note that the values
531
+ * given in the array are unique identifiers for each column. Currently
532
+ * these are the original ordering of the columns that was detected on
533
+ * start up, but this could potentially change in future.
534
+ * @return {array} Array of column identifiers
535
+ *
536
+ * @example
537
+ * // Get column ordering for the table
538
+ * var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder();
539
+ *//**
540
+ * Set the order of the columns, from the positions identified in the
541
+ * ordering array given. Note that ColReorder takes a brute force approach
542
+ * to reordering, so it is possible multiple reordering events will occur
543
+ * before the final order is settled upon.
544
+ * @param {array} [set] Array of column identifiers in the new order. Note
545
+ * that every column must be included, uniquely, in this array.
546
+ * @return {this} Returns `this` for chaining.
547
+ *
548
+ * @example
549
+ * // Swap the first and second columns
550
+ * $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] );
551
+ *
552
+ * @example
553
+ * // Move the first column to the end for the table `#example`
554
+ * var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder();
555
+ * var first = curr.shift();
556
+ * curr.push( first );
557
+ * $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr );
558
+ *
559
+ * @example
560
+ * // Reverse the table's order
561
+ * $.fn.dataTable.ColReorder( '#example' ).fnOrder(
562
+ * $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse()
563
+ * );
564
+ */
565
+ "fnOrder": function ( set )
566
+ {
567
+ if ( set === undefined )
568
+ {
569
+ var a = [];
570
+ for ( var i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ )
571
+ {
572
+ a.push( this.s.dt.aoColumns[i]._ColReorder_iOrigCol );
573
+ }
574
+ return a;
575
+ }
576
+
577
+ this._fnOrderColumns( fnInvertKeyValues( set ) );
578
+
579
+ return this;
430
580
  },
431
581
 
432
582
 
@@ -443,24 +593,30 @@ ColReorder.prototype = {
443
593
  "_fnConstruct": function ()
444
594
  {
445
595
  var that = this;
446
- var i, iLen;
596
+ var iLen = this.s.dt.aoColumns.length;
597
+ var i;
447
598
 
448
599
  /* Columns discounted from reordering - counting left to right */
449
- if ( typeof this.s.init.iFixedColumns != 'undefined' )
600
+ if ( this.s.init.iFixedColumns )
450
601
  {
451
602
  this.s.fixed = this.s.init.iFixedColumns;
452
603
  }
453
604
 
605
+ /* Columns discounted from reordering - counting right to left */
606
+ this.s.fixedRight = this.s.init.iFixedColumnsRight ?
607
+ this.s.init.iFixedColumnsRight :
608
+ 0;
609
+
454
610
  /* Drop callback initialisation option */
455
- if ( typeof this.s.init.fnReorderCallback != 'undefined' )
611
+ if ( this.s.init.fnReorderCallback )
456
612
  {
457
613
  this.s.dropCallback = this.s.init.fnReorderCallback;
458
614
  }
459
615
 
460
616
  /* Add event handlers for the drag and drop, and also mark the original column order */
461
- for ( i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ )
617
+ for ( i = 0; i < iLen; i++ )
462
618
  {
463
- if ( i > this.s.fixed-1 )
619
+ if ( i > this.s.fixed-1 && i < iLen - this.s.fixedRight )
464
620
  {
465
621
  this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh );
466
622
  }
@@ -476,7 +632,7 @@ ColReorder.prototype = {
476
632
 
477
633
  /* An initial column order has been specified */
478
634
  var aiOrder = null;
479
- if ( typeof this.s.init.aiOrder != 'undefined' )
635
+ if ( this.s.init.aiOrder )
480
636
  {
481
637
  aiOrder = this.s.init.aiOrder.slice();
482
638
  }
@@ -515,6 +671,9 @@ ColReorder.prototype = {
515
671
  that._fnOrderColumns.call( that, resort );
516
672
  }
517
673
  }
674
+ else {
675
+ this._fnSetColumnIndexes();
676
+ }
518
677
  },
519
678
 
520
679
 
@@ -530,7 +689,7 @@ ColReorder.prototype = {
530
689
  if ( a.length != this.s.dt.aoColumns.length )
531
690
  {
532
691
  this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+
533
- "match known number of columns. Skipping." );
692
+ "match known number of columns. Skipping." );
534
693
  return;
535
694
  }
536
695
 
@@ -555,6 +714,8 @@ ColReorder.prototype = {
555
714
 
556
715
  /* Save the state */
557
716
  this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
717
+
718
+ this._fnSetColumnIndexes();
558
719
  },
559
720
 
560
721
 
@@ -578,7 +739,7 @@ ColReorder.prototype = {
578
739
  oState.aaSorting[i][0] = oSettings.aoColumns[ oState.aaSorting[i][0] ]._ColReorder_iOrigCol;
579
740
  }
580
741
 
581
- aSearchCopy = $.extend( true, [], oState.aoSearchCols );
742
+ var aSearchCopy = $.extend( true, [], oState.aoSearchCols );
582
743
  oState.ColReorder = [];
583
744
 
584
745
  for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
@@ -612,7 +773,7 @@ ColReorder.prototype = {
612
773
  "_fnMouseListener": function ( i, nTh )
613
774
  {
614
775
  var that = this;
615
- $(nTh).bind( 'mousedown.ColReorder', function (e) {
776
+ $(nTh).on( 'mousedown.ColReorder', function (e) {
616
777
  e.preventDefault();
617
778
  that._fnMouseDown.call( that, e, nTh );
618
779
  } );
@@ -629,65 +790,35 @@ ColReorder.prototype = {
629
790
  */
630
791
  "_fnMouseDown": function ( e, nTh )
631
792
  {
632
- var
633
- that = this,
634
- aoColumns = this.s.dt.aoColumns;
793
+ var that = this;
635
794
 
636
795
  /* Store information about the mouse position */
637
- var nThTarget = e.target.nodeName == "TH" ? e.target : $(e.target).parents('TH')[0];
638
- var offset = $(nThTarget).offset();
796
+ var target = $(e.target).closest('th, td');
797
+ var offset = target.offset();
798
+ var idx = parseInt( $(nTh).attr('data-column-index'), 10 );
799
+
800
+ if ( idx === undefined ) {
801
+ return;
802
+ }
803
+
639
804
  this.s.mouse.startX = e.pageX;
640
805
  this.s.mouse.startY = e.pageY;
641
806
  this.s.mouse.offsetX = e.pageX - offset.left;
642
807
  this.s.mouse.offsetY = e.pageY - offset.top;
643
- this.s.mouse.target = nTh;
644
- this.s.mouse.targetIndex = $('th', nTh.parentNode).index( nTh );
645
- this.s.mouse.fromIndex = this.s.dt.oInstance.oApi._fnVisibleToColumnIndex( this.s.dt,
646
- this.s.mouse.targetIndex );
647
-
648
- /* Calculate a cached array with the points of the column inserts, and the 'to' points */
649
- this.s.aoTargets.splice( 0, this.s.aoTargets.length );
650
-
651
- this.s.aoTargets.push( {
652
- "x": $(this.s.dt.nTable).offset().left,
653
- "to": 0
654
- } );
655
-
656
- var iToPoint = 0;
657
- for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ )
658
- {
659
- /* For the column / header in question, we want it's position to remain the same if the
660
- * position is just to it's immediate left or right, so we only incremement the counter for
661
- * other columns
662
- */
663
- if ( i != this.s.mouse.fromIndex )
664
- {
665
- iToPoint++;
666
- }
667
-
668
- if ( aoColumns[i].bVisible )
669
- {
670
- this.s.aoTargets.push( {
671
- "x": $(aoColumns[i].nTh).offset().left + $(aoColumns[i].nTh).outerWidth(),
672
- "to": iToPoint
673
- } );
674
- }
675
- }
808
+ this.s.mouse.target = this.s.dt.aoColumns[ idx ].nTh;//target[0];
809
+ this.s.mouse.targetIndex = idx;
810
+ this.s.mouse.fromIndex = idx;
676
811
 
677
- /* Disallow columns for being reordered by drag and drop, counting left to right */
678
- if ( this.s.fixed !== 0 )
679
- {
680
- this.s.aoTargets.splice( 0, this.s.fixed );
681
- }
812
+ this._fnRegions();
682
813
 
683
814
  /* Add event handlers to the document */
684
- $(document).bind( 'mousemove.ColReorder', function (e) {
685
- that._fnMouseMove.call( that, e );
686
- } );
687
-
688
- $(document).bind( 'mouseup.ColReorder', function (e) {
689
- that._fnMouseUp.call( that, e );
690
- } );
815
+ $(document)
816
+ .on( 'mousemove.ColReorder', function (e) {
817
+ that._fnMouseMove.call( that, e );
818
+ } )
819
+ .on( 'mouseup.ColReorder', function (e) {
820
+ that._fnMouseUp.call( that, e );
821
+ } );
691
822
  },
692
823
 
693
824
 
@@ -718,30 +849,40 @@ ColReorder.prototype = {
718
849
  }
719
850
 
720
851
  /* Position the element - we respect where in the element the click occured */
721
- this.dom.drag.style.left = (e.pageX - this.s.mouse.offsetX) + "px";
722
- this.dom.drag.style.top = (e.pageY - this.s.mouse.offsetY) + "px";
852
+ this.dom.drag.css( {
853
+ left: e.pageX - this.s.mouse.offsetX,
854
+ top: e.pageY - this.s.mouse.offsetY
855
+ } );
723
856
 
724
857
  /* Based on the current mouse position, calculate where the insert should go */
725
858
  var bSet = false;
859
+ var lastToIndex = this.s.mouse.toIndex;
860
+
726
861
  for ( var i=1, iLen=this.s.aoTargets.length ; i<iLen ; i++ )
727
862
  {
728
863
  if ( e.pageX < this.s.aoTargets[i-1].x + ((this.s.aoTargets[i].x-this.s.aoTargets[i-1].x)/2) )
729
864
  {
730
- this.dom.pointer.style.left = this.s.aoTargets[i-1].x +"px";
865
+ this.dom.pointer.css( 'left', this.s.aoTargets[i-1].x );
731
866
  this.s.mouse.toIndex = this.s.aoTargets[i-1].to;
732
867
  bSet = true;
733
868
  break;
734
869
  }
735
870
  }
736
871
 
737
- /* The insert element wasn't positioned in the array (less than operator), so we put it at
738
- * the end
739
- */
872
+ // The insert element wasn't positioned in the array (less than
873
+ // operator), so we put it at the end
740
874
  if ( !bSet )
741
875
  {
742
- this.dom.pointer.style.left = this.s.aoTargets[this.s.aoTargets.length-1].x +"px";
876
+ this.dom.pointer.css( 'left', this.s.aoTargets[this.s.aoTargets.length-1].x );
743
877
  this.s.mouse.toIndex = this.s.aoTargets[this.s.aoTargets.length-1].to;
744
878
  }
879
+
880
+ // Perform reordering if realtime updating is on and the column has moved
881
+ if ( this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex ) {
882
+ this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex );
883
+ this.s.mouse.fromIndex = this.s.mouse.toIndex;
884
+ this._fnRegions();
885
+ }
745
886
  },
746
887
 
747
888
 
@@ -756,19 +897,19 @@ ColReorder.prototype = {
756
897
  {
757
898
  var that = this;
758
899
 
759
- $(document).unbind( 'mousemove.ColReorder' );
760
- $(document).unbind( 'mouseup.ColReorder' );
900
+ $(document).off( 'mousemove.ColReorder mouseup.ColReorder' );
761
901
 
762
902
  if ( this.dom.drag !== null )
763
903
  {
764
904
  /* Remove the guide elements */
765
- document.body.removeChild( this.dom.drag );
766
- document.body.removeChild( this.dom.pointer );
905
+ this.dom.drag.remove();
906
+ this.dom.pointer.remove();
767
907
  this.dom.drag = null;
768
908
  this.dom.pointer = null;
769
909
 
770
910
  /* Actually do the reorder */
771
911
  this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex );
912
+ this._fnSetColumnIndexes();
772
913
 
773
914
  /* When scrolling we need to recalculate the column sizes to allow for the shift */
774
915
  if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
@@ -788,65 +929,108 @@ ColReorder.prototype = {
788
929
 
789
930
 
790
931
  /**
791
- * Copy the TH element that is being drags so the user has the idea that they are actually
792
- * moving it around the page.
793
- * @method _fnCreateDragNode
932
+ * Calculate a cached array with the points of the column inserts, and the
933
+ * 'to' points
934
+ * @method _fnRegions
794
935
  * @returns void
795
936
  * @private
796
937
  */
797
- "_fnCreateDragNode": function ()
938
+ "_fnRegions": function ()
798
939
  {
799
- var that = this;
800
-
801
- this.dom.drag = $(this.s.dt.nTHead.parentNode).clone(true)[0];
802
- this.dom.drag.className += " DTCR_clonedTable";
803
- while ( this.dom.drag.getElementsByTagName('caption').length > 0 )
804
- {
805
- this.dom.drag.removeChild( this.dom.drag.getElementsByTagName('caption')[0] );
806
- }
807
- while ( this.dom.drag.getElementsByTagName('tbody').length > 0 )
808
- {
809
- this.dom.drag.removeChild( this.dom.drag.getElementsByTagName('tbody')[0] );
810
- }
811
- while ( this.dom.drag.getElementsByTagName('tfoot').length > 0 )
812
- {
813
- this.dom.drag.removeChild( this.dom.drag.getElementsByTagName('tfoot')[0] );
814
- }
815
-
816
- $('thead tr:eq(0)', this.dom.drag).each( function () {
817
- $('th', this).eq(that.s.mouse.targetIndex).siblings().remove();
818
- } );
819
- $('tr', this.dom.drag).height( $('tr:eq(0)', that.s.dt.nTHead).height() );
940
+ var aoColumns = this.s.dt.aoColumns;
820
941
 
821
- $('thead tr:gt(0)', this.dom.drag).remove();
942
+ this.s.aoTargets.splice( 0, this.s.aoTargets.length );
822
943
 
823
- $('thead th:eq(0)', this.dom.drag).each( function (i) {
824
- this.style.width = $('th:eq('+that.s.mouse.targetIndex+')', that.s.dt.nTHead).width()+"px";
944
+ this.s.aoTargets.push( {
945
+ "x": $(this.s.dt.nTable).offset().left,
946
+ "to": 0
825
947
  } );
826
948
 
827
- this.dom.drag.style.position = "absolute";
828
- this.dom.drag.style.top = "0px";
829
- this.dom.drag.style.left = "0px";
830
- this.dom.drag.style.width = $('th:eq('+that.s.mouse.targetIndex+')', that.s.dt.nTHead).outerWidth()+"px";
831
-
949
+ var iToPoint = 0;
950
+ for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ )
951
+ {
952
+ /* For the column / header in question, we want it's position to remain the same if the
953
+ * position is just to it's immediate left or right, so we only incremement the counter for
954
+ * other columns
955
+ */
956
+ if ( i != this.s.mouse.fromIndex )
957
+ {
958
+ iToPoint++;
959
+ }
832
960
 
833
- this.dom.pointer = document.createElement( 'div' );
834
- this.dom.pointer.className = "DTCR_pointer";
835
- this.dom.pointer.style.position = "absolute";
961
+ if ( aoColumns[i].bVisible )
962
+ {
963
+ this.s.aoTargets.push( {
964
+ "x": $(aoColumns[i].nTh).offset().left + $(aoColumns[i].nTh).outerWidth(),
965
+ "to": iToPoint
966
+ } );
967
+ }
968
+ }
836
969
 
837
- if ( this.s.dt.oScroll.sX === "" && this.s.dt.oScroll.sY === "" )
970
+ /* Disallow columns for being reordered by drag and drop, counting right to left */
971
+ if ( this.s.fixedRight !== 0 )
838
972
  {
839
- this.dom.pointer.style.top = $(this.s.dt.nTable).offset().top+"px";
840
- this.dom.pointer.style.height = $(this.s.dt.nTable).height()+"px";
973
+ this.s.aoTargets.splice( this.s.aoTargets.length - this.s.fixedRight );
841
974
  }
842
- else
975
+
976
+ /* Disallow columns for being reordered by drag and drop, counting left to right */
977
+ if ( this.s.fixed !== 0 )
843
978
  {
844
- this.dom.pointer.style.top = $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top+"px";
845
- this.dom.pointer.style.height = $('div.dataTables_scroll', this.s.dt.nTableWrapper).height()+"px";
979
+ this.s.aoTargets.splice( 0, this.s.fixed );
846
980
  }
981
+ },
982
+
847
983
 
848
- document.body.appendChild( this.dom.pointer );
849
- document.body.appendChild( this.dom.drag );
984
+ /**
985
+ * Copy the TH element that is being drags so the user has the idea that they are actually
986
+ * moving it around the page.
987
+ * @method _fnCreateDragNode
988
+ * @returns void
989
+ * @private
990
+ */
991
+ "_fnCreateDragNode": function ()
992
+ {
993
+ var scrolling = this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "";
994
+
995
+ var origCell = this.s.dt.aoColumns[ this.s.mouse.targetIndex ].nTh;
996
+ var origTr = origCell.parentNode;
997
+ var origThead = origTr.parentNode;
998
+ var origTable = origThead.parentNode;
999
+ var cloneCell = $(origCell).clone();
1000
+
1001
+ // This is a slightly odd combination of jQuery and DOM, but it is the
1002
+ // fastest and least resource intensive way I could think of cloning
1003
+ // the table with just a single header cell in it.
1004
+ this.dom.drag = $(origTable.cloneNode(false))
1005
+ .addClass( 'DTCR_clonedTable' )
1006
+ .append(
1007
+ origThead.cloneNode(false).appendChild(
1008
+ origTr.cloneNode(false).appendChild(
1009
+ cloneCell[0]
1010
+ )
1011
+ )
1012
+ )
1013
+ .css( {
1014
+ position: 'absolute',
1015
+ top: 0,
1016
+ left: 0,
1017
+ width: $(origCell).outerWidth(),
1018
+ height: $(origCell).outerHeight()
1019
+ } )
1020
+ .appendTo( 'body' );
1021
+
1022
+ this.dom.pointer = $('<div></div>')
1023
+ .addClass( 'DTCR_pointer' )
1024
+ .css( {
1025
+ position: 'absolute',
1026
+ top: scrolling ?
1027
+ $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top :
1028
+ $(this.s.dt.nTable).offset().top,
1029
+ height : scrolling ?
1030
+ $('div.dataTables_scroll', this.s.dt.nTableWrapper).height() :
1031
+ $(this.s.dt.nTable).height()
1032
+ } )
1033
+ .appendTo( 'body' );
850
1034
  },
851
1035
 
852
1036
  /**
@@ -857,19 +1041,39 @@ ColReorder.prototype = {
857
1041
  */
858
1042
  "_fnDestroy": function ()
859
1043
  {
860
- for ( var i=0, iLen=ColReorder.aoInstances.length ; i<iLen ; i++ )
1044
+ var i, iLen;
1045
+
1046
+ for ( i=0, iLen=this.s.dt.aoDrawCallback.length ; i<iLen ; i++ )
861
1047
  {
862
- if ( ColReorder.aoInstances[i] === this )
1048
+ if ( this.s.dt.aoDrawCallback[i].sName === 'ColReorder_Pre' )
863
1049
  {
864
- ColReorder.aoInstances.splice( i, 1 );
1050
+ this.s.dt.aoDrawCallback.splice( i, 1 );
865
1051
  break;
866
1052
  }
867
1053
  }
868
1054
 
869
- $(this.s.dt.nTHead).find( '*' ).unbind( '.ColReorder' );
1055
+ $(this.s.dt.nTHead).find( '*' ).off( '.ColReorder' );
1056
+
1057
+ $.each( this.s.dt.aoColumns, function (i, column) {
1058
+ $(column.nTh).removeAttr('data-column-index');
1059
+ } );
870
1060
 
871
- this.s.dt.oInstance._oPluginColReorder = null;
1061
+ this.s.dt._colReorder = null;
872
1062
  this.s = null;
1063
+ },
1064
+
1065
+
1066
+ /**
1067
+ * Add a data attribute to the column headers, so we know the index of
1068
+ * the row to be reordered. This allows fast detection of the index, and
1069
+ * for this plug-in to work with FixedHeader which clones the nodes.
1070
+ * @private
1071
+ */
1072
+ "_fnSetColumnIndexes": function ()
1073
+ {
1074
+ $.each( this.s.dt.aoColumns, function (i, column) {
1075
+ $(column.nTh).attr('data-column-index', i);
1076
+ } );
873
1077
  }
874
1078
  };
875
1079
 
@@ -881,102 +1085,233 @@ ColReorder.prototype = {
881
1085
  * Static parameters
882
1086
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
883
1087
 
1088
+
884
1089
  /**
885
- * Array of all ColReorder instances for later reference
886
- * @property ColReorder.aoInstances
887
- * @type array
888
- * @default []
1090
+ * ColReorder default settings for initialisation
1091
+ * @namespace
889
1092
  * @static
890
1093
  */
891
- ColReorder.aoInstances = [];
892
-
893
-
1094
+ ColReorder.defaults = {
1095
+ /**
1096
+ * Predefined ordering for the columns that will be applied automatically
1097
+ * on initialisation. If not specified then the order that the columns are
1098
+ * found to be in the HTML is the order used.
1099
+ * @type array
1100
+ * @default null
1101
+ * @static
1102
+ * @example
1103
+ * // Using the `oColReorder` option in the DataTables options object
1104
+ * $('#example').dataTable( {
1105
+ * "sDom": 'Rlfrtip',
1106
+ * "oColReorder": {
1107
+ * "aiOrder": [ 4, 3, 2, 1, 0 ]
1108
+ * }
1109
+ * } );
1110
+ *
1111
+ * @example
1112
+ * // Using `new` constructor
1113
+ * $('#example').dataTable()
1114
+ *
1115
+ * new $.fn.dataTable.ColReorder( '#example', {
1116
+ * "aiOrder": [ 4, 3, 2, 1, 0 ]
1117
+ * } );
1118
+ */
1119
+ aiOrder: null,
894
1120
 
1121
+ /**
1122
+ * Redraw the table's column ordering as the end user draws the column
1123
+ * (`true`) or wait until the mouse is released (`false` - default). Note
1124
+ * that this will perform a redraw on each reordering, which involves an
1125
+ * Ajax request each time if you are using server-side processing in
1126
+ * DataTables.
1127
+ * @type boolean
1128
+ * @default false
1129
+ * @static
1130
+ * @example
1131
+ * // Using the `oColReorder` option in the DataTables options object
1132
+ * $('#example').dataTable( {
1133
+ * "sDom": 'Rlfrtip',
1134
+ * "oColReorder": {
1135
+ * "bRealtime": true
1136
+ * }
1137
+ * } );
1138
+ *
1139
+ * @example
1140
+ * // Using `new` constructor
1141
+ * $('#example').dataTable()
1142
+ *
1143
+ * new $.fn.dataTable.ColReorder( '#example', {
1144
+ * "bRealtime": true
1145
+ * } );
1146
+ */
1147
+ bRealtime: false,
895
1148
 
1149
+ /**
1150
+ * Indicate how many columns should be fixed in position (counting from the
1151
+ * left). This will typically be 1 if used, but can be as high as you like.
1152
+ * @type int
1153
+ * @default 0
1154
+ * @static
1155
+ * @example
1156
+ * // Using the `oColReorder` option in the DataTables options object
1157
+ * $('#example').dataTable( {
1158
+ * "sDom": 'Rlfrtip',
1159
+ * "oColReorder": {
1160
+ * "iFixedColumns": 1
1161
+ * }
1162
+ * } );
1163
+ *
1164
+ * @example
1165
+ * // Using `new` constructor
1166
+ * $('#example').dataTable()
1167
+ *
1168
+ * new $.fn.dataTable.ColReorder( '#example', {
1169
+ * "iFixedColumns": 1
1170
+ * } );
1171
+ */
1172
+ iFixedColumns: 0,
896
1173
 
897
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
898
- * Static functions
899
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1174
+ /**
1175
+ * As `iFixedColumnsRight` but counting from the right.
1176
+ * @type int
1177
+ * @default 0
1178
+ * @static
1179
+ * @example
1180
+ * // Using the `oColReorder` option in the DataTables options object
1181
+ * $('#example').dataTable( {
1182
+ * "sDom": 'Rlfrtip',
1183
+ * "oColReorder": {
1184
+ * "iFixedColumnsRight": 1
1185
+ * }
1186
+ * } );
1187
+ *
1188
+ * @example
1189
+ * // Using `new` constructor
1190
+ * $('#example').dataTable()
1191
+ *
1192
+ * new $.fn.dataTable.ColReorder( '#example', {
1193
+ * "iFixedColumnsRight": 1
1194
+ * } );
1195
+ */
1196
+ iFixedColumnsRight: 0,
900
1197
 
901
- /**
902
- * Reset the column ordering for a DataTables instance
903
- * @method ColReorder.fnReset
904
- * @param object oTable DataTables instance to consider
905
- * @returns void
906
- * @static
907
- */
908
- ColReorder.fnReset = function ( oTable )
909
- {
910
- for ( var i=0, iLen=ColReorder.aoInstances.length ; i<iLen ; i++ )
911
- {
912
- if ( ColReorder.aoInstances[i].s.dt.oInstance == oTable )
913
- {
914
- ColReorder.aoInstances[i].fnReset();
915
- }
916
- }
1198
+ /**
1199
+ * Callback function that is fired when columns are reordered
1200
+ * @type function():void
1201
+ * @default null
1202
+ * @static
1203
+ * @example
1204
+ * // Using the `oColReorder` option in the DataTables options object
1205
+ * $('#example').dataTable( {
1206
+ * "sDom": 'Rlfrtip',
1207
+ * "oColReorder": {
1208
+ * "fnReorderCallback": function () {
1209
+ * alert( 'Columns reordered' );
1210
+ * }
1211
+ * }
1212
+ * } );
1213
+ *
1214
+ * @example
1215
+ * // Using `new` constructor
1216
+ * $('#example').dataTable()
1217
+ *
1218
+ * new $.fn.dataTable.ColReorder( '#example', {
1219
+ * "fnReorderCallback": function () {
1220
+ * alert( 'Columns reordered' );
1221
+ * }
1222
+ * } );
1223
+ */
1224
+ fnReorderCallback: null
917
1225
  };
918
1226
 
919
1227
 
920
1228
 
921
-
922
-
923
1229
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
924
1230
  * Constants
925
1231
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
926
1232
 
927
- /**
928
- * Name of this class
929
- * @constant CLASS
930
- * @type String
931
- * @default ColReorder
932
- */
933
- ColReorder.prototype.CLASS = "ColReorder";
934
-
935
-
936
1233
  /**
937
1234
  * ColReorder version
938
- * @constant VERSION
1235
+ * @constant version
939
1236
  * @type String
940
1237
  * @default As code
941
1238
  */
942
- ColReorder.VERSION = "1.0.8";
943
- ColReorder.prototype.VERSION = ColReorder.VERSION;
944
-
945
-
1239
+ ColReorder.version = "1.1.1";
946
1240
 
947
1241
 
948
1242
 
949
1243
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
950
- * Initialisation
1244
+ * DataTables interfaces
951
1245
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
952
1246
 
953
- /*
954
- * Register a new feature with DataTables
955
- */
1247
+ // Expose
1248
+ $.fn.dataTable.ColReorder = ColReorder;
1249
+ $.fn.DataTable.ColReorder = ColReorder;
1250
+
1251
+
1252
+ // Register a new feature with DataTables
956
1253
  if ( typeof $.fn.dataTable == "function" &&
957
1254
  typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
958
1255
  $.fn.dataTableExt.fnVersionCheck('1.9.3') )
959
1256
  {
960
1257
  $.fn.dataTableExt.aoFeatures.push( {
961
- "fnInit": function( oDTSettings ) {
962
- var oTable = oDTSettings.oInstance;
963
- if ( typeof oTable._oPluginColReorder == 'undefined' ) {
964
- var opts = typeof oDTSettings.oInit.oColReorder != 'undefined' ?
965
- oDTSettings.oInit.oColReorder : {};
966
- oTable._oPluginColReorder = new ColReorder( oDTSettings, opts );
967
- } else {
968
- oTable.oApi._fnLog( oDTSettings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
1258
+ "fnInit": function( settings ) {
1259
+ var table = settings.oInstance;
1260
+
1261
+ if ( ! settings._colReorder ) {
1262
+ var dtInit = settings.oInit;
1263
+ var opts = dtInit.colReorder || dtInit.oColReorder || {};
1264
+
1265
+ new ColReorder( settings, opts );
1266
+ }
1267
+ else {
1268
+ table.oApi._fnLog( settings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
969
1269
  }
970
1270
 
971
- return null; /* No node to insert */
1271
+ return null; /* No node for DataTables to insert */
972
1272
  },
973
1273
  "cFeature": "R",
974
1274
  "sFeature": "ColReorder"
975
1275
  } );
976
1276
  }
977
- else
978
- {
1277
+ else {
979
1278
  alert( "Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download");
980
1279
  }
981
1280
 
982
- })(jQuery, window, document);
1281
+
1282
+ // API augmentation
1283
+ if ( $.fn.dataTable.Api ) {
1284
+ $.fn.dataTable.Api.register( 'colReorder.reset()', function () {
1285
+ return this.iterator( 'table', function ( ctx ) {
1286
+ ctx._colReorder.fnReset();
1287
+ } );
1288
+ } );
1289
+
1290
+ $.fn.dataTable.Api.register( 'colReorder.order()', function ( set ) {
1291
+ if ( set ) {
1292
+ return this.iterator( 'table', function ( ctx ) {
1293
+ ctx._colReorder.fnOrder( set );
1294
+ } );
1295
+ }
1296
+
1297
+ return this.context.length ?
1298
+ this.context[0]._colReorder.fnOrder() :
1299
+ null;
1300
+ } );
1301
+ }
1302
+
1303
+ return ColReorder;
1304
+ }; // /factory
1305
+
1306
+
1307
+ // Define as an AMD module if possible
1308
+ if ( typeof define === 'function' && define.amd ) {
1309
+ define( 'datatables-colreorder', ['jquery', 'datatables'], factory );
1310
+ }
1311
+ else if ( jQuery && !jQuery.fn.dataTable.ColReorder ) {
1312
+ // Otherwise simply initialise as normal, stopping multiple evaluation
1313
+ factory( jQuery, jQuery.fn.dataTable );
1314
+ }
1315
+
1316
+
1317
+ })(window, document);