/*! DataTables Bootstrap 3 integration
 * ©2011-2015 SpryMedia Ltd - datatables.net/license
 */

/**
 * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
 * DataTables 1.10 or newer.
 *
 * This file sets the defaults and adds options to DataTables to style its
 * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
 * 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, which attaches to jQuery, including
				// jQuery if needed and have a $ property so we can access the
				// jQuery object that is used
				$ = 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;
	
	
	/* Set the defaults for DataTables initialisation */
	$.extend(true, DataTable.defaults, {
		dom: "<'row'<'col-sm-6'l><'col-sm-6'f>>" +
		"<'row'<'col-sm-12'tr>>" +
		"<'row'<'col-sm-5'i><'col-sm-7'p>>",
		renderer: 'bootstrap'
	});
	
	
	/* Default class modification */
	$.extend(DataTable.ext.classes, {
		sWrapper: "dataTables_wrapper form-inline dt-bootstrap",
		sFilterInput: "form-control input-sm",
		sLengthSelect: "form-control input-sm",
		sProcessing: "dataTables_processing panel panel-default"
	});
	
	
	/* Bootstrap paging button renderer */
	DataTable.ext.renderer.pageButton.bootstrap = function (settings, host, idx, buttons, page, pages)
	{
		var api = new DataTable.Api(settings);
		var classes = settings.oClasses;
		var lang = settings.oLanguage.oPaginate;
		var aria = settings.oLanguage.oAria.paginate || {};
		var btnDisplay, btnClass, counter = 0;
		
		var attach = function (container, buttons)
		{
			var i, ien, node, button;
			var clickHandler = function (e)
			{
				e.preventDefault();
				if (!$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action) {
					api.page(e.data.action).draw('page');
				}
			};
			
			for (i = 0, ien = buttons.length; i < ien; i++) {
				button = buttons[i];
				
				if ($.isArray(button)) {
					attach(container, button);
				}
				else {
					btnDisplay = '';
					btnClass = '';
					
					switch (button) {
						case 'ellipsis':
							btnDisplay = '&#x2026;';
							btnClass = 'disabled';
							break;
						
						case 'first':
							btnDisplay = lang.sFirst;
							btnClass = button + (page > 0 ?
									'' : ' disabled');
							break;
						
						case 'previous':
							btnDisplay = lang.sPrevious;
							btnClass = button + (page > 0 ?
									'' : ' disabled');
							break;
						
						case 'next':
							btnDisplay = lang.sNext;
							btnClass = button + (page < pages - 1 ?
									'' : ' disabled');
							break;
						
						case 'last':
							btnDisplay = lang.sLast;
							btnClass = button + (page < pages - 1 ?
									'' : ' disabled');
							break;
						
						default:
							btnDisplay = button + 1;
							btnClass = page === button ?
								'active' : '';
							break;
					}
					
					if (btnDisplay) {
						node = $('<li>', {
							'class': classes.sPageButton + ' ' + btnClass,
							'id': idx === 0 && typeof button === 'string' ?
							settings.sTableId + '_' + button :
								null
						})
							.append($('<a>', {
									'href': '#',
									'aria-controls': settings.sTableId,
									'aria-label': aria[button],
									'data-dt-idx': counter,
									'tabindex': settings.iTabIndex
								})
									.html(btnDisplay)
							)
							.appendTo(container);
						
						settings.oApi._fnBindAction(
							node, {action: button}, clickHandler
						);
						
						counter++;
					}
				}
			}
		};
		
		// IE9 throws an 'unknown error' if document.activeElement is used
		// inside an iframe or frame. 
		var activeEl;
		
		try {
			// Because this approach is destroying and recreating the paging
			// elements, focus is lost on the select button which is bad for
			// accessibility. So we want to restore focus once the draw has
			// completed
			activeEl = $(host).find(document.activeElement).data('dt-idx');
		}
		catch (e) {
		}
		
		attach(
			$(host).empty().html('<ul class="pagination"/>').children('ul'),
			buttons
		);
		
		if (activeEl) {
			$(host).find('[data-dt-idx=' + activeEl + ']').focus();
		}
	};
	
	
	/*
	 * TableTools Bootstrap compatibility
	 * Required TableTools 2.1+
	 */
	if (DataTable.TableTools) {
		// Set the classes that TableTools uses to something suitable for Bootstrap
		$.extend(true, DataTable.TableTools.classes, {
			"container": "DTTT btn-group",
			"buttons": {
				"normal": "btn btn-default",
				"disabled": "disabled"
			},
			"collection": {
				"container": "DTTT_dropdown dropdown-menu",
				"buttons": {
					"normal": "",
					"disabled": "disabled"
				}
			},
			"print": {
				"info": "DTTT_print_info"
			},
			"select": {
				"row": "active"
			}
		});
		
		// Have the collection use a bootstrap compatible drop down
		$.extend(true, DataTable.TableTools.DEFAULTS.oTags, {
			"collection": {
				"container": "ul",
				"button": "li",
				"liner": "a"
			}
		});
	}
	
	
	return DataTable;
}));