/* --------------------------------------------------------------
 datatable_custom_sorting.js 2016-06-20
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2016 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * ## Enable Custom DataTable Sorting
 *
 * DataTables will reset the table to the first page after sorting by default. As there is no way to override
 * this behavior, this module will remove the DataTable sorting event handlers and set its own, which will keep
 * the table to the current page. This module will also set a sort parameter to the URL on sorting change but will
 * not parse it during initialization. This must happen from the module that initializes the table.
 *
 * Important: This method will remove the click event from the "th.sorting" elements, so bind extra "click" events
 * after enabling the custom-sorting extension (on init.dt event).
 * 
 * ### Events
 * 
 * ```javascript
 * // Add custom callback once the column sorting was changed (the "info" object contains the column index,  
 * // column name and sort direction: {index, name, direction}).
 * $('#datatable-instance').on('datatable_custom_sorting:change', function(event, info) {...}); 
 * ```
 *
 * @module Admin/Extensions/datatable_custom_sorting
 */
gx.extensions.module('datatable_custom_sorting', [], function(data) {
	
	'use strict';
	
	// ------------------------------------------------------------------------
	// VARIABLES
	// ------------------------------------------------------------------------
	
	/**
	 * Module Selector
	 *
	 * @type {jQuery}
	 */
	const $this = $(this);
	
	/**
	 * Module Instance
	 *
	 * @type {Object}
	 */
	const module = {};
	
	// ------------------------------------------------------------------------
	// FUNCTIONS
	// ------------------------------------------------------------------------
	
	/**
	 * On Table Header Cell Click
	 *
	 * Perform the table sorting without changing the current page.
	 */
	function _onTableHeaderCellClick() {
		// Change Table Order
		const index = $(this).index();
		const destination = $(this).hasClass('sorting_asc') ? 'desc' : 'asc';
		
		$this.DataTable().order([index, destination]).draw(false);
		
		// Trigger Event 
		const order = $this.DataTable().order()[0];
		const {columns} = $this.DataTable().init();
		const info = {
			index: order[0],
			name: columns[order[0]].name,
			direction: order[1]
		};
		
		$this.trigger('datatable_custom_sorting:change', [info]);
	}
	
	// ------------------------------------------------------------------------
	// INITIALIZATION
	// ------------------------------------------------------------------------
	
	module.init = function(done) {
		$this.on('preInit.dt', () => {
			$this.find('thead tr:first th.sorting')
				.off('click')
				.on('click', _onTableHeaderCellClick);
		});
		
		done();
	};
	
	return module;
	
});