/* jshint camelcase: false */
// Tweaks for integrating datatables + bootstrap
/* Default class modification */
(function (factory) {
  'use strict';
  require(['jquery', 'jquery.dataTables'], factory);
}(function ($) {
  'use strict';

  $.extend($.fn.dataTableExt.oStdClasses, {
    'sWrapper': 'dataTables_wrapper',
  });

  /* API method to get paging information */
  $.fn.dataTableExt.oApi.fnPagingInfo = function (oSettings) {
    return {
      "iStart": oSettings._iDisplayStart,
      "iEnd": oSettings.fnDisplayEnd(),
      "iLength": oSettings._iDisplayLength,
      "iTotal": oSettings.fnRecordsTotal(),
      "iFilteredTotal": oSettings.fnRecordsDisplay(),
      "iPage": Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength),
      "iTotalPages": Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength),
    };
  };

  /* Bootstrap style pagination control */
  $.extend($.fn.dataTableExt.oPagination, {
    "bootstrap": {
      "fnInit": function (oSettings, nPaging, fnDraw) {
        var oLang = oSettings.oLanguage.oPaginate;
        var fnClickHandler = function (e) {
          e.preventDefault();
          if (oSettings.oApi._fnPageChange(oSettings, e.data.action)) {
            fnDraw(oSettings);
          }
        };

        $(nPaging).append(
            '<ul class="pagination">' +
            '<li class="prev disabled"><a href="#">&larr; ' + oLang.sPrevious + '</a></li>' +
            '<li class="next disabled"><a href="#">' + oLang.sNext + ' &rarr; </a></li>' +
            '</ul>'
        );
        var els = $('a', nPaging);
        $(els[0]).bind('click.DT', {action: "previous"}, fnClickHandler);
        $(els[1]).bind('click.DT', {action: "next"}, fnClickHandler);
      },

      "fnUpdate": function (oSettings, fnDraw) {
        var iListLength = 5;
        var oPaging = oSettings.oInstance.fnPagingInfo();
        var an = oSettings.aanFeatures.p;
        var i;
        var j;
        var iLen;
        var sClass;
        var iStart;
        var iEnd;
        var iHalf = Math.floor(iListLength / 2);

        if (oPaging.iTotalPages < iListLength) {
          iStart = 1;
          iEnd = oPaging.iTotalPages;
        } else if (oPaging.iPage <= iHalf) {
          iStart = 1;
          iEnd = iListLength;
        } else if (oPaging.iPage >= (oPaging.iTotalPages - iHalf)) {
          iStart = oPaging.iTotalPages - iListLength + 1;
          iEnd = oPaging.iTotalPages;
        } else {
          iStart = oPaging.iPage - iHalf + 1;
          iEnd = iStart + iListLength - 1;
        }

        for (i = 0, iLen = an.length; i < iLen; i++) {
          // Remove the middle elements
          $('li:gt(0)', an[i]).filter(':not(:last)').remove();

          // Add the new list items and their event handlers
          for (j = iStart; j <= iEnd; j++) {
            sClass = (j == oPaging.iPage + 1) ? 'class="active"' : '';
            $('<li ' + sClass + '><a href="#">' + j + '</a></li>')
                .insertBefore($('li:last', an[i])[0])
                .bind('click', function (e) {
                  e.preventDefault();
                  oSettings._iDisplayStart = (parseInt($('a', this).text(), 10) - 1) * oPaging.iLength;
                  fnDraw(oSettings);
                });
          }

          // Add / remove disabled classes from the static elements
          if (oPaging.iPage === 0) {
            $('li:first', an[i]).addClass('disabled');
          } else {
            $('li:first', an[i]).removeClass('disabled');
          }

          if (oPaging.iPage === oPaging.iTotalPages - 1 || oPaging.iTotalPages === 0) {
            $('li:last', an[i]).addClass('disabled');
          } else {
            $('li:last', an[i]).removeClass('disabled');
          }
        }
      },
    },
  });

  /* datatable: sort types and filters */
  $.extend($.fn.dataTableExt.oSort, {
    'string-non-null-pre': $.fn.dataTableExt.oSort['html-pre'],
    'string-non-null-asc': function (x, y) {
      if (x == y) {
        return 0;
      } else if (x == '') {
        return -1;
      } else if (y == '') {
        return 1;
      }
      return $.fn.dataTableExt.oSort['string-asc'](x, y);
    },
    'string-non-null-desc': function (x, y) {
      if (x == y) {
        return 0;
      } else if (!x) {
        return 1;
      } else if (!y) {
        return -1;
      }
      return $.fn.dataTableExt.oSort['string-desc'](x, y);
    },
  });
}));
