/*! DataTables Bootstrap 4 integration
 * ©2011-2017 SpryMedia Ltd - datatables.net/license
 */

/**
 * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and
 * DataTables 1.10 or newer.
 *
 * This file sets the defaults and adds options to DataTables to style its
 * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
 * for further information.
 */
(function (factory) {
  if (typeof define === "function" && define.amd) {
    // AMD
    define(["jquery", "datatables.net"], function ($) {
      return factory($, window, document);
    });
  } else if (typeof exports === "object") {
    // CommonJS
    module.exports = function (root, $) {
      if (!root) {
        root = window;
      }

      if (!$ || !$.fn.dataTable) {
        // Require DataTables, which attaches to jQuery, including
        // jQuery if needed and have a $ property so we can access the
        // jQuery object that is used
        $ = require("datatables.net")(root, $).$;
      }

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

  /* Set the defaults for DataTables initialisation */
  $.extend(true, DataTable.defaults, {
    dom:
      "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
      "<'row'<'col-sm-12'tr>>" +
      "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
    renderer: "bootstrap",
  });

  /* Default class modification */
  $.extend(DataTable.ext.classes, {
    sWrapper: "dataTables_wrapper dt-bootstrap4",
    sFilterInput: "form-control form-control-sm",
    sLengthSelect:
      "custom-select custom-select-sm form-control form-control-sm",
    sProcessing: "dataTables_processing card",
    sPageButton: "paginate_button page-item",
  });

  /* Bootstrap paging button renderer */
  DataTable.ext.renderer.pageButton.bootstrap = function (
    settings,
    host,
    idx,
    buttons,
    page,
    pages
  ) {
    var api = new DataTable.Api(settings);
    var classes = settings.oClasses;
    var lang = settings.oLanguage.oPaginate;
    var aria = settings.oLanguage.oAria.paginate || {};
    var btnDisplay,
      btnClass,
      counter = 0;

    var attach = function (container, buttons) {
      var i, ien, node, button;
      var clickHandler = function (e) {
        e.preventDefault();
        if (
          !$(e.currentTarget).hasClass("disabled") &&
          api.page() != e.data.action
        ) {
          api.page(e.data.action).draw("page");
        }
      };

      for (i = 0, ien = buttons.length; i < ien; i++) {
        button = buttons[i];

        if ($.isArray(button)) {
          attach(container, button);
        } else {
          btnDisplay = "";
          btnClass = "";

          switch (button) {
            case "ellipsis":
              btnDisplay = "&#x2026;";
              btnClass = "disabled";
              break;

            case "first":
              btnDisplay = lang.sFirst;
              btnClass = button + (page > 0 ? "" : " disabled");
              break;

            case "previous":
              btnDisplay = lang.sPrevious;
              btnClass = button + (page > 0 ? "" : " disabled");
              break;

            case "next":
              btnDisplay = lang.sNext;
              btnClass = button + (page < pages - 1 ? "" : " disabled");
              break;

            case "last":
              btnDisplay = lang.sLast;
              btnClass = button + (page < pages - 1 ? "" : " disabled");
              break;

            default:
              btnDisplay = button + 1;
              btnClass = page === button ? "active" : "";
              break;
          }

          if (btnDisplay) {
            node = $("<li>", {
              class: classes.sPageButton + " " + btnClass,
              id:
                idx === 0 && typeof button === "string"
                  ? settings.sTableId + "_" + button
                  : null,
            })
              .append(
                $("<a>", {
                  href: "#",
                  "aria-controls": settings.sTableId,
                  "aria-label": aria[button],
                  "data-dt-idx": counter,
                  tabindex: settings.iTabIndex,
                  class: "page-link",
                }).html(btnDisplay)
              )
              .appendTo(container);

            settings.oApi._fnBindAction(node, { action: button }, clickHandler);

            counter++;
          }
        }
      }
    };

    // IE9 throws an 'unknown error' if document.activeElement is used
    // inside an iframe or frame.
    var activeEl;

    try {
      // Because this approach is destroying and recreating the paging
      // elements, focus is lost on the select button which is bad for
      // accessibility. So we want to restore focus once the draw has
      // completed
      activeEl = $(host).find(document.activeElement).data("dt-idx");
    } catch (e) {}

    attach(
      $(host).empty().html('<ul class="pagination"/>').children("ul"),
      buttons
    );

    if (activeEl !== undefined) {
      $(host)
        .find("[data-dt-idx=" + activeEl + "]")
        .focus();
    }
  };

  return DataTable;
});
