fmsystem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Fmsystem-commits] [17474] API: update jquery datatables from upstream


From: sigurdne
Subject: [Fmsystem-commits] [17474] API: update jquery datatables from upstream
Date: Tue, 26 Dec 2017 17:07:24 -0500 (EST)

Revision: 17474
          http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=17474
Author:   sigurdne
Date:     2017-12-26 17:07:22 -0500 (Tue, 26 Dec 2017)
Log Message:
-----------
API: update jquery datatables from upstream

Added Paths:
-----------
    trunk/phpgwapi/js/DataTables/AutoFill/
    trunk/phpgwapi/js/DataTables/AutoFill/css/
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.min.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.min.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.css
    trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.min.css
    trunk/phpgwapi/js/DataTables/AutoFill/js/
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.min.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.min.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.min.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.min.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.min.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.js
    trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.min.js
    trunk/phpgwapi/js/DataTables/Buttons/
    trunk/phpgwapi/js/DataTables/Buttons/css/
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.min.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.min.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.css
    trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.min.css
    trunk/phpgwapi/js/DataTables/Buttons/css/common.scss
    trunk/phpgwapi/js/DataTables/Buttons/css/mixins.scss
    trunk/phpgwapi/js/DataTables/Buttons/js/
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.colVis.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.colVis.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.flash.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.flash.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.foundation.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.foundation.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.html5.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.html5.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.jqueryui.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.jqueryui.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.print.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.print.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.semanticui.js
    trunk/phpgwapi/js/DataTables/Buttons/js/buttons.semanticui.min.js
    trunk/phpgwapi/js/DataTables/Buttons/js/dataTables.buttons.js
    trunk/phpgwapi/js/DataTables/Buttons/js/dataTables.buttons.min.js
    trunk/phpgwapi/js/DataTables/Buttons/swf/
    trunk/phpgwapi/js/DataTables/Buttons/swf/flashExport.swf
    trunk/phpgwapi/js/DataTables/ColReorder/
    trunk/phpgwapi/js/DataTables/ColReorder/css/
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.bootstrap.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.bootstrap4.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.dataTables.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.dataTables.min.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.foundation.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.foundation.min.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.jqueryui.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.semanticui.css
    trunk/phpgwapi/js/DataTables/ColReorder/css/colReorder.semanticui.min.css
    trunk/phpgwapi/js/DataTables/ColReorder/js/
    trunk/phpgwapi/js/DataTables/ColReorder/js/dataTables.colReorder.js
    trunk/phpgwapi/js/DataTables/ColReorder/js/dataTables.colReorder.min.js
    trunk/phpgwapi/js/DataTables/DataTables/
    trunk/phpgwapi/js/DataTables/DataTables/css/
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.bootstrap.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.bootstrap4.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.foundation.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.foundation.min.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.jqueryui.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.semanticui.css
    trunk/phpgwapi/js/DataTables/DataTables/css/dataTables.semanticui.min.css
    trunk/phpgwapi/js/DataTables/DataTables/css/jquery.dataTables.css
    trunk/phpgwapi/js/DataTables/DataTables/css/jquery.dataTables.min.css
    trunk/phpgwapi/js/DataTables/DataTables/images/
    trunk/phpgwapi/js/DataTables/DataTables/images/sort_asc.png
    trunk/phpgwapi/js/DataTables/DataTables/images/sort_asc_disabled.png
    trunk/phpgwapi/js/DataTables/DataTables/images/sort_both.png
    trunk/phpgwapi/js/DataTables/DataTables/images/sort_desc.png
    trunk/phpgwapi/js/DataTables/DataTables/images/sort_desc_disabled.png
    trunk/phpgwapi/js/DataTables/DataTables/js/
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.bootstrap.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.bootstrap.min.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.bootstrap4.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.bootstrap4.min.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.foundation.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.foundation.min.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.jqueryui.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.jqueryui.min.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.semanticui.js
    trunk/phpgwapi/js/DataTables/DataTables/js/dataTables.semanticui.min.js
    trunk/phpgwapi/js/DataTables/DataTables/js/jquery.dataTables.js
    trunk/phpgwapi/js/DataTables/DataTables/js/jquery.dataTables.min.js
    trunk/phpgwapi/js/DataTables/FixedColumns/
    trunk/phpgwapi/js/DataTables/FixedColumns/css/
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.bootstrap.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.bootstrap4.css
    
trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.dataTables.css
    
trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.dataTables.min.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.foundation.css
    
trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.foundation.min.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.jqueryui.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.semanticui.css
    
trunk/phpgwapi/js/DataTables/FixedColumns/css/fixedColumns.semanticui.min.css
    trunk/phpgwapi/js/DataTables/FixedColumns/js/
    trunk/phpgwapi/js/DataTables/FixedColumns/js/dataTables.fixedColumns.js
    trunk/phpgwapi/js/DataTables/FixedColumns/js/dataTables.fixedColumns.min.js
    trunk/phpgwapi/js/DataTables/FixedHeader/
    trunk/phpgwapi/js/DataTables/FixedHeader/css/
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.bootstrap.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.bootstrap4.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.dataTables.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.dataTables.min.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.foundation.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.foundation.min.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.jqueryui.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.semanticui.css
    trunk/phpgwapi/js/DataTables/FixedHeader/css/fixedHeader.semanticui.min.css
    trunk/phpgwapi/js/DataTables/FixedHeader/js/
    trunk/phpgwapi/js/DataTables/FixedHeader/js/dataTables.fixedHeader.js
    trunk/phpgwapi/js/DataTables/FixedHeader/js/dataTables.fixedHeader.min.js
    trunk/phpgwapi/js/DataTables/JSZip/
    trunk/phpgwapi/js/DataTables/JSZip/jszip.js
    trunk/phpgwapi/js/DataTables/JSZip/jszip.min.js
    trunk/phpgwapi/js/DataTables/KeyTable/
    trunk/phpgwapi/js/DataTables/KeyTable/css/
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.bootstrap.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.bootstrap4.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.dataTables.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.dataTables.min.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.foundation.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.foundation.min.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.jqueryui.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.semanticui.css
    trunk/phpgwapi/js/DataTables/KeyTable/css/keyTable.semanticui.min.css
    trunk/phpgwapi/js/DataTables/KeyTable/js/
    trunk/phpgwapi/js/DataTables/KeyTable/js/dataTables.keyTable.js
    trunk/phpgwapi/js/DataTables/KeyTable/js/dataTables.keyTable.min.js
    trunk/phpgwapi/js/DataTables/Responsive/
    trunk/phpgwapi/js/DataTables/Responsive/css/
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.bootstrap.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.bootstrap4.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.dataTables.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.dataTables.min.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.foundation.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.foundation.min.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.jqueryui.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.semanticui.css
    trunk/phpgwapi/js/DataTables/Responsive/css/responsive.semanticui.min.css
    trunk/phpgwapi/js/DataTables/Responsive/js/
    trunk/phpgwapi/js/DataTables/Responsive/js/dataTables.responsive.js
    trunk/phpgwapi/js/DataTables/Responsive/js/dataTables.responsive.min.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.bootstrap.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.bootstrap.min.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.bootstrap4.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.bootstrap4.min.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.foundation.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.foundation.min.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.jqueryui.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.jqueryui.min.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.semanticui.js
    trunk/phpgwapi/js/DataTables/Responsive/js/responsive.semanticui.min.js
    trunk/phpgwapi/js/DataTables/RowGroup/
    trunk/phpgwapi/js/DataTables/RowGroup/css/
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.bootstrap.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.bootstrap4.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.dataTables.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.dataTables.min.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.foundation.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.foundation.min.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.jqueryui.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.semanticui.css
    trunk/phpgwapi/js/DataTables/RowGroup/css/rowGroup.semanticui.min.css
    trunk/phpgwapi/js/DataTables/RowGroup/js/
    trunk/phpgwapi/js/DataTables/RowGroup/js/dataTables.rowGroup.js
    trunk/phpgwapi/js/DataTables/RowGroup/js/dataTables.rowGroup.min.js
    trunk/phpgwapi/js/DataTables/RowReorder/
    trunk/phpgwapi/js/DataTables/RowReorder/css/
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.bootstrap.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.bootstrap4.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.dataTables.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.dataTables.min.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.foundation.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.foundation.min.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.jqueryui.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.semanticui.css
    trunk/phpgwapi/js/DataTables/RowReorder/css/rowReorder.semanticui.min.css
    trunk/phpgwapi/js/DataTables/RowReorder/js/
    trunk/phpgwapi/js/DataTables/RowReorder/js/dataTables.rowReorder.js
    trunk/phpgwapi/js/DataTables/RowReorder/js/dataTables.rowReorder.min.js
    trunk/phpgwapi/js/DataTables/Scroller/
    trunk/phpgwapi/js/DataTables/Scroller/css/
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.bootstrap.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.bootstrap4.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.dataTables.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.dataTables.min.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.foundation.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.foundation.min.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.jqueryui.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.semanticui.css
    trunk/phpgwapi/js/DataTables/Scroller/css/scroller.semanticui.min.css
    trunk/phpgwapi/js/DataTables/Scroller/js/
    trunk/phpgwapi/js/DataTables/Scroller/js/dataTables.scroller.js
    trunk/phpgwapi/js/DataTables/Scroller/js/dataTables.scroller.min.js
    trunk/phpgwapi/js/DataTables/Select/
    trunk/phpgwapi/js/DataTables/Select/css/
    trunk/phpgwapi/js/DataTables/Select/css/select.bootstrap.css
    trunk/phpgwapi/js/DataTables/Select/css/select.bootstrap.min.css
    trunk/phpgwapi/js/DataTables/Select/css/select.bootstrap4.css
    trunk/phpgwapi/js/DataTables/Select/css/select.bootstrap4.min.css
    trunk/phpgwapi/js/DataTables/Select/css/select.dataTables.css
    trunk/phpgwapi/js/DataTables/Select/css/select.dataTables.min.css
    trunk/phpgwapi/js/DataTables/Select/css/select.foundation.css
    trunk/phpgwapi/js/DataTables/Select/css/select.foundation.min.css
    trunk/phpgwapi/js/DataTables/Select/css/select.jqueryui.css
    trunk/phpgwapi/js/DataTables/Select/css/select.jqueryui.min.css
    trunk/phpgwapi/js/DataTables/Select/css/select.semanticui.css
    trunk/phpgwapi/js/DataTables/Select/css/select.semanticui.min.css
    trunk/phpgwapi/js/DataTables/Select/js/
    trunk/phpgwapi/js/DataTables/Select/js/dataTables.select.js
    trunk/phpgwapi/js/DataTables/Select/js/dataTables.select.min.js
    trunk/phpgwapi/js/DataTables/pdfmake/
    trunk/phpgwapi/js/DataTables/pdfmake/pdfmake.js
    trunk/phpgwapi/js/DataTables/pdfmake/pdfmake.min.js
    trunk/phpgwapi/js/DataTables/pdfmake/vfs_fonts.js

Removed Paths:
-------------
    trunk/phpgwapi/js/DataTables/Contributing.md
    trunk/phpgwapi/js/DataTables/Readme.md
    trunk/phpgwapi/js/DataTables/extensions/
    trunk/phpgwapi/js/DataTables/license.txt
    trunk/phpgwapi/js/DataTables/media/

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.css            
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.css    
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,81 @@
+div.dt-autofill-handle {
+  position: absolute;
+  height: 8px;
+  width: 8px;
+  z-index: 102;
+  box-sizing: border-box;
+  border: 1px solid #337ab7;
+  background: #337ab7;
+}
+
+div.dt-autofill-select {
+  position: absolute;
+  z-index: 1001;
+  background-color: #337ab7;
+  background-image: repeating-linear-gradient(45deg, transparent, transparent 
5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
+}
+div.dt-autofill-select.top, div.dt-autofill-select.bottom {
+  height: 3px;
+  margin-top: -1px;
+}
+div.dt-autofill-select.left, div.dt-autofill-select.right {
+  width: 3px;
+  margin-left: -1px;
+}
+
+div.dt-autofill-list {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 500px;
+  margin-left: -250px;
+  background-color: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  z-index: 11;
+  box-sizing: border-box;
+  padding: 1.5em 2em;
+}
+div.dt-autofill-list ul {
+  display: table;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  width: 100%;
+}
+div.dt-autofill-list ul li {
+  display: table-row;
+}
+div.dt-autofill-list ul li:last-child div.dt-autofill-question, 
div.dt-autofill-list ul li:last-child div.dt-autofill-button {
+  border-bottom: none;
+}
+div.dt-autofill-list ul li:hover {
+  background-color: #f6f6f6;
+}
+div.dt-autofill-list div.dt-autofill-question {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-question input[type=number] {
+  padding: 6px;
+  width: 30px;
+  margin: -2px 0;
+}
+div.dt-autofill-list div.dt-autofill-button {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+
+div.dt-autofill-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  z-index: 10;
+}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.min.css        
                        (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap.min.css        
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px
 solid 
#337ab7;background:#337ab7}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#337ab7;background-image:repeating-linear-gradient(45deg,
 transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 
10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0
 0 5px #555;border:2px solid 
#444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list 
ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list
 ul li{display:table-row}div.dt-autofill-list ul li:last-child 
div.dt-autofill-question,div.dt-autofill-list ul li:last-child 
div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul 
li:hover{background-color:#f6f6f6}div.dt-autofill-list 
div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-question 
input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list 
div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid 
#ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse
 farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);z-index:10}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.css           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.css   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,81 @@
+div.dt-autofill-handle {
+  position: absolute;
+  height: 8px;
+  width: 8px;
+  z-index: 102;
+  box-sizing: border-box;
+  border: 1px solid #0275d8;
+  background: #0275d8;
+}
+
+div.dt-autofill-select {
+  position: absolute;
+  z-index: 1001;
+  background-color: #0275d8;
+  background-image: repeating-linear-gradient(45deg, transparent, transparent 
5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
+}
+div.dt-autofill-select.top, div.dt-autofill-select.bottom {
+  height: 3px;
+  margin-top: -1px;
+}
+div.dt-autofill-select.left, div.dt-autofill-select.right {
+  width: 3px;
+  margin-left: -1px;
+}
+
+div.dt-autofill-list {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 500px;
+  margin-left: -250px;
+  background-color: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  z-index: 11;
+  box-sizing: border-box;
+  padding: 1.5em 2em;
+}
+div.dt-autofill-list ul {
+  display: table;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  width: 100%;
+}
+div.dt-autofill-list ul li {
+  display: table-row;
+}
+div.dt-autofill-list ul li:last-child div.dt-autofill-question, 
div.dt-autofill-list ul li:last-child div.dt-autofill-button {
+  border-bottom: none;
+}
+div.dt-autofill-list ul li:hover {
+  background-color: #f6f6f6;
+}
+div.dt-autofill-list div.dt-autofill-question {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-question input[type=number] {
+  padding: 6px;
+  width: 30px;
+  margin: -2px 0;
+}
+div.dt-autofill-list div.dt-autofill-button {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+
+div.dt-autofill-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  z-index: 10;
+}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.min.css       
                        (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.bootstrap4.min.css       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px
 solid 
#0275d8;background:#0275d8}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#0275d8;background-image:repeating-linear-gradient(45deg,
 transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 
10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0
 0 5px #555;border:2px solid 
#444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list 
ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list
 ul li{display:table-row}div.dt-autofill-list ul li:last-child 
div.dt-autofill-question,div.dt-autofill-list ul li:last-child 
div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul 
li:hover{background-color:#f6f6f6}div.dt-autofill-list 
div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-question 
input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list 
div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid 
#ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse
 farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);z-index:10}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.css           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.css   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,92 @@
+div.dt-autofill-handle {
+  position: absolute;
+  height: 8px;
+  width: 8px;
+  z-index: 102;
+  box-sizing: border-box;
+  border: 1px solid #316ad1;
+  background: linear-gradient(to bottom, #abcffb 0%, #4989de 100%);
+}
+
+div.dt-autofill-select {
+  position: absolute;
+  z-index: 1001;
+  background-color: #4989de;
+  background-image: repeating-linear-gradient(45deg, transparent, transparent 
5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
+}
+div.dt-autofill-select.top, div.dt-autofill-select.bottom {
+  height: 3px;
+  margin-top: -1px;
+}
+div.dt-autofill-select.left, div.dt-autofill-select.right {
+  width: 3px;
+  margin-left: -1px;
+}
+
+div.dt-autofill-list {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 500px;
+  margin-left: -250px;
+  background-color: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  z-index: 11;
+  box-sizing: border-box;
+  padding: 1.5em 2em;
+}
+div.dt-autofill-list ul {
+  display: table;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  width: 100%;
+}
+div.dt-autofill-list ul li {
+  display: table-row;
+}
+div.dt-autofill-list ul li:last-child div.dt-autofill-question, 
div.dt-autofill-list ul li:last-child div.dt-autofill-button {
+  border-bottom: none;
+}
+div.dt-autofill-list ul li:hover {
+  background-color: #f6f6f6;
+}
+div.dt-autofill-list div.dt-autofill-question {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-question input[type=number] {
+  padding: 6px;
+  width: 30px;
+  margin: -2px 0;
+}
+div.dt-autofill-list div.dt-autofill-button {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-button button {
+  color: white;
+  margin: 0;
+  padding: 6px 12px;
+  text-align: center;
+  border: 1px solid #2e6da4;
+  background-color: #337ab7;
+  border-radius: 4px;
+  cursor: pointer;
+  vertical-align: middle;
+}
+
+div.dt-autofill-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  z-index: 10;
+}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.min.css       
                        (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.dataTables.min.css       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px
 solid #316ad1;background:linear-gradient(to bottom, #abcffb 0%, #4989de 
100%)}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#4989de;background-image:repeating-linear-gradient(45deg,
 transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 
10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0
 0 5px #555;border:2px solid 
#444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list 
ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list
 ul li{display:table-row}div.dt-autofill-list ul li:last-child 
div.dt-autofill-question,div.dt-autofill-list ul li:last-child 
div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul 
li:hover{background-color:#f6f6f6}div.dt-autofill-list 
div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-question 
input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list 
div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-button 
button{color:white;margin:0;padding:6px 12px;text-align:center;border:1px solid 
#2e6da4;background-color:#337ab7;border-radius:4px;cursor:pointer;vertical-align:middle}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse
 farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);z-index:10}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.css           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.css   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,85 @@
+div.dt-autofill-handle {
+  position: absolute;
+  height: 8px;
+  width: 8px;
+  z-index: 102;
+  box-sizing: border-box;
+  border: 1px solid #008CBA;
+  background: #008CBA;
+}
+
+div.dt-autofill-select {
+  position: absolute;
+  z-index: 1001;
+  background-color: #008CBA;
+  background-image: repeating-linear-gradient(45deg, transparent, transparent 
5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
+}
+div.dt-autofill-select.top, div.dt-autofill-select.bottom {
+  height: 3px;
+  margin-top: -1px;
+}
+div.dt-autofill-select.left, div.dt-autofill-select.right {
+  width: 3px;
+  margin-left: -1px;
+}
+
+div.dt-autofill-list {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 500px;
+  margin-left: -250px;
+  background-color: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  z-index: 11;
+  box-sizing: border-box;
+  padding: 1.5em 2em;
+}
+div.dt-autofill-list ul {
+  display: table;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  width: 100%;
+}
+div.dt-autofill-list ul li {
+  display: table-row;
+}
+div.dt-autofill-list ul li:last-child div.dt-autofill-question, 
div.dt-autofill-list ul li:last-child div.dt-autofill-button {
+  border-bottom: none;
+}
+div.dt-autofill-list ul li:hover {
+  background-color: #f6f6f6;
+}
+div.dt-autofill-list div.dt-autofill-question {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-question input[type=number] {
+  padding: 6px;
+  width: 30px;
+  margin: -2px 0;
+}
+div.dt-autofill-list div.dt-autofill-button {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+
+div.dt-autofill-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  z-index: 10;
+}
+
+div.dt-autofill-list button {
+  margin: 0;
+}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.min.css       
                        (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.foundation.min.css       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px
 solid 
#008CBA;background:#008CBA}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#008CBA;background-image:repeating-linear-gradient(45deg,
 transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 
10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0
 0 5px #555;border:2px solid 
#444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list 
ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list
 ul li{display:table-row}div.dt-autofill-list ul li:last-child 
div.dt-autofill-question,div.dt-autofill-list ul li:last-child 
div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul 
li:hover{background-color:#f6f6f6}div.dt-autofill-list 
div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-question 
input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list 
div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid 
#ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse
 farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);z-index:10}div.dt-autofill-list button{margin:0}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.css             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.css     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,85 @@
+div.dt-autofill-handle {
+  position: absolute;
+  height: 8px;
+  width: 8px;
+  z-index: 102;
+  box-sizing: border-box;
+  border: 1px solid #316ad1;
+  background: linear-gradient(to bottom, #abcffb 0%, #4989de 100%);
+}
+
+div.dt-autofill-select {
+  position: absolute;
+  z-index: 1001;
+  background-color: #4989de;
+  background-image: repeating-linear-gradient(45deg, transparent, transparent 
5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
+}
+div.dt-autofill-select.top, div.dt-autofill-select.bottom {
+  height: 3px;
+  margin-top: -1px;
+}
+div.dt-autofill-select.left, div.dt-autofill-select.right {
+  width: 3px;
+  margin-left: -1px;
+}
+
+div.dt-autofill-list {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 500px;
+  margin-left: -250px;
+  background-color: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  z-index: 11;
+  box-sizing: border-box;
+  padding: 1.5em 2em;
+}
+div.dt-autofill-list ul {
+  display: table;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  width: 100%;
+}
+div.dt-autofill-list ul li {
+  display: table-row;
+}
+div.dt-autofill-list ul li:last-child div.dt-autofill-question, 
div.dt-autofill-list ul li:last-child div.dt-autofill-button {
+  border-bottom: none;
+}
+div.dt-autofill-list ul li:hover {
+  background-color: #f6f6f6;
+}
+div.dt-autofill-list div.dt-autofill-question {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-question input[type=number] {
+  padding: 6px;
+  width: 30px;
+  margin: -2px 0;
+}
+div.dt-autofill-list div.dt-autofill-button {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+
+div.dt-autofill-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  z-index: 10;
+}
+
+div.dt-autofill-list button {
+  padding: 0.35em 1em;
+}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.min.css         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.jqueryui.min.css 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px
 solid #316ad1;background:linear-gradient(to bottom, #abcffb 0%, #4989de 
100%)}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#4989de;background-image:repeating-linear-gradient(45deg,
 transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 
10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0
 0 5px #555;border:2px solid 
#444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list 
ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list
 ul li{display:table-row}div.dt-autofill-list ul li:last-child 
div.dt-autofill-question,div.dt-autofill-list ul li:last-child 
div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul 
li:hover{background-color:#f6f6f6}div.dt-autofill-list 
div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-question 
input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list 
div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid 
#ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse
 farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);z-index:10}div.dt-autofill-list button{padding:0.35em 1em}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.css           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.css   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,81 @@
+div.dt-autofill-handle {
+  position: absolute;
+  height: 8px;
+  width: 8px;
+  z-index: 102;
+  box-sizing: border-box;
+  border: 1px solid #888;
+  background: #888;
+}
+
+div.dt-autofill-select {
+  position: absolute;
+  z-index: 1001;
+  background-color: #888;
+  background-image: repeating-linear-gradient(45deg, transparent, transparent 
5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px);
+}
+div.dt-autofill-select.top, div.dt-autofill-select.bottom {
+  height: 3px;
+  margin-top: -1px;
+}
+div.dt-autofill-select.left, div.dt-autofill-select.right {
+  width: 3px;
+  margin-left: -1px;
+}
+
+div.dt-autofill-list {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 500px;
+  margin-left: -250px;
+  background-color: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  z-index: 11;
+  box-sizing: border-box;
+  padding: 1.5em 2em;
+}
+div.dt-autofill-list ul {
+  display: table;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  width: 100%;
+}
+div.dt-autofill-list ul li {
+  display: table-row;
+}
+div.dt-autofill-list ul li:last-child div.dt-autofill-question, 
div.dt-autofill-list ul li:last-child div.dt-autofill-button {
+  border-bottom: none;
+}
+div.dt-autofill-list ul li:hover {
+  background-color: #f6f6f6;
+}
+div.dt-autofill-list div.dt-autofill-question {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+div.dt-autofill-list div.dt-autofill-question input[type=number] {
+  padding: 6px;
+  width: 30px;
+  margin: -2px 0;
+}
+div.dt-autofill-list div.dt-autofill-button {
+  display: table-cell;
+  padding: 0.5em 0;
+  border-bottom: 1px solid #ccc;
+}
+
+div.dt-autofill-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  z-index: 10;
+}

Added: trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.min.css       
                        (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/css/autoFill.semanticui.min.css       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
+div.dt-autofill-handle{position:absolute;height:8px;width:8px;z-index:102;box-sizing:border-box;border:1px
 solid 
#888;background:#888}div.dt-autofill-select{position:absolute;z-index:1001;background-color:#888;background-image:repeating-linear-gradient(45deg,
 transparent, transparent 5px, rgba(255,255,255,0.5) 5px, rgba(255,255,255,0.5) 
10px)}div.dt-autofill-select.top,div.dt-autofill-select.bottom{height:3px;margin-top:-1px}div.dt-autofill-select.left,div.dt-autofill-select.right{width:3px;margin-left:-1px}div.dt-autofill-list{position:fixed;top:50%;left:50%;width:500px;margin-left:-250px;background-color:white;border-radius:6px;box-shadow:0
 0 5px #555;border:2px solid 
#444;z-index:11;box-sizing:border-box;padding:1.5em 2em}div.dt-autofill-list 
ul{display:table;margin:0;padding:0;list-style:none;width:100%}div.dt-autofill-list
 ul li{display:table-row}div.dt-autofill-list ul li:last-child 
div.dt-autofill-question,div.dt-autofill-list ul li:last-child 
div.dt-autofill-button{border-bottom:none}div.dt-autofill-list ul 
li:hover{background-color:#f6f6f6}div.dt-autofill-list 
div.dt-autofill-question{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid #ccc}div.dt-autofill-list div.dt-autofill-question 
input[type=number]{padding:6px;width:30px;margin:-2px 0}div.dt-autofill-list 
div.dt-autofill-button{display:table-cell;padding:0.5em 0;border-bottom:1px 
solid 
#ccc}div.dt-autofill-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:radial-gradient(ellipse
 farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);z-index:10}

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.js              
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.js      
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,43 @@
+/*! Bootstrap integration for DataTables' AutoFill
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-bs', 
'datatables.net-autofill'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-bs')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.AutoFill ) {
+                               require('datatables.net-autofill')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+DataTable.AutoFill.classes.btn = 'btn btn-primary';
+
+
+return DataTable;
+}));
\ No newline at end of file

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.min.js          
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap.min.js  
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,5 @@
+/*!
+ Bootstrap integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-autofill"],function(b){return
 a(b,window,document)}):"object"===typeof 
exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-bs")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return
 
a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="btn
 btn-primary";return a});

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.js             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.js     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,43 @@
+/*! Bootstrap integration for DataTables' AutoFill
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-bs4', 
'datatables.net-autofill'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-bs4')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.AutoFill ) {
+                               require('datatables.net-autofill')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+DataTable.AutoFill.classes.btn = 'btn btn-primary';
+
+
+return DataTable;
+}));
\ No newline at end of file

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.min.js         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.bootstrap4.min.js 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,5 @@
+/*!
+ Bootstrap integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-autofill"],function(b){return
 a(b,window,document)}):"object"===typeof 
exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-bs4")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return
 
a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="btn
 btn-primary";return a});

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.js             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.js     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,43 @@
+/*! Foundation integration for DataTables' AutoFill
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-zf', 
'datatables.net-autofill'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-zf')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.AutoFill ) {
+                               require('datatables.net-autofill')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+DataTable.AutoFill.classes.btn = 'button tiny';
+
+
+return DataTable;
+}));
\ No newline at end of file

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.min.js         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.foundation.min.js 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,5 @@
+/*!
+ Foundation integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-zf","datatables.net-autofill"],function(b){return
 a(b,window,document)}):"object"===typeof 
exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-zf")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return
 
a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="button
 tiny";return a});

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.js               
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.js       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,43 @@
+/*! jQuery UI integration for DataTables' AutoFill
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-jqui', 
'datatables.net-autofill'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-jqui')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.AutoFill ) {
+                               require('datatables.net-autofill')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+DataTable.AutoFill.classes.btn = 'ui-button ui-state-default ui-corner-all';
+
+
+return DataTable;
+}));

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.min.js           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.jqueryui.min.js   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,6 @@
+/*!
+ jQuery UI integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-jqui","datatables.net-autofill"],function(b){return
 a(b,window,document)}):"object"===typeof 
exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-jqui")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return
 
a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="ui-button
 ui-state-default ui-corner-all";
+return a});

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.js             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.js     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,43 @@
+/*! Bootstrap integration for DataTables' AutoFill
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-se', 
'datatables.net-autofill'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-se')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.AutoFill ) {
+                               require('datatables.net-autofill')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+DataTable.AutoFill.classes.btn = 'ui button';
+
+
+return DataTable;
+}));
\ No newline at end of file

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.min.js         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/autoFill.semanticui.min.js 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,5 @@
+/*!
+ Bootstrap integration for DataTables' AutoFill
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-se","datatables.net-autofill"],function(b){return
 a(b,window,document)}):"object"===typeof 
exports?module.exports=function(b,c){b||(b=window);if(!c||!c.fn.dataTable)c=require("datatables.net-se")(b,c).$;c.fn.dataTable.AutoFill||require("datatables.net-autofill")(b,c);return
 
a(c,b,b.document)}:a(jQuery,window,document)})(function(a){a=a.fn.dataTable;a.AutoFill.classes.btn="ui
 button";return a});

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.js             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.js     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,1159 @@
+/*! AutoFill 2.2.2
+ * ©2008-2017 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * @summary     AutoFill
+ * @description Add Excel like click and drag auto-fill options to DataTables
+ * @version     2.2.2
+ * @file        dataTables.autoFill.js
+ * @author      SpryMedia Ltd (www.sprymedia.co.uk)
+ * @contact     www.sprymedia.co.uk/contact
+ * @copyright   Copyright 2010-2017 SpryMedia Ltd.
+ *
+ * This source file is free software, available under the following license:
+ *   MIT license - http://datatables.net/license/mit
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: http://www.datatables.net
+ */
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net')(root, $).$;
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+var _instance = 0;
+
+/** 
+ * AutoFill provides Excel like auto-fill features for a DataTable
+ *
+ * @class AutoFill
+ * @constructor
+ * @param {object} oTD DataTables settings object
+ * @param {object} oConfig Configuration object for AutoFill
+ */
+var AutoFill = function( dt, opts )
+{
+       if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) 
{
+               throw( "Warning: AutoFill requires DataTables 1.10.8 or 
greater");
+       }
+
+       // User and defaults configuration object
+       this.c = $.extend( true, {},
+               DataTable.defaults.autoFill,
+               AutoFill.defaults,
+               opts
+       );
+
+       /**
+        * @namespace Settings object which contains customisable information 
for AutoFill instance
+        */
+       this.s = {
+               /** @type {DataTable.Api} DataTables' API instance */
+               dt: new DataTable.Api( dt ),
+
+               /** @type {String} Unique namespace for events attached to the 
document */
+               namespace: '.autoFill'+(_instance++),
+
+               /** @type {Object} Cached dimension information for use in the 
mouse move event handler */
+               scroll: {},
+
+               /** @type {integer} Interval object used for smooth scrolling */
+               scrollInterval: null,
+
+               handle: {
+                       height: 0,
+                       width: 0
+               },
+
+               /**
+                * Enabled setting
+                * @type {Boolean}
+                */
+               enabled: false
+       };
+
+
+       /**
+        * @namespace Common and useful DOM elements for the class instance
+        */
+       this.dom = {
+               /** @type {jQuery} AutoFill handle */
+               handle: $('<div class="dt-autofill-handle"/>'),
+
+               /**
+                * @type {Object} Selected cells outline - Need to use 4 
elements,
+                *   otherwise the mouse over if you back into the selected 
rectangle
+                *   will be over that element, rather than the cells!
+                */
+               select: {
+                       top:    $('<div class="dt-autofill-select top"/>'),
+                       right:  $('<div class="dt-autofill-select right"/>'),
+                       bottom: $('<div class="dt-autofill-select bottom"/>'),
+                       left:   $('<div class="dt-autofill-select left"/>')
+               },
+
+               /** @type {jQuery} Fill type chooser background */
+               background: $('<div class="dt-autofill-background"/>'),
+
+               /** @type {jQuery} Fill type chooser */
+               list: $('<div 
class="dt-autofill-list">'+this.s.dt.i18n('autoFill.info', '')+'<ul/></div>'),
+
+               /** @type {jQuery} DataTables scrolling container */
+               dtScroll: null,
+
+               /** @type {jQuery} Offset parent element */
+               offsetParent: null
+       };
+
+
+       /* Constructor logic */
+       this._constructor();
+};
+
+
+
+$.extend( AutoFill.prototype, {
+       /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * *
+        * Public methods (exposed via the DataTables API below)
+        */
+       enabled: function ()
+       {
+               return this.s.enabled;
+       },
+
+
+       enable: function ( flag )
+       {
+               var that = this;
+
+               if ( flag === false ) {
+                       return this.disable();
+               }
+
+               this.s.enabled = true;
+
+               this._focusListener();
+
+               this.dom.handle.on( 'mousedown', function (e) {
+                       that._mousedown( e );
+                       return false;
+               } );
+
+               return this;
+       },
+
+       disable: function ()
+       {
+               this.s.enabled = false;
+
+               this._focusListenerRemove();
+
+               return this;
+       },
+
+
+       /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * *
+        * Constructor
+        */
+
+       /**
+        * Initialise the RowReorder instance
+        *
+        * @private
+        */
+       _constructor: function ()
+       {
+               var that = this;
+               var dt = this.s.dt;
+               var dtScroll = $('div.dataTables_scrollBody', 
this.s.dt.table().container());
+
+               // Make the instance accessible to the API
+               dt.settings()[0].autoFill = this;
+
+               if ( dtScroll.length ) {
+                       this.dom.dtScroll = dtScroll;
+
+                       // Need to scroll container to be the offset parent
+                       if ( dtScroll.css('position') === 'static' ) {
+                               dtScroll.css( 'position', 'relative' );
+                       }
+               }
+
+               if ( this.c.enable !== false ) {
+                       this.enable();
+               }
+
+               dt.on( 'destroy.autoFill', function () {
+                       that._focusListenerRemove();
+               } );
+       },
+
+
+       /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * *
+        * Private methods
+        */
+
+       /**
+        * Display the AutoFill drag handle by appending it to a table cell. 
This
+        * is the opposite of the _detach method.
+        *
+        * @param  {node} node TD/TH cell to insert the handle into
+        * @private
+        */
+       _attach: function ( node )
+       {
+               var dt = this.s.dt;
+               var idx = dt.cell( node ).index();
+               var handle = this.dom.handle;
+               var handleDim = this.s.handle;
+
+               if ( ! idx || dt.columns( this.c.columns ).indexes().indexOf( 
idx.column ) === -1 ) {
+                       this._detach();
+                       return;
+               }
+
+               if ( ! this.dom.offsetParent ) {
+                       // We attach to the table's offset parent
+                       this.dom.offsetParent = $( dt.table().node() 
).offsetParent();
+               }
+
+               if ( ! handleDim.height || ! handleDim.width ) {
+                       // Append to document so we can get its size. Not 
expecting it to
+                       // change during the life time of the page
+                       handle.appendTo( 'body' );
+                       handleDim.height = handle.outerHeight();
+                       handleDim.width = handle.outerWidth();
+               }
+
+               // Might need to go through multiple offset parents
+               var offset = this._getPosition( node, this.dom.offsetParent );
+
+               this.dom.attachedTo = node;
+               handle
+                       .css( {
+                               top: offset.top + node.offsetHeight - 
handleDim.height,
+                               left: offset.left + node.offsetWidth - 
handleDim.width
+                       } )
+                       .appendTo( this.dom.offsetParent );
+       },
+
+
+       /**
+        * Determine can the fill type should be. This can be automatic, or ask 
the
+        * end user.
+        *
+        * @param {array} cells Information about the selected cells from the 
key
+        *     up function
+        * @private
+        */
+       _actionSelector: function ( cells )
+       {
+               var that = this;
+               var dt = this.s.dt;
+               var actions = AutoFill.actions;
+               var available = [];
+
+               // "Ask" each plug-in if it wants to handle this data
+               $.each( actions, function ( key, action ) {
+                       if ( action.available( dt, cells ) ) {
+                               available.push( key );
+                       }
+               } );
+
+               if ( available.length === 1 && this.c.alwaysAsk === false ) {
+                       // Only one action available - enact it immediately
+                       var result = actions[ available[0] ].execute( dt, cells 
);
+                       this._update( result, cells );
+               }
+               else {
+                       // Multiple actions available - ask the end user what 
they want to do
+                       var list = this.dom.list.children('ul').empty();
+
+                       // Add a cancel option
+                       available.push( 'cancel' );
+
+                       $.each( available, function ( i, name ) {
+                               list.append( $('<li/>')
+                                       .append(
+                                               '<div 
class="dt-autofill-question">'+
+                                                       actions[ name ].option( 
dt, cells )+
+                                               '<div>'
+                                       )
+                                       .append( $('<div 
class="dt-autofill-button">' )
+                                               .append( $('<button 
class="'+AutoFill.classes.btn+'">'+dt.i18n('autoFill.button', 
'&gt;')+'</button>')
+                                                       .on( 'click', function 
() {
+                                                               var result = 
actions[ name ].execute(
+                                                                       dt, 
cells, $(this).closest('li')
+                                                               );
+                                                               that._update( 
result, cells );
+
+                                                               
that.dom.background.remove();
+                                                               
that.dom.list.remove();
+                                                       } )
+                                               )
+                                       )
+                               );
+                       } );
+
+                       this.dom.background.appendTo( 'body' );
+                       this.dom.list.appendTo( 'body' );
+
+                       this.dom.list.css( 'margin-top', 
this.dom.list.outerHeight()/2 * -1 );
+               }
+       },
+
+
+       /**
+        * Remove the AutoFill handle from the document
+        *
+        * @private
+        */
+       _detach: function ()
+       {
+               this.dom.attachedTo = null;
+               this.dom.handle.detach();
+       },
+
+
+       /**
+        * Draw the selection outline by calculating the range between the start
+        * and end cells, then placing the highlighting elements to draw a 
rectangle
+        *
+        * @param  {node}   target End cell
+        * @param  {object} e      Originating event
+        * @private
+        */
+       _drawSelection: function ( target, e )
+       {
+               // Calculate boundary for start cell to this one
+               var dt = this.s.dt;
+               var start = this.s.start;
+               var startCell = $(this.dom.start);
+               var endCell = $(target);
+               var end = {
+                       row: dt.rows( { page: 'current' } ).nodes().indexOf( 
endCell.parent()[0] ),
+                       column: endCell.index()
+               };
+               var colIndx = dt.column.index( 'toData', end.column );
+
+               // Be sure that is a DataTables controlled cell
+               if ( ! dt.cell( endCell ).any() ) {
+                       return;
+               }
+
+               // if target is not in the columns available - do nothing
+               if ( dt.columns( this.c.columns ).indexes().indexOf( colIndx ) 
=== -1 ) {
+                       return;
+               }
+
+               this.s.end = end;
+
+               var top, bottom, left, right, height, width;
+
+               top    = start.row    < end.row    ? startCell : endCell;
+               bottom = start.row    < end.row    ? endCell   : startCell;
+               left   = start.column < end.column ? startCell : endCell;
+               right  = start.column < end.column ? endCell   : startCell;
+
+               top    = this._getPosition( top ).top;
+               left   = this._getPosition( left ).left;
+               height = this._getPosition( bottom ).top + bottom.outerHeight() 
- top;
+               width  = this._getPosition( right ).left + right.outerWidth() - 
left;
+
+               var select = this.dom.select;
+               select.top.css( {
+                       top: top,
+                       left: left,
+                       width: width
+               } );
+
+               select.left.css( {
+                       top: top,
+                       left: left,
+                       height: height
+               } );
+
+               select.bottom.css( {
+                       top: top + height,
+                       left: left,
+                       width: width
+               } );
+
+               select.right.css( {
+                       top: top,
+                       left: left + width,
+                       height: height
+               } );
+       },
+
+
+       /**
+        * Use the Editor API to perform an update based on the new data for the
+        * cells
+        *
+        * @param {array} cells Information about the selected cells from the 
key
+        *     up function
+        * @private
+        */
+       _editor: function ( cells )
+       {
+               var dt = this.s.dt;
+               var editor = this.c.editor;
+
+               if ( ! editor ) {
+                       return;
+               }
+
+               // Build the object structure for Editor's multi-row editing
+               var idValues = {};
+               var nodes = [];
+               var fields = editor.fields();
+
+               for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
+                       for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
+                               var cell = cells[i][j];
+
+                               // Determine the field name for the cell being 
edited
+                               var col = dt.settings()[0].aoColumns[ 
cell.index.column ];
+                               var fieldName = col.editField;
+
+                               if ( fieldName === undefined ) {
+                                       var dataSrc = col.mData;
+
+                                       // dataSrc is the `field.data` 
property, but we need to set
+                                       // using the field name, so we need to 
translate from the
+                                       // data to the name
+                                       for ( var k=0, ken=fields.length ; 
k<ken ; k++ ) {
+                                               var field = editor.field( 
fields[k] );
+
+                                               if ( field.dataSrc() === 
dataSrc ) {
+                                                       fieldName = 
field.name();
+                                                       break;
+                                               }
+                                       }
+                               }
+
+                               if ( ! fieldName ) {
+                                       throw 'Could not automatically 
determine field data. '+
+                                               'Please see 
https://datatables.net/tn/11';
+                               }
+
+                               if ( ! idValues[ fieldName ] ) {
+                                       idValues[ fieldName ] = {};
+                               }
+
+                               var id = dt.row( cell.index.row ).id();
+                               idValues[ fieldName ][ id ] = cell.set;
+
+                               // Keep a list of cells so we can activate the 
bubble editing
+                               // with them
+                               nodes.push( cell.index );
+                       }
+               }
+
+               // Perform the edit using bubble editing as it allows us to 
specify
+               // the cells to be edited, rather than using full rows
+               editor
+                       .bubble( nodes, false )
+                       .multiSet( idValues )
+                       .submit();
+       },
+
+
+       /**
+        * Emit an event on the DataTable for listeners
+        *
+        * @param  {string} name Event name
+        * @param  {array} args Event arguments
+        * @private
+        */
+       _emitEvent: function ( name, args )
+       {
+               this.s.dt.iterator( 'table', function ( ctx, i ) {
+                       $(ctx.nTable).triggerHandler( name+'.dt', args );
+               } );
+       },
+
+
+       /**
+        * Attach suitable listeners (based on the configuration) that will 
attach
+        * and detach the AutoFill handle in the document.
+        *
+        * @private
+        */
+       _focusListener: function ()
+       {
+               var that = this;
+               var dt = this.s.dt;
+               var namespace = this.s.namespace;
+               var focus = this.c.focus !== null ?
+                       this.c.focus :
+                       dt.init().keys || dt.settings()[0].keytable ?
+                               'focus' :
+                               'hover';
+
+               // All event listeners attached here are removed in the 
`destroy`
+               // callback in the constructor
+               if ( focus === 'focus' ) {
+                       dt
+                               .on( 'key-focus.autoFill', function ( e, dt, 
cell ) {
+                                       that._attach( cell.node() );
+                               } )
+                               .on( 'key-blur.autoFill', function ( e, dt, 
cell ) {
+                                       that._detach();
+                               } );
+               }
+               else if ( focus === 'click' ) {
+                       $(dt.table().body()).on( 'click'+namespace, 'td, th', 
function (e) {
+                               that._attach( this );
+                       } );
+
+                       $(document.body).on( 'click'+namespace, function (e) {
+                               if ( ! $(e.target).parents().filter( 
dt.table().body() ).length ) {
+                                       that._detach();
+                               }
+                       } );
+               }
+               else {
+                       $(dt.table().body())
+                               .on( 'mouseenter'+namespace, 'td, th', function 
(e) {
+                                       that._attach( this );
+                               } )
+                               .on( 'mouseleave'+namespace, function (e) {
+                                       if ( 
$(e.relatedTarget).hasClass('dt-autofill-handle') ) {
+                                               return;
+                                       }
+
+                                       that._detach();
+                               } );
+               }
+       },
+
+
+       _focusListenerRemove: function ()
+       {
+               var dt = this.s.dt;
+
+               dt.off( '.autoFill' );
+               $(dt.table().body()).off( this.s.namespace );
+               $(document.body).off( this.s.namespace );
+       },
+
+
+       /**
+        * Get the position of a node, relative to another, including any 
scrolling
+        * offsets.
+        * @param  {Node}   node         Node to get the position of
+        * @param  {jQuery} targetParent Node to use as the parent
+        * @return {object}              Offset calculation
+        * @private
+        */
+       _getPosition: function ( node, targetParent )
+       {
+               var
+                       currNode = $(node),
+                       currOffsetParent,
+                       position,
+                       top = 0,
+                       left = 0;
+
+               if ( ! targetParent ) {
+                       targetParent = $( this.s.dt.table().node() 
).offsetParent();
+               }
+
+               do {
+                       position = currNode.position();
+                       currOffsetParent = currNode.offsetParent();
+
+                       top += position.top + currOffsetParent.scrollTop();
+                       left += position.left + currOffsetParent.scrollLeft();
+
+                       // Emergency fall back. Shouldn't happen, but just in 
case!
+                       if ( currNode.get(0).nodeName.toLowerCase() === 'body' 
) {
+                               break;
+                       }
+
+                       currNode = currOffsetParent; // for next loop
+               }
+               while ( currOffsetParent.get(0) !== targetParent.get(0) )
+
+               return {
+                       top: top,
+                       left: left
+               };
+       },
+
+
+       /**
+        * Start mouse drag - selects the start cell
+        *
+        * @param  {object} e Mouse down event
+        * @private
+        */
+       _mousedown: function ( e )
+       {
+               var that = this;
+               var dt = this.s.dt;
+
+               this.dom.start = this.dom.attachedTo;
+               this.s.start = {
+                       row: dt.rows( { page: 'current' } ).nodes().indexOf( 
$(this.dom.start).parent()[0] ),
+                       column: $(this.dom.start).index()
+               };
+
+               $(document.body)
+                       .on( 'mousemove.autoFill', function (e) {
+                               that._mousemove( e );
+                       } )
+                       .on( 'mouseup.autoFill', function (e) {
+                               that._mouseup( e );
+                       } );
+
+               var select = this.dom.select;
+               var offsetParent = $( dt.table().node() ).offsetParent();
+               select.top.appendTo( offsetParent );
+               select.left.appendTo( offsetParent );
+               select.right.appendTo( offsetParent );
+               select.bottom.appendTo( offsetParent );
+
+               this._drawSelection( this.dom.start, e );
+
+               this.dom.handle.css( 'display', 'none' );
+
+               // Cache scrolling information so mouse move doesn't need to 
read.
+               // This assumes that the window and DT scroller will not change 
size
+               // during an AutoFill drag, which I think is a fair assumption
+               var scrollWrapper = this.dom.dtScroll;
+               this.s.scroll = {
+                       windowHeight: $(window).height(),
+                       windowWidth:  $(window).width(),
+                       dtTop:        scrollWrapper ? 
scrollWrapper.offset().top : null,
+                       dtLeft:       scrollWrapper ? 
scrollWrapper.offset().left : null,
+                       dtHeight:     scrollWrapper ? 
scrollWrapper.outerHeight() : null,
+                       dtWidth:      scrollWrapper ? 
scrollWrapper.outerWidth() : null
+               };
+       },
+
+
+       /**
+        * Mouse drag - selects the end cell and update the selection display 
for
+        * the end user
+        *
+        * @param  {object} e Mouse move event
+        * @private
+        */
+       _mousemove: function ( e )
+       {       
+               var that = this;
+               var dt = this.s.dt;
+               var name = e.target.nodeName.toLowerCase();
+               if ( name !== 'td' && name !== 'th' ) {
+                       return;
+               }
+
+               this._drawSelection( e.target, e );
+               this._shiftScroll( e );
+       },
+
+
+       /**
+        * End mouse drag - perform the update actions
+        *
+        * @param  {object} e Mouse up event
+        * @private
+        */
+       _mouseup: function ( e )
+       {
+               $(document.body).off( '.autoFill' );
+
+               var dt = this.s.dt;
+               var select = this.dom.select;
+               select.top.remove();
+               select.left.remove();
+               select.right.remove();
+               select.bottom.remove();
+
+               this.dom.handle.css( 'display', 'block' );
+
+               // Display complete - now do something useful with the 
selection!
+               var start = this.s.start;
+               var end = this.s.end;
+
+               // Haven't selected multiple cells, so nothing to do
+               if ( start.row === end.row && start.column === end.column ) {
+                       return;
+               }
+
+               // Build a matrix representation of the selected rows
+               var rows       = this._range( start.row, end.row );
+               var columns    = this._range( start.column, end.column );
+               var selected   = [];
+               var dtSettings = dt.settings()[0];
+               var dtColumns  = dtSettings.aoColumns;
+
+               // Can't use Array.prototype.map as IE8 doesn't support it
+               // Can't use $.map as jQuery flattens 2D arrays
+               // Need to use a good old fashioned for loop
+               for ( var rowIdx=0 ; rowIdx<rows.length ; rowIdx++ ) {
+                       selected.push(
+                               $.map( columns, function (column) {
+                                       var cell = dt.cell( 
':eq('+rows[rowIdx]+')', column+':visible', {page:'current'} );
+                                       var data = cell.data();
+                                       var cellIndex = cell.index();
+                                       var editField = dtColumns[ 
cellIndex.column ].editField;
+
+                                       if ( editField !== undefined ) {
+                                               data = 
dtSettings.oApi._fnGetObjectDataFn( editField )( dt.row( cellIndex.row ).data() 
);
+                                       }
+
+                                       return {
+                                               cell:  cell,
+                                               data:  data,
+                                               label: cell.data(),
+                                               index: cellIndex
+                                       };
+                               } )
+                       );
+               }
+
+               this._actionSelector( selected );
+               
+               // Stop shiftScroll
+               clearInterval( this.s.scrollInterval );
+               this.s.scrollInterval = null;
+       },
+
+
+       /**
+        * Create an array with a range of numbers defined by the start and end
+        * parameters passed in (inclusive!).
+        * 
+        * @param  {integer} start Start
+        * @param  {integer} end   End
+        * @private
+        */
+       _range: function ( start, end )
+       {
+               var out = [];
+               var i;
+
+               if ( start <= end ) {
+                       for ( i=start ; i<=end ; i++ ) {
+                               out.push( i );
+                       }
+               }
+               else {
+                       for ( i=start ; i>=end ; i-- ) {
+                               out.push( i );
+                       }
+               }
+
+               return out;
+       },
+
+
+       /**
+        * Move the window and DataTables scrolling during a drag to scroll new
+        * content into view. This is done by proximity to the edge of the 
scrolling
+        * container of the mouse - for example near the top edge of the window
+        * should scroll up. This is a little complicated as there are two 
elements
+        * that can be scrolled - the window and the DataTables scrolling view 
port
+        * (if scrollX and / or scrollY is enabled).
+        *
+        * @param  {object} e Mouse move event object
+        * @private
+        */
+       _shiftScroll: function ( e )
+       {
+               var that = this;
+               var dt = this.s.dt;
+               var scroll = this.s.scroll;
+               var runInterval = false;
+               var scrollSpeed = 5;
+               var buffer = 65;
+               var
+                       windowY = e.pageY - document.body.scrollTop,
+                       windowX = e.pageX - document.body.scrollLeft,
+                       windowVert, windowHoriz,
+                       dtVert, dtHoriz;
+
+               // Window calculations - based on the mouse position in the 
window,
+               // regardless of scrolling
+               if ( windowY < buffer ) {
+                       windowVert = scrollSpeed * -1;
+               }
+               else if ( windowY > scroll.windowHeight - buffer ) {
+                       windowVert = scrollSpeed;
+               }
+
+               if ( windowX < buffer ) {
+                       windowHoriz = scrollSpeed * -1;
+               }
+               else if ( windowX > scroll.windowWidth - buffer ) {
+                       windowHoriz = scrollSpeed;
+               }
+
+               // DataTables scrolling calculations - based on the table's 
position in
+               // the document and the mouse position on the page
+               if ( scroll.dtTop !== null && e.pageY < scroll.dtTop + buffer ) 
{
+                       dtVert = scrollSpeed * -1;
+               }
+               else if ( scroll.dtTop !== null && e.pageY > scroll.dtTop + 
scroll.dtHeight - buffer ) {
+                       dtVert = scrollSpeed;
+               }
+
+               if ( scroll.dtLeft !== null && e.pageX < scroll.dtLeft + buffer 
) {
+                       dtHoriz = scrollSpeed * -1;
+               }
+               else if ( scroll.dtLeft !== null && e.pageX > scroll.dtLeft + 
scroll.dtWidth - buffer ) {
+                       dtHoriz = scrollSpeed;
+               }
+
+               // This is where it gets interesting. We want to continue 
scrolling
+               // without requiring a mouse move, so we need an interval to be
+               // triggered. The interval should continue until it is no 
longer needed,
+               // but it must also use the latest scroll commands (for example 
consider
+               // that the mouse might move from scrolling up to scrolling 
left, all
+               // with the same interval running. We use the `scroll` object 
to "pass"
+               // this information to the interval. Can't use local variables 
as they
+               // wouldn't be the ones that are used by an already existing 
interval!
+               if ( windowVert || windowHoriz || dtVert || dtHoriz ) {
+                       scroll.windowVert = windowVert;
+                       scroll.windowHoriz = windowHoriz;
+                       scroll.dtVert = dtVert;
+                       scroll.dtHoriz = dtHoriz;
+                       runInterval = true;
+               }
+               else if ( this.s.scrollInterval ) {
+                       // Don't need to scroll - remove any existing timer
+                       clearInterval( this.s.scrollInterval );
+                       this.s.scrollInterval = null;
+               }
+
+               // If we need to run the interval to scroll and there is no 
existing
+               // interval (if there is an existing one, it will continue to 
run)
+               if ( ! this.s.scrollInterval && runInterval ) {
+                       this.s.scrollInterval = setInterval( function () {
+                               // Don't need to worry about setting scroll <0 
or beyond the
+                               // scroll bound as the browser will just reject 
that.
+                               if ( scroll.windowVert ) {
+                                       document.body.scrollTop += 
scroll.windowVert;
+                               }
+                               if ( scroll.windowHoriz ) {
+                                       document.body.scrollLeft += 
scroll.windowHoriz;
+                               }
+
+                               // DataTables scrolling
+                               if ( scroll.dtVert || scroll.dtHoriz ) {
+                                       var scroller = that.dom.dtScroll[0];
+
+                                       if ( scroll.dtVert ) {
+                                               scroller.scrollTop += 
scroll.dtVert;
+                                       }
+                                       if ( scroll.dtHoriz ) {
+                                               scroller.scrollLeft += 
scroll.dtHoriz;
+                                       }
+                               }
+                       }, 20 );
+               }
+       },
+
+
+       /**
+        * Update the DataTable after the user has selected what they want to do
+        *
+        * @param  {false|undefined} result Return from the `execute` method - 
can
+        *   be false internally to do nothing. This is not documented for 
plug-ins
+        *   and is used only by the cancel option.
+        * @param {array} cells Information about the selected cells from the 
key
+        *     up function, argumented with the set values
+        * @private
+        */
+       _update: function ( result, cells )
+       {
+               // Do nothing on `false` return from an execute function
+               if ( result === false ) {
+                       return;
+               }
+
+               var dt = this.s.dt;
+               var cell;
+
+               // Potentially allow modifications to the cells matrix
+               this._emitEvent( 'preAutoFill', [ dt, cells ] );
+
+               this._editor( cells );
+
+               // Automatic updates are not performed if `update` is null and 
the
+               // `editor` parameter is passed in - the reason being that 
Editor will
+               // update the data once submitted
+               var update = this.c.update !== null ?
+                       this.c.update :
+                       this.c.editor ?
+                               false :
+                               true;
+
+               if ( update ) {
+                       for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
+                               for ( var j=0, jen=cells[i].length ; j<jen ; 
j++ ) {
+                                       cell = cells[i][j];
+
+                                       cell.cell.data( cell.set );
+                               }
+                       }
+
+                       dt.draw(false);
+               }
+
+               this._emitEvent( 'autoFill', [ dt, cells ] );
+       }
+} );
+
+
+/**
+ * AutoFill actions. The options here determine how AutoFill will fill the data
+ * in the table when the user has selected a range of cells. Please see the
+ * documentation on the DataTables site for full details on how to create plug-
+ * ins.
+ *
+ * @type {Object}
+ */
+AutoFill.actions = {
+       increment: {
+               available: function ( dt, cells ) {
+                       return $.isNumeric( cells[0][0].label );
+               },
+
+               option: function ( dt, cells ) {
+                       return dt.i18n(
+                               'autoFill.increment',
+                               'Increment / decrement each cell by: <input 
type="number" value="1">'
+                       );
+               },
+
+               execute: function ( dt, cells, node ) {
+                       var value = cells[0][0].data * 1;
+                       var increment = $('input', node).val() * 1;
+
+                       for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
+                               for ( var j=0, jen=cells[i].length ; j<jen ; 
j++ ) {
+                                       cells[i][j].set = value;
+
+                                       value += increment;
+                               }
+                       }
+               }
+       },
+
+       fill: {
+               available: function ( dt, cells ) {
+                       return true;
+               },
+
+               option: function ( dt, cells ) {
+                       return dt.i18n('autoFill.fill', 'Fill all cells with 
<i>'+cells[0][0].label+'</i>' );
+               },
+
+               execute: function ( dt, cells, node ) {
+                       var value = cells[0][0].data;
+
+                       for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
+                               for ( var j=0, jen=cells[i].length ; j<jen ; 
j++ ) {
+                                       cells[i][j].set = value;
+                               }
+                       }
+               }
+       },
+
+       fillHorizontal: {
+               available: function ( dt, cells ) {
+                       return cells.length > 1 && cells[0].length > 1;
+               },
+
+               option: function ( dt, cells ) {
+                       return dt.i18n('autoFill.fillHorizontal', 'Fill cells 
horizontally' );
+               },
+
+               execute: function ( dt, cells, node ) {
+                       for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
+                               for ( var j=0, jen=cells[i].length ; j<jen ; 
j++ ) {
+                                       cells[i][j].set = cells[i][0].data;
+                               }
+                       }
+               }
+       },
+
+       fillVertical: {
+               available: function ( dt, cells ) {
+                       return cells.length > 1 && cells[0].length > 1;
+               },
+
+               option: function ( dt, cells ) {
+                       return dt.i18n('autoFill.fillVertical', 'Fill cells 
vertically' );
+               },
+
+               execute: function ( dt, cells, node ) {
+                       for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
+                               for ( var j=0, jen=cells[i].length ; j<jen ; 
j++ ) {
+                                       cells[i][j].set = cells[0][j].data;
+                               }
+                       }
+               }
+       },
+
+       // Special type that does not make itself available, but is added
+       // automatically by AutoFill if a multi-choice list is shown. This 
allows
+       // sensible code reuse
+       cancel: {
+               available: function () {
+                       return false;
+               },
+
+               option: function ( dt ) {
+                       return dt.i18n('autoFill.cancel', 'Cancel' );
+               },
+
+               execute: function () {
+                       return false;
+               }
+       }
+};
+
+
+/**
+ * AutoFill version
+ * 
+ * @static
+ * @type      String
+ */
+AutoFill.version = '2.2.2';
+
+
+/**
+ * AutoFill defaults
+ * 
+ * @namespace
+ */
+AutoFill.defaults = {
+       /** @type {Boolean} Ask user what they want to do, even for a single 
option */
+       alwaysAsk: false,
+
+       /** @type {string|null} What will trigger a focus */
+       focus: null, // focus, click, hover
+
+       /** @type {column-selector} Columns to provide auto fill for */
+       columns: '', // all
+
+       /** @type {Boolean} Enable AutoFill on load */
+       enable: true,
+
+       /** @type {boolean|null} Update the cells after a drag */
+       update: null, // false is editor given, true otherwise
+
+       /** @type {DataTable.Editor} Editor instance for automatic submission */
+       editor: null
+};
+
+
+/**
+ * Classes used by AutoFill that are configurable
+ * 
+ * @namespace
+ */
+AutoFill.classes = {
+       /** @type {String} Class used by the selection button */
+       btn: 'btn'
+};
+
+
+/*
+ * API
+ */
+var Api = $.fn.dataTable.Api;
+
+// Doesn't do anything - Not documented
+Api.register( 'autoFill()', function () {
+       return this;
+} );
+
+Api.register( 'autoFill().enabled()', function () {
+       var ctx = this.context[0];
+
+       return ctx.autoFill ?
+               ctx.autoFill.enabled() :
+               false;
+} );
+
+Api.register( 'autoFill().enable()', function ( flag ) {
+       return this.iterator( 'table', function ( ctx ) {
+               if ( ctx.autoFill ) {
+                       ctx.autoFill.enable( flag );
+               }
+       } );
+} );
+
+Api.register( 'autoFill().disable()', function () {
+       return this.iterator( 'table', function ( ctx ) {
+               if ( ctx.autoFill ) {
+                       ctx.autoFill.disable();
+               }
+       } );
+} );
+
+
+// Attach a listener to the document which listens for DataTables 
initialisation
+// events so we can automatically initialise
+$(document).on( 'preInit.dt.autofill', function (e, settings, json) {
+       if ( e.namespace !== 'dt' ) {
+               return;
+       }
+
+       var init = settings.oInit.autoFill;
+       var defaults = DataTable.defaults.autoFill;
+
+       if ( init || defaults ) {
+               var opts = $.extend( {}, init, defaults );
+
+               if ( init !== false ) {
+                       new AutoFill( settings, opts  );
+               }
+       }
+} );
+
+
+// Alias for access
+DataTable.AutoFill = AutoFill;
+DataTable.AutoFill = AutoFill;
+
+
+return AutoFill;
+}));

Added: trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.min.js         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/AutoFill/js/dataTables.autoFill.min.js 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,25 @@
+/*!
+ AutoFill 2.2.2
+ ©2008-2017 SpryMedia Ltd - datatables.net/license
+*/
+(function(e){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net"],function(l){return 
e(l,window,document)}):"object"===typeof 
exports?module.exports=function(l,i){l||(l=window);if(!i||!i.fn.dataTable)i=require("datatables.net")(l,i).$;return
 e(i,l,l.document)}:e(jQuery,window,document)})(function(e,l,i,q){var 
k=e.fn.dataTable,p=0,j=function(c,b){if(!k.versionCheck||!k.versionCheck("1.10.8"))throw"Warning:
 AutoFill requires DataTables 1.10.8 or 
greater";this.c=e.extend(!0,{},k.defaults.autoFill,
+j.defaults,b);this.s={dt:new 
k.Api(c),namespace:".autoFill"+p++,scroll:{},scrollInterval:null,handle:{height:0,width:0},enabled:!1};this.dom={handle:e('<div
 class="dt-autofill-handle"/>'),select:{top:e('<div class="dt-autofill-select 
top"/>'),right:e('<div class="dt-autofill-select right"/>'),bottom:e('<div 
class="dt-autofill-select bottom"/>'),left:e('<div class="dt-autofill-select 
left"/>')},background:e('<div class="dt-autofill-background"/>'),list:e('<div 
class="dt-autofill-list">'+this.s.dt.i18n("autoFill.info",
+"")+"<ul/></div>"),dtScroll:null,offsetParent:null};this._constructor()};e.extend(j.prototype,{enabled:function(){return
 this.s.enabled},enable:function(c){var b=this;if(!1===c)return 
this.disable();this.s.enabled=!0;this._focusListener();this.dom.handle.on("mousedown",function(a){b._mousedown(a);return!1});return
 this},disable:function(){this.s.enabled=!1;this._focusListenerRemove();return 
this},_constructor:function(){var 
c=this,b=this.s.dt,a=e("div.dataTables_scrollBody",this.s.dt.table().container());
+b.settings()[0].autoFill=this;a.length&&(this.dom.dtScroll=a,"static"===a.css("position")&&a.css("position","relative"));!1!==this.c.enable&&this.enable();b.on("destroy.autoFill",function(){c._focusListenerRemove()})},_attach:function(c){var
 
b=this.s.dt,a=b.cell(c).index(),d=this.dom.handle,f=this.s.handle;if(!a||-1===b.columns(this.c.columns).indexes().indexOf(a.column))this._detach();else{this.dom.offsetParent||(this.dom.offsetParent=e(b.table().node()).offsetParent());if(!f.height||!f.width)d.appendTo("body"),
+f.height=d.outerHeight(),f.width=d.outerWidth();b=this._getPosition(c,this.dom.offsetParent);this.dom.attachedTo=c;d.css({top:b.top+c.offsetHeight-f.height,left:b.left+c.offsetWidth-f.width}).appendTo(this.dom.offsetParent)}},_actionSelector:function(c){var
 
b=this,a=this.s.dt,d=j.actions,f=[];e.each(d,function(b,d){d.available(a,c)&&f.push(b)});if(1===f.length&&!1===this.c.alwaysAsk){var
 h=d[f[0]].execute(a,c);this._update(h,c)}else{var 
g=this.dom.list.children("ul").empty();f.push("cancel");e.each(f,
+function(f,h){g.append(e("<li/>").append('<div 
class="dt-autofill-question">'+d[h].option(a,c)+"<div>").append(e('<div 
class="dt-autofill-button">').append(e('<button 
class="'+j.classes.btn+'">'+a.i18n("autoFill.button","&gt;")+"</button>").on("click",function(){var
 
f=d[h].execute(a,c,e(this).closest("li"));b._update(f,c);b.dom.background.remove();b.dom.list.remove()}))))});this.dom.background.appendTo("body");this.dom.list.appendTo("body");this.dom.list.css("margin-top",-1*(this.dom.list.outerHeight()/
+2))}},_detach:function(){this.dom.attachedTo=null;this.dom.handle.detach()},_drawSelection:function(c){var
 
b=this.s.dt,a=this.s.start,d=e(this.dom.start),f=e(c),h={row:b.rows({page:"current"}).nodes().indexOf(f.parent()[0]),column:f.index()},c=b.column.index("toData",h.column);if(b.cell(f).any()&&-1!==b.columns(this.c.columns).indexes().indexOf(c)){this.s.end=h;var
 
g,b=a.row<h.row?d:f;g=a.row<h.row?f:d;c=a.column<h.column?d:f;d=a.column<h.column?f:d;b=this._getPosition(b).top;c=this._getPosition(c).left;
+a=this._getPosition(g).top+g.outerHeight()-b;d=this._getPosition(d).left+d.outerWidth()-c;f=this.dom.select;f.top.css({top:b,left:c,width:d});f.left.css({top:b,left:c,height:a});f.bottom.css({top:b+a,left:c,width:d});f.right.css({top:b,left:c+d,height:a})}},_editor:function(c){var
 b=this.s.dt,a=this.c.editor;if(a){for(var 
d={},f=[],e=a.fields(),g=0,i=c.length;g<i;g++)for(var 
j=0,l=c[g].length;j<l;j++){var 
o=c[g][j],k=b.settings()[0].aoColumns[o.index.column],n=k.editField;if(n===q)for(var
 k=k.mData,
+m=0,p=e.length;m<p;m++){var 
r=a.field(e[m]);if(r.dataSrc()===k){n=r.name();break}}if(!n)throw"Could not 
automatically determine field data. Please see 
https://datatables.net/tn/11";d[n]||(d[n]={});k=b.row(o.index.row).id();d[n][k]=o.set;f.push(o.index)}a.bubble(f,!1).multiSet(d).submit()}},_emitEvent:function(c,b){this.s.dt.iterator("table",function(a){e(a.nTable).triggerHandler(c+".dt",b)})},_focusListener:function(){var
 
c=this,b=this.s.dt,a=this.s.namespace,d=null!==this.c.focus?this.c.focus:b.init().keys||
+b.settings()[0].keytable?"focus":"hover";if("focus"===d)b.on("key-focus.autoFill",function(b,a,d){c._attach(d.node())}).on("key-blur.autoFill",function(){c._detach()});else
 if("click"===d)e(b.table().body()).on("click"+a,"td, 
th",function(){c._attach(this)}),e(i.body).on("click"+a,function(a){e(a.target).parents().filter(b.table().body()).length||c._detach()});else
 e(b.table().body()).on("mouseenter"+a,"td, 
th",function(){c._attach(this)}).on("mouseleave"+a,function(b){e(b.relatedTarget).hasClass("dt-autofill-handle")||
+c._detach()})},_focusListenerRemove:function(){var 
c=this.s.dt;c.off(".autoFill");e(c.table().body()).off(this.s.namespace);e(i.body).off(this.s.namespace)},_getPosition:function(c,b){var
 
a=e(c),d,f,h=0,g=0;b||(b=e(this.s.dt.table().node()).offsetParent());do{f=a.position();d=a.offsetParent();h+=f.top+d.scrollTop();g+=f.left+d.scrollLeft();if("body"===a.get(0).nodeName.toLowerCase())break;a=d}while(d.get(0)!==b.get(0));return{top:h,left:g}},_mousedown:function(c){var
 b=this,a=this.s.dt;this.dom.start=
+this.dom.attachedTo;this.s.start={row:a.rows({page:"current"}).nodes().indexOf(e(this.dom.start).parent()[0]),column:e(this.dom.start).index()};e(i.body).on("mousemove.autoFill",function(a){b._mousemove(a)}).on("mouseup.autoFill",function(a){b._mouseup(a)});var
 
d=this.dom.select,a=e(a.table().node()).offsetParent();d.top.appendTo(a);d.left.appendTo(a);d.right.appendTo(a);d.bottom.appendTo(a);this._drawSelection(this.dom.start,c);this.dom.handle.css("display","none");c=this.dom.dtScroll;this.s.scroll=
+{windowHeight:e(l).height(),windowWidth:e(l).width(),dtTop:c?c.offset().top:null,dtLeft:c?c.offset().left:null,dtHeight:c?c.outerHeight():null,dtWidth:c?c.outerWidth():null}},_mousemove:function(c){var
 
b=c.target.nodeName.toLowerCase();"td"!==b&&"th"!==b||(this._drawSelection(c.target,c),this._shiftScroll(c))},_mouseup:function(){e(i.body).off(".autoFill");var
 
c=this.s.dt,b=this.dom.select;b.top.remove();b.left.remove();b.right.remove();b.bottom.remove();this.dom.handle.css("display","block");var
 b=
+this.s.start,a=this.s.end;if(!(b.row===a.row&&b.column===a.column)){for(var 
d=this._range(b.row,a.row),b=this._range(b.column,a.column),a=[],f=c.settings()[0],h=f.aoColumns,g=0;g<d.length;g++)a.push(e.map(b,function(a){var
 
a=c.cell(":eq("+d[g]+")",a+":visible",{page:"current"}),b=a.data(),e=a.index(),i=h[e.column].editField;i!==q&&(b=f.oApi._fnGetObjectDataFn(i)(c.row(e.row).data()));return{cell:a,data:b,label:a.data(),index:e}}));this._actionSelector(a);clearInterval(this.s.scrollInterval);this.s.scrollInterval=
+null}},_range:function(c,b){var a=[],d;if(c<=b)for(d=c;d<=b;d++)a.push(d);else 
for(d=c;d>=b;d--)a.push(d);return a},_shiftScroll:function(c){var 
b=this,a=this.s.scroll,d=!1,f=c.pageY-i.body.scrollTop,e=c.pageX-i.body.scrollLeft,g,j,k,l;65>f?g=-5:f>a.windowHeight-65&&(g=5);65>e?j=-5:e>a.windowWidth-65&&(j=5);null!==a.dtTop&&c.pageY<a.dtTop+65?k=-5:null!==a.dtTop&&c.pageY>a.dtTop+a.dtHeight-65&&(k=5);null!==a.dtLeft&&c.pageX<a.dtLeft+65?l=-5:null!==a.dtLeft&&c.pageX>a.dtLeft+a.dtWidth-65&&(l=5);g||
+j||k||l?(a.windowVert=g,a.windowHoriz=j,a.dtVert=k,a.dtHoriz=l,d=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&d&&(this.s.scrollInterval=setInterval(function(){if(a.windowVert)i.body.scrollTop=i.body.scrollTop+a.windowVert;if(a.windowHoriz)i.body.scrollLeft=i.body.scrollLeft+a.windowHoriz;if(a.dtVert||a.dtHoriz){var
 
c=b.dom.dtScroll[0];if(a.dtVert)c.scrollTop=c.scrollTop+a.dtVert;if(a.dtHoriz)c.scrollLeft=c.scrollLeft+a.dtHoriz}},
+20))},_update:function(c,b){if(!1!==c){var 
a=this.s.dt,d;this._emitEvent("preAutoFill",[a,b]);this._editor(b);if(null!==this.c.update?this.c.update:!this.c.editor){for(var
 f=0,e=b.length;f<e;f++)for(var 
g=0,i=b[f].length;g<i;g++)d=b[f][g],d.cell.data(d.set);a.draw(!1)}this._emitEvent("autoFill",[a,b])}}});j.actions={increment:{available:function(c,b){return
 e.isNumeric(b[0][0].label)},option:function(c){return 
c.i18n("autoFill.increment",'Increment / decrement each cell by: <input 
type="number" value="1">')},
+execute:function(c,b,a){for(var 
c=1*b[0][0].data,a=1*e("input",a).val(),d=0,f=b.length;d<f;d++)for(var 
h=0,g=b[d].length;h<g;h++)b[d][h].set=c,c+=a}},fill:{available:function(){return!0},option:function(c,b){return
 c.i18n("autoFill.fill","Fill all cells with 
<i>"+b[0][0].label+"</i>")},execute:function(c,b){for(var 
a=b[0][0].data,d=0,e=b.length;d<e;d++)for(var 
h=0,g=b[d].length;h<g;h++)b[d][h].set=a}},fillHorizontal:{available:function(c,b){return
 1<b.length&&1<b[0].length},option:function(c){return 
c.i18n("autoFill.fillHorizontal",
+"Fill cells horizontally")},execute:function(c,b){for(var 
a=0,d=b.length;a<d;a++)for(var 
e=0,h=b[a].length;e<h;e++)b[a][e].set=b[a][0].data}},fillVertical:{available:function(c,b){return
 1<b.length&&1<b[0].length},option:function(c){return 
c.i18n("autoFill.fillVertical","Fill cells 
vertically")},execute:function(c,b){for(var a=0,d=b.length;a<d;a++)for(var 
e=0,h=b[a].length;e<h;e++)b[a][e].set=b[0][e].data}},cancel:{available:function(){return!1},option:function(c){return
 c.i18n("autoFill.cancel",
+"Cancel")},execute:function(){return!1}}};j.version="2.2.2";j.defaults={alwaysAsk:!1,focus:null,columns:"",enable:!0,update:null,editor:null};j.classes={btn:"btn"};var
 m=e.fn.dataTable.Api;m.register("autoFill()",function(){return 
this});m.register("autoFill().enabled()",function(){var 
c=this.context[0];return 
c.autoFill?c.autoFill.enabled():!1});m.register("autoFill().enable()",function(c){return
 
this.iterator("table",function(b){b.autoFill&&b.autoFill.enable(c)})});m.register("autoFill().disable()",
+function(){return 
this.iterator("table",function(c){c.autoFill&&c.autoFill.disable()})});e(i).on("preInit.dt.autofill",function(c,b){if("dt"===c.namespace){var
 
a=b.oInit.autoFill,d=k.defaults.autoFill;if(a||d)d=e.extend({},a,d),!1!==a&&new 
j(b,d)}});k.AutoFill=j;return k.AutoFill=j});

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.css              
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.css      
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,161 @@
address@hidden dtb-spinner {
+  100% {
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+div.dt-button-info {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 400px;
+  margin-top: -100px;
+  margin-left: -200px;
+  background-color: white;
+  border: 2px solid #111;
+  box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
+  border-radius: 3px;
+  text-align: center;
+  z-index: 21;
+}
+div.dt-button-info h2 {
+  padding: 0.5em;
+  margin: 0;
+  font-weight: normal;
+  border-bottom: 1px solid #ddd;
+  background-color: #f3f3f3;
+}
+div.dt-button-info > div {
+  padding: 1em;
+}
+
+ul.dt-button-collection.dropdown-menu {
+  display: block;
+  z-index: 2002;
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+}
+ul.dt-button-collection.dropdown-menu.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+ul.dt-button-collection.dropdown-menu.fixed.two-column {
+  margin-left: -150px;
+}
+ul.dt-button-collection.dropdown-menu.fixed.three-column {
+  margin-left: -225px;
+}
+ul.dt-button-collection.dropdown-menu.fixed.four-column {
+  margin-left: -300px;
+}
+ul.dt-button-collection.dropdown-menu > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+ul.dt-button-collection.dropdown-menu.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+ul.dt-button-collection.dropdown-menu.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+ul.dt-button-collection.dropdown-menu.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+ul.dt-button-collection.dropdown-menu .dt-button {
+  border-radius: 0;
+}
+
+div.dt-button-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 2001;
+}
+
address@hidden screen and (max-width: 767px) {
+  div.dt-buttons {
+    float: none;
+    width: 100%;
+    text-align: center;
+    margin-bottom: 0.5em;
+  }
+  div.dt-buttons a.btn {
+    float: none;
+  }
+}
+div.dt-buttons button.btn.processing,
+div.dt-buttons div.btn.processing,
+div.dt-buttons a.btn.processing {
+  color: rgba(0, 0, 0, 0.2);
+}
+div.dt-buttons button.btn.processing:after,
+div.dt-buttons div.btn.processing:after,
+div.dt-buttons a.btn.processing:after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 16px;
+  height: 16px;
+  margin: -8px 0 0 -8px;
+  box-sizing: border-box;
+  display: block;
+  content: ' ';
+  border: 2px solid #282828;
+  border-radius: 50%;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  animation: dtb-spinner 1500ms infinite linear;
+  -o-animation: dtb-spinner 1500ms infinite linear;
+  -ms-animation: dtb-spinner 1500ms infinite linear;
+  -webkit-animation: dtb-spinner 1500ms infinite linear;
+  -moz-animation: dtb-spinner 1500ms infinite linear;
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.min.css          
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap.min.css  
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
address@hidden dtb-spinner{100%{transform:rotate(360deg)address@hidden 
dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px
 solid #111;box-shadow:3px 3px 8px 
rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info
 h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid 
#ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}ul.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}ul.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}ul.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection.dropdown-menu
 
.dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:address@hidden
 screen and (max-width: 
767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons
 a.btn{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons 
div.btn.processing,div.dt-buttons 
a.btn.processing{color:rgba(0,0,0,0.2)}div.dt-buttons 
button.btn.processing:after,div.dt-buttons 
div.btn.processing:after,div.dt-buttons 
a.btn.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px
 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid 
#282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner
 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite 
linear;-ms-animation:dtb-spinner 1500ms infinite 
linear;-webkit-animation:dtb-spinner 1500ms infinite 
linear;-moz-animation:dtb-spinner 1500ms infinite linear}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.css             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.css     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,225 @@
address@hidden dtb-spinner {
+  100% {
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+div.dt-button-info {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 400px;
+  margin-top: -100px;
+  margin-left: -200px;
+  background-color: white;
+  border: 2px solid #111;
+  box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
+  border-radius: 3px;
+  text-align: center;
+  z-index: 21;
+}
+div.dt-button-info h2 {
+  padding: 0.5em;
+  margin: 0;
+  font-weight: normal;
+  border-bottom: 1px solid #ddd;
+  background-color: #f3f3f3;
+}
+div.dt-button-info > div {
+  padding: 1em;
+}
+
+ul.dt-button-collection.dropdown-menu {
+  display: block;
+  z-index: 2002;
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+}
+ul.dt-button-collection.dropdown-menu.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+ul.dt-button-collection.dropdown-menu.fixed.two-column {
+  margin-left: -150px;
+}
+ul.dt-button-collection.dropdown-menu.fixed.three-column {
+  margin-left: -225px;
+}
+ul.dt-button-collection.dropdown-menu.fixed.four-column {
+  margin-left: -300px;
+}
+ul.dt-button-collection.dropdown-menu > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+ul.dt-button-collection.dropdown-menu.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+ul.dt-button-collection.dropdown-menu.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+ul.dt-button-collection.dropdown-menu.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+ul.dt-button-collection.dropdown-menu .dt-button {
+  border-radius: 0;
+}
+
+ul.dt-button-collection {
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+}
+ul.dt-button-collection.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+ul.dt-button-collection.fixed.two-column {
+  margin-left: -150px;
+}
+ul.dt-button-collection.fixed.three-column {
+  margin-left: -225px;
+}
+ul.dt-button-collection.fixed.four-column {
+  margin-left: -300px;
+}
+ul.dt-button-collection > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+ul.dt-button-collection.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+ul.dt-button-collection.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+ul.dt-button-collection.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+ul.dt-button-collection .dt-button {
+  border-radius: 0;
+}
+ul.dt-button-collection.fixed {
+  max-width: none;
+}
+ul.dt-button-collection.fixed:before, ul.dt-button-collection.fixed:after {
+  display: none;
+}
+
+div.dt-button-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 999;
+}
+
address@hidden screen and (max-width: 767px) {
+  div.dt-buttons {
+    float: none;
+    width: 100%;
+    text-align: center;
+    margin-bottom: 0.5em;
+  }
+  div.dt-buttons a.btn {
+    float: none;
+  }
+}
+div.dt-buttons button.btn.processing,
+div.dt-buttons div.btn.processing,
+div.dt-buttons a.btn.processing {
+  color: rgba(0, 0, 0, 0.2);
+}
+div.dt-buttons button.btn.processing:after,
+div.dt-buttons div.btn.processing:after,
+div.dt-buttons a.btn.processing:after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 16px;
+  height: 16px;
+  margin: -8px 0 0 -8px;
+  box-sizing: border-box;
+  display: block;
+  content: ' ';
+  border: 2px solid #282828;
+  border-radius: 50%;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  animation: dtb-spinner 1500ms infinite linear;
+  -o-animation: dtb-spinner 1500ms infinite linear;
+  -ms-animation: dtb-spinner 1500ms infinite linear;
+  -webkit-animation: dtb-spinner 1500ms infinite linear;
+  -moz-animation: dtb-spinner 1500ms infinite linear;
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.min.css         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.bootstrap4.min.css 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
address@hidden dtb-spinner{100%{transform:rotate(360deg)address@hidden 
dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px
 solid #111;box-shadow:3px 3px 8px 
rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info
 h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid 
#ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}ul.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}ul.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}ul.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection.dropdown-menu
 
.dt-button{border-radius:0}ul.dt-button-collection{-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.fixed.two-column{margin-left:-150px}ul.dt-button-collection.fixed.three-column{margin-left:-225px}ul.dt-button-collection.fixed.four-column{margin-left:-300px}ul.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection
 
.dt-button{border-radius:0}ul.dt-button-collection.fixed{max-width:none}ul.dt-button-collection.fixed:before,ul.dt-button-collection.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:address@hidden
 screen and (max-width: 
767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons
 a.btn{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons 
div.btn.processing,div.dt-buttons 
a.btn.processing{color:rgba(0,0,0,0.2)}div.dt-buttons 
button.btn.processing:after,div.dt-buttons 
div.btn.processing:after,div.dt-buttons 
a.btn.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px
 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid 
#282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner
 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite 
linear;-ms-animation:dtb-spinner 1500ms infinite 
linear;-webkit-animation:dtb-spinner 1500ms infinite 
linear;-moz-animation:dtb-spinner 1500ms infinite linear}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.css             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.css     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,360 @@
address@hidden dtb-spinner {
+  100% {
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+div.dt-button-info {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 400px;
+  margin-top: -100px;
+  margin-left: -200px;
+  background-color: white;
+  border: 2px solid #111;
+  box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
+  border-radius: 3px;
+  text-align: center;
+  z-index: 21;
+}
+div.dt-button-info h2 {
+  padding: 0.5em;
+  margin: 0;
+  font-weight: normal;
+  border-bottom: 1px solid #ddd;
+  background-color: #f3f3f3;
+}
+div.dt-button-info > div {
+  padding: 1em;
+}
+
+button.dt-button,
+div.dt-button,
+a.dt-button {
+  position: relative;
+  display: inline-block;
+  box-sizing: border-box;
+  margin-right: 0.333em;
+  margin-bottom: 0.333em;
+  padding: 0.5em 1em;
+  border: 1px solid #999;
+  border-radius: 2px;
+  cursor: pointer;
+  font-size: 0.88em;
+  line-height: 1.6em;
+  color: black;
+  white-space: nowrap;
+  overflow: hidden;
+  background-color: #e9e9e9;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, white 0%, #e9e9e9 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, white 0%, #e9e9e9 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, white 0%, #e9e9e9 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, white 0%, #e9e9e9 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, white 0%, #e9e9e9 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white',
 EndColorStr='#e9e9e9');
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  text-decoration: none;
+  outline: none;
+}
+button.dt-button.disabled,
+div.dt-button.disabled,
+a.dt-button.disabled {
+  color: #999;
+  border: 1px solid #d0d0d0;
+  cursor: default;
+  background-color: #f9f9f9;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f9f9f9 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #ffffff 0%, #f9f9f9 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff',
 EndColorStr='#f9f9f9');
+}
+button.dt-button:active:not(.disabled), button.dt-button.active:not(.disabled),
+div.dt-button:active:not(.disabled),
+div.dt-button.active:not(.disabled),
+a.dt-button:active:not(.disabled),
+a.dt-button.active:not(.disabled) {
+  background-color: #e2e2e2;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3',
 EndColorStr='#e2e2e2');
+  box-shadow: inset 1px 1px 3px #999999;
+}
+button.dt-button:active:not(.disabled):hover:not(.disabled), 
button.dt-button.active:not(.disabled):hover:not(.disabled),
+div.dt-button:active:not(.disabled):hover:not(.disabled),
+div.dt-button.active:not(.disabled):hover:not(.disabled),
+a.dt-button:active:not(.disabled):hover:not(.disabled),
+a.dt-button.active:not(.disabled):hover:not(.disabled) {
+  box-shadow: inset 1px 1px 3px #999999;
+  background-color: #cccccc;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #eaeaea 0%, #cccccc 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #eaeaea 0%, #cccccc 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea',
 EndColorStr='#cccccc');
+}
+button.dt-button:hover,
+div.dt-button:hover,
+a.dt-button:hover {
+  text-decoration: none;
+}
+button.dt-button:hover:not(.disabled),
+div.dt-button:hover:not(.disabled),
+a.dt-button:hover:not(.disabled) {
+  border: 1px solid #666;
+  background-color: #e0e0e0;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9',
 EndColorStr='#e0e0e0');
+}
+button.dt-button:focus:not(.disabled),
+div.dt-button:focus:not(.disabled),
+a.dt-button:focus:not(.disabled) {
+  border: 1px solid #426c9e;
+  text-shadow: 0 1px 0 #c4def1;
+  outline: none;
+  background-color: #79ace9;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #bddef4 0%, #79ace9 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4',
 EndColorStr='#79ace9');
+}
+
+.dt-button embed {
+  outline: none;
+}
+
+div.dt-buttons {
+  position: relative;
+  float: left;
+}
+div.dt-buttons.buttons-right {
+  float: right;
+}
+
+div.dt-button-collection {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 150px;
+  margin-top: 3px;
+  padding: 8px 8px 4px 8px;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.4);
+  background-color: white;
+  overflow: hidden;
+  z-index: 2002;
+  border-radius: 5px;
+  box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
+  z-index: 2002;
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+}
+div.dt-button-collection button.dt-button,
+div.dt-button-collection div.dt-button,
+div.dt-button-collection a.dt-button {
+  position: relative;
+  left: 0;
+  right: 0;
+  width: 100%;
+  display: block;
+  float: none;
+  margin-bottom: 4px;
+  margin-right: 0;
+}
+div.dt-button-collection button.dt-button:active:not(.disabled), 
div.dt-button-collection button.dt-button.active:not(.disabled),
+div.dt-button-collection div.dt-button:active:not(.disabled),
+div.dt-button-collection div.dt-button.active:not(.disabled),
+div.dt-button-collection a.dt-button:active:not(.disabled),
+div.dt-button-collection a.dt-button.active:not(.disabled) {
+  background-color: #dadada;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);
+  filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0',
 EndColorStr='#dadada');
+  box-shadow: inset 1px 1px 3px #666;
+}
+div.dt-button-collection.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+div.dt-button-collection.fixed.two-column {
+  margin-left: -150px;
+}
+div.dt-button-collection.fixed.three-column {
+  margin-left: -225px;
+}
+div.dt-button-collection.fixed.four-column {
+  margin-left: -300px;
+}
+div.dt-button-collection > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+div.dt-button-collection.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+div.dt-button-collection.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+div.dt-button-collection.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+div.dt-button-collection .dt-button {
+  border-radius: 0;
+}
+
+div.dt-button-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 
0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 
0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 
0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, 
color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 
0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 2001;
+}
+
address@hidden screen and (max-width: 640px) {
+  div.dt-buttons {
+    float: none !important;
+    text-align: center;
+  }
+}
+button.dt-button.processing,
+div.dt-button.processing,
+a.dt-button.processing {
+  color: rgba(0, 0, 0, 0.2);
+}
+button.dt-button.processing:after,
+div.dt-button.processing:after,
+a.dt-button.processing:after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 16px;
+  height: 16px;
+  margin: -8px 0 0 -8px;
+  box-sizing: border-box;
+  display: block;
+  content: ' ';
+  border: 2px solid #282828;
+  border-radius: 50%;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  animation: dtb-spinner 1500ms infinite linear;
+  -o-animation: dtb-spinner 1500ms infinite linear;
+  -ms-animation: dtb-spinner 1500ms infinite linear;
+  -webkit-animation: dtb-spinner 1500ms infinite linear;
+  -moz-animation: dtb-spinner 1500ms infinite linear;
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.min.css         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.dataTables.min.css 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
address@hidden dtb-spinner{100%{transform:rotate(360deg)address@hidden 
dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px
 solid #111;box-shadow:3px 3px 8px 
rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info
 h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid 
#ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em
 1em;border:1px solid 
#999;border-radius:2px;cursor:pointer;font-size:0.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top,
 #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, 
#e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 
100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 
100%);background-image:linear-gradient(to bottom, #fff 0%, #e9e9e9 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white',
 
EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px
 solid 
#d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top,
 #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, 
#f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 
100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 
100%);background-image:linear-gradient(to bottom, #fff 0%, #f9f9f9 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff',
 
EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top,
 #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 
0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 
100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 
100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3',
 EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px 
#999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset
 1px 1px 3px 
#999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, 
#eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, 
#ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 
100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 
100%);background-image:linear-gradient(to bottom, #eaeaea 0%, #ccc 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea',
 
EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px
 solid 
#666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, 
#f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 
0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 
100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 
100%);background-image:linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9',
 
EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px
 solid #426c9e;text-shadow:0 1px 0 
#c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top,
 #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 
0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 
100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 
100%);background-image:linear-gradient(to bottom, #bddef4 0%, #79ace9 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4',
 EndColorStr='#79ace9')}.dt-button 
embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px
 8px 4px 8px;border:1px solid #ccc;border:1px solid 
rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px
 3px 5px 
rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection
 button.dt-button,div.dt-button-collection 
div.dt-button,div.dt-button-collection 
a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection
 button.dt-button:active:not(.disabled),div.dt-button-collection 
button.dt-button.active:not(.disabled),div.dt-button-collection 
div.dt-button:active:not(.disabled),div.dt-button-collection 
div.dt-button.active:not(.disabled),div.dt-button-collection 
a.dt-button:active:not(.disabled),div.dt-button-collection 
a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top,
 #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 
0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 
100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 
100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 
100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0',
 EndColorStr='#dadada');box-shadow:inset 1px 1px 3px 
#666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection
 
.dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center,
 ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);background:-moz-radial-gradient(center, ellipse farthest-corner, 
rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, 
ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);background:-webkit-gradient(radial, center center, 0, center center, 497, 
color-stop(0, rgba(0,0,0,0.3)), color-stop(1, 
rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse 
farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);background:radial-gradient(ellipse farthest-corner at center, 
rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:address@hidden screen and 
(max-width: 640px){div.dt-buttons{float:none 
!important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px
 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid 
#282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner
 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite 
linear;-ms-animation:dtb-spinner 1500ms infinite 
linear;-webkit-animation:dtb-spinner 1500ms infinite 
linear;-moz-animation:dtb-spinner 1500ms infinite linear}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.css             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.css     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,192 @@
address@hidden dtb-spinner {
+  100% {
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+div.dt-button-info {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 400px;
+  margin-top: -100px;
+  margin-left: -200px;
+  background-color: white;
+  border: 2px solid #111;
+  box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
+  border-radius: 3px;
+  text-align: center;
+  z-index: 21;
+}
+div.dt-button-info h2 {
+  padding: 0.5em;
+  margin: 0;
+  font-weight: normal;
+  border-bottom: 1px solid #ddd;
+  background-color: #f3f3f3;
+}
+div.dt-button-info > div {
+  padding: 1em;
+}
+
+ul.dt-buttons li {
+  margin: 0;
+}
+ul.dt-buttons li.active a {
+  box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.6);
+}
+
+ul.dt-buttons.button-group a {
+  margin-bottom: 0;
+}
+
+ul.dt-button-collection.f-dropdown {
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+}
+ul.dt-button-collection.f-dropdown.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+ul.dt-button-collection.f-dropdown.fixed.two-column {
+  margin-left: -150px;
+}
+ul.dt-button-collection.f-dropdown.fixed.three-column {
+  margin-left: -225px;
+}
+ul.dt-button-collection.f-dropdown.fixed.four-column {
+  margin-left: -300px;
+}
+ul.dt-button-collection.f-dropdown > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+ul.dt-button-collection.f-dropdown.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+ul.dt-button-collection.f-dropdown.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+ul.dt-button-collection.f-dropdown.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+ul.dt-button-collection.f-dropdown .dt-button {
+  border-radius: 0;
+}
+ul.dt-button-collection.f-dropdown.fixed {
+  max-width: none;
+}
+ul.dt-button-collection.f-dropdown.fixed:before, 
ul.dt-button-collection.f-dropdown.fixed:after {
+  display: none;
+}
+
+div.dt-button-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 88;
+}
+
address@hidden screen and (max-width: 767px) {
+  ul.dt-buttons {
+    float: none;
+    width: 100%;
+    text-align: center;
+    margin-bottom: 0.5rem;
+  }
+  ul.dt-buttons li {
+    float: none;
+  }
+}
+div.button-group.stacked.dropdown-pane {
+  margin-top: 2px;
+  padding: 1px;
+  z-index: 89;
+}
+div.button-group.stacked.dropdown-pane a.button {
+  margin-bottom: 1px;
+  border-right: none;
+}
+div.button-group.stacked.dropdown-pane a.button:last-child {
+  margin-bottom: 0;
+}
+
+div.dt-buttons button.button.processing,
+div.dt-buttons div.button.processing,
+div.dt-buttons a.button.processing {
+  color: rgba(0, 0, 0, 0.2);
+  color: rgba(255, 255, 255, 0.2);
+  border-top-color: white;
+  border-bottom-color: white;
+}
+div.dt-buttons button.button.processing:after,
+div.dt-buttons div.button.processing:after,
+div.dt-buttons a.button.processing:after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 16px;
+  height: 16px;
+  margin: -8px 0 0 -8px;
+  box-sizing: border-box;
+  display: block;
+  content: ' ';
+  border: 2px solid #282828;
+  border-radius: 50%;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  animation: dtb-spinner 1500ms infinite linear;
+  -o-animation: dtb-spinner 1500ms infinite linear;
+  -ms-animation: dtb-spinner 1500ms infinite linear;
+  -webkit-animation: dtb-spinner 1500ms infinite linear;
+  -moz-animation: dtb-spinner 1500ms infinite linear;
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.min.css         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.foundation.min.css 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
address@hidden dtb-spinner{100%{transform:rotate(360deg)address@hidden 
dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px
 solid #111;box-shadow:3px 3px 8px 
rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info
 h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid 
#ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}ul.dt-buttons 
li{margin:0}ul.dt-buttons li.active a{box-shadow:inset 0 0 10px 
rgba(0,0,0,0.6)}ul.dt-buttons.button-group 
a{margin-bottom:0}ul.dt-button-collection.f-dropdown{-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}ul.dt-button-collection.f-dropdown.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}ul.dt-button-collection.f-dropdown.fixed.two-column{margin-left:-150px}ul.dt-button-collection.f-dropdown.fixed.three-column{margin-left:-225px}ul.dt-button-collection.f-dropdown.fixed.four-column{margin-left:-300px}ul.dt-button-collection.f-dropdown>*{-webkit-column-break-inside:avoid;break-inside:avoid}ul.dt-button-collection.f-dropdown.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}ul.dt-button-collection.f-dropdown.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}ul.dt-button-collection.f-dropdown.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}ul.dt-button-collection.f-dropdown
 
.dt-button{border-radius:0}ul.dt-button-collection.f-dropdown.fixed{max-width:none}ul.dt-button-collection.f-dropdown.fixed:before,ul.dt-button-collection.f-dropdown.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:address@hidden
 screen and (max-width: 
767px){ul.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5rem}ul.dt-buttons
 
li{float:none}}div.button-group.stacked.dropdown-pane{margin-top:2px;padding:1px;z-index:89}div.button-group.stacked.dropdown-pane
 
a.button{margin-bottom:1px;border-right:none}div.button-group.stacked.dropdown-pane
 a.button:last-child{margin-bottom:0}div.dt-buttons 
button.button.processing,div.dt-buttons div.button.processing,div.dt-buttons 
a.button.processing{color:rgba(0,0,0,0.2);color:rgba(255,255,255,0.2);border-top-color:white;border-bottom-color:white}div.dt-buttons
 button.button.processing:after,div.dt-buttons 
div.button.processing:after,div.dt-buttons 
a.button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px
 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid 
#282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner
 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite 
linear;-ms-animation:dtb-spinner 1500ms infinite 
linear;-webkit-animation:dtb-spinner 1500ms infinite 
linear;-moz-animation:dtb-spinner 1500ms infinite linear}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.css               
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.css       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,220 @@
address@hidden dtb-spinner {
+  100% {
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+div.dt-button-info {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 400px;
+  margin-top: -100px;
+  margin-left: -200px;
+  background-color: white;
+  border: 2px solid #111;
+  box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
+  border-radius: 3px;
+  text-align: center;
+  z-index: 21;
+}
+div.dt-button-info h2 {
+  padding: 0.5em;
+  margin: 0;
+  font-weight: normal;
+  border-bottom: 1px solid #ddd;
+  background-color: #f3f3f3;
+}
+div.dt-button-info > div {
+  padding: 1em;
+}
+
+div.dt-buttons {
+  position: relative;
+  float: left;
+}
+div.dt-buttons .dt-button {
+  margin-right: 0;
+}
+div.dt-buttons .dt-button span.ui-icon {
+  display: inline-block;
+  vertical-align: middle;
+  margin-top: -2px;
+}
+div.dt-buttons .dt-button:active {
+  outline: none;
+}
+div.dt-buttons .dt-button:hover > span {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+div.dt-button-collection {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 150px;
+  margin-top: 3px;
+  padding: 8px 8px 4px 8px;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.4);
+  background-color: #f3f3f3;
+  background-color: rgba(255, 255, 255, 0.3);
+  overflow: hidden;
+  z-index: 2002;
+  border-radius: 5px;
+  box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
+  z-index: 2002;
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+  -webkit-column-gap: 0;
+  -moz-column-gap: 0;
+  -ms-column-gap: 0;
+  -o-column-gap: 0;
+  column-gap: 0;
+}
+div.dt-button-collection .dt-button {
+  position: relative;
+  left: 0;
+  right: 0;
+  width: 100%;
+  display: block;
+  float: none;
+  margin-right: 0;
+  margin-bottom: 4px;
+}
+div.dt-button-collection .dt-button:hover > span {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+div.dt-button-collection.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+div.dt-button-collection.fixed.two-column {
+  margin-left: -150px;
+}
+div.dt-button-collection.fixed.three-column {
+  margin-left: -225px;
+}
+div.dt-button-collection.fixed.four-column {
+  margin-left: -300px;
+}
+div.dt-button-collection > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+div.dt-button-collection.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+div.dt-button-collection.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+div.dt-button-collection.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+div.dt-button-collection .dt-button {
+  border-radius: 0;
+}
+
+div.dt-button-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 
0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 
0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 
0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, 
color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 
0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 
0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 2001;
+}
+
address@hidden screen and (max-width: 640px) {
+  div.dt-buttons {
+    float: none !important;
+    text-align: center;
+  }
+}
+button.dt-button.processing,
+div.dt-button.processing,
+a.dt-button.processing {
+  color: rgba(0, 0, 0, 0.2);
+}
+button.dt-button.processing:after,
+div.dt-button.processing:after,
+a.dt-button.processing:after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 16px;
+  height: 16px;
+  margin: -8px 0 0 -8px;
+  box-sizing: border-box;
+  display: block;
+  content: ' ';
+  border: 2px solid #282828;
+  border-radius: 50%;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  animation: dtb-spinner 1500ms infinite linear;
+  -o-animation: dtb-spinner 1500ms infinite linear;
+  -ms-animation: dtb-spinner 1500ms infinite linear;
+  -webkit-animation: dtb-spinner 1500ms infinite linear;
+  -moz-animation: dtb-spinner 1500ms infinite linear;
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.min.css           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.jqueryui.min.css   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
address@hidden dtb-spinner{100%{transform:rotate(360deg)address@hidden 
dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px
 solid #111;box-shadow:3px 3px 8px 
rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info
 h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid 
#ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-buttons{position:relative;float:left}div.dt-buttons
 .dt-button{margin-right:0}div.dt-buttons .dt-button 
span.ui-icon{display:inline-block;vertical-align:middle;margin-top:-2px}div.dt-buttons
 .dt-button:active{outline:none}div.dt-buttons 
.dt-button:hover>span{background-color:rgba(0,0,0,0.05)}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px
 8px 4px 8px;border:1px solid #ccc;border:1px solid 
rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px
 3px 5px 
rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px;-webkit-column-gap:0;-moz-column-gap:0;-ms-column-gap:0;-o-column-gap:0;column-gap:0}div.dt-button-collection
 
.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-right:0;margin-bottom:4px}div.dt-button-collection
 
.dt-button:hover>span{background-color:rgba(0,0,0,0.05)}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection
 
.dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center,
 ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);background:-moz-radial-gradient(center, ellipse farthest-corner, 
rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, 
ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);background:-webkit-gradient(radial, center center, 0, center center, 497, 
color-stop(0, rgba(0,0,0,0.3)), color-stop(1, 
rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse 
farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 
100%);background:radial-gradient(ellipse farthest-corner at center, 
rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:address@hidden screen and 
(max-width: 640px){div.dt-buttons{float:none 
!important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px
 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid 
#282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner
 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite 
linear;-ms-animation:dtb-spinner 1500ms infinite 
linear;-webkit-animation:dtb-spinner 1500ms infinite 
linear;-moz-animation:dtb-spinner 1500ms infinite linear}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.css             
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.css     
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,174 @@
address@hidden "UTF-8";
address@hidden dtb-spinner {
+  100% {
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -o-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
address@hidden dtb-spinner {
+  100% {
+    -moz-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+div.dt-button-info {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 400px;
+  margin-top: -100px;
+  margin-left: -200px;
+  background-color: white;
+  border: 2px solid #111;
+  box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3);
+  border-radius: 3px;
+  text-align: center;
+  z-index: 21;
+}
+div.dt-button-info h2 {
+  padding: 0.5em;
+  margin: 0;
+  font-weight: normal;
+  border-bottom: 1px solid #ddd;
+  background-color: #f3f3f3;
+}
+div.dt-button-info > div {
+  padding: 1em;
+}
+
+div.dt-button-collection {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 150px;
+  margin-top: 3px !important;
+  z-index: 2002;
+  background: white;
+  -webkit-column-gap: 8px;
+  -moz-column-gap: 8px;
+  -ms-column-gap: 8px;
+  -o-column-gap: 8px;
+  column-gap: 8px;
+}
+div.dt-button-collection.fixed {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  margin-left: -75px;
+  border-radius: 0;
+}
+div.dt-button-collection.fixed.two-column {
+  margin-left: -150px;
+}
+div.dt-button-collection.fixed.three-column {
+  margin-left: -225px;
+}
+div.dt-button-collection.fixed.four-column {
+  margin-left: -300px;
+}
+div.dt-button-collection > * {
+  -webkit-column-break-inside: avoid;
+  break-inside: avoid;
+}
+div.dt-button-collection.two-column {
+  width: 300px;
+  padding-bottom: 1px;
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -ms-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+div.dt-button-collection.three-column {
+  width: 450px;
+  padding-bottom: 1px;
+  -webkit-column-count: 3;
+  -moz-column-count: 3;
+  -ms-column-count: 3;
+  -o-column-count: 3;
+  column-count: 3;
+}
+div.dt-button-collection.four-column {
+  width: 600px;
+  padding-bottom: 1px;
+  -webkit-column-count: 4;
+  -moz-column-count: 4;
+  -ms-column-count: 4;
+  -o-column-count: 4;
+  column-count: 4;
+}
+div.dt-button-collection .dt-button {
+  border-radius: 0;
+}
+
+button.buttons-collection.ui.button span:after {
+  display: inline-block;
+  content: "▾";
+  padding-left: 0.5em;
+}
+
+div.dt-button-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 2001;
+}
+
address@hidden screen and (max-width: 767px) {
+  div.dt-buttons {
+    float: none;
+    width: 100%;
+    text-align: center;
+    margin-bottom: 0.5em;
+  }
+  div.dt-buttons a.btn {
+    float: none;
+  }
+}
+div.dt-buttons button.button.processing,
+div.dt-buttons div.button.processing,
+div.dt-buttons a.button.processing {
+  position: relative;
+  color: rgba(0, 0, 0, 0.2);
+}
+div.dt-buttons button.button.processing:after,
+div.dt-buttons div.button.processing:after,
+div.dt-buttons a.button.processing:after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 16px;
+  height: 16px;
+  margin: -8px 0 0 -8px;
+  box-sizing: border-box;
+  display: block;
+  content: ' ';
+  border: 2px solid #282828;
+  border-radius: 50%;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  animation: dtb-spinner 1500ms infinite linear;
+  -o-animation: dtb-spinner 1500ms infinite linear;
+  -ms-animation: dtb-spinner 1500ms infinite linear;
+  -webkit-animation: dtb-spinner 1500ms infinite linear;
+  -moz-animation: dtb-spinner 1500ms infinite linear;
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.min.css
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.min.css         
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/buttons.semanticui.min.css 
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1 @@
address@hidden dtb-spinner{100%{transform:rotate(360deg)address@hidden 
dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)address@hidden
 
dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px
 solid #111;box-shadow:3px 3px 8px 
rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info
 h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid 
#ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px
 
!important;z-index:2002;background:white;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection
 .dt-button{border-radius:0}button.buttons-collection.ui.button 
span:after{display:inline-block;content:"▾";padding-left:0.5em}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:address@hidden
 screen and (max-width: 
767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons
 a.btn{float:none}}div.dt-buttons button.button.processing,div.dt-buttons 
div.button.processing,div.dt-buttons 
a.button.processing{position:relative;color:rgba(0,0,0,0.2)}div.dt-buttons 
button.button.processing:after,div.dt-buttons 
div.button.processing:after,div.dt-buttons 
a.button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px
 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid 
#282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner
 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite 
linear;-ms-animation:dtb-spinner 1500ms infinite 
linear;-webkit-animation:dtb-spinner 1500ms infinite 
linear;-moz-animation:dtb-spinner 1500ms infinite linear}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/common.scss
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/common.scss                        
        (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/common.scss        2017-12-26 
22:07:22 UTC (rev 17474)
@@ -0,0 +1,27 @@
+
+div.dt-button-info {
+       position: fixed;
+       top: 50%;
+       left: 50%;
+       width: 400px;
+       margin-top: -100px;
+       margin-left: -200px;
+       background-color: white;
+       border: 2px solid #111;
+       box-shadow: 3px 3px 8px rgba( 0, 0, 0, 0.3);
+       border-radius: 3px;
+       text-align: center;
+       z-index: 21;
+
+       h2 {
+               padding: 0.5em;
+               margin: 0;
+               font-weight: normal;
+               border-bottom: 1px solid #ddd;
+               background-color: #f3f3f3;
+       }
+
+       > div {
+               padding: 1em;
+       }
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/css/mixins.scss
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/css/mixins.scss                        
        (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/css/mixins.scss        2017-12-26 
22:07:22 UTC (rev 17474)
@@ -0,0 +1,141 @@
+
address@hidden dtb-two-stop-gradient($fromColor, $toColor) {
+       background-color: $toColor; /* Fallback */
+       background-image: -webkit-linear-gradient(top, $fromColor 0%, $toColor 
100%); /* Chrome 10+, Saf5.1+, iOS 5+ */
+       background-image:    -moz-linear-gradient(top, $fromColor 0%, $toColor 
100%); /* FF3.6 */
+       background-image:     -ms-linear-gradient(top, $fromColor 0%, $toColor 
100%); /* IE10 */
+       background-image:      -o-linear-gradient(top, $fromColor 0%, $toColor 
100%); /* Opera 11.10+ */
+       background-image:         linear-gradient(to bottom, $fromColor 0%, 
$toColor 100%);
+       filter: 
progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#{nth( 
$fromColor, 1 )}', EndColorStr='#{nth( $toColor, 1 )}');
+}
+
address@hidden dtb-radial-gradient ($fromColor, $toColor ) {
+       background: $toColor; /* Fallback */
+       background:     -ms-radial-gradient(center, ellipse farthest-corner, 
$fromColor 0%, $toColor 100%); /* IE10 Consumer Preview */ 
+       background:    -moz-radial-gradient(center, ellipse farthest-corner, 
$fromColor 0%, $toColor 100%); /* Firefox */ 
+       background:      -o-radial-gradient(center, ellipse farthest-corner, 
$fromColor 0%, $toColor 100%); /* Opera */ 
+       background: -webkit-gradient(radial, center center, 0, center center, 
497, color-stop(0, $fromColor), color-stop(1, $toColor)); /* Webkit 
(Safari/Chrome 10) */ 
+       background: -webkit-radial-gradient(center, ellipse farthest-corner, 
$fromColor 0%, $toColor 100%); /* Webkit (Chrome 11+) */ 
+       background: radial-gradient(ellipse farthest-corner at center, 
$fromColor 0%, $toColor 100%); /* W3C Markup, IE10 Release Preview */ 
+}
+
+
address@hidden dtb-fixed-collection {
+       // Fixed positioning feature
+       &.fixed {
+               position: fixed;
+               top: 50%;
+               left: 50%;
+               margin-left: -75px;
+               border-radius: 0;
+
+               &.two-column {
+                       margin-left: -150px;
+               }
+
+               &.three-column {
+                       margin-left: -225px;
+               }
+
+               &.four-column {
+                       margin-left: -300px;
+               }
+       }
+
+       // Multi-column layout feature
+       -webkit-column-gap: 8px;
+          -moz-column-gap: 8px;
+           -ms-column-gap: 8px;
+            -o-column-gap: 8px;
+       column-gap: 8px;
+
+       > * {
+               -webkit-column-break-inside: avoid;
+               break-inside: avoid;
+       }
+
+       &.two-column {
+               width: 300px;
+               padding-bottom: 1px;
+
+               -webkit-column-count: 2;
+                  -moz-column-count: 2;
+                   -ms-column-count: 2;
+                    -o-column-count: 2;
+               column-count: 2;
+       }
+
+       &.three-column {
+               width: 450px;
+               padding-bottom: 1px;
+
+               -webkit-column-count: 3;
+                  -moz-column-count: 3;
+                   -ms-column-count: 3;
+                    -o-column-count: 3;
+               column-count: 3;
+       }
+
+       &.four-column {
+               width: 600px;
+               padding-bottom: 1px;
+
+               -webkit-column-count: 4;
+                  -moz-column-count: 4;
+                   -ms-column-count: 4;
+                    -o-column-count: 4;
+               column-count: 4;
+       }
+
+       // Chrome fix - 531528
+       .dt-button {
+               border-radius: 0;
+       }
+}
+
+
address@hidden dtb-processing {
+       color: rgba(0, 0, 0, 0.2);
+
+       &:after {
+               position: absolute;
+           top: 50%;
+               left: 50%;
+               width: 16px;
+               height: 16px;
+               margin: -8px 0 0 -8px;
+               box-sizing: border-box;
+
+               display: block;
+               content: ' ';
+               border: 2px solid rgb(40,40,40);
+               border-radius: 50%;
+               border-left-color: transparent;
+               border-right-color: transparent;
+               animation: dtb-spinner 1500ms infinite linear;
+                       -o-animation: dtb-spinner 1500ms infinite linear;
+                       -ms-animation: dtb-spinner 1500ms infinite linear;
+                       -webkit-animation: dtb-spinner 1500ms infinite linear;
+                       -moz-animation: dtb-spinner 1500ms infinite linear;
+       }
+}
+
address@hidden dtb-spinner {
+       100%{ transform: rotate(360deg); }
+}
+
address@hidden dtb-spinner {
+       100%{ -o-transform: rotate(360deg); transform: rotate(360deg); }
+}
+
address@hidden dtb-spinner {
+       100%{ -ms-transform: rotate(360deg); transform: rotate(360deg); }
+}
+
address@hidden dtb-spinner {
+       100%{ -webkit-transform: rotate(360deg); transform: rotate(360deg); }
+}
+
address@hidden dtb-spinner {
+       100%{ -moz-transform: rotate(360deg); transform: rotate(360deg); }
+}

Added: trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.js
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.js                
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.js        
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,70 @@
+/*! Bootstrap integration for DataTables' Buttons
+ * ©2016 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-bs', 
'datatables.net-buttons'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-bs')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.Buttons ) {
+                               require('datatables.net-buttons')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+$.extend( true, DataTable.Buttons.defaults, {
+       dom: {
+               container: {
+                       className: 'dt-buttons btn-group'
+               },
+               button: {
+                       className: 'btn btn-default'
+               },
+               collection: {
+                       tag: 'ul',
+                       className: 'dt-button-collection dropdown-menu',
+                       button: {
+                               tag: 'li',
+                               className: 'dt-button',
+                               active: 'active',
+                               disabled: 'disabled'
+                       },
+                       buttonLiner: {
+                               tag: 'a',
+                               className: ''
+                       }
+               }
+       }
+} );
+
+DataTable.ext.buttons.collection.text = function ( dt ) {
+       return dt.i18n('buttons.collection', 'Collection <span 
class="caret"/>');
+};
+
+
+return DataTable.Buttons;
+}));

Added: trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.min.js            
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap.min.js    
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-buttons"],function(a){return
 c(a,window,document)}):"object"===typeof 
exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return
 c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var 
a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{className:"dt-buttons
 btn-group"},
+button:{className:"btn 
btn-default"},collection:{tag:"ul",className:"dt-button-collection 
dropdown-menu",button:{tag:"li",className:"dt-button",active:"active",disabled:"disabled"},buttonLiner:{tag:"a",className:""}}}});a.ext.buttons.collection.text=function(a){return
 a.i18n("buttons.collection",'Collection <span class="caret"/>')};return 
a.Buttons});

Added: trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.js
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.js               
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.js       
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,62 @@
+/*! Bootstrap integration for DataTables' Buttons
+ * ©2016 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net-bs4', 
'datatables.net-buttons'], function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net-bs4')(root, $).$;
+                       }
+
+                       if ( ! $.fn.dataTable.Buttons ) {
+                               require('datatables.net-buttons')(root, $);
+                       }
+
+                       return factory( $, root, root.document );
+               };
+       }
+       else {
+               // Browser
+               factory( jQuery, window, document );
+       }
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+$.extend( true, DataTable.Buttons.defaults, {
+       dom: {
+               container: {
+                       className: 'dt-buttons btn-group'
+               },
+               button: {
+                       className: 'btn btn-secondary'
+               },
+               collection: {
+                       tag: 'div',
+                       className: 'dt-button-collection dropdown-menu',
+                       button: {
+                               tag: 'a',
+                               className: 'dt-button dropdown-item',
+                               active: 'active',
+                               disabled: 'disabled'
+                       }
+               }
+       }
+} );
+
+DataTable.ext.buttons.collection.className += ' dropdown-toggle';
+
+return DataTable.Buttons;
+}));

Added: trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.min.js
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.min.js           
                (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/js/buttons.bootstrap4.min.js   
2017-12-26 22:07:22 UTC (rev 17474)
@@ -0,0 +1,6 @@
+/*!
+ Bootstrap integration for DataTables' Buttons
+ ©2016 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof 
define&&define.amd?define(["jquery","datatables.net-bs4","datatables.net-buttons"],function(a){return
 c(a,window,document)}):"object"===typeof 
exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net-bs4")(a,b).$;b.fn.dataTable.Buttons||require("datatables.net-buttons")(a,b);return
 c(b,a,a.document)}:c(jQuery,window,document)})(function(c){var 
a=c.fn.dataTable;c.extend(!0,a.Buttons.defaults,{dom:{container:{className:"dt-buttons
 btn-group"},
+button:{className:"btn 
btn-secondary"},collection:{tag:"div",className:"dt-button-collection 
dropdown-menu",button:{tag:"a",className:"dt-button 
dropdown-item",active:"active",disabled:"disabled"}}}});a.ext.buttons.collection.className+="
 dropdown-toggle";return a.Buttons});

Added: trunk/phpgwapi/js/DataTables/Buttons/js/buttons.colVis.js
===================================================================
--- trunk/phpgwapi/js/DataTables/Buttons/js/buttons.colVis.js                   
        (rev 0)
+++ trunk/phpgwapi/js/DataTables/Buttons/js/buttons.colVis.js   2017-12-26 
22:07:22 UTC (rev 17474)
@@ -0,0 +1,208 @@
+/*!
+ * Column visibility buttons for Buttons and DataTables.
+ * 2016 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+       if ( typeof define === 'function' && define.amd ) {
+               // AMD
+               define( ['jquery', 'datatables.net', 'datatables.net-buttons'], 
function ( $ ) {
+                       return factory( $, window, document );
+               } );
+       }
+       else if ( typeof exports === 'object' ) {
+               // CommonJS
+               module.exports = function (root, $) {
+                       if ( ! root ) {
+                               root = window;
+                       }
+
+                       if ( ! $ || ! $.fn.dataTable ) {
+                               $ = require('datatables.net')(root, $).$;
+                       }
+

@@ Diff output truncated at 153600 characters. @@



reply via email to

[Prev in Thread] Current Thread [Next in Thread]