/*! AlphabetSearch for DataTables v1.2.4 * 2014 SpryMedia Ltd - datatables.net/license * Gyrocode - MIT License */ /** * @summary AlphabetSearch * @description Show an set of alphabet buttons alongside a table providing * search input options * @version 1.2.4 * @file dataTables.alphabetSearch.js * @author SpryMedia Ltd (www.sprymedia.co.uk) * @contact www.sprymedia.co.uk/contact * @copyright Copyright 2014 SpryMedia Ltd. * @author Gyrocode (www.gyrocode.com) * @contact www.gyrocode.com/contacts * @copyright Copyright (c) Gyrocode * * License MIT - http://datatables.net/license/mit * * For more detailed information please see: * https://www.gyrocode.com/projects/jquery-datatables-alphabetsearch/ */ (function(){ // Search function $.fn.dataTable.Api.register( 'alphabetSearch()', function ( searchTerm ) { this.iterator( 'table', function ( context ) { context.alphabetSearch.letter = searchTerm; } ); return this; } ); // Recalculate the alphabet display for updated data $.fn.dataTable.Api.register( 'alphabetSearch.recalc()', function () { this.iterator( 'table', function ( context ) { draw( new $.fn.dataTable.Api( context ), $('div.alphabet', this.table().container()), context ); } ); return this; } ); // Search plug-in $.fn.dataTable.ext.search.push( function ( context, searchData ) { // Ensure that table has alphabet search feature enabled if ( ! context.hasOwnProperty('alphabetSearch') ) { return true; } // Ensure that there is a search applied to this table before running it if ( ! context.alphabetSearch.letterSearch ) { return true; } var letter = searchData[context.alphabetSearch.column] .toString() .replace(/<.*?>/g, '') .charAt(0).toUpperCase(); if(context.alphabetSearch.letterSearch !== '#'){ if ( letter === context.alphabetSearch.letterSearch ) { return true; } } else { if(/\d/.test(letter)){ return true; } } return false; } ); // Order plug-in // // NOTES: If sorting by alphabetized column // there would be two calls to this method $.fn.dataTable.ext.order['alphabetSearch'] = function ( context, col ) { var order_col = this.api().order()[0][0]; var order_method = this.api().order()[0][1]; // If sorting by column other than the one being alphabetized if(order_col !== context.alphabetSearch.column){ context.alphabetSearch.pass = 0; } var data = this.api().column( col, { order: 'index' } ).data().map( function (value, index) { var letter = value.replace(/<.*?>/g, '').charAt(0).toUpperCase(); // If sorting by alphabetized column return (order_col === context.alphabetSearch.column) ? ( // If first pass ( !context.alphabetSearch.pass ) // Ignore ? '' // Otherwise, if it's a second pass : ( // If method is ascending sort ( order_method === 'asc' ) // Return first letter ? letter : String.fromCharCode(65535 - letter.charCodeAt(0)) ) ) // Otherwise, if sorting by column other than the one being alphabetized, // return first letter : letter; } ); // If sorting by alphabetized column if(order_col === context.alphabetSearch.column){ // If pass is not defined, set it to 0 if(!context.alphabetSearchPass){ context.alphabetSearch.pass = 0; } // Increment pass counter and reset it to 0 if it's a second pass context.alphabetSearch.pass = (context.alphabetSearch.pass + 1) % 2; } return data; }; // Private support methods function bin ( data ) { var letter, bins = {}; for ( var i=0, ien=data.length ; i/g, '') .charAt(0).toUpperCase(); if(/\d/.test(letter)){ letter = '#'; } if ( bins[letter] ) { bins[letter]++; } else { bins[letter] = 1; } } return bins; } function draw ( table, alphabet, context ) { alphabet.empty(); if(context.oLanguage.alphabetSearch.infoDisplay !== ''){ $('') .html(context.oLanguage.alphabetSearch.infoDisplay) .appendTo( alphabet ); } var columnData = table.column(context.alphabetSearch.column, { search: 'applied' } ).data(); var bins = bin( columnData ); var alphabetList = $('