// Process a jQuery element's text for CSV:
$.prototype.getCellText = function()
{
    var a = this.text();

    ["\n", "\t", "\r"].forEach(
        function (i) {
            a = a.replaceAll(i, "")
        });

    a = a.replace(/\s+/ig, " ").trim();
    a = a.replace(/\"/ig, "\"\"");
    return a;
};

String.prototype.includesAll = function(parts)
{
    var parent      = this;
    var parts       = parts.split(" ");
    var contains    = true;

    parts.forEach((part, i) => {
        if (!parent.toLowerCase().includes(part.toLowerCase()))
            contains = false;
    });

    return contains;
};

// Trigger downloading a table as CSV:
$.prototype.exportCSV = function(options)
{
    options = options || {};

    if (this.prop("tagName") !== "TABLE")
        throw "Element is not a table so it is not being exported.";

    var output = "";

    if (options.warning)
        output += `; ${options.warning}\n`;

    this.find("thead tr").each(function(i1, x1) {
        x1 = $(x1);

        x1.find("th").each(function(i2, x2) {
            x2 = $(x2);
            var cellText = x2.getCellText();
            output += `\"${cellText}\",`;
        });

        output += "\n";
    });

    this.find("tbody tr").each(function(i1, x1) {
        x1 = $(x1);

        if (!x1.is(":visible"))
            return;

        x1.find("td").each(function(i2, x2) {
            x2 = $(x2);
            var cellText = x2.getCellText();
            output += `\"${cellText}\",`;
        });

        output += "\n";
    });

    var filename = moment().format("yyyyMMDDhhmm");

    if (typeof(options.name) === "string")
        filename = `${filename}_${options.name}`;

    var blob    = new Blob([output], {type: "text/csv"});
    var a       = document.createElement("a");

    a.download  = `${filename}.csv`;
    a.href      = window.URL.createObjectURL(blob);
    a.click();
};
