/*!
* Print button for Buttons and DataTables.
* 2015 SpryMedia Ltd - datatables.net/license
*/
(function($, DataTable) {
"use strict";
var _link = document.createElement( 'a' );
/**
* Convert a `link` tag's URL from a relative to an absolute address so it will
* work correctly in the popup window which has no base URL.
*
* @param {node} el Element to convert
*/
var _relToAbs = function( el ) {
var url;
var clone = $(el).clone()[0];
var linkHost;
if ( clone.nodeName.toLowerCase() === 'link' ) {
_link.href = clone.href;
linkHost = _link.host;
// IE doesn't have a trailing slash on the host
// Chrome has it on the pathname
if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
linkHost += '/';
}
clone.href = _link.protocol+"//"+linkHost+_link.pathname+_link.search;
}
return clone.outerHTML;
};
DataTable.ext.buttons.print = {
className: 'buttons-print',
text: function ( dt ) {
return dt.i18n( 'buttons.print', 'Print' );
},
action: function ( e, dt, button, config ) {
var data = dt.buttons.exportData( config.exportOptions );
var addRow = function ( d, tag ) {
var str = '
';
for ( var i=0, ien=d.length ; i'+d[i]+''+tag+'>';
}
return str + '
';
};
// Construct a table for printing
var html = '';
if ( config.header ) {
html += ''+ addRow( data.header, 'th' ) +'';
}
html += '';
for ( var i=0, ien=data.body.length ; i';
if ( config.footer ) {
html += ''+ addRow( data.footer, 'th' ) +'';
}
// Open a new window for the printable table
var win = window.open( '', '' );
var title = config.title.replace( '*', $('title').text() );
win.document.close();
// Inject the title and also a copy of the style and link tags from this
// document so the table can retain its base styling. Note that we have
// to use string manipulation as IE won't allow elements to be created
// in the host document and then appended to the new window.
var head = ''+title+'';
$('style, link').each( function () {
head += _relToAbs( this );
} );
$(win.document.head).html( head );
// Inject the table and other surrounding information
$(win.document.body).html(
''+title+'
'+
''+config.message+'
'+
html
);
if ( config.customize ) {
config.customize( win );
}
setTimeout( function () {
if ( config.autoPrint ) {
win.print(); // blocking - so close will not
win.close(); // execute until this is done
}
}, 250 );
},
title: '*',
message: '',
exportOptions: {},
header: true,
footer: false,
autoPrint: true,
customize: null
};
})(jQuery, jQuery.fn.dataTable);