/*! DataTables jQuery UI integration
 * ©2011-2014 SpryMedia Ltd - datatables.net/license
 */

/**
 * DataTables integration for jQuery UI. This requires jQuery UI and
 * DataTables 1.10 or newer.
 *
 * This file sets the defaults and adds options to DataTables to style its
 * controls using jQuery UI. See http://datatables.net/manual/styling/jqueryui
 * 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.net")(root, $).$;
      }

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

  var sort_prefix = "css_right ui-icon ui-icon-";
  var toolbar_prefix =
    "fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-";

  /* Set the defaults for DataTables initialisation */
  $.extend(true, DataTable.defaults, {
    dom:
      '<"' +
      toolbar_prefix +
      'tl ui-corner-tr"lfr>' +
      "t" +
      '<"' +
      toolbar_prefix +
      'bl ui-corner-br"ip>',
    renderer: "jqueryui",
  });

  $.extend(DataTable.ext.classes, {
    sWrapper: "dataTables_wrapper dt-jqueryui",

    /* Full numbers paging buttons */
    sPageButton: "fg-button ui-button ui-state-default",
    sPageButtonActive: "ui-state-disabled",
    sPageButtonDisabled: "ui-state-disabled",

    /* Features */
    sPaging:
      "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi " +
      "ui-buttonset-multi paging_" /* Note that the type is postfixed */,

    /* Sorting */
    sSortAsc: "ui-state-default sorting_asc",
    sSortDesc: "ui-state-default sorting_desc",
    sSortable: "ui-state-default sorting",
    sSortableAsc: "ui-state-default sorting_asc_disabled",
    sSortableDesc: "ui-state-default sorting_desc_disabled",
    sSortableNone: "ui-state-default sorting_disabled",
    sSortIcon: "DataTables_sort_icon",

    /* Scrolling */
    sScrollHead: "dataTables_scrollHead " + "ui-state-default",
    sScrollFoot: "dataTables_scrollFoot " + "ui-state-default",

    /* Misc */
    sHeaderTH: "ui-state-default",
    sFooterTH: "ui-state-default",
  });

  DataTable.ext.renderer.header.jqueryui = function (
    settings,
    cell,
    column,
    classes
  ) {
    // Calculate what the unsorted class should be
    var noSortAppliedClass = sort_prefix + "caret-2-n-s";
    var asc = $.inArray("asc", column.asSorting) !== -1;
    var desc = $.inArray("desc", column.asSorting) !== -1;

    if (!column.bSortable || (!asc && !desc)) {
      noSortAppliedClass = "";
    } else if (asc && !desc) {
      noSortAppliedClass = sort_prefix + "caret-1-n";
    } else if (!asc && desc) {
      noSortAppliedClass = sort_prefix + "caret-1-s";
    }

    // Setup the DOM structure
    $("<div/>")
      .addClass("DataTables_sort_wrapper")
      .append(cell.contents())
      .append(
        $("<span/>").addClass(classes.sSortIcon + " " + noSortAppliedClass)
      )
      .appendTo(cell);

    // Attach a sort listener to update on sort
    $(settings.nTable).on("order.dt", function (e, ctx, sorting, columns) {
      if (settings !== ctx) {
        return;
      }

      var colIdx = column.idx;

      cell
        .removeClass(classes.sSortAsc + " " + classes.sSortDesc)
        .addClass(
          columns[colIdx] == "asc"
            ? classes.sSortAsc
            : columns[colIdx] == "desc"
            ? classes.sSortDesc
            : column.sSortingClass
        );

      cell
        .find("span." + classes.sSortIcon)
        .removeClass(
          sort_prefix +
            "triangle-1-n" +
            " " +
            sort_prefix +
            "triangle-1-s" +
            " " +
            sort_prefix +
            "caret-2-n-s" +
            " " +
            sort_prefix +
            "caret-1-n" +
            " " +
            sort_prefix +
            "caret-1-s"
        )
        .addClass(
          columns[colIdx] == "asc"
            ? sort_prefix + "triangle-1-n"
            : columns[colIdx] == "desc"
            ? sort_prefix + "triangle-1-s"
            : noSortAppliedClass
        );
    });
  };

  /*
   * TableTools jQuery UI compatibility
   * Required TableTools 2.1+
   */
  if (DataTable.TableTools) {
    $.extend(true, DataTable.TableTools.classes, {
      container: "DTTT_container ui-buttonset ui-buttonset-multi",
      buttons: {
        normal: "DTTT_button ui-button ui-state-default",
      },
      collection: {
        container: "DTTT_collection ui-buttonset ui-buttonset-multi",
      },
    });
  }

  return DataTable;
});
