Subversion-Projekte lars-tiefland.cienc

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

/*!
 * 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 = '<tr>';

                        for ( var i=0, ien=d.length ; i<ien ; i++ ) {
                                str += '<'+tag+'>'+d[i]+'</'+tag+'>';
                        }

                        return str + '</tr>';
                };

                // Construct a table for printing
                var html = '<table class="'+dt.table().node().className+'">';

                if ( config.header ) {
                        html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
                }

                html += '<tbody>';
                for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
                        html += addRow( data.body[i], 'td' );
                }
                html += '</tbody>';

                if ( config.footer ) {
                        html += '<thead>'+ addRow( data.footer, 'th' ) +'</thead>';
                }

                // 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>'+title+'</title>';
                $('style, link').each( function () {
                        head += _relToAbs( this );
                } );

                $(win.document.head).html( head );

                // Inject the table and other surrounding information
                $(win.document.body).html(
                        '<h1>'+title+'</h1>'+
                        '<div>'+config.message+'</div>'+
                        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);