+ TableTools example - initialisation with 'new TableTools()'
+
+
+
Preamble
+
Typically when working with TableTools, the initialisation and insertion into the DOM will be done automatically by DataTables, through the use of the sDom parameter. However, it is also possible to initialise TableTools manually as shown in the example below. Once initialised you can insert the TableTools tool bar node anywhere you wish into the DOM using the instance.dom.container parameter.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/alter_buttons.html b/wqflask/wqflask/static/packages/TableTools/alter_buttons.html
new file mode 100755
index 00000000..771b0b86
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/alter_buttons.html
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - button arrangement
+
+
+
Preamble
+
TableTools makes it very simple to arrange the buttons in the toolbar as you see fit. Using the aButtons parameter you can use any of the predefined buttons or customised buttons. The example below shows how TableTools can be initialised to provide only the 'copy-to-clipboard' and 'print view' options (i.e. no save to local file option is available).
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/bootstrap.html b/wqflask/wqflask/static/packages/TableTools/bootstrap.html
new file mode 100755
index 00000000..664bde3d
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/bootstrap.html
@@ -0,0 +1,551 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TableTools with Twitter Bootstrap
+
+
+
Preamble
+
Twitter Bootstrap is a very powerful design framework for allowing you to very quickly create applications with a unified look and feel. DataTables integrates well with Bootstrap, and so does TableTools.
+
This example shows the default Bootstrap theme being used with a Bootstrap styled DataTable. sDom is supplied to the DataTable with a setup suitable for Bootstrap styling, and a TableTools collection is used to show how it can be used in this environment.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/button_text.html b/wqflask/wqflask/static/packages/TableTools/button_text.html
new file mode 100755
index 00000000..6828eb94
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/button_text.html
@@ -0,0 +1,531 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - customised button text
+
+
+
Preamble
+
You may wish to set your own text for the buttons in the TableTools toolbar, rather than relying on the default built-in text. This is done by overriding the sButtonText parameter of whatever button you wish to alter. The way TableTools allows you to alter a predefined button is by 'extending' it (using the sExtends parameter) and then setting the overriding parameter. A full list of the parameters which can be used is available on the DataTables.net web-site. This example shows how to set the button text as required.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/collection.html b/wqflask/wqflask/static/packages/TableTools/collection.html
new file mode 100755
index 00000000..4eb3141b
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/collection.html
@@ -0,0 +1,522 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - button collections
+
+
+
Preamble
+
TableTools provides the ability to group buttons into a hidden drop down list, which is activated by clicking on a top-level button. This is achieved by extending the 'collection' predefined button type and setting it's aButtons parameter with the same options as the top level buttons (note that you cannot currently use a collection within a collection).
+
The example below shows the file save buttons grouped into a collection, while the copy and print buttons are left on the top level.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/defaults.html b/wqflask/wqflask/static/packages/TableTools/defaults.html
new file mode 100755
index 00000000..5ef74a68
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/defaults.html
@@ -0,0 +1,503 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - changing the initialisation defaults
+
+
+
Preamble
+
TableTools provides the ability to override the default initialisation parameters that are used when creating a new instance. This this particularly useful if you have multiple tables which you want to have the same TableTools behaviour - rather than declaring the structure multiple times, you can just set the defaults once. This example shows how to alter the default buttons.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/index.html b/wqflask/wqflask/static/packages/TableTools/index.html
new file mode 100755
index 00000000..06a2442d
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/index.html
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example
+
+
+
Preamble
+
This example shows the basic initialisation of TableTools by simply including the 'T' marker in DataTables' sDom parameter. This tell DataTables to insert the TableTools toolbar in that location. Remember to include the Javascript and CSS source files as well!
+
It is worth noting that you might need to set the sSwfPath parameter to tell TableTools where to find the SWF file for copy and file save.
Please use your browser's print function to print this table. Press escape when finished.",sMessage:null,bShowAll:!0,sToolTip:"View print view",sButtonClass:"DTTT_button_print",sButtonText:"Print",fnClick:function(a,b){this.fnPrint(!0,b)}}),text:e.extend({},TableTools.buttonBase),select:e.extend({},TableTools.buttonBase,{sButtonText:"Select button",fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},
+fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),select_single:e.extend({},TableTools.buttonBase,{sButtonText:"Select button",fnSelect:function(a){1==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),select_all:e.extend({},TableTools.buttonBase,{sButtonText:"Select all",fnClick:function(){this.fnSelectAll()},fnSelect:function(a){this.fnGetSelected().length==
+this.s.dt.fnRecordsDisplay()?e(a).addClass(this.classes.buttons.disabled):e(a).removeClass(this.classes.buttons.disabled)}}),select_none:e.extend({},TableTools.buttonBase,{sButtonText:"Deselect all",fnClick:function(){this.fnSelectNone()},fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),ajax:e.extend({},TableTools.buttonBase,{sAjaxUrl:"/xhr.php",
+sButtonText:"Ajax button",fnClick:function(a,b){var c=this.fnGetTableData(b);e.ajax({url:b.sAjaxUrl,data:[{name:"tableData",value:c}],success:b.fnAjaxComplete,dataType:"json",type:"POST",cache:!1,error:function(){alert("Error detected when sending table data to server")}})},fnAjaxComplete:function(){alert("Ajax complete")}}),div:e.extend({},TableTools.buttonBase,{sAction:"div",sTag:"div",sButtonClass:"DTTT_nonbutton",sButtonText:"Text button"}),collection:e.extend({},TableTools.buttonBase,{sAction:"collection",
+sButtonClass:"DTTT_button_collection",sButtonText:"Collection",fnClick:function(a,b){this._fnCollectionShow(a,b)}})};TableTools.classes={container:"DTTT_container",buttons:{normal:"DTTT_button",disabled:"DTTT_disabled"},collection:{container:"DTTT_collection",background:"DTTT_collection_background",buttons:{normal:"DTTT_button",disabled:"DTTT_disabled"}},select:{table:"DTTT_selectable",row:"DTTT_selected"},print:{body:"DTTT_Print",info:"DTTT_print_info",message:"DTTT_PrintMessage"}};TableTools.classes_themeroller=
+{container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}};TableTools.DEFAULTS={sSwfPath:"media/swf/copy_csv_xls_pdf.swf",sRowSelect:"none",sSelectedClass:null,fnPreRowSelect:null,fnRowSelected:null,fnRowDeselected:null,aButtons:["copy","csv","xls","pdf","print"],oTags:{container:"div",button:"a",liner:"span",collection:{container:"div",button:"a",liner:"span"}}};TableTools.prototype.CLASS=
+"TableTools";TableTools.VERSION="2.1.5";TableTools.prototype.VERSION=TableTools.VERSION;"function"==typeof e.fn.dataTable&&"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.9.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){a=new TableTools(a.oInstance,"undefined"!=typeof a.oInit.oTableTools?a.oInit.oTableTools:{});TableTools._aInstances.push(a);return a.dom.container},cFeature:"T",sFeature:"TableTools"}):alert("Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");
+e.fn.DataTable.TableTools=TableTools})(jQuery,window,document);
diff --git a/wqflask/wqflask/static/packages/TableTools/media/js/TableTools.min.js.gz b/wqflask/wqflask/static/packages/TableTools/media/js/TableTools.min.js.gz
new file mode 100644
index 00000000..01ce7c04
Binary files /dev/null and b/wqflask/wqflask/static/packages/TableTools/media/js/TableTools.min.js.gz differ
diff --git a/wqflask/wqflask/static/packages/TableTools/media/js/ZeroClipboard.js b/wqflask/wqflask/static/packages/TableTools/media/js/ZeroClipboard.js
new file mode 100755
index 00000000..de0f6b67
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/media/js/ZeroClipboard.js
@@ -0,0 +1,367 @@
+// Simple Set Clipboard System
+// Author: Joseph Huckaby
+
+var ZeroClipboard_TableTools = {
+
+ version: "1.0.4-TableTools2",
+ clients: {}, // registered upload clients on page, indexed by id
+ moviePath: '', // URL to movie
+ nextId: 1, // ID of next movie
+
+ $: function(thingy) {
+ // simple DOM lookup utility function
+ if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
+ if (!thingy.addClass) {
+ // extend element with a few useful methods
+ thingy.hide = function() { this.style.display = 'none'; };
+ thingy.show = function() { this.style.display = ''; };
+ thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
+ thingy.removeClass = function(name) {
+ this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
+ };
+ thingy.hasClass = function(name) {
+ return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
+ }
+ }
+ return thingy;
+ },
+
+ setMoviePath: function(path) {
+ // set path to ZeroClipboard.swf
+ this.moviePath = path;
+ },
+
+ dispatch: function(id, eventName, args) {
+ // receive event from flash movie, send to client
+ var client = this.clients[id];
+ if (client) {
+ client.receiveEvent(eventName, args);
+ }
+ },
+
+ register: function(id, client) {
+ // register new client to receive events
+ this.clients[id] = client;
+ },
+
+ getDOMObjectPosition: function(obj) {
+ // get absolute coordinates for dom element
+ var info = {
+ left: 0,
+ top: 0,
+ width: obj.width ? obj.width : obj.offsetWidth,
+ height: obj.height ? obj.height : obj.offsetHeight
+ };
+
+ if ( obj.style.width != "" )
+ info.width = obj.style.width.replace("px","");
+
+ if ( obj.style.height != "" )
+ info.height = obj.style.height.replace("px","");
+
+ while (obj) {
+ info.left += obj.offsetLeft;
+ info.top += obj.offsetTop;
+ obj = obj.offsetParent;
+ }
+
+ return info;
+ },
+
+ Client: function(elem) {
+ // constructor for new simple upload client
+ this.handlers = {};
+
+ // unique ID
+ this.id = ZeroClipboard_TableTools.nextId++;
+ this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id;
+
+ // register client with singleton to receive flash events
+ ZeroClipboard_TableTools.register(this.id, this);
+
+ // create movie
+ if (elem) this.glue(elem);
+ }
+};
+
+ZeroClipboard_TableTools.Client.prototype = {
+
+ id: 0, // unique ID for us
+ ready: false, // whether movie is ready to receive events or not
+ movie: null, // reference to movie object
+ clipText: '', // text to copy to clipboard
+ fileName: '', // default file save name
+ action: 'copy', // action to perform
+ handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
+ cssEffects: true, // enable CSS mouse effects on dom container
+ handlers: null, // user event handlers
+ sized: false,
+
+ glue: function(elem, title) {
+ // glue to DOM element
+ // elem can be ID or actual DOM element object
+ this.domElement = ZeroClipboard_TableTools.$(elem);
+
+ // float just above object, or zIndex 99 if dom element isn't set
+ var zIndex = 99;
+ if (this.domElement.style.zIndex) {
+ zIndex = parseInt(this.domElement.style.zIndex) + 1;
+ }
+
+ // find X/Y position of domElement
+ var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
+
+ // create floating DIV above element
+ this.div = document.createElement('div');
+ var style = this.div.style;
+ style.position = 'absolute';
+ style.left = '0px';
+ style.top = '0px';
+ style.width = (box.width) + 'px';
+ style.height = box.height + 'px';
+ style.zIndex = zIndex;
+
+ if ( typeof title != "undefined" && title != "" ) {
+ this.div.title = title;
+ }
+ if ( box.width != 0 && box.height != 0 ) {
+ this.sized = true;
+ }
+
+ // style.backgroundColor = '#f00'; // debug
+ if ( this.domElement ) {
+ this.domElement.appendChild(this.div);
+ this.div.innerHTML = this.getHTML( box.width, box.height );
+ }
+ },
+
+ positionElement: function() {
+ var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
+ var style = this.div.style;
+
+ style.position = 'absolute';
+ //style.left = (this.domElement.offsetLeft)+'px';
+ //style.top = this.domElement.offsetTop+'px';
+ style.width = box.width + 'px';
+ style.height = box.height + 'px';
+
+ if ( box.width != 0 && box.height != 0 ) {
+ this.sized = true;
+ } else {
+ return;
+ }
+
+ var flash = this.div.childNodes[0];
+ flash.width = box.width;
+ flash.height = box.height;
+ },
+
+ getHTML: function(width, height) {
+ // return HTML for movie
+ var html = '';
+ var flashvars = 'id=' + this.id +
+ '&width=' + width +
+ '&height=' + height;
+
+ if (navigator.userAgent.match(/MSIE/)) {
+ // IE gets an OBJECT tag
+ var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
+ html += '';
+ }
+ else {
+ // all other browsers get an EMBED tag
+ html += '';
+ }
+ return html;
+ },
+
+ hide: function() {
+ // temporarily hide floater offscreen
+ if (this.div) {
+ this.div.style.left = '-2000px';
+ }
+ },
+
+ show: function() {
+ // show ourselves after a call to hide()
+ this.reposition();
+ },
+
+ destroy: function() {
+ // destroy control and floater
+ if (this.domElement && this.div) {
+ this.hide();
+ this.div.innerHTML = '';
+
+ var body = document.getElementsByTagName('body')[0];
+ try { body.removeChild( this.div ); } catch(e) {;}
+
+ this.domElement = null;
+ this.div = null;
+ }
+ },
+
+ reposition: function(elem) {
+ // reposition our floating div, optionally to new container
+ // warning: container CANNOT change size, only position
+ if (elem) {
+ this.domElement = ZeroClipboard_TableTools.$(elem);
+ if (!this.domElement) this.hide();
+ }
+
+ if (this.domElement && this.div) {
+ var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
+ var style = this.div.style;
+ style.left = '' + box.left + 'px';
+ style.top = '' + box.top + 'px';
+ }
+ },
+
+ clearText: function() {
+ // clear the text to be copy / saved
+ this.clipText = '';
+ if (this.ready) this.movie.clearText();
+ },
+
+ appendText: function(newText) {
+ // append text to that which is to be copied / saved
+ this.clipText += newText;
+ if (this.ready) { this.movie.appendText(newText) ;}
+ },
+
+ setText: function(newText) {
+ // set text to be copied to be copied / saved
+ this.clipText = newText;
+ if (this.ready) { this.movie.setText(newText) ;}
+ },
+
+ setCharSet: function(charSet) {
+ // set the character set (UTF16LE or UTF8)
+ this.charSet = charSet;
+ if (this.ready) { this.movie.setCharSet(charSet) ;}
+ },
+
+ setBomInc: function(bomInc) {
+ // set if the BOM should be included or not
+ this.incBom = bomInc;
+ if (this.ready) { this.movie.setBomInc(bomInc) ;}
+ },
+
+ setFileName: function(newText) {
+ // set the file name
+ this.fileName = newText;
+ if (this.ready) this.movie.setFileName(newText);
+ },
+
+ setAction: function(newText) {
+ // set action (save or copy)
+ this.action = newText;
+ if (this.ready) this.movie.setAction(newText);
+ },
+
+ addEventListener: function(eventName, func) {
+ // add user event listener for event
+ // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
+ eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+ if (!this.handlers[eventName]) this.handlers[eventName] = [];
+ this.handlers[eventName].push(func);
+ },
+
+ setHandCursor: function(enabled) {
+ // enable hand cursor (true), or default arrow cursor (false)
+ this.handCursorEnabled = enabled;
+ if (this.ready) this.movie.setHandCursor(enabled);
+ },
+
+ setCSSEffects: function(enabled) {
+ // enable or disable CSS effects on DOM container
+ this.cssEffects = !!enabled;
+ },
+
+ receiveEvent: function(eventName, args) {
+ // receive event from flash
+ eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+
+ // special behavior for certain events
+ switch (eventName) {
+ case 'load':
+ // movie claims it is ready, but in IE this isn't always the case...
+ // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
+ this.movie = document.getElementById(this.movieId);
+ if (!this.movie) {
+ var self = this;
+ setTimeout( function() { self.receiveEvent('load', null); }, 1 );
+ return;
+ }
+
+ // firefox on pc needs a "kick" in order to set these in certain cases
+ if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
+ var self = this;
+ setTimeout( function() { self.receiveEvent('load', null); }, 100 );
+ this.ready = true;
+ return;
+ }
+
+ this.ready = true;
+ this.movie.clearText();
+ this.movie.appendText( this.clipText );
+ this.movie.setFileName( this.fileName );
+ this.movie.setAction( this.action );
+ this.movie.setCharSet( this.charSet );
+ this.movie.setBomInc( this.incBom );
+ this.movie.setHandCursor( this.handCursorEnabled );
+ break;
+
+ case 'mouseover':
+ if (this.domElement && this.cssEffects) {
+ //this.domElement.addClass('hover');
+ if (this.recoverActive) this.domElement.addClass('active');
+ }
+ break;
+
+ case 'mouseout':
+ if (this.domElement && this.cssEffects) {
+ this.recoverActive = false;
+ if (this.domElement.hasClass('active')) {
+ this.domElement.removeClass('active');
+ this.recoverActive = true;
+ }
+ //this.domElement.removeClass('hover');
+ }
+ break;
+
+ case 'mousedown':
+ if (this.domElement && this.cssEffects) {
+ this.domElement.addClass('active');
+ }
+ break;
+
+ case 'mouseup':
+ if (this.domElement && this.cssEffects) {
+ this.domElement.removeClass('active');
+ this.recoverActive = false;
+ }
+ break;
+ } // switch eventName
+
+ if (this.handlers[eventName]) {
+ for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
+ var func = this.handlers[eventName][idx];
+
+ if (typeof(func) == 'function') {
+ // actual function reference
+ func(this, args);
+ }
+ else if ((typeof(func) == 'object') && (func.length == 2)) {
+ // PHP style object + method, i.e. [myObject, 'myMethod']
+ func[0][ func[1] ](this, args);
+ }
+ else if (typeof(func) == 'string') {
+ // name of function
+ window[func](this, args);
+ }
+ } // foreach event handler defined
+ } // user defined handler for event
+ }
+
+};
diff --git a/wqflask/wqflask/static/packages/TableTools/media/swf/copy_csv_xls.swf b/wqflask/wqflask/static/packages/TableTools/media/swf/copy_csv_xls.swf
new file mode 100644
index 00000000..082c7acb
Binary files /dev/null and b/wqflask/wqflask/static/packages/TableTools/media/swf/copy_csv_xls.swf differ
diff --git a/wqflask/wqflask/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf b/wqflask/wqflask/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf
new file mode 100644
index 00000000..063131df
Binary files /dev/null and b/wqflask/wqflask/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf differ
diff --git a/wqflask/wqflask/static/packages/TableTools/multi_instance.html b/wqflask/wqflask/static/packages/TableTools/multi_instance.html
new file mode 100755
index 00000000..14e1e63e
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/multi_instance.html
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - multiple toolbars
+
+
+
Preamble
+
Like all DataTables control elements, TableTools can have multiple instances specified in the sDom parameter of DataTables. This will create two TableTools toolbars next to the table, providing the same functions. An example of when this might be useful is to show the toolbar both above and below the table - as is done in this example.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/multiple_tables.html b/wqflask/wqflask/static/packages/TableTools/multiple_tables.html
new file mode 100755
index 00000000..8cd8aef9
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/multiple_tables.html
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - multiple tables
+
+
+
Preamble
+
This example shows how multiple tables can be initialised with DataTables and TableTools in a single call to the $().dataTable() function. Basically it works as you would expect - no special considerations need be made!
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/pdf_message.html b/wqflask/wqflask/static/packages/TableTools/pdf_message.html
new file mode 100755
index 00000000..e8f66e12
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/pdf_message.html
@@ -0,0 +1,524 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example
+
+
+
Preamble
+
This example shows how you can add a message to the saved PDF using the 'sPdfMessage' parameter. It also shows that the orientation of the output PDF can be changed to landscape which is useful if you have a lot of columns.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/plug-in.html b/wqflask/wqflask/static/packages/TableTools/plug-in.html
new file mode 100755
index 00000000..08a055bf
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/plug-in.html
@@ -0,0 +1,539 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - plug-ins
+
+
+
Preamble
+
Plug-ins in TableTools take the form of additional buttons types, which provide extra options and flexibility for TableTools. This example shows how a plug-in button type can be defined and then used in the TableTools initialisation. Note that the TableTools.buttonBase object is extended with our required parameters - this base object provides default values for all of the options TableTools can work with, so they don't all have to be defined in our button.
+
Additional plug-ins for TableTools can be found on the DataTables.net site. The example plug-in here shows a button which is used to insert the data from the table into a given element.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/select_multi.html b/wqflask/wqflask/static/packages/TableTools/select_multi.html
new file mode 100755
index 00000000..ee94789c
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/select_multi.html
@@ -0,0 +1,507 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - multi-row select
+
+
+
Preamble
+
As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. Row selection is turned off by default in TableTools, but can be enabled using the sRowSelect parameter, set to either 'multi' or 'single'. When set the end user can select rows by simply clicking on them. TableTools provides a set of API methods and callbacks for controlling and monitoring the row selection in TableTools. There are also a number of pre-defined buttons to provide functions such as select-all and select-none, as shown in this example.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/select_single.html b/wqflask/wqflask/static/packages/TableTools/select_single.html
new file mode 100755
index 00000000..94a47893
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/select_single.html
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - single row selection
+
+
+
Preamble
+
As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. Row selection is turned off by default in TableTools, but can be enabled using the sRowSelect parameter, set to either 'multi' or 'single'. When set the end user can select rows by simply clicking on them. TableTools provides a set of API methods and callbacks for controlling and monitoring the row selection in TableTools. This example shows single row selection enabled.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/swf_path.html b/wqflask/wqflask/static/packages/TableTools/swf_path.html
new file mode 100755
index 00000000..c82633b4
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/swf_path.html
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - setting SWF path
+
+
+
Preamble
+
TableTools uses a Flash SWF file to provide the ability to copy text to the system clipboard and save files locally. TableTools must be able to load the SWF file in order to provide these facilities. If you aren't using the same directory structure as the TableTools package, you will need to set this parameter.
+
Note that TableTools ships with two different SWF files - the only difference between them is that one of them provides the ability to save PDF files while the other doesn't. The trade off is that the PDF capable file is significantly larger in size (56K v 2K).
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/tabs.html b/wqflask/wqflask/static/packages/TableTools/tabs.html
new file mode 100755
index 00000000..915cc821
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/tabs.html
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+
+ TableTools example
+
+
+
Preamble
+
This example shows the basic initialisation of TableTools by simply including the 'T' marker in DataTables' sDom parameter. This tell DataTables to insert the TableTools toolbar in that location. Remember to include the Javascript and CSS source files as well!
+
It is worth noting that you might need to set the sSwfPath parameter to tell TableTools where to find the SWF file for copy and file save.
+
+
\ No newline at end of file
diff --git a/wqflask/wqflask/static/packages/TableTools/theme.html b/wqflask/wqflask/static/packages/TableTools/theme.html
new file mode 100755
index 00000000..fcda07a0
--- /dev/null
+++ b/wqflask/wqflask/static/packages/TableTools/theme.html
@@ -0,0 +1,524 @@
+
+
+
+
+
+
+ TableTools example
+
+
+
+
+
+
+
+
+
+
+ TableTools example - jQuery UI theming
+
+
+
Preamble
+
Like DataTables, TableTools can be styled by a jQuery UI theme. The required classes for the theming with TableTools are added automatically when the bJQueryUI option is detected from DataTables. This example shows that in action, and also defines a button collection to show the themeing there.