{"version":3,"file":"jquery.dataTables.mjs","sources":["../js/jquery.dataTables.mjs"],"sourcesContent":["/*! DataTables 1.13.5\n * ©2008-2023 SpryMedia Ltd - datatables.net/license\n */\n\nimport jQuery from 'jquery';\n\n// DataTables code uses $ internally, but we want to be able to\n// reassign $ with the `use` method, so it is a regular var.\nvar $ = jQuery;\n\n\nvar DataTable = function ( selector, options )\n{\n\t// Check if called with a window or jQuery object for DOM less applications\n\t// This is for backwards compatibility\n\tif (DataTable.factory(selector, options)) {\n\t\treturn DataTable;\n\t}\n\n\t// When creating with `new`, create a new DataTable, returning the API instance\n\tif (this instanceof DataTable) {\n\t\treturn $(selector).DataTable(options);\n\t}\n\telse {\n\t\t// Argument switching\n\t\toptions = selector;\n\t}\n\n\t/**\n\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t * return the resulting jQuery object.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {object} jQuery object, filtered by the given selector.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Highlight every second row\n\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t *      oTable.fnFilter('Webkit');\n\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t *      oTable.fnFilter('');\n\t *    } );\n\t */\n\tthis.$ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).$( sSelector, oOpts );\n\t};\n\t\n\t\n\t/**\n\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t * rows are found, the data returned is the original data array/object that was used to\n\t * create the row (or a generated array if from a DOM source).\n\t *\n\t * This method is often useful in-combination with $ where both functions are given the\n\t * same parameters and the array indexes will match identically.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t *    entry in the array.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the data from the first row in the table\n\t *      var data = oTable._('tr:first');\n\t *\n\t *      // Do something useful with the data\n\t *      alert( \"First cell is: \"+data[0] );\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to 'Webkit' and get all data for\n\t *      oTable.fnFilter('Webkit');\n\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t *\n\t *      // Do something with the data\n\t *      alert( data.length+\" rows matched the search\" );\n\t *    } );\n\t */\n\tthis._ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t};\n\t\n\t\n\t/**\n\t * Create a DataTables Api instance, with the currently selected tables for\n\t * the Api's context.\n\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t *   or if all tables captured in the jQuery object should be used.\n\t * @return {DataTables.Api}\n\t */\n\tthis.api = function ( traditional )\n\t{\n\t\treturn traditional ?\n\t\t\tnew _Api(\n\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t) :\n\t\t\tnew _Api( this );\n\t};\n\t\n\t\n\t/**\n\t * Add a single new row or multiple rows of data to the table. Please note\n\t * that this is suitable for client-side processing only - if you are using\n\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t *  @param {array|object} data The data to be added to the table. This can be:\n\t *    <ul>\n\t *      <li>1D array of data - add a single row with the data provided</li>\n\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t *      <li>object - data object when using <i>mData</i></li>\n\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t *    </ul>\n\t *  @param {bool} [redraw=true] redraw the table or not\n\t *  @returns {array} An array of integers, representing the list of indexes in\n\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t *    the table.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Global var for counter\n\t *    var giCount = 2;\n\t *\n\t *    $(document).ready(function() {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *    function fnClickAddRow() {\n\t *      $('#example').dataTable().fnAddData( [\n\t *        giCount+\".1\",\n\t *        giCount+\".2\",\n\t *        giCount+\".3\",\n\t *        giCount+\".4\" ]\n\t *      );\n\t *\n\t *      giCount++;\n\t *    }\n\t */\n\tthis.fnAddData = function( data, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\t/* Check if we want to add multiple rows or not */\n\t\tvar rows = Array.isArray(data) && ( Array.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\tapi.rows.add( data ) :\n\t\t\tapi.row.add( data );\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn rows.flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * This function will make DataTables recalculate the column sizes, based on the data\n\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t * through the sWidth parameter). This can be useful when the width of the table's\n\t * parent element changes (for example a window resize).\n\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable( {\n\t *        \"sScrollY\": \"200px\",\n\t *        \"bPaginate\": false\n\t *      } );\n\t *\n\t *      $(window).on('resize', function () {\n\t *        oTable.fnAdjustColumnSizing();\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t{\n\t\tvar api = this.api( true ).columns.adjust();\n\t\tvar settings = api.settings()[0];\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw( false );\n\t\t}\n\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Quickly and simply clear a table\n\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t *      oTable.fnClearTable();\n\t *    } );\n\t */\n\tthis.fnClearTable = function( bRedraw )\n\t{\n\t\tvar api = this.api( true ).clear();\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t * are currently 'open'.\n\t *  @param {node} nTr the table row to 'close'\n\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnClose = function( nTr )\n\t{\n\t\tthis.api( true ).row( nTr ).child.hide();\n\t};\n\t\n\t\n\t/**\n\t * Remove a row for the table\n\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t *    the TR element you want to delete\n\t *  @param {function|null} [callBack] Callback function\n\t *  @param {bool} [redraw=true] Redraw the table or not\n\t *  @returns {array} The row that was deleted\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately remove the first row\n\t *      oTable.fnDeleteRow( 0 );\n\t *    } );\n\t */\n\tthis.fnDeleteRow = function( target, callback, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar rows = api.rows( target );\n\t\tvar settings = rows.settings()[0];\n\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\n\t\trows.remove();\n\t\n\t\tif ( callback ) {\n\t\t\tcallback.call( this, settings, data );\n\t\t}\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn data;\n\t};\n\t\n\t\n\t/**\n\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnDestroy();\n\t *    } );\n\t */\n\tthis.fnDestroy = function ( remove )\n\t{\n\t\tthis.api( true ).destroy( remove );\n\t};\n\t\n\t\n\t/**\n\t * Redraw the table\n\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t *      oTable.fnDraw();\n\t *    } );\n\t */\n\tthis.fnDraw = function( complete )\n\t{\n\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t// into account the new data, but can hold position.\n\t\tthis.api( true ).draw( complete );\n\t};\n\t\n\t\n\t/**\n\t * Filter the input based on data\n\t *  @param {string} sInput String to filter the table on\n\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sometime later - filter...\n\t *      oTable.fnFilter( 'test string' );\n\t *    } );\n\t */\n\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\telse {\n\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\n\t\tapi.draw();\n\t};\n\t\n\t\n\t/**\n\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t * provided parameters.\n\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t *  @param {int} [col] Optional column index that you want the data of.\n\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t *    defined, only data for the designated cell is returned.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Row data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('tr').click( function () {\n\t *        var data = oTable.fnGetData( this );\n\t *        // ... do something with the array / object of data for the row\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Individual cell data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('td').click( function () {\n\t *        var sData = oTable.fnGetData( this );\n\t *        alert( 'The cell clicked on had the value of '+sData );\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnGetData = function( src, col )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( src !== undefined ) {\n\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\n\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\tapi.row( src ).data() || null;\n\t\t}\n\t\n\t\treturn api.data().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t * typically want to use the '$' API method in preference to this as it is more\n\t * flexible.\n\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the nodes from the table\n\t *      var nNodes = oTable.fnGetNodes( );\n\t *    } );\n\t */\n\tthis.fnGetNodes = function( iRow )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\treturn iRow !== undefined ?\n\t\t\tapi.row( iRow ).node() :\n\t\t\tapi.rows().nodes().flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get the array indexes of a particular cell from it's DOM element\n\t * and column index including hidden columns\n\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t *    if given as a cell, an array of [row index, column index (visible),\n\t *    column index (all)] is given.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      $('#example tbody td').click( function () {\n\t *        // Get the position of the current data from the node\n\t *        var aPos = oTable.fnGetPosition( this );\n\t *\n\t *        // Get the data array for this row\n\t *        var aData = oTable.fnGetData( aPos[0] );\n\t *\n\t *        // Update the data array and return the value\n\t *        aData[ aPos[1] ] = 'clicked';\n\t *        this.innerHTML = 'clicked';\n\t *      } );\n\t *\n\t *      // Init DataTables\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnGetPosition = function( node )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\n\t\tif ( nodeName == 'TR' ) {\n\t\t\treturn api.row( node ).index();\n\t\t}\n\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\tvar cell = api.cell( node ).index();\n\t\n\t\t\treturn [\n\t\t\t\tcell.row,\n\t\t\t\tcell.columnVisible,\n\t\t\t\tcell.column\n\t\t\t];\n\t\t}\n\t\treturn null;\n\t};\n\t\n\t\n\t/**\n\t * Check to see if a row is 'open' or not.\n\t *  @param {node} nTr the table row to check\n\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnIsOpen = function( nTr )\n\t{\n\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t};\n\t\n\t\n\t/**\n\t * This function will place a new row directly after a row which is currently\n\t * on display on the page, with the HTML contents that is passed into the\n\t * function. This can be used, for example, to ask for confirmation that a\n\t * particular record should be deleted.\n\t *  @param {node} nTr The table row to 'open'\n\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t *  @param {string} sClass Class to give the new TD cell\n\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t *    first parameter, is not found in the table, this method will silently\n\t *    return.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t{\n\t\treturn this.api( true )\n\t\t\t.row( nTr )\n\t\t\t.child( mHtml, sClass )\n\t\t\t.show()\n\t\t\t.child()[0];\n\t};\n\t\n\t\n\t/**\n\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t * function. With this function you can have a DataTables table go to the next,\n\t * previous, first or last pages.\n\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnPageChange( 'next' );\n\t *    } );\n\t */\n\tthis.fnPageChange = function ( mAction, bRedraw )\n\t{\n\t\tvar api = this.api( true ).page( mAction );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw(false);\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Show a particular column\n\t *  @param {int} iCol The column whose display should be changed\n\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Hide the second column after initialisation\n\t *      oTable.fnSetColumnVis( 1, false );\n\t *    } );\n\t */\n\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t{\n\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.columns.adjust().draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the settings for a particular table for external manipulation\n\t *  @returns {object} DataTables settings object. See\n\t *    {@link DataTable.models.oSettings}\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      var oSettings = oTable.fnSettings();\n\t *\n\t *      // Show an example parameter from the settings\n\t *      alert( oSettings._iDisplayStart );\n\t *    } );\n\t */\n\tthis.fnSettings = function()\n\t{\n\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t};\n\t\n\t\n\t/**\n\t * Sort the table by a particular column\n\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t *    'display index' if you have hidden data entries\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort immediately with columns 0 and 1\n\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t *    } );\n\t */\n\tthis.fnSort = function( aaSort )\n\t{\n\t\tthis.api( true ).order( aaSort ).draw();\n\t};\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *  @param {node} nNode the element to attach the sort listener to\n\t *  @param {int} iColumn the column that a click on this node will sort on\n\t *  @param {function} [fnCallback] callback function when sort is run\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort on column 1, when 'sorter' is clicked on\n\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t *    } );\n\t */\n\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t{\n\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t};\n\t\n\t\n\t/**\n\t * Update a table cell or row - this method will accept either a single value to\n\t * update the cell with, an array of values with one element for each column or\n\t * an object in the same format as the original data source. The function is\n\t * self-referencing in order to make the multi column updates easier.\n\t *  @param {object|array|string} mData Data to update the cell/row with\n\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t *    update a whole row.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t *  @returns {int} 0 on success, 1 on error\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t *    } );\n\t */\n\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\tapi.row( mRow ).data( mData );\n\t\t}\n\t\telse {\n\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t}\n\t\n\t\tif ( bAction === undefined || bAction ) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\treturn 0;\n\t};\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t * to ensure compatibility.\n\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t *    version, or false if this version of DataTales is not suitable\n\t *  @method\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t *    } );\n\t */\n\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\n\n\tvar _that = this;\n\tvar emptyInit = options === undefined;\n\tvar len = this.length;\n\n\tif ( emptyInit ) {\n\t\toptions = {};\n\t}\n\n\tthis.oApi = this.internal = _ext.internal;\n\n\t// Extend with old style plug-in API methods\n\tfor ( var fn in DataTable.ext.internal ) {\n\t\tif ( fn ) {\n\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t}\n\t}\n\n\tthis.each(function() {\n\t\t// For each initialisation we want to give it a clean initialisation\n\t\t// object that can be bashed around\n\t\tvar o = {};\n\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t_fnExtend( o, options, true ) :\n\t\t\toptions;\n\n\t\t/*global oInit,_that,emptyInit*/\n\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\tvar sId = this.getAttribute( 'id' );\n\t\tvar bInitHandedOff = false;\n\t\tvar defaults = DataTable.defaults;\n\t\tvar $this = $(this);\n\t\t\n\t\t\n\t\t/* Sanity check */\n\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t{\n\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Backwards compatibility for the defaults */\n\t\t_fnCompatOpts( defaults );\n\t\t_fnCompatCols( defaults.column );\n\t\t\n\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\n\t\t/* Setting up the initialisation object */\n\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\n\t\t\n\t\t\n\t\t/* Check to see if we are re-initialising a table */\n\t\tvar allSettings = DataTable.settings;\n\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar s = allSettings[i];\n\t\t\n\t\t\t/* Base check on table node */\n\t\t\tif (\n\t\t\t\ts.nTable == this ||\n\t\t\t\t(s.nTHead && s.nTHead.parentNode == this) ||\n\t\t\t\t(s.nTFoot && s.nTFoot.parentNode == this)\n\t\t\t) {\n\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\n\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t{\n\t\t\t\t\treturn s.oInstance;\n\t\t\t\t}\n\t\t\t\telse if ( bDestroy )\n\t\t\t\t{\n\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t */\n\t\t\tif ( s.sTableId == this.id )\n\t\t\t{\n\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Ensure the table has an ID - required for accessibility */\n\t\tif ( sId === null || sId === \"\" )\n\t\t{\n\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\tthis.id = sId;\n\t\t}\n\t\t\n\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\"sInstance\":     sId,\n\t\t\t\"sTableId\":      sId\n\t\t} );\n\t\toSettings.nTable = this;\n\t\toSettings.oApi   = _that.internal;\n\t\toSettings.oInit  = oInit;\n\t\t\n\t\tallSettings.push( oSettings );\n\t\t\n\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\n\t\t// Backwards compatibility, before we apply all the defaults\n\t\t_fnCompatOpts( oInit );\n\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\n\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t{\n\t\t\toInit.iDisplayLength = Array.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t}\n\t\t\n\t\t// Apply the defaults and init options to make a single init object will all\n\t\t// options defined from defaults and instance options.\n\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\n\t\t\n\t\t// Map the initialisation options onto the settings object\n\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\"bPaginate\",\n\t\t\t\"bLengthChange\",\n\t\t\t\"bFilter\",\n\t\t\t\"bSort\",\n\t\t\t\"bSortMulti\",\n\t\t\t\"bInfo\",\n\t\t\t\"bProcessing\",\n\t\t\t\"bAutoWidth\",\n\t\t\t\"bSortClasses\",\n\t\t\t\"bServerSide\",\n\t\t\t\"bDeferRender\"\n\t\t] );\n\t\t_fnMap( oSettings, oInit, [\n\t\t\t\"asStripeClasses\",\n\t\t\t\"ajax\",\n\t\t\t\"fnServerData\",\n\t\t\t\"fnFormatNumber\",\n\t\t\t\"sServerMethod\",\n\t\t\t\"aaSorting\",\n\t\t\t\"aaSortingFixed\",\n\t\t\t\"aLengthMenu\",\n\t\t\t\"sPaginationType\",\n\t\t\t\"sAjaxSource\",\n\t\t\t\"sAjaxDataProp\",\n\t\t\t\"iStateDuration\",\n\t\t\t\"sDom\",\n\t\t\t\"bSortCellsTop\",\n\t\t\t\"iTabIndex\",\n\t\t\t\"fnStateLoadCallback\",\n\t\t\t\"fnStateSaveCallback\",\n\t\t\t\"renderer\",\n\t\t\t\"searchDelay\",\n\t\t\t\"rowId\",\n\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\n\t\t/* Callback functions which are array driven */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\n\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\n\t\t/* Browser support detection */\n\t\t_fnBrowserDetect( oSettings );\n\t\t\n\t\tvar oClasses = oSettings.oClasses;\n\t\t\n\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t$this.addClass( oClasses.sTable );\n\t\t\n\t\t\n\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t{\n\t\t\t/* Display start point, taking into account the save saving */\n\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t}\n\t\t\n\t\tif ( oInit.iDeferLoading !== null )\n\t\t{\n\t\t\toSettings.bDeferLoading = true;\n\t\t\tvar tmp = Array.isArray( oInit.iDeferLoading );\n\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t}\n\t\t\n\t\t/* Language definitions */\n\t\tvar oLanguage = oSettings.oLanguage;\n\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\n\t\tif ( oLanguage.sUrl )\n\t\t{\n\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t */\n\t\t\t$.ajax( {\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t$.extend( true, oLanguage, json, oSettings.oInit.oLanguage );\n\t\t\n\t\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t},\n\t\t\t\terror: function () {\n\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tbInitHandedOff = true;\n\t\t}\n\t\telse {\n\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t}\n\t\t\n\t\t/*\n\t\t * Stripes\n\t\t */\n\t\tif ( oInit.asStripeClasses === null )\n\t\t{\n\t\t\toSettings.asStripeClasses =[\n\t\t\t\toClasses.sStripeOdd,\n\t\t\t\toClasses.sStripeEven\n\t\t\t];\n\t\t}\n\t\t\n\t\t/* Remove row stripe classes if they are already on the table row */\n\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\treturn rowOne.hasClass(el);\n\t\t} ) ) !== -1 ) {\n\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t}\n\t\t\n\t\t/*\n\t\t * Columns\n\t\t * See if we should load columns automatically or use defined ones\n\t\t */\n\t\tvar anThs = [];\n\t\tvar aoColumnsInit;\n\t\tvar nThead = this.getElementsByTagName('thead');\n\t\tif ( nThead.length !== 0 )\n\t\t{\n\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t}\n\t\t\n\t\t/* If not given a column array, generate one with nulls */\n\t\tif ( oInit.aoColumns === null )\n\t\t{\n\t\t\taoColumnsInit = [];\n\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taoColumnsInit.push( null );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t}\n\t\t\n\t\t/* Add the columns */\n\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t{\n\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t}\n\t\t\n\t\t/* Apply the column definitions */\n\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t} );\n\t\t\n\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t * attributes are found\n\t\t */\n\t\tif ( rowOne.length ) {\n\t\t\tvar a = function ( cell, name ) {\n\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t};\n\t\t\n\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\n\t\t\t\tif (! col) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\n\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcol._isArrayHost = true;\n\t\t\n\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\t\n\t\tvar features = oSettings.oFeatures;\n\t\tvar loadedInit = function () {\n\t\t\t/*\n\t\t\t * Sorting\n\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t */\n\t\t\n\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t */\n\t\t\t_fnSortingClasses( oSettings );\n\t\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\n\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t} );\n\t\t\n\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t}\n\t\t\t}, 'sc' );\n\t\t\n\t\t\n\t\t\t/*\n\t\t\t * Final init\n\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t */\n\t\t\n\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t} );\n\t\t\n\t\t\tvar thead = $this.children('thead');\n\t\t\tif ( thead.length === 0 ) {\n\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t}\n\t\t\toSettings.nTHead = thead[0];\n\t\t\n\t\t\tvar tbody = $this.children('tbody');\n\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\ttbody = $('<tbody/>').insertAfter(thead);\n\t\t\t}\n\t\t\toSettings.nTBody = tbody[0];\n\t\t\n\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t}\n\t\t\n\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t}\n\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t}\n\t\t\n\t\t\t/* Check if there is data passing into the constructor */\n\t\t\tif ( oInit.aaData ) {\n\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t * to replace it with Ajax data\n\t\t\t\t */\n\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t}\n\t\t\n\t\t\t/* Copy the data index array */\n\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\n\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\toSettings.bInitialised = true;\n\t\t\n\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t * language processor)\n\t\t\t */\n\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t_fnInitialise( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\n\t\tif ( oInit.bStateSave )\n\t\t{\n\t\t\tfeatures.bStateSave = true;\n\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t}\n\t\telse {\n\t\t\tloadedInit();\n\t\t}\n\t\t\n\t} );\n\t_that = null;\n\treturn this;\n};\n\n\n/*\n * It is useful to have variables which are scoped locally so only the\n * DataTables functions can access them and they don't leak into global space.\n * At the same time these functions are often useful over multiple files in the\n * core and API, so we list, or at least document, all variables which are used\n * by DataTables as private variables here. This also ensures that there is no\n * clashing of variable names and that they can easily referenced for reuse.\n */\n\n\n// Defined else where\n//  _selector_run\n//  _selector_opts\n//  _selector_first\n//  _selector_row_indexes\n\nvar _ext; // DataTable.ext\nvar _Api; // DataTable.Api\nvar _api_register; // DataTable.Api.register\nvar _api_registerPlural; // DataTable.Api.registerPlural\n\nvar _re_dic = {};\nvar _re_new_lines = /[\\r\\n\\u2028]/g;\nvar _re_html = /<.*?>/g;\n\n// This is not strict ISO8601 - Date.parse() is quite lax, although\n// implementations differ between browsers.\nvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\n// Escape regular expression special characters\nvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\n// http://en.wikipedia.org/wiki/Foreign_exchange_market\n// - \\u20BD - Russian ruble.\n// - \\u20a9 - South Korean Won\n// - \\u20BA - Turkish Lira\n// - \\u20B9 - Indian Rupee\n// - R - Brazil (R$) and South Africa\n// - fr - Swiss Franc\n// - kr - Swedish krona, Norwegian krone and Danish krone\n// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n// - Ƀ - Bitcoin\n// - Ξ - Ethereum\n//   standards as thousands separators.\nvar _re_formatted_numeric = /['\\u00A0,$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\n\nvar _empty = function ( d ) {\n\treturn !d || d === true || d === '-' ? true : false;\n};\n\n\nvar _intVal = function ( s ) {\n\tvar integer = parseInt( s, 10 );\n\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n};\n\n// Convert from a formatted number with characters other than `.` as the\n// decimal place, to a Javascript number\nvar _numToDecimal = function ( num, decimalPoint ) {\n\t// Cache created regular expressions for speed as this function is called often\n\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t}\n\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\tnum;\n};\n\n\nvar _isNumber = function ( d, decimalPoint, formatted ) {\n\tvar type = typeof d;\n\tvar strType = type === 'string';\n\n\tif ( type === 'number' || type === 'bigint') {\n\t\treturn true;\n\t}\n\n\t// If empty return immediately so there must be a number if it is a\n\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t// as a formatted number for currency\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tif ( decimalPoint && strType ) {\n\t\td = _numToDecimal( d, decimalPoint );\n\t}\n\n\tif ( formatted && strType ) {\n\t\td = d.replace( _re_formatted_numeric, '' );\n\t}\n\n\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n};\n\n\n// A string without HTML in it can be considered to be HTML still\nvar _isHtml = function ( d ) {\n\treturn _empty( d ) || typeof d === 'string';\n};\n\n\nvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tvar html = _isHtml( d );\n\treturn ! html ?\n\t\tnull :\n\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\ttrue :\n\t\t\tnull;\n};\n\n\nvar _pluck = function ( a, prop, prop2 ) {\n\tvar out = [];\n\tvar i=0, ien=a.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) {\n\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\n// Basically the same as _pluck, but rather than looping over `a` we use `order`\n// as the indexes to pick from `a`\nvar _pluck_order = function ( a, order, prop, prop2 )\n{\n\tvar out = [];\n\tvar i=0, ien=order.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _range = function ( len, start )\n{\n\tvar out = [];\n\tvar end;\n\n\tif ( start === undefined ) {\n\t\tstart = 0;\n\t\tend = len;\n\t}\n\telse {\n\t\tend = start;\n\t\tstart = len;\n\t}\n\n\tfor ( var i=start ; i<end ; i++ ) {\n\t\tout.push( i );\n\t}\n\n\treturn out;\n};\n\n\nvar _removeEmpty = function ( a )\n{\n\tvar out = [];\n\n\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\tout.push( a[i] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _stripHtml = function ( d ) {\n\treturn d\n\t\t.replace( _re_html, '' ) // Complete tags\n\t\t.replace(/<script/i, ''); // Safety for incomplete script tag\n};\n\n\n/**\n * Determine if all values in the array are unique. This means we can short\n * cut the _unique method at the cost of a single loop. A sorted array is used\n * to easily check the values.\n *\n * @param  {array} src Source array\n * @return {boolean} true if all unique, false otherwise\n * @ignore\n */\nvar _areAllUnique = function ( src ) {\n\tif ( src.length < 2 ) {\n\t\treturn true;\n\t}\n\n\tvar sorted = src.slice().sort();\n\tvar last = sorted[0];\n\n\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\tif ( sorted[i] === last ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlast = sorted[i];\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Find the unique elements in a source array.\n *\n * @param  {array} src Source array\n * @return {array} Array of unique items\n * @ignore\n */\nvar _unique = function ( src )\n{\n\tif ( _areAllUnique( src ) ) {\n\t\treturn src.slice();\n\t}\n\n\t// A faster unique method is to use object keys to identify used values,\n\t// but this doesn't work with arrays or objects, which we must also\n\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t// information.\n\tvar\n\t\tout = [],\n\t\tval,\n\t\ti, ien=src.length,\n\t\tj, k=0;\n\n\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\tval = src[i];\n\n\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\tif ( out[j] === val ) {\n\t\t\t\tcontinue again;\n\t\t\t}\n\t\t}\n\n\t\tout.push( val );\n\t\tk++;\n\t}\n\n\treturn out;\n};\n\n// Surprisingly this is faster than [].concat.apply\n// https://jsperf.com/flatten-an-array-loop-vs-reduce/2\nvar _flatten = function (out, val) {\n\tif (Array.isArray(val)) {\n\t\tfor (var i=0 ; i<val.length ; i++) {\n\t\t\t_flatten(out, val[i]);\n\t\t}\n\t}\n\telse {\n\t\tout.push(val);\n\t}\n  \n\treturn out;\n}\n\nvar _includes = function (search, start) {\n\tif (start === undefined) {\n\t\tstart = 0;\n\t}\n\n\treturn this.indexOf(search, start) !== -1;\t\n};\n\n// Array.isArray polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\nif (! Array.isArray) {\n    Array.isArray = function(arg) {\n        return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n}\n\nif (! Array.prototype.includes) {\n\tArray.prototype.includes = _includes;\n}\n\n// .trim() polyfill\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n  };\n}\n\nif (! String.prototype.includes) {\n\tString.prototype.includes = _includes;\n}\n\n/**\n * DataTables utility methods\n * \n * This namespace provides helper methods that DataTables uses internally to\n * create a DataTable, but which are not exclusively used only for DataTables.\n * These methods can be used by extension authors to save the duplication of\n * code.\n *\n *  @namespace\n */\nDataTable.util = {\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained\n\t * for the throttled function.\n\t *\n\t * @param {function} fn Function to be called\n\t * @param {integer} freq Call frequency in mS\n\t * @return {function} Wrapped function\n\t */\n\tthrottle: function ( fn, freq ) {\n\t\tvar\n\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\tlast,\n\t\t\ttimer;\n\n\t\treturn function () {\n\t\t\tvar\n\t\t\t\tthat = this,\n\t\t\t\tnow  = +new Date(),\n\t\t\t\targs = arguments;\n\n\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\tclearTimeout( timer );\n\n\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\tlast = undefined;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}, frequency );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlast = now;\n\t\t\t\tfn.apply( that, args );\n\t\t\t}\n\t\t};\n\t},\n\n\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *\n\t *  @param {string} val string to escape\n\t *  @returns {string} escaped string\n\t */\n\tescapeRegex: function ( val ) {\n\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t},\n\n\t/**\n\t * Create a function that will write to a nested object or array\n\t * @param {*} source JSON notation string\n\t * @returns Write function\n\t */\n\tset: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn DataTable.util.set( source._ );\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Nothing to do when the data source is null\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tsource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t// Like the get, we need to get data from a nested object\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) {\n\t\t\t\t\t// Protect against prototype pollution\n\t\t\t\t\tif (a[i] === '__proto__' || a[i] === 'constructor') {\n\t\t\t\t\t\tthrow new Error('Cannot set prototype values');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) ) {\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[source] = val;\n\t\t\t};\n\t\t}\n\t},\n\n\t/**\n\t * Create a function that will read nested objects from arrays, based on JSON notation\n\t * @param {*} source JSON notation string\n\t * @returns Value read\n\t */\n\tget: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t// Build an object of get functions, and wrap them in a single call\n\t\t\tvar o = {};\n\t\t\t$.each( source, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = DataTable.util.get( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Give an empty string for rendering / sorting etc\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn source( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" ) {\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (data === null || data[ a[i] ] === null) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( data === undefined || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[source];\n\t\t\t};\n\t\t}\n\t}\n};\n\n\n\n/**\n * Create a mapping object that allows camel case parameters to be looked up\n * for their Hungarian counterparts. The mapping is stored in a private\n * parameter called `_hungarianMap` which can be accessed on the source object.\n *  @param {object} o\n *  @memberof DataTable#oApi\n */\nfunction _fnHungarianMap ( o )\n{\n\tvar\n\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\tmatch,\n\t\tnewKey,\n\t\tmap = {};\n\n\t$.each( o, function (key, val) {\n\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\n\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t{\n\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\tmap[ newKey ] = key;\n\n\t\t\tif ( match[1] === 'o' )\n\t\t\t{\n\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t}\n\t\t}\n\t} );\n\n\to._hungarianMap = map;\n}\n\n\n/**\n * Convert from camel case parameters to Hungarian, based on a Hungarian map\n * created by _fnHungarianMap.\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n *  @memberof DataTable#oApi\n */\nfunction _fnCamelToHungarian ( src, user, force )\n{\n\tif ( ! src._hungarianMap ) {\n\t\t_fnHungarianMap( src );\n\t}\n\n\tvar hungarianKey;\n\n\t$.each( user, function (key, val) {\n\t\thungarianKey = src._hungarianMap[ key ];\n\n\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t{\n\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t{\n\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\n\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t}\n\t\t}\n\t} );\n}\n\n\n/**\n * Language compatibility - when certain options are given, and others aren't, we\n * need to duplicate the values over, in order to provide backwards compatibility\n * with older language files.\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnLanguageCompat( lang )\n{\n\t// Note the use of the Hungarian notation for the parameters in this method as\n\t// this is called after the mapping of camelCase to Hungarian\n\tvar defaults = DataTable.defaults.oLanguage;\n\n\t// Default mapping\n\tvar defaultDecimal = defaults.sDecimal;\n\tif ( defaultDecimal ) {\n\t\t_addNumericSort( defaultDecimal );\n\t}\n\n\tif ( lang ) {\n\t\tvar zeroRecords = lang.sZeroRecords;\n\n\t\t// Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t// sZeroRecords - assuming that is given.\n\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\n\t\t// Likewise with loading records\n\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\n\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\tif ( lang.sInfoThousands ) {\n\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t}\n\n\t\tvar decimal = lang.sDecimal;\n\t\tif ( decimal && defaultDecimal !== decimal ) {\n\t\t\t_addNumericSort( decimal );\n\t\t}\n\t}\n}\n\n\n/**\n * Map one parameter onto another\n *  @param {object} o Object to map\n *  @param {*} knew The new parameter name\n *  @param {*} old The old parameter name\n */\nvar _fnCompatMap = function ( o, knew, old ) {\n\tif ( o[ knew ] !== undefined ) {\n\t\to[ old ] = o[ knew ];\n\t}\n};\n\n\n/**\n * Provide backwards compatibility for the main DT options. Note that the new\n * options are mapped onto the old parameters, so this is an external interface\n * change only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatOpts ( init )\n{\n\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t_fnCompatMap( init, 'searching',     'bFilter' );\n\n\t// Boolean initialisation of x-scrolling\n\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t}\n\tif ( typeof init.scrollX === 'boolean' ) {\n\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t}\n\n\t// Column search objects are in an array, so it needs to be converted\n\t// element by element\n\tvar searchCols = init.aoSearchCols;\n\n\tif ( searchCols ) {\n\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\tif ( searchCols[i] ) {\n\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Provide backwards compatibility for column options. Note that the new options\n * are mapped onto the old parameters, so this is an external interface change\n * only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatCols ( init )\n{\n\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\n\t// orderData can be given as an integer\n\tvar dataSort = init.aDataSort;\n\tif ( typeof dataSort === 'number' && ! Array.isArray( dataSort ) ) {\n\t\tinit.aDataSort = [ dataSort ];\n\t}\n}\n\n\n/**\n * Browser feature detection for capabilities, quirks\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBrowserDetect( settings )\n{\n\t// We don't need to do this every time DataTables is constructed, the values\n\t// calculated are specific to the browser and OS configuration which we\n\t// don't expect to change between initialisations\n\tif ( ! DataTable.__browser ) {\n\t\tvar browser = {};\n\t\tDataTable.__browser = browser;\n\n\t\t// Scrolling feature / quirks detection\n\t\tvar n = $('<div/>')\n\t\t\t.css( {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden'\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.appendTo( 'body' );\n\n\t\tvar outer = n.children();\n\t\tvar inner = outer.children();\n\n\t\t// Numbers below, in order, are:\n\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t//\n\t\t// IE6 XP:                           100 100 100  83\n\t\t// IE7 Vista:                        100 100 100  83\n\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t// Evergreen Windows:                 83  83 100  83\n\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\n\t\t// Get scrollbar width\n\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\n\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t// element is contained without forcing scrolling\n\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\n\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t// scrollbar on the left, rather than the right.\n\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\n\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\n\t\tn.remove();\n\t}\n\n\t$.extend( settings.oBrowser, DataTable.__browser );\n\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n}\n\n\n/**\n * Array.prototype reduce[Right] method, used for browsers which don't support\n * JS 1.6. Done this way to reduce code size, since we iterate either way\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnReduce ( that, fn, init, start, end, inc )\n{\n\tvar\n\t\ti = start,\n\t\tvalue,\n\t\tisSet = false;\n\n\tif ( init !== undefined ) {\n\t\tvalue = init;\n\t\tisSet = true;\n\t}\n\n\twhile ( i !== end ) {\n\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalue = isSet ?\n\t\t\tfn( value, that[i], i, that ) :\n\t\t\tthat[i];\n\n\t\tisSet = true;\n\t\ti += inc;\n\t}\n\n\treturn value;\n}\n\n/**\n * Add a column to the list used for the table with default values\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nTh The th element for this column\n *  @memberof DataTable#oApi\n */\nfunction _fnAddColumn( oSettings, nTh )\n{\n\t// Add column to aoColumns array\n\tvar oDefaults = DataTable.defaults.column;\n\tvar iCol = oSettings.aoColumns.length;\n\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\tidx: iCol\n\t} );\n\toSettings.aoColumns.push( oCol );\n\n\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t// passed into extend can be undefined. This allows the user to give a default\n\t// with only some of the parameters defined, and also not give a default\n\tvar searchCols = oSettings.aoPreSearchCols;\n\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\n\t// Use the default column options function to initialise classes etc\n\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n}\n\n\n/**\n * Apply options for a column\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iCol column index to consider\n *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnOptions( oSettings, iCol, oOptions )\n{\n\tvar oCol = oSettings.aoColumns[ iCol ];\n\tvar oClasses = oSettings.oClasses;\n\tvar th = $(oCol.nTh);\n\n\t// Try to get width information from the DOM. We can't get it from CSS\n\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\tif ( ! oCol.sWidthOrig ) {\n\t\t// Width attribute\n\t\toCol.sWidthOrig = th.attr('width') || null;\n\n\t\t// Style attribute\n\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\tif ( t ) {\n\t\t\toCol.sWidthOrig = t[1];\n\t\t}\n\t}\n\n\t/* User specified column options */\n\tif ( oOptions !== undefined && oOptions !== null )\n\t{\n\t\t// Backwards compatibility\n\t\t_fnCompatCols( oOptions );\n\n\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );\n\n\t\t/* Backwards compatibility for mDataProp */\n\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t{\n\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t}\n\n\t\tif ( oOptions.sType )\n\t\t{\n\t\t\toCol._sManualType = oOptions.sType;\n\t\t}\n\n\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t// the ability to use a valid name for the camel case input\n\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t{\n\t\t\toOptions.sClass = oOptions.className;\n\t\t}\n\t\tif ( oOptions.sClass ) {\n\t\t\tth.addClass( oOptions.sClass );\n\t\t}\n\n\t\tvar origClass = oCol.sClass;\n\n\t\t$.extend( oCol, oOptions );\n\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\n\t\t// Merge class from previously defined classes with this one, rather than just\n\t\t// overwriting it in the extend above\n\t\tif (origClass !== oCol.sClass) {\n\t\t\toCol.sClass = origClass + ' ' + oCol.sClass;\n\t\t}\n\n\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t * priority if defined\n\t\t */\n\t\tif ( oOptions.iDataSort !== undefined )\n\t\t{\n\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t}\n\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t}\n\n\t/* Cache the data get and set functions for speed */\n\tvar mDataSrc = oCol.mData;\n\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\n\tvar attrTest = function( src ) {\n\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t};\n\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t);\n\toCol._setter = null;\n\n\toCol.fnGetData = function (rowData, type, meta) {\n\t\tvar innerData = mData( rowData, type, undefined, meta );\n\n\t\treturn mRender && type ?\n\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\tinnerData;\n\t};\n\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t};\n\n\t// Indicate if DataTables should read DOM data as an object or array\n\t// Used in _fnGetRowElements\n\tif ( typeof mDataSrc !== 'number' && ! oCol._isArrayHost ) {\n\t\toSettings._rowReadObject = true;\n\t}\n\n\t/* Feature sorting overrides column specific when off */\n\tif ( !oSettings.oFeatures.bSort )\n\t{\n\t\toCol.bSortable = false;\n\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t}\n\n\t/* Check that the class assignment is correct for sorting */\n\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\toCol.sSortingClassJUI = \"\";\n\t}\n\telse if ( bAsc && !bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t}\n\telse if ( !bAsc && bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t}\n\telse\n\t{\n\t\toCol.sSortingClass = oClasses.sSortable;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t}\n}\n\n\n/**\n * Adjust the table column widths for new data. Note: you would probably want to\n * do a redraw after calling this function!\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAdjustColumnSizing ( settings )\n{\n\t/* Not interested in doing column width calculation if auto-width is disabled */\n\tif ( settings.oFeatures.bAutoWidth !== false )\n\t{\n\t\tvar columns = settings.aoColumns;\n\n\t\t_fnCalculateColumnWidths( settings );\n\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t}\n\t}\n\n\tvar scroll = settings.oScroll;\n\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t{\n\t\t_fnScrollDraw( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n}\n\n\n/**\n * Convert the index of a visible column to the index in the data array (take account\n * of hidden columns)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iMatch Visible column index to lookup\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\n\treturn typeof aiVis[iMatch] === 'number' ?\n\t\taiVis[iMatch] :\n\t\tnull;\n}\n\n\n/**\n * Convert the index of an index in the data array and convert it to the visible\n *   column index (take account of hidden columns)\n *  @param {int} iMatch Column index to lookup\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnIndexToVisible( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\tvar iPos = $.inArray( iMatch, aiVis );\n\n\treturn iPos !== -1 ? iPos : null;\n}\n\n\n/**\n * Get the number of visible columns\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the number of visible columns\n *  @memberof DataTable#oApi\n */\nfunction _fnVisbleColumns( oSettings )\n{\n\tvar vis = 0;\n\n\t// No reduce in IE8, use a loop for now\n\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\tvis++;\n\t\t}\n\t} );\n\n\treturn vis;\n}\n\n\n/**\n * Get an array of column indexes that match a given property\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sParam Parameter in aoColumns to look for - typically\n *    bVisible or bSearchable\n *  @returns {array} Array of indexes with matched properties\n *  @memberof DataTable#oApi\n */\nfunction _fnGetColumns( oSettings, sParam )\n{\n\tvar a = [];\n\n\t$.map( oSettings.aoColumns, function(val, i) {\n\t\tif ( val[sParam] ) {\n\t\t\ta.push( i );\n\t\t}\n\t} );\n\n\treturn a;\n}\n\n\n/**\n * Calculate the 'type' of a column\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnTypes ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar data = settings.aoData;\n\tvar types = DataTable.ext.type.detect;\n\tvar i, ien, j, jen, k, ken;\n\tvar col, cell, detectedType, cache;\n\n\t// For each column, spin over the \n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcol = columns[i];\n\t\tcache = [];\n\n\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\tcol.sType = col._sManualType;\n\t\t}\n\t\telse if ( ! col.sType ) {\n\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\n\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t// types\n\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t// bottom of the pile and very similar to string - but it\n\t\t\t\t\t// must not be empty\n\t\t\t\t\tif ( detectedType === 'html' && ! _empty(cache[k]) ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t// type\n\t\t\t\tif ( detectedType ) {\n\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fall back - if no type was detected, always use string\n\t\t\tif ( ! col.sType ) {\n\t\t\t\tcol.sType = 'string';\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Take the column definitions and static columns arrays and calculate how\n * they relate to column indexes. The callback function will then apply the\n * definition found for a column to a suitable configuration object.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n *  @param {array} aoCols The aoColumns array that defines columns individually\n *  @param {function} fn Callback function - takes two parameters, the calculated\n *    column index and the definition for that column.\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n{\n\tvar i, iLen, j, jLen, k, kLen, def;\n\tvar columns = oSettings.aoColumns;\n\n\t// Column definitions with aTargets\n\tif ( aoColDefs )\n\t{\n\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t{\n\t\t\tdef = aoColDefs[i];\n\n\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\tvar aTargets = def.target !== undefined\n\t\t\t\t? def.target\n\t\t\t\t: def.targets !== undefined\n\t\t\t\t\t? def.targets\n\t\t\t\t\t: def.aTargets;\n\n\t\t\tif ( ! Array.isArray( aTargets ) )\n\t\t\t{\n\t\t\t\taTargets = [ aTargets ];\n\t\t\t}\n\n\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t{\n\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Statically defined columns array\n\tif ( aoCols )\n\t{\n\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfn( i, aoCols[i] );\n\t\t}\n\t}\n}\n\n/**\n * Add a data array to the table, creating DOM node etc. This is the parallel to\n * _fnGatherData, but for adding rows from a Javascript source, rather than a\n * DOM source.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aData data array to be added\n *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n *  @memberof DataTable#oApi\n */\nfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n{\n\t/* Create the object for storing information about this new row */\n\tvar iRow = oSettings.aoData.length;\n\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\tsrc: nTr ? 'dom' : 'data',\n\t\tidx: iRow\n\t} );\n\n\toData._aData = aDataIn;\n\toSettings.aoData.push( oData );\n\n\t/* Create the cells */\n\tvar nTd, sThisType;\n\tvar columns = oSettings.aoColumns;\n\n\t// Invalidate the column types as the new data needs to be revalidated\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tcolumns[i].sType = null;\n\t}\n\n\t/* Add to the display array */\n\toSettings.aiDisplayMaster.push( iRow );\n\n\tvar id = oSettings.rowIdFn( aDataIn );\n\tif ( id !== undefined ) {\n\t\toSettings.aIds[ id ] = oData;\n\t}\n\n\t/* Create the DOM information, or register it if already present */\n\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t{\n\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t}\n\n\treturn iRow;\n}\n\n\n/**\n * Add one or more TR elements to the table. Generally we'd expect to\n * use this for reading data from a DOM sourced table, but it could be\n * used for an TR element. Note that if a TR is given, it is used (i.e.\n * it is not cloned).\n *  @param {object} settings dataTables settings object\n *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n *  @returns {array} Array of indexes for the added rows\n *  @memberof DataTable#oApi\n */\nfunction _fnAddTr( settings, trs )\n{\n\tvar row;\n\n\t// Allow an individual node to be passed in\n\tif ( ! (trs instanceof $) ) {\n\t\ttrs = $(trs);\n\t}\n\n\treturn trs.map( function (i, el) {\n\t\trow = _fnGetRowElements( settings, el );\n\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t} );\n}\n\n\n/**\n * Take a TR element and convert it to an index in aoData\n *  @param {object} oSettings dataTables settings object\n *  @param {node} n the TR element to find\n *  @returns {int} index if the node is found, null if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToDataIndex( oSettings, n )\n{\n\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n}\n\n\n/**\n * Take a TD element and convert it into a column data index (not the visible index)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow The row number the TD/TH can be found in\n *  @param {node} n The TD/TH element to find\n *  @returns {int} index if the node is found, -1 if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n{\n\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n}\n\n\n/**\n * Get the data for a given cell from the internal cache, taking into account data mapping\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {string} type data get type ('display', 'type' 'filter|search' 'sort|order')\n *  @returns {*} Cell data\n *  @memberof DataTable#oApi\n */\nfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n{\n\tif (type === 'search') {\n\t\ttype = 'filter';\n\t}\n\telse if (type === 'order') {\n\t\ttype = 'sort';\n\t}\n\n\tvar draw           = settings.iDraw;\n\tvar col            = settings.aoColumns[colIdx];\n\tvar rowData        = settings.aoData[rowIdx]._aData;\n\tvar defaultContent = col.sDefaultContent;\n\tvar cellData       = col.fnGetData( rowData, type, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t} );\n\n\tif ( cellData === undefined ) {\n\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\tsettings.iDrawError = draw;\n\t\t}\n\t\treturn defaultContent;\n\t}\n\n\t// When the data source is null and a specific data type is requested (i.e.\n\t// not the original data), we can use default column data\n\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\tcellData = defaultContent;\n\t}\n\telse if ( typeof cellData === 'function' ) {\n\t\t// If the data source is a function, then we run it and use the return,\n\t\t// executing in the scope of the data object (for instances)\n\t\treturn cellData.call( rowData );\n\t}\n\n\tif ( cellData === null && type === 'display' ) {\n\t\treturn '';\n\t}\n\n\tif ( type === 'filter' ) {\n\t\tvar fomatters = DataTable.ext.type.search;\n\n\t\tif ( fomatters[ col.sType ] ) {\n\t\t\tcellData = fomatters[ col.sType ]( cellData );\n\t\t}\n\t}\n\n\treturn cellData;\n}\n\n\n/**\n * Set the value for a specific cell, into the internal data cache\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {*} val Value to set\n *  @memberof DataTable#oApi\n */\nfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n{\n\tvar col     = settings.aoColumns[colIdx];\n\tvar rowData = settings.aoData[rowIdx]._aData;\n\n\tcol.fnSetData( rowData, val, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t}  );\n}\n\n\n// Private variable that is used to match action syntax in the data property object\nvar __reArray = /\\[.*?\\]$/;\nvar __reFn = /\\(\\)$/;\n\n/**\n * Split string on periods, taking into account escaped periods\n * @param  {string} str String to split\n * @return {array} Split string\n */\nfunction _fnSplitObjNotation( str )\n{\n\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\treturn s.replace(/\\\\\\./g, '.');\n\t} );\n}\n\n\n/**\n * Return a function that can be used to get data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data get function\n *  @memberof DataTable#oApi\n */\nvar _fnGetObjectDataFn = DataTable.util.get;\n\n\n/**\n * Return a function that can be used to set data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data set function\n *  @memberof DataTable#oApi\n */\nvar _fnSetObjectDataFn = DataTable.util.set;\n\n\n/**\n * Return an array with the full table data\n *  @param {object} oSettings dataTables settings object\n *  @returns array {array} aData Master data array\n *  @memberof DataTable#oApi\n */\nfunction _fnGetDataMaster ( settings )\n{\n\treturn _pluck( settings.aoData, '_aData' );\n}\n\n\n/**\n * Nuke the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnClearTable( settings )\n{\n\tsettings.aoData.length = 0;\n\tsettings.aiDisplayMaster.length = 0;\n\tsettings.aiDisplay.length = 0;\n\tsettings.aIds = {};\n}\n\n\n /**\n * Take an array of integers (index array) and remove a target integer (value - not\n * the key!)\n *  @param {array} a Index array to target\n *  @param {int} iTarget value to find\n *  @memberof DataTable#oApi\n */\nfunction _fnDeleteIndex( a, iTarget, splice )\n{\n\tvar iTargetIndex = -1;\n\n\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t{\n\t\tif ( a[i] == iTarget )\n\t\t{\n\t\t\tiTargetIndex = i;\n\t\t}\n\t\telse if ( a[i] > iTarget )\n\t\t{\n\t\t\ta[i]--;\n\t\t}\n\t}\n\n\tif ( iTargetIndex != -1 && splice === undefined )\n\t{\n\t\ta.splice( iTargetIndex, 1 );\n\t}\n}\n\n\n/**\n * Mark cached data as invalid such that a re-read of the data will occur when\n * the cached data is next requested. Also update from the data source object.\n *\n * @param {object} settings DataTables settings object\n * @param {int}    rowIdx   Row index to invalidate\n * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n *     or 'data'\n * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n *     row will be invalidated\n * @memberof DataTable#oApi\n *\n * @todo For the modularisation of v1.11 this will need to become a callback, so\n *   the sort and filter methods can subscribe to it. That will required\n *   initialisation options for sorting, which is why it is not already baked in\n */\nfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n{\n\tvar row = settings.aoData[ rowIdx ];\n\tvar i, ien;\n\tvar cellWrite = function ( cell, col ) {\n\t\t// This is very frustrating, but in IE if you just write directly\n\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t// even if there is a reference to them elsewhere\n\t\twhile ( cell.childNodes.length ) {\n\t\t\tcell.removeChild( cell.firstChild );\n\t\t}\n\n\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t};\n\n\t// Are we reading last data from DOM or the data object?\n\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t// Read the data from the DOM\n\t\trow._aData = _fnGetRowElements(\n\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t)\n\t\t\t.data;\n\t}\n\telse {\n\t\t// Reading from data object, update the DOM\n\t\tvar cells = row.anCells;\n\n\t\tif ( cells ) {\n\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// For both row and cell invalidation, the cached data for sorting and\n\t// filtering is nulled out\n\trow._aSortData = null;\n\trow._aFilterData = null;\n\n\t// Invalidate the type for a specific column (if given) or all columns since\n\t// the data might have changed\n\tvar cols = settings.aoColumns;\n\tif ( colIdx !== undefined ) {\n\t\tcols[ colIdx ].sType = null;\n\t}\n\telse {\n\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\tcols[i].sType = null;\n\t\t}\n\n\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t_fnRowAttributes( settings, row );\n\t}\n}\n\n\n/**\n * Build a data source object from an HTML row, reading the contents of the\n * cells that are in the row.\n *\n * @param {object} settings DataTables settings object\n * @param {node|object} TR element from which to read data or existing row\n *   object from which to re-read the data from the cells\n * @param {int} [colIdx] Optional column index\n * @param {array|object} [d] Data source object. If `colIdx` is given then this\n *   parameter should also be given and will be used to write the data into.\n *   Only the column in question will be written\n * @returns {object} Object with two parameters: `data` the data read, in\n *   document order, and `cells` and array of nodes (they can be useful to the\n *   caller, so rather than needing a second traversal to get them, just return\n *   them from here).\n * @memberof DataTable#oApi\n */\nfunction _fnGetRowElements( settings, row, colIdx, d )\n{\n\tvar\n\t\ttds = [],\n\t\ttd = row.firstChild,\n\t\tname, col, o, i=0, contents,\n\t\tcolumns = settings.aoColumns,\n\t\tobjectRead = settings._rowReadObject;\n\n\t// Allow the data object to be passed in, or construct\n\td = d !== undefined ?\n\t\td :\n\t\tobjectRead ?\n\t\t\t{} :\n\t\t\t[];\n\n\tvar attr = function ( str, td  ) {\n\t\tif ( typeof str === 'string' ) {\n\t\t\tvar idx = str.indexOf('@');\n\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t}\n\t\t}\n\t};\n\n\t// Read data from a cell and store into the data object\n\tvar cellProcess = function ( cell ) {\n\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\tcol = columns[i];\n\t\t\tcontents = (cell.innerHTML).trim();\n\n\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\tsetter( d, contents );\n\n\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t// be read to either an object or an array.\n\t\t\t\tif ( objectRead ) {\n\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t}\n\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td[i] = contents;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ti++;\n\t};\n\n\tif ( td ) {\n\t\t// `tr` element was passed in\n\t\twhile ( td ) {\n\t\t\tname = td.nodeName.toUpperCase();\n\n\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\tcellProcess( td );\n\t\t\t\ttds.push( td );\n\t\t\t}\n\n\t\t\ttd = td.nextSibling;\n\t\t}\n\t}\n\telse {\n\t\t// Existing row object passed in\n\t\ttds = row.anCells;\n\n\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\tcellProcess( tds[j] );\n\t\t}\n\t}\n\n\t// Read the ID from the DOM if present\n\tvar rowNode = row.firstChild ? row : row.nTr;\n\n\tif ( rowNode ) {\n\t\tvar id = rowNode.getAttribute( 'id' );\n\n\t\tif ( id ) {\n\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t}\n\t}\n\n\treturn {\n\t\tdata: d,\n\t\tcells: tds\n\t};\n}\n/**\n * Create a new TR element (and it's TD children) for a row\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow Row to consider\n *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @memberof DataTable#oApi\n */\nfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n{\n\tvar\n\t\trow = oSettings.aoData[iRow],\n\t\trowData = row._aData,\n\t\tcells = [],\n\t\tnTr, nTd, oCol,\n\t\ti, iLen, create;\n\n\tif ( row.nTr === null )\n\t{\n\t\tnTr = nTrIn || document.createElement('tr');\n\n\t\trow.nTr = nTr;\n\t\trow.anCells = cells;\n\n\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t * to the aoData array for fast look up\n\t\t */\n\t\tnTr._DT_RowIndex = iRow;\n\n\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t_fnRowAttributes( oSettings, row );\n\n\t\t/* Process each column */\n\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\toCol = oSettings.aoColumns[i];\n\t\t\tcreate = nTrIn ? false : true;\n\n\t\t\tnTd = create ? document.createElement( oCol.sCellType ) : anTds[i];\n\n\t\t\tif (! nTd) {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\n\t\t\tnTd._DT_CellIndex = {\n\t\t\t\trow: iRow,\n\t\t\t\tcolumn: i\n\t\t\t};\n\t\t\t\n\t\t\tcells.push( nTd );\n\n\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\tif ( create || ((oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t)) {\n\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t}\n\n\t\t\t/* Add user defined class */\n\t\t\tif ( oCol.sClass )\n\t\t\t{\n\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t}\n\n\t\t\t// Visibility - add or remove as required\n\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t{\n\t\t\t\tnTr.appendChild( nTd );\n\t\t\t}\n\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t{\n\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t}\n\n\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t{\n\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );\n\t}\n}\n\n\n/**\n * Add attributes to a row based on the special `DT_*` parameters in a data\n * source object.\n *  @param {object} settings DataTables settings object\n *  @param {object} DataTables row object for the row to be modified\n *  @memberof DataTable#oApi\n */\nfunction _fnRowAttributes( settings, row )\n{\n\tvar tr = row.nTr;\n\tvar data = row._aData;\n\n\tif ( tr ) {\n\t\tvar id = settings.rowIdFn( data );\n\n\t\tif ( id ) {\n\t\t\ttr.id = id;\n\t\t}\n\n\t\tif ( data.DT_RowClass ) {\n\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\ta;\n\n\t\t\t$(tr)\n\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t.addClass( data.DT_RowClass );\n\t\t}\n\n\t\tif ( data.DT_RowAttr ) {\n\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t}\n\n\t\tif ( data.DT_RowData ) {\n\t\t\t$(tr).data( data.DT_RowData );\n\t\t}\n\t}\n}\n\n\n/**\n * Create the HTML header for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBuildHead( oSettings )\n{\n\tvar i, ien, cell, row, column;\n\tvar thead = oSettings.nTHead;\n\tvar tfoot = oSettings.nTFoot;\n\tvar createHeader = $('th, td', thead).length === 0;\n\tvar classes = oSettings.oClasses;\n\tvar columns = oSettings.aoColumns;\n\n\tif ( createHeader ) {\n\t\trow = $('<tr/>').appendTo( thead );\n\t}\n\n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcell = $( column.nTh ).addClass( column.sClass );\n\n\t\tif ( createHeader ) {\n\t\t\tcell.appendTo( row );\n\t\t}\n\n\t\t// 1.11 move into sorting\n\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\tcell.addClass( column.sSortingClass );\n\n\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\tcell\n\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\n\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t}\n\t\t}\n\n\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\tcell.html( column.sTitle );\n\t\t}\n\n\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\toSettings, cell, column, classes\n\t\t);\n\t}\n\n\tif ( createHeader ) {\n\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t}\n\n\t/* Deal with the footer - add classes if required */\n\t$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );\n\t$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );\n\n\t// Cache the footer cells. Note that we only take the cells from the first\n\t// row in the footer. If there is more than one row the user wants to\n\t// interact with, they need to use the table().foot() method. Note also this\n\t// allows cells to be used for multiple columns using colspan\n\tif ( tfoot !== null ) {\n\t\tvar cells = oSettings.aoFooter[0];\n\n\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\n\t\t\tif (column) {\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the header (or footer) element based on the column visibility states. The\n * methodology here is to use the layout array from _fnDetectHeader, modified for\n * the instantaneous column visibility, to construct the new layout. The grid is\n * traversed over cell at a time in a rows x columns grid fashion, although each\n * cell insert can cover multiple elements in the grid - which is tracks using the\n * aApplied array. Cell inserts in the grid will only occur where there isn't\n * already a cell in that position.\n *  @param {object} oSettings dataTables settings object\n *  @param array {objects} aoSource Layout array from _fnDetectHeader\n *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n *  @memberof DataTable#oApi\n */\nfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n{\n\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\tvar aoLocal = [];\n\tvar aApplied = [];\n\tvar iColumns = oSettings.aoColumns.length;\n\tvar iRowspan, iColspan;\n\n\tif ( ! aoSource )\n\t{\n\t\treturn;\n\t}\n\n\tif (  bIncludeHidden === undefined )\n\t{\n\t\tbIncludeHidden = false;\n\t}\n\n\t/* Make a copy of the master layout array, but without the visible columns in it */\n\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t{\n\t\taoLocal[i] = aoSource[i].slice();\n\t\taoLocal[i].nTr = aoSource[i].nTr;\n\n\t\t/* Remove any columns which are currently hidden */\n\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t{\n\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t{\n\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t}\n\t\t}\n\n\t\t/* Prep the applied array - it needs an element for each row */\n\t\taApplied.push( [] );\n\t}\n\n\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t{\n\t\tnLocalTr = aoLocal[i].nTr;\n\n\t\t/* All cells are going to be replaced, so empty out the row */\n\t\tif ( nLocalTr )\n\t\t{\n\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t{\n\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t}\n\t\t}\n\n\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tiRowspan = 1;\n\t\t\tiColspan = 1;\n\n\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t */\n\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t{\n\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\taApplied[i][j] = 1;\n\n\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t{\n\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\tiRowspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t{\n\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tiColspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Insert the required TR nodes into the table for display\n *  @param {object} oSettings dataTables settings object\n *  @param ajaxComplete true after ajax call to complete rendering\n *  @memberof DataTable#oApi\n */\nfunction _fnDraw( oSettings, ajaxComplete )\n{\n\t// Allow for state saving and a custom start position\n\t_fnStart( oSettings );\n\n\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t{\n\t\t_fnProcessingDisplay( oSettings, false );\n\t\treturn;\n\t}\n\n\tvar anRows = [];\n\tvar iRowCount = 0;\n\tvar asStripeClasses = oSettings.asStripeClasses;\n\tvar iStripes = asStripeClasses.length;\n\tvar oLang = oSettings.oLanguage;\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar aiDisplay = oSettings.aiDisplay;\n\tvar iDisplayStart = oSettings._iDisplayStart;\n\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\n\toSettings.bDrawing = true;\n\n\t/* Server-side processing draw intercept */\n\tif ( oSettings.bDeferLoading )\n\t{\n\t\toSettings.bDeferLoading = false;\n\t\toSettings.iDraw++;\n\t\t_fnProcessingDisplay( oSettings, false );\n\t}\n\telse if ( !bServerSide )\n\t{\n\t\toSettings.iDraw++;\n\t}\n\telse if ( !oSettings.bDestroying && !ajaxComplete)\n\t{\n\t\t_fnAjaxUpdate( oSettings );\n\t\treturn;\n\t}\n\n\tif ( aiDisplay.length !== 0 )\n\t{\n\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\n\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t{\n\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\tif ( aoData.nTr === null )\n\t\t\t{\n\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t}\n\n\t\t\tvar nRow = aoData.nTr;\n\n\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\tif ( iStripes !== 0 )\n\t\t\t{\n\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t{\n\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t// useful?\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t[nRow, aoData._aData, iRowCount, j, iDataIndex] );\n\n\t\t\tanRows.push( nRow );\n\t\t\tiRowCount++;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* Table is empty - create a row with an empty message in it */\n\t\tvar sZero = oLang.sZeroRecords;\n\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t{\n\t\t\tsZero = oLang.sLoadingRecords;\n\t\t}\n\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t{\n\t\t\tsZero = oLang.sEmptyTable;\n\t\t}\n\n\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t.append( $('<td />', {\n\t\t\t\t'valign':  'top',\n\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t} ).html( sZero ) )[0];\n\t}\n\n\t/* Header and footer callbacks */\n\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\tvar body = $(oSettings.nTBody);\n\n\tbody.children().detach();\n\tbody.append( $(anRows) );\n\n\t/* Call all required callback functions for the end of a draw */\n\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\n\t/* Draw is complete, sorting and filtering must be as well */\n\toSettings.bSorted = false;\n\toSettings.bFiltered = false;\n\toSettings.bDrawing = false;\n}\n\n\n/**\n * Redraw the table - taking account of the various features which are enabled\n *  @param {object} oSettings dataTables settings object\n *  @param {boolean} [holdPosition] Keep the current paging position. By default\n *    the paging is reset to the first page\n *  @memberof DataTable#oApi\n */\nfunction _fnReDraw( settings, holdPosition )\n{\n\tvar\n\t\tfeatures = settings.oFeatures,\n\t\tsort     = features.bSort,\n\t\tfilter   = features.bFilter;\n\n\tif ( sort ) {\n\t\t_fnSort( settings );\n\t}\n\n\tif ( filter ) {\n\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t}\n\telse {\n\t\t// No filtering, so we want to just use the display master\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t}\n\n\tif ( holdPosition !== true ) {\n\t\tsettings._iDisplayStart = 0;\n\t}\n\n\t// Let any modules know about the draw hold position state (used by\n\t// scrolling internally)\n\tsettings._drawHold = holdPosition;\n\n\t_fnDraw( settings );\n\n\tsettings._drawHold = false;\n}\n\n\n/**\n * Add the options to the page HTML for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAddOptionsHtml ( oSettings )\n{\n\tvar classes = oSettings.oClasses;\n\tvar table = $(oSettings.nTable);\n\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\tvar features = oSettings.oFeatures;\n\n\t// All DataTables are wrapped in a div\n\tvar insert = $('<div/>', {\n\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t} );\n\n\toSettings.nHolding = holding[0];\n\toSettings.nTableWrapper = insert[0];\n\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\n\t/* Loop over the user set positioning and place the elements as needed */\n\tvar aDom = oSettings.sDom.split('');\n\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t{\n\t\tfeatureNode = null;\n\t\tcOption = aDom[i];\n\n\t\tif ( cOption == '<' )\n\t\t{\n\t\t\t/* New container div */\n\t\t\tnNewNode = $('<div/>')[0];\n\n\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\tcNext = aDom[i+1];\n\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t{\n\t\t\t\tsAttr = \"\";\n\t\t\t\tj = 2;\n\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t{\n\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t}\n\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t}\n\n\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t */\n\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t{\n\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t}\n\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t{\n\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t}\n\n\t\t\t\ti += j; /* Move along the position array */\n\t\t\t}\n\n\t\t\tinsert.append( nNewNode );\n\t\t\tinsert = $(nNewNode);\n\t\t}\n\t\telse if ( cOption == '>' )\n\t\t{\n\t\t\t/* End container div */\n\t\t\tinsert = insert.parent();\n\t\t}\n\t\t// @todo Move options into their own plugins?\n\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t{\n\t\t\t/* Length */\n\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t}\n\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t{\n\t\t\t/* Filter */\n\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t}\n\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t{\n\t\t\t/* pRocessing */\n\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t}\n\t\telse if ( cOption == 't' )\n\t\t{\n\t\t\t/* Table */\n\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t}\n\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t{\n\t\t\t/* Info */\n\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t}\n\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t{\n\t\t\t/* Pagination */\n\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t}\n\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t{\n\t\t\t/* Plug-in features */\n\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t{\n\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Add to the 2D features array */\n\t\tif ( featureNode )\n\t\t{\n\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\n\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t{\n\t\t\t\taanFeatures[cOption] = [];\n\t\t\t}\n\n\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\tinsert.append( featureNode );\n\t\t}\n\t}\n\n\t/* Built our DOM structure - replace the holding div with what we want */\n\tholding.replaceWith( insert );\n\toSettings.nHolding = null;\n}\n\n\n/**\n * Use the DOM source to create up an array of header cells. The idea here is to\n * create a layout grid (array) of rows x columns, which contains a reference\n * to the cell that that point in the grid (regardless of col/rowspan), such that\n * any column / row could be removed and the new grid constructed\n *  @param array {object} aLayout Array to store the calculated layout in\n *  @param {node} nThead The header/footer element for the table\n *  @memberof DataTable#oApi\n */\nfunction _fnDetectHeader ( aLayout, nThead )\n{\n\tvar nTrs = $(nThead).children('tr');\n\tvar nTr, nCell;\n\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\tvar bUnique;\n\tvar fnShiftCol = function ( a, i, j ) {\n\t\tvar k = a[i];\n                while ( k[j] ) {\n\t\t\tj++;\n\t\t}\n\t\treturn j;\n\t};\n\n\taLayout.splice( 0, aLayout.length );\n\n\t/* We know how many rows there are in the layout - so prep it */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\taLayout.push( [] );\n\t}\n\n\t/* Calculate a layout array */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\tnTr = nTrs[i];\n\t\tiColumn = 0;\n\n\t\t/* For every cell in the row... */\n\t\tnCell = nTr.firstChild;\n\t\twhile ( nCell ) {\n\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t{\n\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\n\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t * accordingly\n\t\t\t\t */\n\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\n\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\n\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t{\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t};\n\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnCell = nCell.nextSibling;\n\t\t}\n\t}\n}\n\n\n/**\n * Get an array of unique th elements, one for each column\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nHeader automatically detect the layout from this node - optional\n *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n *  @returns array {node} aReturn list of unique th's\n *  @memberof DataTable#oApi\n */\nfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n{\n\tvar aReturn = [];\n\tif ( !aLayout )\n\t{\n\t\taLayout = oSettings.aoHeader;\n\t\tif ( nHeader )\n\t\t{\n\t\t\taLayout = [];\n\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t}\n\t}\n\n\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t{\n\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t{\n\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn aReturn;\n}\n\n/**\n * Set the start position for draw\n *  @param {object} oSettings dataTables settings object\n */\nfunction _fnStart( oSettings )\n{\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\n\t// Check and see if we have an initial draw position from state saving\n\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t{\n\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\tiInitDisplayStart :\n\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t0 :\n\t\t\t\tiInitDisplayStart;\n\n\t\toSettings.iInitDisplayStart = -1;\n\t}\n}\n\n/**\n * Create an Ajax call based on the table's settings, taking into account that\n * parameters can have multiple forms, and backwards compatibility.\n *\n * @param {object} oSettings dataTables settings object\n * @param {array} data Data to send to the server, required by\n *     DataTables - may be augmented by developer callbacks\n * @param {function} fn Callback function to run when data is obtained\n */\nfunction _fnBuildAjax( oSettings, data, fn )\n{\n\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\n\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t// come from server-side processing or serverParams\n\tif ( data && Array.isArray(data) ) {\n\t\tvar tmp = {};\n\t\tvar rbracket = /(.*?)\\[\\]$/;\n\n\t\t$.each( data, function (key, val) {\n\t\t\tvar match = val.name.match(rbracket);\n\n\t\t\tif ( match ) {\n\t\t\t\t// Support for arrays\n\t\t\t\tvar name = match[0];\n\n\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t}\n\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttmp[val.name] = val.value;\n\t\t\t}\n\t\t} );\n\t\tdata = tmp;\n\t}\n\n\tvar ajaxData;\n\tvar ajax = oSettings.ajax;\n\tvar instance = oSettings.oInstance;\n\tvar callback = function ( json ) {\n\t\tvar status = oSettings.jqXHR\n\t\t\t? oSettings.jqXHR.status\n\t\t\t: null;\n\n\t\tif ( json === null || (typeof status === 'number' && status == 204 ) ) {\n\t\t\tjson = {};\n\t\t\t_fnAjaxDataSrc( oSettings, json, [] );\n\t\t}\n\n\t\tvar error = json.error || json.sError;\n\t\tif ( error ) {\n\t\t\t_fnLog( oSettings, 0, error );\n\t\t}\n\n\t\toSettings.json = json;\n\n\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\tfn( json );\n\t};\n\n\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t{\n\t\tajaxData = ajax.data;\n\n\t\tvar newData = typeof ajaxData === 'function' ?\n\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\tajaxData;                      // an object object or array to merge\n\n\t\t// If the function returned something, use that alone\n\t\tdata = typeof ajaxData === 'function' && newData ?\n\t\t\tnewData :\n\t\t\t$.extend( true, data, newData );\n\n\t\t// Remove the data property as we've resolved it already and don't want\n\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\tdelete ajax.data;\n\t}\n\n\tvar baseAjax = {\n\t\t\"data\": data,\n\t\t\"success\": callback,\n\t\t\"dataType\": \"json\",\n\t\t\"cache\": false,\n\t\t\"type\": oSettings.sServerMethod,\n\t\t\"error\": function (xhr, error, thrown) {\n\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\n\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t}\n\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t};\n\n\t// Store the data submitted for the API\n\toSettings.oAjaxData = data;\n\n\t// Allow plug-ins and external processes to modify the data\n\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\n\tif ( oSettings.fnServerData )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.fnServerData.call( instance,\n\t\t\toSettings.sAjaxSource,\n\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\treturn { name: key, value: val };\n\t\t\t} ),\n\t\t\tcallback,\n\t\t\toSettings\n\t\t);\n\t}\n\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t} ) );\n\t}\n\telse if ( typeof ajax === 'function' )\n\t{\n\t\t// Is a function - let the caller define what needs to be done\n\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t}\n\telse\n\t{\n\t\t// Object to extend the base settings\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\n\t\t// Restore for next time around\n\t\tajax.data = ajaxData;\n\t}\n}\n\n\n/**\n * Update the table using an Ajax call\n *  @param {object} settings dataTables settings object\n *  @returns {boolean} Block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdate( settings )\n{\n\tsettings.iDraw++;\n\t_fnProcessingDisplay( settings, true );\n\n\t// Keep track of drawHold state to handle scrolling after the Ajax call\n\tvar drawHold = settings._drawHold;\n\n\t_fnBuildAjax(\n\t\tsettings,\n\t\t_fnAjaxParameters( settings ),\n\t\tfunction(json) {\n\t\t\tsettings._drawHold = drawHold;\n\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t\tsettings._drawHold = false;\n\t\t}\n\t);\n}\n\n\n/**\n * Build up the parameters in an object needed for a server-side processing\n * request. Note that this is basically done twice, is different ways - a modern\n * method which is used by default in DataTables 1.10 which uses objects and\n * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n * the sAjaxSource option is used in the initialisation, or the legacyAjax\n * option is set.\n *  @param {object} oSettings dataTables settings object\n *  @returns {bool} block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxParameters( settings )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tcolumnCount = columns.length,\n\t\tfeatures = settings.oFeatures,\n\t\tpreSearch = settings.oPreviousSearch,\n\t\tpreColSearch = settings.aoPreSearchCols,\n\t\ti, data = [], dataProp, column, columnSearch,\n\t\tsort = _fnSortFlatten( settings ),\n\t\tdisplayStart = settings._iDisplayStart,\n\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\tsettings._iDisplayLength :\n\t\t\t-1;\n\n\tvar param = function ( name, value ) {\n\t\tdata.push( { 'name': name, 'value': value } );\n\t};\n\n\t// DataTables 1.9- compatible method\n\tparam( 'sEcho',          settings.iDraw );\n\tparam( 'iColumns',       columnCount );\n\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\tparam( 'iDisplayStart',  displayStart );\n\tparam( 'iDisplayLength', displayLength );\n\n\t// DataTables 1.10+ method\n\tvar d = {\n\t\tdraw:    settings.iDraw,\n\t\tcolumns: [],\n\t\torder:   [],\n\t\tstart:   displayStart,\n\t\tlength:  displayLength,\n\t\tsearch:  {\n\t\t\tvalue: preSearch.sSearch,\n\t\t\tregex: preSearch.bRegex\n\t\t}\n\t};\n\n\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcolumnSearch = preColSearch[i];\n\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\n\t\td.columns.push( {\n\t\t\tdata:       dataProp,\n\t\t\tname:       column.sName,\n\t\t\tsearchable: column.bSearchable,\n\t\t\torderable:  column.bSortable,\n\t\t\tsearch:     {\n\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\tregex: columnSearch.bRegex\n\t\t\t}\n\t\t} );\n\n\t\tparam( \"mDataProp_\"+i, dataProp );\n\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t}\n\n\t\tif ( features.bSort ) {\n\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t}\n\t}\n\n\tif ( features.bFilter ) {\n\t\tparam( 'sSearch', preSearch.sSearch );\n\t\tparam( 'bRegex', preSearch.bRegex );\n\t}\n\n\tif ( features.bSort ) {\n\t\t$.each( sort, function ( i, val ) {\n\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\n\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t} );\n\n\t\tparam( 'iSortingCols', sort.length );\n\t}\n\n\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t// form to use, based on sAjaxSource\n\tvar legacy = DataTable.ext.legacy.ajax;\n\tif ( legacy === null ) {\n\t\treturn settings.sAjaxSource ? data : d;\n\t}\n\n\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t// form\n\treturn legacy ? data : d;\n}\n\n\n/**\n * Data the data from the server (nuking the old) and redraw the table\n *  @param {object} oSettings dataTables settings object\n *  @param {object} json json data return from the server.\n *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n *  @param {array} json.aaData The data to display on this page\n *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdateDraw ( settings, json )\n{\n\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t// Support both\n\tvar compat = function ( old, modern ) {\n\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t};\n\n\tvar data = _fnAjaxDataSrc( settings, json );\n\tvar draw            = compat( 'sEcho',                'draw' );\n\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\n\tif ( draw !== undefined ) {\n\t\t// Protect against out of sequence returns\n\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\treturn;\n\t\t}\n\t\tsettings.iDraw = draw * 1;\n\t}\n\n\t// No data in returned object, so rather than an array, we show an empty table\n\tif ( ! data ) {\n\t\tdata = [];\n\t}\n\n\t_fnClearTable( settings );\n\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\n\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t_fnAddData( settings, data[i] );\n\t}\n\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\n\t_fnDraw( settings, true );\n\n\tif ( ! settings._bInitComplete ) {\n\t\t_fnInitComplete( settings, json );\n\t}\n\n\t_fnProcessingDisplay( settings, false );\n}\n\n\n/**\n * Get the data from the JSON data source to use for drawing a table. Using\n * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n * source object, or from a processing function.\n *  @param {object} oSettings dataTables settings object\n *  @param  {object} json Data source object / array from the server\n *  @return {array} Array of data to use\n */\n function _fnAjaxDataSrc ( oSettings, json, write )\n {\n\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\toSettings.ajax.dataSrc :\n\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\n\tif ( ! write ) {\n\t\tif ( dataSrc === 'data' ) {\n\t\t\t// If the default, then we still want to support the old style, and safely ignore\n\t\t\t// it if possible\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\n\t// set\n\t_fnSetObjectDataFn( dataSrc )( json, write );\n}\n\n/**\n * Generate the node required for filtering text\n *  @returns {node} Filter control element\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlFilter ( settings )\n{\n\tvar classes = settings.oClasses;\n\tvar tableId = settings.sTableId;\n\tvar language = settings.oLanguage;\n\tvar previousSearch = settings.oPreviousSearch;\n\tvar features = settings.aanFeatures;\n\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\n\tvar str = language.sSearch;\n\tstr = str.match(/_INPUT_/) ?\n\t\tstr.replace('_INPUT_', input) :\n\t\tstr+input;\n\n\tvar filter = $('<div/>', {\n\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t'class': classes.sFilter\n\t\t} )\n\t\t.append( $('<label/>' ).append( str ) );\n\n\tvar searchFn = function(event) {\n\t\t/* Update all other filter input elements for the new display */\n\t\tvar n = features.f;\n\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\tif(previousSearch.return && event.key !== \"Enter\") {\n\t\t\treturn;\n\t\t}\n\t\t/* Now do the filter */\n\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\"sSearch\": val,\n\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive,\n\t\t\t\t\"return\": previousSearch.return\n\t\t\t} );\n\n\t\t\t// Need to redraw, without resorting\n\t\t\tsettings._iDisplayStart = 0;\n\t\t\t_fnDraw( settings );\n\t\t}\n\t};\n\n\tvar searchDelay = settings.searchDelay !== null ?\n\t\tsettings.searchDelay :\n\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t400 :\n\t\t\t0;\n\n\tvar jqFilter = $('input', filter)\n\t\t.val( previousSearch.sSearch )\n\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t.on(\n\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\tsearchDelay ?\n\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\tsearchFn\n\t\t)\n\t\t.on( 'mouseup.DT', function(e) {\n\t\t\t// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n\t\t\t// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n\t\t\t// checks the value to see if it has changed. In other browsers it won't have.\n\t\t\tsetTimeout( function () {\n\t\t\t\tsearchFn.call(jqFilter[0], e);\n\t\t\t}, 10);\n\t\t} )\n\t\t.on( 'keypress.DT', function(e) {\n\t\t\t/* Prevent form submission */\n\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} )\n\t\t.attr('aria-controls', tableId);\n\n\t// Update the input elements whenever the table is filtered\n\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\tif ( settings === s ) {\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame...\n\t\t\ttry {\n\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( e ) {}\n\t\t}\n\t} );\n\n\treturn filter[0];\n}\n\n\n/**\n * Filter the table using both the global filter and column based filtering\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oSearch search information\n *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterComplete ( oSettings, oInput, iForce )\n{\n\tvar oPrevSearch = oSettings.oPreviousSearch;\n\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\tvar fnSaveFilter = function ( oFilter ) {\n\t\t/* Save the filtering values */\n\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\toPrevSearch.return = oFilter.return;\n\t};\n\tvar fnRegex = function ( o ) {\n\t\t// Backwards compatibility with the bEscapeRegex option\n\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t};\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo As per sort - can this be moved into an event handler?\n\t_fnColumnTypes( oSettings );\n\n\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t{\n\t\t/* Global filter */\n\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );\n\t\tfnSaveFilter( oInput );\n\n\t\t/* Now do the individual column filter */\n\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t{\n\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t}\n\n\t\t/* Custom filtering */\n\t\t_fnFilterCustom( oSettings );\n\t}\n\telse\n\t{\n\t\tfnSaveFilter( oInput );\n\t}\n\n\t/* Tell the draw function we have been filtering */\n\toSettings.bFiltered = true;\n\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n}\n\n\n/**\n * Apply custom filtering functions\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCustom( settings )\n{\n\tvar filters = DataTable.ext.search;\n\tvar displayRows = settings.aiDisplay;\n\tvar row, rowIdx;\n\n\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\tvar rows = [];\n\n\t\t// Loop over each row and see if it should be included\n\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\trowIdx = displayRows[ j ];\n\t\t\trow = settings.aoData[ rowIdx ];\n\n\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\trows.push( rowIdx );\n\t\t\t}\n\t\t}\n\n\t\t// So the array reference doesn't break set the results into the\n\t\t// existing array\n\t\tdisplayRows.length = 0;\n\t\t$.merge( displayRows, rows );\n\t}\n}\n\n\n/**\n * Filter the table on a per-column basis\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sInput string to filter on\n *  @param {int} iColumn column to filter\n *  @param {bool} bRegex treat search string as a regular expression or not\n *  @param {bool} bSmart use smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n{\n\tif ( searchStr === '' ) {\n\t\treturn;\n\t}\n\n\tvar data;\n\tvar out = [];\n\tvar display = settings.aiDisplay;\n\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\n\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\n\t\tif ( rpSearch.test( data ) ) {\n\t\t\tout.push( display[i] );\n\t\t}\n\t}\n\n\tsettings.aiDisplay = out;\n}\n\n\n/**\n * Filter the data table based on user input and draw the table\n *  @param {object} settings dataTables settings object\n *  @param {string} input string to filter on\n *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n *  @param {bool} regex treat as a regular expression or not\n *  @param {bool} smart perform smart filtering or not\n *  @param {bool} caseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n{\n\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\tvar displayMaster = settings.aiDisplayMaster;\n\tvar display, invalidated, i;\n\tvar filtered = [];\n\n\t// Need to take account of custom filtering functions - always filter\n\tif ( DataTable.ext.search.length !== 0 ) {\n\t\tforce = true;\n\t}\n\n\t// Check if any of the rows were invalidated\n\tinvalidated = _fnFilterData( settings );\n\n\t// If the input is blank - we just want the full data set\n\tif ( input.length <= 0 ) {\n\t\tsettings.aiDisplay = displayMaster.slice();\n\t}\n\telse {\n\t\t// New search - start from the master array\n\t\tif ( invalidated ||\n\t\t\t force ||\n\t\t\t regex ||\n\t\t\t prevSearch.length > input.length ||\n\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t                  // re-filtered since indexes will have changed\n\t\t) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\n\t\t// Search the display array\n\t\tdisplay = settings.aiDisplay;\n\n\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\tfiltered.push( display[i] );\n\t\t\t}\n\t\t}\n\n\t\tsettings.aiDisplay = filtered;\n\t}\n}\n\n\n/**\n * Build a regular expression object suitable for searching a table\n *  @param {string} sSearch string to search for\n *  @param {bool} bRegex treat as a regular expression or not\n *  @param {bool} bSmart perform smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @returns {RegExp} constructed object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n{\n\tsearch = regex ?\n\t\tsearch :\n\t\t_fnEscapeRegex( search );\n\t\n\tif ( smart ) {\n\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t * order is important - a la google. So this is what we want to\n\t\t * generate:\n\t\t * \n\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t */\n\t\tvar a = $.map( search.match( /[\"\\u201C][^\"\\u201D]+[\"\\u201D]|[^ ]+/g ) || [''], function ( word ) {\n\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\tword = m ? m[1] : word;\n\t\t\t}\n\t\t\telse if ( word.charAt(0) === '\\u201C' ) {\n\t\t\t\tvar m = word.match( /^\\u201C(.*)\\u201D$/ );\n\t\t\t\tword = m ? m[1] : word;\n\t\t\t}\n\n\t\t\treturn word.replace('\"', '');\n\t\t} );\n\n\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t}\n\n\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n}\n\n\n/**\n * Escape a string such that it can be used in a regular expression\n *  @param {string} sVal string to escape\n *  @returns {string} escaped string\n *  @memberof DataTable#oApi\n */\nvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\nvar __filter_div = $('<div>')[0];\nvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\n// Update the filtering data for each row if needed (by invalidation or first run)\nfunction _fnFilterData ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar column;\n\tvar i, j, ien, jen, filterData, cellData, row;\n\tvar wasInvalidated = false;\n\n\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aFilterData ) {\n\t\t\tfilterData = [];\n\n\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\tcolumn = columns[j];\n\n\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\n\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcellData = '';\n\t\t\t\t}\n\n\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t}\n\n\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\tcellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n\t\t\t\t}\n\n\t\t\t\tfilterData.push( cellData );\n\t\t\t}\n\n\t\t\trow._aFilterData = filterData;\n\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\twasInvalidated = true;\n\t\t}\n\t}\n\n\treturn wasInvalidated;\n}\n\n\n/**\n * Convert from the internal Hungarian notation to camelCase for external\n * interaction\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToCamel ( obj )\n{\n\treturn {\n\t\tsearch:          obj.sSearch,\n\t\tsmart:           obj.bSmart,\n\t\tregex:           obj.bRegex,\n\t\tcaseInsensitive: obj.bCaseInsensitive\n\t};\n}\n\n\n\n/**\n * Convert from camelCase notation to the internal Hungarian. We could use the\n * Hungarian convert function here, but this is cleaner\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToHung ( obj )\n{\n\treturn {\n\t\tsSearch:          obj.search,\n\t\tbSmart:           obj.smart,\n\t\tbRegex:           obj.regex,\n\t\tbCaseInsensitive: obj.caseInsensitive\n\t};\n}\n\n/**\n * Generate the node required for the info display\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Information element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlInfo ( settings )\n{\n\tvar\n\t\ttid = settings.sTableId,\n\t\tnodes = settings.aanFeatures.i,\n\t\tn = $('<div/>', {\n\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t} );\n\n\tif ( ! nodes ) {\n\t\t// Update display on each draw\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\"sName\": \"information\"\n\t\t} );\n\n\t\tn\n\t\t\t.attr( 'role', 'status' )\n\t\t\t.attr( 'aria-live', 'polite' );\n\n\t\t// Table is described by our info div\n\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t}\n\n\treturn n[0];\n}\n\n\n/**\n * Update the information elements in the display\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnUpdateInfo ( settings )\n{\n\t/* Show information about the table */\n\tvar nodes = settings.aanFeatures.i;\n\tif ( nodes.length === 0 ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\tlang  = settings.oLanguage,\n\t\tstart = settings._iDisplayStart+1,\n\t\tend   = settings.fnDisplayEnd(),\n\t\tmax   = settings.fnRecordsTotal(),\n\t\ttotal = settings.fnRecordsDisplay(),\n\t\tout   = total ?\n\t\t\tlang.sInfo :\n\t\t\tlang.sInfoEmpty;\n\n\tif ( total !== max ) {\n\t\t/* Record set after filtering */\n\t\tout += ' ' + lang.sInfoFiltered;\n\t}\n\n\t// Convert the macros\n\tout += lang.sInfoPostFix;\n\tout = _fnInfoMacros( settings, out );\n\n\tvar callback = lang.fnInfoCallback;\n\tif ( callback !== null ) {\n\t\tout = callback.call( settings.oInstance,\n\t\t\tsettings, start, end, max, total, out\n\t\t);\n\t}\n\n\t$(nodes).html( out );\n}\n\n\nfunction _fnInfoMacros ( settings, str )\n{\n\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t// internally\n\tvar\n\t\tformatter  = settings.fnFormatNumber,\n\t\tstart      = settings._iDisplayStart+1,\n\t\tlen        = settings._iDisplayLength,\n\t\tvis        = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn str.\n\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n}\n\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnInitialise ( settings )\n{\n\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\tvar columns = settings.aoColumns, column;\n\tvar features = settings.oFeatures;\n\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\n\t/* Ensure that the table data is fully initialised */\n\tif ( ! settings.bInitialised ) {\n\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\treturn;\n\t}\n\n\t/* Show the display HTML options */\n\t_fnAddOptionsHtml( settings );\n\n\t/* Build and draw the header / footer for the table */\n\t_fnBuildHead( settings );\n\t_fnDrawHead( settings, settings.aoHeader );\n\t_fnDrawHead( settings, settings.aoFooter );\n\n\t/* Okay to show that something is going on now */\n\t_fnProcessingDisplay( settings, true );\n\n\t/* Calculate sizes for columns */\n\tif ( features.bAutoWidth ) {\n\t\t_fnCalculateColumnWidths( settings );\n\t}\n\n\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\tcolumn = columns[i];\n\n\t\tif ( column.sWidth ) {\n\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t}\n\t}\n\n\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\n\t// If there is default sorting required - let's do it. The sort function\n\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t// data (show 'loading' message possibly)\n\t_fnReDraw( settings );\n\n\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\tvar dataSrc = _fnDataSource( settings );\n\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t// if there is an ajax source load the data\n\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\n\t\t\t\t// Got the data - add it to the table\n\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t}\n\n\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t// it appear 'fresh'\n\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\n\t\t\t\t_fnReDraw( settings );\n\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t}, settings );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t_fnInitComplete( settings );\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} oSettings dataTables settings object\n *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n *    with client-side processing (optional)\n *  @memberof DataTable#oApi\n */\nfunction _fnInitComplete ( settings, json )\n{\n\tsettings._bInitComplete = true;\n\n\t// When data was added after the initialisation (data or Ajax) we need to\n\t// calculate the column sizing\n\tif ( json || settings.oInit.aaData ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n}\n\n\nfunction _fnLengthChange ( settings, val )\n{\n\tvar len = parseInt( val, 10 );\n\tsettings._iDisplayLength = len;\n\n\t_fnLengthOverflow( settings );\n\n\t// Fire length change event\n\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n}\n\n\n/**\n * Generate the node required for user display length changing\n *  @param {object} settings dataTables settings object\n *  @returns {node} Display length feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlLength ( settings )\n{\n\tvar\n\t\tclasses  = settings.oClasses,\n\t\ttableId  = settings.sTableId,\n\t\tmenu     = settings.aLengthMenu,\n\t\td2       = Array.isArray( menu[0] ),\n\t\tlengths  = d2 ? menu[0] : menu,\n\t\tlanguage = d2 ? menu[1] : menu;\n\n\tvar select = $('<select/>', {\n\t\t'name':          tableId+'_length',\n\t\t'aria-controls': tableId,\n\t\t'class':         classes.sLengthSelect\n\t} );\n\n\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\tselect[0][ i ] = new Option(\n\t\t\ttypeof language[i] === 'number' ?\n\t\t\t\tsettings.fnFormatNumber( language[i] ) :\n\t\t\t\tlanguage[i],\n\t\t\tlengths[i]\n\t\t);\n\t}\n\n\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\tif ( ! settings.aanFeatures.l ) {\n\t\tdiv[0].id = tableId+'_length';\n\t}\n\n\tdiv.children().append(\n\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t);\n\n\t// Can't use `select` variable as user might provide their own and the\n\t// reference is broken by the use of outerHTML\n\t$('select', div)\n\t\t.val( settings._iDisplayLength )\n\t\t.on( 'change.DT', function(e) {\n\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t_fnDraw( settings );\n\t\t} );\n\n\t// Update node value whenever anything changes the table's length\n\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\tif ( settings === s ) {\n\t\t\t$('select', div).val( len );\n\t\t}\n\t} );\n\n\treturn div[0];\n}\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Note that most of the paging logic is done in\n * DataTable.ext.pager\n */\n\n/**\n * Generate the node required for default pagination\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Pagination feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlPaginate ( settings )\n{\n\tvar\n\t\ttype   = settings.sPaginationType,\n\t\tplugin = DataTable.ext.pager[ type ],\n\t\tmodern = typeof plugin === 'function',\n\t\tredraw = function( settings ) {\n\t\t\t_fnDraw( settings );\n\t\t},\n\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\tfeatures = settings.aanFeatures;\n\n\tif ( ! modern ) {\n\t\tplugin.fnInit( settings, node, redraw );\n\t}\n\n\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\tif ( ! features.p )\n\t{\n\t\tnode.id = settings.sTableId+'_paginate';\n\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": function( settings ) {\n\t\t\t\tif ( modern ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\ti, ien;\n\n\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"sName\": \"pagination\"\n\t\t} );\n\t}\n\n\treturn node;\n}\n\n\n/**\n * Alter the display settings to change the page\n *  @param {object} settings DataTables settings object\n *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n *    \"next\" or \"last\" or page number to jump to (integer)\n *  @param [bool] redraw Automatically draw the update or not\n *  @returns {bool} true page has changed, false - no change\n *  @memberof DataTable#oApi\n */\nfunction _fnPageChange ( settings, action, redraw )\n{\n\tvar\n\t\tstart     = settings._iDisplayStart,\n\t\tlen       = settings._iDisplayLength,\n\t\trecords   = settings.fnRecordsDisplay();\n\n\tif ( records === 0 || len === -1 )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( typeof action === \"number\" )\n\t{\n\t\tstart = action * len;\n\n\t\tif ( start > records )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t}\n\telse if ( action == \"first\" )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( action == \"previous\" )\n\t{\n\t\tstart = len >= 0 ?\n\t\t\tstart - len :\n\t\t\t0;\n\n\t\tif ( start < 0 )\n\t\t{\n\t\t  start = 0;\n\t\t}\n\t}\n\telse if ( action == \"next\" )\n\t{\n\t\tif ( start + len < records )\n\t\t{\n\t\t\tstart += len;\n\t\t}\n\t}\n\telse if ( action == \"last\" )\n\t{\n\t\tstart = Math.floor( (records-1) / len) * len;\n\t}\n\telse\n\t{\n\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t}\n\n\tvar changed = settings._iDisplayStart !== start;\n\tsettings._iDisplayStart = start;\n\n\tif ( changed ) {\n\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\n\t\tif ( redraw ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t}\n\telse {\n\t\t// No change event - paging was called, but no change\n\t\t_fnCallbackFire( settings, null, 'page-nc', [settings] );\n\t}\n\n\treturn changed;\n}\n\n\n\n/**\n * Generate the node required for the processing node\n *  @param {object} settings dataTables settings object\n *  @returns {node} Processing element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlProcessing ( settings )\n{\n\treturn $('<div/>', {\n\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t'class': settings.oClasses.sProcessing,\n\t\t\t'role': 'status'\n\t\t} )\n\t\t.html( settings.oLanguage.sProcessing )\n\t\t.append('<div><div></div><div></div><div></div><div></div></div>')\n\t\t.insertBefore( settings.nTable )[0];\n}\n\n\n/**\n * Display or hide the processing indicator\n *  @param {object} settings dataTables settings object\n *  @param {bool} show Show the processing indicator (true) or not (false)\n *  @memberof DataTable#oApi\n */\nfunction _fnProcessingDisplay ( settings, show )\n{\n\tif ( settings.oFeatures.bProcessing ) {\n\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t}\n\n\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n}\n\n/**\n * Add any control elements for the table - specifically scrolling\n *  @param {object} settings dataTables settings object\n *  @returns {node} Node to add to the DOM\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlTable ( settings )\n{\n\tvar table = $(settings.nTable);\n\n\t// Scrolling from here on in\n\tvar scroll = settings.oScroll;\n\n\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\treturn settings.nTable;\n\t}\n\n\tvar scrollX = scroll.sX;\n\tvar scrollY = scroll.sY;\n\tvar classes = settings.oClasses;\n\tvar caption = table.children('caption');\n\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\tvar headerClone = $( table[0].cloneNode(false) );\n\tvar footerClone = $( table[0].cloneNode(false) );\n\tvar footer = table.children('tfoot');\n\tvar _div = '<div/>';\n\tvar size = function ( s ) {\n\t\treturn !s ? null : _fnStringToCss( s );\n\t};\n\n\tif ( ! footer.length ) {\n\t\tfooter = null;\n\t}\n\n\t/*\n\t * The HTML structure that we want to generate in this function is:\n\t *  div - scroller\n\t *    div - scroll head\n\t *      div - scroll head inner\n\t *        table - scroll head table\n\t *          thead - thead\n\t *    div - scroll body\n\t *      table - table (master table)\n\t *        thead - thead clone for sizing\n\t *        tbody - tbody\n\t *    div - scroll foot\n\t *      div - scroll foot inner\n\t *        table - scroll foot table\n\t *          tfoot - tfoot\n\t */\n\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t} )\n\t\t\t\t.append( table )\n\t\t);\n\n\tif ( footer ) {\n\t\tscroller.append(\n\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t);\n\t}\n\n\tvar children = scroller.children();\n\tvar scrollHead = children[0];\n\tvar scrollBody = children[1];\n\tvar scrollFoot = footer ? children[2] : null;\n\n\t// When the body is scrolled, then we also want to scroll the headers\n\tif ( scrollX ) {\n\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\tvar scrollLeft = this.scrollLeft;\n\n\t\t\tscrollHead.scrollLeft = scrollLeft;\n\n\t\t\tif ( footer ) {\n\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t}\n\t\t} );\n\t}\n\n\t$(scrollBody).css('max-height', scrollY);\n\tif (! scroll.bCollapse) {\n\t\t$(scrollBody).css('height', scrollY);\n\t}\n\n\tsettings.nScrollHead = scrollHead;\n\tsettings.nScrollBody = scrollBody;\n\tsettings.nScrollFoot = scrollFoot;\n\n\t// On redraw - align columns\n\tsettings.aoDrawCallback.push( {\n\t\t\"fn\": _fnScrollDraw,\n\t\t\"sName\": \"scrolling\"\n\t} );\n\n\treturn scroller[0];\n}\n\n\n\n/**\n * Update the header, footer and body tables for resizing - i.e. column\n * alignment.\n *\n * Welcome to the most horrible function DataTables. The process that this\n * function follows is basically:\n *   1. Re-create the table inside the scrolling div\n *   2. Take live measurements from the DOM\n *   3. Apply the measurements to align the columns\n *   4. Clean up\n *\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnScrollDraw ( settings )\n{\n\t// Given that this is such a monster function, a lot of variables are use\n\t// to try and keep the minimised size as small as possible\n\tvar\n\t\tscroll         = settings.oScroll,\n\t\tscrollX        = scroll.sX,\n\t\tscrollXInner   = scroll.sXInner,\n\t\tscrollY        = scroll.sY,\n\t\tbarWidth       = scroll.iBarWidth,\n\t\tdivHeader      = $(settings.nScrollHead),\n\t\tdivHeaderStyle = divHeader[0].style,\n\t\tdivHeaderInner = divHeader.children('div'),\n\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\tdivBodyEl      = settings.nScrollBody,\n\t\tdivBody        = $(divBodyEl),\n\t\tdivBodyStyle   = divBodyEl.style,\n\t\tdivFooter      = $(settings.nScrollFoot),\n\t\tdivFooterInner = divFooter.children('div'),\n\t\tdivFooterTable = divFooterInner.children('table'),\n\t\theader         = $(settings.nTHead),\n\t\ttable          = $(settings.nTable),\n\t\ttableEl        = table[0],\n\t\ttableStyle     = tableEl.style,\n\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\tbrowser        = settings.oBrowser,\n\t\tie67           = browser.bScrollOversize,\n\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\theaderTrgEls, footerTrgEls,\n\t\theaderSrcEls, footerSrcEls,\n\t\theaderCopy, footerCopy,\n\t\theaderWidths=[], footerWidths=[],\n\t\theaderContent=[], footerContent=[],\n\t\tidx, correction, sanityWidth,\n\t\tzeroOut = function(nSizer) {\n\t\t\tvar style = nSizer.style;\n\t\t\tstyle.paddingTop = \"0\";\n\t\t\tstyle.paddingBottom = \"0\";\n\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\tstyle.height = 0;\n\t\t};\n\n\t// If the scrollbar visibility has changed from the last draw, we need to\n\t// adjust the column sizes as the table width will have changed to account\n\t// for the scrollbar\n\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\n\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t_fnAdjustColumnSizing( settings );\n\t\treturn; // adjust column sizing will call this function again\n\t}\n\telse {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t}\n\n\t/*\n\t * 1. Re-create the table inside the scrolling div\n\t */\n\n\t// Remove the old minimised thead and tfoot elements in the inner table\n\ttable.children('thead, tfoot').remove();\n\n\tif ( footer ) {\n\t\tfooterCopy = footer.clone().prependTo( table );\n\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\tfooterSrcEls = footerCopy.find('tr');\n\t\tfooterCopy.find('[id]').removeAttr('id');\n\t}\n\n\t// Clone the current header and footer elements and then place it into the inner table\n\theaderCopy = header.clone().prependTo( table );\n\theaderTrgEls = header.find('tr'); // original header is in its own table\n\theaderSrcEls = headerCopy.find('tr');\n\theaderCopy.find('th, td').removeAttr('tabindex');\n\theaderCopy.find('[id]').removeAttr('id');\n\n\n\t/*\n\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t */\n\n\t// Remove old sizing and apply the calculated column widths\n\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t// calculated sizes to this header\n\tif ( ! scrollX )\n\t{\n\t\tdivBodyStyle.width = '100%';\n\t\tdivHeader[0].style.width = '100%';\n\t}\n\n\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t} );\n\n\tif ( footer ) {\n\t\t_fnApplyToChildren( function(n) {\n\t\t\tn.style.width = \"\";\n\t\t}, footerSrcEls );\n\t}\n\n\t// Size the table as a whole\n\tsanityWidth = table.outerWidth();\n\tif ( scrollX === \"\" ) {\n\t\t// No x scrolling\n\t\ttableStyle.width = \"100%\";\n\n\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t// into account.\n\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t}\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\telse if ( scrollXInner !== \"\" ) {\n\t\t// legacy x scroll inner has been given - use it\n\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\n\t// Hidden header should have zero height, so remove padding and borders. Then\n\t// set the width based on the real headers\n\n\t// Apply all styles in one pass\n\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\n\t// Read all widths in next pass\n\t_fnApplyToChildren( function(nSizer) {\n\t\tvar style = window.getComputedStyle ?\n\t\t\twindow.getComputedStyle(nSizer).width :\n\t\t\t_fnStringToCss( $(nSizer).width() );\n\n\t\theaderContent.push( nSizer.innerHTML );\n\t\theaderWidths.push( style );\n\t}, headerSrcEls );\n\n\t// Apply all widths in final pass\n\t_fnApplyToChildren( function(nToSize, i) {\n\t\tnToSize.style.width = headerWidths[i];\n\t}, headerTrgEls );\n\n\t$(headerSrcEls).css('height', 0);\n\n\t/* Same again with the footer if we have one */\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\tnToSize.style.width = footerWidths[i];\n\t\t}, footerTrgEls );\n\n\t\t$(footerSrcEls).height(0);\n\t}\n\n\n\t/*\n\t * 3. Apply the measurements\n\t */\n\n\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t// the content of the cell so that the width applied to the header and body\n\t// both match, but we want to hide it completely. We want to also fix their\n\t// width to what they currently are\n\t_fnApplyToChildren( function(nSizer, i) {\n\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+headerContent[i]+'</div>';\n\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\tnSizer.style.width = headerWidths[i];\n\t}, headerSrcEls );\n\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+footerContent[i]+'</div>';\n\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\tnSizer.style.width = footerWidths[i];\n\t\t}, footerSrcEls );\n\t}\n\n\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\tif ( Math.round(table.outerWidth()) < Math.round(sanityWidth) )\n\t{\n\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\tsanityWidth+barWidth :\n\t\t\t\tsanityWidth;\n\n\t\t// IE6/7 are a law unto themselves...\n\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t}\n\n\t\t// And give the user a warning that we've stopped the table getting too small\n\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t}\n\t}\n\telse\n\t{\n\t\tcorrection = '100%';\n\t}\n\n\t// Apply to the container elements\n\tdivBodyStyle.width = _fnStringToCss( correction );\n\tdivHeaderStyle.width = _fnStringToCss( correction );\n\n\tif ( footer ) {\n\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t}\n\n\n\t/*\n\t * 4. Clean up\n\t */\n\tif ( ! scrollY ) {\n\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t */\n\t\tif ( ie67 ) {\n\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t}\n\t}\n\n\t/* Finally set the width's of the header and footer tables */\n\tvar iOuterWidth = table.outerWidth();\n\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\n\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\n\tif ( footer ) {\n\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t}\n\n\t// Correct DOM ordering for colgroup - comes before the thead\n\ttable.children('colgroup').insertBefore( table.children('thead') );\n\n\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\tdivBody.trigger('scroll');\n\n\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t// only if we aren't holding the position\n\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\tdivBodyEl.scrollTop = 0;\n\t}\n}\n\n\n\n/**\n * Apply a given function to the display child nodes of an element array (typically\n * TD children of TR rows\n *  @param {function} fn Method to apply to the objects\n *  @param array {nodes} an1 List of elements to look through for display children\n *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyToChildren( fn, an1, an2 )\n{\n\tvar index=0, i=0, iLen=an1.length;\n\tvar nNode1, nNode2;\n\n\twhile ( i < iLen ) {\n\t\tnNode1 = an1[i].firstChild;\n\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\n\t\twhile ( nNode1 ) {\n\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\tif ( an2 ) {\n\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t}\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t}\n\n\t\ti++;\n\t}\n}\n\n\n\nvar __re_html_remove = /<.*?>/g;\n\n\n/**\n * Calculate the width of columns for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnCalculateColumnWidths ( oSettings )\n{\n\tvar\n\t\ttable = oSettings.nTable,\n\t\tcolumns = oSettings.aoColumns,\n\t\tscroll = oSettings.oScroll,\n\t\tscrollY = scroll.sY,\n\t\tscrollX = scroll.sX,\n\t\tscrollXInner = scroll.sXInner,\n\t\tcolumnCount = columns.length,\n\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\theaderCells = $('th', oSettings.nTHead),\n\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\ttableContainer = table.parentNode,\n\t\tuserInputs = false,\n\t\ti, column, columnIdx, width, outerWidth,\n\t\tbrowser = oSettings.oBrowser,\n\t\tie67 = browser.bScrollOversize;\n\n\tvar styleWidth = table.style.width;\n\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\ttableWidthAttr = styleWidth;\n\t}\n\n\t/* Convert any user input sizes into pixel sizes */\n\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\tif ( column.sWidth !== null ) {\n\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\n\t\t\tuserInputs = true;\n\t\t}\n\t}\n\n\t/* If the number of columns in the DOM equals the number that we have to\n\t * process in DataTables, then we can use the offsets that are created by\n\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t * nor scrolling used\n\t */\n\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t     columnCount == headerCells.length\n\t) {\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\n\t\t\tif ( colIdx !== null ) {\n\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t// table widths\n\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t.removeAttr( 'id' );\n\n\t\t// Clean up the table body\n\t\ttmpTable.find('tbody tr').remove();\n\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\n\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t// real header and footer are contained in different table tags\n\t\ttmpTable.find('thead, tfoot').remove();\n\t\ttmpTable\n\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t.append( $(oSettings.nTFoot).clone() );\n\n\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\n\t\t// Apply custom sizing to the cloned header\n\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t'';\n\n\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t// width the column requires, then it will have no effect\n\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborder: 0,\n\t\t\t\t\theight: 1\n\t\t\t\t} ) );\n\t\t\t}\n\t\t}\n\n\t\t// Find the widest cell for each column and put it into the table\n\t\tif ( oSettings.aoData.length ) {\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\tcolumn = columns[ columnIdx ];\n\n\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t.clone( false )\n\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t.appendTo( tr );\n\t\t\t}\n\t\t}\n\n\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t// duplicated in the dom (radio elements for example)\n\t\t$('[name]', tmpTable).removeAttr('name');\n\n\t\t// Table has been built, attach to the document so we can work with it.\n\t\t// A holding element is used, positioned at the top of the container\n\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t// needed\n\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\theight: 1,\n\t\t\t\t\tright: 0,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} :\n\t\t\t\t{}\n\t\t\t)\n\t\t\t.append( tmpTable )\n\t\t\t.appendTo( tableContainer );\n\n\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t// is. This results in slightly different, but I think correct behaviour\n\t\tif ( scrollX && scrollXInner ) {\n\t\t\ttmpTable.width( scrollXInner );\n\t\t}\n\t\telse if ( scrollX ) {\n\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\ttmpTable.removeAttr('width');\n\n\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t// collapse\n\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t}\n\t\telse if ( scrollY ) {\n\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t}\n\t\telse if ( tableWidthAttr ) {\n\t\t\ttmpTable.width( tableWidthAttr );\n\t\t}\n\n\t\t// Get the width of each column in the constructed table - we need to\n\t\t// know the inner width (so it can be assigned to the other table's\n\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t// column, but if ever a header can span multiple columns, this will\n\t\t// need to be modified.\n\t\tvar total = 0;\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tvar cell = $(headerCells[i]);\n\t\t\tvar border = cell.outerWidth() - cell.width();\n\n\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\tcell.outerWidth();\n\n\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\ttotal += bounding;\n\n\t\t\t// Width for each column to use\n\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t}\n\n\t\ttable.style.width = _fnStringToCss( total );\n\n\t\t// Finished with the table - ditch it\n\t\tholder.remove();\n\t}\n\n\t// If there is a width attr, we want to attach an event listener which\n\t// allows the table sizing to automatically adjust when the window is\n\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t// CSS is a relative value or absolute - DOM read is always px.\n\tif ( tableWidthAttr ) {\n\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t}\n\n\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\tvar bindResize = function () {\n\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t} ) );\n\t\t};\n\n\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\tif ( ie67 ) {\n\t\t\tsetTimeout( bindResize, 1000 );\n\t\t}\n\t\telse {\n\t\t\tbindResize();\n\t\t}\n\n\t\toSettings._reszEvt = true;\n\t}\n}\n\n\n/**\n * Throttle the calls to a function. Arguments and context are maintained for\n * the throttled function\n *  @param {function} fn Function to be called\n *  @param {int} [freq=200] call frequency in mS\n *  @returns {function} wrapped function\n *  @memberof DataTable#oApi\n */\nvar _fnThrottle = DataTable.util.throttle;\n\n\n/**\n * Convert a CSS unit width to pixels (e.g. 2em)\n *  @param {string} width width to be converted\n *  @param {node} parent parent to get the with for (required for relative widths) - optional\n *  @returns {int} width in pixels\n *  @memberof DataTable#oApi\n */\nfunction _fnConvertToWidth ( width, parent )\n{\n\tif ( ! width ) {\n\t\treturn 0;\n\t}\n\n\tvar n = $('<div/>')\n\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t.appendTo( parent || document.body );\n\n\tvar val = n[0].offsetWidth;\n\tn.remove();\n\n\treturn val;\n}\n\n\n/**\n * Get the widest node\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {node} widest table node\n *  @memberof DataTable#oApi\n */\nfunction _fnGetWidestNode( settings, colIdx )\n{\n\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\tif ( idx < 0 ) {\n\t\treturn null;\n\t}\n\n\tvar data = settings.aoData[ idx ];\n\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\tdata.anCells[ colIdx ];\n}\n\n\n/**\n * Get the maximum strlen for each data column\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {string} max string length for each column\n *  @memberof DataTable#oApi\n */\nfunction _fnGetMaxLenString( settings, colIdx )\n{\n\tvar s, max=-1, maxIdx = -1;\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\ts = s.replace( __re_html_remove, '' );\n\t\ts = s.replace( /&nbsp;/g, ' ' );\n\n\t\tif ( s.length > max ) {\n\t\t\tmax = s.length;\n\t\t\tmaxIdx = i;\n\t\t}\n\t}\n\n\treturn maxIdx;\n}\n\n\n/**\n * Append a CSS unit (only if required) to a string\n *  @param {string} value to css-ify\n *  @returns {string} value with css unit\n *  @memberof DataTable#oApi\n */\nfunction _fnStringToCss( s )\n{\n\tif ( s === null ) {\n\t\treturn '0px';\n\t}\n\n\tif ( typeof s == 'number' ) {\n\t\treturn s < 0 ?\n\t\t\t'0px' :\n\t\t\ts+'px';\n\t}\n\n\t// Check it has a unit character already\n\treturn s.match(/\\d$/) ?\n\t\ts+'px' :\n\t\ts;\n}\n\n\n\nfunction _fnSortFlatten ( settings )\n{\n\tvar\n\t\ti, iLen, k, kLen,\n\t\taSort = [],\n\t\taiOrig = [],\n\t\taoColumns = settings.aoColumns,\n\t\taDataSort, iCol, sType, srcCol,\n\t\tfixed = settings.aaSortingFixed,\n\t\tfixedObj = $.isPlainObject( fixed ),\n\t\tnestedSort = [],\n\t\tadd = function ( a ) {\n\t\t\tif ( a.length && ! Array.isArray( a[0] ) ) {\n\t\t\t\t// 1D array\n\t\t\t\tnestedSort.push( a );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// 2D array\n\t\t\t\t$.merge( nestedSort, a );\n\t\t\t}\n\t\t};\n\n\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t// specified\n\tif ( Array.isArray( fixed ) ) {\n\t\tadd( fixed );\n\t}\n\n\tif ( fixedObj && fixed.pre ) {\n\t\tadd( fixed.pre );\n\t}\n\n\tadd( settings.aaSorting );\n\n\tif (fixedObj && fixed.post ) {\n\t\tadd( fixed.post );\n\t}\n\n\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t{\n\t\tsrcCol = nestedSort[i][0];\n\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\n\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t{\n\t\t\tiCol = aDataSort[k];\n\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\n\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t}\n\n\t\t\taSort.push( {\n\t\t\t\tsrc:       srcCol,\n\t\t\t\tcol:       iCol,\n\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\ttype:      sType,\n\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t} );\n\t\t}\n\t}\n\n\treturn aSort;\n}\n\n/**\n * Change the order of the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n *  @todo This really needs split up!\n */\nfunction _fnSort ( oSettings )\n{\n\tvar\n\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\tsDataType, nTh,\n\t\taiOrig = [],\n\t\toExtSort = DataTable.ext.type.order,\n\t\taoData = oSettings.aoData,\n\t\taoColumns = oSettings.aoColumns,\n\t\taDataSort, data, iCol, sType, oSort,\n\t\tformatters = 0,\n\t\tsortCol,\n\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\taSort;\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t//   data is going to be used in the table?\n\t_fnColumnTypes( oSettings );\n\n\taSort = _fnSortFlatten( oSettings );\n\n\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\tsortCol = aSort[i];\n\n\t\t// Track if we can use the fast sort algorithm\n\t\tif ( sortCol.formatter ) {\n\t\t\tformatters++;\n\t\t}\n\n\t\t// Load the data needed for the sort, for each cell\n\t\t_fnSortData( oSettings, sortCol.col );\n\t}\n\n\t/* No sorting required if server-side or no sorting array */\n\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t{\n\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t}\n\n\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t *  fnLocalSorting = function(a,b){\n\t\t *    var iTest;\n\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t *      if (iTest !== 0)\n\t\t *        return iTest;\n\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t *    if (iTest !== 0)\n\t\t *      return iTest;\n\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t *  }\n\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t * positions in the original data array to provide a stable sort.\n\t\t *\n\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t * methods which do not have a pre-sort formatting function.\n\t\t */\n\t\tif ( formatters === aSort.length ) {\n\t\t\t// All sort types have formatting functions\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t// methods.\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t}\n\n\t/* Tell the draw function that we have sorted the data */\n\toSettings.bSorted = true;\n}\n\n\nfunction _fnSortAria ( settings )\n{\n\tvar label;\n\tvar nextSort;\n\tvar columns = settings.aoColumns;\n\tvar aSort = _fnSortFlatten( settings );\n\tvar oAria = settings.oLanguage.oAria;\n\n\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t// attributes as needed)\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tvar col = columns[i];\n\t\tvar asSorting = col.asSorting;\n\t\tvar sTitle = col.ariaTitle || col.sTitle.replace( /<.*?>/g, \"\" );\n\t\tvar th = col.nTh;\n\n\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t// attr() and removeAttr() methods...\n\t\tth.removeAttribute('aria-sort');\n\n\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\tif ( col.bSortable ) {\n\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnextSort = asSorting[0];\n\t\t\t}\n\n\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\toAria.sSortAscending :\n\t\t\t\toAria.sSortDescending\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tlabel = sTitle;\n\t\t}\n\n\t\tth.setAttribute('aria-label', label);\n\t}\n}\n\n\n/**\n * Function to run on user sort request\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {boolean} [append=false] Append the requested sort to the existing\n *    sort if true (i.e. multi-column sort)\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortListener ( settings, colIdx, append, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\tvar sorting = settings.aaSorting;\n\tvar asSorting = col.asSorting;\n\tvar nextSortIdx;\n\tvar next = function ( a, overflow ) {\n\t\tvar idx = a._idx;\n\t\tif ( idx === undefined ) {\n\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t}\n\n\t\treturn idx+1 < asSorting.length ?\n\t\t\tidx+1 :\n\t\t\toverflow ?\n\t\t\t\tnull :\n\t\t\t\t0;\n\t};\n\n\t// Convert to 2D array if needed\n\tif ( typeof sorting[0] === 'number' ) {\n\t\tsorting = settings.aaSorting = [ sorting ];\n\t}\n\n\t// If appending the sort then we are multi-column sorting\n\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t// Are we already doing some kind of sort on this column?\n\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\n\t\tif ( sortIdx !== -1 ) {\n\t\t\t// Yes, modify the sort\n\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\n\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t}\n\n\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// No sort on this column yet\n\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t}\n\t}\n\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t// Single column - already sorting on this column, modify the sort\n\t\tnextSortIdx = next( sorting[0] );\n\n\t\tsorting.length = 1;\n\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\tsorting[0]._idx = nextSortIdx;\n\t}\n\telse {\n\t\t// Single column - sort only on this column\n\t\tsorting.length = 0;\n\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\tsorting[0]._idx = 0;\n\t}\n\n\t// Run the sort by calling a full redraw\n\t_fnReDraw( settings );\n\n\t// callback used for async user interaction\n\tif ( typeof callback == 'function' ) {\n\t\tcallback( settings );\n\t}\n}\n\n\n/**\n * Attach a sort handler (click) to a node\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\n\t_fnBindAction( attachTo, {}, function (e) {\n\t\t/* If the column is not sortable - don't to anything */\n\t\tif ( col.bSortable === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If processing is enabled use a timeout to allow the processing\n\t\t// display to be shown - otherwise to it synchronously\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t_fnProcessingDisplay( settings, true );\n\n\t\t\tsetTimeout( function() {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\n\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t// processing display\n\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\t\telse {\n\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t}\n\t} );\n}\n\n\n/**\n * Set the sorting classes on table's body, Note: it is safe to call this function\n * when bSort and bSortClasses are false\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSortingClasses( settings )\n{\n\tvar oldSort = settings.aLastSort;\n\tvar sortClass = settings.oClasses.sSortColumn;\n\tvar sort = _fnSortFlatten( settings );\n\tvar features = settings.oFeatures;\n\tvar i, ien, colIdx;\n\n\tif ( features.bSort && features.bSortClasses ) {\n\t\t// Remove old sorting classes\n\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = oldSort[i].src;\n\n\t\t\t// Remove column sorting\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\n\t\t// Add new column sorting\n\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = sort[i].src;\n\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\t}\n\n\tsettings.aLastSort = sort;\n}\n\n\n// Get the data to sort a column, be it from cache, fresh (populating the\n// cache), or from a sort formatter\nfunction _fnSortData( settings, idx )\n{\n\t// Custom sorting function - provided by the sort data type\n\tvar column = settings.aoColumns[ idx ];\n\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\tvar customData;\n\n\tif ( customSort ) {\n\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t);\n\t}\n\n\t// Use / populate cache\n\tvar row, cellData;\n\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aSortData ) {\n\t\t\trow._aSortData = [];\n\t\t}\n\n\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\tcellData = customSort ?\n\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\n\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\tformatter( cellData ) :\n\t\t\t\tcellData;\n\t\t}\n\t}\n}\n\n\n\n/**\n * Save the state of a table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSaveState ( settings )\n{\n\tif (settings._bLoadingState) {\n\t\treturn;\n\t}\n\n\t/* Store the interesting variables */\n\tvar state = {\n\t\ttime:    +new Date(),\n\t\tstart:   settings._iDisplayStart,\n\t\tlength:  settings._iDisplayLength,\n\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\treturn {\n\t\t\t\tvisible: col.bVisible,\n\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t};\n\t\t} )\n\t};\n\n\tsettings.oSavedState = state;\n\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\tif ( settings.oFeatures.bStateSave && !settings.bDestroying )\n\t{\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\t\n}\n\n\n/**\n * Attempt to load a saved table state\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oInit DataTables init object so we can override settings\n *  @param {function} callback Callback to execute when the state has been loaded\n *  @memberof DataTable#oApi\n */\nfunction _fnLoadState ( settings, oInit, callback )\n{\n\tif ( ! settings.oFeatures.bStateSave ) {\n\t\tcallback();\n\t\treturn;\n\t}\n\n\tvar loaded = function(state) {\n\t\t_fnImplementState(settings, state, callback);\n\t}\n\n\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\n\tif ( state !== undefined ) {\n\t\t_fnImplementState( settings, state, callback );\n\t}\n\t// otherwise, wait for the loaded callback to be executed\n\n\treturn true;\n}\n\nfunction _fnImplementState ( settings, s, callback) {\n\tvar i, ien;\n\tvar columns = settings.aoColumns;\n\tsettings._bLoadingState = true;\n\n\t// When StateRestore was introduced the state could now be implemented at any time\n\t// Not just initialisation. To do this an api instance is required in some places\n\tvar api = settings._bInitComplete ? new DataTable.Api(settings) : null;\n\n\tif ( ! s || ! s.time ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t// cancelling of loading by returning false\n\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Reject old data\n\tvar duration = settings.iStateDuration;\n\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Number of columns have changed - all bets are off, no restore of settings\n\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Store the saved state so it might be accessed at any time\n\tsettings.oLoadedState = $.extend( true, {}, s );\n\n\t// Page Length\n\tif ( s.length !== undefined ) {\n\t\t// If already initialised just set the value directly so that the select element is also updated\n\t\tif (api) {\n\t\t\tapi.page.len(s.length)\n\t\t}\n\t\telse {\n\t\t\tsettings._iDisplayLength   = s.length;\n\t\t}\n\t}\n\n\t// Restore key features - todo - for 1.11 this needs to be done by\n\t// subscribed events\n\tif ( s.start !== undefined ) {\n\t\tif(api === null) {\n\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t}\n\t\telse {\n\t\t\t_fnPageChange(settings, s.start/settings._iDisplayLength);\n\t\t}\n\t}\n\n\t// Order\n\tif ( s.order !== undefined ) {\n\t\tsettings.aaSorting = [];\n\t\t$.each( s.order, function ( i, col ) {\n\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t[ 0, col[1] ] :\n\t\t\t\tcol\n\t\t\t);\n\t\t} );\n\t}\n\n\t// Search\n\tif ( s.search !== undefined ) {\n\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t}\n\n\t// Columns\n\tif ( s.columns ) {\n\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\tvar col = s.columns[i];\n\n\t\t\t// Visibility\n\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t// If the api is defined, the table has been initialised so we need to use it rather than internal settings\n\t\t\t\tif (api) {\n\t\t\t\t\t// Don't redraw the columns on every iteration of this loop, we will do this at the end instead\n\t\t\t\t\tapi.column(i).visible(col.visible, false);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Search\n\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If the api is defined then we need to adjust the columns once the visibility has been changed\n\t\tif (api) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t}\n\n\tsettings._bLoadingState = false;\n\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\tcallback();\n};\n\n\n/**\n * Return the settings object for a particular table\n *  @param {node} table table we are using as a dataTable\n *  @returns {object} Settings object - or null if not found\n *  @memberof DataTable#oApi\n */\nfunction _fnSettingsFromNode ( table )\n{\n\tvar settings = DataTable.settings;\n\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\n\treturn idx !== -1 ?\n\t\tsettings[ idx ] :\n\t\tnull;\n}\n\n\n/**\n * Log an error message\n *  @param {object} settings dataTables settings object\n *  @param {int} level log error messages, or display them to the user\n *  @param {string} msg error message\n *  @param {int} tn Technical note id to get more information about the error.\n *  @memberof DataTable#oApi\n */\nfunction _fnLog( settings, level, msg, tn )\n{\n\tmsg = 'DataTables warning: '+\n\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\n\tif ( tn ) {\n\t\tmsg += '. For more information about this error, please see '+\n\t\t'http://datatables.net/tn/'+tn;\n\t}\n\n\tif ( ! level  ) {\n\t\t// Backwards compatibility pre 1.10\n\t\tvar ext = DataTable.ext;\n\t\tvar type = ext.sErrMode || ext.errMode;\n\n\t\tif ( settings ) {\n\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t}\n\n\t\tif ( type == 'alert' ) {\n\t\t\talert( msg );\n\t\t}\n\t\telse if ( type == 'throw' ) {\n\t\t\tthrow new Error(msg);\n\t\t}\n\t\telse if ( typeof type == 'function' ) {\n\t\t\ttype( settings, tn, msg );\n\t\t}\n\t}\n\telse if ( window.console && console.log ) {\n\t\tconsole.log( msg );\n\t}\n}\n\n\n/**\n * See if a property is defined on one object, if so assign it to the other object\n *  @param {object} ret target object\n *  @param {object} src source object\n *  @param {string} name property\n *  @param {string} [mappedName] name to map too - optional, name used if not given\n *  @memberof DataTable#oApi\n */\nfunction _fnMap( ret, src, name, mappedName )\n{\n\tif ( Array.isArray( name ) ) {\n\t\t$.each( name, function (i, val) {\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnMap( ret, src, val );\n\t\t\t}\n\t\t} );\n\n\t\treturn;\n\t}\n\n\tif ( mappedName === undefined ) {\n\t\tmappedName = name;\n\t}\n\n\tif ( src[name] !== undefined ) {\n\t\tret[mappedName] = src[name];\n\t}\n}\n\n\n/**\n * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n * shallow copy arrays. The reason we need to do this, is that we don't want to\n * deep copy array init values (such as aaSorting) since the dev wouldn't be\n * able to override them, but we do want to deep copy arrays.\n *  @param {object} out Object to extend\n *  @param {object} extender Object from which the properties will be applied to\n *      out\n *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n *      independent copy with the exception of the `data` or `aaData` parameters\n *      if they are present. This is so you can pass in a collection to\n *      DataTables and have that used as your data source without breaking the\n *      references\n *  @returns {object} out Reference, just for convenience - out === the return.\n *  @memberof DataTable#oApi\n *  @todo This doesn't take account of arrays inside the deep copied objects.\n */\nfunction _fnExtend( out, extender, breakRefs )\n{\n\tvar val;\n\n\tfor ( var prop in extender ) {\n\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\tval = extender[prop];\n\n\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\tout[prop] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t}\n\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val) ) {\n\t\t\t\tout[prop] = val.slice();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout[prop] = val;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n\n\n/**\n * Bind an event handers to allow a click or return key to activate the callback.\n * This is good for accessibility since a return on the keyboard will have the\n * same effect as a click, if the element has focus.\n *  @param {element} n Element to bind the action to\n *  @param {object} oData Data object to pass to the triggered function\n *  @param {function} fn Callback function for when the event is triggered\n *  @memberof DataTable#oApi\n */\nfunction _fnBindAction( n, oData, fn )\n{\n\t$(n)\n\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t$(n).trigger('blur'); // Remove focus outline for mouse users\n\t\t\t\tfn(e);\n\t\t\t} )\n\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfn(e);\n\t\t\t\t}\n\t\t\t} )\n\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\treturn false;\n\t\t\t} );\n}\n\n\n/**\n * Register a callback function. Easily allows a callback function to be added to\n * an array store of callback functions that can then all be called together.\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n *  @param {function} fn Function to be called back\n *  @param {string} sName Identifying name for the callback (i.e. a label)\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n{\n\tif ( fn )\n\t{\n\t\toSettings[sStore].push( {\n\t\t\t\"fn\": fn,\n\t\t\t\"sName\": sName\n\t\t} );\n\t}\n}\n\n\n/**\n * Fire callback functions and trigger events. Note that the loop over the\n * callback array store is done backwards! Further note that you do not want to\n * fire off triggers in time sensitive applications (for example cell creation)\n * as its slow.\n *  @param {object} settings dataTables settings object\n *  @param {string} callbackArr Name of the array storage for the callbacks in\n *      oSettings\n *  @param {string} eventName Name of the jQuery custom event to trigger. If\n *      null no trigger is fired\n *  @param {array} args Array of arguments to pass to the callback function /\n *      trigger\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n{\n\tvar ret = [];\n\n\tif ( callbackArr ) {\n\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t} );\n\t}\n\n\tif ( eventName !== null ) {\n\t\tvar e = $.Event( eventName+'.dt' );\n\t\tvar table = $(settings.nTable);\n\n\t\ttable.trigger( e, args );\n\n\t\t// If not yet attached to the document, trigger the event\n\t\t// on the body directly to sort of simulate the bubble\n\t\tif (table.parents('body').length === 0) {\n\t\t\t$('body').trigger( e, args );\n\t\t}\n\n\t\tret.push( e.result );\n\t}\n\n\treturn ret;\n}\n\n\nfunction _fnLengthOverflow ( settings )\n{\n\tvar\n\t\tstart = settings._iDisplayStart,\n\t\tend = settings.fnDisplayEnd(),\n\t\tlen = settings._iDisplayLength;\n\n\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\tif ( start >= end )\n\t{\n\t\tstart = end - len;\n\t}\n\n\t// Keep the start record on the current page\n\tstart -= (start % len);\n\n\tif ( len === -1 || start < 0 )\n\t{\n\t\tstart = 0;\n\t}\n\n\tsettings._iDisplayStart = start;\n}\n\n\nfunction _fnRenderer( settings, type )\n{\n\tvar renderer = settings.renderer;\n\tvar host = DataTable.ext.renderer[type];\n\n\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t// the default.\n\t\treturn host[renderer[type]] || host._;\n\t}\n\telse if ( typeof renderer === 'string' ) {\n\t\t// Common renderer - if there is one available for this type use it,\n\t\t// otherwise use the default\n\t\treturn host[renderer] || host._;\n\t}\n\n\t// Use the default\n\treturn host._;\n}\n\n\n/**\n * Detect the data source being used for the table. Used to simplify the code\n * a little (ajax) and to make it compress a little smaller.\n *\n *  @param {object} settings dataTables settings object\n *  @returns {string} Data source\n *  @memberof DataTable#oApi\n */\nfunction _fnDataSource ( settings )\n{\n\tif ( settings.oFeatures.bServerSide ) {\n\t\treturn 'ssp';\n\t}\n\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\treturn 'ajax';\n\t}\n\treturn 'dom';\n}\n\n\n\n\n/**\n * Computed structure of the DataTables API, defined by the options passed to\n * `DataTable.Api.register()` when building the API.\n *\n * The structure is built in order to speed creation and extension of the Api\n * objects since the extensions are effectively pre-parsed.\n *\n * The array is an array of objects with the following structure, where this\n * base array represents the Api prototype base:\n *\n *     [\n *       {\n *         name:      'data'                -- string   - Property name\n *         val:       function () {},       -- function - Api method (or undefined if just an object\n *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n *       },\n *       {\n *         name:     'row'\n *         val:       {},\n *         methodExt: [ ... ],\n *         propExt:   [\n *           {\n *             name:      'data'\n *             val:       function () {},\n *             methodExt: [ ... ],\n *             propExt:   [ ... ]\n *           },\n *           ...\n *         ]\n *       }\n *     ]\n *\n * @type {Array}\n * @ignore\n */\nvar __apiStruct = [];\n\n\n/**\n * `Array.prototype` reference.\n *\n * @type object\n * @ignore\n */\nvar __arrayProto = Array.prototype;\n\n\n/**\n * Abstraction for `context` parameter of the `Api` constructor to allow it to\n * take several different forms for ease of use.\n *\n * Each of the input parameter types will be converted to a DataTables settings\n * object where possible.\n *\n * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n *   of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n *   * `DataTables.Api` - API instance\n * @return {array|null} Matching DataTables settings objects. `null` or\n *   `undefined` is returned if no matching DataTable is found.\n * @ignore\n */\nvar _toSettings = function ( mixed )\n{\n\tvar idx, jq;\n\tvar settings = DataTable.settings;\n\tvar tables = $.map( settings, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\tif ( ! mixed ) {\n\t\treturn [];\n\t}\n\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t// DataTables settings object\n\t\treturn [ mixed ];\n\t}\n\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t// Table node\n\t\tidx = $.inArray( mixed, tables );\n\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t}\n\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\treturn mixed.settings().toArray();\n\t}\n\telse if ( typeof mixed === 'string' ) {\n\t\t// jQuery selector\n\t\tjq = $(mixed);\n\t}\n\telse if ( mixed instanceof $ ) {\n\t\t// jQuery object (also DataTables instance)\n\t\tjq = mixed;\n\t}\n\n\tif ( jq ) {\n\t\treturn jq.map( function(i) {\n\t\t\tidx = $.inArray( this, tables );\n\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t} ).toArray();\n\t}\n};\n\n\n/**\n * DataTables API class - used to control and interface with  one or more\n * DataTables enhanced tables.\n *\n * The API class is heavily based on jQuery, presenting a chainable interface\n * that you can use to interact with tables. Each instance of the API class has\n * a \"context\" - i.e. the tables that it will operate on. This could be a single\n * table, all tables on a page or a sub-set thereof.\n *\n * Additionally the API is designed to allow you to easily work with the data in\n * the tables, retrieving and manipulating it as required. This is done by\n * presenting the API class as an array like interface. The contents of the\n * array depend upon the actions requested by each method (for example\n * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n * return an array of objects or arrays depending upon your table's\n * configuration). The API object has a number of array like methods (`push`,\n * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n * `unique` etc) to assist your working with the data held in a table.\n *\n * Most methods (those which return an Api instance) are chainable, which means\n * the return from a method call also has all of the methods available that the\n * top level object had. For example, these two calls are equivalent:\n *\n *     // Not chained\n *     api.row.add( {...} );\n *     api.draw();\n *\n *     // Chained\n *     api.row.add( {...} ).draw();\n *\n * @class DataTable.Api\n * @param {array|object|string|jQuery} context DataTable identifier. This is\n *   used to define which DataTables enhanced tables this API will operate on.\n *   Can be one of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n * @param {array} [data] Data to initialise the Api instance with.\n *\n * @example\n *   // Direct initialisation during DataTables construction\n *   var api = $('#example').DataTable();\n *\n * @example\n *   // Initialisation using a DataTables jQuery object\n *   var api = $('#example').dataTable().api();\n *\n * @example\n *   // Initialisation as a constructor\n *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n */\n_Api = function ( context, data )\n{\n\tif ( ! (this instanceof _Api) ) {\n\t\treturn new _Api( context, data );\n\t}\n\n\tvar settings = [];\n\tvar ctxSettings = function ( o ) {\n\t\tvar a = _toSettings( o );\n\t\tif ( a ) {\n\t\t\tsettings.push.apply( settings, a );\n\t\t}\n\t};\n\n\tif ( Array.isArray( context ) ) {\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tctxSettings( context[i] );\n\t\t}\n\t}\n\telse {\n\t\tctxSettings( context );\n\t}\n\n\t// Remove duplicates\n\tthis.context = _unique( settings );\n\n\t// Initial data\n\tif ( data ) {\n\t\t$.merge( this, data );\n\t}\n\n\t// selector\n\tthis.selector = {\n\t\trows: null,\n\t\tcols: null,\n\t\topts: null\n\t};\n\n\t_Api.extend( this, this, __apiStruct );\n};\n\nDataTable.Api = _Api;\n\n// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n// isPlainObject.\n$.extend( _Api.prototype, {\n\tany: function ()\n\t{\n\t\treturn this.count() !== 0;\n\t},\n\n\n\tconcat:  __arrayProto.concat,\n\n\n\tcontext: [], // array of table settings objects\n\n\n\tcount: function ()\n\t{\n\t\treturn this.flatten().length;\n\t},\n\n\n\teach: function ( fn )\n\t{\n\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\tfn.call( this, this[i], i, this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\n\teq: function ( idx )\n\t{\n\t\tvar ctx = this.context;\n\n\t\treturn ctx.length > idx ?\n\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\tnull;\n\t},\n\n\n\tfilter: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.filter ) {\n\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\ta.push( this[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tflatten: function ()\n\t{\n\t\tvar a = [];\n\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t},\n\n\n\tjoin:    __arrayProto.join,\n\n\n\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t{\n\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\tif ( this[i] === obj ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\tvar\n\t\t\ta = [], ret,\n\t\t\ti, ien, j, jen,\n\t\t\tcontext = this.context,\n\t\t\trows, items, item,\n\t\t\tselector = this.selector;\n\n\t\t// Argument shifting\n\t\tif ( typeof flatten === 'string' ) {\n\t\t\talwaysNew = fn;\n\t\t\tfn = type;\n\t\t\ttype = flatten;\n\t\t\tflatten = false;\n\t\t}\n\n\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tvar apiInst = new _Api( context[i] );\n\n\t\t\tif ( type === 'table' ) {\n\t\t\t\tret = fn.call( apiInst, context[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\titems = this[i];\n\n\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t}\n\n\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\titem = items[j];\n\n\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( a.length || alwaysNew ) {\n\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\tvar apiSelector = api.selector;\n\t\t\tapiSelector.rows = selector.rows;\n\t\t\tapiSelector.cols = selector.cols;\n\t\t\tapiSelector.opts = selector.opts;\n\t\t\treturn api;\n\t\t}\n\t\treturn this;\n\t},\n\n\n\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t{\n\t\t// Bit cheeky...\n\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t},\n\n\n\tlength:  0,\n\n\n\tmap: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.map ) {\n\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tpluck: function ( prop )\n\t{\n\t\tvar fn = DataTable.util.get(prop);\n\n\t\treturn this.map( function ( el ) {\n\t\t\treturn fn(el);\n\t\t} );\n\t},\n\n\tpop:     __arrayProto.pop,\n\n\n\tpush:    __arrayProto.push,\n\n\n\t// Does not return an API instance\n\treduce: __arrayProto.reduce || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t},\n\n\n\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t},\n\n\n\treverse: __arrayProto.reverse,\n\n\n\t// Object with rows, columns and opts\n\tselector: null,\n\n\n\tshift:   __arrayProto.shift,\n\n\n\tslice: function () {\n\t\treturn new _Api( this.context, this );\n\t},\n\n\n\tsort:    __arrayProto.sort, // ? name - order?\n\n\n\tsplice:  __arrayProto.splice,\n\n\n\ttoArray: function ()\n\t{\n\t\treturn __arrayProto.slice.call( this );\n\t},\n\n\n\tto$: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\ttoJQuery: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\tunique: function ()\n\t{\n\t\treturn new _Api( this.context, _unique(this) );\n\t},\n\n\n\tunshift: __arrayProto.unshift\n} );\n\n\n_Api.extend = function ( scope, obj, ext )\n{\n\t// Only extend API instances and static properties of the API\n\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\tstruct,\n\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\treturn function () {\n\t\t\t\tvar ret = fn.apply( scope, arguments );\n\n\t\t\t\t// Method extension\n\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\treturn ret;\n\t\t\t};\n\t\t};\n\n\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\tstruct = ext[i];\n\n\t\t// Value\n\t\tobj[ struct.name ] = struct.type === 'function' ?\n\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\tstruct.type === 'object' ?\n\t\t\t\t{} :\n\t\t\t\tstruct.val;\n\n\t\tobj[ struct.name ].__dt_wrapper = true;\n\n\t\t// Property extension\n\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t}\n};\n\n\n// @todo - Is there need for an augment function?\n// _Api.augment = function ( inst, name )\n// {\n// \t// Find src object in the structure from the name\n// \tvar parts = name.split('.');\n\n// \t_Api.extend( inst, obj );\n// };\n\n\n//     [\n//       {\n//         name:      'data'                -- string   - Property name\n//         val:       function () {},       -- function - Api method (or undefined if just an object\n//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n//       },\n//       {\n//         name:     'row'\n//         val:       {},\n//         methodExt: [ ... ],\n//         propExt:   [\n//           {\n//             name:      'data'\n//             val:       function () {},\n//             methodExt: [ ... ],\n//             propExt:   [ ... ]\n//           },\n//           ...\n//         ]\n//       }\n//     ]\n\n_Api.register = _api_register = function ( name, val )\n{\n\tif ( Array.isArray( name ) ) {\n\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t_Api.register( name[j], val );\n\t\t}\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\their = name.split('.'),\n\t\tstruct = __apiStruct,\n\t\tkey, method;\n\n\tvar find = function ( src, name ) {\n\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\tif ( src[i].name === name ) {\n\t\t\t\treturn src[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\tkey = method ?\n\t\t\their[i].replace('()', '') :\n\t\t\their[i];\n\n\t\tvar src = find( struct, key );\n\t\tif ( ! src ) {\n\t\t\tsrc = {\n\t\t\t\tname:      key,\n\t\t\t\tval:       {},\n\t\t\t\tmethodExt: [],\n\t\t\t\tpropExt:   [],\n\t\t\t\ttype:      'object'\n\t\t\t};\n\t\t\tstruct.push( src );\n\t\t}\n\n\t\tif ( i === ien-1 ) {\n\t\t\tsrc.val = val;\n\t\t\tsrc.type = typeof val === 'function' ?\n\t\t\t\t'function' :\n\t\t\t\t$.isPlainObject( val ) ?\n\t\t\t\t\t'object' :\n\t\t\t\t\t'other';\n\t\t}\n\t\telse {\n\t\t\tstruct = method ?\n\t\t\t\tsrc.methodExt :\n\t\t\t\tsrc.propExt;\n\t\t}\n\t}\n};\n\n_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t_Api.register( pluralName, val );\n\n\t_Api.register( singularName, function () {\n\t\tvar ret = val.apply( this, arguments );\n\n\t\tif ( ret === this ) {\n\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\treturn this;\n\t\t}\n\t\telse if ( ret instanceof _Api ) {\n\t\t\t// New API instance returned, want the value from the first item\n\t\t\t// in the returned array for the singular result.\n\t\t\treturn ret.length ?\n\t\t\t\tArray.isArray( ret[0] ) ?\n\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\tret[0] :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// Non-API return - just fire it back\n\t\treturn ret;\n\t} );\n};\n\n\n/**\n * Selector for HTML tables. Apply the given selector to the give array of\n * DataTables settings objects.\n *\n * @param {string|integer} [selector] jQuery selector string or integer\n * @param  {array} Array of DataTables settings objects to be filtered\n * @return {array}\n * @ignore\n */\nvar __table_selector = function ( selector, a )\n{\n\tif ( Array.isArray(selector) ) {\n\t\treturn $.map( selector, function (item) {\n\t\t\treturn __table_selector(item, a);\n\t\t} );\n\t}\n\n\t// Integer is used to pick out a table by index\n\tif ( typeof selector === 'number' ) {\n\t\treturn [ a[ selector ] ];\n\t}\n\n\t// Perform a jQuery selector on the table nodes\n\tvar nodes = $.map( a, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\treturn $(nodes)\n\t\t.filter( selector )\n\t\t.map( function (i) {\n\t\t\t// Need to translate back from the table node to the settings\n\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\treturn a[ idx ];\n\t\t} )\n\t\t.toArray();\n};\n\n\n\n/**\n * Context selector for the API's context (i.e. the tables the API instance\n * refers to.\n *\n * @name    DataTable.Api#tables\n * @param {string|integer} [selector] Selector to pick which tables the iterator\n *   should operate on. If not given, all tables in the current context are\n *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n *   select multiple tables or as an integer to select a single table.\n * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n */\n_api_register( 'tables()', function ( selector ) {\n\t// A new instance is created if there was a selector specified\n\treturn selector !== undefined && selector !== null ?\n\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\tthis;\n} );\n\n\n_api_register( 'table()', function ( selector ) {\n\tvar tables = this.tables( selector );\n\tvar ctx = tables.context;\n\n\t// Truncate to the first matched table\n\treturn ctx.length ?\n\t\tnew _Api( ctx[0] ) :\n\t\ttables;\n} );\n\n\n_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTable;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTBody;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTHead;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTFoot;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTableWrapper;\n\t}, 1 );\n} );\n\n\n\n/**\n * Redraw the tables in the current context.\n */\n_api_register( 'draw()', function ( paging ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( paging === 'page' ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t\telse {\n\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\tfalse :\n\t\t\t\t\ttrue;\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, paging===false );\n\t\t}\n\t} );\n} );\n\n\n\n/**\n * Get the current page index.\n *\n * @return {integer} Current page index (zero based)\n *//**\n * Set the current page.\n *\n * Note that if you attempt to show a page which does not exist, DataTables will\n * not throw an error, but rather reset the paging.\n *\n * @param {integer|string} action The paging action to take. This can be one of:\n *  * `integer` - The page index to jump to\n *  * `string` - An action to take:\n *    * `first` - Jump to first page.\n *    * `next` - Jump to the next page\n *    * `previous` - Jump to previous page\n *    * `last` - Jump to the last page.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page()', function ( action ) {\n\tif ( action === undefined ) {\n\t\treturn this.page.info().page; // not an expensive call\n\t}\n\n\t// else, have an action to take on all tables\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnPageChange( settings, action );\n\t} );\n} );\n\n\n/**\n * Paging information for the first table in the current context.\n *\n * If you require paging information for another table, use the `table()` method\n * with a suitable selector.\n *\n * @return {object} Object with the following properties set:\n *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n *  * `pages` - Total number of pages\n *  * `start` - Display index for the first record shown on the current page\n *  * `end` - Display index for the last record shown on the current page\n *  * `length` - Display length (number of records). Note that generally `start\n *    + length = end`, but this is not always true, for example if there are\n *    only 2 records to show on the final page, with a length of 10.\n *  * `recordsTotal` - Full data set length\n *  * `recordsDisplay` - Data set length once the current filtering criterion\n *    are applied.\n */\n_api_register( 'page.info()', function ( action ) {\n\tif ( this.context.length === 0 ) {\n\t\treturn undefined;\n\t}\n\n\tvar\n\t\tsettings   = this.context[0],\n\t\tstart      = settings._iDisplayStart,\n\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn {\n\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\"start\":          start,\n\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\"length\":         len,\n\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\"recordsDisplay\": visRecords,\n\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t};\n} );\n\n\n/**\n * Get the current page length.\n *\n * @return {integer} Current page length. Note `-1` indicates that all records\n *   are to be shown.\n *//**\n * Set the current page length.\n *\n * @param {integer} Page length to set. Use `-1` to show all records.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page.len()', function ( len ) {\n\t// Note that we can't call this function 'length()' because `length`\n\t// is a Javascript property of functions which defines how many arguments\n\t// the function expects.\n\tif ( len === undefined ) {\n\t\treturn this.context.length !== 0 ?\n\t\t\tthis.context[0]._iDisplayLength :\n\t\t\tundefined;\n\t}\n\n\t// else, set the page length\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnLengthChange( settings, len );\n\t} );\n} );\n\n\n\nvar __reload = function ( settings, holdPosition, callback ) {\n\t// Use the draw event to trigger a callback\n\tif ( callback ) {\n\t\tvar api = new _Api( settings );\n\n\t\tapi.one( 'draw', function () {\n\t\t\tcallback( api.ajax.json() );\n\t\t} );\n\t}\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t_fnReDraw( settings, holdPosition );\n\t}\n\telse {\n\t\t_fnProcessingDisplay( settings, true );\n\n\t\t// Cancel an existing request\n\t\tvar xhr = settings.jqXHR;\n\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\txhr.abort();\n\t\t}\n\n\t\t// Trigger xhr\n\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t_fnClearTable( settings );\n\n\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t} );\n\t}\n};\n\n\n/**\n * Get the JSON response from the last Ajax request that DataTables made to the\n * server. Note that this returns the JSON from the first table in the current\n * context.\n *\n * @return {object} JSON received from the server.\n */\n_api_register( 'ajax.json()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].json;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Get the data submitted in the last Ajax request\n */\n_api_register( 'ajax.params()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].oAjaxData;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Reload tables from the Ajax data source. Note that this function will\n * automatically re-draw the table when the remote data has been loaded.\n *\n * @param {boolean} [reset=true] Reset (default) or hold the current paging\n *   position. A full re-sort and re-filter is performed when this method is\n *   called, which is why the pagination reset is the default action.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\treturn this.iterator( 'table', function (settings) {\n\t\t__reload( settings, resetPaging===false, callback );\n\t} );\n} );\n\n\n/**\n * Get the current Ajax URL. Note that this returns the URL from the first\n * table in the current context.\n *\n * @return {string} Current Ajax source URL\n *//**\n * Set the Ajax URL. Note that this will set the URL for all tables in the\n * current context.\n *\n * @param {string} url URL to set.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url()', function ( url ) {\n\tvar ctx = this.context;\n\n\tif ( url === undefined ) {\n\t\t// get\n\t\tif ( ctx.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tctx = ctx[0];\n\n\t\treturn ctx.ajax ?\n\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\tctx.ajax.url :\n\t\t\t\tctx.ajax :\n\t\t\tctx.sAjaxSource;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\tsettings.ajax.url = url;\n\t\t}\n\t\telse {\n\t\t\tsettings.ajax = url;\n\t\t}\n\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t// value of `sAjaxSource` redundant.\n\t} );\n} );\n\n\n/**\n * Load data from the newly set Ajax URL. Note that this method is only\n * available when `ajax.url()` is used to set a URL. Additionally, this method\n * has the same effect as calling `ajax.reload()` but is provided for\n * convenience when setting a new URL. Like `ajax.reload()` it will\n * automatically redraw the table once the remote data has been loaded.\n *\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t// Same as a reload, but makes sense to present it for easy access after a\n\t// url change\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\t__reload( ctx, resetPaging===false, callback );\n\t} );\n} );\n\n\n\n\nvar _selector_run = function ( type, selector, selectFn, settings, opts )\n{\n\tvar\n\t\tout = [], res,\n\t\ta, i, ien, j, jen,\n\t\tselectorType = typeof selector;\n\n\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t// given with their array like look\n\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\tselector = [ selector ];\n\t}\n\n\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\tselector[i].split(',') :\n\t\t\t[ selector[i] ];\n\n\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\tres = selectFn( typeof a[j] === 'string' ? (a[j]).trim() : a[j] );\n\n\t\t\tif ( res && res.length ) {\n\t\t\t\tout = out.concat( res );\n\t\t\t}\n\t\t}\n\t}\n\n\t// selector extensions\n\tvar ext = _ext.selector[ type ];\n\tif ( ext.length ) {\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tout = ext[i]( settings, opts, out );\n\t\t}\n\t}\n\n\treturn _unique( out );\n};\n\n\nvar _selector_opts = function ( opts )\n{\n\tif ( ! opts ) {\n\t\topts = {};\n\t}\n\n\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t// than search\n\tif ( opts.filter && opts.search === undefined ) {\n\t\topts.search = opts.filter;\n\t}\n\n\treturn $.extend( {\n\t\tsearch: 'none',\n\t\torder: 'current',\n\t\tpage: 'all'\n\t}, opts );\n};\n\n\nvar _selector_first = function ( inst )\n{\n\t// Reduce the API instance to the first item found\n\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\tif ( inst[i].length > 0 ) {\n\t\t\t// Assign the first element to the first item in the instance\n\t\t\t// and truncate the instance and context\n\t\t\tinst[0] = inst[i];\n\t\t\tinst[0].length = 1;\n\t\t\tinst.length = 1;\n\t\t\tinst.context = [ inst.context[i] ];\n\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\t// Not found - return an empty instance\n\tinst.length = 0;\n\treturn inst;\n};\n\n\nvar _selector_row_indexes = function ( settings, opts )\n{\n\tvar\n\t\ti, ien, tmp, a=[],\n\t\tdisplayFiltered = settings.aiDisplay,\n\t\tdisplayMaster = settings.aiDisplayMaster;\n\n\tvar\n\t\tsearch = opts.search,  // none, applied, removed\n\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\tpage   = opts.page;    // all, current\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t// In server-side processing mode, most options are irrelevant since\n\t\t// rows not shown don't exist and the index order is the applied order\n\t\t// Removed is a special case - for consistency just return an empty\n\t\t// array\n\t\treturn search === 'removed' ?\n\t\t\t[] :\n\t\t\t_range( 0, displayMaster.length );\n\t}\n\telse if ( page == 'current' ) {\n\t\t// Current page implies that order=current and filter=applied, since it is\n\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t// are\n\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\ta.push( displayFiltered[i] );\n\t\t}\n\t}\n\telse if ( order == 'current' || order == 'applied' ) {\n\t\tif ( search == 'none') {\n\t\t\ta = displayMaster.slice();\n\t\t}\n\t\telse if ( search == 'applied' ) {\n\t\t\ta = displayFiltered.slice();\n\t\t}\n\t\telse if ( search == 'removed' ) {\n\t\t\t// O(n+m) solution by creating a hash map\n\t\t\tvar displayFilteredMap = {};\n\n\t\t\tfor ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {\n\t\t\t\tdisplayFilteredMap[displayFiltered[i]] = null;\n\t\t\t}\n\n\t\t\ta = $.map( displayMaster, function (el) {\n\t\t\t\treturn ! displayFilteredMap.hasOwnProperty(el) ?\n\t\t\t\t\tel :\n\t\t\t\t\tnull;\n\t\t\t} );\n\t\t}\n\t}\n\telse if ( order == 'index' || order == 'original' ) {\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tif ( search == 'none' ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t\telse { // applied | removed\n\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\n\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t{\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n};\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Rows\n *\n * {}          - no selector - use all available rows\n * {integer}   - row aoData index\n * {node}      - TR node\n * {string}    - jQuery selector to apply to the TR elements\n * {array}     - jQuery array of nodes, or simply an array of TR nodes\n *\n */\nvar __row_selector = function ( settings, selector, opts )\n{\n\tvar rows;\n\tvar run = function ( sel ) {\n\t\tvar selInt = _intVal( sel );\n\t\tvar i, ien;\n\t\tvar aoData = settings.aoData;\n\n\t\t// Short cut - selector is a number and no options provided (default is\n\t\t// all records, so no need to check if the index is in there, since it\n\t\t// must be - dev error if the index doesn't exist).\n\t\tif ( selInt !== null && ! opts ) {\n\t\t\treturn [ selInt ];\n\t\t}\n\n\t\tif ( ! rows ) {\n\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t}\n\n\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t// Selector - integer\n\t\t\treturn [ selInt ];\n\t\t}\n\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t// Selector - none\n\t\t\treturn rows;\n\t\t}\n\n\t\t// Selector - function\n\t\tif ( typeof sel === 'function' ) {\n\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\tvar row = aoData[ idx ];\n\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// Selector - node\n\t\tif ( sel.nodeName ) {\n\t\t\tvar rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup\n\t\t\tvar cellIdx = sel._DT_CellIndex;\n\n\t\t\tif ( rowIdx !== undefined ) {\n\t\t\t\t// Make sure that the row is actually still present in the table\n\t\t\t\treturn aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?\n\t\t\t\t\t[ rowIdx ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse if ( cellIdx ) {\n\t\t\t\treturn aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?\n\t\t\t\t\t[ cellIdx.row ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\treturn host.length ?\n\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t}\n\n\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t// DataTables simplifies this for row selectors since you can select\n\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t// unescaped.\n\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t// get row index from id\n\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\treturn [ rowObj.idx ];\n\t\t\t}\n\n\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t// matches\n\t\t}\n\t\t\n\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\tvar nodes = _removeEmpty(\n\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t);\n\n\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t// it also allows arrays, so this will cope with all three options\n\t\treturn $(nodes)\n\t\t\t.filter( sel )\n\t\t\t.map( function () {\n\t\t\t\treturn this._DT_RowIndex;\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\n\treturn _selector_run( 'row', selector, run, settings, opts );\n};\n\n\n_api_register( 'rows()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __row_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in __row_selector?\n\tinst.selector.rows = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_register( 'rows().nodes()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn settings.aoData[ row ].nTr || undefined;\n\t}, 1 );\n} );\n\n_api_register( 'rows().data()', function () {\n\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\tvar r = settings.aoData[ row ];\n\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t_fnInvalidate( settings, row, src );\n\t} );\n} );\n\n_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn row;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\tvar a = [];\n\tvar context = this.context;\n\n\t// `iterator` will drop undefined values, but in this case we want them\n\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t}\n\t}\n\n\treturn new _Api( context, a );\n} );\n\n_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\tvar that = this;\n\n\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\tvar data = settings.aoData;\n\t\tvar rowData = data[ row ];\n\t\tvar i, ien, j, jen;\n\t\tvar loopRow, loopCells;\n\n\t\tdata.splice( row, 1 );\n\n\t\t// Update the cached indexes\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\tloopRow = data[i];\n\t\t\tloopCells = loopRow.anCells;\n\n\t\t\t// Rows\n\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t}\n\n\t\t\t// Cells\n\t\t\tif ( loopCells !== null ) {\n\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Delete from the display arrays\n\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\n\t\t// For server-side processing tables - subtract the deleted row from the count\n\t\tif ( settings._iRecordsDisplay > 0 ) {\n\t\t\tsettings._iRecordsDisplay--;\n\t\t}\n\n\t\t// Check for an 'overflow' they case for displaying the table\n\t\t_fnLengthOverflow( settings );\n\n\t\t// Remove the row's ID reference if there is one\n\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\tif ( id !== undefined ) {\n\t\t\tdelete settings.aIds[ id ];\n\t\t}\n\t} );\n\n\tthis.iterator( 'table', function ( settings ) {\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tsettings.aoData[i].idx = i;\n\t\t}\n\t} );\n\n\treturn this;\n} );\n\n\n_api_register( 'rows.add()', function ( rows ) {\n\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\tvar row, i, ien;\n\t\t\tvar out = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn out;\n\t\t}, 1 );\n\n\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\tvar modRows = this.rows( -1 );\n\tmodRows.pop();\n\t$.merge( modRows, newRows );\n\n\treturn modRows;\n} );\n\n\n\n\n\n/**\n *\n */\n_api_register( 'row()', function ( selector, opts ) {\n\treturn _selector_first( this.rows( selector, opts ) );\n} );\n\n\n_api_register( 'row().data()', function ( data ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\tvar row = ctx[0].aoData[ this[0] ];\n\trow._aData = data;\n\n\t// If the DOM has an id, and the data source is an array\n\tif ( Array.isArray( data ) && row.nTr && row.nTr.id ) {\n\t\t_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );\n\t}\n\n\t// Automatically invalidate\n\t_fnInvalidate( ctx[0], this[0], 'data' );\n\n\treturn this;\n} );\n\n\n_api_register( 'row().node()', function () {\n\tvar ctx = this.context;\n\n\treturn ctx.length && this.length ?\n\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\tnull;\n} );\n\n\n_api_register( 'row.add()', function ( row ) {\n\t// Allow a jQuery object to be passed in - only a single row is added from\n\t// it though - the first element in the set\n\tif ( row instanceof $ && row.length ) {\n\t\trow = row[0];\n\t}\n\n\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t}\n\t\treturn _fnAddData( settings, row );\n\t} );\n\n\t// Return an Api.rows() extended instance, with the newly added row selected\n\treturn this.row( rows[0] );\n} );\n\n\n$(document).on('plugin-init.dt', function (e, context) {\n\tvar api = new _Api( context );\n\tvar namespace = 'on-plugin-init';\n\tvar stateSaveParamsEvent = 'stateSaveParams.' + namespace;\n\tvar destroyEvent = 'destroy. ' + namespace;\n\n\tapi.on( stateSaveParamsEvent, function ( e, settings, d ) {\n\t\t// This could be more compact with the API, but it is a lot faster as a simple\n\t\t// internal loop\n\t\tvar idFn = settings.rowIdFn;\n\t\tvar data = settings.aoData;\n\t\tvar ids = [];\n\n\t\tfor (var i=0 ; i<data.length ; i++) {\n\t\t\tif (data[i]._detailsShow) {\n\t\t\t\tids.push( '#' + idFn(data[i]._aData) );\n\t\t\t}\n\t\t}\n\n\t\td.childRows = ids;\n\t});\n\n\tapi.on( destroyEvent, function () {\n\t\tapi.off(stateSaveParamsEvent + ' ' + destroyEvent);\n\t});\n\n\tvar loaded = api.state.loaded();\n\n\tif ( loaded && loaded.childRows ) {\n\t\tapi\n\t\t\t.rows( $.map(loaded.childRows, function (id){\n\t\t\t\treturn id.replace(/:/g, '\\\\:')\n\t\t\t}) )\n\t\t\t.every( function () {\n\t\t\t\t_fnCallbackFire( context, null, 'requestChild', [ this ] )\n\t\t\t});\n\t}\n});\n\nvar __details_add = function ( ctx, row, data, klass )\n{\n\t// Convert to array of TR elements\n\tvar rows = [];\n\tvar addRow = function ( r, k ) {\n\t\t// Recursion to allow for arrays of jQuery objects\n\t\tif ( Array.isArray( r ) || r instanceof $ ) {\n\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\taddRow( r[i], k );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t// to add the correct number of columns etc\n\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\trows.push( r );\n\t\t}\n\t\telse {\n\t\t\t// Otherwise create a row with a wrapper\n\t\t\tvar created = $('<tr><td></td></tr>').addClass( k );\n\t\t\t$('td', created)\n\t\t\t\t.addClass( k )\n\t\t\t\t.html( r )\n\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\n\t\t\trows.push( created[0] );\n\t\t}\n\t};\n\n\taddRow( data, klass );\n\n\tif ( row._details ) {\n\t\trow._details.detach();\n\t}\n\n\trow._details = $(rows);\n\n\t// If the children were already shown, that state should be retained\n\tif ( row._detailsShow ) {\n\t\trow._details.insertAfter( row.nTr );\n\t}\n};\n\n\n// Make state saving of child row details async to allow them to be batch processed\nvar __details_state = DataTable.util.throttle(\n\tfunction (ctx) {\n\t\t_fnSaveState( ctx[0] )\n\t},\n\t500\n);\n\n\nvar __details_remove = function ( api, idx )\n{\n\tvar ctx = api.context;\n\n\tif ( ctx.length ) {\n\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\n\t\tif ( row && row._details ) {\n\t\t\trow._details.remove();\n\n\t\t\trow._detailsShow = undefined;\n\t\t\trow._details = undefined;\n\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_display = function ( api, show ) {\n\tvar ctx = api.context;\n\n\tif ( ctx.length && api.length ) {\n\t\tvar row = ctx[0].aoData[ api[0] ];\n\n\t\tif ( row._details ) {\n\t\t\trow._detailsShow = show;\n\n\t\t\tif ( show ) {\n\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t$( row.nTr ).addClass( 'dt-hasChild' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\trow._details.detach();\n\t\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t}\n\n\t\t\t_fnCallbackFire( ctx[0], null, 'childRow', [ show, api.row( api[0] ) ] )\n\n\t\t\t__details_events( ctx[0] );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_events = function ( settings )\n{\n\tvar api = new _Api( settings );\n\tvar namespace = '.dt.DT_details';\n\tvar drawEvent = 'draw'+namespace;\n\tvar colvisEvent = 'column-sizing'+namespace;\n\tvar destroyEvent = 'destroy'+namespace;\n\tvar data = settings.aoData;\n\n\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\n\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t// On each draw, insert the required elements into the document\n\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t// Internal data grab\n\t\t\t\tvar row = data[ idx ];\n\n\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// Column visibility change - update the colspan\n\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t// a colspan)\n\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\trow = data[i];\n\n\t\t\t\tif ( row._details ) {\n\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Table destroyed - nuke any child rows\n\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n};\n\n// Strings for the method names to help minification\nvar _emp = '';\nvar _child_obj = _emp+'row().child';\nvar _child_mth = _child_obj+'()';\n\n// data can be:\n//  tr\n//  string\n//  jQuery or array of any of the above\n_api_register( _child_mth, function ( data, klass ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\tundefined;\n\t}\n\telse if ( data === true ) {\n\t\t// show\n\t\tthis.child.show();\n\t}\n\telse if ( data === false ) {\n\t\t// remove\n\t\t__details_remove( this );\n\t}\n\telse if ( ctx.length && this.length ) {\n\t\t// set\n\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t}\n\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.show()',\n\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n], function ( show ) {   // it returns an object and this method is not executed)\n\t__details_display( this, true );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.hide()',\n\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n], function () {         // it returns an object and this method is not executed)\n\t__details_display( this, false );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.remove()',\n\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n], function () {           // it returns an object and this method is not executed)\n\t__details_remove( this );\n\treturn this;\n} );\n\n\n_api_register( _child_obj+'.isShown()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length && this.length ) {\n\t\t// _detailsShown as false or undefined will fall through to return false\n\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t}\n\treturn false;\n} );\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Columns\n *\n * {integer}           - column index (>=0 count from left, <0 count from right)\n * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n * \"{string}:name\"     - column name\n * \"{string}\"          - jQuery selector on column header nodes\n *\n */\n\n// can be an array of these items, comma separated list, or an array of comma\n// separated lists\n\nvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\n\n// r1 and r2 are redundant - but it means that the parameters match for the\n// iterator callback in columns().data()\nvar __columnData = function ( settings, column, r1, r2, rows ) {\n\tvar a = [];\n\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t}\n\treturn a;\n};\n\n\nvar __column_selector = function ( settings, selector, opts )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tnames = _pluck( columns, 'sName' ),\n\t\tnodes = _pluck( columns, 'nTh' );\n\n\tvar run = function ( s ) {\n\t\tvar selInt = _intVal( s );\n\n\t\t// Selector - all\n\t\tif ( s === '' ) {\n\t\t\treturn _range( columns.length );\n\t\t}\n\n\t\t// Selector - index\n\t\tif ( selInt !== null ) {\n\t\t\treturn [ selInt >= 0 ?\n\t\t\t\tselInt : // Count from left\n\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t];\n\t\t}\n\n\t\t// Selector = function\n\t\tif ( typeof s === 'function' ) {\n\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\n\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\treturn s(\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// jQuery or string selector\n\t\tvar match = typeof s === 'string' ?\n\t\t\ts.match( __re_column_selector ) :\n\t\t\t'';\n\n\t\tif ( match ) {\n\t\t\tswitch( match[2] ) {\n\t\t\t\tcase 'visIdx':\n\t\t\t\tcase 'visible':\n\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t}\n\t\t\t\t\t// Counting from the left\n\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\n\t\t\t\tcase 'name':\n\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t} );\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\t// Cell in the table body\n\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t}\n\n\t\t// jQuery selector on the TH elements for the columns\n\t\tvar jqResult = $( nodes )\n\t\t\t.filter( s )\n\t\t\t.map( function () {\n\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t// a child or such an element\n\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\treturn host.length ?\n\t\t\t[ host.data('dt-column') ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'column', selector, run, settings, opts );\n};\n\n\nvar __setColumnVis = function ( settings, column, vis ) {\n\tvar\n\t\tcols = settings.aoColumns,\n\t\tcol  = cols[ column ],\n\t\tdata = settings.aoData,\n\t\trow, cells, i, ien, tr;\n\n\t// Get\n\tif ( vis === undefined ) {\n\t\treturn col.bVisible;\n\t}\n\n\t// Set\n\t// No change\n\tif ( col.bVisible === vis ) {\n\t\treturn;\n\t}\n\n\tif ( vis ) {\n\t\t// Insert column\n\t\t// Need to decide if we should use appendChild or insertBefore\n\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\ttr = data[i].nTr;\n\t\t\tcells = data[i].anCells;\n\n\t\t\tif ( tr ) {\n\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Remove column\n\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t}\n\n\t// Common actions\n\tcol.bVisible = vis;\n};\n\n\n_api_register( 'columns()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __column_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in _row_selector?\n\tinst.selector.cols = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTh;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTf;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\treturn this.iterator( 'column-rows', __columnData, 1 );\n} );\n\n_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].mData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t);\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\tvar that = this;\n\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\tif ( vis === undefined ) {\n\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t} // else\n\t\t__setColumnVis( settings, column, vis );\n\t} );\n\n\t// Group the column visibility changes\n\tif ( vis !== undefined ) {\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\t// Redraw the header after changes\n\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t\t// Update colspan for no records display. Child rows and extensions will use their own\n\t\t\t// listeners to do this - only need to update the empty table item here\n\t\t\tif ( ! settings.aiDisplay.length ) {\n\t\t\t\t$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n\t\t\t}\n\t\n\t\t\t_fnSaveState( settings );\n\n\t\t\t// Second loop once the first is done for events\n\t\t\tthat.iterator( 'column', function ( settings, column ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t} );\n\n\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\tthat.columns.adjust();\n\t\t\t}\n\t\t});\n\t}\n\n\treturn ret;\n} );\n\n_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn type === 'visible' ?\n\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\tcolumn;\n\t}, 1 );\n} );\n\n_api_register( 'columns.adjust()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}, 1 );\n} );\n\n_api_register( 'column.index()', function ( type, idx ) {\n\tif ( this.context.length !== 0 ) {\n\t\tvar ctx = this.context[0];\n\n\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t}\n\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t}\n\t}\n} );\n\n_api_register( 'column()', function ( selector, opts ) {\n\treturn _selector_first( this.columns( selector, opts ) );\n} );\n\nvar __cell_selector = function ( settings, selector, opts )\n{\n\tvar data = settings.aoData;\n\tvar rows = _selector_row_indexes( settings, opts );\n\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\tvar allCells = $(_flatten( [], cells ));\n\tvar row;\n\tvar columns = settings.aoColumns.length;\n\tvar a, i, ien, j, o, host;\n\n\tvar run = function ( s ) {\n\t\tvar fnSelector = typeof s === 'function';\n\n\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t// All cells and function selectors\n\t\t\ta = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\to = {\n\t\t\t\t\t\trow: row,\n\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\thost = data[ row ];\n\n\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn a;\n\t\t}\n\t\t\n\t\t// Selector - index\n\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t// Valid cell index and its in the array of selectable rows\n\t\t\treturn s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?\n\t\t\t\t[s] :\n\t\t\t\t[];\n\t\t}\n\n\t\t// Selector - jQuery filtered cells\n\t\tvar jqResult = allCells\n\t\t\t.filter( s )\n\t\t\t.map( function (i, el) {\n\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\tcolumn: el._DT_CellIndex.column\n \t\t\t\t};\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t// data attributes\n\t\thost = $(s).closest('*[data-dt-row]');\n\t\treturn host.length ?\n\t\t\t[ {\n\t\t\t\trow: host.data('dt-row'),\n\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t} ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'cell', selector, run, settings, opts );\n};\n\n\n\n\n_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t// Argument shifting\n\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t// Indexes\n\t\tif ( rowSelector.row === undefined ) {\n\t\t\t// Selector options in first parameter\n\t\t\topts = rowSelector;\n\t\t\trowSelector = null;\n\t\t}\n\t\telse {\n\t\t\t// Cell index objects in first parameter\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t}\n\tif ( $.isPlainObject( columnSelector ) ) {\n\t\topts = columnSelector;\n\t\tcolumnSelector = null;\n\t}\n\n\t// Cell selector\n\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t} );\n\t}\n\n\t// The default built in options need to apply to row and columns\n\tvar internalOpts = opts ? {\n\t\tpage: opts.page,\n\t\torder: opts.order,\n\t\tsearch: opts.search\n\t} : {};\n\n\t// Row + column selector\n\tvar columns = this.columns( columnSelector, internalOpts );\n\tvar rows = this.rows( rowSelector, internalOpts );\n\tvar i, ien, j, jen;\n\n\tvar cellsNoOpts = this.iterator( 'table', function ( settings, idx ) {\n\t\tvar a = [];\n\n\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\ta.push( {\n\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\treturn a;\n\t}, 1 );\n\n\t// There is currently only one extension which uses a cell selector extension\n\t// It is a _major_ performance drag to run this if it isn't needed, so this is\n\t// an extension specific check at the moment\n\tvar cells = opts && opts.selected ?\n\t\tthis.cells( cellsNoOpts, opts ) :\n\t\tcellsNoOpts;\n\n\t$.extend( cells.selector, {\n\t\tcols: columnSelector,\n\t\trows: rowSelector,\n\t\topts: opts\n\t} );\n\n\treturn cells;\n} );\n\n\n_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\tvar data = settings.aoData[ row ];\n\n\t\treturn data && data.anCells ?\n\t\t\tdata.anCells[ column ] :\n\t\t\tundefined;\n\t}, 1 );\n} );\n\n\n_api_register( 'cells().data()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn settings.aoData[ row ][ type ][ column ];\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column, type );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn {\n\t\t\trow: row,\n\t\t\tcolumn: column,\n\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t};\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t_fnInvalidate( settings, row, src, column );\n\t} );\n} );\n\n\n\n_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n} );\n\n\n_api_register( 'cell().data()', function ( data ) {\n\tvar ctx = this.context;\n\tvar cell = this[0];\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && cell.length ?\n\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\n\treturn this;\n} );\n\n\n\n/**\n * Get current ordering (sorting) that has been applied to the table.\n *\n * @returns {array} 2D array containing the sorting information for the first\n *   table in the current context. Each element in the parent array represents\n *   a column being sorted upon (i.e. multi-sorting with two columns would have\n *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n *   the column index that the sorting condition applies to, the second is the\n *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n *   index of the sorting order from the `column.sorting` initialisation array.\n *//**\n * Set the ordering for the table.\n *\n * @param {integer} order Column index to sort upon.\n * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 1D array of sorting information to be applied.\n * @param {array} [...] Optional additional sorting conditions\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 2D array of sorting information to be applied.\n * @returns {DataTables.Api} this\n */\n_api_register( 'order()', function ( order, dir ) {\n\tvar ctx = this.context;\n\n\tif ( order === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].aaSorting :\n\t\t\tundefined;\n\t}\n\n\t// set\n\tif ( typeof order === 'number' ) {\n\t\t// Simple column / direction passed in\n\t\torder = [ [ order, dir ] ];\n\t}\n\telse if ( order.length && ! Array.isArray( order[0] ) ) {\n\t\t// Arguments passed in (list of 1D arrays)\n\t\torder = Array.prototype.slice.call( arguments );\n\t}\n\t// otherwise a 2D array was passed in\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSorting = order.slice();\n\t} );\n} );\n\n\n/**\n * Attach a sort listener to an element for a given column\n *\n * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n *   listener to. This can take the form of a single DOM node, a jQuery\n *   collection of nodes or a jQuery selector which will identify the node(s).\n * @param {integer} column the column that a click on this node will sort on\n * @param {function} [callback] callback function when sort is run\n * @returns {DataTables.Api} this\n */\n_api_register( 'order.listener()', function ( node, column, callback ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSortAttachListener( settings, node, column, callback );\n\t} );\n} );\n\n\n_api_register( 'order.fixed()', function ( set ) {\n\tif ( ! set ) {\n\t\tvar ctx = this.context;\n\t\tvar fixed = ctx.length ?\n\t\t\tctx[0].aaSortingFixed :\n\t\t\tundefined;\n\n\t\treturn Array.isArray( fixed ) ?\n\t\t\t{ pre: fixed } :\n\t\t\tfixed;\n\t}\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t} );\n} );\n\n\n// Order by the selected column(s)\n_api_register( [\n\t'columns().order()',\n\t'column().order()'\n], function ( dir ) {\n\tvar that = this;\n\n\treturn this.iterator( 'table', function ( settings, i ) {\n\t\tvar sort = [];\n\n\t\t$.each( that[i], function (j, col) {\n\t\t\tsort.push( [ col, dir ] );\n\t\t} );\n\n\t\tsettings.aaSorting = sort;\n\t} );\n} );\n\n\n\n_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\tvar ctx = this.context;\n\n\tif ( input === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\tundefined;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\treturn;\n\t\t}\n\n\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\"sSearch\": input+\"\",\n\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t} ), 1 );\n\t} );\n} );\n\n\n_api_registerPlural(\n\t'columns().search()',\n\t'column().search()',\n\tfunction ( input, regex, smart, caseInsen ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\tvar preSearch = settings.aoPreSearchCols;\n\n\t\t\tif ( input === undefined ) {\n\t\t\t\t// get\n\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t}\n\n\t\t\t// set\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} );\n\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t} );\n\t}\n);\n\n/*\n * State API methods\n */\n\n_api_register( 'state()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oSavedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t// Save an empty object\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t} );\n} );\n\n\n_api_register( 'state.loaded()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oLoadedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.save()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSaveState( settings );\n\t} );\n} );\n\n\n\n/**\n * Set the jQuery or window object to be used by DataTables\n *\n * @param {*} module Library / container object\n * @param {string} [type] Library or container type `lib`, `win` or `datetime`.\n *   If not provided, automatic detection is attempted.\n */\nDataTable.use = function (module, type) {\n\tif (type === 'lib' || module.fn) {\n\t\t$ = module;\n\t}\n\telse if (type == 'win' || module.document) {\n\t\twindow = module;\n\t\tdocument = module.document;\n\t}\n\telse if (type === 'datetime' || module.type === 'DateTime') {\n\t\tDataTable.DateTime = module;\n\t}\n}\n\n/**\n * CommonJS factory function pass through. This will check if the arguments\n * given are a window object or a jQuery object. If so they are set\n * accordingly.\n * @param {*} root Window\n * @param {*} jq jQUery\n * @returns {boolean} Indicator\n */\nDataTable.factory = function (root, jq) {\n\tvar is = false;\n\n\t// Test if the first parameter is a window object\n\tif (root && root.document) {\n\t\twindow = root;\n\t\tdocument = root.document;\n\t}\n\n\t// Test if the second parameter is a jQuery object\n\tif (jq && jq.fn && jq.fn.jquery) {\n\t\t$ = jq;\n\t\tis = true;\n\t}\n\n\treturn is;\n}\n\n/**\n * Provide a common method for plug-ins to check the version of DataTables being\n * used, in order to ensure compatibility.\n *\n *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n *  @returns {boolean} true if this version of DataTables is greater or equal to\n *    the required version, or false if this version of DataTales is not\n *    suitable\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n */\nDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n{\n\tvar aThis = DataTable.version.split('.');\n\tvar aThat = version.split('.');\n\tvar iThis, iThat;\n\n\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\n\t\t// Parts are the same, keep comparing\n\t\tif (iThis === iThat) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parts are different, return immediately\n\t\treturn iThis > iThat;\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Check if a `<table>` node is a DataTable table already or not.\n *\n *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n *      selector for the table to test. Note that if more than more than one\n *      table is passed on, only the first will be checked\n *  @returns {boolean} true the table given is a DataTable, or false otherwise\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n *      $('#example').dataTable();\n *    }\n */\nDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n{\n\tvar t = $(table).get(0);\n\tvar is = false;\n\n\tif ( table instanceof DataTable.Api ) {\n\t\treturn true;\n\t}\n\n\t$.each( DataTable.settings, function (i, o) {\n\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\n\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\tis = true;\n\t\t}\n\t} );\n\n\treturn is;\n};\n\n\n/**\n * Get all DataTable tables that have been initialised - optionally you can\n * select to get only currently visible tables.\n *\n *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n *    or visible tables only.\n *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n *    DataTables\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    $.each( $.fn.dataTable.tables(true), function () {\n *      $(table).DataTable().columns.adjust();\n *    } );\n */\nDataTable.tables = DataTable.fnTables = function ( visible )\n{\n\tvar api = false;\n\n\tif ( $.isPlainObject( visible ) ) {\n\t\tapi = visible.api;\n\t\tvisible = visible.visible;\n\t}\n\n\tvar a = $.map( DataTable.settings, function (o) {\n\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\treturn o.nTable;\n\t\t}\n\t} );\n\n\treturn api ?\n\t\tnew _Api( a ) :\n\t\ta;\n};\n\n\n/**\n * Convert from camel case parameters to Hungarian notation. This is made public\n * for the extensions to provide the same ability as DataTables core to accept\n * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n * parameters.\n *\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n */\nDataTable.camelToHungarian = _fnCamelToHungarian;\n\n\n\n/**\n *\n */\n_api_register( '$()', function ( selector, opts ) {\n\tvar\n\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\tjqRows = $(rows);\n\n\treturn $( [].concat(\n\t\tjqRows.filter( selector ).toArray(),\n\t\tjqRows.find( selector ).toArray()\n\t) );\n} );\n\n\n// jQuery functions to operate on the tables\n$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\tvar args = Array.prototype.slice.call(arguments);\n\n\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\te+'.dt' :\n\t\t\t\te;\n\t\t\t} ).join( ' ' );\n\n\t\tvar inst = $( this.tables().nodes() );\n\t\tinst[key].apply( inst, args );\n\t\treturn this;\n\t} );\n} );\n\n\n_api_register( 'clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnClearTable( settings );\n\t} );\n} );\n\n\n_api_register( 'settings()', function () {\n\treturn new _Api( this.context, this.context );\n} );\n\n\n_api_register( 'init()', function () {\n\tvar ctx = this.context;\n\treturn ctx.length ? ctx[0].oInit : null;\n} );\n\n\n_api_register( 'data()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t} ).flatten();\n} );\n\n\n_api_register( 'destroy()', function ( remove ) {\n\tremove = remove || false;\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tvar classes   = settings.oClasses;\n\t\tvar table     = settings.nTable;\n\t\tvar tbody     = settings.nTBody;\n\t\tvar thead     = settings.nTHead;\n\t\tvar tfoot     = settings.nTFoot;\n\t\tvar jqTable   = $(table);\n\t\tvar jqTbody   = $(tbody);\n\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\tvar i, ien;\n\n\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t// should be taken\n\t\tsettings.bDestroying = true;\n\n\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\n\t\t// If not being removed from the document, make all columns visible\n\t\tif ( ! remove ) {\n\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t}\n\n\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t// for removing them\n\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t$(window).off('.DT-'+settings.sInstance);\n\n\t\t// When scrolling we had to break the table up - restore it\n\t\tif ( table != thead.parentNode ) {\n\t\t\tjqTable.children('thead').detach();\n\t\t\tjqTable.append( thead );\n\t\t}\n\n\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\tjqTable.children('tfoot').detach();\n\t\t\tjqTable.append( tfoot );\n\t\t}\n\n\t\tsettings.aaSorting = [];\n\t\tsettings.aaSortingFixed = [];\n\t\t_fnSortingClasses( settings );\n\n\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\n\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t);\n\n\t\t// Add the TR elements back into the table in their original order\n\t\tjqTbody.children().detach();\n\t\tjqTbody.append( rows );\n\n\t\tvar orig = settings.nTableWrapper.parentNode;\n\n\t\t// Remove the DataTables generated nodes, events and classes\n\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\tjqTable[ removedMethod ]();\n\t\tjqWrapper[ removedMethod ]();\n\n\t\t// If we need to reattach the table to the document\n\t\tif ( ! remove && orig ) {\n\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\n\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t// so we can restore directly to that\n\t\t\tjqTable\n\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t.removeClass( classes.sTable );\n\n\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\tien = settings.asDestroyStripes.length;\n\n\t\t\tif ( ien ) {\n\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t/* Remove the settings object from the settings array */\n\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\tif ( idx !== -1 ) {\n\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t}\n\t} );\n} );\n\n\n// Add the `every()` method for rows, columns and cells in a compact form\n$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t_api_register( type+'s().every()', function ( fn ) {\n\t\tvar opts = this.selector.opts;\n\t\tvar api = this;\n\n\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t// Rows and columns:\n\t\t\t//  arg1 - index\n\t\t\t//  arg2 - table counter\n\t\t\t//  arg3 - loop counter\n\t\t\t//  arg4 - undefined\n\t\t\t// Cells:\n\t\t\t//  arg1 - row index\n\t\t\t//  arg2 - column index\n\t\t\t//  arg3 - table counter\n\t\t\t//  arg4 - loop counter\n\t\t\tfn.call(\n\t\t\t\tapi[ type ](\n\t\t\t\t\targ1,\n\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t),\n\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t);\n\t\t} );\n\t} );\n} );\n\n\n// i18n method for extensions to be able to use the language object from the\n// DataTable\n_api_register( 'i18n()', function ( token, def, plural ) {\n\tvar ctx = this.context[0];\n\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\n\tif ( resolved === undefined ) {\n\t\tresolved = def;\n\t}\n\n\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\tresolved[ plural ] :\n\t\t\tresolved._;\n\t}\n\n\treturn typeof resolved === 'string'\n\t\t? resolved.replace( '%d', plural ) // nb: plural might be undefined,\n\t\t: resolved;\n} );\n/**\n * Version string for plug-ins to check compatibility. Allowed format is\n * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n * only for non-release builds. See http://semver.org/ for more information.\n *  @member\n *  @type string\n *  @default Version number\n */\nDataTable.version = \"1.13.5\";\n\n/**\n * Private data store, containing all of the settings objects that are\n * created for the tables on a given page.\n *\n * Note that the `DataTable.settings` object is aliased to\n * `jQuery.fn.dataTableExt` through which it may be accessed and\n * manipulated, or `jQuery.fn.dataTable.settings`.\n *  @member\n *  @type array\n *  @default []\n *  @private\n */\nDataTable.settings = [];\n\n/**\n * Object models container, for the various models that DataTables has\n * available to it. These models define the objects that are used to hold\n * the active state and configuration of the table.\n *  @namespace\n */\nDataTable.models = {};\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * search information for the global filter and individual column filters.\n *  @namespace\n */\nDataTable.models.oSearch = {\n\t/**\n\t * Flag to indicate if the filtering should be case insensitive or not\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bCaseInsensitive\": true,\n\n\t/**\n\t * Applied search term\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sSearch\": \"\",\n\n\t/**\n\t * Flag to indicate if the search term should be interpreted as a\n\t * regular expression (true) or not (false) and therefore and special\n\t * regex characters escaped.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bRegex\": false,\n\n\t/**\n\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bSmart\": true,\n\n\t/**\n\t * Flag to indicate if DataTables should only trigger a search when\n\t * the return key is pressed.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"return\": false\n};\n\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * each individual row. This is the object format used for the settings\n * aoData array.\n *  @namespace\n */\nDataTable.models.oRow = {\n\t/**\n\t * TR element for the row\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTr\": null,\n\n\t/**\n\t * Array of TD elements for each row. This is null until the row has been\n\t * created.\n\t *  @type array nodes\n\t *  @default []\n\t */\n\t\"anCells\": null,\n\n\t/**\n\t * Data object from the original data source for the row. This is either\n\t * an array if using the traditional form of DataTables, or an object if\n\t * using mData options. The exact type will depend on the passed in\n\t * data from the data source, or will be an array if using DOM a data\n\t * source.\n\t *  @type array|object\n\t *  @default []\n\t */\n\t\"_aData\": [],\n\n\t/**\n\t * Sorting data cache - this array is ostensibly the same length as the\n\t * number of columns (although each index is generated only as it is\n\t * needed), and holds the data that is used for sorting each column in the\n\t * row. We do this cache generation at the start of the sort in order that\n\t * the formatting of the sort data need be done only once for each cell\n\t * per sort. This array should not be read from or written to by anything\n\t * other than the master sorting methods.\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aSortData\": null,\n\n\t/**\n\t * Per cell filtering data cache. As per the sort data cache, used to\n\t * increase the performance of the filtering in DataTables\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aFilterData\": null,\n\n\t/**\n\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t * in this case a string rather than an array. This is easily computed with\n\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t * needed on every search (memory traded for performance)\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sFilterRow\": null,\n\n\t/**\n\t * Cache of the class name that DataTables has applied to the row, so we\n\t * can quickly look at this variable rather than needing to do a DOM check\n\t * on className for the nTr property.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *  @private\n\t */\n\t\"_sRowStripe\": \"\",\n\n\t/**\n\t * Denote if the original data source was from the DOM, or the data source\n\t * object. This is used for invalidating data, so DataTables can\n\t * automatically read data from the original source, unless uninstructed\n\t * otherwise.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"src\": null,\n\n\t/**\n\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t * object, but want to know the index\n\t *  @type integer\n\t *  @default -1\n\t *  @private\n\t */\n\t\"idx\": -1\n};\n\n\n/**\n * Template object for the column information object in DataTables. This object\n * is held in the settings aoColumns array and contains all the information that\n * DataTables needs about each individual column.\n *\n * Note that this object is related to {@link DataTable.defaults.column}\n * but this one is the internal data store for DataTables's cache of columns.\n * It should NOT be manipulated outside of DataTables. Any configuration should\n * be done through the initialisation options.\n *  @namespace\n */\nDataTable.models.oColumn = {\n\t/**\n\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t * is faster to just hold it as a variable\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"idx\": null,\n\n\t/**\n\t * A list of the columns that sorting should occur on when this column\n\t * is sorted. That this property is an array allows multi-column sorting\n\t * to be defined for a column (for example first name / last name columns\n\t * would benefit from this). The values are integers pointing to the\n\t * columns to be sorted on (typically it will be a single integer pointing\n\t * at itself, but that doesn't need to be the case).\n\t *  @type array\n\t */\n\t\"aDataSort\": null,\n\n\t/**\n\t * Define the sorting directions that are applied to the column, in sequence\n\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t * as the sorting direction when the column if first sorted (clicked on).\n\t * Sort it again (click again) and it will move on to the next index.\n\t * Repeat until loop.\n\t *  @type array\n\t */\n\t\"asSorting\": null,\n\n\t/**\n\t * Flag to indicate if the column is searchable, and thus should be included\n\t * in the filtering or not.\n\t *  @type boolean\n\t */\n\t\"bSearchable\": null,\n\n\t/**\n\t * Flag to indicate if the column is sortable or not.\n\t *  @type boolean\n\t */\n\t\"bSortable\": null,\n\n\t/**\n\t * Flag to indicate if the column is currently visible in the table or not\n\t *  @type boolean\n\t */\n\t\"bVisible\": null,\n\n\t/**\n\t * Store for manual type assignment using the `column.type` option. This\n\t * is held in store so we can manipulate the column's `sType` property.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sManualType\": null,\n\n\t/**\n\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t * source for filtering or sorting. True is either are.\n\t *  @type boolean\n\t *  @default false\n\t *  @private\n\t */\n\t\"_bAttrSrc\": false,\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} nTd The TD node that has been created\n\t *  @param {*} sData The Data for the cell\n\t *  @param {array|object} oData The data for the whole row\n\t *  @param {int} iRow The row index for the aoData data store\n\t *  @default null\n\t */\n\t\"fnCreatedCell\": null,\n\n\t/**\n\t * Function to get data from a cell in a column. You should <b>never</b>\n\t * access data directly through _aData internally in DataTables - always use\n\t * the method attached to this property. It allows mData to function as\n\t * required. This function is automatically assigned by the column\n\t * initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {string} sSpecific The specific data type you want to get -\n\t *    'display', 'type' 'filter' 'sort'\n\t *  @returns {*} The data for the cell from the given row's data\n\t *  @default null\n\t */\n\t\"fnGetData\": null,\n\n\t/**\n\t * Function to set data for a cell in the column. You should <b>never</b>\n\t * set the data directly to _aData internally in DataTables - always use\n\t * this method. It allows mData to function as required. This function\n\t * is automatically assigned by the column initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {*} sValue Value to set\n\t *  @default null\n\t */\n\t\"fnSetData\": null,\n\n\t/**\n\t * Property to read the value for the cells in the column from the data\n\t * source array / object. If null, then the default content is used, if a\n\t * function is given then the return from the function is used.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mData\": null,\n\n\t/**\n\t * Partner property to mData which is used (only when defined) to get\n\t * the data - i.e. it is basically the same as mData, but without the\n\t * 'set' option, and also the data fed to it is the result from mData.\n\t * This is the rendering method to match the data method of mData.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mRender\": null,\n\n\t/**\n\t * Unique header TH/TD element for this column - this is what the sorting\n\t * listener is attached to (if sorting is enabled.)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTh\": null,\n\n\t/**\n\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t * in DataTables as such, but can be used for plug-ins to reference the\n\t * footer for each column.\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTf\": null,\n\n\t/**\n\t * The class to apply to all TD elements in the table's TBODY for the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sClass\": null,\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t *  @type string\n\t */\n\t\"sContentPadding\": null,\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because mData\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDefaultContent\": null,\n\n\t/**\n\t * Name for the column, allowing reference to the column by name as well as\n\t * by index (needs a lookup to work by name).\n\t *  @type string\n\t */\n\t\"sName\": null,\n\n\t/**\n\t * Custom sorting data type - defines which of the available plug-ins in\n\t * afnSortData the custom sorting will use - if any is defined.\n\t *  @type string\n\t *  @default std\n\t */\n\t\"sSortDataType\": 'std',\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClass\": null,\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column -\n\t * when jQuery UI theming is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClassJUI\": null,\n\n\t/**\n\t * Title of the column - what is seen in the TH element (nTh).\n\t *  @type string\n\t */\n\t\"sTitle\": null,\n\n\t/**\n\t * Column sorting and filtering type\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sType\": null,\n\n\t/**\n\t * Width of the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidth\": null,\n\n\t/**\n\t * Width of the column when it was first \"encountered\"\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidthOrig\": null\n};\n\n\n/*\n * Developer note: The properties of the object below are given in Hungarian\n * notation, that was used as the interface for DataTables prior to v1.10, however\n * from v1.10 onwards the primary interface is camel case. In order to avoid\n * breaking backwards compatibility utterly with this change, the Hungarian\n * version is still, internally the primary interface, but is is not documented\n * - hence the @name tags in each doc comment. This allows a Javascript function\n * to create a map from Hungarian notation to camel case (going the other direction\n * would require each property to be listed, which would add around 3K to the size\n * of DataTables, while this method is about a 0.5K hit).\n *\n * Ultimately this does pave the way for Hungarian notation to be dropped\n * completely, but that is a massive amount of work and will break current\n * installs (therefore is on-hold until v2).\n */\n\n/**\n * Initialisation options that can be given to DataTables at initialisation\n * time.\n *  @namespace\n */\nDataTable.defaults = {\n\t/**\n\t * An array of data to use for the table, passed in at initialisation which\n\t * will be used in preference to any data which is already in the DOM. This is\n\t * particularly useful for constructing tables purely in Javascript, for\n\t * example with a custom Ajax call.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.data\n\t *\n\t *  @example\n\t *    // Using a 2D array data source\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\" },\n\t *          { \"title\": \"Browser\" },\n\t *          { \"title\": \"Platform\" },\n\t *          { \"title\": \"Version\" },\n\t *          { \"title\": \"Grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using an array of objects as a data source (`data`)\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  4,\n\t *            \"grade\":    \"X\"\n\t *          },\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  5,\n\t *            \"grade\":    \"C\"\n\t *          }\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aaData\": null,\n\n\n\t/**\n\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t * initialisation. You can define which column(s) the sort is performed\n\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t * should contain an array for each column to be sorted initially containing\n\t * the column's index and a direction string ('asc' or 'desc').\n\t *  @type array\n\t *  @default [[0,'asc']]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.order\n\t *\n\t *  @example\n\t *    // Sort by 3rd column first, and then 4th column\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t *      } );\n\t *    } );\n\t *\n\t *    // No initial sorting\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": []\n\t *      } );\n\t *    } );\n\t */\n\t\"aaSorting\": [[0,'asc']],\n\n\n\t/**\n\t * This parameter is basically identical to the `sorting` parameter, but\n\t * cannot be overridden by user interaction with the table. What this means\n\t * is that you could have a column (visible or hidden) which the sorting\n\t * will always be forced on first - any sorting after that (from the user)\n\t * will then be performed as required. This can be useful for grouping rows\n\t * together.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.orderFixed\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderFixed\": [[0,'asc']]\n\t *      } );\n\t *    } )\n\t */\n\t\"aaSortingFixed\": [],\n\n\n\t/**\n\t * DataTables can be instructed to load data to display in the table from a\n\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t *\n\t * The `ajax` property has three different modes of operation, depending on\n\t * how it is defined. These are:\n\t *\n\t * * `string` - Set the URL from where the data should be loaded from.\n\t * * `object` - Define properties for `jQuery.ajax`.\n\t * * `function` - Custom data get function\n\t *\n\t * `string`\n\t * --------\n\t *\n\t * As a string, the `ajax` property simply defines the URL from which\n\t * DataTables will load data.\n\t *\n\t * `object`\n\t * --------\n\t *\n\t * As an object, the parameters in the object are passed to\n\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t * of the Ajax request. DataTables has a number of default parameters which\n\t * you can override using this option. Please refer to the jQuery\n\t * documentation for a full description of the options available, although\n\t * the following parameters provide additional options in DataTables or\n\t * require special consideration:\n\t *\n\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t *   can also be used as a function to manipulate the data DataTables sends\n\t *   to the server. The function takes a single parameter, an object of\n\t *   parameters with the values that DataTables has readied for sending. An\n\t *   object may be returned which will be merged into the DataTables\n\t *   defaults, or you can add the items to the object that was passed in and\n\t *   not return anything from the function. This supersedes `fnServerParams`\n\t *   from DataTables 1.9-.\n\t *\n\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t *   from an Ajax source or for server-side processing - this parameter\n\t *   allows that property to be changed. You can use Javascript dotted\n\t *   object notation to get a data source for multiple levels of nesting, or\n\t *   it my be used as a function. As a function it takes a single parameter,\n\t *   the JSON returned from the server, which can be manipulated as\n\t *   required, with the returned value being that used by DataTables as the\n\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t *   DataTables 1.9-.\n\t *\n\t * * `success` - Should not be overridden it is used internally in\n\t *   DataTables. To manipulate / transform the data returned by the server\n\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t *\n\t * `function`\n\t * ----------\n\t *\n\t * As a function, making the Ajax call is left up to yourself allowing\n\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t * than Ajax could be used to obtain the required data, such as Web storage\n\t * or an AIR database.\n\t *\n\t * The function is given four parameters and no return is required. The\n\t * parameters are:\n\t *\n\t * 1. _object_ - Data to send to the server\n\t * 2. _function_ - Callback function that must be executed when the required\n\t *    data has been obtained. That data should be passed into the callback\n\t *    as the only parameter\n\t * 3. _object_ - DataTables settings object for the table\n\t *\n\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t *\n\t *  @type string|object|function\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.ajax\n\t *  @since 1.10.0\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax.\n\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": \"data.json\"\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"tableData\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t *   // from a plain array rather than an array in an object\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Manipulate the data returned from the server - add a link to data\n\t *   // (note this can, should, be done using `render` for the column - this\n\t *   // is just a simple example of how the data can be manipulated).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": function ( json ) {\n\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t *         }\n\t *         return json;\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Add data to the request\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"data\": function ( d ) {\n\t *         return {\n\t *           \"extra_search\": $('#extra').val()\n\t *         };\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Send request as POST\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"type\": \"POST\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get the data from localStorage (could interface with a form for\n\t *   // adding, editing and removing rows).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": function (data, callback, settings) {\n\t *       callback(\n\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t *       );\n\t *     }\n\t *   } );\n\t */\n\t\"ajax\": null,\n\n\n\t/**\n\t * This parameter allows you to readily specify the entries in the length drop\n\t * down menu that DataTables shows when pagination is enabled. It can be\n\t * either a 1D array of options which will be used for both the displayed\n\t * option and the value, or a 2D array which will use the array in the first\n\t * position as the value, and the array in the second position as the\n\t * displayed options (useful for language strings such as 'All').\n\t *\n\t * Note that the `pageLength` property will be automatically set to the\n\t * first value given in this array, unless `pageLength` is also provided.\n\t *  @type array\n\t *  @default [ 10, 25, 50, 100 ]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.lengthMenu\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t *      } );\n\t *    } );\n\t */\n\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\n\n\t/**\n\t * The `columns` option in the initialisation parameter allows you to define\n\t * details about the way individual columns behave. For a full list of\n\t * column options that can be set, please see\n\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t * define your columns, you must have an entry in the array for every single\n\t * column that you have in your table (these can be null if you don't which\n\t * to specify any options).\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.column\n\t */\n\t\"aoColumns\": null,\n\n\t/**\n\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t * column, multiple columns, or all columns, using the `targets` property of\n\t * each object in the array. This allows great flexibility when creating\n\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t * columns you specifically want. `columnDefs` may use any of the column\n\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t * have `targets` defined in each object in the array. Values in the `targets`\n\t * array may be:\n\t *   <ul>\n\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t *     <li>a negative integer - column index counting from the right</li>\n\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t *   </ul>\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.columnDefs\n\t */\n\t\"aoColumnDefs\": null,\n\n\n\t/**\n\t * Basically the same as `search`, this parameter defines the individual column\n\t * filtering state at initialisation time. The array must be of the same size\n\t * as the number of columns, and each element be an object with the parameters\n\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t * accepted and the default will be used.\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.searchCols\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchCols\": [\n\t *          null,\n\t *          { \"search\": \"My filter\" },\n\t *          null,\n\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t *        ]\n\t *      } );\n\t *    } )\n\t */\n\t\"aoSearchCols\": [],\n\n\n\t/**\n\t * An array of CSS classes that should be applied to displayed rows. This\n\t * array may be of any length, and DataTables will apply each class\n\t * sequentially, looping when required.\n\t *  @type array\n\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t *    options</i>\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.stripeClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t *      } );\n\t *    } )\n\t */\n\t\"asStripeClasses\": null,\n\n\n\t/**\n\t * Enable or disable automatic column width calculation. This can be disabled\n\t * as an optimisation (it takes some time to calculate the widths) if the\n\t * tables widths are passed in using `columns`.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.autoWidth\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"autoWidth\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bAutoWidth\": true,\n\n\n\t/**\n\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t * are using an Ajax or JS data source for the table. This option, when set to\n\t * true, will cause DataTables to defer the creation of the table elements for\n\t * each row until they are needed for a draw - saving a significant amount of\n\t * time.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.deferRender\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajax\": \"sources/arrays.txt\",\n\t *        \"deferRender\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDeferRender\": false,\n\n\n\t/**\n\t * Replace a DataTable which matches the given selector and replace it with\n\t * one which has the properties of the new initialisation object passed. If no\n\t * table matches the selector, then the new DataTable will be constructed as\n\t * per normal.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.destroy\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"srollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *\n\t *      // Some time later....\n\t *      $('#example').dataTable( {\n\t *        \"filter\": false,\n\t *        \"destroy\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDestroy\": false,\n\n\n\t/**\n\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t * that it allows the end user to input multiple words (space separated) and\n\t * will match a row containing those words, even if not in the order that was\n\t * specified (this allow matching across multiple columns). Note that if you\n\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t * default filtering input box and retain filtering abilities, please use\n\t * {@link DataTable.defaults.dom}.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.searching\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"searching\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bFilter\": true,\n\n\n\t/**\n\t * Enable or disable the table information display. This shows information\n\t * about the data that is currently visible on the page, including information\n\t * about filtered data if that action is being performed.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.info\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"info\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bInfo\": true,\n\n\n\t/**\n\t * Allows the end user to select the size of a formatted page from a select\n\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.lengthChange\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"lengthChange\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bLengthChange\": true,\n\n\n\t/**\n\t * Enable or disable pagination.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.paging\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"paging\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bPaginate\": true,\n\n\n\t/**\n\t * Enable or disable the display of a 'processing' indicator when the table is\n\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t * large amounts of data where it can take a noticeable amount of time to sort\n\t * the entries.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.processing\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"processing\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bProcessing\": false,\n\n\n\t/**\n\t * Retrieve the DataTables object for the given selector. Note that if the\n\t * table has already been initialised, this parameter will cause DataTables\n\t * to simply return the object that has already been set up - it will not take\n\t * account of any changes you might have made to the initialisation object\n\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t * you need.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.retrieve\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      initTable();\n\t *      tableActions();\n\t *    } );\n\t *\n\t *    function initTable ()\n\t *    {\n\t *      return $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false,\n\t *        \"retrieve\": true\n\t *      } );\n\t *    }\n\t *\n\t *    function tableActions ()\n\t *    {\n\t *      var table = initTable();\n\t *      // perform API operations with oTable\n\t *    }\n\t */\n\t\"bRetrieve\": false,\n\n\n\t/**\n\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t * the table's viewport to the given height at all times (useful for layout).\n\t * However, this can look odd when filtering data down to a small data set,\n\t * and the footer is left \"floating\" further down. This parameter (when\n\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t * the result set will fit within the given Y height.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollCollapse\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200\",\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bScrollCollapse\": false,\n\n\n\t/**\n\t * Configure DataTables to use server-side processing. Note that the\n\t * `ajax` parameter must also be given in order to give DataTables a\n\t * source to obtain the required data for each draw.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverSide\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"xhr.php\"\n\t *      } );\n\t *    } );\n\t */\n\t\"bServerSide\": false,\n\n\n\t/**\n\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t * disabled by the `sortable` option for each column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.ordering\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"ordering\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSort\": true,\n\n\n\t/**\n\t * Enable or display DataTables' ability to sort multiple columns at the\n\t * same time (activated by shift-click by the user).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderMulti\n\t *\n\t *  @example\n\t *    // Disable multiple column sorting ability\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderMulti\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortMulti\": true,\n\n\n\t/**\n\t * Allows control over whether DataTables should use the top (true) unique\n\t * cell that is found for a single column, or the bottom (false - default).\n\t * This is useful when using complex headers.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderCellsTop\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderCellsTop\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortCellsTop\": false,\n\n\n\t/**\n\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t * presented as a feature switch as it can increase processing time (while\n\t * classes are removed and added) so for large data sets you might want to\n\t * turn this off.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.orderClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderClasses\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortClasses\": true,\n\n\n\t/**\n\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t * used to save table display information such as pagination information,\n\t * display length, filtering and sorting. As such when the end user reloads\n\t * the page the display display will match what thy had previously set up.\n\t *\n\t * Due to the use of `localStorage` the default state saving is not supported\n\t * in IE6 or 7. If state saving is required in those browsers, use\n\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.stateSave\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bStateSave\": false,\n\n\n\t/**\n\t * This function is called when a TR element is created (and all TD child\n\t * elements have been inserted), or registered if using a DOM source, allowing\n\t * manipulation of the TR element (adding classes etc).\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.createdRow\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" )\n\t *          {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnCreatedRow\": null,\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify any aspect you want about the created DOM.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.drawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"drawCallback\": function( settings ) {\n\t *          alert( 'DataTables has redrawn the table' );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnDrawCallback\": null,\n\n\n\t/**\n\t * Identical to fnHeaderCallback() but for the table footer this function\n\t * allows you to modify the table footer on every 'draw' event.\n\t *  @type function\n\t *  @param {node} foot \"TR\" element for the footer\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.footerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnFooterCallback\": null,\n\n\n\t/**\n\t * When rendering large numbers in the information element for the table\n\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t * function will override the default method DataTables uses.\n\t *  @type function\n\t *  @member\n\t *  @param {int} toFormat number to be formatted\n\t *  @returns {string} formatted string for DataTables to show the number\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.formatNumber\n\t *\n\t *  @example\n\t *    // Format a number using a single quote for the separator (note that\n\t *    // this can also be done with the language.thousands option)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"formatNumber\": function ( toFormat ) {\n\t *          return toFormat.toString().replace(\n\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t *          );\n\t *        };\n\t *      } );\n\t *    } );\n\t */\n\t\"fnFormatNumber\": function ( toFormat ) {\n\t\treturn toFormat.toString().replace(\n\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\tthis.oLanguage.sThousands\n\t\t);\n\t},\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify the header row. This can be used to calculate and\n\t * display useful information about the table.\n\t *  @type function\n\t *  @param {node} head \"TR\" element for the header\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.headerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnHeaderCallback\": null,\n\n\n\t/**\n\t * The information element can be used to convey information about the current\n\t * state of the table. Although the internationalisation options presented by\n\t * DataTables are quite capable of dealing with most customisations, there may\n\t * be times where you wish to customise the string further. This callback\n\t * allows you to do exactly that.\n\t *  @type function\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {int} start Starting position in data for the draw\n\t *  @param {int} end End position in data for the draw\n\t *  @param {int} max Total number of rows in the table (regardless of\n\t *    filtering)\n\t *  @param {int} total Total number of rows in the data set, after filtering\n\t *  @param {string} pre The string that DataTables has formatted using it's\n\t *    own rules\n\t *  @returns {string} The string to be displayed in the information element.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.infoCallback\n\t *\n\t *  @example\n\t *    $('#example').dataTable( {\n\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t *        return start +\" to \"+ end;\n\t *      }\n\t *    } );\n\t */\n\t\"fnInfoCallback\": null,\n\n\n\t/**\n\t * Called when the table has been initialised. Normally DataTables will\n\t * initialise sequentially and there will be no need for this function,\n\t * however, this does not hold true when using external language information\n\t * since that is obtained using an async XHR call.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.initComplete\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"initComplete\": function(settings, json) {\n\t *          alert( 'DataTables has finished its initialisation.' );\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnInitComplete\": null,\n\n\n\t/**\n\t * Called at the very start of each table draw and can be used to cancel the\n\t * draw by returning false, any other return (including undefined) results in\n\t * the full draw occurring).\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t *    return) will allow it to complete.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.preDrawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"preDrawCallback\": function( settings ) {\n\t *          if ( $('#test').val() == 1 ) {\n\t *            return false;\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnPreDrawCallback\": null,\n\n\n\t/**\n\t * This function allows you to 'post process' each row after it have been\n\t * generated for each table draw, but before it is rendered on screen. This\n\t * function might be used for setting the row class name etc.\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} displayIndex The display index for the current table draw\n\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t *    rows (after filtering)\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.rowCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" ) {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnRowCallback\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * This parameter allows you to override the default function which obtains\n\t * the data from the server so something more suitable for your application.\n\t * For example you could use POST data, or pull information from a Gears or\n\t * AIR database.\n\t *  @type function\n\t *  @member\n\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t *  @param {array} data A key/value pair object containing the data to send\n\t *    to the server\n\t *  @param {function} callback to be called on completion of the data get\n\t *    process that will draw the data on the page.\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverData\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerData\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t *  It is often useful to send extra data to the server when making an Ajax\n\t * request - for example custom filtering information, and this callback\n\t * function makes it trivial to send extra information to the server. The\n\t * passed in parameter is the data set that has been constructed by\n\t * DataTables, and you can add to this or modify it as you require.\n\t *  @type function\n\t *  @param {array} data Data array (array of objects which are name/value\n\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t *    server. In the case of Ajax sourced data with server-side processing\n\t *    this will be an empty array, for server-side processing there will be a\n\t *    significant number of parameters!\n\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t *    as this is passed by reference.\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverParams\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerParams\": null,\n\n\n\t/**\n\t * Load the table state. With this function you can define from where, and how, the\n\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} callback Callback that can be executed when done. It\n\t *    should be passed the loaded state object.\n\t *  @return {object} The DataTables state object to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadCallback\": function (settings, callback) {\n\t *          $.ajax( {\n\t *            \"url\": \"/state_load\",\n\t *            \"dataType\": \"json\",\n\t *            \"success\": function (json) {\n\t *              callback( json );\n\t *            }\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadCallback\": function ( settings ) {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t)\n\t\t\t);\n\t\t} catch (e) {\n\t\t\treturn {};\n\t\t}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the saved state prior to loading that state.\n\t * This callback is called when the table is loading state from the stored data, but\n\t * prior to the settings object being modified by the saved state. Note that for\n\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t * a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that is to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never loaded\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Disallow state loading by returning false\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          return false;\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadParams\": null,\n\n\n\t/**\n\t * Callback that is called when the state has been loaded from the state saving method\n\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that was loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoaded\n\t *\n\t *  @example\n\t *    // Show an alert with the filtering value that was saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoaded\": function (settings, data) {\n\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoaded\": null,\n\n\n\t/**\n\t * Save the table state. This function allows you to define where and how the state\n\t * information for the table is stored By default DataTables will use `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveCallback\": function (settings, data) {\n\t *          // Send an Ajax request to the server with the state object\n\t *          $.ajax( {\n\t *            \"url\": \"/state_save\",\n\t *            \"data\": data,\n\t *            \"dataType\": \"json\",\n\t *            \"method\": \"POST\"\n\t *            \"success\": function () {}\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\ttry {\n\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\tJSON.stringify( data )\n\t\t\t);\n\t\t} catch (e) {}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the state to be saved. Called when the table\n\t * has changed state a new state save is required. This method allows modification of\n\t * the state saving object prior to actually doing the save, including addition or\n\t * other state properties or modification. Note that for plug-in authors, you should\n\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveParams\": null,\n\n\n\t/**\n\t * Duration for which the saved state information is considered valid. After this period\n\t * has elapsed the state will be returned to the default.\n\t * Value is given in seconds.\n\t *  @type int\n\t *  @default 7200 <i>(2 hours)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.stateDuration\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateDuration\": 60*60*24; // 1 day\n\t *      } );\n\t *    } )\n\t */\n\t\"iStateDuration\": 7200,\n\n\n\t/**\n\t * When enabled DataTables will not make a request to the server for the first\n\t * page draw - rather it will use the data already on the page (no sorting etc\n\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t * is used to indicate that deferred loading is required, but it is also used\n\t * to tell DataTables how many records there are in the full table (allowing\n\t * the information element and pagination to be displayed correctly). In the case\n\t * where a filtering is applied to the table on initial load, this can be\n\t * indicated by giving the parameter as an array, where the first element is\n\t * the number of records available after filtering and the second element is the\n\t * number of records without filtering (allowing the table information element\n\t * to be shown correctly).\n\t *  @type int | array\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.deferLoading\n\t *\n\t *  @example\n\t *    // 57 records available in the table, no filtering applied\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": 57\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": [ 57, 100 ],\n\t *        \"search\": {\n\t *          \"search\": \"my_filter\"\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"iDeferLoading\": null,\n\n\n\t/**\n\t * Number of rows to display on a single page when using pagination. If\n\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t * this to a custom setting using a pop-up menu.\n\t *  @type int\n\t *  @default 10\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pageLength\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pageLength\": 50\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayLength\": 10,\n\n\n\t/**\n\t * Define the starting point for data display when using DataTables with\n\t * pagination. Note that this parameter is the number of records, rather than\n\t * the page number, so if you have 10 records per page and want to start on\n\t * the third page, it should be \"20\".\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.displayStart\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"displayStart\": 20\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayStart\": 0,\n\n\n\t/**\n\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t * allows you to tab through the controls and press the enter key to activate them.\n\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t * disable built-in keyboard navigation.\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.tabIndex\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"tabIndex\": 1\n\t *      } );\n\t *    } );\n\t */\n\t\"iTabIndex\": 0,\n\n\n\t/**\n\t * Classes that DataTables assigns to the various components and features\n\t * that it adds to the HTML table. This allows classes to be configured\n\t * during initialisation in addition to through the static\n\t * {@link DataTable.ext.oStdClasses} object).\n\t *  @namespace\n\t *  @name DataTable.defaults.classes\n\t */\n\t\"oClasses\": {},\n\n\n\t/**\n\t * All strings that DataTables uses in the user interface that it creates\n\t * are defined in this object, allowing you to modified them individually or\n\t * completely replace them all as required.\n\t *  @namespace\n\t *  @name DataTable.defaults.language\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t * must be internationalised as well).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.aria\n\t\t */\n\t\t\"oAria\": {\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t},\n\n\t\t/**\n\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t * control types.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.paginate\n\t\t */\n\t\t\"oPaginate\": {\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the first page.\n\t\t\t *  @type string\n\t\t\t *  @default First\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"first\": \"First page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sFirst\": \"First\",\n\n\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the last page.\n\t\t\t *  @type string\n\t\t\t *  @default Last\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"last\": \"Last page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLast\": \"Last\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t * next page).\n\t\t\t *  @type string\n\t\t\t *  @default Next\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"next\": \"Next page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sNext\": \"Next\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t * the previous page).\n\t\t\t *  @type string\n\t\t\t *  @default Previous\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sPrevious\": \"Previous\"\n\t\t},\n\n\t\t/**\n\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t * instead (either the default or given value).\n\t\t *  @type string\n\t\t *  @default No data available in table\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sEmptyTable\": \"No data available in table\",\n\n\n\t\t/**\n\t\t * This string gives information to the end user about the information\n\t\t * that is current on display on the page. The following tokens can be\n\t\t * used in the string and will be dynamically replaced as the table\n\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t * removed as needed by the language requires:\n\t\t *\n\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t * * `\\_PAGE\\_` - Current page number\n\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t *\n\t\t *  @type string\n\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\n\n\t\t/**\n\t\t * Display information string for when the table is empty. Typically the\n\t\t * format of this string should match `info`.\n\t\t *  @type string\n\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\n\n\t\t/**\n\t\t * When a user filters the information in a table, this string is appended\n\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t *  @type string\n\t\t *  @default (filtered from _MAX_ total entries)\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\n\n\t\t/**\n\t\t * If can be useful to append extra information to the info string at times,\n\t\t * and this variable does exactly that. This information will be appended to\n\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t * being used) at all times.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoPostFix\": \"\",\n\n\n\t\t/**\n\t\t * This decimal place operator is a little different from the other\n\t\t * language options since DataTables doesn't output floating point\n\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t * what this parameter does is modify the sort methods of the table so\n\t\t * that numbers which are in a format which has a character other than\n\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t *\n\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t * the same table and still be sortable, the table must be consistent.\n\t\t * However, multiple different tables on the page can use different\n\t\t * decimal place characters.\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.decimal\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"decimal\": \",\"\n\t\t *          \"thousands\": \".\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDecimal\": \"\",\n\n\n\t\t/**\n\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t * used to format large numbers that are used in the table information.\n\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t * character you wish with this parameter.\n\t\t *  @type string\n\t\t *  @default ,\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.thousands\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"thousands\": \"'\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sThousands\": \",\",\n\n\n\t\t/**\n\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t * with a custom select box if required.\n\t\t *  @type string\n\t\t *  @default Show _MENU_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    // Language change only\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Language and options change\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t *            '<option value=\"10\">10</option>'+\n\t\t *            '<option value=\"20\">20</option>'+\n\t\t *            '<option value=\"30\">30</option>'+\n\t\t *            '<option value=\"40\">40</option>'+\n\t\t *            '<option value=\"50\">50</option>'+\n\t\t *            '<option value=\"-1\">All</option>'+\n\t\t *            '</select> records'\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\n\n\t\t/**\n\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t * parameter is not used when loading data by server-side processing, just\n\t\t * Ajax sourced data with client-side processing.\n\t\t *  @type string\n\t\t *  @default Loading...\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLoadingRecords\": \"Loading...\",\n\n\n\t\t/**\n\t\t * Text which is displayed when the table is processing a user action\n\t\t * (usually a sort command or similar).\n\t\t *  @type string\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sProcessing\": \"\",\n\n\n\t\t/**\n\t\t * Details the actions that will be taken when the user types into the\n\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t * then the input box is appended to the string automatically.\n\t\t *  @type string\n\t\t *  @default Search:\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.search\n\t\t *\n\t\t *  @example\n\t\t *    // Input text box will be appended at the end automatically\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Filter records:\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Specify where the filter should appear\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSearch\": \"Search:\",\n\n\n\t\t/**\n\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t */\n\t\t\"sSearchPlaceholder\": \"\",\n\n\n\t\t/**\n\t\t * All of the language information can be stored in a file on the\n\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t * and the object has the same properties as the oLanguage object in the\n\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t * the example language files to see how this works in action.\n\t\t *  @type string\n\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.url\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sUrl\": \"\",\n\n\n\t\t/**\n\t\t * Text shown inside the table records when the is no information to be\n\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t * information in the table at all (regardless of filtering).\n\t\t *  @type string\n\t\t *  @default No matching records found\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sZeroRecords\": \"No matching records found\"\n\t},\n\n\n\t/**\n\t * This parameter allows you to have define the global filtering state at\n\t * initialisation time. As an object the `search` parameter must be\n\t * defined, but all other parameters are optional. When `regex` is true,\n\t * the search string will be treated as a regular expression, when false\n\t * (default) it will be treated as a straight string. When `smart`\n\t * DataTables will use it's smart filtering methods (to word match at\n\t * any point in the data), when false this will not be done.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.search\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"search\": {\"search\": \"Initial search\"}\n\t *      } );\n\t *    } )\n\t */\n\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * By default DataTables will look for the property `data` (or `aaData` for\n\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t * source or for server-side processing - this parameter allows that\n\t * property to be changed. You can use Javascript dotted object notation to\n\t * get a data source for multiple levels of nesting.\n\t *  @type string\n\t *  @default data\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxDataProp\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxDataProp\": \"data\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * You can instruct DataTables to load data from an external\n\t * source using this parameter (use aData if you want to pass data in you\n\t * already have). Simply provide a url a JSON object can be obtained from.\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxSource\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxSource\": null,\n\n\n\t/**\n\t * This initialisation variable allows you to specify exactly where in the\n\t * DOM you want DataTables to inject the various controls it adds to the page\n\t * (for example you might want the pagination controls at the top of the\n\t * table). DIV elements (with or without a custom class) can also be added to\n\t * aid styling. The follow syntax is used:\n\t *   <ul>\n\t *     <li>The following options are allowed:\n\t *       <ul>\n\t *         <li>'l' - Length changing</li>\n\t *         <li>'f' - Filtering input</li>\n\t *         <li>'t' - The table!</li>\n\t *         <li>'i' - Information</li>\n\t *         <li>'p' - Pagination</li>\n\t *         <li>'r' - pRocessing</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following constants are allowed:\n\t *       <ul>\n\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following syntax is expected:\n\t *       <ul>\n\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>Examples:\n\t *       <ul>\n\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t *       </ul>\n\t *     </li>\n\t *   </ul>\n\t *  @type string\n\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.dom\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t *      } );\n\t *    } );\n\t */\n\t\"sDom\": \"lfrtip\",\n\n\n\t/**\n\t * Search delay option. This will throttle full table searches that use the\n\t * DataTables provided search input element (it does not effect calls to\n\t * `dt-api search()`, providing a delay before the search is made.\n\t *  @type integer\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.searchDelay\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchDelay\": 200\n\t *      } );\n\t *    } )\n\t */\n\t\"searchDelay\": null,\n\n\n\t/**\n\t * DataTables features six different built-in options for the buttons to\n\t * display for pagination control:\n\t *\n\t * * `numbers` - Page number buttons only\n\t * * `simple` - 'Previous' and 'Next' buttons only\n\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t *  \n\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t *  @type string\n\t *  @default simple_numbers\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pagingType\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pagingType\": \"full_numbers\"\n\t *      } );\n\t *    } )\n\t */\n\t\"sPaginationType\": \"simple_numbers\",\n\n\n\t/**\n\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t * certain layout, or you have a large number of columns in the table, you\n\t * can enable x-scrolling to show the table in a viewport, which can be\n\t * scrolled. This property can be `true` which will allow the table to\n\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t * is recommended.\n\t *  @type boolean|string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollX\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": true,\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollX\": \"\",\n\n\n\t/**\n\t * This property can be used to force a DataTable to use more width than it\n\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t * table which requires to be well spaced, this parameter is useful for\n\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t * measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollXInner\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": \"100%\",\n\t *        \"scrollXInner\": \"110%\"\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollXInner\": \"\",\n\n\n\t/**\n\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t * to the given height, and enable scrolling for any data which overflows the\n\t * current viewport. This can be used as an alternative to paging to display\n\t * a lot of data in a small area (although paging and scrolling can both be\n\t * enabled at the same time). This property can be any CSS unit, or a number\n\t * (in which case it will be treated as a pixel measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollY\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollY\": \"\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t * processing or Ajax sourced data.\n\t *  @type string\n\t *  @default GET\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverMethod\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sServerMethod\": \"GET\",\n\n\n\t/**\n\t * DataTables makes use of renderers when displaying HTML elements for\n\t * a table. These renderers can be added or modified by plug-ins to\n\t * generate suitable mark-up for a site. For example the Bootstrap\n\t * integration plug-in for DataTables uses a paging button renderer to\n\t * display pagination buttons in the mark-up required by Bootstrap.\n\t *\n\t * For further information about the renderers available see\n\t * DataTable.ext.renderer\n\t *  @type string|object\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.renderer\n\t *\n\t */\n\t\"renderer\": null,\n\n\n\t/**\n\t * Set the data property name that DataTables should use to get a row's id\n\t * to set as the `id` property in the node.\n\t *  @type string\n\t *  @default DT_RowId\n\t *\n\t *  @name DataTable.defaults.rowId\n\t */\n\t\"rowId\": \"DT_RowId\"\n};\n\n_fnHungarianMap( DataTable.defaults );\n\n\n\n/*\n * Developer note - See note in model.defaults.js about the use of Hungarian\n * notation and camel case.\n */\n\n/**\n * Column options that can be given to DataTables at initialisation time.\n *  @namespace\n */\nDataTable.defaults.column = {\n\t/**\n\t * Define which column(s) an order will occur on for this column. This\n\t * allows a column's ordering to take multiple columns into account when\n\t * doing a sort or use the data from a different column. For example first\n\t * name / last name columns make sense to do a multi-column sort over the\n\t * two columns.\n\t *  @type array|int\n\t *  @default null <i>Takes the value of the column index automatically</i>\n\t *\n\t *  @name DataTable.defaults.column.orderData\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderData\": [ 0, 1 ] },\n\t *          { \"orderData\": [ 1, 0 ] },\n\t *          { \"orderData\": 2 },\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aDataSort\": null,\n\t\"iDataSort\": -1,\n\n\n\t/**\n\t * You can control the default ordering direction, and even alter the\n\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t * using this parameter.\n\t *  @type array\n\t *  @default [ 'asc', 'desc' ]\n\t *\n\t *  @name DataTable.defaults.column.orderSequence\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          { \"orderSequence\": [ \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\" ] },\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"asSorting\": [ 'asc', 'desc' ],\n\n\n\t/**\n\t * Enable or disable filtering on the data in this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.searchable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"searchable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSearchable\": true,\n\n\n\t/**\n\t * Enable or disable ordering on this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.orderable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSortable\": true,\n\n\n\t/**\n\t * Enable or disable the display of this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.visible\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"visible\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bVisible\": true,\n\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} td The TD node that has been created\n\t *  @param {*} cellData The Data for the cell\n\t *  @param {array|object} rowData The data for the whole row\n\t *  @param {int} row The row index for the aoData data store\n\t *  @param {int} col The column index for aoColumns\n\t *\n\t *  @name DataTable.defaults.column.createdCell\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [3],\n\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t *            if ( cellData == \"1.7\" ) {\n\t *              $(td).css('color', 'blue')\n\t *            }\n\t *          }\n\t *        } ]\n\t *      });\n\t *    } );\n\t */\n\t\"fnCreatedCell\": null,\n\n\n\t/**\n\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t * consistency. `dataProp` can still be used, as there is backwards\n\t * compatibility in DataTables for this option, but it is strongly\n\t * recommended that you use `data` in preference to `dataProp`.\n\t *  @name DataTable.defaults.column.dataProp\n\t */\n\n\n\t/**\n\t * This property can be used to read data from any data source property,\n\t * including deeply nested objects / properties. `data` can be given in a\n\t * number of different ways which effect its behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object. Note that\n\t *      function notation is recommended for use in `render` rather than\n\t *      `data` as it is much simpler to use as a renderer.\n\t * * `null` - use the original data source for the row rather than plucking\n\t *   data directly from it. This action has effects on two other\n\t *   initialisation options:\n\t *    * `defaultContent` - When null is given as the `data` option and\n\t *      `defaultContent` is specified for the column, the value defined by\n\t *      `defaultContent` will be used for the cell.\n\t *    * `render` - When null is used for the `data` option and the `render`\n\t *      option is specified for the column, the whole data source for the\n\t *      row is used for the renderer.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * `{array|object}` The data source for the row\n\t *      * `{string}` The type call data requested - this will be 'set' when\n\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t *        when gathering data. Note that when `undefined` is given for the\n\t *        type DataTables expects to get the raw data for the object back<\n\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t *    * Return:\n\t *      * The return value from the function is not required when 'set' is\n\t *        the type of call, but otherwise the return is what will be used\n\t *        for the data requested.\n\t *\n\t * Note that `data` is a getter and setter option. If you just require\n\t * formatting of data for output, you will likely want to use `render` which\n\t * is simply a getter and thus simpler to use.\n\t *\n\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t * name change reflects the flexibility of this property and is consistent\n\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t * be used by DataTables, as it automatically maps the old name to the new\n\t * if required.\n\t *\n\t *  @type string|int|function|null\n\t *  @default null <i>Use automatically calculated column index</i>\n\t *\n\t *  @name DataTable.defaults.column.data\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Read table data from objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {value},\n\t *    //      \"version\": {value},\n\t *    //      \"grade\": {value}\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform\" },\n\t *          { \"data\": \"version\" },\n\t *          { \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Read information from deeply nested objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {\n\t *    //         \"inner\": {value}\n\t *    //      },\n\t *    //      \"details\": [\n\t *    //         {value}, {value}\n\t *    //      ]\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform.inner\" },\n\t *          { \"data\": \"details.0\" },\n\t *          { \"data\": \"details.1\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `data` as a function to provide different information for\n\t *    // sorting, filtering and display. In this case, currency (price)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": function ( source, type, val ) {\n\t *            if (type === 'set') {\n\t *              source.price = val;\n\t *              // Store the computed display and filter values for efficiency\n\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t *              return;\n\t *            }\n\t *            else if (type === 'display') {\n\t *              return source.price_display;\n\t *            }\n\t *            else if (type === 'filter') {\n\t *              return source.price_filter;\n\t *            }\n\t *            // 'sort', 'type' and undefined all just use the integer\n\t *            return source.price;\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using default content\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null,\n\t *          \"defaultContent\": \"Click to edit\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using array notation - outputting a list from an array\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"name[, ]\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t */\n\t\"mData\": null,\n\n\n\t/**\n\t * This property is the rendering partner to `data` and it is suggested that\n\t * when you want to manipulate data for display (including filtering,\n\t * sorting etc) without altering the underlying data for the table, use this\n\t * property. `render` can be considered to be the the read only companion to\n\t * `data` which is read / write (then as such more complex). Like `data`\n\t * this option can be given in a number of different ways to effect its\n\t * behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object.\n\t * * `object` - use different data for the different data types requested by\n\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t *   of the object is the data type the property refers to and the value can\n\t *   defined using an integer, string or function using the same rules as\n\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t *   This is the default value to use if you haven't specified a value for\n\t *   the data type requested by DataTables.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * {array|object} The data source for the row (based on `data`)\n\t *      * {string} The type call data requested - this will be 'filter',\n\t *        'display', 'type' or 'sort'.\n\t *      * {array|object} The full data source for the row (not based on\n\t *        `data`)\n\t *    * Return:\n\t *      * The return value from the function is what will be used for the\n\t *        data requested.\n\t *\n\t *  @type string|int|function|object|null\n\t *  @default null Use the data source value.\n\t *\n\t *  @name DataTable.defaults.column.render\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Create a comma separated list from an array of objects\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          {\n\t *            \"data\": \"platform\",\n\t *            \"render\": \"[, ].name\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Execute a function to obtain data\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": \"browserName()\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // As an object, extracting different data for the different types\n\t *    // This would be used with a data source such as:\n\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t *    // the formatted phone number is the one that is shown in the table.\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": {\n\t *            \"_\": \"phone\",\n\t *            \"filter\": \"phone_filter\",\n\t *            \"display\": \"phone_display\"\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Use as a function to create a link from the data source\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"download_link\",\n\t *          \"render\": function ( data, type, full ) {\n\t *            return '<a href=\"'+data+'\">Download</a>';\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"mRender\": null,\n\n\n\t/**\n\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t *  @type string\n\t *  @default td\n\t *\n\t *  @name DataTable.defaults.column.cellType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Make the first column use TH cells\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"cellType\": \"th\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sCellType\": \"td\",\n\n\n\t/**\n\t * Class to give to each cell in this column.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.class\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"class\": \"my_class\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sClass\": \"\",\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t * Generally you shouldn't need this!\n\t *  @type string\n\t *  @default <i>Empty string<i>\n\t *\n\t *  @name DataTable.defaults.column.contentPadding\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"contentPadding\": \"mmm\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sContentPadding\": \"\",\n\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because `data`\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.column.defaultContent\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\",\n\t *            \"targets\": [ -1 ]\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sDefaultContent\": null,\n\n\n\t/**\n\t * This parameter is only used in DataTables' server-side processing. It can\n\t * be exceptionally useful to know what columns are being displayed on the\n\t * client side, and to map these to database fields. When defined, the names\n\t * also allow DataTables to reorder information from the server if it comes\n\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t * client-side, your server-side code does not also need updating).\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.name\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"name\": \"engine\" },\n\t *          { \"name\": \"browser\" },\n\t *          { \"name\": \"platform\" },\n\t *          { \"name\": \"version\" },\n\t *          { \"name\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sName\": \"\",\n\n\n\t/**\n\t * Defines a data source type for the ordering which can be used to read\n\t * real-time information from the table (updating the internally cached\n\t * version) prior to ordering. This allows ordering to occur on user\n\t * editable elements such as form inputs.\n\t *  @type string\n\t *  @default std\n\t *\n\t *  @name DataTable.defaults.column.orderDataType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          { \"orderDataType\": \"dom-text\" },\n\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t *          { \"orderDataType\": \"dom-select\" },\n\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sSortDataType\": \"std\",\n\n\n\t/**\n\t * The title of this column.\n\t *  @type string\n\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t *    original HTML table.</i>\n\t *\n\t *  @name DataTable.defaults.column.title\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"title\": \"My column title\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sTitle\": null,\n\n\n\t/**\n\t * The type allows you to specify how the data for this column will be\n\t * ordered. Four types (string, numeric, date and html (which will strip\n\t * HTML tags before ordering)) are currently available. Note that only date\n\t * formats understood by Javascript's Date() object will be accepted as type\n\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t * through plug-ins.\n\t *  @type string\n\t *  @default null <i>Auto-detected from raw data</i>\n\t *\n\t *  @name DataTable.defaults.column.type\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"type\": \"html\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sType\": null,\n\n\n\t/**\n\t * Defining the width of the column, this parameter may take any CSS value\n\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t * been given a specific width through this interface ensuring that the table\n\t * remains readable.\n\t *  @type string\n\t *  @default null <i>Automatic</i>\n\t *\n\t *  @name DataTable.defaults.column.width\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"width\": \"20%\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sWidth\": null\n};\n\n_fnHungarianMap( DataTable.defaults.column );\n\n\n\n/**\n * DataTables settings object - this holds all the information needed for a\n * given table, including configuration, data and current application of the\n * table options. DataTables does not have a single instance for each DataTable\n * with the settings attached to that instance, but rather instances of the\n * DataTable \"class\" are created on-the-fly as needed (typically by a\n * $().dataTable() call) and the settings object is then applied to that\n * instance.\n *\n * Note that this object is related to {@link DataTable.defaults} but this\n * one is the internal data store for DataTables's cache of columns. It should\n * NOT be manipulated outside of DataTables. Any configuration should be done\n * through the initialisation options.\n *  @namespace\n *  @todo Really should attach the settings object to individual instances so we\n *    don't need to create new instances on each $().dataTable() call (if the\n *    table already exists). It would also save passing oSettings around and\n *    into every single function. However, this is a very significant\n *    architecture change for DataTables and will almost certainly break\n *    backwards compatibility with older installations. This is something that\n *    will be done in 2.0.\n */\nDataTable.models.oSettings = {\n\t/**\n\t * Primary features of DataTables and their enablement state.\n\t *  @namespace\n\t */\n\t\"oFeatures\": {\n\n\t\t/**\n\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t * optimum table and columns widths (true) or not (false).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bAutoWidth\": null,\n\n\t\t/**\n\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t * needed by a driven page draw. This can give a significant speed\n\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t * difference at all for DOM and server-side processing tables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bDeferRender\": null,\n\n\t\t/**\n\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bFilter\": null,\n\n\t\t/**\n\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t * flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bInfo\": null,\n\n\t\t/**\n\t\t * Present a user control allowing the end user to change the page size\n\t\t * when pagination is enabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bLengthChange\": null,\n\n\t\t/**\n\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t * changing must also be disabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bPaginate\": null,\n\n\t\t/**\n\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t * user request - typically an Ajax request for server-side processing.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bProcessing\": null,\n\n\t\t/**\n\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t * get all data from the server for every draw - there is no filtering,\n\t\t * sorting or paging done on the client-side.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bServerSide\": null,\n\n\t\t/**\n\t\t * Sorting enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSort\": null,\n\n\t\t/**\n\t\t * Multi-column sorting\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortMulti\": null,\n\n\t\t/**\n\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t * there is a lot of DOM interaction.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortClasses\": null,\n\n\t\t/**\n\t\t * State saving enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bStateSave\": null\n\t},\n\n\n\t/**\n\t * Scrolling settings for a table.\n\t *  @namespace\n\t */\n\t\"oScroll\": {\n\t\t/**\n\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t * table container down to the height of the table (when true).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bCollapse\": null,\n\n\t\t/**\n\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t * during table initialisation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iBarWidth\": 0,\n\n\t\t/**\n\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t * disabled if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sX\": null,\n\n\t\t/**\n\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t * should not need to use this.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @deprecated\n\t\t */\n\t\t\"sXInner\": null,\n\n\t\t/**\n\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t * if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sY\": null\n\t},\n\n\t/**\n\t * Language information for the table.\n\t *  @namespace\n\t *  @extends DataTable.defaults.oLanguage\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Information callback function. See\n\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"fnInfoCallback\": null\n\t},\n\n\t/**\n\t * Browser support parameters\n\t *  @namespace\n\t */\n\t\"oBrowser\": {\n\t\t/**\n\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t * scrolling element (IE6/7)\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollOversize\": false,\n\n\t\t/**\n\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t * scrolling container - needed for rtl language layout, although not\n\t\t * all browsers move the scrollbar (Safari).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollbarLeft\": false,\n\n\t\t/**\n\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bBounding\": false,\n\n\t\t/**\n\t\t * Browser scrollbar width\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t */\n\t\t\"barWidth\": 0\n\t},\n\n\n\t\"ajax\": null,\n\n\n\t/**\n\t * Array referencing the nodes which are used for the features. The\n\t * parameters of this object match what is allowed by sDom - i.e.\n\t *   <ul>\n\t *     <li>'l' - Length changing</li>\n\t *     <li>'f' - Filtering input</li>\n\t *     <li>'t' - The table!</li>\n\t *     <li>'i' - Information</li>\n\t *     <li>'p' - Pagination</li>\n\t *     <li>'r' - pRocessing</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aanFeatures\": [],\n\n\t/**\n\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t * information.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoData\": [],\n\n\t/**\n\t * Array of indexes which are in the current display (after filtering etc)\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplay\": [],\n\n\t/**\n\t * Array of indexes for display - no filtering\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplayMaster\": [],\n\n\t/**\n\t * Map of row ids to data indexes\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"aIds\": {},\n\n\t/**\n\t * Store information about each column that is in use\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoColumns\": [],\n\n\t/**\n\t * Store information about the table's header\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeader\": [],\n\n\t/**\n\t * Store information about the table's footer\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooter\": [],\n\n\t/**\n\t * Store the applied global search information in case we want to force a\n\t * research or compare the old search to a new one.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t */\n\t\"oPreviousSearch\": {},\n\n\t/**\n\t * Store the applied search for each column - see\n\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t * filtering information for each column.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreSearchCols\": [],\n\n\t/**\n\t * Sorting that is applied to the table. Note that the inner arrays are\n\t * used in the following manner:\n\t * <ul>\n\t *   <li>Index 0 - column number</li>\n\t *   <li>Index 1 - current sorting direction</li>\n\t * </ul>\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @todo These inner arrays should really be objects\n\t */\n\t\"aaSorting\": null,\n\n\t/**\n\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t * aaSorting).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aaSortingFixed\": [],\n\n\t/**\n\t * Classes to use for the striping of a table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asStripeClasses\": null,\n\n\t/**\n\t * If restoring a table - we should restore its striping classes as well\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asDestroyStripes\": [],\n\n\t/**\n\t * If restoring a table - we should restore its width\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"sDestroyWidth\": 0,\n\n\t/**\n\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCallback\": [],\n\n\t/**\n\t * Callback functions for the header on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeaderCallback\": [],\n\n\t/**\n\t * Callback function for the footer on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooterCallback\": [],\n\n\t/**\n\t * Array of callback functions for draw callback functions\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDrawCallback\": [],\n\n\t/**\n\t * Array of callback functions for row created function\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCreatedCallback\": [],\n\n\t/**\n\t * Callback functions for just before the table is redrawn. A return of\n\t * false will be used to cancel the draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreDrawCallback\": [],\n\n\t/**\n\t * Callback functions for when the table has been initialised.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoInitComplete\": [],\n\n\n\t/**\n\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t * saving state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSaveParams\": [],\n\n\t/**\n\t * Callbacks for modifying the settings that have been stored for state saving\n\t * prior to using the stored values to restore the state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoadParams\": [],\n\n\t/**\n\t * Callbacks for operating on the settings object once the saved state has been\n\t * loaded\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoaded\": [],\n\n\t/**\n\t * Cache the table ID for quick access\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sTableId\": \"\",\n\n\t/**\n\t * The TABLE node for the main table\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTable\": null,\n\n\t/**\n\t * Permanent ref to the thead element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTHead\": null,\n\n\t/**\n\t * Permanent ref to the tfoot element - if it exists\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTFoot\": null,\n\n\t/**\n\t * Permanent ref to the tbody element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTBody\": null,\n\n\t/**\n\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTableWrapper\": null,\n\n\t/**\n\t * Indicate if when using server-side processing the loading of data\n\t * should be deferred until the second draw.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDeferLoading\": false,\n\n\t/**\n\t * Indicate if all required information has been read in\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bInitialised\": false,\n\n\t/**\n\t * Information about open rows. Each object in the array has the parameters\n\t * 'nTr' and 'nParent'\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoOpenRows\": [],\n\n\t/**\n\t * Dictate the positioning of DataTables' control elements - see\n\t * {@link DataTable.model.oInit.sDom}.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDom\": null,\n\n\t/**\n\t * Search delay (in mS)\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"searchDelay\": null,\n\n\t/**\n\t * Which type of pagination should be used.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default two_button\n\t */\n\t\"sPaginationType\": \"two_button\",\n\n\t/**\n\t * The state duration (for `stateSave`) in seconds.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iStateDuration\": 0,\n\n\t/**\n\t * Array of callback functions for state saving. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the JSON string to save that has been thus far created. Returns\n\t *       a JSON string to be inserted into a json object\n\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSave\": [],\n\n\t/**\n\t * Array of callback functions for state loading. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the object stored. May return false to cancel state loading</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoad\": [],\n\n\t/**\n\t * State that was saved. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oSavedState\": null,\n\n\t/**\n\t * State that was loaded. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oLoadedState\": null,\n\n\t/**\n\t * Source url for AJAX data for the table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sAjaxSource\": null,\n\n\t/**\n\t * Property from a given object from which to read the table data from. This\n\t * can be an empty string (when not server-side processing), in which case\n\t * it is  assumed an an array is given directly.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sAjaxDataProp\": null,\n\n\t/**\n\t * The last jQuery XHR object that was used for server-side data gathering.\n\t * This can be used for working with the XHR information in one of the\n\t * callbacks\n\t *  @type object\n\t *  @default null\n\t */\n\t\"jqXHR\": null,\n\n\t/**\n\t * JSON returned from the server in the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"json\": undefined,\n\n\t/**\n\t * Data submitted as part of the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"oAjaxData\": undefined,\n\n\t/**\n\t * Function to get the server-side data.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnServerData\": null,\n\n\t/**\n\t * Functions which are called prior to sending an Ajax request so extra\n\t * parameters can easily be sent to the server\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoServerParams\": [],\n\n\t/**\n\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t * required).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sServerMethod\": null,\n\n\t/**\n\t * Format numbers for display.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnFormatNumber\": null,\n\n\t/**\n\t * List of options that can be used for the user selectable length menu.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLengthMenu\": null,\n\n\t/**\n\t * Counter for the draws that the table does. Also used as a tracker for\n\t * server-side processing\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iDraw\": 0,\n\n\t/**\n\t * Indicate if a redraw is being done - useful for Ajax\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDrawing\": false,\n\n\t/**\n\t * Draw index (iDraw) of the last error when parsing the returned data\n\t *  @type int\n\t *  @default -1\n\t */\n\t\"iDrawError\": -1,\n\n\t/**\n\t * Paging display length\n\t *  @type int\n\t *  @default 10\n\t */\n\t\"_iDisplayLength\": 10,\n\n\t/**\n\t * Paging start point - aiDisplay index\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"_iDisplayStart\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the result set\n\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type int\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsTotal\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the current display set\n\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type boolean\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsDisplay\": 0,\n\n\t/**\n\t * The classes to use for the table\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oClasses\": {},\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bFiltered\": false,\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bSorted\": false,\n\n\t/**\n\t * Indicate that if multiple rows are in the header and there is more than\n\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t * should be used for sorting / title by DataTables.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t */\n\t\"bSortCellsTop\": null,\n\n\t/**\n\t * Initialisation object that is used for the table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInit\": null,\n\n\t/**\n\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t * destroy so they can clean up markup and events.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDestroyCallback\": [],\n\n\n\t/**\n\t * Get the number of records in the current record set, before filtering\n\t *  @type function\n\t */\n\t\"fnRecordsTotal\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsTotal * 1 :\n\t\t\tthis.aiDisplayMaster.length;\n\t},\n\n\t/**\n\t * Get the number of records in the current record set, after filtering\n\t *  @type function\n\t */\n\t\"fnRecordsDisplay\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\tthis.aiDisplay.length;\n\t},\n\n\t/**\n\t * Get the display end point - aiDisplay index\n\t *  @type function\n\t */\n\t\"fnDisplayEnd\": function ()\n\t{\n\t\tvar\n\t\t\tlen      = this._iDisplayLength,\n\t\t\tstart    = this._iDisplayStart,\n\t\t\tcalc     = start + len,\n\t\t\trecords  = this.aiDisplay.length,\n\t\t\tfeatures = this.oFeatures,\n\t\t\tpaginate = features.bPaginate;\n\n\t\tif ( features.bServerSide ) {\n\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\tstart + records :\n\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t}\n\t\telse {\n\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\trecords :\n\t\t\t\tcalc;\n\t\t}\n\t},\n\n\t/**\n\t * The DataTables object for this table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInstance\": null,\n\n\t/**\n\t * Unique identifier for each instance of the DataTables object. If there\n\t * is an ID on the table node, then it takes that value, otherwise an\n\t * incrementing internal counter is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sInstance\": null,\n\n\t/**\n\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t * keyboard navigation of the table and its controls.\n\t */\n\t\"iTabIndex\": 0,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollHead\": null,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollFoot\": null,\n\n\t/**\n\t * Last applied sort\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLastSort\": [],\n\n\t/**\n\t * Stored plug-in instances\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oPlugins\": {},\n\n\t/**\n\t * Function used to get a row's id from the row's data\n\t *  @type function\n\t *  @default null\n\t */\n\t\"rowIdFn\": null,\n\n\t/**\n\t * Data location where to store a row's id\n\t *  @type string\n\t *  @default null\n\t */\n\t\"rowId\": null\n};\n\n/**\n * Extension object for DataTables that is used to provide all extension\n * options.\n *\n * Note that the `DataTable.ext` object is available through\n * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n *  @namespace\n *  @extends DataTable.models.ext\n */\n\n\n/**\n * DataTables extensions\n * \n * This namespace acts as a collection area for plug-ins that can be used to\n * extend DataTables capabilities. Indeed many of the build in methods\n * use this method to provide their own capabilities (sorting methods for\n * example).\n *\n * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n * reasons\n *\n *  @namespace\n */\nDataTable.ext = _ext = {\n\t/**\n\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t * defined here so other extensions can define buttons regardless of load\n\t * order. It is _not_ used by DataTables core.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tbuttons: {},\n\n\n\t/**\n\t * Element class names\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tclasses: {},\n\n\n\t/**\n\t * DataTables build type (expanded by the download builder)\n\t *\n\t *  @type string\n\t */\n\tbuilder: \"-source-\",\n\n\n\t/**\n\t * Error reporting.\n\t * \n\t * How should DataTables report an error. Can take the value 'alert',\n\t * 'throw', 'none' or a function.\n\t *\n\t *  @type string|function\n\t *  @default alert\n\t */\n\terrMode: \"alert\",\n\n\n\t/**\n\t * Feature plug-ins.\n\t * \n\t * This is an array of objects which describe the feature plug-ins that are\n\t * available to DataTables. These feature plug-ins are then available for\n\t * use through the `dom` initialisation option.\n\t * \n\t * Each feature plug-in is described by an object which must have the\n\t * following properties:\n\t * \n\t * * `fnInit` - function that is used to initialise the plug-in,\n\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t *   instillation option. This is case sensitive.\n\t *\n\t * The `fnInit` function has the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t *\n\t * And the following return is expected:\n\t * \n\t * * {node|null} The element which contains your feature. Note that the\n\t *   return may also be void if your plug-in does not require to inject any\n\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t *   be useful when developing a plug-in which allows table control via\n\t *   keyboard entry\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    $.fn.dataTable.ext.features.push( {\n\t *      \"fnInit\": function( oSettings ) {\n\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t *      },\n\t *      \"cFeature\": \"T\"\n\t *    } );\n\t */\n\tfeature: [],\n\n\n\t/**\n\t * Row searching.\n\t * \n\t * This method of searching is complimentary to the default type based\n\t * searching, and a lot more comprehensive as it allows you complete control\n\t * over the searching logic. Each element in this array is a function\n\t * (parameters described below) that is called for every row in the table,\n\t * and your logic decides if it should be included in the searching data set\n\t * or not.\n\t *\n\t * Searching functions have the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t *    original format that was passed in as the data source, or an array\n\t *    from a DOM data source\n\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t *\n\t * And the following return is expected:\n\t *\n\t * * {boolean} Include the row in the searched result set (true) or not\n\t *   (false)\n\t *\n\t * Note that as with the main search ability in DataTables, technically this\n\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t * naming we call it searching here.\n\t *\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @example\n\t *    // The following example shows custom search being applied to the\n\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t *    // from the end-user, matching the data in a certain range.\n\t *    $.fn.dataTable.ext.search.push(\n\t *      function( settings, data, dataIndex ) {\n\t *        var min = document.getElementById('min').value * 1;\n\t *        var max = document.getElementById('max').value * 1;\n\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t *\n\t *        if ( min == \"\" && max == \"\" ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min == \"\" && version < max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && \"\" == max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && version < max ) {\n\t *          return true;\n\t *        }\n\t *        return false;\n\t *      }\n\t *    );\n\t */\n\tsearch: [],\n\n\n\t/**\n\t * Selector extensions\n\t *\n\t * The `selector` option can be used to extend the options available for the\n\t * selector modifier options (`selector-modifier` object data type) that\n\t * each of the three built in selector types offer (row, column and cell +\n\t * their plural counterparts). For example the Select extension uses this\n\t * mechanism to provide an option to select only rows, columns and cells\n\t * that have been marked as selected by the end user (`{selected: true}`),\n\t * which can be used in conjunction with the existing built in selector\n\t * options.\n\t *\n\t * Each property is an array to which functions can be pushed. The functions\n\t * take three attributes:\n\t *\n\t * * Settings object for the host table\n\t * * Options object (`selector-modifier` object type)\n\t * * Array of selected item indexes\n\t *\n\t * The return is an array of the resulting item indexes after the custom\n\t * selector has been applied.\n\t *\n\t *  @type object\n\t */\n\tselector: {\n\t\tcell: [],\n\t\tcolumn: [],\n\t\trow: []\n\t},\n\n\n\t/**\n\t * Internal functions, exposed for used in plug-ins.\n\t * \n\t * Please note that you should not need to use the internal methods for\n\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t * The internal function may change between releases.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tinternal: {},\n\n\n\t/**\n\t * Legacy configuration options. Enable and disable legacy options that\n\t * are available in DataTables.\n\t *\n\t *  @type object\n\t */\n\tlegacy: {\n\t\t/**\n\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t * requests\n\t\t *\n\t\t *  @type boolean\n\t\t *  @default null\n\t\t */\n\t\tajax: null\n\t},\n\n\n\t/**\n\t * Pagination plug-in methods.\n\t * \n\t * Each entry in this object is a function and defines which buttons should\n\t * be shown by the pagination rendering method that is used for the table:\n\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t * buttons are displayed in the document, while the functions here tell it\n\t * what buttons to display. This is done by returning an array of button\n\t * descriptions (what each button will do).\n\t *\n\t * Pagination types (the four built in options and any additional plug-in\n\t * options defined here) can be used through the `paginationType`\n\t * initialisation parameter.\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{int} page` The current page index\n\t * 2. `{int} pages` The number of pages in the table\n\t *\n\t * Each function is expected to return an array where each element of the\n\t * array can be one of:\n\t *\n\t * * `first` - Jump to first page when activated\n\t * * `last` - Jump to last page when activated\n\t * * `previous` - Show previous page when activated\n\t * * `next` - Show next page when activated\n\t * * `{int}` - Show page of the index given\n\t * * `{array}` - A nested array containing the above elements to add a\n\t *   containing 'DIV' element (might be useful for styling).\n\t *\n\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t * an object with two functions would be defined for each plug-in. That\n\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t * compatibility, but this option of use is now decremented and no longer\n\t * documented in DataTables 1.10+.\n\t *\n\t *  @type object\n\t *  @default {}\n\t *\n\t *  @example\n\t *    // Show previous, next and current page buttons only\n\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t *      return [ 'previous', page, 'next' ];\n\t *    };\n\t */\n\tpager: {},\n\n\n\trenderer: {\n\t\tpageButton: {},\n\t\theader: {}\n\t},\n\n\n\t/**\n\t * Ordering plug-ins - custom data source\n\t * \n\t * The extension options for ordering of data available here is complimentary\n\t * to the default type based ordering that DataTables typically uses. It\n\t * allows much greater control over the the data that is being used to\n\t * order a column, but is necessarily therefore more complex.\n\t * \n\t * This type of ordering is useful if you want to do ordering based on data\n\t * live from the DOM (for example the contents of an 'input' element) rather\n\t * than just the static string that DataTables knows of.\n\t * \n\t * The way these plug-ins work is that you create an array of the values you\n\t * wish to be ordering for the column in question and then return that\n\t * array. The data in the array much be in the index order of the rows in\n\t * the table (not the currently ordering order!). Which order data gathering\n\t * function is run here depends on the `dt-init columns.orderDataType`\n\t * parameter that is used for the column (if any).\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{int}` Target column index\n\t *\n\t * Each function is expected to return an array:\n\t *\n\t * * `{array}` Data for the column to be ordering upon\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    // Ordering using `input` node values\n\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t *    {\n\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t *        return $('input', td).val();\n\t *      } );\n\t *    }\n\t */\n\torder: {},\n\n\n\t/**\n\t * Type based plug-ins.\n\t *\n\t * Each column in DataTables has a type assigned to it, either by automatic\n\t * detection or by direct assignment using the `type` option for the column.\n\t * The type of a column will effect how it is ordering and search (plug-ins\n\t * can also make use of the column type if required).\n\t *\n\t * @namespace\n\t */\n\ttype: {\n\t\t/**\n\t\t * Type detection functions.\n\t\t *\n\t\t * The functions defined in this object are used to automatically detect\n\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t * when complex data is in the table.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be analysed\n\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t     *     perform context specific type detection - for example detection\n\t     *     based on language settings such as using a comma for a decimal\n\t     *     place. Generally speaking the options from the settings will not\n\t     *     be required\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t *   pass it on to the other type detection functions.\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Currency type detection plug-in:\n\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t *      function ( data, settings ) {\n\t\t *        // Check the numeric part\n\t\t *        if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t *          return null;\n\t\t *        }\n\t\t *\n\t\t *        // Check prefixed by currency\n\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t *          return 'currency';\n\t\t *        }\n\t\t *        return null;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tdetect: [],\n\n\n\t\t/**\n\t\t * Type based search formatting.\n\t\t *\n\t\t * The type based searching functions can be used to pre-format the\n\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t *\n\t\t * Note that is a search is not defined for a column of a given type,\n\t\t * no search formatting will be performed.\n\t\t * \n\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t * or a type detection plug-in), you will typically be using this for\n\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t * the format that should be searched upon. This is done by adding\n\t\t * functions this object with a parameter name which matches the sType\n\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t * for searching data.\n\t\t *\n\t\t * The functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t *    }\n\t\t */\n\t\tsearch: {},\n\n\n\t\t/**\n\t\t * Type based ordering.\n\t\t *\n\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t * is defined by the functions available in this object.\n\t\t *\n\t\t * Each ordering option can be described by three properties added to\n\t\t * this object:\n\t\t *\n\t\t * * `{type}-pre` - Pre-formatting function\n\t\t * * `{type}-asc` - Ascending order function\n\t\t * * `{type}-desc` - Descending order function\n\t\t *\n\t\t * All three can be used together, only `{type}-pre` or only\n\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t * implementation in terms of speed, although the others are provided\n\t\t * for compatibility with existing Javascript sort functions.\n\t\t *\n\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t *\n\t\t * And return:\n\t\t *\n\t\t * * `{*}` Data to be sorted upon\n\t\t *\n\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t * functions, taking two parameters:\n\t\t *\n\t     *  1. `{*}` Data to compare to the second parameter\n\t     *  2. `{*}` Data to compare to the first parameter\n\t\t *\n\t\t * And returning:\n\t\t *\n\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t *   parameter.\n\t\t * \n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t *      \"string-pre\": function(x) {\n\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t *        return parseFloat( a );\n\t\t *      }\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t *      \"string-case-asc\": function(x,y) {\n\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t *      },\n\t\t *      \"string-case-desc\": function(x,y) {\n\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\torder: {}\n\t},\n\n\t/**\n\t * Unique DataTables instance counter\n\t *\n\t * @type int\n\t * @private\n\t */\n\t_unique: 0,\n\n\n\t//\n\t// Depreciated\n\t// The following properties are retained for backwards compatibility only.\n\t// The should not be used in new projects and will be removed in a future\n\t// version\n\t//\n\n\t/**\n\t * Version check function.\n\t *  @type function\n\t *  @depreciated Since 1.10\n\t */\n\tfnVersionCheck: DataTable.fnVersionCheck,\n\n\n\t/**\n\t * Index for what 'this' index API functions should use\n\t *  @type int\n\t *  @deprecated Since v1.10\n\t */\n\tiApiIndex: 0,\n\n\n\t/**\n\t * jQuery UI class container\n\t *  @type object\n\t *  @deprecated Since v1.10\n\t */\n\toJUIClasses: {},\n\n\n\t/**\n\t * Software version\n\t *  @type string\n\t *  @deprecated Since v1.10\n\t */\n\tsVersion: DataTable.version\n};\n\n\n//\n// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n//\n$.extend( _ext, {\n\tafnFiltering: _ext.search,\n\taTypes:       _ext.type.detect,\n\tofnSearch:    _ext.type.search,\n\toSort:        _ext.type.order,\n\tafnSortData:  _ext.order,\n\taoFeatures:   _ext.feature,\n\toApi:         _ext.internal,\n\toStdClasses:  _ext.classes,\n\toPagination:  _ext.pager\n} );\n\n\n$.extend( DataTable.ext.classes, {\n\t\"sTable\": \"dataTable\",\n\t\"sNoFooter\": \"no-footer\",\n\n\t/* Paging buttons */\n\t\"sPageButton\": \"paginate_button\",\n\t\"sPageButtonActive\": \"current\",\n\t\"sPageButtonDisabled\": \"disabled\",\n\n\t/* Striping classes */\n\t\"sStripeOdd\": \"odd\",\n\t\"sStripeEven\": \"even\",\n\n\t/* Empty row */\n\t\"sRowEmpty\": \"dataTables_empty\",\n\n\t/* Features */\n\t\"sWrapper\": \"dataTables_wrapper\",\n\t\"sFilter\": \"dataTables_filter\",\n\t\"sInfo\": \"dataTables_info\",\n\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\"sLength\": \"dataTables_length\",\n\t\"sProcessing\": \"dataTables_processing\",\n\n\t/* Sorting */\n\t\"sSortAsc\": \"sorting_asc\",\n\t\"sSortDesc\": \"sorting_desc\",\n\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\"sSortableAsc\": \"sorting_desc_disabled\",\n\t\"sSortableDesc\": \"sorting_asc_disabled\",\n\t\"sSortableNone\": \"sorting_disabled\",\n\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\n\t/* Filtering */\n\t\"sFilterInput\": \"\",\n\n\t/* Page length */\n\t\"sLengthSelect\": \"\",\n\n\t/* Scrolling */\n\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\n\t/* Misc */\n\t\"sHeaderTH\": \"\",\n\t\"sFooterTH\": \"\",\n\n\t// Deprecated\n\t\"sSortJUIAsc\": \"\",\n\t\"sSortJUIDesc\": \"\",\n\t\"sSortJUI\": \"\",\n\t\"sSortJUIAscAllowed\": \"\",\n\t\"sSortJUIDescAllowed\": \"\",\n\t\"sSortJUIWrapper\": \"\",\n\t\"sSortIcon\": \"\",\n\t\"sJUIHeader\": \"\",\n\t\"sJUIFooter\": \"\"\n} );\n\n\nvar extPagination = DataTable.ext.pager;\n\nfunction _numbers ( page, pages ) {\n\tvar\n\t\tnumbers = [],\n\t\tbuttons = extPagination.numbers_length,\n\t\thalf = Math.floor( buttons / 2 ),\n\t\ti = 1;\n\n\tif ( pages <= buttons ) {\n\t\tnumbers = _range( 0, pages );\n\t}\n\telse if ( page <= half ) {\n\t\tnumbers = _range( 0, buttons-2 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t}\n\telse if ( page >= pages - 1 - half ) {\n\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\telse {\n\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\n\tnumbers.DT_el = 'span';\n\treturn numbers;\n}\n\n\n$.extend( extPagination, {\n\tsimple: function ( page, pages ) {\n\t\treturn [ 'previous', 'next' ];\n\t},\n\n\tfull: function ( page, pages ) {\n\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t},\n\n\tnumbers: function ( page, pages ) {\n\t\treturn [ _numbers(page, pages) ];\n\t},\n\n\tsimple_numbers: function ( page, pages ) {\n\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t},\n\n\tfull_numbers: function ( page, pages ) {\n\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t},\n\t\n\tfirst_last_numbers: function (page, pages) {\n \t\treturn ['first', _numbers(page, pages), 'last'];\n \t},\n\n\t// For testing and plug-ins to use\n\t_numbers: _numbers,\n\n\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\tnumbers_length: 7\n} );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\tpageButton: {\n\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\tvar classes = settings.oClasses;\n\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\tvar btnDisplay, btnClass;\n\n\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\tvar i, ien, node, button, tabIndex;\n\t\t\t\tvar disabledClass = classes.sPageButtonDisabled;\n\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t};\n\n\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\tbutton = buttons[i];\n\n\t\t\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\tbtnClass = button;\n\t\t\t\t\t\ttabIndex = settings.iTabIndex;\n\n\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbtnDisplay = settings.fnFormatNumber( button + 1 );\n\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\tvar tag = settings.oInit.pagingTag || 'a';\n\t\t\t\t\t\t\tvar disabled = btnClass.indexOf(disabledClass) !== -1;\n\t\t\n\n\t\t\t\t\t\t\tnode = $('<'+tag+'>', {\n\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t'aria-disabled': disabled ? 'true' : null,\n\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t'role': 'link',\n\t\t\t\t\t\t\t\t\t'aria-current': btnClass === classes.sPageButtonActive ? 'page' : null,\n\t\t\t\t\t\t\t\t\t'data-dt-idx': button,\n\t\t\t\t\t\t\t\t\t'tabindex': tabIndex,\n\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t// accessibility, but neither are frames.\n\t\t\tvar activeEl;\n\n\t\t\ttry {\n\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t// completed\n\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t}\n\t\t\tcatch (e) {}\n\n\t\t\tattach( $(host).empty(), buttons );\n\n\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t\t\t}\n\t\t}\n\t}\n} );\n\n\n\n// Built in type detection. See model.ext.aTypes for information about\n// what is required from this methods.\n$.extend( DataTable.ext.type.detect, [\n\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t},\n\n\t// Dates (only those recognised by the browser's Date.parse)\n\tfunction ( d, settings )\n\t{\n\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t// plug-in for anything other than ISO8601 style strings\n\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar parsed = Date.parse(d);\n\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t},\n\n\t// Formatted numbers\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t},\n\n\t// HTML numeric\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t},\n\n\t// HTML numeric, formatted\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t},\n\n\t// HTML (this is strict checking - there must be html)\n\tfunction ( d, settings )\n\t{\n\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t'html' : null;\n\t}\n] );\n\n\n\n// Filter formatting functions. See model.ext.ofnSearch for information about\n// what is required from these methods.\n// \n// Note that additional search methods are added for the html numbers and\n// html formatted numbers by `_addNumericSort()` when we know what the decimal\n// place is\n\n\n$.extend( DataTable.ext.type.search, {\n\thtml: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata\n\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t'';\n\t},\n\n\tstring: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\tdata;\n\t}\n} );\n\n\n\nvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\tif ( d !== 0 && (!d || d === '-') ) {\n\t\treturn -Infinity;\n\t}\n\t\n\tvar type = typeof d;\n\n\tif (type === 'number' || type === 'bigint') {\n\t\treturn d;\n\t}\n\n\t// If a decimal place other than `.` is used, it needs to be given to the\n\t// function so we can detect it and replace with a `.` which is the only\n\t// decimal place Javascript recognises - it is not locale aware.\n\tif ( decimalPlace ) {\n\t\td = _numToDecimal( d, decimalPlace );\n\t}\n\n\tif ( d.replace ) {\n\t\tif ( re1 ) {\n\t\t\td = d.replace( re1, '' );\n\t\t}\n\n\t\tif ( re2 ) {\n\t\t\td = d.replace( re2, '' );\n\t\t}\n\t}\n\n\treturn d * 1;\n};\n\n\n// Add the numeric 'deformatting' functions for sorting and search. This is done\n// in a function to provide an easy ability for the language options to add\n// additional methods if a non-period decimal place is used.\nfunction _addNumericSort ( decimalPlace ) {\n\t$.each(\n\t\t{\n\t\t\t// Plain numbers\n\t\t\t\"num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t},\n\n\t\t\t// Formatted numbers\n\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t},\n\n\t\t\t// HTML numeric\n\t\t\t\"html-num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t},\n\n\t\t\t// HTML numeric, formatted\n\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t}\n\t\t},\n\t\tfunction ( key, fn ) {\n\t\t\t// Add the ordering method\n\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\n\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t}\n\t\t}\n\t);\n}\n\n\n// Default sort methods\n$.extend( _ext.type.order, {\n\t// Dates\n\t\"date-pre\": function ( d ) {\n\t\tvar ts = Date.parse( d );\n\t\treturn isNaN(ts) ? -Infinity : ts;\n\t},\n\n\t// html\n\t\"html-pre\": function ( a ) {\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ta.replace ?\n\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\ta+'';\n\t},\n\n\t// string\n\t\"string-pre\": function ( a ) {\n\t\t// This is a little complex, but faster than always calling toString,\n\t\t// http://jsperf.com/tostring-v-check\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ttypeof a === 'string' ?\n\t\t\t\ta.toLowerCase() :\n\t\t\t\t! a.toString ?\n\t\t\t\t\t'' :\n\t\t\t\t\ta.toString();\n\t},\n\n\t// string-asc and -desc are retained only for compatibility with the old\n\t// sort methods\n\t\"string-asc\": function ( x, y ) {\n\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t},\n\n\t\"string-desc\": function ( x, y ) {\n\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t}\n} );\n\n\n// Numeric sorting types - order doesn't matter here\n_addNumericSort( '' );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\theader: {\n\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t// No additional mark-up required\n\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t// listening for\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\t\t\t} );\n\t\t},\n\n\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t$('<div/>')\n\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t.append( cell.contents() )\n\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t)\n\t\t\t\t.appendTo( cell );\n\n\t\t\t// Attach a sort listener to update on sort\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\n\t\t\t\tcell\n\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n/*\n * Public helper functions. These aren't used internally by DataTables, or\n * called by any of the options passed into DataTables, but they can be used\n * externally by developers working with DataTables. They are helper functions\n * to make working with DataTables a little bit easier.\n */\n\nvar __htmlEscapeEntities = function ( d ) {\n\tif (Array.isArray(d)) {\n\t\td = d.join(',');\n\t}\n\n\treturn typeof d === 'string' ?\n\t\td\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;') :\n\t\td;\n};\n\n// Common logic for moment, luxon or a date action\nfunction __mld( dt, momentFn, luxonFn, dateFn, arg1 ) {\n\tif (window.moment) {\n\t\treturn dt[momentFn]( arg1 );\n\t}\n\telse if (window.luxon) {\n\t\treturn dt[luxonFn]( arg1 );\n\t}\n\t\n\treturn dateFn ? dt[dateFn]( arg1 ) : dt;\n}\n\n\nvar __mlWarning = false;\nfunction __mldObj (d, format, locale) {\n\tvar dt;\n\n\tif (window.moment) {\n\t\tdt = window.moment.utc( d, format, locale, true );\n\n\t\tif (! dt.isValid()) {\n\t\t\treturn null;\n\t\t}\n\t}\n\telse if (window.luxon) {\n\t\tdt = format && typeof d === 'string'\n\t\t\t? window.luxon.DateTime.fromFormat( d, format )\n\t\t\t: window.luxon.DateTime.fromISO( d );\n\n\t\tif (! dt.isValid) {\n\t\t\treturn null;\n\t\t}\n\n\t\tdt.setLocale(locale);\n\t}\n\telse if (! format) {\n\t\t// No format given, must be ISO\n\t\tdt = new Date(d);\n\t}\n\telse {\n\t\tif (! __mlWarning) {\n\t\t\talert('DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17');\n\t\t}\n\n\t\t__mlWarning = true;\n\t}\n\n\treturn dt;\n}\n\n// Wrapper for date, datetime and time which all operate the same way with the exception of\n// the output string for auto locale support\nfunction __mlHelper (localeString) {\n\treturn function ( from, to, locale, def ) {\n\t\t// Luxon and Moment support\n\t\t// Argument shifting\n\t\tif ( arguments.length === 0 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = null; // means toLocaleString\n\t\t\tfrom = null; // means iso8601\n\t\t}\n\t\telse if ( arguments.length === 1 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\t\telse if ( arguments.length === 2 ) {\n\t\t\tlocale = to;\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\n\t\tvar typeName = 'datetime-' + to;\n\n\t\t// Add type detection and sorting specific to this date format - we need to be able to identify\n\t\t// date type columns as such, rather than as numbers in extensions. Hence the need for this.\n\t\tif (! DataTable.ext.type.order[typeName]) {\n\t\t\t// The renderer will give the value to type detect as the type!\n\t\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\t\treturn d === typeName ? typeName : false;\n\t\t\t});\n\n\t\t\t// The renderer gives us Moment, Luxon or Date obects for the sorting, all of which have a\n\t\t\t// `valueOf` which gives milliseconds epoch\n\t\t\tDataTable.ext.type.order[typeName + '-asc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x < y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\n\t\t\tDataTable.ext.type.order[typeName + '-desc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x > y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\t\t}\n\t\n\t\treturn function ( d, type ) {\n\t\t\t// Allow for a default value\n\t\t\tif (d === null || d === undefined) {\n\t\t\t\tif (def === '--now') {\n\t\t\t\t\t// We treat everything as UTC further down, so no changes are\n\t\t\t\t\t// made, as such need to get the local date / time as if it were\n\t\t\t\t\t// UTC\n\t\t\t\t\tvar local = new Date();\n\t\t\t\t\td = new Date( Date.UTC(\n\t\t\t\t\t\tlocal.getFullYear(), local.getMonth(), local.getDate(),\n\t\t\t\t\t\tlocal.getHours(), local.getMinutes(), local.getSeconds()\n\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td = '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === 'type') {\n\t\t\t\t// Typing uses the type name for fast matching\n\t\t\t\treturn typeName;\n\t\t\t}\n\n\t\t\tif (d === '') {\n\t\t\t\treturn type !== 'sort'\n\t\t\t\t\t? ''\n\t\t\t\t\t: __mldObj('0000-01-01 00:00:00', null, locale);\n\t\t\t}\n\n\t\t\t// Shortcut. If `from` and `to` are the same, we are using the renderer to\n\t\t\t// format for ordering, not display - its already in the display format.\n\t\t\tif ( to !== null && from === to && type !== 'sort' && type !== 'type' && ! (d instanceof Date) ) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tvar dt = __mldObj(d, from, locale);\n\n\t\t\tif (dt === null) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tif (type === 'sort') {\n\t\t\t\treturn dt;\n\t\t\t}\n\t\t\t\n\t\t\tvar formatted = to === null\n\t\t\t\t? __mld(dt, 'toDate', 'toJSDate', '')[localeString]()\n\t\t\t\t: __mld(dt, 'format', 'toFormat', 'toISOString', to);\n\n\t\t\t// XSS protection\n\t\t\treturn type === 'display' ?\n\t\t\t\t__htmlEscapeEntities( formatted ) :\n\t\t\t\tformatted;\n\t\t};\n\t}\n}\n\n// Based on locale, determine standard number formatting\n// Fallback for legacy browsers is US English\nvar __thousands = ',';\nvar __decimal = '.';\n\nif (window.Intl !== undefined) {\n\ttry {\n\t\tvar num = new Intl.NumberFormat().formatToParts(100000.1);\n\t\n\t\tfor (var i=0 ; i<num.length ; i++) {\n\t\t\tif (num[i].type === 'group') {\n\t\t\t\t__thousands = num[i].value;\n\t\t\t}\n\t\t\telse if (num[i].type === 'decimal') {\n\t\t\t\t__decimal = num[i].value;\n\t\t\t}\n\t\t}\n\t}\n\tcatch (e) {\n\t\t// noop\n\t}\n}\n\n// Formatted date time detection - use by declaring the formats you are going to use\nDataTable.datetime = function ( format, locale ) {\n\tvar typeName = 'datetime-detect-' + format;\n\n\tif (! locale) {\n\t\tlocale = 'en';\n\t}\n\n\tif (! DataTable.ext.type.order[typeName]) {\n\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\tvar dt = __mldObj(d, format, locale);\n\t\t\treturn d === '' || dt ? typeName : false;\n\t\t});\n\n\t\tDataTable.ext.type.order[typeName + '-pre'] = function (d) {\n\t\t\treturn __mldObj(d, format, locale) || 0;\n\t\t}\n\t}\n}\n\n/**\n * Helpers for `columns.render`.\n *\n * The options defined here can be used with the `columns.render` initialisation\n * option to provide a display renderer. The following functions are defined:\n *\n * * `number` - Will format numeric data (defined by `columns.data`) for\n *   display, retaining the original unformatted data for sorting and filtering.\n *   It takes 5 parameters:\n *   * `string` - Thousands grouping separator\n *   * `string` - Decimal point indicator\n *   * `integer` - Number of decimal points to show\n *   * `string` (optional) - Prefix.\n *   * `string` (optional) - Postfix (/suffix).\n * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n *   parameters.\n *\n * @example\n *   // Column definition using the number renderer\n *   {\n *     data: \"salary\",\n *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n *   }\n *\n * @namespace\n */\nDataTable.render = {\n\tdate: __mlHelper('toLocaleDateString'),\n\tdatetime: __mlHelper('toLocaleString'),\n\ttime: __mlHelper('toLocaleTimeString'),\n\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t// Auto locale detection\n\t\tif (thousands === null || thousands === undefined) {\n\t\t\tthousands = __thousands;\n\t\t}\n\n\t\tif (decimal === null || decimal === undefined) {\n\t\t\tdecimal = __decimal;\n\t\t}\n\n\t\treturn {\n\t\t\tdisplay: function ( d ) {\n\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tif (d === '' || d === null) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\tvar flo = parseFloat( d );\n\n\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t// be a number after all)\n\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t}\n\n\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\td = Math.abs( flo );\n\n\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t'';\n\n\t\t\t\t// If zero, then can't have a negative prefix\n\t\t\t\tif (intPart === 0 && parseFloat(floatPart) === 0) {\n\t\t\t\t\tnegative = '';\n\t\t\t\t}\n\n\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t) +\n\t\t\t\t\tfloatPart +\n\t\t\t\t\t(postfix||'');\n\t\t\t}\n\t\t};\n\t},\n\n\ttext: function () {\n\t\treturn {\n\t\t\tdisplay: __htmlEscapeEntities,\n\t\t\tfilter: __htmlEscapeEntities\n\t\t};\n\t}\n};\n\n\n/*\n * This is really a good bit rubbish this method of exposing the internal methods\n * publicly... - To be fixed in 2.0 using methods on the prototype\n */\n\n\n/**\n * Create a wrapper function for exporting an internal functions to an external API.\n *  @param {string} fn API function name\n *  @returns {function} wrapped function\n *  @memberof DataTable#internal\n */\nfunction _fnExternApiFunc (fn)\n{\n\treturn function() {\n\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\tArray.prototype.slice.call(arguments)\n\t\t);\n\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t};\n}\n\n\n/**\n * Reference to internal functions for use by plug-in developers. Note that\n * these methods are references to internal functions and are considered to be\n * private. If you use these methods, be aware that they are liable to change\n * between versions.\n *  @namespace\n */\n$.extend( DataTable.ext.internal, {\n\t_fnExternApiFunc: _fnExternApiFunc,\n\t_fnBuildAjax: _fnBuildAjax,\n\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t_fnAjaxParameters: _fnAjaxParameters,\n\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t_fnAddColumn: _fnAddColumn,\n\t_fnColumnOptions: _fnColumnOptions,\n\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t_fnVisbleColumns: _fnVisbleColumns,\n\t_fnGetColumns: _fnGetColumns,\n\t_fnColumnTypes: _fnColumnTypes,\n\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t_fnHungarianMap: _fnHungarianMap,\n\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t_fnLanguageCompat: _fnLanguageCompat,\n\t_fnBrowserDetect: _fnBrowserDetect,\n\t_fnAddData: _fnAddData,\n\t_fnAddTr: _fnAddTr,\n\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t_fnGetCellData: _fnGetCellData,\n\t_fnSetCellData: _fnSetCellData,\n\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t_fnGetDataMaster: _fnGetDataMaster,\n\t_fnClearTable: _fnClearTable,\n\t_fnDeleteIndex: _fnDeleteIndex,\n\t_fnInvalidate: _fnInvalidate,\n\t_fnGetRowElements: _fnGetRowElements,\n\t_fnCreateTr: _fnCreateTr,\n\t_fnBuildHead: _fnBuildHead,\n\t_fnDrawHead: _fnDrawHead,\n\t_fnDraw: _fnDraw,\n\t_fnReDraw: _fnReDraw,\n\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t_fnDetectHeader: _fnDetectHeader,\n\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t_fnFilterComplete: _fnFilterComplete,\n\t_fnFilterCustom: _fnFilterCustom,\n\t_fnFilterColumn: _fnFilterColumn,\n\t_fnFilter: _fnFilter,\n\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t_fnEscapeRegex: _fnEscapeRegex,\n\t_fnFilterData: _fnFilterData,\n\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t_fnUpdateInfo: _fnUpdateInfo,\n\t_fnInfoMacros: _fnInfoMacros,\n\t_fnInitialise: _fnInitialise,\n\t_fnInitComplete: _fnInitComplete,\n\t_fnLengthChange: _fnLengthChange,\n\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t_fnPageChange: _fnPageChange,\n\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t_fnScrollDraw: _fnScrollDraw,\n\t_fnApplyToChildren: _fnApplyToChildren,\n\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t_fnThrottle: _fnThrottle,\n\t_fnConvertToWidth: _fnConvertToWidth,\n\t_fnGetWidestNode: _fnGetWidestNode,\n\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t_fnStringToCss: _fnStringToCss,\n\t_fnSortFlatten: _fnSortFlatten,\n\t_fnSort: _fnSort,\n\t_fnSortAria: _fnSortAria,\n\t_fnSortListener: _fnSortListener,\n\t_fnSortAttachListener: _fnSortAttachListener,\n\t_fnSortingClasses: _fnSortingClasses,\n\t_fnSortData: _fnSortData,\n\t_fnSaveState: _fnSaveState,\n\t_fnLoadState: _fnLoadState,\n\t_fnImplementState: _fnImplementState,\n\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t_fnLog: _fnLog,\n\t_fnMap: _fnMap,\n\t_fnBindAction: _fnBindAction,\n\t_fnCallbackReg: _fnCallbackReg,\n\t_fnCallbackFire: _fnCallbackFire,\n\t_fnLengthOverflow: _fnLengthOverflow,\n\t_fnRenderer: _fnRenderer,\n\t_fnDataSource: _fnDataSource,\n\t_fnRowAttributes: _fnRowAttributes,\n\t_fnExtend: _fnExtend,\n\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t                                // in 1.10, so this dead-end function is\n\t                                // added to prevent errors\n} );\n\n\n// jQuery access\n$.fn.dataTable = DataTable;\n\n// Provide access to the host jQuery object (circular reference)\nDataTable.$ = $;\n\n// Legacy aliases\n$.fn.dataTableSettings = DataTable.settings;\n$.fn.dataTableExt = DataTable.ext;\n\n// With a capital `D` we return a DataTables API instance rather than a\n// jQuery object\n$.fn.DataTable = function ( opts ) {\n\treturn $(this).dataTable( opts ).api();\n};\n\n// All properties that are available to $.fn.dataTable should also be\n// available on $.fn.DataTable\n$.each( DataTable, function ( prop, val ) {\n\t$.fn.DataTable[ prop ] = val;\n} );\n\nexport default DataTable;\n"],"names":["$","jQuery","DataTable","selector","options","factory","this","sSelector","oOpts","api","_","rows","data","traditional","_Api","_fnSettingsFromNode","_ext","iApiIndex","fnAddData","redraw","Array","isArray","isPlainObject","add","row","undefined","draw","flatten","toArray","fnAdjustColumnSizing","bRedraw","columns","adjust","settings","scroll","oScroll","sX","sY","_fnScrollDraw","fnClearTable","clear","fnClose","nTr","child","hide","fnDeleteRow","target","callback","aoData","remove","call","fnDestroy","destroy","fnDraw","complete","fnFilter","sInput","iColumn","bRegex","bSmart","bShowGlobal","bCaseInsensitive","search","column","fnGetData","src","col","type","nodeName","toLowerCase","cell","fnGetNodes","iRow","node","nodes","fnGetPosition","toUpperCase","index","columnVisible","fnIsOpen","isShown","fnOpen","mHtml","sClass","show","fnPageChange","mAction","page","fnSetColumnVis","iCol","bShow","visible","fnSettings","fnSort","aaSort","order","fnSortListener","nNode","fnCallback","listener","fnUpdate","mData","mRow","bAction","fnVersionCheck","_that","emptyInit","len","length","oApi","internal","fn","ext","_fnExternApiFunc","each","o","oInit","_fnExtend","iLen","i","sId","getAttribute","bInitHandedOff","defaults","$this","_fnCompatOpts","_fnCompatCols","_fnCamelToHungarian","extend","allSettings","s","nTable","nTHead","parentNode","nTFoot","bRetrieve","bDestroy","oInstance","_fnLog","sTableId","id","splice","_unique","oSettings","models","sDestroyWidth","style","width","sInstance","push","dataTable","_fnLanguageCompat","oLanguage","aLengthMenu","iDisplayLength","_fnMap","oFeatures","_fnCallbackReg","fnDrawCallback","fnServerParams","fnStateSaveParams","fnStateLoadParams","fnStateLoaded","fnRowCallback","fnCreatedRow","fnHeaderCallback","fnFooterCallback","fnInitComplete","fnPreDrawCallback","rowIdFn","_fnGetObjectDataFn","rowId","_fnBrowserDetect","oClasses","classes","addClass","sTable","iInitDisplayStart","iDisplayStart","_iDisplayStart","iDeferLoading","bDeferLoading","tmp","_iRecordsDisplay","_iRecordsTotal","sUrl","ajax","dataType","url","success","json","_fnCallbackFire","_fnInitialise","error","asStripeClasses","sStripeOdd","sStripeEven","stripeClasses","rowOne","children","find","eq","inArray","map","el","hasClass","removeClass","join","asDestroyStripes","slice","anThs","aoColumnsInit","nThead","getElementsByTagName","_fnDetectHeader","aoHeader","_fnGetUniqueThs","aoColumns","_fnAddColumn","_fnApplyColumnDefs","aoColumnDefs","oDef","_fnColumnOptions","a","name","sort","filter","_isArrayHost","features","loadedInit","aaSorting","sorting","asSorting","_fnSortingClasses","bSort","bSorted","aSort","_fnSortFlatten","sortedColumns","val","dir","_fnSortAria","_fnDataSource","bDeferRender","captions","_captionSide","css","thead","appendTo","tbody","insertAfter","nTBody","tfoot","sNoFooter","aoFooter","aaData","_fnAddData","_fnAddTr","aiDisplay","aiDisplayMaster","bInitialised","_fnSaveState","bStateSave","_fnLoadState","_api_register","_api_registerPlural","_re_dic","_re_new_lines","_re_html","_re_date","_re_escape_regex","RegExp","_re_formatted_numeric","_empty","d","_intVal","integer","parseInt","isNaN","isFinite","_numToDecimal","num","decimalPoint","_fnEscapeRegex","replace","_isNumber","formatted","strType","parseFloat","_isHtml","_htmlNumeric","html","_stripHtml","_pluck","prop","prop2","out","ien","_pluck_order","_range","start","end","_removeEmpty","_areAllUnique","sorted","last","j","k","again","_flatten","_includes","indexOf","arg","Object","prototype","toString","includes","String","trim","util","throttle","freq","timer","frequency","that","now","Date","args","arguments","clearTimeout","setTimeout","apply","escapeRegex","set","source","meta","setData","b","_fnSplitObjNotation","aLast","arrayNotation","funcNotation","innerSrc","Error","match","__reArray","__reFn","jLen","get","key","t","fetchData","substring","_fnHungarianMap","newKey","hungarian","_hungarianMap","user","force","hungarianKey","charAt","lang","defaultDecimal","sDecimal","_addNumericSort","zeroRecords","sZeroRecords","sEmptyTable","sLoadingRecords","sInfoThousands","sThousands","decimal","_fnCompatMap","knew","old","init","sScrollX","scrollX","searchCols","aoSearchCols","oSearch","dataSort","aDataSort","__browser","browser","n","position","top","left","window","scrollLeft","height","overflow","append","outer","inner","barWidth","offsetWidth","clientWidth","bScrollOversize","bScrollbarLeft","Math","round","offset","bBounding","getBoundingClientRect","oBrowser","iBarWidth","_fnReduce","inc","value","isSet","hasOwnProperty","nTh","oDefaults","oCol","oColumn","document","createElement","sTitle","innerHTML","idx","aoPreSearchCols","oOptions","th","sWidthOrig","attr","mDataProp","sType","_sManualType","className","origClass","iDataSort","mDataSrc","mRender","attrTest","_bAttrSrc","_setter","rowData","innerData","fnSetData","_fnSetObjectDataFn","_rowReadObject","bSortable","sSortableNone","bAsc","bDesc","sSortingClass","sSortableAsc","sSortingClassJUI","sSortJUIAscAllowed","sSortableDesc","sSortJUIDescAllowed","sSortable","sSortJUI","_fnAdjustColumnSizing","bAutoWidth","_fnCalculateColumnWidths","sWidth","_fnVisibleToColumnIndex","iMatch","aiVis","_fnGetColumns","_fnColumnIndexToVisible","iPos","_fnVisbleColumns","vis","bVisible","sParam","_fnColumnTypes","types","detect","jen","ken","detectedType","cache","_fnGetCellData","aoColDefs","aoCols","kLen","def","aTargets","targets","aDataIn","anTds","oData","oRow","_aData","aIds","_fnCreateTr","trs","_fnGetRowElements","cells","_fnNodeToDataIndex","_DT_RowIndex","_fnNodeToColumnIndex","anCells","rowIdx","colIdx","iDraw","defaultContent","sDefaultContent","cellData","iDrawError","fomatters","_fnSetCellData","str","_fnGetDataMaster","_fnClearTable","_fnDeleteIndex","iTarget","iTargetIndex","_fnInvalidate","cellWrite","childNodes","removeChild","firstChild","_aSortData","_aFilterData","cols","_fnRowAttributes","contents","tds","td","objectRead","setter","cellProcess","nextSibling","rowNode","nTrIn","nTd","create","sCellType","_DT_CellIndex","appendChild","fnCreatedCell","tr","DT_RowClass","split","__rowc","concat","DT_RowAttr","DT_RowData","_fnBuildHead","createHeader","iTabIndex","_fnSortAttachListener","_fnRenderer","sHeaderTH","sFooterTH","nTf","_fnDrawHead","aoSource","bIncludeHidden","nLocalTr","aoLocal","aApplied","iColumns","iRowspan","iColspan","_fnDraw","ajaxComplete","_fnStart","aPreDraw","anRows","iRowCount","iStripes","oLang","bServerSide","iDisplayEnd","fnDisplayEnd","bDrawing","_fnProcessingDisplay","bDestroying","_fnAjaxUpdate","iStart","iEnd","iDataIndex","nRow","sStripe","_sRowStripe","sZero","fnRecordsTotal","class","valign","colSpan","sRowEmpty","body","detach","bFiltered","_fnReDraw","holdPosition","bFilter","_fnSort","_fnFilterComplete","oPreviousSearch","_drawHold","_fnAddOptionsHtml","table","holding","insertBefore","insert","sWrapper","nHolding","nTableWrapper","nTableReinsertBefore","aDom","sDom","featureNode","cOption","nNewNode","cNext","sAttr","sJUIHeader","sJUIFooter","aSplit","substr","parent","bPaginate","bLengthChange","_fnFeatureHtmlLength","_fnFeatureHtmlFilter","bProcessing","_fnFeatureHtmlProcessing","_fnFeatureHtmlTable","bInfo","_fnFeatureHtmlInfo","_fnFeatureHtmlPaginate","feature","aoFeatures","cFeature","fnInit","aanFeatures","replaceWith","aLayout","nTrs","nCell","l","iColShifted","bUnique","fnShiftCol","unique","nHeader","aReturn","bSortCellsTop","fnRecordsDisplay","_fnBuildAjax","rbracket","ajaxData","instance","status","jqXHR","_fnAjaxDataSrc","sError","newData","baseAjax","sServerMethod","xhr","thrown","ret","readyState","oAjaxData","fnServerData","sAjaxSource","drawHold","_fnAjaxParameters","_fnAjaxUpdateDraw","dataProp","columnSearch","columnCount","preSearch","preColSearch","displayStart","displayLength","_iDisplayLength","param","sSearch","regex","sName","searchable","bSearchable","orderable","legacy","compat","modern","recordsTotal","recordsFiltered","_bInitComplete","_fnInitComplete","write","dataSrc","sAjaxDataProp","tableId","language","previousSearch","input","sFilterInput","f","sFilter","searchFn","event","return","searchDelay","jqFilter","sSearchPlaceholder","on","_fnThrottle","e","keyCode","ev","activeElement","oInput","iForce","oPrevSearch","aoPrevSearch","fnSaveFilter","oFilter","fnRegex","bEscapeRegex","_fnFilter","_fnFilterColumn","_fnFilterCustom","filters","displayRows","merge","searchStr","smart","caseInsensitive","display","rpSearch","_fnFilterCreateSearch","test","prevSearch","displayMaster","invalidated","filtered","_fnFilterData","_sFilterRow","word","m","__filter_div","__filter_div_textContent","textContent","filterData","wasInvalidated","innerText","_fnSearchToCamel","obj","_fnSearchToHung","tid","sInfo","aoDrawCallback","_fnUpdateInfo","max","total","sInfoEmpty","sInfoFiltered","sInfoPostFix","_fnInfoMacros","fnInfoCallback","formatter","fnFormatNumber","all","ceil","iAjaxStart","deferLoading","_fnStringToCss","aData","_fnLengthChange","_fnLengthOverflow","menu","d2","lengths","select","sLengthSelect","Option","div","sLength","sLengthMenu","outerHTML","sPaginationType","plugin","pager","sPaging","p","visRecords","pages","buttons","_fnPageChange","action","records","floor","changed","r","sProcessing","role","scrollY","caption","captionSide","headerClone","cloneNode","footerClone","footer","_div","size","scroller","sScrollWrapper","sScrollHead","border","sScrollHeadInner","sXInner","removeAttr","sScrollBody","sScrollFoot","sScrollFootInner","scrollHead","scrollBody","scrollFoot","bCollapse","nScrollHead","nScrollBody","nScrollFoot","headerTrgEls","footerTrgEls","headerSrcEls","footerSrcEls","headerCopy","footerCopy","correction","sanityWidth","scrollXInner","divHeader","divHeaderStyle","divHeaderInner","divHeaderInnerStyle","divHeaderTable","divBodyEl","divBody","divBodyStyle","divFooter","divFooterInner","divFooterTable","header","tableEl","tableStyle","ie67","headerWidths","footerWidths","headerContent","footerContent","zeroOut","nSizer","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","scrollBarVis","scrollHeight","clientHeight","clone","prependTo","_fnApplyToChildren","outerWidth","offsetHeight","getComputedStyle","nToSize","iOuterWidth","bScrolling","padding","trigger","scrollTop","an1","an2","nNode1","nNode2","nodeType","__re_html_remove","columnIdx","visibleColumns","headerCells","tableWidthAttr","tableContainer","userInputs","styleWidth","_fnConvertToWidth","tmpTable","margin","_fnGetWidestNode","sContentPadding","holder","right","bounding","_reszEvt","bindResize","_fnGetMaxLenString","maxIdx","srcCol","fixed","aaSortingFixed","fixedObj","nestedSort","pre","post","_idx","sortCol","aiOrig","oExtSort","formatters","_fnSortData","x","y","dataA","dataB","label","nextSort","oAria","ariaTitle","removeAttribute","setAttribute","sSortAscending","sSortDescending","_fnSortListener","nextSortIdx","next","bSortMulti","sortIdx","attachTo","_fnBindAction","shiftKey","oldSort","aLastSort","sortClass","sSortColumn","bSortClasses","customSort","sSortDataType","customData","_bLoadingState","state","time","oSavedState","fnStateSaveCallback","loaded","_fnImplementState","fnStateLoadCallback","Api","abStateLoad","duration","iStateDuration","oLoadedState","level","msg","tn","console","log","sErrMode","errMode","alert","mappedName","extender","breakRefs","which","preventDefault","sStore","callbackArr","eventName","reverse","Event","parents","result","renderer","host","__apiStruct","__arrayProto","_toSettings","mixed","jq","tables","context","ctxSettings","opts","any","count","ctx","iterator","alwaysNew","items","item","apiInst","_selector_row_indexes","apiSelector","lastIndexOf","pluck","pop","reduce","reduceRight","shift","to$","toJQuery","unshift","scope","__dt_wrapper","struct","methodScoping","struc","methodExt","propExt","register","method","heir","registerPlural","pluralName","singularName","__table_selector","paging","info","recordsDisplay","serverSide","__reload","one","abort","resetPaging","_selector_run","selectFn","res","selectorType","_selector_opts","_selector_first","inst","displayFiltered","displayFilteredMap","__row_selector","run","sel","selInt","cellIdx","closest","rowObj","hash","thatIdx","loopRow","loopCells","newRows","modRows","namespace","stateSaveParamsEvent","destroyEvent","idFn","ids","_detailsShow","childRows","off","every","__details_add","klass","addRow","created","_details","__details_state","__details_remove","__details_display","__details_events","drawEvent","colvisEvent","_emp","_child_obj","_child_mth","__re_column_selector","__columnData","r1","r2","__column_selector","names","visColumns","jqResult","__setColumnVis","calc","__cell_selector","allCells","fnSelector","rowSelector","columnSelector","internalOpts","cellsNoOpts","selected","caseInsen","use","module","DateTime","root","is","jquery","versionCheck","version","aThis","aThat","iThis","iThat","isDataTable","fnIsDataTable","head","foot","fnTables","camelToHungarian","jqRows","jqTable","jqTbody","jqWrapper","orig","removedMethod","arg1","arg2","arg3","arg4","token","plural","resolved","bScrollCollapse","toFormat","JSON","parse","sessionStorage","localStorage","getItem","location","pathname","setItem","stringify","oPaginate","sFirst","sLast","sNext","sPrevious","sScrollXInner","sScrollY","aoRowCallback","aoHeaderCallback","aoFooterCallback","aoRowCreatedCallback","aoPreDrawCallback","aoInitComplete","aoStateSaveParams","aoStateLoadParams","aoStateLoaded","aoOpenRows","aoStateSave","aoStateLoad","aoServerParams","aoDestroyCallback","paginate","min","oPlugins","builder","pageButton","oJUIClasses","sVersion","afnFiltering","aTypes","ofnSearch","oSort","afnSortData","oStdClasses","oPagination","sPageButton","sPageButtonActive","sPageButtonDisabled","sSortAsc","sSortDesc","sSortJUIAsc","sSortJUIDesc","sSortJUIWrapper","sSortIcon","extPagination","_numbers","numbers","numbers_length","half","DT_el","simple","full","simple_numbers","full_numbers","first_last_numbers","aria","btnDisplay","btnClass","attach","container","button","tabIndex","disabledClass","clickHandler","tag","pagingTag","disabled","tabindex","activeEl","empty","parsed","string","__numericReplace","decimalPlace","re1","re2","Infinity","ts","jqueryui","__htmlEscapeEntities","__mld","dt","momentFn","luxonFn","dateFn","moment","luxon","__mlWarning","__mldObj","format","locale","utc","isValid","fromFormat","fromISO","setLocale","__mlHelper","localeString","from","to","typeName","valueOf","local","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","__thousands","__decimal","Intl","NumberFormat","formatToParts","datetime","render","date","number","thousands","precision","prefix","postfix","negative","flo","toFixed","abs","intPart","floatPart","text","_fnCalculateEnd","dataTableSettings","dataTableExt"],"mappings":"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"}