text: /***
  Wrapper/Helper Class for datagrid based on jQuery Datatable Plugin
  ***/
  var Datatable = function() {
  
      var tableOptions; // main options
      var dataTable; // datatable object
      var table; // actual table jquery object
      var tableContainer; // actual table container object
      var tableWrapper; // actual table wrapper jquery object
      var tableInitialized = false;
      var ajaxParams = {}; // set filter mode
      var the;
  
      var countSelectedRecords = function() {
          var selected = $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).size();
          var text = tableOptions.dataTable.language.metronicGroupActions;
          if (selected > 0) {
              $('.table-group-actions > span', tableWrapper).text(text.replace("_TOTAL_", selected));
          } else {
              $('.table-group-actions > span', tableWrapper).text("");
          }
      };
  
      return {
  
          //main function to initiate the module
          init: function(options) {
  
              if (!$().dataTable) {
                  return;
              }
  
              the = this;
  
              // default sms_setting
              options = $.extend(true, {
                  src: "", // actual table  
                  filterApplyAction: "filter",
                  filterCancelAction: "filter_cancel",
                  resetGroupActionInputOnSuccess: true,
                  loadingMessage: 'Loading...',
                  dataTable: {
                      "dom": "<'row'<'col-md-8 col-sm-12'pli><'col-md-4 col-sm-12'<'table-group-actions pull-right'>>r><'table-responsive't><'row'<'col-md-8 col-sm-12'pli><'col-md-4 col-sm-12'>>", // datatable layout
                      "pageLength": 10, // default records per page
                      "language": { // language sms_setting
                          // metronic spesific
                          "metronicGroupActions": "_TOTAL_ records selected:  ",
                          "metronicAjaxRequestGeneralError": "Could not complete request. Please check your internet connection",
  
                          // data tables spesific
                          "lengthMenu": "<span class='seperator'>|</span>View _MENU_ records",
                          "info": "<span class='seperator'>|</span>Found total _TOTAL_ records",
                          "infoEmpty": "No records found to show",
                          "emptyTable": "No data available in table",
                          "zeroRecords": "No matching records found",
                          "paginate": {
                              "previous": "Prev",
                              "next": "Next",
                              "last": "Last",
                              "first": "First",
                              "page": "Page",
                              "pageOf": "of"
                          }
                      },
  
                      "orderCellsTop": true,
                      "columnDefs": [{ // define columns sorting options(by default all columns are sortable extept the first checkbox column)
                          'orderable': false,
                          'targets': [0]
                      }],
  
                      "pagingType": "bootstrap_extended", // pagination type(bootstrap, bootstrap_full_number or bootstrap_extended)
                      "autoWidth": false, // disable fixed width and enable fluid table
                      "processing": false, // enable/disable display message box on record load
                      "serverSide": true, // enable/disable server side ajax loading
  
                      "ajax": { // define ajax sms_setting
                          "url": "", // ajax URL
                          "type": "POST", // request type
                          "timeout": 20000,
                          "data": function(data) { // add request parameters before submit
                              $.each(ajaxParams, function(key, value) {
                                  console.log(value);
                                  data[key] = value;
                              });
                              App.blockUI({
                                  message: tableOptions.loadingMessage,
                                  target: tableContainer,
                                  overlayColor: 'none',
                                  cenrerY: true,
                                  boxed: true
                              });
                          },
                          "dataSrc": function(res) { // Manipulate the data returned from the server
                              if (res.customActionMessage) {
                                  App.alert({
                                      type: (res.customActionStatus == 'OK' ? 'success' : 'danger'),
                                      icon: (res.customActionStatus == 'OK' ? 'check' : 'warning'),
                                      message: res.customActionMessage,
                                      container: tableWrapper,
                                      place: 'prepend'
                                  });
                              }
  
                              if (res.customActionStatus) {
                                  if (tableOptions.resetGroupActionInputOnSuccess) {
                                      $('.table-group-action-input', tableWrapper).val("");
                                  }
                              }
  
                              if ($('.group-checkable', table).size() === 1) {
                                  $('.group-checkable', table).attr("checked", false);
                              }
  
                              if (tableOptions.onSuccess) {
                                  tableOptions.onSuccess.call(undefined, the, res);
                              }
  
                              App.unblockUI(tableContainer);
  
                              return res.data;
                          },
                          "error": function() { // handle general connection errors
                              if (tableOptions.onError) {
                                  tableOptions.onError.call(undefined, the);
                              }
  
                              App.alert({
                                  type: 'danger',
                                  icon: 'warning',
                                  message: tableOptions.dataTable.language.metronicAjaxRequestGeneralError,
                                  container: tableWrapper,
                                  place: 'prepend'
                              });
  
                              App.unblockUI(tableContainer);
                          }
                      },
  
                      "drawCallback": function(oSettings) { // run some code on table redraw
                          if (tableInitialized === false) { // check if table has been initialized
                              tableInitialized = true; // set table initialized
                              table.show(); // display table
                          }
                          countSelectedRecords(); // reset selected records indicator
  
                          // callback for ajax data load
                          if (tableOptions.onDataLoad) {
                              tableOptions.onDataLoad.call(undefined, the);
                          }
                      }
                  }
              }, options);
  
              tableOptions = options;
  
              // create table's jquery object
              table = $(options.src);
              tableContainer = table.parents(".table-container");
  
              // apply the special class that used to restyle the default datatable
              var tmp = $.fn.dataTableExt.oStdClasses;
  
              $.fn.dataTableExt.oStdClasses.sWrapper = $.fn.dataTableExt.oStdClasses.sWrapper + " dataTables_extended_wrapper";
              $.fn.dataTableExt.oStdClasses.sFilterInput = "form-control input-xs input-sm input-inline";
              $.fn.dataTableExt.oStdClasses.sLengthSelect = "form-control input-xs input-sm input-inline";
  
              // initialize a datatable
              dataTable = table.DataTable(options.dataTable);
  
              // revert back to default
              $.fn.dataTableExt.oStdClasses.sWrapper = tmp.sWrapper;
              $.fn.dataTableExt.oStdClasses.sFilterInput = tmp.sFilterInput;
              $.fn.dataTableExt.oStdClasses.sLengthSelect = tmp.sLengthSelect;
  
              // get table wrapper
              tableWrapper = table.parents('.dataTables_wrapper');
  
              // build table group actions panel
              if ($('.table-actions-wrapper', tableContainer).size() === 1) {
                  $('.table-group-actions', tableWrapper).html($('.table-actions-wrapper', tableContainer).html()); // place the panel inside the wrapper
                  $('.table-actions-wrapper', tableContainer).remove(); // remove the template container
              }
              // handle group checkboxes check/uncheck
              $('.group-checkable', table).change(function() {
                  var set = table.find('tbody > tr > td:nth-child(1) input[type="checkbox"]');
                  var checked = $(this).prop("checked");
                  $(set).each(function() {
                      $(this).prop("checked", checked);
                  });
                  countSelectedRecords();
              });
  
              // handle row's checkbox click
              table.on('change', 'tbody > tr > td:nth-child(1) input[type="checkbox"]', function() {
                  countSelectedRecords();
              });
  
              // handle filter submit button click
              table.on('click', '.filter-submit', function(e) {
                  e.preventDefault();
                  the.submitFilter();
              });
  
              // handle filter cancel button click
              table.on('click', '.filter-cancel', function(e) {
                  e.preventDefault();
                  the.resetFilter();
              });
          },
  
          submitFilter: function() {
              the.setAjaxParam("action", tableOptions.filterApplyAction);
  
              // get all typeable inputs
              $('textarea.form-filter, select.form-filter, input.form-filter:not([type="radio"],[type="checkbox"])', table).each(function() {
                  the.setAjaxParam($(this).attr("name"), $(this).val());
              });
  
              // get all checkboxes
              $('input.form-filter[type="checkbox"]:checked', table).each(function() {
                  the.addAjaxParam($(this).attr("name"), $(this).val());
              });
  
              // get all radio buttons
              $('input.form-filter[type="radio"]:checked', table).each(function() {
                  the.setAjaxParam($(this).attr("name"), $(this).val());
              });
  
              dataTable.ajax.reload();
          },
  
          resetFilter: function() {
              $('textarea.form-filter, select.form-filter, input.form-filter', table).each(function() {
                  $(this).val("");
              });
              $('input.form-filter[type="checkbox"]', table).each(function() {
                  $(this).attr("checked", false);
              });
              the.clearAjaxParams();
              the.addAjaxParam("action", tableOptions.filterCancelAction);
              dataTable.ajax.reload();
          },
  
          getSelectedRowsCount: function() {
              return $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).size();
          },
  
          getSelectedRows: function() {
              var rows = [];
              $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).each(function() {
                  rows.push($(this).val());
              });
  
              return rows;
          },
  
          setAjaxParam: function(name, value) {
              ajaxParams[name] = value;
          },
  
          addAjaxParam: function(name, value) {
              if (!ajaxParams[name]) {
                  ajaxParams[name] = [];
              }
  
              skip = false;
              for (var i = 0; i < (ajaxParams[name]).length; i++) { // check for duplicates
                  if (ajaxParams[name][i] === value) {
                      skip = true;
                  }
              }
  
              if (skip === false) {
                  ajaxParams[name].push(value);
              }
          },
  
          clearAjaxParams: function(name, value) {
              ajaxParams = {};
          },
  
          getDataTable: function() {
              return dataTable;
          },
  
          getTableWrapper: function() {
              return tableWrapper;
          },
  
          gettableContainer: function() {
              return tableContainer;
          },
  
          getTable: function() {
              return table;
          }
  
      };
  
  };