text: (function ($) {
    // register namespace
    $.extend(true, window, {
      "Slick": {
        "CheckboxSelectColumn": CheckboxSelectColumn
      }
    });
  
  
    function CheckboxSelectColumn(options) {
      var _grid;
      var _self = this;
      var _handler = new Slick.EventHandler();
      var _selectedRowsLookup = {};
      var _defaults = {
        columnId: "_checkbox_selector",
        cssClass: null,
        selectAll: true,
        toolTip: "Select/Deselect All",
        width: 30
      };
  
      var _options = $.extend(true, {}, _defaults, options);
  
      function init(grid) {
        _grid = grid;
        _handler
          .subscribe(_grid.onSelectedRowsChanged, handleSelectedRowsChanged)
          .subscribe(_grid.onClick, handleClick)
          .subscribe(_grid.onHeaderClick, handleHeaderClick)
          .subscribe(_grid.onKeyDown, handleKeyDown);
      }
  
      function destroy() {
        _handler.unsubscribeAll();
      }
  
      function handleSelectedRowsChanged(e, args) {
        var selectedRows = _grid.getSelectedRows();
        var lookup = {}, row, i;
        for (i = 0; i < selectedRows.length; i++) {
          row = selectedRows[i];
          lookup[row] = true;
          if (lookup[row] !== _selectedRowsLookup[row]) {
            _grid.invalidateRow(row);
            delete _selectedRowsLookup[row];
          }
        }
        for (i in _selectedRowsLookup) {
          _grid.invalidateRow(i);
        }
        _selectedRowsLookup = lookup;
        _grid.render();
  
        if (_options.selectAll) {
          if (selectedRows.length && selectedRows.length == _grid.getDataLength()) {
            _grid.updateColumnHeader(_options.columnId, "<input type='checkbox' checked='checked'>", _options.toolTip);
          } else {
            _grid.updateColumnHeader(_options.columnId, "<input type='checkbox'>", _options.toolTip);
          }
        }
      }
  
      function handleKeyDown(e, args) {
        if (e.which == 32) {
          if (_grid.getColumns()[args.cell].id === _options.columnId) {
            // if editing, try to commit
            if (!_grid.getEditorLock().isActive() || _grid.getEditorLock().commitCurrentEdit()) {
              toggleRowSelection(args.row);
            }
            e.preventDefault();
            e.stopImmediatePropagation();
          }
        }
      }
  
      function handleClick(e, args) {
        // clicking on a row select checkbox
        if (_grid.getColumns()[args.cell].id === _options.columnId && $(e.target).is(":checkbox")) {
          // if editing, try to commit
          if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
            e.preventDefault();
            e.stopImmediatePropagation();
            return;
          }
  
          toggleRowSelection(args.row);
          e.stopPropagation();
          e.stopImmediatePropagation();
        }
      }
  
      function toggleRowSelection(row) {
        if (_selectedRowsLookup[row]) {
          _grid.setSelectedRows($.grep(_grid.getSelectedRows(), function (n) {
            return n != row
          }));
        } else {
          _grid.setSelectedRows(_grid.getSelectedRows().concat(row));
        }
      }
  
      function handleHeaderClick(e, args) {
        if (args.column.id == _options.columnId && $(e.target).is(":checkbox")) {
          // if editing, try to commit
          if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) {
            e.preventDefault();
            e.stopImmediatePropagation();
            return;
          }
  
          if ($(e.target).is(":checked")) {
            var rows = [];
            for (var i = 0; i < _grid.getDataLength(); i++) {
              rows.push(i);
            }
            _grid.setSelectedRows(rows);
          } else {
            _grid.setSelectedRows([]);
          }
          e.stopPropagation();
          e.stopImmediatePropagation();
        }
      }
  
      function getColumnDefinition() {
        return {
          id: _options.columnId,
          name: _options.selectAll ? "<input type='checkbox'>" : "",
          toolTip: _options.toolTip,
          field: "sel",
          width: _options.width,
          resizable: false,
          sortable: false,
          cssClass: _options.cssClass,
          formatter: checkboxSelectionFormatter
        };
      }
  
      function checkboxSelectionFormatter(row, cell, value, columnDef, dataContext) {
        if (dataContext) {
          return _selectedRowsLookup[row]
              ? "<input type='checkbox' checked='checked'>"
              : "<input type='checkbox'>";
        }
        return null;
      }
  
      $.extend(this, {
        "init": init,
        "destroy": destroy,
  
        "getColumnDefinition": getColumnDefinition
      });
    }
  })(jQuery);