Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / static / im / js / jquery.dataTables.js @ 36dacb92

History | View | Annotate | Download (368.7 kB)

1 8a217fa2 Olga Brani
/**
2 8a217fa2 Olga Brani
 * @summary     DataTables
3 8a217fa2 Olga Brani
 * @description Paginate, search and sort HTML tables
4 8a217fa2 Olga Brani
 * @version     1.9.4
5 8a217fa2 Olga Brani
 * @file        jquery.dataTables.js
6 8a217fa2 Olga Brani
 * @author      Allan Jardine (www.sprymedia.co.uk)
7 8a217fa2 Olga Brani
 * @contact     www.sprymedia.co.uk/contact
8 8a217fa2 Olga Brani
 *
9 8a217fa2 Olga Brani
 * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.
10 8a217fa2 Olga Brani
 *
11 8a217fa2 Olga Brani
 * This source file is free software, under either the GPL v2 license or a
12 8a217fa2 Olga Brani
 * BSD style license, available at:
13 8a217fa2 Olga Brani
 *   http://datatables.net/license_gpl2
14 8a217fa2 Olga Brani
 *   http://datatables.net/license_bsd
15 8a217fa2 Olga Brani
 * 
16 8a217fa2 Olga Brani
 * This source file is distributed in the hope that it will be useful, but 
17 8a217fa2 Olga Brani
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
18 8a217fa2 Olga Brani
 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
19 8a217fa2 Olga Brani
 * 
20 8a217fa2 Olga Brani
 * For details please refer to: http://www.datatables.net
21 8a217fa2 Olga Brani
 */
22 8a217fa2 Olga Brani
23 8a217fa2 Olga Brani
/*jslint evil: true, undef: true, browser: true */
24 8a217fa2 Olga Brani
/*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
25 8a217fa2 Olga Brani
26 8a217fa2 Olga Brani
(/** @lends <global> */function( window, document, undefined ) {
27 8a217fa2 Olga Brani
28 8a217fa2 Olga Brani
(function( factory ) {
29 8a217fa2 Olga Brani
        "use strict";
30 8a217fa2 Olga Brani
31 8a217fa2 Olga Brani
        // Define as an AMD module if possible
32 8a217fa2 Olga Brani
        if ( typeof define === 'function' && define.amd )
33 8a217fa2 Olga Brani
        {
34 8a217fa2 Olga Brani
                define( ['jquery'], factory );
35 8a217fa2 Olga Brani
        }
36 8a217fa2 Olga Brani
        /* Define using browser globals otherwise
37 8a217fa2 Olga Brani
         * Prevent multiple instantiations if the script is loaded twice
38 8a217fa2 Olga Brani
         */
39 8a217fa2 Olga Brani
        else if ( jQuery && !jQuery.fn.dataTable )
40 8a217fa2 Olga Brani
        {
41 8a217fa2 Olga Brani
                factory( jQuery );
42 8a217fa2 Olga Brani
        }
43 8a217fa2 Olga Brani
}
44 8a217fa2 Olga Brani
(/** @lends <global> */function( $ ) {
45 8a217fa2 Olga Brani
        "use strict";
46 8a217fa2 Olga Brani
        /** 
47 8a217fa2 Olga Brani
         * DataTables is a plug-in for the jQuery Javascript library. It is a 
48 8a217fa2 Olga Brani
         * highly flexible tool, based upon the foundations of progressive 
49 8a217fa2 Olga Brani
         * enhancement, which will add advanced interaction controls to any 
50 8a217fa2 Olga Brani
         * HTML table. For a full list of features please refer to
51 8a217fa2 Olga Brani
         * <a href="http://datatables.net">DataTables.net</a>.
52 8a217fa2 Olga Brani
         *
53 8a217fa2 Olga Brani
         * Note that the <i>DataTable</i> object is not a global variable but is
54 8a217fa2 Olga Brani
         * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which 
55 8a217fa2 Olga Brani
         * it may be  accessed.
56 8a217fa2 Olga Brani
         *
57 8a217fa2 Olga Brani
         *  @class
58 8a217fa2 Olga Brani
         *  @param {object} [oInit={}] Configuration object for DataTables. Options
59 8a217fa2 Olga Brani
         *    are defined by {@link DataTable.defaults}
60 8a217fa2 Olga Brani
         *  @requires jQuery 1.3+
61 8a217fa2 Olga Brani
         * 
62 8a217fa2 Olga Brani
         *  @example
63 8a217fa2 Olga Brani
         *    // Basic initialisation
64 8a217fa2 Olga Brani
         *    $(document).ready( function {
65 8a217fa2 Olga Brani
         *      $('#example').dataTable();
66 8a217fa2 Olga Brani
         *    } );
67 8a217fa2 Olga Brani
         *  
68 8a217fa2 Olga Brani
         *  @example
69 8a217fa2 Olga Brani
         *    // Initialisation with configuration options - in this case, disable
70 8a217fa2 Olga Brani
         *    // pagination and sorting.
71 8a217fa2 Olga Brani
         *    $(document).ready( function {
72 8a217fa2 Olga Brani
         *      $('#example').dataTable( {
73 8a217fa2 Olga Brani
         *        "bPaginate": false,
74 8a217fa2 Olga Brani
         *        "bSort": false 
75 8a217fa2 Olga Brani
         *      } );
76 8a217fa2 Olga Brani
         *    } );
77 8a217fa2 Olga Brani
         */
78 8a217fa2 Olga Brani
        var DataTable = function( oInit )
79 8a217fa2 Olga Brani
        {
80 8a217fa2 Olga Brani
                
81 8a217fa2 Olga Brani
                
82 8a217fa2 Olga Brani
                /**
83 8a217fa2 Olga Brani
                 * Add a column to the list used for the table with default values
84 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
85 8a217fa2 Olga Brani
                 *  @param {node} nTh The th element for this column
86 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
87 8a217fa2 Olga Brani
                 */
88 8a217fa2 Olga Brani
                function _fnAddColumn( oSettings, nTh )
89 8a217fa2 Olga Brani
                {
90 8a217fa2 Olga Brani
                        var oDefaults = DataTable.defaults.columns;
91 8a217fa2 Olga Brani
                        var iCol = oSettings.aoColumns.length;
92 8a217fa2 Olga Brani
                        var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
93 8a217fa2 Olga Brani
                                "sSortingClass": oSettings.oClasses.sSortable,
94 8a217fa2 Olga Brani
                                "sSortingClassJUI": oSettings.oClasses.sSortJUI,
95 8a217fa2 Olga Brani
                                "nTh": nTh ? nTh : document.createElement('th'),
96 8a217fa2 Olga Brani
                                "sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
97 8a217fa2 Olga Brani
                                "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
98 8a217fa2 Olga Brani
                                "mData": oDefaults.mData ? oDefaults.oDefaults : iCol
99 8a217fa2 Olga Brani
                        } );
100 8a217fa2 Olga Brani
                        oSettings.aoColumns.push( oCol );
101 8a217fa2 Olga Brani
                        
102 8a217fa2 Olga Brani
                        /* Add a column specific filter */
103 8a217fa2 Olga Brani
                        if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
104 8a217fa2 Olga Brani
                        {
105 8a217fa2 Olga Brani
                                oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
106 8a217fa2 Olga Brani
                        }
107 8a217fa2 Olga Brani
                        else
108 8a217fa2 Olga Brani
                        {
109 8a217fa2 Olga Brani
                                var oPre = oSettings.aoPreSearchCols[ iCol ];
110 8a217fa2 Olga Brani
                                
111 8a217fa2 Olga Brani
                                /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
112 8a217fa2 Olga Brani
                                if ( oPre.bRegex === undefined )
113 8a217fa2 Olga Brani
                                {
114 8a217fa2 Olga Brani
                                        oPre.bRegex = true;
115 8a217fa2 Olga Brani
                                }
116 8a217fa2 Olga Brani
                                
117 8a217fa2 Olga Brani
                                if ( oPre.bSmart === undefined )
118 8a217fa2 Olga Brani
                                {
119 8a217fa2 Olga Brani
                                        oPre.bSmart = true;
120 8a217fa2 Olga Brani
                                }
121 8a217fa2 Olga Brani
                                
122 8a217fa2 Olga Brani
                                if ( oPre.bCaseInsensitive === undefined )
123 8a217fa2 Olga Brani
                                {
124 8a217fa2 Olga Brani
                                        oPre.bCaseInsensitive = true;
125 8a217fa2 Olga Brani
                                }
126 8a217fa2 Olga Brani
                        }
127 8a217fa2 Olga Brani
                        
128 8a217fa2 Olga Brani
                        /* Use the column options function to initialise classes etc */
129 8a217fa2 Olga Brani
                        _fnColumnOptions( oSettings, iCol, null );
130 8a217fa2 Olga Brani
                }
131 8a217fa2 Olga Brani
                
132 8a217fa2 Olga Brani
                
133 8a217fa2 Olga Brani
                /**
134 8a217fa2 Olga Brani
                 * Apply options for a column
135 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
136 8a217fa2 Olga Brani
                 *  @param {int} iCol column index to consider
137 8a217fa2 Olga Brani
                 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
138 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
139 8a217fa2 Olga Brani
                 */
140 8a217fa2 Olga Brani
                function _fnColumnOptions( oSettings, iCol, oOptions )
141 8a217fa2 Olga Brani
                {
142 8a217fa2 Olga Brani
                        var oCol = oSettings.aoColumns[ iCol ];
143 8a217fa2 Olga Brani
                        
144 8a217fa2 Olga Brani
                        /* User specified column options */
145 8a217fa2 Olga Brani
                        if ( oOptions !== undefined && oOptions !== null )
146 8a217fa2 Olga Brani
                        {
147 8a217fa2 Olga Brani
                                /* Backwards compatibility for mDataProp */
148 8a217fa2 Olga Brani
                                if ( oOptions.mDataProp && !oOptions.mData )
149 8a217fa2 Olga Brani
                                {
150 8a217fa2 Olga Brani
                                        oOptions.mData = oOptions.mDataProp;
151 8a217fa2 Olga Brani
                                }
152 8a217fa2 Olga Brani
                
153 8a217fa2 Olga Brani
                                if ( oOptions.sType !== undefined )
154 8a217fa2 Olga Brani
                                {
155 8a217fa2 Olga Brani
                                        oCol.sType = oOptions.sType;
156 8a217fa2 Olga Brani
                                        oCol._bAutoType = false;
157 8a217fa2 Olga Brani
                                }
158 8a217fa2 Olga Brani
                                
159 8a217fa2 Olga Brani
                                $.extend( oCol, oOptions );
160 8a217fa2 Olga Brani
                                _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
161 8a217fa2 Olga Brani
                
162 8a217fa2 Olga Brani
                                /* iDataSort to be applied (backwards compatibility), but aDataSort will take
163 8a217fa2 Olga Brani
                                 * priority if defined
164 8a217fa2 Olga Brani
                                 */
165 8a217fa2 Olga Brani
                                if ( oOptions.iDataSort !== undefined )
166 8a217fa2 Olga Brani
                                {
167 8a217fa2 Olga Brani
                                        oCol.aDataSort = [ oOptions.iDataSort ];
168 8a217fa2 Olga Brani
                                }
169 8a217fa2 Olga Brani
                                _fnMap( oCol, oOptions, "aDataSort" );
170 8a217fa2 Olga Brani
                        }
171 8a217fa2 Olga Brani
                
172 8a217fa2 Olga Brani
                        /* Cache the data get and set functions for speed */
173 8a217fa2 Olga Brani
                        var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
174 8a217fa2 Olga Brani
                        var mData = _fnGetObjectDataFn( oCol.mData );
175 8a217fa2 Olga Brani
                
176 8a217fa2 Olga Brani
                        oCol.fnGetData = function (oData, sSpecific) {
177 8a217fa2 Olga Brani
                                var innerData = mData( oData, sSpecific );
178 8a217fa2 Olga Brani
                
179 8a217fa2 Olga Brani
                                if ( oCol.mRender && (sSpecific && sSpecific !== '') )
180 8a217fa2 Olga Brani
                                {
181 8a217fa2 Olga Brani
                                        return mRender( innerData, sSpecific, oData );
182 8a217fa2 Olga Brani
                                }
183 8a217fa2 Olga Brani
                                return innerData;
184 8a217fa2 Olga Brani
                        };
185 8a217fa2 Olga Brani
                        oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
186 8a217fa2 Olga Brani
                        
187 8a217fa2 Olga Brani
                        /* Feature sorting overrides column specific when off */
188 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bSort )
189 8a217fa2 Olga Brani
                        {
190 8a217fa2 Olga Brani
                                oCol.bSortable = false;
191 8a217fa2 Olga Brani
                        }
192 8a217fa2 Olga Brani
                        
193 8a217fa2 Olga Brani
                        /* Check that the class assignment is correct for sorting */
194 8a217fa2 Olga Brani
                        if ( !oCol.bSortable ||
195 8a217fa2 Olga Brani
                                 ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
196 8a217fa2 Olga Brani
                        {
197 8a217fa2 Olga Brani
                                oCol.sSortingClass = oSettings.oClasses.sSortableNone;
198 8a217fa2 Olga Brani
                                oCol.sSortingClassJUI = "";
199 8a217fa2 Olga Brani
                        }
200 8a217fa2 Olga Brani
                        else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
201 8a217fa2 Olga Brani
                        {
202 8a217fa2 Olga Brani
                                oCol.sSortingClass = oSettings.oClasses.sSortable;
203 8a217fa2 Olga Brani
                                oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
204 8a217fa2 Olga Brani
                        }
205 8a217fa2 Olga Brani
                        else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
206 8a217fa2 Olga Brani
                        {
207 8a217fa2 Olga Brani
                                oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
208 8a217fa2 Olga Brani
                                oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
209 8a217fa2 Olga Brani
                        }
210 8a217fa2 Olga Brani
                        else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
211 8a217fa2 Olga Brani
                        {
212 8a217fa2 Olga Brani
                                oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
213 8a217fa2 Olga Brani
                                oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
214 8a217fa2 Olga Brani
                        }
215 8a217fa2 Olga Brani
                }
216 8a217fa2 Olga Brani
                
217 8a217fa2 Olga Brani
                
218 8a217fa2 Olga Brani
                /**
219 8a217fa2 Olga Brani
                 * Adjust the table column widths for new data. Note: you would probably want to 
220 8a217fa2 Olga Brani
                 * do a redraw after calling this function!
221 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
222 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
223 8a217fa2 Olga Brani
                 */
224 8a217fa2 Olga Brani
                function _fnAdjustColumnSizing ( oSettings )
225 8a217fa2 Olga Brani
                {
226 8a217fa2 Olga Brani
                        /* Not interested in doing column width calculation if auto-width is disabled */
227 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bAutoWidth === false )
228 8a217fa2 Olga Brani
                        {
229 8a217fa2 Olga Brani
                                return false;
230 8a217fa2 Olga Brani
                        }
231 8a217fa2 Olga Brani
                        
232 8a217fa2 Olga Brani
                        _fnCalculateColumnWidths( oSettings );
233 8a217fa2 Olga Brani
                        for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
234 8a217fa2 Olga Brani
                        {
235 8a217fa2 Olga Brani
                                oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
236 8a217fa2 Olga Brani
                        }
237 8a217fa2 Olga Brani
                }
238 8a217fa2 Olga Brani
                
239 8a217fa2 Olga Brani
                
240 8a217fa2 Olga Brani
                /**
241 8a217fa2 Olga Brani
                 * Covert the index of a visible column to the index in the data array (take account
242 8a217fa2 Olga Brani
                 * of hidden columns)
243 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
244 8a217fa2 Olga Brani
                 *  @param {int} iMatch Visible column index to lookup
245 8a217fa2 Olga Brani
                 *  @returns {int} i the data index
246 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
247 8a217fa2 Olga Brani
                 */
248 8a217fa2 Olga Brani
                function _fnVisibleToColumnIndex( oSettings, iMatch )
249 8a217fa2 Olga Brani
                {
250 8a217fa2 Olga Brani
                        var aiVis = _fnGetColumns( oSettings, 'bVisible' );
251 8a217fa2 Olga Brani
                
252 8a217fa2 Olga Brani
                        return typeof aiVis[iMatch] === 'number' ?
253 8a217fa2 Olga Brani
                                aiVis[iMatch] :
254 8a217fa2 Olga Brani
                                null;
255 8a217fa2 Olga Brani
                }
256 8a217fa2 Olga Brani
                
257 8a217fa2 Olga Brani
                
258 8a217fa2 Olga Brani
                /**
259 8a217fa2 Olga Brani
                 * Covert the index of an index in the data array and convert it to the visible
260 8a217fa2 Olga Brani
                 *   column index (take account of hidden columns)
261 8a217fa2 Olga Brani
                 *  @param {int} iMatch Column index to lookup
262 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
263 8a217fa2 Olga Brani
                 *  @returns {int} i the data index
264 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
265 8a217fa2 Olga Brani
                 */
266 8a217fa2 Olga Brani
                function _fnColumnIndexToVisible( oSettings, iMatch )
267 8a217fa2 Olga Brani
                {
268 8a217fa2 Olga Brani
                        var aiVis = _fnGetColumns( oSettings, 'bVisible' );
269 8a217fa2 Olga Brani
                        var iPos = $.inArray( iMatch, aiVis );
270 8a217fa2 Olga Brani
                
271 8a217fa2 Olga Brani
                        return iPos !== -1 ? iPos : null;
272 8a217fa2 Olga Brani
                }
273 8a217fa2 Olga Brani
                
274 8a217fa2 Olga Brani
                
275 8a217fa2 Olga Brani
                /**
276 8a217fa2 Olga Brani
                 * Get the number of visible columns
277 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
278 8a217fa2 Olga Brani
                 *  @returns {int} i the number of visible columns
279 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
280 8a217fa2 Olga Brani
                 */
281 8a217fa2 Olga Brani
                function _fnVisbleColumns( oSettings )
282 8a217fa2 Olga Brani
                {
283 8a217fa2 Olga Brani
                        return _fnGetColumns( oSettings, 'bVisible' ).length;
284 8a217fa2 Olga Brani
                }
285 8a217fa2 Olga Brani
                
286 8a217fa2 Olga Brani
                
287 8a217fa2 Olga Brani
                /**
288 8a217fa2 Olga Brani
                 * Get an array of column indexes that match a given property
289 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
290 8a217fa2 Olga Brani
                 *  @param {string} sParam Parameter in aoColumns to look for - typically 
291 8a217fa2 Olga Brani
                 *    bVisible or bSearchable
292 8a217fa2 Olga Brani
                 *  @returns {array} Array of indexes with matched properties
293 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
294 8a217fa2 Olga Brani
                 */
295 8a217fa2 Olga Brani
                function _fnGetColumns( oSettings, sParam )
296 8a217fa2 Olga Brani
                {
297 8a217fa2 Olga Brani
                        var a = [];
298 8a217fa2 Olga Brani
                
299 8a217fa2 Olga Brani
                        $.map( oSettings.aoColumns, function(val, i) {
300 8a217fa2 Olga Brani
                                if ( val[sParam] ) {
301 8a217fa2 Olga Brani
                                        a.push( i );
302 8a217fa2 Olga Brani
                                }
303 8a217fa2 Olga Brani
                        } );
304 8a217fa2 Olga Brani
                
305 8a217fa2 Olga Brani
                        return a;
306 8a217fa2 Olga Brani
                }
307 8a217fa2 Olga Brani
                
308 8a217fa2 Olga Brani
                
309 8a217fa2 Olga Brani
                /**
310 8a217fa2 Olga Brani
                 * Get the sort type based on an input string
311 8a217fa2 Olga Brani
                 *  @param {string} sData data we wish to know the type of
312 8a217fa2 Olga Brani
                 *  @returns {string} type (defaults to 'string' if no type can be detected)
313 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
314 8a217fa2 Olga Brani
                 */
315 8a217fa2 Olga Brani
                function _fnDetectType( sData )
316 8a217fa2 Olga Brani
                {
317 8a217fa2 Olga Brani
                        var aTypes = DataTable.ext.aTypes;
318 8a217fa2 Olga Brani
                        var iLen = aTypes.length;
319 8a217fa2 Olga Brani
                        
320 8a217fa2 Olga Brani
                        for ( var i=0 ; i<iLen ; i++ )
321 8a217fa2 Olga Brani
                        {
322 8a217fa2 Olga Brani
                                var sType = aTypes[i]( sData );
323 8a217fa2 Olga Brani
                                if ( sType !== null )
324 8a217fa2 Olga Brani
                                {
325 8a217fa2 Olga Brani
                                        return sType;
326 8a217fa2 Olga Brani
                                }
327 8a217fa2 Olga Brani
                        }
328 8a217fa2 Olga Brani
                        
329 8a217fa2 Olga Brani
                        return 'string';
330 8a217fa2 Olga Brani
                }
331 8a217fa2 Olga Brani
                
332 8a217fa2 Olga Brani
                
333 8a217fa2 Olga Brani
                /**
334 8a217fa2 Olga Brani
                 * Figure out how to reorder a display list
335 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
336 8a217fa2 Olga Brani
                 *  @returns array {int} aiReturn index list for reordering
337 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
338 8a217fa2 Olga Brani
                 */
339 8a217fa2 Olga Brani
                function _fnReOrderIndex ( oSettings, sColumns )
340 8a217fa2 Olga Brani
                {
341 8a217fa2 Olga Brani
                        var aColumns = sColumns.split(',');
342 8a217fa2 Olga Brani
                        var aiReturn = [];
343 8a217fa2 Olga Brani
                        
344 8a217fa2 Olga Brani
                        for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
345 8a217fa2 Olga Brani
                        {
346 8a217fa2 Olga Brani
                                for ( var j=0 ; j<iLen ; j++ )
347 8a217fa2 Olga Brani
                                {
348 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].sName == aColumns[j] )
349 8a217fa2 Olga Brani
                                        {
350 8a217fa2 Olga Brani
                                                aiReturn.push( j );
351 8a217fa2 Olga Brani
                                                break;
352 8a217fa2 Olga Brani
                                        }
353 8a217fa2 Olga Brani
                                }
354 8a217fa2 Olga Brani
                        }
355 8a217fa2 Olga Brani
                        
356 8a217fa2 Olga Brani
                        return aiReturn;
357 8a217fa2 Olga Brani
                }
358 8a217fa2 Olga Brani
                
359 8a217fa2 Olga Brani
                
360 8a217fa2 Olga Brani
                /**
361 8a217fa2 Olga Brani
                 * Get the column ordering that DataTables expects
362 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
363 8a217fa2 Olga Brani
                 *  @returns {string} comma separated list of names
364 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
365 8a217fa2 Olga Brani
                 */
366 8a217fa2 Olga Brani
                function _fnColumnOrdering ( oSettings )
367 8a217fa2 Olga Brani
                {
368 8a217fa2 Olga Brani
                        var sNames = '';
369 8a217fa2 Olga Brani
                        for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
370 8a217fa2 Olga Brani
                        {
371 8a217fa2 Olga Brani
                                sNames += oSettings.aoColumns[i].sName+',';
372 8a217fa2 Olga Brani
                        }
373 8a217fa2 Olga Brani
                        if ( sNames.length == iLen )
374 8a217fa2 Olga Brani
                        {
375 8a217fa2 Olga Brani
                                return "";
376 8a217fa2 Olga Brani
                        }
377 8a217fa2 Olga Brani
                        return sNames.slice(0, -1);
378 8a217fa2 Olga Brani
                }
379 8a217fa2 Olga Brani
                
380 8a217fa2 Olga Brani
                
381 8a217fa2 Olga Brani
                /**
382 8a217fa2 Olga Brani
                 * Take the column definitions and static columns arrays and calculate how
383 8a217fa2 Olga Brani
                 * they relate to column indexes. The callback function will then apply the
384 8a217fa2 Olga Brani
                 * definition found for a column to a suitable configuration object.
385 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
386 8a217fa2 Olga Brani
                 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
387 8a217fa2 Olga Brani
                 *  @param {array} aoCols The aoColumns array that defines columns individually
388 8a217fa2 Olga Brani
                 *  @param {function} fn Callback function - takes two parameters, the calculated
389 8a217fa2 Olga Brani
                 *    column index and the definition for that column.
390 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
391 8a217fa2 Olga Brani
                 */
392 8a217fa2 Olga Brani
                function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
393 8a217fa2 Olga Brani
                {
394 8a217fa2 Olga Brani
                        var i, iLen, j, jLen, k, kLen;
395 8a217fa2 Olga Brani
                
396 8a217fa2 Olga Brani
                        // Column definitions with aTargets
397 8a217fa2 Olga Brani
                        if ( aoColDefs )
398 8a217fa2 Olga Brani
                        {
399 8a217fa2 Olga Brani
                                /* Loop over the definitions array - loop in reverse so first instance has priority */
400 8a217fa2 Olga Brani
                                for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
401 8a217fa2 Olga Brani
                                {
402 8a217fa2 Olga Brani
                                        /* Each definition can target multiple columns, as it is an array */
403 8a217fa2 Olga Brani
                                        var aTargets = aoColDefs[i].aTargets;
404 8a217fa2 Olga Brani
                                        if ( !$.isArray( aTargets ) )
405 8a217fa2 Olga Brani
                                        {
406 8a217fa2 Olga Brani
                                                _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
407 8a217fa2 Olga Brani
                                        }
408 8a217fa2 Olga Brani
                
409 8a217fa2 Olga Brani
                                        for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
410 8a217fa2 Olga Brani
                                        {
411 8a217fa2 Olga Brani
                                                if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
412 8a217fa2 Olga Brani
                                                {
413 8a217fa2 Olga Brani
                                                        /* Add columns that we don't yet know about */
414 8a217fa2 Olga Brani
                                                        while( oSettings.aoColumns.length <= aTargets[j] )
415 8a217fa2 Olga Brani
                                                        {
416 8a217fa2 Olga Brani
                                                                _fnAddColumn( oSettings );
417 8a217fa2 Olga Brani
                                                        }
418 8a217fa2 Olga Brani
                
419 8a217fa2 Olga Brani
                                                        /* Integer, basic index */
420 8a217fa2 Olga Brani
                                                        fn( aTargets[j], aoColDefs[i] );
421 8a217fa2 Olga Brani
                                                }
422 8a217fa2 Olga Brani
                                                else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
423 8a217fa2 Olga Brani
                                                {
424 8a217fa2 Olga Brani
                                                        /* Negative integer, right to left column counting */
425 8a217fa2 Olga Brani
                                                        fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
426 8a217fa2 Olga Brani
                                                }
427 8a217fa2 Olga Brani
                                                else if ( typeof aTargets[j] === 'string' )
428 8a217fa2 Olga Brani
                                                {
429 8a217fa2 Olga Brani
                                                        /* Class name matching on TH element */
430 8a217fa2 Olga Brani
                                                        for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
431 8a217fa2 Olga Brani
                                                        {
432 8a217fa2 Olga Brani
                                                                if ( aTargets[j] == "_all" ||
433 8a217fa2 Olga Brani
                                                                     $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
434 8a217fa2 Olga Brani
                                                                {
435 8a217fa2 Olga Brani
                                                                        fn( k, aoColDefs[i] );
436 8a217fa2 Olga Brani
                                                                }
437 8a217fa2 Olga Brani
                                                        }
438 8a217fa2 Olga Brani
                                                }
439 8a217fa2 Olga Brani
                                        }
440 8a217fa2 Olga Brani
                                }
441 8a217fa2 Olga Brani
                        }
442 8a217fa2 Olga Brani
                
443 8a217fa2 Olga Brani
                        // Statically defined columns array
444 8a217fa2 Olga Brani
                        if ( aoCols )
445 8a217fa2 Olga Brani
                        {
446 8a217fa2 Olga Brani
                                for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
447 8a217fa2 Olga Brani
                                {
448 8a217fa2 Olga Brani
                                        fn( i, aoCols[i] );
449 8a217fa2 Olga Brani
                                }
450 8a217fa2 Olga Brani
                        }
451 8a217fa2 Olga Brani
                }
452 8a217fa2 Olga Brani
                
453 8a217fa2 Olga Brani
                /**
454 8a217fa2 Olga Brani
                 * Add a data array to the table, creating DOM node etc. This is the parallel to 
455 8a217fa2 Olga Brani
                 * _fnGatherData, but for adding rows from a Javascript source, rather than a
456 8a217fa2 Olga Brani
                 * DOM source.
457 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
458 8a217fa2 Olga Brani
                 *  @param {array} aData data array to be added
459 8a217fa2 Olga Brani
                 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
460 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
461 8a217fa2 Olga Brani
                 */
462 8a217fa2 Olga Brani
                function _fnAddData ( oSettings, aDataSupplied )
463 8a217fa2 Olga Brani
                {
464 8a217fa2 Olga Brani
                        var oCol;
465 8a217fa2 Olga Brani
                        
466 8a217fa2 Olga Brani
                        /* Take an independent copy of the data source so we can bash it about as we wish */
467 8a217fa2 Olga Brani
                        var aDataIn = ($.isArray(aDataSupplied)) ?
468 8a217fa2 Olga Brani
                                aDataSupplied.slice() :
469 8a217fa2 Olga Brani
                                $.extend( true, {}, aDataSupplied );
470 8a217fa2 Olga Brani
                        
471 8a217fa2 Olga Brani
                        /* Create the object for storing information about this new row */
472 8a217fa2 Olga Brani
                        var iRow = oSettings.aoData.length;
473 8a217fa2 Olga Brani
                        var oData = $.extend( true, {}, DataTable.models.oRow );
474 8a217fa2 Olga Brani
                        oData._aData = aDataIn;
475 8a217fa2 Olga Brani
                        oSettings.aoData.push( oData );
476 8a217fa2 Olga Brani
                
477 8a217fa2 Olga Brani
                        /* Create the cells */
478 8a217fa2 Olga Brani
                        var nTd, sThisType;
479 8a217fa2 Olga Brani
                        for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
480 8a217fa2 Olga Brani
                        {
481 8a217fa2 Olga Brani
                                oCol = oSettings.aoColumns[i];
482 8a217fa2 Olga Brani
                
483 8a217fa2 Olga Brani
                                /* Use rendered data for filtering / sorting */
484 8a217fa2 Olga Brani
                                if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
485 8a217fa2 Olga Brani
                                {
486 8a217fa2 Olga Brani
                                        _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
487 8a217fa2 Olga Brani
                                }
488 8a217fa2 Olga Brani
                                else
489 8a217fa2 Olga Brani
                                {
490 8a217fa2 Olga Brani
                                        _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
491 8a217fa2 Olga Brani
                                }
492 8a217fa2 Olga Brani
                                
493 8a217fa2 Olga Brani
                                /* See if we should auto-detect the column type */
494 8a217fa2 Olga Brani
                                if ( oCol._bAutoType && oCol.sType != 'string' )
495 8a217fa2 Olga Brani
                                {
496 8a217fa2 Olga Brani
                                        /* Attempt to auto detect the type - same as _fnGatherData() */
497 8a217fa2 Olga Brani
                                        var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
498 8a217fa2 Olga Brani
                                        if ( sVarType !== null && sVarType !== '' )
499 8a217fa2 Olga Brani
                                        {
500 8a217fa2 Olga Brani
                                                sThisType = _fnDetectType( sVarType );
501 8a217fa2 Olga Brani
                                                if ( oCol.sType === null )
502 8a217fa2 Olga Brani
                                                {
503 8a217fa2 Olga Brani
                                                        oCol.sType = sThisType;
504 8a217fa2 Olga Brani
                                                }
505 8a217fa2 Olga Brani
                                                else if ( oCol.sType != sThisType && oCol.sType != "html" )
506 8a217fa2 Olga Brani
                                                {
507 8a217fa2 Olga Brani
                                                        /* String is always the 'fallback' option */
508 8a217fa2 Olga Brani
                                                        oCol.sType = 'string';
509 8a217fa2 Olga Brani
                                                }
510 8a217fa2 Olga Brani
                                        }
511 8a217fa2 Olga Brani
                                }
512 8a217fa2 Olga Brani
                        }
513 8a217fa2 Olga Brani
                        
514 8a217fa2 Olga Brani
                        /* Add to the display array */
515 8a217fa2 Olga Brani
                        oSettings.aiDisplayMaster.push( iRow );
516 8a217fa2 Olga Brani
                
517 8a217fa2 Olga Brani
                        /* Create the DOM information */
518 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bDeferRender )
519 8a217fa2 Olga Brani
                        {
520 8a217fa2 Olga Brani
                                _fnCreateTr( oSettings, iRow );
521 8a217fa2 Olga Brani
                        }
522 8a217fa2 Olga Brani
                
523 8a217fa2 Olga Brani
                        return iRow;
524 8a217fa2 Olga Brani
                }
525 8a217fa2 Olga Brani
                
526 8a217fa2 Olga Brani
                
527 8a217fa2 Olga Brani
                /**
528 8a217fa2 Olga Brani
                 * Read in the data from the target table from the DOM
529 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
530 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
531 8a217fa2 Olga Brani
                 */
532 8a217fa2 Olga Brani
                function _fnGatherData( oSettings )
533 8a217fa2 Olga Brani
                {
534 8a217fa2 Olga Brani
                        var iLoop, i, iLen, j, jLen, jInner,
535 8a217fa2 Olga Brani
                                 nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
536 8a217fa2 Olga Brani
                                iRow, iRows, iColumn, iColumns, sNodeName,
537 8a217fa2 Olga Brani
                                oCol, oData;
538 8a217fa2 Olga Brani
                        
539 8a217fa2 Olga Brani
                        /*
540 8a217fa2 Olga Brani
                         * Process by row first
541 8a217fa2 Olga Brani
                         * Add the data object for the whole table - storing the tr node. Note - no point in getting
542 8a217fa2 Olga Brani
                         * DOM based data if we are going to go and replace it with Ajax source data.
543 8a217fa2 Olga Brani
                         */
544 8a217fa2 Olga Brani
                        if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
545 8a217fa2 Olga Brani
                        {
546 8a217fa2 Olga Brani
                                nTr = oSettings.nTBody.firstChild;
547 8a217fa2 Olga Brani
                                while ( nTr )
548 8a217fa2 Olga Brani
                                {
549 8a217fa2 Olga Brani
                                        if ( nTr.nodeName.toUpperCase() == "TR" )
550 8a217fa2 Olga Brani
                                        {
551 8a217fa2 Olga Brani
                                                iThisIndex = oSettings.aoData.length;
552 8a217fa2 Olga Brani
                                                nTr._DT_RowIndex = iThisIndex;
553 8a217fa2 Olga Brani
                                                oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
554 8a217fa2 Olga Brani
                                                        "nTr": nTr
555 8a217fa2 Olga Brani
                                                } ) );
556 8a217fa2 Olga Brani
                
557 8a217fa2 Olga Brani
                                                oSettings.aiDisplayMaster.push( iThisIndex );
558 8a217fa2 Olga Brani
                                                nTd = nTr.firstChild;
559 8a217fa2 Olga Brani
                                                jInner = 0;
560 8a217fa2 Olga Brani
                                                while ( nTd )
561 8a217fa2 Olga Brani
                                                {
562 8a217fa2 Olga Brani
                                                        sNodeName = nTd.nodeName.toUpperCase();
563 8a217fa2 Olga Brani
                                                        if ( sNodeName == "TD" || sNodeName == "TH" )
564 8a217fa2 Olga Brani
                                                        {
565 8a217fa2 Olga Brani
                                                                _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
566 8a217fa2 Olga Brani
                                                                jInner++;
567 8a217fa2 Olga Brani
                                                        }
568 8a217fa2 Olga Brani
                                                        nTd = nTd.nextSibling;
569 8a217fa2 Olga Brani
                                                }
570 8a217fa2 Olga Brani
                                        }
571 8a217fa2 Olga Brani
                                        nTr = nTr.nextSibling;
572 8a217fa2 Olga Brani
                                }
573 8a217fa2 Olga Brani
                        }
574 8a217fa2 Olga Brani
                        
575 8a217fa2 Olga Brani
                        /* Gather in the TD elements of the Table - note that this is basically the same as
576 8a217fa2 Olga Brani
                         * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
577 8a217fa2 Olga Brani
                         * setup!
578 8a217fa2 Olga Brani
                         */
579 8a217fa2 Olga Brani
                        nTrs = _fnGetTrNodes( oSettings );
580 8a217fa2 Olga Brani
                        nTds = [];
581 8a217fa2 Olga Brani
                        for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
582 8a217fa2 Olga Brani
                        {
583 8a217fa2 Olga Brani
                                nTd = nTrs[i].firstChild;
584 8a217fa2 Olga Brani
                                while ( nTd )
585 8a217fa2 Olga Brani
                                {
586 8a217fa2 Olga Brani
                                        sNodeName = nTd.nodeName.toUpperCase();
587 8a217fa2 Olga Brani
                                        if ( sNodeName == "TD" || sNodeName == "TH" )
588 8a217fa2 Olga Brani
                                        {
589 8a217fa2 Olga Brani
                                                nTds.push( nTd );
590 8a217fa2 Olga Brani
                                        }
591 8a217fa2 Olga Brani
                                        nTd = nTd.nextSibling;
592 8a217fa2 Olga Brani
                                }
593 8a217fa2 Olga Brani
                        }
594 8a217fa2 Olga Brani
                        
595 8a217fa2 Olga Brani
                        /* Now process by column */
596 8a217fa2 Olga Brani
                        for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
597 8a217fa2 Olga Brani
                        {
598 8a217fa2 Olga Brani
                                oCol = oSettings.aoColumns[iColumn];
599 8a217fa2 Olga Brani
                
600 8a217fa2 Olga Brani
                                /* Get the title of the column - unless there is a user set one */
601 8a217fa2 Olga Brani
                                if ( oCol.sTitle === null )
602 8a217fa2 Olga Brani
                                {
603 8a217fa2 Olga Brani
                                        oCol.sTitle = oCol.nTh.innerHTML;
604 8a217fa2 Olga Brani
                                }
605 8a217fa2 Olga Brani
                                
606 8a217fa2 Olga Brani
                                var
607 8a217fa2 Olga Brani
                                        bAutoType = oCol._bAutoType,
608 8a217fa2 Olga Brani
                                        bRender = typeof oCol.fnRender === 'function',
609 8a217fa2 Olga Brani
                                        bClass = oCol.sClass !== null,
610 8a217fa2 Olga Brani
                                        bVisible = oCol.bVisible,
611 8a217fa2 Olga Brani
                                        nCell, sThisType, sRendered, sValType;
612 8a217fa2 Olga Brani
                                
613 8a217fa2 Olga Brani
                                /* A single loop to rule them all (and be more efficient) */
614 8a217fa2 Olga Brani
                                if ( bAutoType || bRender || bClass || !bVisible )
615 8a217fa2 Olga Brani
                                {
616 8a217fa2 Olga Brani
                                        for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
617 8a217fa2 Olga Brani
                                        {
618 8a217fa2 Olga Brani
                                                oData = oSettings.aoData[iRow];
619 8a217fa2 Olga Brani
                                                nCell = nTds[ (iRow*iColumns) + iColumn ];
620 8a217fa2 Olga Brani
                                                
621 8a217fa2 Olga Brani
                                                /* Type detection */
622 8a217fa2 Olga Brani
                                                if ( bAutoType && oCol.sType != 'string' )
623 8a217fa2 Olga Brani
                                                {
624 8a217fa2 Olga Brani
                                                        sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );
625 8a217fa2 Olga Brani
                                                        if ( sValType !== '' )
626 8a217fa2 Olga Brani
                                                        {
627 8a217fa2 Olga Brani
                                                                sThisType = _fnDetectType( sValType );
628 8a217fa2 Olga Brani
                                                                if ( oCol.sType === null )
629 8a217fa2 Olga Brani
                                                                {
630 8a217fa2 Olga Brani
                                                                        oCol.sType = sThisType;
631 8a217fa2 Olga Brani
                                                                }
632 8a217fa2 Olga Brani
                                                                else if ( oCol.sType != sThisType && 
633 8a217fa2 Olga Brani
                                                                          oCol.sType != "html" )
634 8a217fa2 Olga Brani
                                                                {
635 8a217fa2 Olga Brani
                                                                        /* String is always the 'fallback' option */
636 8a217fa2 Olga Brani
                                                                        oCol.sType = 'string';
637 8a217fa2 Olga Brani
                                                                }
638 8a217fa2 Olga Brani
                                                        }
639 8a217fa2 Olga Brani
                                                }
640 8a217fa2 Olga Brani
                
641 8a217fa2 Olga Brani
                                                if ( oCol.mRender )
642 8a217fa2 Olga Brani
                                                {
643 8a217fa2 Olga Brani
                                                        // mRender has been defined, so we need to get the value and set it
644 8a217fa2 Olga Brani
                                                        nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
645 8a217fa2 Olga Brani
                                                }
646 8a217fa2 Olga Brani
                                                else if ( oCol.mData !== iColumn )
647 8a217fa2 Olga Brani
                                                {
648 8a217fa2 Olga Brani
                                                        // If mData is not the same as the column number, then we need to
649 8a217fa2 Olga Brani
                                                        // get the dev set value. If it is the column, no point in wasting
650 8a217fa2 Olga Brani
                                                        // time setting the value that is already there!
651 8a217fa2 Olga Brani
                                                        nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
652 8a217fa2 Olga Brani
                                                }
653 8a217fa2 Olga Brani
                                                
654 8a217fa2 Olga Brani
                                                /* Rendering */
655 8a217fa2 Olga Brani
                                                if ( bRender )
656 8a217fa2 Olga Brani
                                                {
657 8a217fa2 Olga Brani
                                                        sRendered = _fnRender( oSettings, iRow, iColumn );
658 8a217fa2 Olga Brani
                                                        nCell.innerHTML = sRendered;
659 8a217fa2 Olga Brani
                                                        if ( oCol.bUseRendered )
660 8a217fa2 Olga Brani
                                                        {
661 8a217fa2 Olga Brani
                                                                /* Use the rendered data for filtering / sorting */
662 8a217fa2 Olga Brani
                                                                _fnSetCellData( oSettings, iRow, iColumn, sRendered );
663 8a217fa2 Olga Brani
                                                        }
664 8a217fa2 Olga Brani
                                                }
665 8a217fa2 Olga Brani
                                                
666 8a217fa2 Olga Brani
                                                /* Classes */
667 8a217fa2 Olga Brani
                                                if ( bClass )
668 8a217fa2 Olga Brani
                                                {
669 8a217fa2 Olga Brani
                                                        nCell.className += ' '+oCol.sClass;
670 8a217fa2 Olga Brani
                                                }
671 8a217fa2 Olga Brani
                                                
672 8a217fa2 Olga Brani
                                                /* Column visibility */
673 8a217fa2 Olga Brani
                                                if ( !bVisible )
674 8a217fa2 Olga Brani
                                                {
675 8a217fa2 Olga Brani
                                                        oData._anHidden[iColumn] = nCell;
676 8a217fa2 Olga Brani
                                                        nCell.parentNode.removeChild( nCell );
677 8a217fa2 Olga Brani
                                                }
678 8a217fa2 Olga Brani
                                                else
679 8a217fa2 Olga Brani
                                                {
680 8a217fa2 Olga Brani
                                                        oData._anHidden[iColumn] = null;
681 8a217fa2 Olga Brani
                                                }
682 8a217fa2 Olga Brani
                
683 8a217fa2 Olga Brani
                                                if ( oCol.fnCreatedCell )
684 8a217fa2 Olga Brani
                                                {
685 8a217fa2 Olga Brani
                                                        oCol.fnCreatedCell.call( oSettings.oInstance,
686 8a217fa2 Olga Brani
                                                                nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn
687 8a217fa2 Olga Brani
                                                        );
688 8a217fa2 Olga Brani
                                                }
689 8a217fa2 Olga Brani
                                        }
690 8a217fa2 Olga Brani
                                }
691 8a217fa2 Olga Brani
                        }
692 8a217fa2 Olga Brani
                
693 8a217fa2 Olga Brani
                        /* Row created callbacks */
694 8a217fa2 Olga Brani
                        if ( oSettings.aoRowCreatedCallback.length !== 0 )
695 8a217fa2 Olga Brani
                        {
696 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
697 8a217fa2 Olga Brani
                                {
698 8a217fa2 Olga Brani
                                        oData = oSettings.aoData[i];
699 8a217fa2 Olga Brani
                                        _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );
700 8a217fa2 Olga Brani
                                }
701 8a217fa2 Olga Brani
                        }
702 8a217fa2 Olga Brani
                }
703 8a217fa2 Olga Brani
                
704 8a217fa2 Olga Brani
                
705 8a217fa2 Olga Brani
                /**
706 8a217fa2 Olga Brani
                 * Take a TR element and convert it to an index in aoData
707 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
708 8a217fa2 Olga Brani
                 *  @param {node} n the TR element to find
709 8a217fa2 Olga Brani
                 *  @returns {int} index if the node is found, null if not
710 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
711 8a217fa2 Olga Brani
                 */
712 8a217fa2 Olga Brani
                function _fnNodeToDataIndex( oSettings, n )
713 8a217fa2 Olga Brani
                {
714 8a217fa2 Olga Brani
                        return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
715 8a217fa2 Olga Brani
                }
716 8a217fa2 Olga Brani
                
717 8a217fa2 Olga Brani
                
718 8a217fa2 Olga Brani
                /**
719 8a217fa2 Olga Brani
                 * Take a TD element and convert it into a column data index (not the visible index)
720 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
721 8a217fa2 Olga Brani
                 *  @param {int} iRow The row number the TD/TH can be found in
722 8a217fa2 Olga Brani
                 *  @param {node} n The TD/TH element to find
723 8a217fa2 Olga Brani
                 *  @returns {int} index if the node is found, -1 if not
724 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
725 8a217fa2 Olga Brani
                 */
726 8a217fa2 Olga Brani
                function _fnNodeToColumnIndex( oSettings, iRow, n )
727 8a217fa2 Olga Brani
                {
728 8a217fa2 Olga Brani
                        var anCells = _fnGetTdNodes( oSettings, iRow );
729 8a217fa2 Olga Brani
                
730 8a217fa2 Olga Brani
                        for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
731 8a217fa2 Olga Brani
                        {
732 8a217fa2 Olga Brani
                                if ( anCells[i] === n )
733 8a217fa2 Olga Brani
                                {
734 8a217fa2 Olga Brani
                                        return i;
735 8a217fa2 Olga Brani
                                }
736 8a217fa2 Olga Brani
                        }
737 8a217fa2 Olga Brani
                        return -1;
738 8a217fa2 Olga Brani
                }
739 8a217fa2 Olga Brani
                
740 8a217fa2 Olga Brani
                
741 8a217fa2 Olga Brani
                /**
742 8a217fa2 Olga Brani
                 * Get an array of data for a given row from the internal data cache
743 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
744 8a217fa2 Olga Brani
                 *  @param {int} iRow aoData row id
745 8a217fa2 Olga Brani
                 *  @param {string} sSpecific data get type ('type' 'filter' 'sort')
746 8a217fa2 Olga Brani
                 *  @param {array} aiColumns Array of column indexes to get data from
747 8a217fa2 Olga Brani
                 *  @returns {array} Data array
748 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
749 8a217fa2 Olga Brani
                 */
750 8a217fa2 Olga Brani
                function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
751 8a217fa2 Olga Brani
                {
752 8a217fa2 Olga Brani
                        var out = [];
753 8a217fa2 Olga Brani
                        for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
754 8a217fa2 Olga Brani
                        {
755 8a217fa2 Olga Brani
                                out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
756 8a217fa2 Olga Brani
                        }
757 8a217fa2 Olga Brani
                        return out;
758 8a217fa2 Olga Brani
                }
759 8a217fa2 Olga Brani
                
760 8a217fa2 Olga Brani
                
761 8a217fa2 Olga Brani
                /**
762 8a217fa2 Olga Brani
                 * Get the data for a given cell from the internal cache, taking into account data mapping
763 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
764 8a217fa2 Olga Brani
                 *  @param {int} iRow aoData row id
765 8a217fa2 Olga Brani
                 *  @param {int} iCol Column index
766 8a217fa2 Olga Brani
                 *  @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')
767 8a217fa2 Olga Brani
                 *  @returns {*} Cell data
768 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
769 8a217fa2 Olga Brani
                 */
770 8a217fa2 Olga Brani
                function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
771 8a217fa2 Olga Brani
                {
772 8a217fa2 Olga Brani
                        var sData;
773 8a217fa2 Olga Brani
                        var oCol = oSettings.aoColumns[iCol];
774 8a217fa2 Olga Brani
                        var oData = oSettings.aoData[iRow]._aData;
775 8a217fa2 Olga Brani
                
776 8a217fa2 Olga Brani
                        if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )
777 8a217fa2 Olga Brani
                        {
778 8a217fa2 Olga Brani
                                if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
779 8a217fa2 Olga Brani
                                {
780 8a217fa2 Olga Brani
                                        _fnLog( oSettings, 0, "Requested unknown parameter "+
781 8a217fa2 Olga Brani
                                                (typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
782 8a217fa2 Olga Brani
                                                " from the data source for row "+iRow );
783 8a217fa2 Olga Brani
                                        oSettings.iDrawError = oSettings.iDraw;
784 8a217fa2 Olga Brani
                                }
785 8a217fa2 Olga Brani
                                return oCol.sDefaultContent;
786 8a217fa2 Olga Brani
                        }
787 8a217fa2 Olga Brani
                
788 8a217fa2 Olga Brani
                        /* When the data source is null, we can use default column data */
789 8a217fa2 Olga Brani
                        if ( sData === null && oCol.sDefaultContent !== null )
790 8a217fa2 Olga Brani
                        {
791 8a217fa2 Olga Brani
                                sData = oCol.sDefaultContent;
792 8a217fa2 Olga Brani
                        }
793 8a217fa2 Olga Brani
                        else if ( typeof sData === 'function' )
794 8a217fa2 Olga Brani
                        {
795 8a217fa2 Olga Brani
                                /* If the data source is a function, then we run it and use the return */
796 8a217fa2 Olga Brani
                                return sData();
797 8a217fa2 Olga Brani
                        }
798 8a217fa2 Olga Brani
                
799 8a217fa2 Olga Brani
                        if ( sSpecific == 'display' && sData === null )
800 8a217fa2 Olga Brani
                        {
801 8a217fa2 Olga Brani
                                return '';
802 8a217fa2 Olga Brani
                        }
803 8a217fa2 Olga Brani
                        return sData;
804 8a217fa2 Olga Brani
                }
805 8a217fa2 Olga Brani
                
806 8a217fa2 Olga Brani
                
807 8a217fa2 Olga Brani
                /**
808 8a217fa2 Olga Brani
                 * Set the value for a specific cell, into the internal data cache
809 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
810 8a217fa2 Olga Brani
                 *  @param {int} iRow aoData row id
811 8a217fa2 Olga Brani
                 *  @param {int} iCol Column index
812 8a217fa2 Olga Brani
                 *  @param {*} val Value to set
813 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
814 8a217fa2 Olga Brani
                 */
815 8a217fa2 Olga Brani
                function _fnSetCellData( oSettings, iRow, iCol, val )
816 8a217fa2 Olga Brani
                {
817 8a217fa2 Olga Brani
                        var oCol = oSettings.aoColumns[iCol];
818 8a217fa2 Olga Brani
                        var oData = oSettings.aoData[iRow]._aData;
819 8a217fa2 Olga Brani
                
820 8a217fa2 Olga Brani
                        oCol.fnSetData( oData, val );
821 8a217fa2 Olga Brani
                }
822 8a217fa2 Olga Brani
                
823 8a217fa2 Olga Brani
                
824 8a217fa2 Olga Brani
                // Private variable that is used to match array syntax in the data property object
825 8a217fa2 Olga Brani
                var __reArray = /\[.*?\]$/;
826 8a217fa2 Olga Brani
                
827 8a217fa2 Olga Brani
                /**
828 8a217fa2 Olga Brani
                 * Return a function that can be used to get data from a source object, taking
829 8a217fa2 Olga Brani
                 * into account the ability to use nested objects as a source
830 8a217fa2 Olga Brani
                 *  @param {string|int|function} mSource The data source for the object
831 8a217fa2 Olga Brani
                 *  @returns {function} Data get function
832 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
833 8a217fa2 Olga Brani
                 */
834 8a217fa2 Olga Brani
                function _fnGetObjectDataFn( mSource )
835 8a217fa2 Olga Brani
                {
836 8a217fa2 Olga Brani
                        if ( mSource === null )
837 8a217fa2 Olga Brani
                        {
838 8a217fa2 Olga Brani
                                /* Give an empty string for rendering / sorting etc */
839 8a217fa2 Olga Brani
                                return function (data, type) {
840 8a217fa2 Olga Brani
                                        return null;
841 8a217fa2 Olga Brani
                                };
842 8a217fa2 Olga Brani
                        }
843 8a217fa2 Olga Brani
                        else if ( typeof mSource === 'function' )
844 8a217fa2 Olga Brani
                        {
845 8a217fa2 Olga Brani
                                return function (data, type, extra) {
846 8a217fa2 Olga Brani
                                        return mSource( data, type, extra );
847 8a217fa2 Olga Brani
                                };
848 8a217fa2 Olga Brani
                        }
849 8a217fa2 Olga Brani
                        else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
850 8a217fa2 Olga Brani
                        {
851 8a217fa2 Olga Brani
                                /* If there is a . in the source string then the data source is in a 
852 8a217fa2 Olga Brani
                                 * nested object so we loop over the data for each level to get the next
853 8a217fa2 Olga Brani
                                 * level down. On each loop we test for undefined, and if found immediately
854 8a217fa2 Olga Brani
                                 * return. This allows entire objects to be missing and sDefaultContent to
855 8a217fa2 Olga Brani
                                 * be used if defined, rather than throwing an error
856 8a217fa2 Olga Brani
                                 */
857 8a217fa2 Olga Brani
                                var fetchData = function (data, type, src) {
858 8a217fa2 Olga Brani
                                        var a = src.split('.');
859 8a217fa2 Olga Brani
                                        var arrayNotation, out, innerSrc;
860 8a217fa2 Olga Brani
                
861 8a217fa2 Olga Brani
                                        if ( src !== "" )
862 8a217fa2 Olga Brani
                                        {
863 8a217fa2 Olga Brani
                                                for ( var i=0, iLen=a.length ; i<iLen ; i++ )
864 8a217fa2 Olga Brani
                                                {
865 8a217fa2 Olga Brani
                                                        // Check if we are dealing with an array notation request
866 8a217fa2 Olga Brani
                                                        arrayNotation = a[i].match(__reArray);
867 8a217fa2 Olga Brani
                
868 8a217fa2 Olga Brani
                                                        if ( arrayNotation ) {
869 8a217fa2 Olga Brani
                                                                a[i] = a[i].replace(__reArray, '');
870 8a217fa2 Olga Brani
                
871 8a217fa2 Olga Brani
                                                                // Condition allows simply [] to be passed in
872 8a217fa2 Olga Brani
                                                                if ( a[i] !== "" ) {
873 8a217fa2 Olga Brani
                                                                        data = data[ a[i] ];
874 8a217fa2 Olga Brani
                                                                }
875 8a217fa2 Olga Brani
                                                                out = [];
876 8a217fa2 Olga Brani
                                                                
877 8a217fa2 Olga Brani
                                                                // Get the remainder of the nested object to get
878 8a217fa2 Olga Brani
                                                                a.splice( 0, i+1 );
879 8a217fa2 Olga Brani
                                                                innerSrc = a.join('.');
880 8a217fa2 Olga Brani
                
881 8a217fa2 Olga Brani
                                                                // Traverse each entry in the array getting the properties requested
882 8a217fa2 Olga Brani
                                                                for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
883 8a217fa2 Olga Brani
                                                                        out.push( fetchData( data[j], type, innerSrc ) );
884 8a217fa2 Olga Brani
                                                                }
885 8a217fa2 Olga Brani
                
886 8a217fa2 Olga Brani
                                                                // If a string is given in between the array notation indicators, that
887 8a217fa2 Olga Brani
                                                                // is used to join the strings together, otherwise an array is returned
888 8a217fa2 Olga Brani
                                                                var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
889 8a217fa2 Olga Brani
                                                                data = (join==="") ? out : out.join(join);
890 8a217fa2 Olga Brani
                
891 8a217fa2 Olga Brani
                                                                // The inner call to fetchData has already traversed through the remainder
892 8a217fa2 Olga Brani
                                                                // of the source requested, so we exit from the loop
893 8a217fa2 Olga Brani
                                                                break;
894 8a217fa2 Olga Brani
                                                        }
895 8a217fa2 Olga Brani
                
896 8a217fa2 Olga Brani
                                                        if ( data === null || data[ a[i] ] === undefined )
897 8a217fa2 Olga Brani
                                                        {
898 8a217fa2 Olga Brani
                                                                return undefined;
899 8a217fa2 Olga Brani
                                                        }
900 8a217fa2 Olga Brani
                                                        data = data[ a[i] ];
901 8a217fa2 Olga Brani
                                                }
902 8a217fa2 Olga Brani
                                        }
903 8a217fa2 Olga Brani
                
904 8a217fa2 Olga Brani
                                        return data;
905 8a217fa2 Olga Brani
                                };
906 8a217fa2 Olga Brani
                
907 8a217fa2 Olga Brani
                                return function (data, type) {
908 8a217fa2 Olga Brani
                                        return fetchData( data, type, mSource );
909 8a217fa2 Olga Brani
                                };
910 8a217fa2 Olga Brani
                        }
911 8a217fa2 Olga Brani
                        else
912 8a217fa2 Olga Brani
                        {
913 8a217fa2 Olga Brani
                                /* Array or flat object mapping */
914 8a217fa2 Olga Brani
                                return function (data, type) {
915 8a217fa2 Olga Brani
                                        return data[mSource];        
916 8a217fa2 Olga Brani
                                };
917 8a217fa2 Olga Brani
                        }
918 8a217fa2 Olga Brani
                }
919 8a217fa2 Olga Brani
                
920 8a217fa2 Olga Brani
                
921 8a217fa2 Olga Brani
                /**
922 8a217fa2 Olga Brani
                 * Return a function that can be used to set data from a source object, taking
923 8a217fa2 Olga Brani
                 * into account the ability to use nested objects as a source
924 8a217fa2 Olga Brani
                 *  @param {string|int|function} mSource The data source for the object
925 8a217fa2 Olga Brani
                 *  @returns {function} Data set function
926 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
927 8a217fa2 Olga Brani
                 */
928 8a217fa2 Olga Brani
                function _fnSetObjectDataFn( mSource )
929 8a217fa2 Olga Brani
                {
930 8a217fa2 Olga Brani
                        if ( mSource === null )
931 8a217fa2 Olga Brani
                        {
932 8a217fa2 Olga Brani
                                /* Nothing to do when the data source is null */
933 8a217fa2 Olga Brani
                                return function (data, val) {};
934 8a217fa2 Olga Brani
                        }
935 8a217fa2 Olga Brani
                        else if ( typeof mSource === 'function' )
936 8a217fa2 Olga Brani
                        {
937 8a217fa2 Olga Brani
                                return function (data, val) {
938 8a217fa2 Olga Brani
                                        mSource( data, 'set', val );
939 8a217fa2 Olga Brani
                                };
940 8a217fa2 Olga Brani
                        }
941 8a217fa2 Olga Brani
                        else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
942 8a217fa2 Olga Brani
                        {
943 8a217fa2 Olga Brani
                                /* Like the get, we need to get data from a nested object */
944 8a217fa2 Olga Brani
                                var setData = function (data, val, src) {
945 8a217fa2 Olga Brani
                                        var a = src.split('.'), b;
946 8a217fa2 Olga Brani
                                        var arrayNotation, o, innerSrc;
947 8a217fa2 Olga Brani
                
948 8a217fa2 Olga Brani
                                        for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
949 8a217fa2 Olga Brani
                                        {
950 8a217fa2 Olga Brani
                                                // Check if we are dealing with an array notation request
951 8a217fa2 Olga Brani
                                                arrayNotation = a[i].match(__reArray);
952 8a217fa2 Olga Brani
                
953 8a217fa2 Olga Brani
                                                if ( arrayNotation )
954 8a217fa2 Olga Brani
                                                {
955 8a217fa2 Olga Brani
                                                        a[i] = a[i].replace(__reArray, '');
956 8a217fa2 Olga Brani
                                                        data[ a[i] ] = [];
957 8a217fa2 Olga Brani
                                                        
958 8a217fa2 Olga Brani
                                                        // Get the remainder of the nested object to set so we can recurse
959 8a217fa2 Olga Brani
                                                        b = a.slice();
960 8a217fa2 Olga Brani
                                                        b.splice( 0, i+1 );
961 8a217fa2 Olga Brani
                                                        innerSrc = b.join('.');
962 8a217fa2 Olga Brani
                
963 8a217fa2 Olga Brani
                                                        // Traverse each entry in the array setting the properties requested
964 8a217fa2 Olga Brani
                                                        for ( var j=0, jLen=val.length ; j<jLen ; j++ )
965 8a217fa2 Olga Brani
                                                        {
966 8a217fa2 Olga Brani
                                                                o = {};
967 8a217fa2 Olga Brani
                                                                setData( o, val[j], innerSrc );
968 8a217fa2 Olga Brani
                                                                data[ a[i] ].push( o );
969 8a217fa2 Olga Brani
                                                        }
970 8a217fa2 Olga Brani
                
971 8a217fa2 Olga Brani
                                                        // The inner call to setData has already traversed through the remainder
972 8a217fa2 Olga Brani
                                                        // of the source and has set the data, thus we can exit here
973 8a217fa2 Olga Brani
                                                        return;
974 8a217fa2 Olga Brani
                                                }
975 8a217fa2 Olga Brani
                
976 8a217fa2 Olga Brani
                                                // If the nested object doesn't currently exist - since we are
977 8a217fa2 Olga Brani
                                                // trying to set the value - create it
978 8a217fa2 Olga Brani
                                                if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
979 8a217fa2 Olga Brani
                                                {
980 8a217fa2 Olga Brani
                                                        data[ a[i] ] = {};
981 8a217fa2 Olga Brani
                                                }
982 8a217fa2 Olga Brani
                                                data = data[ a[i] ];
983 8a217fa2 Olga Brani
                                        }
984 8a217fa2 Olga Brani
                
985 8a217fa2 Olga Brani
                                        // If array notation is used, we just want to strip it and use the property name
986 8a217fa2 Olga Brani
                                        // and assign the value. If it isn't used, then we get the result we want anyway
987 8a217fa2 Olga Brani
                                        data[ a[a.length-1].replace(__reArray, '') ] = val;
988 8a217fa2 Olga Brani
                                };
989 8a217fa2 Olga Brani
                
990 8a217fa2 Olga Brani
                                return function (data, val) {
991 8a217fa2 Olga Brani
                                        return setData( data, val, mSource );
992 8a217fa2 Olga Brani
                                };
993 8a217fa2 Olga Brani
                        }
994 8a217fa2 Olga Brani
                        else
995 8a217fa2 Olga Brani
                        {
996 8a217fa2 Olga Brani
                                /* Array or flat object mapping */
997 8a217fa2 Olga Brani
                                return function (data, val) {
998 8a217fa2 Olga Brani
                                        data[mSource] = val;        
999 8a217fa2 Olga Brani
                                };
1000 8a217fa2 Olga Brani
                        }
1001 8a217fa2 Olga Brani
                }
1002 8a217fa2 Olga Brani
                
1003 8a217fa2 Olga Brani
                
1004 8a217fa2 Olga Brani
                /**
1005 8a217fa2 Olga Brani
                 * Return an array with the full table data
1006 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1007 8a217fa2 Olga Brani
                 *  @returns array {array} aData Master data array
1008 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1009 8a217fa2 Olga Brani
                 */
1010 8a217fa2 Olga Brani
                function _fnGetDataMaster ( oSettings )
1011 8a217fa2 Olga Brani
                {
1012 8a217fa2 Olga Brani
                        var aData = [];
1013 8a217fa2 Olga Brani
                        var iLen = oSettings.aoData.length;
1014 8a217fa2 Olga Brani
                        for ( var i=0 ; i<iLen; i++ )
1015 8a217fa2 Olga Brani
                        {
1016 8a217fa2 Olga Brani
                                aData.push( oSettings.aoData[i]._aData );
1017 8a217fa2 Olga Brani
                        }
1018 8a217fa2 Olga Brani
                        return aData;
1019 8a217fa2 Olga Brani
                }
1020 8a217fa2 Olga Brani
                
1021 8a217fa2 Olga Brani
                
1022 8a217fa2 Olga Brani
                /**
1023 8a217fa2 Olga Brani
                 * Nuke the table
1024 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1025 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1026 8a217fa2 Olga Brani
                 */
1027 8a217fa2 Olga Brani
                function _fnClearTable( oSettings )
1028 8a217fa2 Olga Brani
                {
1029 8a217fa2 Olga Brani
                        oSettings.aoData.splice( 0, oSettings.aoData.length );
1030 8a217fa2 Olga Brani
                        oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
1031 8a217fa2 Olga Brani
                        oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
1032 8a217fa2 Olga Brani
                        _fnCalculateEnd( oSettings );
1033 8a217fa2 Olga Brani
                }
1034 8a217fa2 Olga Brani
                
1035 8a217fa2 Olga Brani
                
1036 8a217fa2 Olga Brani
                 /**
1037 8a217fa2 Olga Brani
                 * Take an array of integers (index array) and remove a target integer (value - not 
1038 8a217fa2 Olga Brani
                 * the key!)
1039 8a217fa2 Olga Brani
                 *  @param {array} a Index array to target
1040 8a217fa2 Olga Brani
                 *  @param {int} iTarget value to find
1041 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1042 8a217fa2 Olga Brani
                 */
1043 8a217fa2 Olga Brani
                function _fnDeleteIndex( a, iTarget )
1044 8a217fa2 Olga Brani
                {
1045 8a217fa2 Olga Brani
                        var iTargetIndex = -1;
1046 8a217fa2 Olga Brani
                        
1047 8a217fa2 Olga Brani
                        for ( var i=0, iLen=a.length ; i<iLen ; i++ )
1048 8a217fa2 Olga Brani
                        {
1049 8a217fa2 Olga Brani
                                if ( a[i] == iTarget )
1050 8a217fa2 Olga Brani
                                {
1051 8a217fa2 Olga Brani
                                        iTargetIndex = i;
1052 8a217fa2 Olga Brani
                                }
1053 8a217fa2 Olga Brani
                                else if ( a[i] > iTarget )
1054 8a217fa2 Olga Brani
                                {
1055 8a217fa2 Olga Brani
                                        a[i]--;
1056 8a217fa2 Olga Brani
                                }
1057 8a217fa2 Olga Brani
                        }
1058 8a217fa2 Olga Brani
                        
1059 8a217fa2 Olga Brani
                        if ( iTargetIndex != -1 )
1060 8a217fa2 Olga Brani
                        {
1061 8a217fa2 Olga Brani
                                a.splice( iTargetIndex, 1 );
1062 8a217fa2 Olga Brani
                        }
1063 8a217fa2 Olga Brani
                }
1064 8a217fa2 Olga Brani
                
1065 8a217fa2 Olga Brani
                
1066 8a217fa2 Olga Brani
                 /**
1067 8a217fa2 Olga Brani
                 * Call the developer defined fnRender function for a given cell (row/column) with
1068 8a217fa2 Olga Brani
                 * the required parameters and return the result.
1069 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1070 8a217fa2 Olga Brani
                 *  @param {int} iRow aoData index for the row
1071 8a217fa2 Olga Brani
                 *  @param {int} iCol aoColumns index for the column
1072 8a217fa2 Olga Brani
                 *  @returns {*} Return of the developer's fnRender function
1073 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1074 8a217fa2 Olga Brani
                 */
1075 8a217fa2 Olga Brani
                function _fnRender( oSettings, iRow, iCol )
1076 8a217fa2 Olga Brani
                {
1077 8a217fa2 Olga Brani
                        var oCol = oSettings.aoColumns[iCol];
1078 8a217fa2 Olga Brani
                
1079 8a217fa2 Olga Brani
                        return oCol.fnRender( {
1080 8a217fa2 Olga Brani
                                "iDataRow":    iRow,
1081 8a217fa2 Olga Brani
                                "iDataColumn": iCol,
1082 8a217fa2 Olga Brani
                                "oSettings":   oSettings,
1083 8a217fa2 Olga Brani
                                "aData":       oSettings.aoData[iRow]._aData,
1084 8a217fa2 Olga Brani
                                "mDataProp":   oCol.mData
1085 8a217fa2 Olga Brani
                        }, _fnGetCellData(oSettings, iRow, iCol, 'display') );
1086 8a217fa2 Olga Brani
                }
1087 8a217fa2 Olga Brani
                /**
1088 8a217fa2 Olga Brani
                 * Create a new TR element (and it's TD children) for a row
1089 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1090 8a217fa2 Olga Brani
                 *  @param {int} iRow Row to consider
1091 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1092 8a217fa2 Olga Brani
                 */
1093 8a217fa2 Olga Brani
                function _fnCreateTr ( oSettings, iRow )
1094 8a217fa2 Olga Brani
                {
1095 8a217fa2 Olga Brani
                        var oData = oSettings.aoData[iRow];
1096 8a217fa2 Olga Brani
                        var nTd;
1097 8a217fa2 Olga Brani
                
1098 8a217fa2 Olga Brani
                        if ( oData.nTr === null )
1099 8a217fa2 Olga Brani
                        {
1100 8a217fa2 Olga Brani
                                oData.nTr = document.createElement('tr');
1101 8a217fa2 Olga Brani
                
1102 8a217fa2 Olga Brani
                                /* Use a private property on the node to allow reserve mapping from the node
1103 8a217fa2 Olga Brani
                                 * to the aoData array for fast look up
1104 8a217fa2 Olga Brani
                                 */
1105 8a217fa2 Olga Brani
                                oData.nTr._DT_RowIndex = iRow;
1106 8a217fa2 Olga Brani
                
1107 8a217fa2 Olga Brani
                                /* Special parameters can be given by the data source to be used on the row */
1108 8a217fa2 Olga Brani
                                if ( oData._aData.DT_RowId )
1109 8a217fa2 Olga Brani
                                {
1110 8a217fa2 Olga Brani
                                        oData.nTr.id = oData._aData.DT_RowId;
1111 8a217fa2 Olga Brani
                                }
1112 8a217fa2 Olga Brani
                
1113 8a217fa2 Olga Brani
                                if ( oData._aData.DT_RowClass )
1114 8a217fa2 Olga Brani
                                {
1115 8a217fa2 Olga Brani
                                        oData.nTr.className = oData._aData.DT_RowClass;
1116 8a217fa2 Olga Brani
                                }
1117 8a217fa2 Olga Brani
                
1118 8a217fa2 Olga Brani
                                /* Process each column */
1119 8a217fa2 Olga Brani
                                for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1120 8a217fa2 Olga Brani
                                {
1121 8a217fa2 Olga Brani
                                        var oCol = oSettings.aoColumns[i];
1122 8a217fa2 Olga Brani
                                        nTd = document.createElement( oCol.sCellType );
1123 8a217fa2 Olga Brani
                
1124 8a217fa2 Olga Brani
                                        /* Render if needed - if bUseRendered is true then we already have the rendered
1125 8a217fa2 Olga Brani
                                         * value in the data source - so can just use that
1126 8a217fa2 Olga Brani
                                         */
1127 8a217fa2 Olga Brani
                                        nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
1128 8a217fa2 Olga Brani
                                                _fnRender( oSettings, iRow, i ) :
1129 8a217fa2 Olga Brani
                                                _fnGetCellData( oSettings, iRow, i, 'display' );
1130 8a217fa2 Olga Brani
                                
1131 8a217fa2 Olga Brani
                                        /* Add user defined class */
1132 8a217fa2 Olga Brani
                                        if ( oCol.sClass !== null )
1133 8a217fa2 Olga Brani
                                        {
1134 8a217fa2 Olga Brani
                                                nTd.className = oCol.sClass;
1135 8a217fa2 Olga Brani
                                        }
1136 8a217fa2 Olga Brani
                                        
1137 8a217fa2 Olga Brani
                                        if ( oCol.bVisible )
1138 8a217fa2 Olga Brani
                                        {
1139 8a217fa2 Olga Brani
                                                oData.nTr.appendChild( nTd );
1140 8a217fa2 Olga Brani
                                                oData._anHidden[i] = null;
1141 8a217fa2 Olga Brani
                                        }
1142 8a217fa2 Olga Brani
                                        else
1143 8a217fa2 Olga Brani
                                        {
1144 8a217fa2 Olga Brani
                                                oData._anHidden[i] = nTd;
1145 8a217fa2 Olga Brani
                                        }
1146 8a217fa2 Olga Brani
                
1147 8a217fa2 Olga Brani
                                        if ( oCol.fnCreatedCell )
1148 8a217fa2 Olga Brani
                                        {
1149 8a217fa2 Olga Brani
                                                oCol.fnCreatedCell.call( oSettings.oInstance,
1150 8a217fa2 Olga Brani
                                                        nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
1151 8a217fa2 Olga Brani
                                                );
1152 8a217fa2 Olga Brani
                                        }
1153 8a217fa2 Olga Brani
                                }
1154 8a217fa2 Olga Brani
                
1155 8a217fa2 Olga Brani
                                _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
1156 8a217fa2 Olga Brani
                        }
1157 8a217fa2 Olga Brani
                }
1158 8a217fa2 Olga Brani
                
1159 8a217fa2 Olga Brani
                
1160 8a217fa2 Olga Brani
                /**
1161 8a217fa2 Olga Brani
                 * Create the HTML header for the table
1162 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1163 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1164 8a217fa2 Olga Brani
                 */
1165 8a217fa2 Olga Brani
                function _fnBuildHead( oSettings )
1166 8a217fa2 Olga Brani
                {
1167 8a217fa2 Olga Brani
                        var i, nTh, iLen, j, jLen;
1168 8a217fa2 Olga Brani
                        var iThs = $('th, td', oSettings.nTHead).length;
1169 8a217fa2 Olga Brani
                        var iCorrector = 0;
1170 8a217fa2 Olga Brani
                        var jqChildren;
1171 8a217fa2 Olga Brani
                        
1172 8a217fa2 Olga Brani
                        /* If there is a header in place - then use it - otherwise it's going to get nuked... */
1173 8a217fa2 Olga Brani
                        if ( iThs !== 0 )
1174 8a217fa2 Olga Brani
                        {
1175 8a217fa2 Olga Brani
                                /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
1176 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1177 8a217fa2 Olga Brani
                                {
1178 8a217fa2 Olga Brani
                                        nTh = oSettings.aoColumns[i].nTh;
1179 8a217fa2 Olga Brani
                                        nTh.setAttribute('role', 'columnheader');
1180 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].bSortable )
1181 8a217fa2 Olga Brani
                                        {
1182 8a217fa2 Olga Brani
                                                nTh.setAttribute('tabindex', oSettings.iTabIndex);
1183 8a217fa2 Olga Brani
                                                nTh.setAttribute('aria-controls', oSettings.sTableId);
1184 8a217fa2 Olga Brani
                                        }
1185 8a217fa2 Olga Brani
                
1186 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].sClass !== null )
1187 8a217fa2 Olga Brani
                                        {
1188 8a217fa2 Olga Brani
                                                $(nTh).addClass( oSettings.aoColumns[i].sClass );
1189 8a217fa2 Olga Brani
                                        }
1190 8a217fa2 Olga Brani
                                        
1191 8a217fa2 Olga Brani
                                        /* Set the title of the column if it is user defined (not what was auto detected) */
1192 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
1193 8a217fa2 Olga Brani
                                        {
1194 8a217fa2 Olga Brani
                                                nTh.innerHTML = oSettings.aoColumns[i].sTitle;
1195 8a217fa2 Olga Brani
                                        }
1196 8a217fa2 Olga Brani
                                }
1197 8a217fa2 Olga Brani
                        }
1198 8a217fa2 Olga Brani
                        else
1199 8a217fa2 Olga Brani
                        {
1200 8a217fa2 Olga Brani
                                /* We don't have a header in the DOM - so we are going to have to create one */
1201 8a217fa2 Olga Brani
                                var nTr = document.createElement( "tr" );
1202 8a217fa2 Olga Brani
                                
1203 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1204 8a217fa2 Olga Brani
                                {
1205 8a217fa2 Olga Brani
                                        nTh = oSettings.aoColumns[i].nTh;
1206 8a217fa2 Olga Brani
                                        nTh.innerHTML = oSettings.aoColumns[i].sTitle;
1207 8a217fa2 Olga Brani
                                        nTh.setAttribute('tabindex', '0');
1208 8a217fa2 Olga Brani
                                        
1209 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].sClass !== null )
1210 8a217fa2 Olga Brani
                                        {
1211 8a217fa2 Olga Brani
                                                $(nTh).addClass( oSettings.aoColumns[i].sClass );
1212 8a217fa2 Olga Brani
                                        }
1213 8a217fa2 Olga Brani
                                        
1214 8a217fa2 Olga Brani
                                        nTr.appendChild( nTh );
1215 8a217fa2 Olga Brani
                                }
1216 8a217fa2 Olga Brani
                                $(oSettings.nTHead).html( '' )[0].appendChild( nTr );
1217 8a217fa2 Olga Brani
                                _fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );
1218 8a217fa2 Olga Brani
                        }
1219 8a217fa2 Olga Brani
                        
1220 8a217fa2 Olga Brani
                        /* ARIA role for the rows */        
1221 8a217fa2 Olga Brani
                        $(oSettings.nTHead).children('tr').attr('role', 'row');
1222 8a217fa2 Olga Brani
                        
1223 8a217fa2 Olga Brani
                        /* Add the extra markup needed by jQuery UI's themes */
1224 8a217fa2 Olga Brani
                        if ( oSettings.bJUI )
1225 8a217fa2 Olga Brani
                        {
1226 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1227 8a217fa2 Olga Brani
                                {
1228 8a217fa2 Olga Brani
                                        nTh = oSettings.aoColumns[i].nTh;
1229 8a217fa2 Olga Brani
                                        
1230 8a217fa2 Olga Brani
                                        var nDiv = document.createElement('div');
1231 8a217fa2 Olga Brani
                                        nDiv.className = oSettings.oClasses.sSortJUIWrapper;
1232 8a217fa2 Olga Brani
                                        $(nTh).contents().appendTo(nDiv);
1233 8a217fa2 Olga Brani
                                        
1234 8a217fa2 Olga Brani
                                        var nSpan = document.createElement('span');
1235 8a217fa2 Olga Brani
                                        nSpan.className = oSettings.oClasses.sSortIcon;
1236 8a217fa2 Olga Brani
                                        nDiv.appendChild( nSpan );
1237 8a217fa2 Olga Brani
                                        nTh.appendChild( nDiv );
1238 8a217fa2 Olga Brani
                                }
1239 8a217fa2 Olga Brani
                        }
1240 8a217fa2 Olga Brani
                        
1241 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bSort )
1242 8a217fa2 Olga Brani
                        {
1243 8a217fa2 Olga Brani
                                for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
1244 8a217fa2 Olga Brani
                                {
1245 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].bSortable !== false )
1246 8a217fa2 Olga Brani
                                        {
1247 8a217fa2 Olga Brani
                                                _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
1248 8a217fa2 Olga Brani
                                        }
1249 8a217fa2 Olga Brani
                                        else
1250 8a217fa2 Olga Brani
                                        {
1251 8a217fa2 Olga Brani
                                                $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
1252 8a217fa2 Olga Brani
                                        }
1253 8a217fa2 Olga Brani
                                }
1254 8a217fa2 Olga Brani
                        }
1255 8a217fa2 Olga Brani
                        
1256 8a217fa2 Olga Brani
                        /* Deal with the footer - add classes if required */
1257 8a217fa2 Olga Brani
                        if ( oSettings.oClasses.sFooterTH !== "" )
1258 8a217fa2 Olga Brani
                        {
1259 8a217fa2 Olga Brani
                                $(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );
1260 8a217fa2 Olga Brani
                        }
1261 8a217fa2 Olga Brani
                        
1262 8a217fa2 Olga Brani
                        /* Cache the footer elements */
1263 8a217fa2 Olga Brani
                        if ( oSettings.nTFoot !== null )
1264 8a217fa2 Olga Brani
                        {
1265 8a217fa2 Olga Brani
                                var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );
1266 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1267 8a217fa2 Olga Brani
                                {
1268 8a217fa2 Olga Brani
                                        if ( anCells[i] )
1269 8a217fa2 Olga Brani
                                        {
1270 8a217fa2 Olga Brani
                                                oSettings.aoColumns[i].nTf = anCells[i];
1271 8a217fa2 Olga Brani
                                                if ( oSettings.aoColumns[i].sClass )
1272 8a217fa2 Olga Brani
                                                {
1273 8a217fa2 Olga Brani
                                                        $(anCells[i]).addClass( oSettings.aoColumns[i].sClass );
1274 8a217fa2 Olga Brani
                                                }
1275 8a217fa2 Olga Brani
                                        }
1276 8a217fa2 Olga Brani
                                }
1277 8a217fa2 Olga Brani
                        }
1278 8a217fa2 Olga Brani
                }
1279 8a217fa2 Olga Brani
                
1280 8a217fa2 Olga Brani
                
1281 8a217fa2 Olga Brani
                /**
1282 8a217fa2 Olga Brani
                 * Draw the header (or footer) element based on the column visibility states. The
1283 8a217fa2 Olga Brani
                 * methodology here is to use the layout array from _fnDetectHeader, modified for
1284 8a217fa2 Olga Brani
                 * the instantaneous column visibility, to construct the new layout. The grid is
1285 8a217fa2 Olga Brani
                 * traversed over cell at a time in a rows x columns grid fashion, although each 
1286 8a217fa2 Olga Brani
                 * cell insert can cover multiple elements in the grid - which is tracks using the
1287 8a217fa2 Olga Brani
                 * aApplied array. Cell inserts in the grid will only occur where there isn't
1288 8a217fa2 Olga Brani
                 * already a cell in that position.
1289 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1290 8a217fa2 Olga Brani
                 *  @param array {objects} aoSource Layout array from _fnDetectHeader
1291 8a217fa2 Olga Brani
                 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, 
1292 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1293 8a217fa2 Olga Brani
                 */
1294 8a217fa2 Olga Brani
                function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
1295 8a217fa2 Olga Brani
                {
1296 8a217fa2 Olga Brani
                        var i, iLen, j, jLen, k, kLen, n, nLocalTr;
1297 8a217fa2 Olga Brani
                        var aoLocal = [];
1298 8a217fa2 Olga Brani
                        var aApplied = [];
1299 8a217fa2 Olga Brani
                        var iColumns = oSettings.aoColumns.length;
1300 8a217fa2 Olga Brani
                        var iRowspan, iColspan;
1301 8a217fa2 Olga Brani
                
1302 8a217fa2 Olga Brani
                        if (  bIncludeHidden === undefined )
1303 8a217fa2 Olga Brani
                        {
1304 8a217fa2 Olga Brani
                                bIncludeHidden = false;
1305 8a217fa2 Olga Brani
                        }
1306 8a217fa2 Olga Brani
                
1307 8a217fa2 Olga Brani
                        /* Make a copy of the master layout array, but without the visible columns in it */
1308 8a217fa2 Olga Brani
                        for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
1309 8a217fa2 Olga Brani
                        {
1310 8a217fa2 Olga Brani
                                aoLocal[i] = aoSource[i].slice();
1311 8a217fa2 Olga Brani
                                aoLocal[i].nTr = aoSource[i].nTr;
1312 8a217fa2 Olga Brani
                
1313 8a217fa2 Olga Brani
                                /* Remove any columns which are currently hidden */
1314 8a217fa2 Olga Brani
                                for ( j=iColumns-1 ; j>=0 ; j-- )
1315 8a217fa2 Olga Brani
                                {
1316 8a217fa2 Olga Brani
                                        if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
1317 8a217fa2 Olga Brani
                                        {
1318 8a217fa2 Olga Brani
                                                aoLocal[i].splice( j, 1 );
1319 8a217fa2 Olga Brani
                                        }
1320 8a217fa2 Olga Brani
                                }
1321 8a217fa2 Olga Brani
                
1322 8a217fa2 Olga Brani
                                /* Prep the applied array - it needs an element for each row */
1323 8a217fa2 Olga Brani
                                aApplied.push( [] );
1324 8a217fa2 Olga Brani
                        }
1325 8a217fa2 Olga Brani
                
1326 8a217fa2 Olga Brani
                        for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
1327 8a217fa2 Olga Brani
                        {
1328 8a217fa2 Olga Brani
                                nLocalTr = aoLocal[i].nTr;
1329 8a217fa2 Olga Brani
                                
1330 8a217fa2 Olga Brani
                                /* All cells are going to be replaced, so empty out the row */
1331 8a217fa2 Olga Brani
                                if ( nLocalTr )
1332 8a217fa2 Olga Brani
                                {
1333 8a217fa2 Olga Brani
                                        while( (n = nLocalTr.firstChild) )
1334 8a217fa2 Olga Brani
                                        {
1335 8a217fa2 Olga Brani
                                                nLocalTr.removeChild( n );
1336 8a217fa2 Olga Brani
                                        }
1337 8a217fa2 Olga Brani
                                }
1338 8a217fa2 Olga Brani
                
1339 8a217fa2 Olga Brani
                                for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
1340 8a217fa2 Olga Brani
                                {
1341 8a217fa2 Olga Brani
                                        iRowspan = 1;
1342 8a217fa2 Olga Brani
                                        iColspan = 1;
1343 8a217fa2 Olga Brani
                
1344 8a217fa2 Olga Brani
                                        /* Check to see if there is already a cell (row/colspan) covering our target
1345 8a217fa2 Olga Brani
                                         * insert point. If there is, then there is nothing to do.
1346 8a217fa2 Olga Brani
                                         */
1347 8a217fa2 Olga Brani
                                        if ( aApplied[i][j] === undefined )
1348 8a217fa2 Olga Brani
                                        {
1349 8a217fa2 Olga Brani
                                                nLocalTr.appendChild( aoLocal[i][j].cell );
1350 8a217fa2 Olga Brani
                                                aApplied[i][j] = 1;
1351 8a217fa2 Olga Brani
                
1352 8a217fa2 Olga Brani
                                                /* Expand the cell to cover as many rows as needed */
1353 8a217fa2 Olga Brani
                                                while ( aoLocal[i+iRowspan] !== undefined &&
1354 8a217fa2 Olga Brani
                                                        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
1355 8a217fa2 Olga Brani
                                                {
1356 8a217fa2 Olga Brani
                                                        aApplied[i+iRowspan][j] = 1;
1357 8a217fa2 Olga Brani
                                                        iRowspan++;
1358 8a217fa2 Olga Brani
                                                }
1359 8a217fa2 Olga Brani
                
1360 8a217fa2 Olga Brani
                                                /* Expand the cell to cover as many columns as needed */
1361 8a217fa2 Olga Brani
                                                while ( aoLocal[i][j+iColspan] !== undefined &&
1362 8a217fa2 Olga Brani
                                                        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
1363 8a217fa2 Olga Brani
                                                {
1364 8a217fa2 Olga Brani
                                                        /* Must update the applied array over the rows for the columns */
1365 8a217fa2 Olga Brani
                                                        for ( k=0 ; k<iRowspan ; k++ )
1366 8a217fa2 Olga Brani
                                                        {
1367 8a217fa2 Olga Brani
                                                                aApplied[i+k][j+iColspan] = 1;
1368 8a217fa2 Olga Brani
                                                        }
1369 8a217fa2 Olga Brani
                                                        iColspan++;
1370 8a217fa2 Olga Brani
                                                }
1371 8a217fa2 Olga Brani
                
1372 8a217fa2 Olga Brani
                                                /* Do the actual expansion in the DOM */
1373 8a217fa2 Olga Brani
                                                aoLocal[i][j].cell.rowSpan = iRowspan;
1374 8a217fa2 Olga Brani
                                                aoLocal[i][j].cell.colSpan = iColspan;
1375 8a217fa2 Olga Brani
                                        }
1376 8a217fa2 Olga Brani
                                }
1377 8a217fa2 Olga Brani
                        }
1378 8a217fa2 Olga Brani
                }
1379 8a217fa2 Olga Brani
                
1380 8a217fa2 Olga Brani
                
1381 8a217fa2 Olga Brani
                /**
1382 8a217fa2 Olga Brani
                 * Insert the required TR nodes into the table for display
1383 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1384 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1385 8a217fa2 Olga Brani
                 */
1386 8a217fa2 Olga Brani
                function _fnDraw( oSettings )
1387 8a217fa2 Olga Brani
                {
1388 8a217fa2 Olga Brani
                        /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
1389 8a217fa2 Olga Brani
                        var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
1390 8a217fa2 Olga Brani
                        if ( $.inArray( false, aPreDraw ) !== -1 )
1391 8a217fa2 Olga Brani
                        {
1392 8a217fa2 Olga Brani
                                _fnProcessingDisplay( oSettings, false );
1393 8a217fa2 Olga Brani
                                return;
1394 8a217fa2 Olga Brani
                        }
1395 8a217fa2 Olga Brani
                        
1396 8a217fa2 Olga Brani
                        var i, iLen, n;
1397 8a217fa2 Olga Brani
                        var anRows = [];
1398 8a217fa2 Olga Brani
                        var iRowCount = 0;
1399 8a217fa2 Olga Brani
                        var iStripes = oSettings.asStripeClasses.length;
1400 8a217fa2 Olga Brani
                        var iOpenRows = oSettings.aoOpenRows.length;
1401 8a217fa2 Olga Brani
                        
1402 8a217fa2 Olga Brani
                        oSettings.bDrawing = true;
1403 8a217fa2 Olga Brani
                        
1404 8a217fa2 Olga Brani
                        /* Check and see if we have an initial draw position from state saving */
1405 8a217fa2 Olga Brani
                        if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )
1406 8a217fa2 Olga Brani
                        {
1407 8a217fa2 Olga Brani
                                if ( oSettings.oFeatures.bServerSide )
1408 8a217fa2 Olga Brani
                                {
1409 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = oSettings.iInitDisplayStart;
1410 8a217fa2 Olga Brani
                                }
1411 8a217fa2 Olga Brani
                                else
1412 8a217fa2 Olga Brani
                                {
1413 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
1414 8a217fa2 Olga Brani
                                                0 : oSettings.iInitDisplayStart;
1415 8a217fa2 Olga Brani
                                }
1416 8a217fa2 Olga Brani
                                oSettings.iInitDisplayStart = -1;
1417 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
1418 8a217fa2 Olga Brani
                        }
1419 8a217fa2 Olga Brani
                        
1420 8a217fa2 Olga Brani
                        /* Server-side processing draw intercept */
1421 8a217fa2 Olga Brani
                        if ( oSettings.bDeferLoading )
1422 8a217fa2 Olga Brani
                        {
1423 8a217fa2 Olga Brani
                                oSettings.bDeferLoading = false;
1424 8a217fa2 Olga Brani
                                oSettings.iDraw++;
1425 8a217fa2 Olga Brani
                        }
1426 8a217fa2 Olga Brani
                        else if ( !oSettings.oFeatures.bServerSide )
1427 8a217fa2 Olga Brani
                        {
1428 8a217fa2 Olga Brani
                                oSettings.iDraw++;
1429 8a217fa2 Olga Brani
                        }
1430 8a217fa2 Olga Brani
                        else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
1431 8a217fa2 Olga Brani
                        {
1432 8a217fa2 Olga Brani
                                return;
1433 8a217fa2 Olga Brani
                        }
1434 8a217fa2 Olga Brani
                        
1435 8a217fa2 Olga Brani
                        if ( oSettings.aiDisplay.length !== 0 )
1436 8a217fa2 Olga Brani
                        {
1437 8a217fa2 Olga Brani
                                var iStart = oSettings._iDisplayStart;
1438 8a217fa2 Olga Brani
                                var iEnd = oSettings._iDisplayEnd;
1439 8a217fa2 Olga Brani
                                
1440 8a217fa2 Olga Brani
                                if ( oSettings.oFeatures.bServerSide )
1441 8a217fa2 Olga Brani
                                {
1442 8a217fa2 Olga Brani
                                        iStart = 0;
1443 8a217fa2 Olga Brani
                                        iEnd = oSettings.aoData.length;
1444 8a217fa2 Olga Brani
                                }
1445 8a217fa2 Olga Brani
                                
1446 8a217fa2 Olga Brani
                                for ( var j=iStart ; j<iEnd ; j++ )
1447 8a217fa2 Olga Brani
                                {
1448 8a217fa2 Olga Brani
                                        var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
1449 8a217fa2 Olga Brani
                                        if ( aoData.nTr === null )
1450 8a217fa2 Olga Brani
                                        {
1451 8a217fa2 Olga Brani
                                                _fnCreateTr( oSettings, oSettings.aiDisplay[j] );
1452 8a217fa2 Olga Brani
                                        }
1453 8a217fa2 Olga Brani
                
1454 8a217fa2 Olga Brani
                                        var nRow = aoData.nTr;
1455 8a217fa2 Olga Brani
                                        
1456 8a217fa2 Olga Brani
                                        /* Remove the old striping classes and then add the new one */
1457 8a217fa2 Olga Brani
                                        if ( iStripes !== 0 )
1458 8a217fa2 Olga Brani
                                        {
1459 8a217fa2 Olga Brani
                                                var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];
1460 8a217fa2 Olga Brani
                                                if ( aoData._sRowStripe != sStripe )
1461 8a217fa2 Olga Brani
                                                {
1462 8a217fa2 Olga Brani
                                                        $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
1463 8a217fa2 Olga Brani
                                                        aoData._sRowStripe = sStripe;
1464 8a217fa2 Olga Brani
                                                }
1465 8a217fa2 Olga Brani
                                        }
1466 8a217fa2 Olga Brani
                                        
1467 8a217fa2 Olga Brani
                                        /* Row callback functions - might want to manipulate the row */
1468 8a217fa2 Olga Brani
                                        _fnCallbackFire( oSettings, 'aoRowCallback', null, 
1469 8a217fa2 Olga Brani
                                                [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
1470 8a217fa2 Olga Brani
                                        
1471 8a217fa2 Olga Brani
                                        anRows.push( nRow );
1472 8a217fa2 Olga Brani
                                        iRowCount++;
1473 8a217fa2 Olga Brani
                                        
1474 8a217fa2 Olga Brani
                                        /* If there is an open row - and it is attached to this parent - attach it on redraw */
1475 8a217fa2 Olga Brani
                                        if ( iOpenRows !== 0 )
1476 8a217fa2 Olga Brani
                                        {
1477 8a217fa2 Olga Brani
                                                for ( var k=0 ; k<iOpenRows ; k++ )
1478 8a217fa2 Olga Brani
                                                {
1479 8a217fa2 Olga Brani
                                                        if ( nRow == oSettings.aoOpenRows[k].nParent )
1480 8a217fa2 Olga Brani
                                                        {
1481 8a217fa2 Olga Brani
                                                                anRows.push( oSettings.aoOpenRows[k].nTr );
1482 8a217fa2 Olga Brani
                                                                break;
1483 8a217fa2 Olga Brani
                                                        }
1484 8a217fa2 Olga Brani
                                                }
1485 8a217fa2 Olga Brani
                                        }
1486 8a217fa2 Olga Brani
                                }
1487 8a217fa2 Olga Brani
                        }
1488 8a217fa2 Olga Brani
                        else
1489 8a217fa2 Olga Brani
                        {
1490 8a217fa2 Olga Brani
                                /* Table is empty - create a row with an empty message in it */
1491 8a217fa2 Olga Brani
                                anRows[ 0 ] = document.createElement( 'tr' );
1492 8a217fa2 Olga Brani
                                
1493 8a217fa2 Olga Brani
                                if ( oSettings.asStripeClasses[0] )
1494 8a217fa2 Olga Brani
                                {
1495 8a217fa2 Olga Brani
                                        anRows[ 0 ].className = oSettings.asStripeClasses[0];
1496 8a217fa2 Olga Brani
                                }
1497 8a217fa2 Olga Brani
                
1498 8a217fa2 Olga Brani
                                var oLang = oSettings.oLanguage;
1499 8a217fa2 Olga Brani
                                var sZero = oLang.sZeroRecords;
1500 8a217fa2 Olga Brani
                                if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
1501 8a217fa2 Olga Brani
                                {
1502 8a217fa2 Olga Brani
                                        sZero = oLang.sLoadingRecords;
1503 8a217fa2 Olga Brani
                                }
1504 8a217fa2 Olga Brani
                                else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
1505 8a217fa2 Olga Brani
                                {
1506 8a217fa2 Olga Brani
                                        sZero = oLang.sEmptyTable;
1507 8a217fa2 Olga Brani
                                }
1508 8a217fa2 Olga Brani
                
1509 8a217fa2 Olga Brani
                                var nTd = document.createElement( 'td' );
1510 8a217fa2 Olga Brani
                                nTd.setAttribute( 'valign', "top" );
1511 8a217fa2 Olga Brani
                                nTd.colSpan = _fnVisbleColumns( oSettings );
1512 8a217fa2 Olga Brani
                                nTd.className = oSettings.oClasses.sRowEmpty;
1513 8a217fa2 Olga Brani
                                nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
1514 8a217fa2 Olga Brani
                                
1515 8a217fa2 Olga Brani
                                anRows[ iRowCount ].appendChild( nTd );
1516 8a217fa2 Olga Brani
                        }
1517 8a217fa2 Olga Brani
                        
1518 8a217fa2 Olga Brani
                        /* Header and footer callbacks */
1519 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], 
1520 8a217fa2 Olga Brani
                                _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
1521 8a217fa2 Olga Brani
                        
1522 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], 
1523 8a217fa2 Olga Brani
                                _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
1524 8a217fa2 Olga Brani
                        
1525 8a217fa2 Olga Brani
                        /* 
1526 8a217fa2 Olga Brani
                         * Need to remove any old row from the display - note we can't just empty the tbody using
1527 8a217fa2 Olga Brani
                         * $().html('') since this will unbind the jQuery event handlers (even although the node 
1528 8a217fa2 Olga Brani
                         * still exists!) - equally we can't use innerHTML, since IE throws an exception.
1529 8a217fa2 Olga Brani
                         */
1530 8a217fa2 Olga Brani
                        var
1531 8a217fa2 Olga Brani
                                nAddFrag = document.createDocumentFragment(),
1532 8a217fa2 Olga Brani
                                nRemoveFrag = document.createDocumentFragment(),
1533 8a217fa2 Olga Brani
                                nBodyPar, nTrs;
1534 8a217fa2 Olga Brani
                        
1535 8a217fa2 Olga Brani
                        if ( oSettings.nTBody )
1536 8a217fa2 Olga Brani
                        {
1537 8a217fa2 Olga Brani
                                nBodyPar = oSettings.nTBody.parentNode;
1538 8a217fa2 Olga Brani
                                nRemoveFrag.appendChild( oSettings.nTBody );
1539 8a217fa2 Olga Brani
                                
1540 8a217fa2 Olga Brani
                                /* When doing infinite scrolling, only remove child rows when sorting, filtering or start
1541 8a217fa2 Olga Brani
                                 * up. When not infinite scroll, always do it.
1542 8a217fa2 Olga Brani
                                 */
1543 8a217fa2 Olga Brani
                                if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
1544 8a217fa2 Olga Brani
                                         oSettings.bSorted || oSettings.bFiltered )
1545 8a217fa2 Olga Brani
                                {
1546 8a217fa2 Olga Brani
                                        while( (n = oSettings.nTBody.firstChild) )
1547 8a217fa2 Olga Brani
                                        {
1548 8a217fa2 Olga Brani
                                                oSettings.nTBody.removeChild( n );
1549 8a217fa2 Olga Brani
                                        }
1550 8a217fa2 Olga Brani
                                }
1551 8a217fa2 Olga Brani
                                
1552 8a217fa2 Olga Brani
                                /* Put the draw table into the dom */
1553 8a217fa2 Olga Brani
                                for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
1554 8a217fa2 Olga Brani
                                {
1555 8a217fa2 Olga Brani
                                        nAddFrag.appendChild( anRows[i] );
1556 8a217fa2 Olga Brani
                                }
1557 8a217fa2 Olga Brani
                                
1558 8a217fa2 Olga Brani
                                oSettings.nTBody.appendChild( nAddFrag );
1559 8a217fa2 Olga Brani
                                if ( nBodyPar !== null )
1560 8a217fa2 Olga Brani
                                {
1561 8a217fa2 Olga Brani
                                        nBodyPar.appendChild( oSettings.nTBody );
1562 8a217fa2 Olga Brani
                                }
1563 8a217fa2 Olga Brani
                        }
1564 8a217fa2 Olga Brani
                        
1565 8a217fa2 Olga Brani
                        /* Call all required callback functions for the end of a draw */
1566 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
1567 8a217fa2 Olga Brani
                        
1568 8a217fa2 Olga Brani
                        /* Draw is complete, sorting and filtering must be as well */
1569 8a217fa2 Olga Brani
                        oSettings.bSorted = false;
1570 8a217fa2 Olga Brani
                        oSettings.bFiltered = false;
1571 8a217fa2 Olga Brani
                        oSettings.bDrawing = false;
1572 8a217fa2 Olga Brani
                        
1573 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bServerSide )
1574 8a217fa2 Olga Brani
                        {
1575 8a217fa2 Olga Brani
                                _fnProcessingDisplay( oSettings, false );
1576 8a217fa2 Olga Brani
                                if ( !oSettings._bInitComplete )
1577 8a217fa2 Olga Brani
                                {
1578 8a217fa2 Olga Brani
                                        _fnInitComplete( oSettings );
1579 8a217fa2 Olga Brani
                                }
1580 8a217fa2 Olga Brani
                        }
1581 8a217fa2 Olga Brani
                }
1582 8a217fa2 Olga Brani
                
1583 8a217fa2 Olga Brani
                
1584 8a217fa2 Olga Brani
                /**
1585 8a217fa2 Olga Brani
                 * Redraw the table - taking account of the various features which are enabled
1586 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1587 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1588 8a217fa2 Olga Brani
                 */
1589 8a217fa2 Olga Brani
                function _fnReDraw( oSettings )
1590 8a217fa2 Olga Brani
                {
1591 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bSort )
1592 8a217fa2 Olga Brani
                        {
1593 8a217fa2 Olga Brani
                                /* Sorting will refilter and draw for us */
1594 8a217fa2 Olga Brani
                                _fnSort( oSettings, oSettings.oPreviousSearch );
1595 8a217fa2 Olga Brani
                        }
1596 8a217fa2 Olga Brani
                        else if ( oSettings.oFeatures.bFilter )
1597 8a217fa2 Olga Brani
                        {
1598 8a217fa2 Olga Brani
                                /* Filtering will redraw for us */
1599 8a217fa2 Olga Brani
                                _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
1600 8a217fa2 Olga Brani
                        }
1601 8a217fa2 Olga Brani
                        else
1602 8a217fa2 Olga Brani
                        {
1603 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
1604 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
1605 8a217fa2 Olga Brani
                        }
1606 8a217fa2 Olga Brani
                }
1607 8a217fa2 Olga Brani
                
1608 8a217fa2 Olga Brani
                
1609 8a217fa2 Olga Brani
                /**
1610 8a217fa2 Olga Brani
                 * Add the options to the page HTML for the table
1611 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1612 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1613 8a217fa2 Olga Brani
                 */
1614 8a217fa2 Olga Brani
                function _fnAddOptionsHtml ( oSettings )
1615 8a217fa2 Olga Brani
                {
1616 8a217fa2 Olga Brani
                        /*
1617 8a217fa2 Olga Brani
                         * Create a temporary, empty, div which we can later on replace with what we have generated
1618 8a217fa2 Olga Brani
                         * we do it this way to rendering the 'options' html offline - speed :-)
1619 8a217fa2 Olga Brani
                         */
1620 8a217fa2 Olga Brani
                        var nHolding = $('<div></div>')[0];
1621 8a217fa2 Olga Brani
                        oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
1622 8a217fa2 Olga Brani
                        
1623 8a217fa2 Olga Brani
                        /* 
1624 8a217fa2 Olga Brani
                         * All DataTables are wrapped in a div
1625 8a217fa2 Olga Brani
                         */
1626 8a217fa2 Olga Brani
                        oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0];
1627 8a217fa2 Olga Brani
                        oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
1628 8a217fa2 Olga Brani
                
1629 8a217fa2 Olga Brani
                        /* Track where we want to insert the option */
1630 8a217fa2 Olga Brani
                        var nInsertNode = oSettings.nTableWrapper;
1631 8a217fa2 Olga Brani
                        
1632 8a217fa2 Olga Brani
                        /* Loop over the user set positioning and place the elements as needed */
1633 8a217fa2 Olga Brani
                        var aDom = oSettings.sDom.split('');
1634 8a217fa2 Olga Brani
                        var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
1635 8a217fa2 Olga Brani
                        for ( var i=0 ; i<aDom.length ; i++ )
1636 8a217fa2 Olga Brani
                        {
1637 8a217fa2 Olga Brani
                                iPushFeature = 0;
1638 8a217fa2 Olga Brani
                                cOption = aDom[i];
1639 8a217fa2 Olga Brani
                                
1640 8a217fa2 Olga Brani
                                if ( cOption == '<' )
1641 8a217fa2 Olga Brani
                                {
1642 8a217fa2 Olga Brani
                                        /* New container div */
1643 8a217fa2 Olga Brani
                                        nNewNode = $('<div></div>')[0];
1644 8a217fa2 Olga Brani
                                        
1645 8a217fa2 Olga Brani
                                        /* Check to see if we should append an id and/or a class name to the container */
1646 8a217fa2 Olga Brani
                                        cNext = aDom[i+1];
1647 8a217fa2 Olga Brani
                                        if ( cNext == "'" || cNext == '"' )
1648 8a217fa2 Olga Brani
                                        {
1649 8a217fa2 Olga Brani
                                                sAttr = "";
1650 8a217fa2 Olga Brani
                                                j = 2;
1651 8a217fa2 Olga Brani
                                                while ( aDom[i+j] != cNext )
1652 8a217fa2 Olga Brani
                                                {
1653 8a217fa2 Olga Brani
                                                        sAttr += aDom[i+j];
1654 8a217fa2 Olga Brani
                                                        j++;
1655 8a217fa2 Olga Brani
                                                }
1656 8a217fa2 Olga Brani
                                                
1657 8a217fa2 Olga Brani
                                                /* Replace jQuery UI constants */
1658 8a217fa2 Olga Brani
                                                if ( sAttr == "H" )
1659 8a217fa2 Olga Brani
                                                {
1660 8a217fa2 Olga Brani
                                                        sAttr = oSettings.oClasses.sJUIHeader;
1661 8a217fa2 Olga Brani
                                                }
1662 8a217fa2 Olga Brani
                                                else if ( sAttr == "F" )
1663 8a217fa2 Olga Brani
                                                {
1664 8a217fa2 Olga Brani
                                                        sAttr = oSettings.oClasses.sJUIFooter;
1665 8a217fa2 Olga Brani
                                                }
1666 8a217fa2 Olga Brani
                                                
1667 8a217fa2 Olga Brani
                                                /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
1668 8a217fa2 Olga Brani
                                                 * breaks the string into parts and applies them as needed
1669 8a217fa2 Olga Brani
                                                 */
1670 8a217fa2 Olga Brani
                                                if ( sAttr.indexOf('.') != -1 )
1671 8a217fa2 Olga Brani
                                                {
1672 8a217fa2 Olga Brani
                                                        var aSplit = sAttr.split('.');
1673 8a217fa2 Olga Brani
                                                        nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
1674 8a217fa2 Olga Brani
                                                        nNewNode.className = aSplit[1];
1675 8a217fa2 Olga Brani
                                                }
1676 8a217fa2 Olga Brani
                                                else if ( sAttr.charAt(0) == "#" )
1677 8a217fa2 Olga Brani
                                                {
1678 8a217fa2 Olga Brani
                                                        nNewNode.id = sAttr.substr(1, sAttr.length-1);
1679 8a217fa2 Olga Brani
                                                }
1680 8a217fa2 Olga Brani
                                                else
1681 8a217fa2 Olga Brani
                                                {
1682 8a217fa2 Olga Brani
                                                        nNewNode.className = sAttr;
1683 8a217fa2 Olga Brani
                                                }
1684 8a217fa2 Olga Brani
                                                
1685 8a217fa2 Olga Brani
                                                i += j; /* Move along the position array */
1686 8a217fa2 Olga Brani
                                        }
1687 8a217fa2 Olga Brani
                                        
1688 8a217fa2 Olga Brani
                                        nInsertNode.appendChild( nNewNode );
1689 8a217fa2 Olga Brani
                                        nInsertNode = nNewNode;
1690 8a217fa2 Olga Brani
                                }
1691 8a217fa2 Olga Brani
                                else if ( cOption == '>' )
1692 8a217fa2 Olga Brani
                                {
1693 8a217fa2 Olga Brani
                                        /* End container div */
1694 8a217fa2 Olga Brani
                                        nInsertNode = nInsertNode.parentNode;
1695 8a217fa2 Olga Brani
                                }
1696 8a217fa2 Olga Brani
                                else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
1697 8a217fa2 Olga Brani
                                {
1698 8a217fa2 Olga Brani
                                        /* Length */
1699 8a217fa2 Olga Brani
                                        nTmp = _fnFeatureHtmlLength( oSettings );
1700 8a217fa2 Olga Brani
                                        iPushFeature = 1;
1701 8a217fa2 Olga Brani
                                }
1702 8a217fa2 Olga Brani
                                else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
1703 8a217fa2 Olga Brani
                                {
1704 8a217fa2 Olga Brani
                                        /* Filter */
1705 8a217fa2 Olga Brani
                                        nTmp = _fnFeatureHtmlFilter( oSettings );
1706 8a217fa2 Olga Brani
                                        iPushFeature = 1;
1707 8a217fa2 Olga Brani
                                }
1708 8a217fa2 Olga Brani
                                else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
1709 8a217fa2 Olga Brani
                                {
1710 8a217fa2 Olga Brani
                                        /* pRocessing */
1711 8a217fa2 Olga Brani
                                        nTmp = _fnFeatureHtmlProcessing( oSettings );
1712 8a217fa2 Olga Brani
                                        iPushFeature = 1;
1713 8a217fa2 Olga Brani
                                }
1714 8a217fa2 Olga Brani
                                else if ( cOption == 't' )
1715 8a217fa2 Olga Brani
                                {
1716 8a217fa2 Olga Brani
                                        /* Table */
1717 8a217fa2 Olga Brani
                                        nTmp = _fnFeatureHtmlTable( oSettings );
1718 8a217fa2 Olga Brani
                                        iPushFeature = 1;
1719 8a217fa2 Olga Brani
                                }
1720 8a217fa2 Olga Brani
                                else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
1721 8a217fa2 Olga Brani
                                {
1722 8a217fa2 Olga Brani
                                        /* Info */
1723 8a217fa2 Olga Brani
                                        nTmp = _fnFeatureHtmlInfo( oSettings );
1724 8a217fa2 Olga Brani
                                        iPushFeature = 1;
1725 8a217fa2 Olga Brani
                                }
1726 8a217fa2 Olga Brani
                                else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
1727 8a217fa2 Olga Brani
                                {
1728 8a217fa2 Olga Brani
                                        /* Pagination */
1729 8a217fa2 Olga Brani
                                        nTmp = _fnFeatureHtmlPaginate( oSettings );
1730 8a217fa2 Olga Brani
                                        iPushFeature = 1;
1731 8a217fa2 Olga Brani
                                }
1732 8a217fa2 Olga Brani
                                else if ( DataTable.ext.aoFeatures.length !== 0 )
1733 8a217fa2 Olga Brani
                                {
1734 8a217fa2 Olga Brani
                                        /* Plug-in features */
1735 8a217fa2 Olga Brani
                                        var aoFeatures = DataTable.ext.aoFeatures;
1736 8a217fa2 Olga Brani
                                        for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
1737 8a217fa2 Olga Brani
                                        {
1738 8a217fa2 Olga Brani
                                                if ( cOption == aoFeatures[k].cFeature )
1739 8a217fa2 Olga Brani
                                                {
1740 8a217fa2 Olga Brani
                                                        nTmp = aoFeatures[k].fnInit( oSettings );
1741 8a217fa2 Olga Brani
                                                        if ( nTmp )
1742 8a217fa2 Olga Brani
                                                        {
1743 8a217fa2 Olga Brani
                                                                iPushFeature = 1;
1744 8a217fa2 Olga Brani
                                                        }
1745 8a217fa2 Olga Brani
                                                        break;
1746 8a217fa2 Olga Brani
                                                }
1747 8a217fa2 Olga Brani
                                        }
1748 8a217fa2 Olga Brani
                                }
1749 8a217fa2 Olga Brani
                                
1750 8a217fa2 Olga Brani
                                /* Add to the 2D features array */
1751 8a217fa2 Olga Brani
                                if ( iPushFeature == 1 && nTmp !== null )
1752 8a217fa2 Olga Brani
                                {
1753 8a217fa2 Olga Brani
                                        if ( typeof oSettings.aanFeatures[cOption] !== 'object' )
1754 8a217fa2 Olga Brani
                                        {
1755 8a217fa2 Olga Brani
                                                oSettings.aanFeatures[cOption] = [];
1756 8a217fa2 Olga Brani
                                        }
1757 8a217fa2 Olga Brani
                                        oSettings.aanFeatures[cOption].push( nTmp );
1758 8a217fa2 Olga Brani
                                        nInsertNode.appendChild( nTmp );
1759 8a217fa2 Olga Brani
                                }
1760 8a217fa2 Olga Brani
                        }
1761 8a217fa2 Olga Brani
                        
1762 8a217fa2 Olga Brani
                        /* Built our DOM structure - replace the holding div with what we want */
1763 8a217fa2 Olga Brani
                        nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
1764 8a217fa2 Olga Brani
                }
1765 8a217fa2 Olga Brani
                
1766 8a217fa2 Olga Brani
                
1767 8a217fa2 Olga Brani
                /**
1768 8a217fa2 Olga Brani
                 * Use the DOM source to create up an array of header cells. The idea here is to
1769 8a217fa2 Olga Brani
                 * create a layout grid (array) of rows x columns, which contains a reference
1770 8a217fa2 Olga Brani
                 * to the cell that that point in the grid (regardless of col/rowspan), such that
1771 8a217fa2 Olga Brani
                 * any column / row could be removed and the new grid constructed
1772 8a217fa2 Olga Brani
                 *  @param array {object} aLayout Array to store the calculated layout in
1773 8a217fa2 Olga Brani
                 *  @param {node} nThead The header/footer element for the table
1774 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1775 8a217fa2 Olga Brani
                 */
1776 8a217fa2 Olga Brani
                function _fnDetectHeader ( aLayout, nThead )
1777 8a217fa2 Olga Brani
                {
1778 8a217fa2 Olga Brani
                        var nTrs = $(nThead).children('tr');
1779 8a217fa2 Olga Brani
                        var nTr, nCell;
1780 8a217fa2 Olga Brani
                        var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
1781 8a217fa2 Olga Brani
                        var bUnique;
1782 8a217fa2 Olga Brani
                        var fnShiftCol = function ( a, i, j ) {
1783 8a217fa2 Olga Brani
                                var k = a[i];
1784 8a217fa2 Olga Brani
                                while ( k[j] ) {
1785 8a217fa2 Olga Brani
                                        j++;
1786 8a217fa2 Olga Brani
                                }
1787 8a217fa2 Olga Brani
                                return j;
1788 8a217fa2 Olga Brani
                        };
1789 8a217fa2 Olga Brani
                
1790 8a217fa2 Olga Brani
                        aLayout.splice( 0, aLayout.length );
1791 8a217fa2 Olga Brani
                        
1792 8a217fa2 Olga Brani
                        /* We know how many rows there are in the layout - so prep it */
1793 8a217fa2 Olga Brani
                        for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
1794 8a217fa2 Olga Brani
                        {
1795 8a217fa2 Olga Brani
                                aLayout.push( [] );
1796 8a217fa2 Olga Brani
                        }
1797 8a217fa2 Olga Brani
                        
1798 8a217fa2 Olga Brani
                        /* Calculate a layout array */
1799 8a217fa2 Olga Brani
                        for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
1800 8a217fa2 Olga Brani
                        {
1801 8a217fa2 Olga Brani
                                nTr = nTrs[i];
1802 8a217fa2 Olga Brani
                                iColumn = 0;
1803 8a217fa2 Olga Brani
                                
1804 8a217fa2 Olga Brani
                                /* For every cell in the row... */
1805 8a217fa2 Olga Brani
                                nCell = nTr.firstChild;
1806 8a217fa2 Olga Brani
                                while ( nCell ) {
1807 8a217fa2 Olga Brani
                                        if ( nCell.nodeName.toUpperCase() == "TD" ||
1808 8a217fa2 Olga Brani
                                             nCell.nodeName.toUpperCase() == "TH" )
1809 8a217fa2 Olga Brani
                                        {
1810 8a217fa2 Olga Brani
                                                /* Get the col and rowspan attributes from the DOM and sanitise them */
1811 8a217fa2 Olga Brani
                                                iColspan = nCell.getAttribute('colspan') * 1;
1812 8a217fa2 Olga Brani
                                                iRowspan = nCell.getAttribute('rowspan') * 1;
1813 8a217fa2 Olga Brani
                                                iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
1814 8a217fa2 Olga Brani
                                                iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
1815 8a217fa2 Olga Brani
                
1816 8a217fa2 Olga Brani
                                                /* There might be colspan cells already in this row, so shift our target 
1817 8a217fa2 Olga Brani
                                                 * accordingly
1818 8a217fa2 Olga Brani
                                                 */
1819 8a217fa2 Olga Brani
                                                iColShifted = fnShiftCol( aLayout, i, iColumn );
1820 8a217fa2 Olga Brani
                                                
1821 8a217fa2 Olga Brani
                                                /* Cache calculation for unique columns */
1822 8a217fa2 Olga Brani
                                                bUnique = iColspan === 1 ? true : false;
1823 8a217fa2 Olga Brani
                                                
1824 8a217fa2 Olga Brani
                                                /* If there is col / rowspan, copy the information into the layout grid */
1825 8a217fa2 Olga Brani
                                                for ( l=0 ; l<iColspan ; l++ )
1826 8a217fa2 Olga Brani
                                                {
1827 8a217fa2 Olga Brani
                                                        for ( k=0 ; k<iRowspan ; k++ )
1828 8a217fa2 Olga Brani
                                                        {
1829 8a217fa2 Olga Brani
                                                                aLayout[i+k][iColShifted+l] = {
1830 8a217fa2 Olga Brani
                                                                        "cell": nCell,
1831 8a217fa2 Olga Brani
                                                                        "unique": bUnique
1832 8a217fa2 Olga Brani
                                                                };
1833 8a217fa2 Olga Brani
                                                                aLayout[i+k].nTr = nTr;
1834 8a217fa2 Olga Brani
                                                        }
1835 8a217fa2 Olga Brani
                                                }
1836 8a217fa2 Olga Brani
                                        }
1837 8a217fa2 Olga Brani
                                        nCell = nCell.nextSibling;
1838 8a217fa2 Olga Brani
                                }
1839 8a217fa2 Olga Brani
                        }
1840 8a217fa2 Olga Brani
                }
1841 8a217fa2 Olga Brani
                
1842 8a217fa2 Olga Brani
                
1843 8a217fa2 Olga Brani
                /**
1844 8a217fa2 Olga Brani
                 * Get an array of unique th elements, one for each column
1845 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1846 8a217fa2 Olga Brani
                 *  @param {node} nHeader automatically detect the layout from this node - optional
1847 8a217fa2 Olga Brani
                 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
1848 8a217fa2 Olga Brani
                 *  @returns array {node} aReturn list of unique th's
1849 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1850 8a217fa2 Olga Brani
                 */
1851 8a217fa2 Olga Brani
                function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
1852 8a217fa2 Olga Brani
                {
1853 8a217fa2 Olga Brani
                        var aReturn = [];
1854 8a217fa2 Olga Brani
                        if ( !aLayout )
1855 8a217fa2 Olga Brani
                        {
1856 8a217fa2 Olga Brani
                                aLayout = oSettings.aoHeader;
1857 8a217fa2 Olga Brani
                                if ( nHeader )
1858 8a217fa2 Olga Brani
                                {
1859 8a217fa2 Olga Brani
                                        aLayout = [];
1860 8a217fa2 Olga Brani
                                        _fnDetectHeader( aLayout, nHeader );
1861 8a217fa2 Olga Brani
                                }
1862 8a217fa2 Olga Brani
                        }
1863 8a217fa2 Olga Brani
                
1864 8a217fa2 Olga Brani
                        for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
1865 8a217fa2 Olga Brani
                        {
1866 8a217fa2 Olga Brani
                                for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
1867 8a217fa2 Olga Brani
                                {
1868 8a217fa2 Olga Brani
                                        if ( aLayout[i][j].unique && 
1869 8a217fa2 Olga Brani
                                                 (!aReturn[j] || !oSettings.bSortCellsTop) )
1870 8a217fa2 Olga Brani
                                        {
1871 8a217fa2 Olga Brani
                                                aReturn[j] = aLayout[i][j].cell;
1872 8a217fa2 Olga Brani
                                        }
1873 8a217fa2 Olga Brani
                                }
1874 8a217fa2 Olga Brani
                        }
1875 8a217fa2 Olga Brani
                        
1876 8a217fa2 Olga Brani
                        return aReturn;
1877 8a217fa2 Olga Brani
                }
1878 8a217fa2 Olga Brani
                
1879 8a217fa2 Olga Brani
                
1880 8a217fa2 Olga Brani
                
1881 8a217fa2 Olga Brani
                /**
1882 8a217fa2 Olga Brani
                 * Update the table using an Ajax call
1883 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1884 8a217fa2 Olga Brani
                 *  @returns {boolean} Block the table drawing or not
1885 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1886 8a217fa2 Olga Brani
                 */
1887 8a217fa2 Olga Brani
                function _fnAjaxUpdate( oSettings )
1888 8a217fa2 Olga Brani
                {
1889 8a217fa2 Olga Brani
                        if ( oSettings.bAjaxDataGet )
1890 8a217fa2 Olga Brani
                        {
1891 8a217fa2 Olga Brani
                                oSettings.iDraw++;
1892 8a217fa2 Olga Brani
                                _fnProcessingDisplay( oSettings, true );
1893 8a217fa2 Olga Brani
                                var iColumns = oSettings.aoColumns.length;
1894 8a217fa2 Olga Brani
                                var aoData = _fnAjaxParameters( oSettings );
1895 8a217fa2 Olga Brani
                                _fnServerParams( oSettings, aoData );
1896 8a217fa2 Olga Brani
                                
1897 8a217fa2 Olga Brani
                                oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
1898 8a217fa2 Olga Brani
                                        function(json) {
1899 8a217fa2 Olga Brani
                                                _fnAjaxUpdateDraw( oSettings, json );
1900 8a217fa2 Olga Brani
                                        }, oSettings );
1901 8a217fa2 Olga Brani
                                return false;
1902 8a217fa2 Olga Brani
                        }
1903 8a217fa2 Olga Brani
                        else
1904 8a217fa2 Olga Brani
                        {
1905 8a217fa2 Olga Brani
                                return true;
1906 8a217fa2 Olga Brani
                        }
1907 8a217fa2 Olga Brani
                }
1908 8a217fa2 Olga Brani
                
1909 8a217fa2 Olga Brani
                
1910 8a217fa2 Olga Brani
                /**
1911 8a217fa2 Olga Brani
                 * Build up the parameters in an object needed for a server-side processing request
1912 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1913 8a217fa2 Olga Brani
                 *  @returns {bool} block the table drawing or not
1914 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1915 8a217fa2 Olga Brani
                 */
1916 8a217fa2 Olga Brani
                function _fnAjaxParameters( oSettings )
1917 8a217fa2 Olga Brani
                {
1918 8a217fa2 Olga Brani
                        var iColumns = oSettings.aoColumns.length;
1919 8a217fa2 Olga Brani
                        var aoData = [], mDataProp, aaSort, aDataSort;
1920 8a217fa2 Olga Brani
                        var i, j;
1921 8a217fa2 Olga Brani
                        
1922 8a217fa2 Olga Brani
                        aoData.push( { "name": "sEcho",          "value": oSettings.iDraw } );
1923 8a217fa2 Olga Brani
                        aoData.push( { "name": "iColumns",       "value": iColumns } );
1924 8a217fa2 Olga Brani
                        aoData.push( { "name": "sColumns",       "value": _fnColumnOrdering(oSettings) } );
1925 8a217fa2 Olga Brani
                        aoData.push( { "name": "iDisplayStart",  "value": oSettings._iDisplayStart } );
1926 8a217fa2 Olga Brani
                        aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
1927 8a217fa2 Olga Brani
                                oSettings._iDisplayLength : -1 } );
1928 8a217fa2 Olga Brani
                                
1929 8a217fa2 Olga Brani
                        for ( i=0 ; i<iColumns ; i++ )
1930 8a217fa2 Olga Brani
                        {
1931 8a217fa2 Olga Brani
                          mDataProp = oSettings.aoColumns[i].mData;
1932 8a217fa2 Olga Brani
                                aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
1933 8a217fa2 Olga Brani
                        }
1934 8a217fa2 Olga Brani
                        
1935 8a217fa2 Olga Brani
                        /* Filtering */
1936 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bFilter !== false )
1937 8a217fa2 Olga Brani
                        {
1938 8a217fa2 Olga Brani
                                aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
1939 8a217fa2 Olga Brani
                                aoData.push( { "name": "bRegex",  "value": oSettings.oPreviousSearch.bRegex } );
1940 8a217fa2 Olga Brani
                                for ( i=0 ; i<iColumns ; i++ )
1941 8a217fa2 Olga Brani
                                {
1942 8a217fa2 Olga Brani
                                        aoData.push( { "name": "sSearch_"+i,     "value": oSettings.aoPreSearchCols[i].sSearch } );
1943 8a217fa2 Olga Brani
                                        aoData.push( { "name": "bRegex_"+i,      "value": oSettings.aoPreSearchCols[i].bRegex } );
1944 8a217fa2 Olga Brani
                                        aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
1945 8a217fa2 Olga Brani
                                }
1946 8a217fa2 Olga Brani
                        }
1947 8a217fa2 Olga Brani
                        
1948 8a217fa2 Olga Brani
                        /* Sorting */
1949 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bSort !== false )
1950 8a217fa2 Olga Brani
                        {
1951 8a217fa2 Olga Brani
                                var iCounter = 0;
1952 8a217fa2 Olga Brani
                
1953 8a217fa2 Olga Brani
                                aaSort = ( oSettings.aaSortingFixed !== null ) ?
1954 8a217fa2 Olga Brani
                                        oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
1955 8a217fa2 Olga Brani
                                        oSettings.aaSorting.slice();
1956 8a217fa2 Olga Brani
                                
1957 8a217fa2 Olga Brani
                                for ( i=0 ; i<aaSort.length ; i++ )
1958 8a217fa2 Olga Brani
                                {
1959 8a217fa2 Olga Brani
                                        aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
1960 8a217fa2 Olga Brani
                                        
1961 8a217fa2 Olga Brani
                                        for ( j=0 ; j<aDataSort.length ; j++ )
1962 8a217fa2 Olga Brani
                                        {
1963 8a217fa2 Olga Brani
                                                aoData.push( { "name": "iSortCol_"+iCounter,  "value": aDataSort[j] } );
1964 8a217fa2 Olga Brani
                                                aoData.push( { "name": "sSortDir_"+iCounter,  "value": aaSort[i][1] } );
1965 8a217fa2 Olga Brani
                                                iCounter++;
1966 8a217fa2 Olga Brani
                                        }
1967 8a217fa2 Olga Brani
                                }
1968 8a217fa2 Olga Brani
                                aoData.push( { "name": "iSortingCols",   "value": iCounter } );
1969 8a217fa2 Olga Brani
                                
1970 8a217fa2 Olga Brani
                                for ( i=0 ; i<iColumns ; i++ )
1971 8a217fa2 Olga Brani
                                {
1972 8a217fa2 Olga Brani
                                        aoData.push( { "name": "bSortable_"+i,  "value": oSettings.aoColumns[i].bSortable } );
1973 8a217fa2 Olga Brani
                                }
1974 8a217fa2 Olga Brani
                        }
1975 8a217fa2 Olga Brani
                        
1976 8a217fa2 Olga Brani
                        return aoData;
1977 8a217fa2 Olga Brani
                }
1978 8a217fa2 Olga Brani
                
1979 8a217fa2 Olga Brani
                
1980 8a217fa2 Olga Brani
                /**
1981 8a217fa2 Olga Brani
                 * Add Ajax parameters from plug-ins
1982 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1983 8a217fa2 Olga Brani
                 *  @param array {objects} aoData name/value pairs to send to the server
1984 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
1985 8a217fa2 Olga Brani
                 */
1986 8a217fa2 Olga Brani
                function _fnServerParams( oSettings, aoData )
1987 8a217fa2 Olga Brani
                {
1988 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
1989 8a217fa2 Olga Brani
                }
1990 8a217fa2 Olga Brani
                
1991 8a217fa2 Olga Brani
                
1992 8a217fa2 Olga Brani
                /**
1993 8a217fa2 Olga Brani
                 * Data the data from the server (nuking the old) and redraw the table
1994 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
1995 8a217fa2 Olga Brani
                 *  @param {object} json json data return from the server.
1996 8a217fa2 Olga Brani
                 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
1997 8a217fa2 Olga Brani
                 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
1998 8a217fa2 Olga Brani
                 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
1999 8a217fa2 Olga Brani
                 *  @param {array} json.aaData The data to display on this page
2000 8a217fa2 Olga Brani
                 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
2001 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2002 8a217fa2 Olga Brani
                 */
2003 8a217fa2 Olga Brani
                function _fnAjaxUpdateDraw ( oSettings, json )
2004 8a217fa2 Olga Brani
                {
2005 8a217fa2 Olga Brani
                        if ( json.sEcho !== undefined )
2006 8a217fa2 Olga Brani
                        {
2007 8a217fa2 Olga Brani
                                /* Protect against old returns over-writing a new one. Possible when you get
2008 8a217fa2 Olga Brani
                                 * very fast interaction, and later queries are completed much faster
2009 8a217fa2 Olga Brani
                                 */
2010 8a217fa2 Olga Brani
                                if ( json.sEcho*1 < oSettings.iDraw )
2011 8a217fa2 Olga Brani
                                {
2012 8a217fa2 Olga Brani
                                        return;
2013 8a217fa2 Olga Brani
                                }
2014 8a217fa2 Olga Brani
                                else
2015 8a217fa2 Olga Brani
                                {
2016 8a217fa2 Olga Brani
                                        oSettings.iDraw = json.sEcho * 1;
2017 8a217fa2 Olga Brani
                                }
2018 8a217fa2 Olga Brani
                        }
2019 8a217fa2 Olga Brani
                        
2020 8a217fa2 Olga Brani
                        if ( !oSettings.oScroll.bInfinite ||
2021 8a217fa2 Olga Brani
                                   (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
2022 8a217fa2 Olga Brani
                        {
2023 8a217fa2 Olga Brani
                                _fnClearTable( oSettings );
2024 8a217fa2 Olga Brani
                        }
2025 8a217fa2 Olga Brani
                        oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
2026 8a217fa2 Olga Brani
                        oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
2027 8a217fa2 Olga Brani
                        
2028 8a217fa2 Olga Brani
                        /* Determine if reordering is required */
2029 8a217fa2 Olga Brani
                        var sOrdering = _fnColumnOrdering(oSettings);
2030 8a217fa2 Olga Brani
                        var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
2031 8a217fa2 Olga Brani
                        var aiIndex;
2032 8a217fa2 Olga Brani
                        if ( bReOrder )
2033 8a217fa2 Olga Brani
                        {
2034 8a217fa2 Olga Brani
                                aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
2035 8a217fa2 Olga Brani
                        }
2036 8a217fa2 Olga Brani
                        
2037 8a217fa2 Olga Brani
                        var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
2038 8a217fa2 Olga Brani
                        for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
2039 8a217fa2 Olga Brani
                        {
2040 8a217fa2 Olga Brani
                                if ( bReOrder )
2041 8a217fa2 Olga Brani
                                {
2042 8a217fa2 Olga Brani
                                        /* If we need to re-order, then create a new array with the correct order and add it */
2043 8a217fa2 Olga Brani
                                        var aDataSorted = [];
2044 8a217fa2 Olga Brani
                                        for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
2045 8a217fa2 Olga Brani
                                        {
2046 8a217fa2 Olga Brani
                                                aDataSorted.push( aData[i][ aiIndex[j] ] );
2047 8a217fa2 Olga Brani
                                        }
2048 8a217fa2 Olga Brani
                                        _fnAddData( oSettings, aDataSorted );
2049 8a217fa2 Olga Brani
                                }
2050 8a217fa2 Olga Brani
                                else
2051 8a217fa2 Olga Brani
                                {
2052 8a217fa2 Olga Brani
                                        /* No re-order required, sever got it "right" - just straight add */
2053 8a217fa2 Olga Brani
                                        _fnAddData( oSettings, aData[i] );
2054 8a217fa2 Olga Brani
                                }
2055 8a217fa2 Olga Brani
                        }
2056 8a217fa2 Olga Brani
                        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2057 8a217fa2 Olga Brani
                        
2058 8a217fa2 Olga Brani
                        oSettings.bAjaxDataGet = false;
2059 8a217fa2 Olga Brani
                        _fnDraw( oSettings );
2060 8a217fa2 Olga Brani
                        oSettings.bAjaxDataGet = true;
2061 8a217fa2 Olga Brani
                        _fnProcessingDisplay( oSettings, false );
2062 8a217fa2 Olga Brani
                }
2063 8a217fa2 Olga Brani
                
2064 8a217fa2 Olga Brani
                
2065 8a217fa2 Olga Brani
                
2066 8a217fa2 Olga Brani
                /**
2067 8a217fa2 Olga Brani
                 * Generate the node required for filtering text
2068 8a217fa2 Olga Brani
                 *  @returns {node} Filter control element
2069 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2070 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2071 8a217fa2 Olga Brani
                 */
2072 8a217fa2 Olga Brani
                function _fnFeatureHtmlFilter ( oSettings )
2073 8a217fa2 Olga Brani
                {
2074 8a217fa2 Olga Brani
                        var oPreviousSearch = oSettings.oPreviousSearch;
2075 8a217fa2 Olga Brani
                        
2076 8a217fa2 Olga Brani
                        var sSearchStr = oSettings.oLanguage.sSearch;
2077 8a217fa2 Olga Brani
                        sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?
2078 8a217fa2 Olga Brani
                          sSearchStr.replace('_INPUT_', '<input type="text" />') :
2079 8a217fa2 Olga Brani
                          sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />';
2080 8a217fa2 Olga Brani
                        
2081 8a217fa2 Olga Brani
                        var nFilter = document.createElement( 'div' );
2082 8a217fa2 Olga Brani
                        nFilter.className = oSettings.oClasses.sFilter;
2083 8a217fa2 Olga Brani
                        nFilter.innerHTML = '<label>'+sSearchStr+'</label>';
2084 8a217fa2 Olga Brani
                        if ( !oSettings.aanFeatures.f )
2085 8a217fa2 Olga Brani
                        {
2086 8a217fa2 Olga Brani
                                nFilter.id = oSettings.sTableId+'_filter';
2087 8a217fa2 Olga Brani
                        }
2088 8a217fa2 Olga Brani
                        
2089 8a217fa2 Olga Brani
                        var jqFilter = $('input[type="text"]', nFilter);
2090 8a217fa2 Olga Brani
                
2091 8a217fa2 Olga Brani
                        // Store a reference to the input element, so other input elements could be
2092 8a217fa2 Olga Brani
                        // added to the filter wrapper if needed (submit button for example)
2093 8a217fa2 Olga Brani
                        nFilter._DT_Input = jqFilter[0];
2094 8a217fa2 Olga Brani
                
2095 8a217fa2 Olga Brani
                        jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
2096 8a217fa2 Olga Brani
                        jqFilter.bind( 'keyup.DT', function(e) {
2097 8a217fa2 Olga Brani
                                /* Update all other filter input elements for the new display */
2098 8a217fa2 Olga Brani
                                var n = oSettings.aanFeatures.f;
2099 8a217fa2 Olga Brani
                                var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
2100 8a217fa2 Olga Brani
                
2101 8a217fa2 Olga Brani
                                for ( var i=0, iLen=n.length ; i<iLen ; i++ )
2102 8a217fa2 Olga Brani
                                {
2103 8a217fa2 Olga Brani
                                        if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
2104 8a217fa2 Olga Brani
                                        {
2105 8a217fa2 Olga Brani
                                                $(n[i]._DT_Input).val( val );
2106 8a217fa2 Olga Brani
                                        }
2107 8a217fa2 Olga Brani
                                }
2108 8a217fa2 Olga Brani
                                
2109 8a217fa2 Olga Brani
                                /* Now do the filter */
2110 8a217fa2 Olga Brani
                                if ( val != oPreviousSearch.sSearch )
2111 8a217fa2 Olga Brani
                                {
2112 8a217fa2 Olga Brani
                                        _fnFilterComplete( oSettings, { 
2113 8a217fa2 Olga Brani
                                                "sSearch": val, 
2114 8a217fa2 Olga Brani
                                                "bRegex": oPreviousSearch.bRegex,
2115 8a217fa2 Olga Brani
                                                "bSmart": oPreviousSearch.bSmart ,
2116 8a217fa2 Olga Brani
                                                "bCaseInsensitive": oPreviousSearch.bCaseInsensitive 
2117 8a217fa2 Olga Brani
                                        } );
2118 8a217fa2 Olga Brani
                                }
2119 8a217fa2 Olga Brani
                        } );
2120 8a217fa2 Olga Brani
                
2121 8a217fa2 Olga Brani
                        jqFilter
2122 8a217fa2 Olga Brani
                                .attr('aria-controls', oSettings.sTableId)
2123 8a217fa2 Olga Brani
                                .bind( 'keypress.DT', function(e) {
2124 8a217fa2 Olga Brani
                                        /* Prevent form submission */
2125 8a217fa2 Olga Brani
                                        if ( e.keyCode == 13 )
2126 8a217fa2 Olga Brani
                                        {
2127 8a217fa2 Olga Brani
                                                return false;
2128 8a217fa2 Olga Brani
                                        }
2129 8a217fa2 Olga Brani
                                }
2130 8a217fa2 Olga Brani
                        );
2131 8a217fa2 Olga Brani
                        
2132 8a217fa2 Olga Brani
                        return nFilter;
2133 8a217fa2 Olga Brani
                }
2134 8a217fa2 Olga Brani
                
2135 8a217fa2 Olga Brani
                
2136 8a217fa2 Olga Brani
                /**
2137 8a217fa2 Olga Brani
                 * Filter the table using both the global filter and column based filtering
2138 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2139 8a217fa2 Olga Brani
                 *  @param {object} oSearch search information
2140 8a217fa2 Olga Brani
                 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
2141 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2142 8a217fa2 Olga Brani
                 */
2143 8a217fa2 Olga Brani
                function _fnFilterComplete ( oSettings, oInput, iForce )
2144 8a217fa2 Olga Brani
                {
2145 8a217fa2 Olga Brani
                        var oPrevSearch = oSettings.oPreviousSearch;
2146 8a217fa2 Olga Brani
                        var aoPrevSearch = oSettings.aoPreSearchCols;
2147 8a217fa2 Olga Brani
                        var fnSaveFilter = function ( oFilter ) {
2148 8a217fa2 Olga Brani
                                /* Save the filtering values */
2149 8a217fa2 Olga Brani
                                oPrevSearch.sSearch = oFilter.sSearch;
2150 8a217fa2 Olga Brani
                                oPrevSearch.bRegex = oFilter.bRegex;
2151 8a217fa2 Olga Brani
                                oPrevSearch.bSmart = oFilter.bSmart;
2152 8a217fa2 Olga Brani
                                oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
2153 8a217fa2 Olga Brani
                        };
2154 8a217fa2 Olga Brani
                
2155 8a217fa2 Olga Brani
                        /* In server-side processing all filtering is done by the server, so no point hanging around here */
2156 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bServerSide )
2157 8a217fa2 Olga Brani
                        {
2158 8a217fa2 Olga Brani
                                /* Global filter */
2159 8a217fa2 Olga Brani
                                _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
2160 8a217fa2 Olga Brani
                                fnSaveFilter( oInput );
2161 8a217fa2 Olga Brani
                
2162 8a217fa2 Olga Brani
                                /* Now do the individual column filter */
2163 8a217fa2 Olga Brani
                                for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
2164 8a217fa2 Olga Brani
                                {
2165 8a217fa2 Olga Brani
                                        _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, 
2166 8a217fa2 Olga Brani
                                                aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
2167 8a217fa2 Olga Brani
                                }
2168 8a217fa2 Olga Brani
                                
2169 8a217fa2 Olga Brani
                                /* Custom filtering */
2170 8a217fa2 Olga Brani
                                _fnFilterCustom( oSettings );
2171 8a217fa2 Olga Brani
                        }
2172 8a217fa2 Olga Brani
                        else
2173 8a217fa2 Olga Brani
                        {
2174 8a217fa2 Olga Brani
                                fnSaveFilter( oInput );
2175 8a217fa2 Olga Brani
                        }
2176 8a217fa2 Olga Brani
                        
2177 8a217fa2 Olga Brani
                        /* Tell the draw function we have been filtering */
2178 8a217fa2 Olga Brani
                        oSettings.bFiltered = true;
2179 8a217fa2 Olga Brani
                        $(oSettings.oInstance).trigger('filter', oSettings);
2180 8a217fa2 Olga Brani
                        
2181 8a217fa2 Olga Brani
                        /* Redraw the table */
2182 8a217fa2 Olga Brani
                        oSettings._iDisplayStart = 0;
2183 8a217fa2 Olga Brani
                        _fnCalculateEnd( oSettings );
2184 8a217fa2 Olga Brani
                        _fnDraw( oSettings );
2185 8a217fa2 Olga Brani
                        
2186 8a217fa2 Olga Brani
                        /* Rebuild search array 'offline' */
2187 8a217fa2 Olga Brani
                        _fnBuildSearchArray( oSettings, 0 );
2188 8a217fa2 Olga Brani
                }
2189 8a217fa2 Olga Brani
                
2190 8a217fa2 Olga Brani
                
2191 8a217fa2 Olga Brani
                /**
2192 8a217fa2 Olga Brani
                 * Apply custom filtering functions
2193 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2194 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2195 8a217fa2 Olga Brani
                 */
2196 8a217fa2 Olga Brani
                function _fnFilterCustom( oSettings )
2197 8a217fa2 Olga Brani
                {
2198 8a217fa2 Olga Brani
                        var afnFilters = DataTable.ext.afnFiltering;
2199 8a217fa2 Olga Brani
                        var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
2200 8a217fa2 Olga Brani
                
2201 8a217fa2 Olga Brani
                        for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
2202 8a217fa2 Olga Brani
                        {
2203 8a217fa2 Olga Brani
                                var iCorrector = 0;
2204 8a217fa2 Olga Brani
                                for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
2205 8a217fa2 Olga Brani
                                {
2206 8a217fa2 Olga Brani
                                        var iDisIndex = oSettings.aiDisplay[j-iCorrector];
2207 8a217fa2 Olga Brani
                                        var bTest = afnFilters[i](
2208 8a217fa2 Olga Brani
                                                oSettings,
2209 8a217fa2 Olga Brani
                                                _fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
2210 8a217fa2 Olga Brani
                                                iDisIndex
2211 8a217fa2 Olga Brani
                                        );
2212 8a217fa2 Olga Brani
                                        
2213 8a217fa2 Olga Brani
                                        /* Check if we should use this row based on the filtering function */
2214 8a217fa2 Olga Brani
                                        if ( !bTest )
2215 8a217fa2 Olga Brani
                                        {
2216 8a217fa2 Olga Brani
                                                oSettings.aiDisplay.splice( j-iCorrector, 1 );
2217 8a217fa2 Olga Brani
                                                iCorrector++;
2218 8a217fa2 Olga Brani
                                        }
2219 8a217fa2 Olga Brani
                                }
2220 8a217fa2 Olga Brani
                        }
2221 8a217fa2 Olga Brani
                }
2222 8a217fa2 Olga Brani
                
2223 8a217fa2 Olga Brani
                
2224 8a217fa2 Olga Brani
                /**
2225 8a217fa2 Olga Brani
                 * Filter the table on a per-column basis
2226 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2227 8a217fa2 Olga Brani
                 *  @param {string} sInput string to filter on
2228 8a217fa2 Olga Brani
                 *  @param {int} iColumn column to filter
2229 8a217fa2 Olga Brani
                 *  @param {bool} bRegex treat search string as a regular expression or not
2230 8a217fa2 Olga Brani
                 *  @param {bool} bSmart use smart filtering or not
2231 8a217fa2 Olga Brani
                 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
2232 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2233 8a217fa2 Olga Brani
                 */
2234 8a217fa2 Olga Brani
                function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )
2235 8a217fa2 Olga Brani
                {
2236 8a217fa2 Olga Brani
                        if ( sInput === "" )
2237 8a217fa2 Olga Brani
                        {
2238 8a217fa2 Olga Brani
                                return;
2239 8a217fa2 Olga Brani
                        }
2240 8a217fa2 Olga Brani
                        
2241 8a217fa2 Olga Brani
                        var iIndexCorrector = 0;
2242 8a217fa2 Olga Brani
                        var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
2243 8a217fa2 Olga Brani
                        
2244 8a217fa2 Olga Brani
                        for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
2245 8a217fa2 Olga Brani
                        {
2246 8a217fa2 Olga Brani
                                var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),
2247 8a217fa2 Olga Brani
                                        oSettings.aoColumns[iColumn].sType );
2248 8a217fa2 Olga Brani
                                if ( ! rpSearch.test( sData ) )
2249 8a217fa2 Olga Brani
                                {
2250 8a217fa2 Olga Brani
                                        oSettings.aiDisplay.splice( i, 1 );
2251 8a217fa2 Olga Brani
                                        iIndexCorrector++;
2252 8a217fa2 Olga Brani
                                }
2253 8a217fa2 Olga Brani
                        }
2254 8a217fa2 Olga Brani
                }
2255 8a217fa2 Olga Brani
                
2256 8a217fa2 Olga Brani
                
2257 8a217fa2 Olga Brani
                /**
2258 8a217fa2 Olga Brani
                 * Filter the data table based on user input and draw the table
2259 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2260 8a217fa2 Olga Brani
                 *  @param {string} sInput string to filter on
2261 8a217fa2 Olga Brani
                 *  @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0)
2262 8a217fa2 Olga Brani
                 *  @param {bool} bRegex treat as a regular expression or not
2263 8a217fa2 Olga Brani
                 *  @param {bool} bSmart perform smart filtering or not
2264 8a217fa2 Olga Brani
                 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
2265 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2266 8a217fa2 Olga Brani
                 */
2267 8a217fa2 Olga Brani
                function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
2268 8a217fa2 Olga Brani
                {
2269 8a217fa2 Olga Brani
                        var i;
2270 8a217fa2 Olga Brani
                        var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
2271 8a217fa2 Olga Brani
                        var oPrevSearch = oSettings.oPreviousSearch;
2272 8a217fa2 Olga Brani
                        
2273 8a217fa2 Olga Brani
                        /* Check if we are forcing or not - optional parameter */
2274 8a217fa2 Olga Brani
                        if ( !iForce )
2275 8a217fa2 Olga Brani
                        {
2276 8a217fa2 Olga Brani
                                iForce = 0;
2277 8a217fa2 Olga Brani
                        }
2278 8a217fa2 Olga Brani
                        
2279 8a217fa2 Olga Brani
                        /* Need to take account of custom filtering functions - always filter */
2280 8a217fa2 Olga Brani
                        if ( DataTable.ext.afnFiltering.length !== 0 )
2281 8a217fa2 Olga Brani
                        {
2282 8a217fa2 Olga Brani
                                iForce = 1;
2283 8a217fa2 Olga Brani
                        }
2284 8a217fa2 Olga Brani
                        
2285 8a217fa2 Olga Brani
                        /*
2286 8a217fa2 Olga Brani
                         * If the input is blank - we want the full data set
2287 8a217fa2 Olga Brani
                         */
2288 8a217fa2 Olga Brani
                        if ( sInput.length <= 0 )
2289 8a217fa2 Olga Brani
                        {
2290 8a217fa2 Olga Brani
                                oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
2291 8a217fa2 Olga Brani
                                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2292 8a217fa2 Olga Brani
                        }
2293 8a217fa2 Olga Brani
                        else
2294 8a217fa2 Olga Brani
                        {
2295 8a217fa2 Olga Brani
                                /*
2296 8a217fa2 Olga Brani
                                 * We are starting a new search or the new search string is smaller 
2297 8a217fa2 Olga Brani
                                 * then the old one (i.e. delete). Search from the master array
2298 8a217fa2 Olga Brani
                                  */
2299 8a217fa2 Olga Brani
                                if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
2300 8a217fa2 Olga Brani
                                           oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
2301 8a217fa2 Olga Brani
                                           sInput.indexOf(oPrevSearch.sSearch) !== 0 )
2302 8a217fa2 Olga Brani
                                {
2303 8a217fa2 Olga Brani
                                        /* Nuke the old display array - we are going to rebuild it */
2304 8a217fa2 Olga Brani
                                        oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
2305 8a217fa2 Olga Brani
                                        
2306 8a217fa2 Olga Brani
                                        /* Force a rebuild of the search array */
2307 8a217fa2 Olga Brani
                                        _fnBuildSearchArray( oSettings, 1 );
2308 8a217fa2 Olga Brani
                                        
2309 8a217fa2 Olga Brani
                                        /* Search through all records to populate the search array
2310 8a217fa2 Olga Brani
                                         * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
2311 8a217fa2 Olga Brani
                                         * mapping
2312 8a217fa2 Olga Brani
                                         */
2313 8a217fa2 Olga Brani
                                        for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
2314 8a217fa2 Olga Brani
                                        {
2315 8a217fa2 Olga Brani
                                                if ( rpSearch.test(oSettings.asDataSearch[i]) )
2316 8a217fa2 Olga Brani
                                                {
2317 8a217fa2 Olga Brani
                                                        oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
2318 8a217fa2 Olga Brani
                                                }
2319 8a217fa2 Olga Brani
                                        }
2320 8a217fa2 Olga Brani
                          }
2321 8a217fa2 Olga Brani
                          else
2322 8a217fa2 Olga Brani
                                {
2323 8a217fa2 Olga Brani
                                  /* Using old search array - refine it - do it this way for speed
2324 8a217fa2 Olga Brani
                                   * Don't have to search the whole master array again
2325 8a217fa2 Olga Brani
                                         */
2326 8a217fa2 Olga Brani
                                  var iIndexCorrector = 0;
2327 8a217fa2 Olga Brani
                                  
2328 8a217fa2 Olga Brani
                                  /* Search the current results */
2329 8a217fa2 Olga Brani
                                  for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
2330 8a217fa2 Olga Brani
                                        {
2331 8a217fa2 Olga Brani
                                          if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
2332 8a217fa2 Olga Brani
                                                {
2333 8a217fa2 Olga Brani
                                                  oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
2334 8a217fa2 Olga Brani
                                                  iIndexCorrector++;
2335 8a217fa2 Olga Brani
                                          }
2336 8a217fa2 Olga Brani
                                  }
2337 8a217fa2 Olga Brani
                          }
2338 8a217fa2 Olga Brani
                        }
2339 8a217fa2 Olga Brani
                }
2340 8a217fa2 Olga Brani
                
2341 8a217fa2 Olga Brani
                
2342 8a217fa2 Olga Brani
                /**
2343 8a217fa2 Olga Brani
                 * Create an array which can be quickly search through
2344 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2345 8a217fa2 Olga Brani
                 *  @param {int} iMaster use the master data array - optional
2346 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2347 8a217fa2 Olga Brani
                 */
2348 8a217fa2 Olga Brani
                function _fnBuildSearchArray ( oSettings, iMaster )
2349 8a217fa2 Olga Brani
                {
2350 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bServerSide )
2351 8a217fa2 Olga Brani
                        {
2352 8a217fa2 Olga Brani
                                /* Clear out the old data */
2353 8a217fa2 Olga Brani
                                oSettings.asDataSearch = [];
2354 8a217fa2 Olga Brani
                
2355 8a217fa2 Olga Brani
                                var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
2356 8a217fa2 Olga Brani
                                var aiIndex = (iMaster===1) ?
2357 8a217fa2 Olga Brani
                                         oSettings.aiDisplayMaster :
2358 8a217fa2 Olga Brani
                                         oSettings.aiDisplay;
2359 8a217fa2 Olga Brani
                                
2360 8a217fa2 Olga Brani
                                for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
2361 8a217fa2 Olga Brani
                                {
2362 8a217fa2 Olga Brani
                                        oSettings.asDataSearch[i] = _fnBuildSearchRow(
2363 8a217fa2 Olga Brani
                                                oSettings,
2364 8a217fa2 Olga Brani
                                                _fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
2365 8a217fa2 Olga Brani
                                        );
2366 8a217fa2 Olga Brani
                                }
2367 8a217fa2 Olga Brani
                        }
2368 8a217fa2 Olga Brani
                }
2369 8a217fa2 Olga Brani
                
2370 8a217fa2 Olga Brani
                
2371 8a217fa2 Olga Brani
                /**
2372 8a217fa2 Olga Brani
                 * Create a searchable string from a single data row
2373 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2374 8a217fa2 Olga Brani
                 *  @param {array} aData Row data array to use for the data to search
2375 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2376 8a217fa2 Olga Brani
                 */
2377 8a217fa2 Olga Brani
                function _fnBuildSearchRow( oSettings, aData )
2378 8a217fa2 Olga Brani
                {
2379 8a217fa2 Olga Brani
                        var sSearch = aData.join('  ');
2380 8a217fa2 Olga Brani
                        
2381 8a217fa2 Olga Brani
                        /* If it looks like there is an HTML entity in the string, attempt to decode it */
2382 8a217fa2 Olga Brani
                        if ( sSearch.indexOf('&') !== -1 )
2383 8a217fa2 Olga Brani
                        {
2384 8a217fa2 Olga Brani
                                sSearch = $('<div>').html(sSearch).text();
2385 8a217fa2 Olga Brani
                        }
2386 8a217fa2 Olga Brani
                        
2387 8a217fa2 Olga Brani
                        // Strip newline characters
2388 8a217fa2 Olga Brani
                        return sSearch.replace( /[\n\r]/g, " " );
2389 8a217fa2 Olga Brani
                }
2390 8a217fa2 Olga Brani
                
2391 8a217fa2 Olga Brani
                /**
2392 8a217fa2 Olga Brani
                 * Build a regular expression object suitable for searching a table
2393 8a217fa2 Olga Brani
                 *  @param {string} sSearch string to search for
2394 8a217fa2 Olga Brani
                 *  @param {bool} bRegex treat as a regular expression or not
2395 8a217fa2 Olga Brani
                 *  @param {bool} bSmart perform smart filtering or not
2396 8a217fa2 Olga Brani
                 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
2397 8a217fa2 Olga Brani
                 *  @returns {RegExp} constructed object
2398 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2399 8a217fa2 Olga Brani
                 */
2400 8a217fa2 Olga Brani
                function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )
2401 8a217fa2 Olga Brani
                {
2402 8a217fa2 Olga Brani
                        var asSearch, sRegExpString;
2403 8a217fa2 Olga Brani
                        
2404 8a217fa2 Olga Brani
                        if ( bSmart )
2405 8a217fa2 Olga Brani
                        {
2406 8a217fa2 Olga Brani
                                /* Generate the regular expression to use. Something along the lines of:
2407 8a217fa2 Olga Brani
                                 * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
2408 8a217fa2 Olga Brani
                                 */
2409 8a217fa2 Olga Brani
                                asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
2410 8a217fa2 Olga Brani
                                sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
2411 8a217fa2 Olga Brani
                                return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" );
2412 8a217fa2 Olga Brani
                        }
2413 8a217fa2 Olga Brani
                        else
2414 8a217fa2 Olga Brani
                        {
2415 8a217fa2 Olga Brani
                                sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
2416 8a217fa2 Olga Brani
                                return new RegExp( sSearch, bCaseInsensitive ? "i" : "" );
2417 8a217fa2 Olga Brani
                        }
2418 8a217fa2 Olga Brani
                }
2419 8a217fa2 Olga Brani
                
2420 8a217fa2 Olga Brani
                
2421 8a217fa2 Olga Brani
                /**
2422 8a217fa2 Olga Brani
                 * Convert raw data into something that the user can search on
2423 8a217fa2 Olga Brani
                 *  @param {string} sData data to be modified
2424 8a217fa2 Olga Brani
                 *  @param {string} sType data type
2425 8a217fa2 Olga Brani
                 *  @returns {string} search string
2426 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2427 8a217fa2 Olga Brani
                 */
2428 8a217fa2 Olga Brani
                function _fnDataToSearch ( sData, sType )
2429 8a217fa2 Olga Brani
                {
2430 8a217fa2 Olga Brani
                        if ( typeof DataTable.ext.ofnSearch[sType] === "function" )
2431 8a217fa2 Olga Brani
                        {
2432 8a217fa2 Olga Brani
                                return DataTable.ext.ofnSearch[sType]( sData );
2433 8a217fa2 Olga Brani
                        }
2434 8a217fa2 Olga Brani
                        else if ( sData === null )
2435 8a217fa2 Olga Brani
                        {
2436 8a217fa2 Olga Brani
                                return '';
2437 8a217fa2 Olga Brani
                        }
2438 8a217fa2 Olga Brani
                        else if ( sType == "html" )
2439 8a217fa2 Olga Brani
                        {
2440 8a217fa2 Olga Brani
                                return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
2441 8a217fa2 Olga Brani
                        }
2442 8a217fa2 Olga Brani
                        else if ( typeof sData === "string" )
2443 8a217fa2 Olga Brani
                        {
2444 8a217fa2 Olga Brani
                                return sData.replace(/[\r\n]/g," ");
2445 8a217fa2 Olga Brani
                        }
2446 8a217fa2 Olga Brani
                        return sData;
2447 8a217fa2 Olga Brani
                }
2448 8a217fa2 Olga Brani
                
2449 8a217fa2 Olga Brani
                
2450 8a217fa2 Olga Brani
                /**
2451 8a217fa2 Olga Brani
                 * scape a string such that it can be used in a regular expression
2452 8a217fa2 Olga Brani
                 *  @param {string} sVal string to escape
2453 8a217fa2 Olga Brani
                 *  @returns {string} escaped string
2454 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2455 8a217fa2 Olga Brani
                 */
2456 8a217fa2 Olga Brani
                function _fnEscapeRegex ( sVal )
2457 8a217fa2 Olga Brani
                {
2458 8a217fa2 Olga Brani
                        var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
2459 8a217fa2 Olga Brani
                        var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
2460 8a217fa2 Olga Brani
                        return sVal.replace(reReplace, '\\$1');
2461 8a217fa2 Olga Brani
                }
2462 8a217fa2 Olga Brani
                
2463 8a217fa2 Olga Brani
                
2464 8a217fa2 Olga Brani
                /**
2465 8a217fa2 Olga Brani
                 * Generate the node required for the info display
2466 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2467 8a217fa2 Olga Brani
                 *  @returns {node} Information element
2468 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2469 8a217fa2 Olga Brani
                 */
2470 8a217fa2 Olga Brani
                function _fnFeatureHtmlInfo ( oSettings )
2471 8a217fa2 Olga Brani
                {
2472 8a217fa2 Olga Brani
                        var nInfo = document.createElement( 'div' );
2473 8a217fa2 Olga Brani
                        nInfo.className = oSettings.oClasses.sInfo;
2474 8a217fa2 Olga Brani
                        
2475 8a217fa2 Olga Brani
                        /* Actions that are to be taken once only for this feature */
2476 8a217fa2 Olga Brani
                        if ( !oSettings.aanFeatures.i )
2477 8a217fa2 Olga Brani
                        {
2478 8a217fa2 Olga Brani
                                /* Add draw callback */
2479 8a217fa2 Olga Brani
                                oSettings.aoDrawCallback.push( {
2480 8a217fa2 Olga Brani
                                        "fn": _fnUpdateInfo,
2481 8a217fa2 Olga Brani
                                        "sName": "information"
2482 8a217fa2 Olga Brani
                                } );
2483 8a217fa2 Olga Brani
                                
2484 8a217fa2 Olga Brani
                                /* Add id */
2485 8a217fa2 Olga Brani
                                nInfo.id = oSettings.sTableId+'_info';
2486 8a217fa2 Olga Brani
                        }
2487 8a217fa2 Olga Brani
                        oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );
2488 8a217fa2 Olga Brani
                        
2489 8a217fa2 Olga Brani
                        return nInfo;
2490 8a217fa2 Olga Brani
                }
2491 8a217fa2 Olga Brani
                
2492 8a217fa2 Olga Brani
                
2493 8a217fa2 Olga Brani
                /**
2494 8a217fa2 Olga Brani
                 * Update the information elements in the display
2495 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2496 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2497 8a217fa2 Olga Brani
                 */
2498 8a217fa2 Olga Brani
                function _fnUpdateInfo ( oSettings )
2499 8a217fa2 Olga Brani
                {
2500 8a217fa2 Olga Brani
                        /* Show information about the table */
2501 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
2502 8a217fa2 Olga Brani
                        {
2503 8a217fa2 Olga Brani
                                return;
2504 8a217fa2 Olga Brani
                        }
2505 8a217fa2 Olga Brani
                        
2506 8a217fa2 Olga Brani
                        var
2507 8a217fa2 Olga Brani
                                oLang = oSettings.oLanguage,
2508 8a217fa2 Olga Brani
                                iStart = oSettings._iDisplayStart+1,
2509 8a217fa2 Olga Brani
                                iEnd = oSettings.fnDisplayEnd(),
2510 8a217fa2 Olga Brani
                                iMax = oSettings.fnRecordsTotal(),
2511 8a217fa2 Olga Brani
                                iTotal = oSettings.fnRecordsDisplay(),
2512 8a217fa2 Olga Brani
                                sOut;
2513 8a217fa2 Olga Brani
                        
2514 8a217fa2 Olga Brani
                        if ( iTotal === 0 )
2515 8a217fa2 Olga Brani
                        {
2516 8a217fa2 Olga Brani
                                /* Empty record set */
2517 8a217fa2 Olga Brani
                                sOut = oLang.sInfoEmpty;
2518 8a217fa2 Olga Brani
                        }
2519 8a217fa2 Olga Brani
                        else {
2520 8a217fa2 Olga Brani
                                /* Normal record set */
2521 8a217fa2 Olga Brani
                                sOut = oLang.sInfo;
2522 8a217fa2 Olga Brani
                        }
2523 8a217fa2 Olga Brani
                
2524 8a217fa2 Olga Brani
                        if ( iTotal != iMax )
2525 8a217fa2 Olga Brani
                        {
2526 8a217fa2 Olga Brani
                                /* Record set after filtering */
2527 8a217fa2 Olga Brani
                                sOut += ' ' + oLang.sInfoFiltered;
2528 8a217fa2 Olga Brani
                        }
2529 8a217fa2 Olga Brani
                
2530 8a217fa2 Olga Brani
                        // Convert the macros
2531 8a217fa2 Olga Brani
                        sOut += oLang.sInfoPostFix;
2532 8a217fa2 Olga Brani
                        sOut = _fnInfoMacros( oSettings, sOut );
2533 8a217fa2 Olga Brani
                        
2534 8a217fa2 Olga Brani
                        if ( oLang.fnInfoCallback !== null )
2535 8a217fa2 Olga Brani
                        {
2536 8a217fa2 Olga Brani
                                sOut = oLang.fnInfoCallback.call( oSettings.oInstance, 
2537 8a217fa2 Olga Brani
                                        oSettings, iStart, iEnd, iMax, iTotal, sOut );
2538 8a217fa2 Olga Brani
                        }
2539 8a217fa2 Olga Brani
                        
2540 8a217fa2 Olga Brani
                        var n = oSettings.aanFeatures.i;
2541 8a217fa2 Olga Brani
                        for ( var i=0, iLen=n.length ; i<iLen ; i++ )
2542 8a217fa2 Olga Brani
                        {
2543 8a217fa2 Olga Brani
                                $(n[i]).html( sOut );
2544 8a217fa2 Olga Brani
                        }
2545 8a217fa2 Olga Brani
                }
2546 8a217fa2 Olga Brani
                
2547 8a217fa2 Olga Brani
                
2548 8a217fa2 Olga Brani
                function _fnInfoMacros ( oSettings, str )
2549 8a217fa2 Olga Brani
                {
2550 8a217fa2 Olga Brani
                        var
2551 8a217fa2 Olga Brani
                                iStart = oSettings._iDisplayStart+1,
2552 8a217fa2 Olga Brani
                                sStart = oSettings.fnFormatNumber( iStart ),
2553 8a217fa2 Olga Brani
                                iEnd = oSettings.fnDisplayEnd(),
2554 8a217fa2 Olga Brani
                                sEnd = oSettings.fnFormatNumber( iEnd ),
2555 8a217fa2 Olga Brani
                                iTotal = oSettings.fnRecordsDisplay(),
2556 8a217fa2 Olga Brani
                                sTotal = oSettings.fnFormatNumber( iTotal ),
2557 8a217fa2 Olga Brani
                                iMax = oSettings.fnRecordsTotal(),
2558 8a217fa2 Olga Brani
                                sMax = oSettings.fnFormatNumber( iMax );
2559 8a217fa2 Olga Brani
                
2560 8a217fa2 Olga Brani
                        // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
2561 8a217fa2 Olga Brani
                        // internally
2562 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.bInfinite )
2563 8a217fa2 Olga Brani
                        {
2564 8a217fa2 Olga Brani
                                sStart = oSettings.fnFormatNumber( 1 );
2565 8a217fa2 Olga Brani
                        }
2566 8a217fa2 Olga Brani
                
2567 8a217fa2 Olga Brani
                        return str.
2568 8a217fa2 Olga Brani
                                replace(/_START_/g, sStart).
2569 8a217fa2 Olga Brani
                                replace(/_END_/g,   sEnd).
2570 8a217fa2 Olga Brani
                                replace(/_TOTAL_/g, sTotal).
2571 8a217fa2 Olga Brani
                                replace(/_MAX_/g,   sMax);
2572 8a217fa2 Olga Brani
                }
2573 8a217fa2 Olga Brani
                
2574 8a217fa2 Olga Brani
                
2575 8a217fa2 Olga Brani
                
2576 8a217fa2 Olga Brani
                /**
2577 8a217fa2 Olga Brani
                 * Draw the table for the first time, adding all required features
2578 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2579 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2580 8a217fa2 Olga Brani
                 */
2581 8a217fa2 Olga Brani
                function _fnInitialise ( oSettings )
2582 8a217fa2 Olga Brani
                {
2583 8a217fa2 Olga Brani
                        var i, iLen, iAjaxStart=oSettings.iInitDisplayStart;
2584 8a217fa2 Olga Brani
                        
2585 8a217fa2 Olga Brani
                        /* Ensure that the table data is fully initialised */
2586 8a217fa2 Olga Brani
                        if ( oSettings.bInitialised === false )
2587 8a217fa2 Olga Brani
                        {
2588 8a217fa2 Olga Brani
                                setTimeout( function(){ _fnInitialise( oSettings ); }, 200 );
2589 8a217fa2 Olga Brani
                                return;
2590 8a217fa2 Olga Brani
                        }
2591 8a217fa2 Olga Brani
                        
2592 8a217fa2 Olga Brani
                        /* Show the display HTML options */
2593 8a217fa2 Olga Brani
                        _fnAddOptionsHtml( oSettings );
2594 8a217fa2 Olga Brani
                        
2595 8a217fa2 Olga Brani
                        /* Build and draw the header / footer for the table */
2596 8a217fa2 Olga Brani
                        _fnBuildHead( oSettings );
2597 8a217fa2 Olga Brani
                        _fnDrawHead( oSettings, oSettings.aoHeader );
2598 8a217fa2 Olga Brani
                        if ( oSettings.nTFoot )
2599 8a217fa2 Olga Brani
                        {
2600 8a217fa2 Olga Brani
                                _fnDrawHead( oSettings, oSettings.aoFooter );
2601 8a217fa2 Olga Brani
                        }
2602 8a217fa2 Olga Brani
                
2603 8a217fa2 Olga Brani
                        /* Okay to show that something is going on now */
2604 8a217fa2 Olga Brani
                        _fnProcessingDisplay( oSettings, true );
2605 8a217fa2 Olga Brani
                        
2606 8a217fa2 Olga Brani
                        /* Calculate sizes for columns */
2607 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bAutoWidth )
2608 8a217fa2 Olga Brani
                        {
2609 8a217fa2 Olga Brani
                                _fnCalculateColumnWidths( oSettings );
2610 8a217fa2 Olga Brani
                        }
2611 8a217fa2 Olga Brani
                        
2612 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
2613 8a217fa2 Olga Brani
                        {
2614 8a217fa2 Olga Brani
                                if ( oSettings.aoColumns[i].sWidth !== null )
2615 8a217fa2 Olga Brani
                                {
2616 8a217fa2 Olga Brani
                                        oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
2617 8a217fa2 Olga Brani
                                }
2618 8a217fa2 Olga Brani
                        }
2619 8a217fa2 Olga Brani
                        
2620 8a217fa2 Olga Brani
                        /* If there is default sorting required - let's do it. The sort function will do the
2621 8a217fa2 Olga Brani
                         * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
2622 8a217fa2 Olga Brani
                         * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
2623 8a217fa2 Olga Brani
                         */
2624 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bSort )
2625 8a217fa2 Olga Brani
                        {
2626 8a217fa2 Olga Brani
                                _fnSort( oSettings );
2627 8a217fa2 Olga Brani
                        }
2628 8a217fa2 Olga Brani
                        else if ( oSettings.oFeatures.bFilter )
2629 8a217fa2 Olga Brani
                        {
2630 8a217fa2 Olga Brani
                                _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
2631 8a217fa2 Olga Brani
                        }
2632 8a217fa2 Olga Brani
                        else
2633 8a217fa2 Olga Brani
                        {
2634 8a217fa2 Olga Brani
                                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2635 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
2636 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
2637 8a217fa2 Olga Brani
                        }
2638 8a217fa2 Olga Brani
                        
2639 8a217fa2 Olga Brani
                        /* if there is an ajax source load the data */
2640 8a217fa2 Olga Brani
                        if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
2641 8a217fa2 Olga Brani
                        {
2642 8a217fa2 Olga Brani
                                var aoData = [];
2643 8a217fa2 Olga Brani
                                _fnServerParams( oSettings, aoData );
2644 8a217fa2 Olga Brani
                                oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {
2645 8a217fa2 Olga Brani
                                        var aData = (oSettings.sAjaxDataProp !== "") ?
2646 8a217fa2 Olga Brani
                                                 _fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;
2647 8a217fa2 Olga Brani
                
2648 8a217fa2 Olga Brani
                                        /* Got the data - add it to the table */
2649 8a217fa2 Olga Brani
                                        for ( i=0 ; i<aData.length ; i++ )
2650 8a217fa2 Olga Brani
                                        {
2651 8a217fa2 Olga Brani
                                                _fnAddData( oSettings, aData[i] );
2652 8a217fa2 Olga Brani
                                        }
2653 8a217fa2 Olga Brani
                                        
2654 8a217fa2 Olga Brani
                                        /* Reset the init display for cookie saving. We've already done a filter, and
2655 8a217fa2 Olga Brani
                                         * therefore cleared it before. So we need to make it appear 'fresh'
2656 8a217fa2 Olga Brani
                                         */
2657 8a217fa2 Olga Brani
                                        oSettings.iInitDisplayStart = iAjaxStart;
2658 8a217fa2 Olga Brani
                                        
2659 8a217fa2 Olga Brani
                                        if ( oSettings.oFeatures.bSort )
2660 8a217fa2 Olga Brani
                                        {
2661 8a217fa2 Olga Brani
                                                _fnSort( oSettings );
2662 8a217fa2 Olga Brani
                                        }
2663 8a217fa2 Olga Brani
                                        else
2664 8a217fa2 Olga Brani
                                        {
2665 8a217fa2 Olga Brani
                                                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2666 8a217fa2 Olga Brani
                                                _fnCalculateEnd( oSettings );
2667 8a217fa2 Olga Brani
                                                _fnDraw( oSettings );
2668 8a217fa2 Olga Brani
                                        }
2669 8a217fa2 Olga Brani
                                        
2670 8a217fa2 Olga Brani
                                        _fnProcessingDisplay( oSettings, false );
2671 8a217fa2 Olga Brani
                                        _fnInitComplete( oSettings, json );
2672 8a217fa2 Olga Brani
                                }, oSettings );
2673 8a217fa2 Olga Brani
                                return;
2674 8a217fa2 Olga Brani
                        }
2675 8a217fa2 Olga Brani
                        
2676 8a217fa2 Olga Brani
                        /* Server-side processing initialisation complete is done at the end of _fnDraw */
2677 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bServerSide )
2678 8a217fa2 Olga Brani
                        {
2679 8a217fa2 Olga Brani
                                _fnProcessingDisplay( oSettings, false );
2680 8a217fa2 Olga Brani
                                _fnInitComplete( oSettings );
2681 8a217fa2 Olga Brani
                        }
2682 8a217fa2 Olga Brani
                }
2683 8a217fa2 Olga Brani
                
2684 8a217fa2 Olga Brani
                
2685 8a217fa2 Olga Brani
                /**
2686 8a217fa2 Olga Brani
                 * Draw the table for the first time, adding all required features
2687 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2688 8a217fa2 Olga Brani
                 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
2689 8a217fa2 Olga Brani
                 *    with client-side processing (optional)
2690 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2691 8a217fa2 Olga Brani
                 */
2692 8a217fa2 Olga Brani
                function _fnInitComplete ( oSettings, json )
2693 8a217fa2 Olga Brani
                {
2694 8a217fa2 Olga Brani
                        oSettings._bInitComplete = true;
2695 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );
2696 8a217fa2 Olga Brani
                }
2697 8a217fa2 Olga Brani
                
2698 8a217fa2 Olga Brani
                
2699 8a217fa2 Olga Brani
                /**
2700 8a217fa2 Olga Brani
                 * Language compatibility - when certain options are given, and others aren't, we
2701 8a217fa2 Olga Brani
                 * need to duplicate the values over, in order to provide backwards compatibility
2702 8a217fa2 Olga Brani
                 * with older language files.
2703 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2704 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2705 8a217fa2 Olga Brani
                 */
2706 8a217fa2 Olga Brani
                function _fnLanguageCompat( oLanguage )
2707 8a217fa2 Olga Brani
                {
2708 8a217fa2 Olga Brani
                        var oDefaults = DataTable.defaults.oLanguage;
2709 8a217fa2 Olga Brani
                
2710 8a217fa2 Olga Brani
                        /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
2711 8a217fa2 Olga Brani
                         * sZeroRecords - assuming that is given.
2712 8a217fa2 Olga Brani
                         */
2713 8a217fa2 Olga Brani
                        if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
2714 8a217fa2 Olga Brani
                                oDefaults.sEmptyTable === "No data available in table" )
2715 8a217fa2 Olga Brani
                        {
2716 8a217fa2 Olga Brani
                                _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
2717 8a217fa2 Olga Brani
                        }
2718 8a217fa2 Olga Brani
                
2719 8a217fa2 Olga Brani
                        /* Likewise with loading records */
2720 8a217fa2 Olga Brani
                        if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
2721 8a217fa2 Olga Brani
                                oDefaults.sLoadingRecords === "Loading..." )
2722 8a217fa2 Olga Brani
                        {
2723 8a217fa2 Olga Brani
                                _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
2724 8a217fa2 Olga Brani
                        }
2725 8a217fa2 Olga Brani
                }
2726 8a217fa2 Olga Brani
                
2727 8a217fa2 Olga Brani
                
2728 8a217fa2 Olga Brani
                
2729 8a217fa2 Olga Brani
                /**
2730 8a217fa2 Olga Brani
                 * Generate the node required for user display length changing
2731 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2732 8a217fa2 Olga Brani
                 *  @returns {node} Display length feature node
2733 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2734 8a217fa2 Olga Brani
                 */
2735 8a217fa2 Olga Brani
                function _fnFeatureHtmlLength ( oSettings )
2736 8a217fa2 Olga Brani
                {
2737 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.bInfinite )
2738 8a217fa2 Olga Brani
                        {
2739 8a217fa2 Olga Brani
                                return null;
2740 8a217fa2 Olga Brani
                        }
2741 8a217fa2 Olga Brani
                        
2742 8a217fa2 Olga Brani
                        /* This can be overruled by not using the _MENU_ var/macro in the language variable */
2743 8a217fa2 Olga Brani
                        var sName = 'name="'+oSettings.sTableId+'_length"';
2744 8a217fa2 Olga Brani
                        var sStdMenu = '<select size="1" '+sName+'>';
2745 8a217fa2 Olga Brani
                        var i, iLen;
2746 8a217fa2 Olga Brani
                        var aLengthMenu = oSettings.aLengthMenu;
2747 8a217fa2 Olga Brani
                        
2748 8a217fa2 Olga Brani
                        if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && 
2749 8a217fa2 Olga Brani
                                        typeof aLengthMenu[1] === 'object' )
2750 8a217fa2 Olga Brani
                        {
2751 8a217fa2 Olga Brani
                                for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )
2752 8a217fa2 Olga Brani
                                {
2753 8a217fa2 Olga Brani
                                        sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>';
2754 8a217fa2 Olga Brani
                                }
2755 8a217fa2 Olga Brani
                        }
2756 8a217fa2 Olga Brani
                        else
2757 8a217fa2 Olga Brani
                        {
2758 8a217fa2 Olga Brani
                                for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )
2759 8a217fa2 Olga Brani
                                {
2760 8a217fa2 Olga Brani
                                        sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>';
2761 8a217fa2 Olga Brani
                                }
2762 8a217fa2 Olga Brani
                        }
2763 8a217fa2 Olga Brani
                        sStdMenu += '</select>';
2764 8a217fa2 Olga Brani
                        
2765 8a217fa2 Olga Brani
                        var nLength = document.createElement( 'div' );
2766 8a217fa2 Olga Brani
                        if ( !oSettings.aanFeatures.l )
2767 8a217fa2 Olga Brani
                        {
2768 8a217fa2 Olga Brani
                                nLength.id = oSettings.sTableId+'_length';
2769 8a217fa2 Olga Brani
                        }
2770 8a217fa2 Olga Brani
                        nLength.className = oSettings.oClasses.sLength;
2771 8a217fa2 Olga Brani
                        nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';
2772 8a217fa2 Olga Brani
                        
2773 8a217fa2 Olga Brani
                        /*
2774 8a217fa2 Olga Brani
                         * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
2775 8a217fa2 Olga Brani
                         * and Stefan Skopnik for fixing the fix!
2776 8a217fa2 Olga Brani
                         */
2777 8a217fa2 Olga Brani
                        $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true);
2778 8a217fa2 Olga Brani
                        
2779 8a217fa2 Olga Brani
                        $('select', nLength).bind( 'change.DT', function(e) {
2780 8a217fa2 Olga Brani
                                var iVal = $(this).val();
2781 8a217fa2 Olga Brani
                                
2782 8a217fa2 Olga Brani
                                /* Update all other length options for the new display */
2783 8a217fa2 Olga Brani
                                var n = oSettings.aanFeatures.l;
2784 8a217fa2 Olga Brani
                                for ( i=0, iLen=n.length ; i<iLen ; i++ )
2785 8a217fa2 Olga Brani
                                {
2786 8a217fa2 Olga Brani
                                        if ( n[i] != this.parentNode )
2787 8a217fa2 Olga Brani
                                        {
2788 8a217fa2 Olga Brani
                                                $('select', n[i]).val( iVal );
2789 8a217fa2 Olga Brani
                                        }
2790 8a217fa2 Olga Brani
                                }
2791 8a217fa2 Olga Brani
                                
2792 8a217fa2 Olga Brani
                                /* Redraw the table */
2793 8a217fa2 Olga Brani
                                oSettings._iDisplayLength = parseInt(iVal, 10);
2794 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
2795 8a217fa2 Olga Brani
                                
2796 8a217fa2 Olga Brani
                                /* If we have space to show extra rows (backing up from the end point - then do so */
2797 8a217fa2 Olga Brani
                                if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
2798 8a217fa2 Olga Brani
                                {
2799 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
2800 8a217fa2 Olga Brani
                                        if ( oSettings._iDisplayStart < 0 )
2801 8a217fa2 Olga Brani
                                        {
2802 8a217fa2 Olga Brani
                                                oSettings._iDisplayStart = 0;
2803 8a217fa2 Olga Brani
                                        }
2804 8a217fa2 Olga Brani
                                }
2805 8a217fa2 Olga Brani
                                
2806 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayLength == -1 )
2807 8a217fa2 Olga Brani
                                {
2808 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = 0;
2809 8a217fa2 Olga Brani
                                }
2810 8a217fa2 Olga Brani
                                
2811 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
2812 8a217fa2 Olga Brani
                        } );
2813 8a217fa2 Olga Brani
                
2814 8a217fa2 Olga Brani
                
2815 8a217fa2 Olga Brani
                        $('select', nLength).attr('aria-controls', oSettings.sTableId);
2816 8a217fa2 Olga Brani
                        
2817 8a217fa2 Olga Brani
                        return nLength;
2818 8a217fa2 Olga Brani
                }
2819 8a217fa2 Olga Brani
                
2820 8a217fa2 Olga Brani
                
2821 8a217fa2 Olga Brani
                /**
2822 8a217fa2 Olga Brani
                 * Recalculate the end point based on the start point
2823 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2824 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2825 8a217fa2 Olga Brani
                 */
2826 8a217fa2 Olga Brani
                function _fnCalculateEnd( oSettings )
2827 8a217fa2 Olga Brani
                {
2828 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bPaginate === false )
2829 8a217fa2 Olga Brani
                        {
2830 8a217fa2 Olga Brani
                                oSettings._iDisplayEnd = oSettings.aiDisplay.length;
2831 8a217fa2 Olga Brani
                        }
2832 8a217fa2 Olga Brani
                        else
2833 8a217fa2 Olga Brani
                        {
2834 8a217fa2 Olga Brani
                                /* Set the end point of the display - based on how many elements there are
2835 8a217fa2 Olga Brani
                                 * still to display
2836 8a217fa2 Olga Brani
                                 */
2837 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
2838 8a217fa2 Olga Brani
                                           oSettings._iDisplayLength == -1 )
2839 8a217fa2 Olga Brani
                                {
2840 8a217fa2 Olga Brani
                                        oSettings._iDisplayEnd = oSettings.aiDisplay.length;
2841 8a217fa2 Olga Brani
                                }
2842 8a217fa2 Olga Brani
                                else
2843 8a217fa2 Olga Brani
                                {
2844 8a217fa2 Olga Brani
                                        oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
2845 8a217fa2 Olga Brani
                                }
2846 8a217fa2 Olga Brani
                        }
2847 8a217fa2 Olga Brani
                }
2848 8a217fa2 Olga Brani
                
2849 8a217fa2 Olga Brani
                
2850 8a217fa2 Olga Brani
                
2851 8a217fa2 Olga Brani
                /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2852 8a217fa2 Olga Brani
                 * Note that most of the paging logic is done in 
2853 8a217fa2 Olga Brani
                 * DataTable.ext.oPagination
2854 8a217fa2 Olga Brani
                 */
2855 8a217fa2 Olga Brani
                
2856 8a217fa2 Olga Brani
                /**
2857 8a217fa2 Olga Brani
                 * Generate the node required for default pagination
2858 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2859 8a217fa2 Olga Brani
                 *  @returns {node} Pagination feature node
2860 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2861 8a217fa2 Olga Brani
                 */
2862 8a217fa2 Olga Brani
                function _fnFeatureHtmlPaginate ( oSettings )
2863 8a217fa2 Olga Brani
                {
2864 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.bInfinite )
2865 8a217fa2 Olga Brani
                        {
2866 8a217fa2 Olga Brani
                                return null;
2867 8a217fa2 Olga Brani
                        }
2868 8a217fa2 Olga Brani
                        
2869 8a217fa2 Olga Brani
                        var nPaginate = document.createElement( 'div' );
2870 8a217fa2 Olga Brani
                        nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
2871 8a217fa2 Olga Brani
                        
2872 8a217fa2 Olga Brani
                        DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, 
2873 8a217fa2 Olga Brani
                                function( oSettings ) {
2874 8a217fa2 Olga Brani
                                        _fnCalculateEnd( oSettings );
2875 8a217fa2 Olga Brani
                                        _fnDraw( oSettings );
2876 8a217fa2 Olga Brani
                                }
2877 8a217fa2 Olga Brani
                        );
2878 8a217fa2 Olga Brani
                        
2879 8a217fa2 Olga Brani
                        /* Add a draw callback for the pagination on first instance, to update the paging display */
2880 8a217fa2 Olga Brani
                        if ( !oSettings.aanFeatures.p )
2881 8a217fa2 Olga Brani
                        {
2882 8a217fa2 Olga Brani
                                oSettings.aoDrawCallback.push( {
2883 8a217fa2 Olga Brani
                                        "fn": function( oSettings ) {
2884 8a217fa2 Olga Brani
                                                DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
2885 8a217fa2 Olga Brani
                                                        _fnCalculateEnd( oSettings );
2886 8a217fa2 Olga Brani
                                                        _fnDraw( oSettings );
2887 8a217fa2 Olga Brani
                                                } );
2888 8a217fa2 Olga Brani
                                        },
2889 8a217fa2 Olga Brani
                                        "sName": "pagination"
2890 8a217fa2 Olga Brani
                                } );
2891 8a217fa2 Olga Brani
                        }
2892 8a217fa2 Olga Brani
                        return nPaginate;
2893 8a217fa2 Olga Brani
                }
2894 8a217fa2 Olga Brani
                
2895 8a217fa2 Olga Brani
                
2896 8a217fa2 Olga Brani
                /**
2897 8a217fa2 Olga Brani
                 * Alter the display settings to change the page
2898 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2899 8a217fa2 Olga Brani
                 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
2900 8a217fa2 Olga Brani
                 *    or page number to jump to (integer)
2901 8a217fa2 Olga Brani
                 *  @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1
2902 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2903 8a217fa2 Olga Brani
                 */
2904 8a217fa2 Olga Brani
                function _fnPageChange ( oSettings, mAction )
2905 8a217fa2 Olga Brani
                {
2906 8a217fa2 Olga Brani
                        var iOldStart = oSettings._iDisplayStart;
2907 8a217fa2 Olga Brani
                        
2908 8a217fa2 Olga Brani
                        if ( typeof mAction === "number" )
2909 8a217fa2 Olga Brani
                        {
2910 8a217fa2 Olga Brani
                                oSettings._iDisplayStart = mAction * oSettings._iDisplayLength;
2911 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )
2912 8a217fa2 Olga Brani
                                {
2913 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = 0;
2914 8a217fa2 Olga Brani
                                }
2915 8a217fa2 Olga Brani
                        }
2916 8a217fa2 Olga Brani
                        else if ( mAction == "first" )
2917 8a217fa2 Olga Brani
                        {
2918 8a217fa2 Olga Brani
                                oSettings._iDisplayStart = 0;
2919 8a217fa2 Olga Brani
                        }
2920 8a217fa2 Olga Brani
                        else if ( mAction == "previous" )
2921 8a217fa2 Olga Brani
                        {
2922 8a217fa2 Olga Brani
                                oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
2923 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart - oSettings._iDisplayLength :
2924 8a217fa2 Olga Brani
                                        0;
2925 8a217fa2 Olga Brani
                                
2926 8a217fa2 Olga Brani
                                /* Correct for under-run */
2927 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayStart < 0 )
2928 8a217fa2 Olga Brani
                                {
2929 8a217fa2 Olga Brani
                                  oSettings._iDisplayStart = 0;
2930 8a217fa2 Olga Brani
                                }
2931 8a217fa2 Olga Brani
                        }
2932 8a217fa2 Olga Brani
                        else if ( mAction == "next" )
2933 8a217fa2 Olga Brani
                        {
2934 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayLength >= 0 )
2935 8a217fa2 Olga Brani
                                {
2936 8a217fa2 Olga Brani
                                        /* Make sure we are not over running the display array */
2937 8a217fa2 Olga Brani
                                        if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
2938 8a217fa2 Olga Brani
                                        {
2939 8a217fa2 Olga Brani
                                                oSettings._iDisplayStart += oSettings._iDisplayLength;
2940 8a217fa2 Olga Brani
                                        }
2941 8a217fa2 Olga Brani
                                }
2942 8a217fa2 Olga Brani
                                else
2943 8a217fa2 Olga Brani
                                {
2944 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = 0;
2945 8a217fa2 Olga Brani
                                }
2946 8a217fa2 Olga Brani
                        }
2947 8a217fa2 Olga Brani
                        else if ( mAction == "last" )
2948 8a217fa2 Olga Brani
                        {
2949 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayLength >= 0 )
2950 8a217fa2 Olga Brani
                                {
2951 8a217fa2 Olga Brani
                                        var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
2952 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
2953 8a217fa2 Olga Brani
                                }
2954 8a217fa2 Olga Brani
                                else
2955 8a217fa2 Olga Brani
                                {
2956 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = 0;
2957 8a217fa2 Olga Brani
                                }
2958 8a217fa2 Olga Brani
                        }
2959 8a217fa2 Olga Brani
                        else
2960 8a217fa2 Olga Brani
                        {
2961 8a217fa2 Olga Brani
                                _fnLog( oSettings, 0, "Unknown paging action: "+mAction );
2962 8a217fa2 Olga Brani
                        }
2963 8a217fa2 Olga Brani
                        $(oSettings.oInstance).trigger('page', oSettings);
2964 8a217fa2 Olga Brani
                        
2965 8a217fa2 Olga Brani
                        return iOldStart != oSettings._iDisplayStart;
2966 8a217fa2 Olga Brani
                }
2967 8a217fa2 Olga Brani
                
2968 8a217fa2 Olga Brani
                
2969 8a217fa2 Olga Brani
                
2970 8a217fa2 Olga Brani
                /**
2971 8a217fa2 Olga Brani
                 * Generate the node required for the processing node
2972 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2973 8a217fa2 Olga Brani
                 *  @returns {node} Processing element
2974 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2975 8a217fa2 Olga Brani
                 */
2976 8a217fa2 Olga Brani
                function _fnFeatureHtmlProcessing ( oSettings )
2977 8a217fa2 Olga Brani
                {
2978 8a217fa2 Olga Brani
                        var nProcessing = document.createElement( 'div' );
2979 8a217fa2 Olga Brani
                        
2980 8a217fa2 Olga Brani
                        if ( !oSettings.aanFeatures.r )
2981 8a217fa2 Olga Brani
                        {
2982 8a217fa2 Olga Brani
                                nProcessing.id = oSettings.sTableId+'_processing';
2983 8a217fa2 Olga Brani
                        }
2984 8a217fa2 Olga Brani
                        nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
2985 8a217fa2 Olga Brani
                        nProcessing.className = oSettings.oClasses.sProcessing;
2986 8a217fa2 Olga Brani
                        oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
2987 8a217fa2 Olga Brani
                        
2988 8a217fa2 Olga Brani
                        return nProcessing;
2989 8a217fa2 Olga Brani
                }
2990 8a217fa2 Olga Brani
                
2991 8a217fa2 Olga Brani
                
2992 8a217fa2 Olga Brani
                /**
2993 8a217fa2 Olga Brani
                 * Display or hide the processing indicator
2994 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
2995 8a217fa2 Olga Brani
                 *  @param {bool} bShow Show the processing indicator (true) or not (false)
2996 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
2997 8a217fa2 Olga Brani
                 */
2998 8a217fa2 Olga Brani
                function _fnProcessingDisplay ( oSettings, bShow )
2999 8a217fa2 Olga Brani
                {
3000 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bProcessing )
3001 8a217fa2 Olga Brani
                        {
3002 8a217fa2 Olga Brani
                                var an = oSettings.aanFeatures.r;
3003 8a217fa2 Olga Brani
                                for ( var i=0, iLen=an.length ; i<iLen ; i++ )
3004 8a217fa2 Olga Brani
                                {
3005 8a217fa2 Olga Brani
                                        an[i].style.visibility = bShow ? "visible" : "hidden";
3006 8a217fa2 Olga Brani
                                }
3007 8a217fa2 Olga Brani
                        }
3008 8a217fa2 Olga Brani
                
3009 8a217fa2 Olga Brani
                        $(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
3010 8a217fa2 Olga Brani
                }
3011 8a217fa2 Olga Brani
                
3012 8a217fa2 Olga Brani
                /**
3013 8a217fa2 Olga Brani
                 * Add any control elements for the table - specifically scrolling
3014 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
3015 8a217fa2 Olga Brani
                 *  @returns {node} Node to add to the DOM
3016 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3017 8a217fa2 Olga Brani
                 */
3018 8a217fa2 Olga Brani
                function _fnFeatureHtmlTable ( oSettings )
3019 8a217fa2 Olga Brani
                {
3020 8a217fa2 Olga Brani
                        /* Check if scrolling is enabled or not - if not then leave the DOM unaltered */
3021 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
3022 8a217fa2 Olga Brani
                        {
3023 8a217fa2 Olga Brani
                                return oSettings.nTable;
3024 8a217fa2 Olga Brani
                        }
3025 8a217fa2 Olga Brani
                        
3026 8a217fa2 Olga Brani
                        /*
3027 8a217fa2 Olga Brani
                         * The HTML structure that we want to generate in this function is:
3028 8a217fa2 Olga Brani
                         *  div - nScroller
3029 8a217fa2 Olga Brani
                         *    div - nScrollHead
3030 8a217fa2 Olga Brani
                         *      div - nScrollHeadInner
3031 8a217fa2 Olga Brani
                         *        table - nScrollHeadTable
3032 8a217fa2 Olga Brani
                         *          thead - nThead
3033 8a217fa2 Olga Brani
                         *    div - nScrollBody
3034 8a217fa2 Olga Brani
                         *      table - oSettings.nTable
3035 8a217fa2 Olga Brani
                         *        thead - nTheadSize
3036 8a217fa2 Olga Brani
                         *        tbody - nTbody
3037 8a217fa2 Olga Brani
                         *    div - nScrollFoot
3038 8a217fa2 Olga Brani
                         *      div - nScrollFootInner
3039 8a217fa2 Olga Brani
                         *        table - nScrollFootTable
3040 8a217fa2 Olga Brani
                         *          tfoot - nTfoot
3041 8a217fa2 Olga Brani
                         */
3042 8a217fa2 Olga Brani
                        var
3043 8a217fa2 Olga Brani
                                 nScroller = document.createElement('div'),
3044 8a217fa2 Olga Brani
                                 nScrollHead = document.createElement('div'),
3045 8a217fa2 Olga Brani
                                 nScrollHeadInner = document.createElement('div'),
3046 8a217fa2 Olga Brani
                                 nScrollBody = document.createElement('div'),
3047 8a217fa2 Olga Brani
                                 nScrollFoot = document.createElement('div'),
3048 8a217fa2 Olga Brani
                                 nScrollFootInner = document.createElement('div'),
3049 8a217fa2 Olga Brani
                                 nScrollHeadTable = oSettings.nTable.cloneNode(false),
3050 8a217fa2 Olga Brani
                                 nScrollFootTable = oSettings.nTable.cloneNode(false),
3051 8a217fa2 Olga Brani
                                nThead = oSettings.nTable.getElementsByTagName('thead')[0],
3052 8a217fa2 Olga Brani
                                 nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : 
3053 8a217fa2 Olga Brani
                                        oSettings.nTable.getElementsByTagName('tfoot')[0],
3054 8a217fa2 Olga Brani
                                oClasses = oSettings.oClasses;
3055 8a217fa2 Olga Brani
                        
3056 8a217fa2 Olga Brani
                        nScrollHead.appendChild( nScrollHeadInner );
3057 8a217fa2 Olga Brani
                        nScrollFoot.appendChild( nScrollFootInner );
3058 8a217fa2 Olga Brani
                        nScrollBody.appendChild( oSettings.nTable );
3059 8a217fa2 Olga Brani
                        nScroller.appendChild( nScrollHead );
3060 8a217fa2 Olga Brani
                        nScroller.appendChild( nScrollBody );
3061 8a217fa2 Olga Brani
                        nScrollHeadInner.appendChild( nScrollHeadTable );
3062 8a217fa2 Olga Brani
                        nScrollHeadTable.appendChild( nThead );
3063 8a217fa2 Olga Brani
                        if ( nTfoot !== null )
3064 8a217fa2 Olga Brani
                        {
3065 8a217fa2 Olga Brani
                                nScroller.appendChild( nScrollFoot );
3066 8a217fa2 Olga Brani
                                nScrollFootInner.appendChild( nScrollFootTable );
3067 8a217fa2 Olga Brani
                                nScrollFootTable.appendChild( nTfoot );
3068 8a217fa2 Olga Brani
                        }
3069 8a217fa2 Olga Brani
                        
3070 8a217fa2 Olga Brani
                        nScroller.className = oClasses.sScrollWrapper;
3071 8a217fa2 Olga Brani
                        nScrollHead.className = oClasses.sScrollHead;
3072 8a217fa2 Olga Brani
                        nScrollHeadInner.className = oClasses.sScrollHeadInner;
3073 8a217fa2 Olga Brani
                        nScrollBody.className = oClasses.sScrollBody;
3074 8a217fa2 Olga Brani
                        nScrollFoot.className = oClasses.sScrollFoot;
3075 8a217fa2 Olga Brani
                        nScrollFootInner.className = oClasses.sScrollFootInner;
3076 8a217fa2 Olga Brani
                        
3077 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.bAutoCss )
3078 8a217fa2 Olga Brani
                        {
3079 8a217fa2 Olga Brani
                                nScrollHead.style.overflow = "hidden";
3080 8a217fa2 Olga Brani
                                nScrollHead.style.position = "relative";
3081 8a217fa2 Olga Brani
                                nScrollFoot.style.overflow = "hidden";
3082 8a217fa2 Olga Brani
                                nScrollBody.style.overflow = "auto";
3083 8a217fa2 Olga Brani
                        }
3084 8a217fa2 Olga Brani
                        
3085 8a217fa2 Olga Brani
                        nScrollHead.style.border = "0";
3086 8a217fa2 Olga Brani
                        nScrollHead.style.width = "100%";
3087 8a217fa2 Olga Brani
                        nScrollFoot.style.border = "0";
3088 8a217fa2 Olga Brani
                        nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
3089 8a217fa2 Olga Brani
                                oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
3090 8a217fa2 Olga Brani
                        
3091 8a217fa2 Olga Brani
                        /* Modify attributes to respect the clones */
3092 8a217fa2 Olga Brani
                        nScrollHeadTable.removeAttribute('id');
3093 8a217fa2 Olga Brani
                        nScrollHeadTable.style.marginLeft = "0";
3094 8a217fa2 Olga Brani
                        oSettings.nTable.style.marginLeft = "0";
3095 8a217fa2 Olga Brani
                        if ( nTfoot !== null )
3096 8a217fa2 Olga Brani
                        {
3097 8a217fa2 Olga Brani
                                nScrollFootTable.removeAttribute('id');
3098 8a217fa2 Olga Brani
                                nScrollFootTable.style.marginLeft = "0";
3099 8a217fa2 Olga Brani
                        }
3100 8a217fa2 Olga Brani
                        
3101 8a217fa2 Olga Brani
                        /* Move caption elements from the body to the header, footer or leave where it is
3102 8a217fa2 Olga Brani
                         * depending on the configuration. Note that the DTD says there can be only one caption */
3103 8a217fa2 Olga Brani
                        var nCaption = $(oSettings.nTable).children('caption');
3104 8a217fa2 Olga Brani
                        if ( nCaption.length > 0 )
3105 8a217fa2 Olga Brani
                        {
3106 8a217fa2 Olga Brani
                                nCaption = nCaption[0];
3107 8a217fa2 Olga Brani
                                if ( nCaption._captionSide === "top" )
3108 8a217fa2 Olga Brani
                                {
3109 8a217fa2 Olga Brani
                                        nScrollHeadTable.appendChild( nCaption );
3110 8a217fa2 Olga Brani
                                }
3111 8a217fa2 Olga Brani
                                else if ( nCaption._captionSide === "bottom" && nTfoot )
3112 8a217fa2 Olga Brani
                                {
3113 8a217fa2 Olga Brani
                                        nScrollFootTable.appendChild( nCaption );
3114 8a217fa2 Olga Brani
                                }
3115 8a217fa2 Olga Brani
                        }
3116 8a217fa2 Olga Brani
                        
3117 8a217fa2 Olga Brani
                        /*
3118 8a217fa2 Olga Brani
                         * Sizing
3119 8a217fa2 Olga Brani
                         */
3120 8a217fa2 Olga Brani
                        /* When x-scrolling add the width and a scroller to move the header with the body */
3121 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.sX !== "" )
3122 8a217fa2 Olga Brani
                        {
3123 8a217fa2 Olga Brani
                                nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
3124 8a217fa2 Olga Brani
                                nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
3125 8a217fa2 Olga Brani
                                
3126 8a217fa2 Olga Brani
                                if ( nTfoot !== null )
3127 8a217fa2 Olga Brani
                                {
3128 8a217fa2 Olga Brani
                                        nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );        
3129 8a217fa2 Olga Brani
                                }
3130 8a217fa2 Olga Brani
                                
3131 8a217fa2 Olga Brani
                                /* When the body is scrolled, then we also want to scroll the headers */
3132 8a217fa2 Olga Brani
                                $(nScrollBody).scroll( function (e) {
3133 8a217fa2 Olga Brani
                                        nScrollHead.scrollLeft = this.scrollLeft;
3134 8a217fa2 Olga Brani
                                        
3135 8a217fa2 Olga Brani
                                        if ( nTfoot !== null )
3136 8a217fa2 Olga Brani
                                        {
3137 8a217fa2 Olga Brani
                                                nScrollFoot.scrollLeft = this.scrollLeft;
3138 8a217fa2 Olga Brani
                                        }
3139 8a217fa2 Olga Brani
                                } );
3140 8a217fa2 Olga Brani
                        }
3141 8a217fa2 Olga Brani
                        
3142 8a217fa2 Olga Brani
                        /* When yscrolling, add the height */
3143 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.sY !== "" )
3144 8a217fa2 Olga Brani
                        {
3145 8a217fa2 Olga Brani
                                nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
3146 8a217fa2 Olga Brani
                        }
3147 8a217fa2 Olga Brani
                        
3148 8a217fa2 Olga Brani
                        /* Redraw - align columns across the tables */
3149 8a217fa2 Olga Brani
                        oSettings.aoDrawCallback.push( {
3150 8a217fa2 Olga Brani
                                "fn": _fnScrollDraw,
3151 8a217fa2 Olga Brani
                                "sName": "scrolling"
3152 8a217fa2 Olga Brani
                        } );
3153 8a217fa2 Olga Brani
                        
3154 8a217fa2 Olga Brani
                        /* Infinite scrolling event handlers */
3155 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.bInfinite )
3156 8a217fa2 Olga Brani
                        {
3157 8a217fa2 Olga Brani
                                $(nScrollBody).scroll( function() {
3158 8a217fa2 Olga Brani
                                        /* Use a blocker to stop scrolling from loading more data while other data is still loading */
3159 8a217fa2 Olga Brani
                                        if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )
3160 8a217fa2 Olga Brani
                                        {
3161 8a217fa2 Olga Brani
                                                /* Check if we should load the next data set */
3162 8a217fa2 Olga Brani
                                                if ( $(this).scrollTop() + $(this).height() > 
3163 8a217fa2 Olga Brani
                                                        $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
3164 8a217fa2 Olga Brani
                                                {
3165 8a217fa2 Olga Brani
                                                        /* Only do the redraw if we have to - we might be at the end of the data */
3166 8a217fa2 Olga Brani
                                                        if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
3167 8a217fa2 Olga Brani
                                                        {
3168 8a217fa2 Olga Brani
                                                                _fnPageChange( oSettings, 'next' );
3169 8a217fa2 Olga Brani
                                                                _fnCalculateEnd( oSettings );
3170 8a217fa2 Olga Brani
                                                                _fnDraw( oSettings );
3171 8a217fa2 Olga Brani
                                                        }
3172 8a217fa2 Olga Brani
                                                }
3173 8a217fa2 Olga Brani
                                        }
3174 8a217fa2 Olga Brani
                                } );
3175 8a217fa2 Olga Brani
                        }
3176 8a217fa2 Olga Brani
                        
3177 8a217fa2 Olga Brani
                        oSettings.nScrollHead = nScrollHead;
3178 8a217fa2 Olga Brani
                        oSettings.nScrollFoot = nScrollFoot;
3179 8a217fa2 Olga Brani
                        
3180 8a217fa2 Olga Brani
                        return nScroller;
3181 8a217fa2 Olga Brani
                }
3182 8a217fa2 Olga Brani
                
3183 8a217fa2 Olga Brani
                
3184 8a217fa2 Olga Brani
                /**
3185 8a217fa2 Olga Brani
                 * Update the various tables for resizing. It's a bit of a pig this function, but
3186 8a217fa2 Olga Brani
                 * basically the idea to:
3187 8a217fa2 Olga Brani
                 *   1. Re-create the table inside the scrolling div
3188 8a217fa2 Olga Brani
                 *   2. Take live measurements from the DOM
3189 8a217fa2 Olga Brani
                 *   3. Apply the measurements
3190 8a217fa2 Olga Brani
                 *   4. Clean up
3191 8a217fa2 Olga Brani
                 *  @param {object} o dataTables settings object
3192 8a217fa2 Olga Brani
                 *  @returns {node} Node to add to the DOM
3193 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3194 8a217fa2 Olga Brani
                 */
3195 8a217fa2 Olga Brani
                function _fnScrollDraw ( o )
3196 8a217fa2 Olga Brani
                {
3197 8a217fa2 Olga Brani
                        var
3198 8a217fa2 Olga Brani
                                nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
3199 8a217fa2 Olga Brani
                                nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
3200 8a217fa2 Olga Brani
                                nScrollBody = o.nTable.parentNode,
3201 8a217fa2 Olga Brani
                                i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
3202 8a217fa2 Olga Brani
                                nTheadSize, nTfootSize,
3203 8a217fa2 Olga Brani
                                iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
3204 8a217fa2 Olga Brani
                                nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
3205 8a217fa2 Olga Brani
                                nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
3206 8a217fa2 Olga Brani
                                ie67 = o.oBrowser.bScrollOversize,
3207 8a217fa2 Olga Brani
                                zeroOut = function(nSizer) {
3208 8a217fa2 Olga Brani
                                        oStyle = nSizer.style;
3209 8a217fa2 Olga Brani
                                        oStyle.paddingTop = "0";
3210 8a217fa2 Olga Brani
                                        oStyle.paddingBottom = "0";
3211 8a217fa2 Olga Brani
                                        oStyle.borderTopWidth = "0";
3212 8a217fa2 Olga Brani
                                        oStyle.borderBottomWidth = "0";
3213 8a217fa2 Olga Brani
                                        oStyle.height = 0;
3214 8a217fa2 Olga Brani
                                };
3215 8a217fa2 Olga Brani
                        
3216 8a217fa2 Olga Brani
                        /*
3217 8a217fa2 Olga Brani
                         * 1. Re-create the table inside the scrolling div
3218 8a217fa2 Olga Brani
                         */
3219 8a217fa2 Olga Brani
                        
3220 8a217fa2 Olga Brani
                        /* Remove the old minimised thead and tfoot elements in the inner table */
3221 8a217fa2 Olga Brani
                        $(o.nTable).children('thead, tfoot').remove();
3222 8a217fa2 Olga Brani
                
3223 8a217fa2 Olga Brani
                        /* Clone the current header and footer elements and then place it into the inner table */
3224 8a217fa2 Olga Brani
                        nTheadSize = $(o.nTHead).clone()[0];
3225 8a217fa2 Olga Brani
                        o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
3226 8a217fa2 Olga Brani
                        anHeadToSize = o.nTHead.getElementsByTagName('tr');
3227 8a217fa2 Olga Brani
                        anHeadSizers = nTheadSize.getElementsByTagName('tr');
3228 8a217fa2 Olga Brani
                        
3229 8a217fa2 Olga Brani
                        if ( o.nTFoot !== null )
3230 8a217fa2 Olga Brani
                        {
3231 8a217fa2 Olga Brani
                                nTfootSize = $(o.nTFoot).clone()[0];
3232 8a217fa2 Olga Brani
                                o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
3233 8a217fa2 Olga Brani
                                anFootToSize = o.nTFoot.getElementsByTagName('tr');
3234 8a217fa2 Olga Brani
                                anFootSizers = nTfootSize.getElementsByTagName('tr');
3235 8a217fa2 Olga Brani
                        }
3236 8a217fa2 Olga Brani
                        
3237 8a217fa2 Olga Brani
                        /*
3238 8a217fa2 Olga Brani
                         * 2. Take live measurements from the DOM - do not alter the DOM itself!
3239 8a217fa2 Olga Brani
                         */
3240 8a217fa2 Olga Brani
                        
3241 8a217fa2 Olga Brani
                        /* Remove old sizing and apply the calculated column widths
3242 8a217fa2 Olga Brani
                         * Get the unique column headers in the newly created (cloned) header. We want to apply the
3243 8a217fa2 Olga Brani
                         * calculated sizes to this header
3244 8a217fa2 Olga Brani
                         */
3245 8a217fa2 Olga Brani
                        if ( o.oScroll.sX === "" )
3246 8a217fa2 Olga Brani
                        {
3247 8a217fa2 Olga Brani
                                nScrollBody.style.width = '100%';
3248 8a217fa2 Olga Brani
                                nScrollHeadInner.parentNode.style.width = '100%';
3249 8a217fa2 Olga Brani
                        }
3250 8a217fa2 Olga Brani
                        
3251 8a217fa2 Olga Brani
                        var nThs = _fnGetUniqueThs( o, nTheadSize );
3252 8a217fa2 Olga Brani
                        for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
3253 8a217fa2 Olga Brani
                        {
3254 8a217fa2 Olga Brani
                                iVis = _fnVisibleToColumnIndex( o, i );
3255 8a217fa2 Olga Brani
                                nThs[i].style.width = o.aoColumns[iVis].sWidth;
3256 8a217fa2 Olga Brani
                        }
3257 8a217fa2 Olga Brani
                        
3258 8a217fa2 Olga Brani
                        if ( o.nTFoot !== null )
3259 8a217fa2 Olga Brani
                        {
3260 8a217fa2 Olga Brani
                                _fnApplyToChildren( function(n) {
3261 8a217fa2 Olga Brani
                                        n.style.width = "";
3262 8a217fa2 Olga Brani
                                }, anFootSizers );
3263 8a217fa2 Olga Brani
                        }
3264 8a217fa2 Olga Brani
                
3265 8a217fa2 Olga Brani
                        // If scroll collapse is enabled, when we put the headers back into the body for sizing, we
3266 8a217fa2 Olga Brani
                        // will end up forcing the scrollbar to appear, making our measurements wrong for when we
3267 8a217fa2 Olga Brani
                        // then hide it (end of this function), so add the header height to the body scroller.
3268 8a217fa2 Olga Brani
                        if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
3269 8a217fa2 Olga Brani
                        {
3270 8a217fa2 Olga Brani
                                nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
3271 8a217fa2 Olga Brani
                        }
3272 8a217fa2 Olga Brani
                        
3273 8a217fa2 Olga Brani
                        /* Size the table as a whole */
3274 8a217fa2 Olga Brani
                        iSanityWidth = $(o.nTable).outerWidth();
3275 8a217fa2 Olga Brani
                        if ( o.oScroll.sX === "" )
3276 8a217fa2 Olga Brani
                        {
3277 8a217fa2 Olga Brani
                                /* No x scrolling */
3278 8a217fa2 Olga Brani
                                o.nTable.style.width = "100%";
3279 8a217fa2 Olga Brani
                                
3280 8a217fa2 Olga Brani
                                /* I know this is rubbish - but IE7 will make the width of the table when 100% include
3281 8a217fa2 Olga Brani
                                 * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this
3282 8a217fa2 Olga Brani
                                 * into account.
3283 8a217fa2 Olga Brani
                                 */
3284 8a217fa2 Olga Brani
                                if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || 
3285 8a217fa2 Olga Brani
                                        $(nScrollBody).css('overflow-y') == "scroll")  )
3286 8a217fa2 Olga Brani
                                {
3287 8a217fa2 Olga Brani
                                        o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
3288 8a217fa2 Olga Brani
                                }
3289 8a217fa2 Olga Brani
                        }
3290 8a217fa2 Olga Brani
                        else
3291 8a217fa2 Olga Brani
                        {
3292 8a217fa2 Olga Brani
                                if ( o.oScroll.sXInner !== "" )
3293 8a217fa2 Olga Brani
                                {
3294 8a217fa2 Olga Brani
                                        /* x scroll inner has been given - use it */
3295 8a217fa2 Olga Brani
                                        o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
3296 8a217fa2 Olga Brani
                                }
3297 8a217fa2 Olga Brani
                                else if ( iSanityWidth == $(nScrollBody).width() &&
3298 8a217fa2 Olga Brani
                                   $(nScrollBody).height() < $(o.nTable).height() )
3299 8a217fa2 Olga Brani
                                {
3300 8a217fa2 Olga Brani
                                        /* There is y-scrolling - try to take account of the y scroll bar */
3301 8a217fa2 Olga Brani
                                        o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
3302 8a217fa2 Olga Brani
                                        if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
3303 8a217fa2 Olga Brani
                                        {
3304 8a217fa2 Olga Brani
                                                /* Not possible to take account of it */
3305 8a217fa2 Olga Brani
                                                o.nTable.style.width = _fnStringToCss( iSanityWidth );
3306 8a217fa2 Olga Brani
                                        }
3307 8a217fa2 Olga Brani
                                }
3308 8a217fa2 Olga Brani
                                else
3309 8a217fa2 Olga Brani
                                {
3310 8a217fa2 Olga Brani
                                        /* All else fails */
3311 8a217fa2 Olga Brani
                                        o.nTable.style.width = _fnStringToCss( iSanityWidth );
3312 8a217fa2 Olga Brani
                                }
3313 8a217fa2 Olga Brani
                        }
3314 8a217fa2 Olga Brani
                        
3315 8a217fa2 Olga Brani
                        /* Recalculate the sanity width - now that we've applied the required width, before it was
3316 8a217fa2 Olga Brani
                         * a temporary variable. This is required because the column width calculation is done
3317 8a217fa2 Olga Brani
                         * before this table DOM is created.
3318 8a217fa2 Olga Brani
                         */
3319 8a217fa2 Olga Brani
                        iSanityWidth = $(o.nTable).outerWidth();
3320 8a217fa2 Olga Brani
                        
3321 8a217fa2 Olga Brani
                        /* We want the hidden header to have zero height, so remove padding and borders. Then
3322 8a217fa2 Olga Brani
                         * set the width based on the real headers
3323 8a217fa2 Olga Brani
                         */
3324 8a217fa2 Olga Brani
                        
3325 8a217fa2 Olga Brani
                        // Apply all styles in one pass. Invalidates layout only once because we don't read any 
3326 8a217fa2 Olga Brani
                        // DOM properties.
3327 8a217fa2 Olga Brani
                        _fnApplyToChildren( zeroOut, anHeadSizers );
3328 8a217fa2 Olga Brani
                         
3329 8a217fa2 Olga Brani
                        // Read all widths in next pass. Forces layout only once because we do not change 
3330 8a217fa2 Olga Brani
                        // any DOM properties.
3331 8a217fa2 Olga Brani
                        _fnApplyToChildren( function(nSizer) {
3332 8a217fa2 Olga Brani
                                aApplied.push( _fnStringToCss( $(nSizer).width() ) );
3333 8a217fa2 Olga Brani
                        }, anHeadSizers );
3334 8a217fa2 Olga Brani
                         
3335 8a217fa2 Olga Brani
                        // Apply all widths in final pass. Invalidates layout only once because we do not
3336 8a217fa2 Olga Brani
                        // read any DOM properties.
3337 8a217fa2 Olga Brani
                        _fnApplyToChildren( function(nToSize, i) {
3338 8a217fa2 Olga Brani
                                nToSize.style.width = aApplied[i];
3339 8a217fa2 Olga Brani
                        }, anHeadToSize );
3340 8a217fa2 Olga Brani
                
3341 8a217fa2 Olga Brani
                        $(anHeadSizers).height(0);
3342 8a217fa2 Olga Brani
                        
3343 8a217fa2 Olga Brani
                        /* Same again with the footer if we have one */
3344 8a217fa2 Olga Brani
                        if ( o.nTFoot !== null )
3345 8a217fa2 Olga Brani
                        {
3346 8a217fa2 Olga Brani
                                _fnApplyToChildren( zeroOut, anFootSizers );
3347 8a217fa2 Olga Brani
                                 
3348 8a217fa2 Olga Brani
                                _fnApplyToChildren( function(nSizer) {
3349 8a217fa2 Olga Brani
                                        aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
3350 8a217fa2 Olga Brani
                                }, anFootSizers );
3351 8a217fa2 Olga Brani
                                 
3352 8a217fa2 Olga Brani
                                _fnApplyToChildren( function(nToSize, i) {
3353 8a217fa2 Olga Brani
                                        nToSize.style.width = aAppliedFooter[i];
3354 8a217fa2 Olga Brani
                                }, anFootToSize );
3355 8a217fa2 Olga Brani
                
3356 8a217fa2 Olga Brani
                                $(anFootSizers).height(0);
3357 8a217fa2 Olga Brani
                        }
3358 8a217fa2 Olga Brani
                        
3359 8a217fa2 Olga Brani
                        /*
3360 8a217fa2 Olga Brani
                         * 3. Apply the measurements
3361 8a217fa2 Olga Brani
                         */
3362 8a217fa2 Olga Brani
                        
3363 8a217fa2 Olga Brani
                        /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
3364 8a217fa2 Olga Brani
                         * to what they currently are
3365 8a217fa2 Olga Brani
                         */
3366 8a217fa2 Olga Brani
                        _fnApplyToChildren( function(nSizer, i) {
3367 8a217fa2 Olga Brani
                                nSizer.innerHTML = "";
3368 8a217fa2 Olga Brani
                                nSizer.style.width = aApplied[i];
3369 8a217fa2 Olga Brani
                        }, anHeadSizers );
3370 8a217fa2 Olga Brani
                        
3371 8a217fa2 Olga Brani
                        if ( o.nTFoot !== null )
3372 8a217fa2 Olga Brani
                        {
3373 8a217fa2 Olga Brani
                                _fnApplyToChildren( function(nSizer, i) {
3374 8a217fa2 Olga Brani
                                        nSizer.innerHTML = "";
3375 8a217fa2 Olga Brani
                                        nSizer.style.width = aAppliedFooter[i];
3376 8a217fa2 Olga Brani
                                }, anFootSizers );
3377 8a217fa2 Olga Brani
                        }
3378 8a217fa2 Olga Brani
                        
3379 8a217fa2 Olga Brani
                        /* Sanity check that the table is of a sensible width. If not then we are going to get
3380 8a217fa2 Olga Brani
                         * misalignment - try to prevent this by not allowing the table to shrink below its min width
3381 8a217fa2 Olga Brani
                         */
3382 8a217fa2 Olga Brani
                        if ( $(o.nTable).outerWidth() < iSanityWidth )
3383 8a217fa2 Olga Brani
                        {
3384 8a217fa2 Olga Brani
                                /* The min width depends upon if we have a vertical scrollbar visible or not */
3385 8a217fa2 Olga Brani
                                var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || 
3386 8a217fa2 Olga Brani
                                        $(nScrollBody).css('overflow-y') == "scroll")) ?
3387 8a217fa2 Olga Brani
                                                iSanityWidth+o.oScroll.iBarWidth : iSanityWidth;
3388 8a217fa2 Olga Brani
                                
3389 8a217fa2 Olga Brani
                                /* IE6/7 are a law unto themselves... */
3390 8a217fa2 Olga Brani
                                if ( ie67 && (nScrollBody.scrollHeight > 
3391 8a217fa2 Olga Brani
                                        nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll")  )
3392 8a217fa2 Olga Brani
                                {
3393 8a217fa2 Olga Brani
                                        o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );
3394 8a217fa2 Olga Brani
                                }
3395 8a217fa2 Olga Brani
                                
3396 8a217fa2 Olga Brani
                                /* Apply the calculated minimum width to the table wrappers */
3397 8a217fa2 Olga Brani
                                nScrollBody.style.width = _fnStringToCss( iCorrection );
3398 8a217fa2 Olga Brani
                                o.nScrollHead.style.width = _fnStringToCss( iCorrection );
3399 8a217fa2 Olga Brani
                                
3400 8a217fa2 Olga Brani
                                if ( o.nTFoot !== null )
3401 8a217fa2 Olga Brani
                                {
3402 8a217fa2 Olga Brani
                                        o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
3403 8a217fa2 Olga Brani
                                }
3404 8a217fa2 Olga Brani
                                
3405 8a217fa2 Olga Brani
                                /* And give the user a warning that we've stopped the table getting too small */
3406 8a217fa2 Olga Brani
                                if ( o.oScroll.sX === "" )
3407 8a217fa2 Olga Brani
                                {
3408 8a217fa2 Olga Brani
                                        _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
3409 8a217fa2 Olga Brani
                                                " misalignment. The table has been drawn at its minimum possible width." );
3410 8a217fa2 Olga Brani
                                }
3411 8a217fa2 Olga Brani
                                else if ( o.oScroll.sXInner !== "" )
3412 8a217fa2 Olga Brani
                                {
3413 8a217fa2 Olga Brani
                                        _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
3414 8a217fa2 Olga Brani
                                                " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+
3415 8a217fa2 Olga Brani
                                                " calculation" );
3416 8a217fa2 Olga Brani
                                }
3417 8a217fa2 Olga Brani
                        }
3418 8a217fa2 Olga Brani
                        else
3419 8a217fa2 Olga Brani
                        {
3420 8a217fa2 Olga Brani
                                nScrollBody.style.width = _fnStringToCss( '100%' );
3421 8a217fa2 Olga Brani
                                o.nScrollHead.style.width = _fnStringToCss( '100%' );
3422 8a217fa2 Olga Brani
                                
3423 8a217fa2 Olga Brani
                                if ( o.nTFoot !== null )
3424 8a217fa2 Olga Brani
                                {
3425 8a217fa2 Olga Brani
                                        o.nScrollFoot.style.width = _fnStringToCss( '100%' );
3426 8a217fa2 Olga Brani
                                }
3427 8a217fa2 Olga Brani
                        }
3428 8a217fa2 Olga Brani
                        
3429 8a217fa2 Olga Brani
                        
3430 8a217fa2 Olga Brani
                        /*
3431 8a217fa2 Olga Brani
                         * 4. Clean up
3432 8a217fa2 Olga Brani
                         */
3433 8a217fa2 Olga Brani
                        if ( o.oScroll.sY === "" )
3434 8a217fa2 Olga Brani
                        {
3435 8a217fa2 Olga Brani
                                /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
3436 8a217fa2 Olga Brani
                                 * the scrollbar height from the visible display, rather than adding it on. We need to
3437 8a217fa2 Olga Brani
                                 * set the height in order to sort this. Don't want to do it in any other browsers.
3438 8a217fa2 Olga Brani
                                 */
3439 8a217fa2 Olga Brani
                                if ( ie67 )
3440 8a217fa2 Olga Brani
                                {
3441 8a217fa2 Olga Brani
                                        nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
3442 8a217fa2 Olga Brani
                                }
3443 8a217fa2 Olga Brani
                        }
3444 8a217fa2 Olga Brani
                        
3445 8a217fa2 Olga Brani
                        if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
3446 8a217fa2 Olga Brani
                        {
3447 8a217fa2 Olga Brani
                                nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
3448 8a217fa2 Olga Brani
                                
3449 8a217fa2 Olga Brani
                                var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
3450 8a217fa2 Olga Brani
                                         o.oScroll.iBarWidth : 0;
3451 8a217fa2 Olga Brani
                                if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
3452 8a217fa2 Olga Brani
                                {
3453 8a217fa2 Olga Brani
                                        nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
3454 8a217fa2 Olga Brani
                                }
3455 8a217fa2 Olga Brani
                        }
3456 8a217fa2 Olga Brani
                        
3457 8a217fa2 Olga Brani
                        /* Finally set the width's of the header and footer tables */
3458 8a217fa2 Olga Brani
                        var iOuterWidth = $(o.nTable).outerWidth();
3459 8a217fa2 Olga Brani
                        nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
3460 8a217fa2 Olga Brani
                        nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
3461 8a217fa2 Olga Brani
                
3462 8a217fa2 Olga Brani
                        // Figure out if there are scrollbar present - if so then we need a the header and footer to
3463 8a217fa2 Olga Brani
                        // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
3464 8a217fa2 Olga Brani
                        var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
3465 8a217fa2 Olga Brani
                        nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
3466 8a217fa2 Olga Brani
                        
3467 8a217fa2 Olga Brani
                        if ( o.nTFoot !== null )
3468 8a217fa2 Olga Brani
                        {
3469 8a217fa2 Olga Brani
                                nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
3470 8a217fa2 Olga Brani
                                nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
3471 8a217fa2 Olga Brani
                                nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
3472 8a217fa2 Olga Brani
                        }
3473 8a217fa2 Olga Brani
                
3474 8a217fa2 Olga Brani
                        /* Adjust the position of the header in case we loose the y-scrollbar */
3475 8a217fa2 Olga Brani
                        $(nScrollBody).scroll();
3476 8a217fa2 Olga Brani
                        
3477 8a217fa2 Olga Brani
                        /* If sorting or filtering has occurred, jump the scrolling back to the top */
3478 8a217fa2 Olga Brani
                        if ( o.bSorted || o.bFiltered )
3479 8a217fa2 Olga Brani
                        {
3480 8a217fa2 Olga Brani
                                nScrollBody.scrollTop = 0;
3481 8a217fa2 Olga Brani
                        }
3482 8a217fa2 Olga Brani
                }
3483 8a217fa2 Olga Brani
                
3484 8a217fa2 Olga Brani
                
3485 8a217fa2 Olga Brani
                /**
3486 8a217fa2 Olga Brani
                 * Apply a given function to the display child nodes of an element array (typically
3487 8a217fa2 Olga Brani
                 * TD children of TR rows
3488 8a217fa2 Olga Brani
                 *  @param {function} fn Method to apply to the objects
3489 8a217fa2 Olga Brani
                 *  @param array {nodes} an1 List of elements to look through for display children
3490 8a217fa2 Olga Brani
                 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
3491 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3492 8a217fa2 Olga Brani
                 */
3493 8a217fa2 Olga Brani
                function _fnApplyToChildren( fn, an1, an2 )
3494 8a217fa2 Olga Brani
                {
3495 8a217fa2 Olga Brani
                        var index=0, i=0, iLen=an1.length;
3496 8a217fa2 Olga Brani
                        var nNode1, nNode2;
3497 8a217fa2 Olga Brani
                
3498 8a217fa2 Olga Brani
                        while ( i < iLen )
3499 8a217fa2 Olga Brani
                        {
3500 8a217fa2 Olga Brani
                                nNode1 = an1[i].firstChild;
3501 8a217fa2 Olga Brani
                                nNode2 = an2 ? an2[i].firstChild : null;
3502 8a217fa2 Olga Brani
                                while ( nNode1 )
3503 8a217fa2 Olga Brani
                                {
3504 8a217fa2 Olga Brani
                                        if ( nNode1.nodeType === 1 )
3505 8a217fa2 Olga Brani
                                        {
3506 8a217fa2 Olga Brani
                                                if ( an2 )
3507 8a217fa2 Olga Brani
                                                {
3508 8a217fa2 Olga Brani
                                                        fn( nNode1, nNode2, index );
3509 8a217fa2 Olga Brani
                                                }
3510 8a217fa2 Olga Brani
                                                else
3511 8a217fa2 Olga Brani
                                                {
3512 8a217fa2 Olga Brani
                                                        fn( nNode1, index );
3513 8a217fa2 Olga Brani
                                                }
3514 8a217fa2 Olga Brani
                                                index++;
3515 8a217fa2 Olga Brani
                                        }
3516 8a217fa2 Olga Brani
                                        nNode1 = nNode1.nextSibling;
3517 8a217fa2 Olga Brani
                                        nNode2 = an2 ? nNode2.nextSibling : null;
3518 8a217fa2 Olga Brani
                                }
3519 8a217fa2 Olga Brani
                                i++;
3520 8a217fa2 Olga Brani
                        }
3521 8a217fa2 Olga Brani
                }
3522 8a217fa2 Olga Brani
                
3523 8a217fa2 Olga Brani
                /**
3524 8a217fa2 Olga Brani
                 * Convert a CSS unit width to pixels (e.g. 2em)
3525 8a217fa2 Olga Brani
                 *  @param {string} sWidth width to be converted
3526 8a217fa2 Olga Brani
                 *  @param {node} nParent parent to get the with for (required for relative widths) - optional
3527 8a217fa2 Olga Brani
                 *  @returns {int} iWidth width in pixels
3528 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3529 8a217fa2 Olga Brani
                 */
3530 8a217fa2 Olga Brani
                function _fnConvertToWidth ( sWidth, nParent )
3531 8a217fa2 Olga Brani
                {
3532 8a217fa2 Olga Brani
                        if ( !sWidth || sWidth === null || sWidth === '' )
3533 8a217fa2 Olga Brani
                        {
3534 8a217fa2 Olga Brani
                                return 0;
3535 8a217fa2 Olga Brani
                        }
3536 8a217fa2 Olga Brani
                        
3537 8a217fa2 Olga Brani
                        if ( !nParent )
3538 8a217fa2 Olga Brani
                        {
3539 8a217fa2 Olga Brani
                                nParent = document.body;
3540 8a217fa2 Olga Brani
                        }
3541 8a217fa2 Olga Brani
                        
3542 8a217fa2 Olga Brani
                        var iWidth;
3543 8a217fa2 Olga Brani
                        var nTmp = document.createElement( "div" );
3544 8a217fa2 Olga Brani
                        nTmp.style.width = _fnStringToCss( sWidth );
3545 8a217fa2 Olga Brani
                        
3546 8a217fa2 Olga Brani
                        nParent.appendChild( nTmp );
3547 8a217fa2 Olga Brani
                        iWidth = nTmp.offsetWidth;
3548 8a217fa2 Olga Brani
                        nParent.removeChild( nTmp );
3549 8a217fa2 Olga Brani
                        
3550 8a217fa2 Olga Brani
                        return ( iWidth );
3551 8a217fa2 Olga Brani
                }
3552 8a217fa2 Olga Brani
                
3553 8a217fa2 Olga Brani
                
3554 8a217fa2 Olga Brani
                /**
3555 8a217fa2 Olga Brani
                 * Calculate the width of columns for the table
3556 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
3557 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3558 8a217fa2 Olga Brani
                 */
3559 8a217fa2 Olga Brani
                function _fnCalculateColumnWidths ( oSettings )
3560 8a217fa2 Olga Brani
                {
3561 8a217fa2 Olga Brani
                        var iTableWidth = oSettings.nTable.offsetWidth;
3562 8a217fa2 Olga Brani
                        var iUserInputs = 0;
3563 8a217fa2 Olga Brani
                        var iTmpWidth;
3564 8a217fa2 Olga Brani
                        var iVisibleColumns = 0;
3565 8a217fa2 Olga Brani
                        var iColums = oSettings.aoColumns.length;
3566 8a217fa2 Olga Brani
                        var i, iIndex, iCorrector, iWidth;
3567 8a217fa2 Olga Brani
                        var oHeaders = $('th', oSettings.nTHead);
3568 8a217fa2 Olga Brani
                        var widthAttr = oSettings.nTable.getAttribute('width');
3569 8a217fa2 Olga Brani
                        var nWrapper = oSettings.nTable.parentNode;
3570 8a217fa2 Olga Brani
                        
3571 8a217fa2 Olga Brani
                        /* Convert any user input sizes into pixel sizes */
3572 8a217fa2 Olga Brani
                        for ( i=0 ; i<iColums ; i++ )
3573 8a217fa2 Olga Brani
                        {
3574 8a217fa2 Olga Brani
                                if ( oSettings.aoColumns[i].bVisible )
3575 8a217fa2 Olga Brani
                                {
3576 8a217fa2 Olga Brani
                                        iVisibleColumns++;
3577 8a217fa2 Olga Brani
                                        
3578 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].sWidth !== null )
3579 8a217fa2 Olga Brani
                                        {
3580 8a217fa2 Olga Brani
                                                iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, 
3581 8a217fa2 Olga Brani
                                                        nWrapper );
3582 8a217fa2 Olga Brani
                                                if ( iTmpWidth !== null )
3583 8a217fa2 Olga Brani
                                                {
3584 8a217fa2 Olga Brani
                                                        oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
3585 8a217fa2 Olga Brani
                                                }
3586 8a217fa2 Olga Brani
                                                        
3587 8a217fa2 Olga Brani
                                                iUserInputs++;
3588 8a217fa2 Olga Brani
                                        }
3589 8a217fa2 Olga Brani
                                }
3590 8a217fa2 Olga Brani
                        }
3591 8a217fa2 Olga Brani
                        
3592 8a217fa2 Olga Brani
                        /* If the number of columns in the DOM equals the number that we have to process in 
3593 8a217fa2 Olga Brani
                         * DataTables, then we can use the offsets that are created by the web-browser. No custom 
3594 8a217fa2 Olga Brani
                         * sizes can be set in order for this to happen, nor scrolling used
3595 8a217fa2 Olga Brani
                         */
3596 8a217fa2 Olga Brani
                        if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
3597 8a217fa2 Olga Brani
                                oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
3598 8a217fa2 Olga Brani
                        {
3599 8a217fa2 Olga Brani
                                for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
3600 8a217fa2 Olga Brani
                                {
3601 8a217fa2 Olga Brani
                                        iTmpWidth = $(oHeaders[i]).width();
3602 8a217fa2 Olga Brani
                                        if ( iTmpWidth !== null )
3603 8a217fa2 Olga Brani
                                        {
3604 8a217fa2 Olga Brani
                                                oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
3605 8a217fa2 Olga Brani
                                        }
3606 8a217fa2 Olga Brani
                                }
3607 8a217fa2 Olga Brani
                        }
3608 8a217fa2 Olga Brani
                        else
3609 8a217fa2 Olga Brani
                        {
3610 8a217fa2 Olga Brani
                                /* Otherwise we are going to have to do some calculations to get the width of each column.
3611 8a217fa2 Olga Brani
                                 * Construct a 1 row table with the widest node in the data, and any user defined widths,
3612 8a217fa2 Olga Brani
                                 * then insert it into the DOM and allow the browser to do all the hard work of
3613 8a217fa2 Olga Brani
                                 * calculating table widths.
3614 8a217fa2 Olga Brani
                                 */
3615 8a217fa2 Olga Brani
                                var
3616 8a217fa2 Olga Brani
                                        nCalcTmp = oSettings.nTable.cloneNode( false ),
3617 8a217fa2 Olga Brani
                                        nTheadClone = oSettings.nTHead.cloneNode(true),
3618 8a217fa2 Olga Brani
                                        nBody = document.createElement( 'tbody' ),
3619 8a217fa2 Olga Brani
                                        nTr = document.createElement( 'tr' ),
3620 8a217fa2 Olga Brani
                                        nDivSizing;
3621 8a217fa2 Olga Brani
                                
3622 8a217fa2 Olga Brani
                                nCalcTmp.removeAttribute( "id" );
3623 8a217fa2 Olga Brani
                                nCalcTmp.appendChild( nTheadClone );
3624 8a217fa2 Olga Brani
                                if ( oSettings.nTFoot !== null )
3625 8a217fa2 Olga Brani
                                {
3626 8a217fa2 Olga Brani
                                        nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
3627 8a217fa2 Olga Brani
                                        _fnApplyToChildren( function(n) {
3628 8a217fa2 Olga Brani
                                                n.style.width = "";
3629 8a217fa2 Olga Brani
                                        }, nCalcTmp.getElementsByTagName('tr') );
3630 8a217fa2 Olga Brani
                                }
3631 8a217fa2 Olga Brani
                                
3632 8a217fa2 Olga Brani
                                nCalcTmp.appendChild( nBody );
3633 8a217fa2 Olga Brani
                                nBody.appendChild( nTr );
3634 8a217fa2 Olga Brani
                                
3635 8a217fa2 Olga Brani
                                /* Remove any sizing that was previously applied by the styles */
3636 8a217fa2 Olga Brani
                                var jqColSizing = $('thead th', nCalcTmp);
3637 8a217fa2 Olga Brani
                                if ( jqColSizing.length === 0 )
3638 8a217fa2 Olga Brani
                                {
3639 8a217fa2 Olga Brani
                                        jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
3640 8a217fa2 Olga Brani
                                }
3641 8a217fa2 Olga Brani
                
3642 8a217fa2 Olga Brani
                                /* Apply custom sizing to the cloned header */
3643 8a217fa2 Olga Brani
                                var nThs = _fnGetUniqueThs( oSettings, nTheadClone );
3644 8a217fa2 Olga Brani
                                iCorrector = 0;
3645 8a217fa2 Olga Brani
                                for ( i=0 ; i<iColums ; i++ )
3646 8a217fa2 Olga Brani
                                {
3647 8a217fa2 Olga Brani
                                        var oColumn = oSettings.aoColumns[i];
3648 8a217fa2 Olga Brani
                                        if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" )
3649 8a217fa2 Olga Brani
                                        {
3650 8a217fa2 Olga Brani
                                                nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );
3651 8a217fa2 Olga Brani
                                        }
3652 8a217fa2 Olga Brani
                                        else if ( oColumn.bVisible )
3653 8a217fa2 Olga Brani
                                        {
3654 8a217fa2 Olga Brani
                                                nThs[i-iCorrector].style.width = "";
3655 8a217fa2 Olga Brani
                                        }
3656 8a217fa2 Olga Brani
                                        else
3657 8a217fa2 Olga Brani
                                        {
3658 8a217fa2 Olga Brani
                                                iCorrector++;
3659 8a217fa2 Olga Brani
                                        }
3660 8a217fa2 Olga Brani
                                }
3661 8a217fa2 Olga Brani
                
3662 8a217fa2 Olga Brani
                                /* Find the biggest td for each column and put it into the table */
3663 8a217fa2 Olga Brani
                                for ( i=0 ; i<iColums ; i++ )
3664 8a217fa2 Olga Brani
                                {
3665 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].bVisible )
3666 8a217fa2 Olga Brani
                                        {
3667 8a217fa2 Olga Brani
                                                var nTd = _fnGetWidestNode( oSettings, i );
3668 8a217fa2 Olga Brani
                                                if ( nTd !== null )
3669 8a217fa2 Olga Brani
                                                {
3670 8a217fa2 Olga Brani
                                                        nTd = nTd.cloneNode(true);
3671 8a217fa2 Olga Brani
                                                        if ( oSettings.aoColumns[i].sContentPadding !== "" )
3672 8a217fa2 Olga Brani
                                                        {
3673 8a217fa2 Olga Brani
                                                                nTd.innerHTML += oSettings.aoColumns[i].sContentPadding;
3674 8a217fa2 Olga Brani
                                                        }
3675 8a217fa2 Olga Brani
                                                        nTr.appendChild( nTd );
3676 8a217fa2 Olga Brani
                                                }
3677 8a217fa2 Olga Brani
                                        }
3678 8a217fa2 Olga Brani
                                }
3679 8a217fa2 Olga Brani
                                
3680 8a217fa2 Olga Brani
                                /* Build the table and 'display' it */
3681 8a217fa2 Olga Brani
                                nWrapper.appendChild( nCalcTmp );
3682 8a217fa2 Olga Brani
                                
3683 8a217fa2 Olga Brani
                                /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
3684 8a217fa2 Olga Brani
                                 * when not scrolling leave the table width as it is. This results in slightly different,
3685 8a217fa2 Olga Brani
                                 * but I think correct behaviour
3686 8a217fa2 Olga Brani
                                 */
3687 8a217fa2 Olga Brani
                                if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
3688 8a217fa2 Olga Brani
                                {
3689 8a217fa2 Olga Brani
                                        nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
3690 8a217fa2 Olga Brani
                                }
3691 8a217fa2 Olga Brani
                                else if ( oSettings.oScroll.sX !== "" )
3692 8a217fa2 Olga Brani
                                {
3693 8a217fa2 Olga Brani
                                        nCalcTmp.style.width = "";
3694 8a217fa2 Olga Brani
                                        if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
3695 8a217fa2 Olga Brani
                                        {
3696 8a217fa2 Olga Brani
                                                nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
3697 8a217fa2 Olga Brani
                                        }
3698 8a217fa2 Olga Brani
                                }
3699 8a217fa2 Olga Brani
                                else if ( oSettings.oScroll.sY !== "" )
3700 8a217fa2 Olga Brani
                                {
3701 8a217fa2 Olga Brani
                                        nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
3702 8a217fa2 Olga Brani
                                }
3703 8a217fa2 Olga Brani
                                else if ( widthAttr )
3704 8a217fa2 Olga Brani
                                {
3705 8a217fa2 Olga Brani
                                        nCalcTmp.style.width = _fnStringToCss( widthAttr );
3706 8a217fa2 Olga Brani
                                }
3707 8a217fa2 Olga Brani
                                nCalcTmp.style.visibility = "hidden";
3708 8a217fa2 Olga Brani
                                
3709 8a217fa2 Olga Brani
                                /* Scrolling considerations */
3710 8a217fa2 Olga Brani
                                _fnScrollingWidthAdjust( oSettings, nCalcTmp );
3711 8a217fa2 Olga Brani
                                
3712 8a217fa2 Olga Brani
                                /* Read the width's calculated by the browser and store them for use by the caller. We
3713 8a217fa2 Olga Brani
                                 * first of all try to use the elements in the body, but it is possible that there are
3714 8a217fa2 Olga Brani
                                 * no elements there, under which circumstances we use the header elements
3715 8a217fa2 Olga Brani
                                 */
3716 8a217fa2 Olga Brani
                                var oNodes = $("tbody tr:eq(0)", nCalcTmp).children();
3717 8a217fa2 Olga Brani
                                if ( oNodes.length === 0 )
3718 8a217fa2 Olga Brani
                                {
3719 8a217fa2 Olga Brani
                                        oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );
3720 8a217fa2 Olga Brani
                                }
3721 8a217fa2 Olga Brani
                
3722 8a217fa2 Olga Brani
                                /* Browsers need a bit of a hand when a width is assigned to any columns when 
3723 8a217fa2 Olga Brani
                                 * x-scrolling as they tend to collapse the table to the min-width, even if
3724 8a217fa2 Olga Brani
                                 * we sent the column widths. So we need to keep track of what the table width
3725 8a217fa2 Olga Brani
                                 * should be by summing the user given values, and the automatic values
3726 8a217fa2 Olga Brani
                                 */
3727 8a217fa2 Olga Brani
                                if ( oSettings.oScroll.sX !== "" )
3728 8a217fa2 Olga Brani
                                {
3729 8a217fa2 Olga Brani
                                        var iTotal = 0;
3730 8a217fa2 Olga Brani
                                        iCorrector = 0;
3731 8a217fa2 Olga Brani
                                        for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
3732 8a217fa2 Olga Brani
                                        {
3733 8a217fa2 Olga Brani
                                                if ( oSettings.aoColumns[i].bVisible )
3734 8a217fa2 Olga Brani
                                                {
3735 8a217fa2 Olga Brani
                                                        if ( oSettings.aoColumns[i].sWidthOrig === null )
3736 8a217fa2 Olga Brani
                                                        {
3737 8a217fa2 Olga Brani
                                                                iTotal += $(oNodes[iCorrector]).outerWidth();
3738 8a217fa2 Olga Brani
                                                        }
3739 8a217fa2 Olga Brani
                                                        else
3740 8a217fa2 Olga Brani
                                                        {
3741 8a217fa2 Olga Brani
                                                                iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +
3742 8a217fa2 Olga Brani
                                                                        ($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());
3743 8a217fa2 Olga Brani
                                                        }
3744 8a217fa2 Olga Brani
                                                        iCorrector++;
3745 8a217fa2 Olga Brani
                                                }
3746 8a217fa2 Olga Brani
                                        }
3747 8a217fa2 Olga Brani
                                        
3748 8a217fa2 Olga Brani
                                        nCalcTmp.style.width = _fnStringToCss( iTotal );
3749 8a217fa2 Olga Brani
                                        oSettings.nTable.style.width = _fnStringToCss( iTotal );
3750 8a217fa2 Olga Brani
                                }
3751 8a217fa2 Olga Brani
                
3752 8a217fa2 Olga Brani
                                iCorrector = 0;
3753 8a217fa2 Olga Brani
                                for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
3754 8a217fa2 Olga Brani
                                {
3755 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].bVisible )
3756 8a217fa2 Olga Brani
                                        {
3757 8a217fa2 Olga Brani
                                                iWidth = $(oNodes[iCorrector]).width();
3758 8a217fa2 Olga Brani
                                                if ( iWidth !== null && iWidth > 0 )
3759 8a217fa2 Olga Brani
                                                {
3760 8a217fa2 Olga Brani
                                                        oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
3761 8a217fa2 Olga Brani
                                                }
3762 8a217fa2 Olga Brani
                                                iCorrector++;
3763 8a217fa2 Olga Brani
                                        }
3764 8a217fa2 Olga Brani
                                }
3765 8a217fa2 Olga Brani
                
3766 8a217fa2 Olga Brani
                                var cssWidth = $(nCalcTmp).css('width');
3767 8a217fa2 Olga Brani
                                oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?
3768 8a217fa2 Olga Brani
                                    cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );
3769 8a217fa2 Olga Brani
                                nCalcTmp.parentNode.removeChild( nCalcTmp );
3770 8a217fa2 Olga Brani
                        }
3771 8a217fa2 Olga Brani
                
3772 8a217fa2 Olga Brani
                        if ( widthAttr )
3773 8a217fa2 Olga Brani
                        {
3774 8a217fa2 Olga Brani
                                oSettings.nTable.style.width = _fnStringToCss( widthAttr );
3775 8a217fa2 Olga Brani
                        }
3776 8a217fa2 Olga Brani
                }
3777 8a217fa2 Olga Brani
                
3778 8a217fa2 Olga Brani
                
3779 8a217fa2 Olga Brani
                /**
3780 8a217fa2 Olga Brani
                 * Adjust a table's width to take account of scrolling
3781 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
3782 8a217fa2 Olga Brani
                 *  @param {node} n table node
3783 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3784 8a217fa2 Olga Brani
                 */
3785 8a217fa2 Olga Brani
                function _fnScrollingWidthAdjust ( oSettings, n )
3786 8a217fa2 Olga Brani
                {
3787 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
3788 8a217fa2 Olga Brani
                        {
3789 8a217fa2 Olga Brani
                                /* When y-scrolling only, we want to remove the width of the scroll bar so the table
3790 8a217fa2 Olga Brani
                                 * + scroll bar will fit into the area avaialble.
3791 8a217fa2 Olga Brani
                                 */
3792 8a217fa2 Olga Brani
                                var iOrigWidth = $(n).width();
3793 8a217fa2 Olga Brani
                                n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
3794 8a217fa2 Olga Brani
                        }
3795 8a217fa2 Olga Brani
                        else if ( oSettings.oScroll.sX !== "" )
3796 8a217fa2 Olga Brani
                        {
3797 8a217fa2 Olga Brani
                                /* When x-scrolling both ways, fix the table at it's current size, without adjusting */
3798 8a217fa2 Olga Brani
                                n.style.width = _fnStringToCss( $(n).outerWidth() );
3799 8a217fa2 Olga Brani
                        }
3800 8a217fa2 Olga Brani
                }
3801 8a217fa2 Olga Brani
                
3802 8a217fa2 Olga Brani
                
3803 8a217fa2 Olga Brani
                /**
3804 8a217fa2 Olga Brani
                 * Get the widest node
3805 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
3806 8a217fa2 Olga Brani
                 *  @param {int} iCol column of interest
3807 8a217fa2 Olga Brani
                 *  @returns {node} widest table node
3808 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3809 8a217fa2 Olga Brani
                 */
3810 8a217fa2 Olga Brani
                function _fnGetWidestNode( oSettings, iCol )
3811 8a217fa2 Olga Brani
                {
3812 8a217fa2 Olga Brani
                        var iMaxIndex = _fnGetMaxLenString( oSettings, iCol );
3813 8a217fa2 Olga Brani
                        if ( iMaxIndex < 0 )
3814 8a217fa2 Olga Brani
                        {
3815 8a217fa2 Olga Brani
                                return null;
3816 8a217fa2 Olga Brani
                        }
3817 8a217fa2 Olga Brani
                
3818 8a217fa2 Olga Brani
                        if ( oSettings.aoData[iMaxIndex].nTr === null )
3819 8a217fa2 Olga Brani
                        {
3820 8a217fa2 Olga Brani
                                var n = document.createElement('td');
3821 8a217fa2 Olga Brani
                                n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );
3822 8a217fa2 Olga Brani
                                return n;
3823 8a217fa2 Olga Brani
                        }
3824 8a217fa2 Olga Brani
                        return _fnGetTdNodes(oSettings, iMaxIndex)[iCol];
3825 8a217fa2 Olga Brani
                }
3826 8a217fa2 Olga Brani
                
3827 8a217fa2 Olga Brani
                
3828 8a217fa2 Olga Brani
                /**
3829 8a217fa2 Olga Brani
                 * Get the maximum strlen for each data column
3830 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
3831 8a217fa2 Olga Brani
                 *  @param {int} iCol column of interest
3832 8a217fa2 Olga Brani
                 *  @returns {string} max string length for each column
3833 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3834 8a217fa2 Olga Brani
                 */
3835 8a217fa2 Olga Brani
                function _fnGetMaxLenString( oSettings, iCol )
3836 8a217fa2 Olga Brani
                {
3837 8a217fa2 Olga Brani
                        var iMax = -1;
3838 8a217fa2 Olga Brani
                        var iMaxIndex = -1;
3839 8a217fa2 Olga Brani
                        
3840 8a217fa2 Olga Brani
                        for ( var i=0 ; i<oSettings.aoData.length ; i++ )
3841 8a217fa2 Olga Brani
                        {
3842 8a217fa2 Olga Brani
                                var s = _fnGetCellData( oSettings, i, iCol, 'display' )+"";
3843 8a217fa2 Olga Brani
                                s = s.replace( /<.*?>/g, "" );
3844 8a217fa2 Olga Brani
                                if ( s.length > iMax )
3845 8a217fa2 Olga Brani
                                {
3846 8a217fa2 Olga Brani
                                        iMax = s.length;
3847 8a217fa2 Olga Brani
                                        iMaxIndex = i;
3848 8a217fa2 Olga Brani
                                }
3849 8a217fa2 Olga Brani
                        }
3850 8a217fa2 Olga Brani
                        
3851 8a217fa2 Olga Brani
                        return iMaxIndex;
3852 8a217fa2 Olga Brani
                }
3853 8a217fa2 Olga Brani
                
3854 8a217fa2 Olga Brani
                
3855 8a217fa2 Olga Brani
                /**
3856 8a217fa2 Olga Brani
                 * Append a CSS unit (only if required) to a string
3857 8a217fa2 Olga Brani
                 *  @param {array} aArray1 first array
3858 8a217fa2 Olga Brani
                 *  @param {array} aArray2 second array
3859 8a217fa2 Olga Brani
                 *  @returns {int} 0 if match, 1 if length is different, 2 if no match
3860 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3861 8a217fa2 Olga Brani
                 */
3862 8a217fa2 Olga Brani
                function _fnStringToCss( s )
3863 8a217fa2 Olga Brani
                {
3864 8a217fa2 Olga Brani
                        if ( s === null )
3865 8a217fa2 Olga Brani
                        {
3866 8a217fa2 Olga Brani
                                return "0px";
3867 8a217fa2 Olga Brani
                        }
3868 8a217fa2 Olga Brani
                        
3869 8a217fa2 Olga Brani
                        if ( typeof s == 'number' )
3870 8a217fa2 Olga Brani
                        {
3871 8a217fa2 Olga Brani
                                if ( s < 0 )
3872 8a217fa2 Olga Brani
                                {
3873 8a217fa2 Olga Brani
                                        return "0px";
3874 8a217fa2 Olga Brani
                                }
3875 8a217fa2 Olga Brani
                                return s+"px";
3876 8a217fa2 Olga Brani
                        }
3877 8a217fa2 Olga Brani
                        
3878 8a217fa2 Olga Brani
                        /* Check if the last character is not 0-9 */
3879 8a217fa2 Olga Brani
                        var c = s.charCodeAt( s.length-1 );
3880 8a217fa2 Olga Brani
                        if (c < 0x30 || c > 0x39)
3881 8a217fa2 Olga Brani
                        {
3882 8a217fa2 Olga Brani
                                return s;
3883 8a217fa2 Olga Brani
                        }
3884 8a217fa2 Olga Brani
                        return s+"px";
3885 8a217fa2 Olga Brani
                }
3886 8a217fa2 Olga Brani
                
3887 8a217fa2 Olga Brani
                
3888 8a217fa2 Olga Brani
                /**
3889 8a217fa2 Olga Brani
                 * Get the width of a scroll bar in this browser being used
3890 8a217fa2 Olga Brani
                 *  @returns {int} width in pixels
3891 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3892 8a217fa2 Olga Brani
                 */
3893 8a217fa2 Olga Brani
                function _fnScrollBarWidth ()
3894 8a217fa2 Olga Brani
                {  
3895 8a217fa2 Olga Brani
                        var inner = document.createElement('p');
3896 8a217fa2 Olga Brani
                        var style = inner.style;
3897 8a217fa2 Olga Brani
                        style.width = "100%";
3898 8a217fa2 Olga Brani
                        style.height = "200px";
3899 8a217fa2 Olga Brani
                        style.padding = "0px";
3900 8a217fa2 Olga Brani
                        
3901 8a217fa2 Olga Brani
                        var outer = document.createElement('div');
3902 8a217fa2 Olga Brani
                        style = outer.style;
3903 8a217fa2 Olga Brani
                        style.position = "absolute";
3904 8a217fa2 Olga Brani
                        style.top = "0px";
3905 8a217fa2 Olga Brani
                        style.left = "0px";
3906 8a217fa2 Olga Brani
                        style.visibility = "hidden";
3907 8a217fa2 Olga Brani
                        style.width = "200px";
3908 8a217fa2 Olga Brani
                        style.height = "150px";
3909 8a217fa2 Olga Brani
                        style.padding = "0px";
3910 8a217fa2 Olga Brani
                        style.overflow = "hidden";
3911 8a217fa2 Olga Brani
                        outer.appendChild(inner);
3912 8a217fa2 Olga Brani
                        
3913 8a217fa2 Olga Brani
                        document.body.appendChild(outer);
3914 8a217fa2 Olga Brani
                        var w1 = inner.offsetWidth;
3915 8a217fa2 Olga Brani
                        outer.style.overflow = 'scroll';
3916 8a217fa2 Olga Brani
                        var w2 = inner.offsetWidth;
3917 8a217fa2 Olga Brani
                        if ( w1 == w2 )
3918 8a217fa2 Olga Brani
                        {
3919 8a217fa2 Olga Brani
                                w2 = outer.clientWidth;
3920 8a217fa2 Olga Brani
                        }
3921 8a217fa2 Olga Brani
                        
3922 8a217fa2 Olga Brani
                        document.body.removeChild(outer);
3923 8a217fa2 Olga Brani
                        return (w1 - w2);  
3924 8a217fa2 Olga Brani
                }
3925 8a217fa2 Olga Brani
                
3926 8a217fa2 Olga Brani
                /**
3927 8a217fa2 Olga Brani
                 * Change the order of the table
3928 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
3929 8a217fa2 Olga Brani
                 *  @param {bool} bApplyClasses optional - should we apply classes or not
3930 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
3931 8a217fa2 Olga Brani
                 */
3932 8a217fa2 Olga Brani
                function _fnSort ( oSettings, bApplyClasses )
3933 8a217fa2 Olga Brani
                {
3934 8a217fa2 Olga Brani
                        var
3935 8a217fa2 Olga Brani
                                i, iLen, j, jLen, k, kLen,
3936 8a217fa2 Olga Brani
                                sDataType, nTh,
3937 8a217fa2 Olga Brani
                                aaSort = [],
3938 8a217fa2 Olga Brani
                                 aiOrig = [],
3939 8a217fa2 Olga Brani
                                oSort = DataTable.ext.oSort,
3940 8a217fa2 Olga Brani
                                aoData = oSettings.aoData,
3941 8a217fa2 Olga Brani
                                aoColumns = oSettings.aoColumns,
3942 8a217fa2 Olga Brani
                                oAria = oSettings.oLanguage.oAria;
3943 8a217fa2 Olga Brani
                        
3944 8a217fa2 Olga Brani
                        /* No sorting required if server-side or no sorting array */
3945 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bServerSide && 
3946 8a217fa2 Olga Brani
                                (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
3947 8a217fa2 Olga Brani
                        {
3948 8a217fa2 Olga Brani
                                aaSort = ( oSettings.aaSortingFixed !== null ) ?
3949 8a217fa2 Olga Brani
                                        oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
3950 8a217fa2 Olga Brani
                                        oSettings.aaSorting.slice();
3951 8a217fa2 Olga Brani
                                
3952 8a217fa2 Olga Brani
                                /* If there is a sorting data type, and a function belonging to it, then we need to
3953 8a217fa2 Olga Brani
                                 * get the data from the developer's function and apply it for this column
3954 8a217fa2 Olga Brani
                                 */
3955 8a217fa2 Olga Brani
                                for ( i=0 ; i<aaSort.length ; i++ )
3956 8a217fa2 Olga Brani
                                {
3957 8a217fa2 Olga Brani
                                        var iColumn = aaSort[i][0];
3958 8a217fa2 Olga Brani
                                        var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
3959 8a217fa2 Olga Brani
                                        sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
3960 8a217fa2 Olga Brani
                                        if ( DataTable.ext.afnSortData[sDataType] )
3961 8a217fa2 Olga Brani
                                        {
3962 8a217fa2 Olga Brani
                                                var aData = DataTable.ext.afnSortData[sDataType].call( 
3963 8a217fa2 Olga Brani
                                                        oSettings.oInstance, oSettings, iColumn, iVisColumn
3964 8a217fa2 Olga Brani
                                                );
3965 8a217fa2 Olga Brani
                                                if ( aData.length === aoData.length )
3966 8a217fa2 Olga Brani
                                                {
3967 8a217fa2 Olga Brani
                                                        for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
3968 8a217fa2 Olga Brani
                                                        {
3969 8a217fa2 Olga Brani
                                                                _fnSetCellData( oSettings, j, iColumn, aData[j] );
3970 8a217fa2 Olga Brani
                                                        }
3971 8a217fa2 Olga Brani
                                                }
3972 8a217fa2 Olga Brani
                                                else
3973 8a217fa2 Olga Brani
                                                {
3974 8a217fa2 Olga Brani
                                                        _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
3975 8a217fa2 Olga Brani
                                                }
3976 8a217fa2 Olga Brani
                                        }
3977 8a217fa2 Olga Brani
                                }
3978 8a217fa2 Olga Brani
                                
3979 8a217fa2 Olga Brani
                                /* Create a value - key array of the current row positions such that we can use their
3980 8a217fa2 Olga Brani
                                 * current position during the sort, if values match, in order to perform stable sorting
3981 8a217fa2 Olga Brani
                                 */
3982 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
3983 8a217fa2 Olga Brani
                                {
3984 8a217fa2 Olga Brani
                                        aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
3985 8a217fa2 Olga Brani
                                }
3986 8a217fa2 Olga Brani
                
3987 8a217fa2 Olga Brani
                                /* Build an internal data array which is specific to the sort, so we can get and prep
3988 8a217fa2 Olga Brani
                                 * the data to be sorted only once, rather than needing to do it every time the sorting
3989 8a217fa2 Olga Brani
                                 * function runs. This make the sorting function a very simple comparison
3990 8a217fa2 Olga Brani
                                 */
3991 8a217fa2 Olga Brani
                                var iSortLen = aaSort.length;
3992 8a217fa2 Olga Brani
                                var fnSortFormat, aDataSort;
3993 8a217fa2 Olga Brani
                                for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
3994 8a217fa2 Olga Brani
                                {
3995 8a217fa2 Olga Brani
                                        for ( j=0 ; j<iSortLen ; j++ )
3996 8a217fa2 Olga Brani
                                        {
3997 8a217fa2 Olga Brani
                                                aDataSort = aoColumns[ aaSort[j][0] ].aDataSort;
3998 8a217fa2 Olga Brani
                
3999 8a217fa2 Olga Brani
                                                for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
4000 8a217fa2 Olga Brani
                                                {
4001 8a217fa2 Olga Brani
                                                        sDataType = aoColumns[ aDataSort[k] ].sType;
4002 8a217fa2 Olga Brani
                                                        fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ];
4003 8a217fa2 Olga Brani
                                                        
4004 8a217fa2 Olga Brani
                                                        aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?
4005 8a217fa2 Olga Brani
                                                                fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :
4006 8a217fa2 Olga Brani
                                                                _fnGetCellData( oSettings, i, aDataSort[k], 'sort' );
4007 8a217fa2 Olga Brani
                                                }
4008 8a217fa2 Olga Brani
                                        }
4009 8a217fa2 Olga Brani
                                }
4010 8a217fa2 Olga Brani
                                
4011 8a217fa2 Olga Brani
                                /* Do the sort - here we want multi-column sorting based on a given data source (column)
4012 8a217fa2 Olga Brani
                                 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
4013 8a217fa2 Olga Brani
                                 * follow on it's own, but this is what we want (example two column sorting):
4014 8a217fa2 Olga Brani
                                 *  fnLocalSorting = function(a,b){
4015 8a217fa2 Olga Brani
                                 *          var iTest;
4016 8a217fa2 Olga Brani
                                 *          iTest = oSort['string-asc']('data11', 'data12');
4017 8a217fa2 Olga Brani
                                 *          if (iTest !== 0)
4018 8a217fa2 Olga Brani
                                 *                  return iTest;
4019 8a217fa2 Olga Brani
                                 *    iTest = oSort['numeric-desc']('data21', 'data22');
4020 8a217fa2 Olga Brani
                                 *    if (iTest !== 0)
4021 8a217fa2 Olga Brani
                                 *                  return iTest;
4022 8a217fa2 Olga Brani
                                 *          return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
4023 8a217fa2 Olga Brani
                                 *  }
4024 8a217fa2 Olga Brani
                                 * Basically we have a test for each sorting column, if the data in that column is equal,
4025 8a217fa2 Olga Brani
                                 * test the next column. If all columns match, then we use a numeric sort on the row 
4026 8a217fa2 Olga Brani
                                 * positions in the original data array to provide a stable sort.
4027 8a217fa2 Olga Brani
                                 */
4028 8a217fa2 Olga Brani
                                oSettings.aiDisplayMaster.sort( function ( a, b ) {
4029 8a217fa2 Olga Brani
                                        var k, l, lLen, iTest, aDataSort, sDataType;
4030 8a217fa2 Olga Brani
                                        for ( k=0 ; k<iSortLen ; k++ )
4031 8a217fa2 Olga Brani
                                        {
4032 8a217fa2 Olga Brani
                                                aDataSort = aoColumns[ aaSort[k][0] ].aDataSort;
4033 8a217fa2 Olga Brani
                
4034 8a217fa2 Olga Brani
                                                for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )
4035 8a217fa2 Olga Brani
                                                {
4036 8a217fa2 Olga Brani
                                                        sDataType = aoColumns[ aDataSort[l] ].sType;
4037 8a217fa2 Olga Brani
                                                        
4038 8a217fa2 Olga Brani
                                                        iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ](
4039 8a217fa2 Olga Brani
                                                                aoData[a]._aSortData[ aDataSort[l] ],
4040 8a217fa2 Olga Brani
                                                                aoData[b]._aSortData[ aDataSort[l] ]
4041 8a217fa2 Olga Brani
                                                        );
4042 8a217fa2 Olga Brani
                                                
4043 8a217fa2 Olga Brani
                                                        if ( iTest !== 0 )
4044 8a217fa2 Olga Brani
                                                        {
4045 8a217fa2 Olga Brani
                                                                return iTest;
4046 8a217fa2 Olga Brani
                                                        }
4047 8a217fa2 Olga Brani
                                                }
4048 8a217fa2 Olga Brani
                                        }
4049 8a217fa2 Olga Brani
                                        
4050 8a217fa2 Olga Brani
                                        return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
4051 8a217fa2 Olga Brani
                                } );
4052 8a217fa2 Olga Brani
                        }
4053 8a217fa2 Olga Brani
                        
4054 8a217fa2 Olga Brani
                        /* Alter the sorting classes to take account of the changes */
4055 8a217fa2 Olga Brani
                        if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )
4056 8a217fa2 Olga Brani
                        {
4057 8a217fa2 Olga Brani
                                _fnSortingClasses( oSettings );
4058 8a217fa2 Olga Brani
                        }
4059 8a217fa2 Olga Brani
                
4060 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
4061 8a217fa2 Olga Brani
                        {
4062 8a217fa2 Olga Brani
                                var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
4063 8a217fa2 Olga Brani
                                nTh = aoColumns[i].nTh;
4064 8a217fa2 Olga Brani
                                nTh.removeAttribute('aria-sort');
4065 8a217fa2 Olga Brani
                                nTh.removeAttribute('aria-label');
4066 8a217fa2 Olga Brani
                                
4067 8a217fa2 Olga Brani
                                /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
4068 8a217fa2 Olga Brani
                                if ( aoColumns[i].bSortable )
4069 8a217fa2 Olga Brani
                                {
4070 8a217fa2 Olga Brani
                                        if ( aaSort.length > 0 && aaSort[0][0] == i )
4071 8a217fa2 Olga Brani
                                        {
4072 8a217fa2 Olga Brani
                                                nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" );
4073 8a217fa2 Olga Brani
                                                
4074 8a217fa2 Olga Brani
                                                var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? 
4075 8a217fa2 Olga Brani
                                                        aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
4076 8a217fa2 Olga Brani
                                                nTh.setAttribute('aria-label', sTitle+
4077 8a217fa2 Olga Brani
                                                        (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
4078 8a217fa2 Olga Brani
                                        }
4079 8a217fa2 Olga Brani
                                        else
4080 8a217fa2 Olga Brani
                                        {
4081 8a217fa2 Olga Brani
                                                nTh.setAttribute('aria-label', sTitle+
4082 8a217fa2 Olga Brani
                                                        (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
4083 8a217fa2 Olga Brani
                                        }
4084 8a217fa2 Olga Brani
                                }
4085 8a217fa2 Olga Brani
                                else
4086 8a217fa2 Olga Brani
                                {
4087 8a217fa2 Olga Brani
                                        nTh.setAttribute('aria-label', sTitle);
4088 8a217fa2 Olga Brani
                                }
4089 8a217fa2 Olga Brani
                        }
4090 8a217fa2 Olga Brani
                        
4091 8a217fa2 Olga Brani
                        /* Tell the draw function that we have sorted the data */
4092 8a217fa2 Olga Brani
                        oSettings.bSorted = true;
4093 8a217fa2 Olga Brani
                        $(oSettings.oInstance).trigger('sort', oSettings);
4094 8a217fa2 Olga Brani
                        
4095 8a217fa2 Olga Brani
                        /* Copy the master data into the draw array and re-draw */
4096 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bFilter )
4097 8a217fa2 Olga Brani
                        {
4098 8a217fa2 Olga Brani
                                /* _fnFilter() will redraw the table for us */
4099 8a217fa2 Olga Brani
                                _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
4100 8a217fa2 Olga Brani
                        }
4101 8a217fa2 Olga Brani
                        else
4102 8a217fa2 Olga Brani
                        {
4103 8a217fa2 Olga Brani
                                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
4104 8a217fa2 Olga Brani
                                oSettings._iDisplayStart = 0; /* reset display back to page 0 */
4105 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
4106 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
4107 8a217fa2 Olga Brani
                        }
4108 8a217fa2 Olga Brani
                }
4109 8a217fa2 Olga Brani
                
4110 8a217fa2 Olga Brani
                
4111 8a217fa2 Olga Brani
                /**
4112 8a217fa2 Olga Brani
                 * Attach a sort handler (click) to a node
4113 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4114 8a217fa2 Olga Brani
                 *  @param {node} nNode node to attach the handler to
4115 8a217fa2 Olga Brani
                 *  @param {int} iDataIndex column sorting index
4116 8a217fa2 Olga Brani
                 *  @param {function} [fnCallback] callback function
4117 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4118 8a217fa2 Olga Brani
                 */
4119 8a217fa2 Olga Brani
                function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
4120 8a217fa2 Olga Brani
                {
4121 8a217fa2 Olga Brani
                        _fnBindAction( nNode, {}, function (e) {
4122 8a217fa2 Olga Brani
                                /* If the column is not sortable - don't to anything */
4123 8a217fa2 Olga Brani
                                if ( oSettings.aoColumns[iDataIndex].bSortable === false )
4124 8a217fa2 Olga Brani
                                {
4125 8a217fa2 Olga Brani
                                        return;
4126 8a217fa2 Olga Brani
                                }
4127 8a217fa2 Olga Brani
                                
4128 8a217fa2 Olga Brani
                                /*
4129 8a217fa2 Olga Brani
                                 * This is a little bit odd I admit... I declare a temporary function inside the scope of
4130 8a217fa2 Olga Brani
                                 * _fnBuildHead and the click handler in order that the code presented here can be used 
4131 8a217fa2 Olga Brani
                                 * twice - once for when bProcessing is enabled, and another time for when it is 
4132 8a217fa2 Olga Brani
                                 * disabled, as we need to perform slightly different actions.
4133 8a217fa2 Olga Brani
                                 *   Basically the issue here is that the Javascript engine in modern browsers don't 
4134 8a217fa2 Olga Brani
                                 * appear to allow the rendering engine to update the display while it is still executing
4135 8a217fa2 Olga Brani
                                 * it's thread (well - it does but only after long intervals). This means that the 
4136 8a217fa2 Olga Brani
                                 * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
4137 8a217fa2 Olga Brani
                                 * I force an execution break by using setTimeout - but this breaks the expected 
4138 8a217fa2 Olga Brani
                                 * thread continuation for the end-developer's point of view (their code would execute
4139 8a217fa2 Olga Brani
                                 * too early), so we only do it when we absolutely have to.
4140 8a217fa2 Olga Brani
                                 */
4141 8a217fa2 Olga Brani
                                var fnInnerSorting = function () {
4142 8a217fa2 Olga Brani
                                        var iColumn, iNextSort;
4143 8a217fa2 Olga Brani
                                        
4144 8a217fa2 Olga Brani
                                        /* If the shift key is pressed then we are multiple column sorting */
4145 8a217fa2 Olga Brani
                                        if ( e.shiftKey )
4146 8a217fa2 Olga Brani
                                        {
4147 8a217fa2 Olga Brani
                                                /* Are we already doing some kind of sort on this column? */
4148 8a217fa2 Olga Brani
                                                var bFound = false;
4149 8a217fa2 Olga Brani
                                                for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
4150 8a217fa2 Olga Brani
                                                {
4151 8a217fa2 Olga Brani
                                                        if ( oSettings.aaSorting[i][0] == iDataIndex )
4152 8a217fa2 Olga Brani
                                                        {
4153 8a217fa2 Olga Brani
                                                                bFound = true;
4154 8a217fa2 Olga Brani
                                                                iColumn = oSettings.aaSorting[i][0];
4155 8a217fa2 Olga Brani
                                                                iNextSort = oSettings.aaSorting[i][2]+1;
4156 8a217fa2 Olga Brani
                                                                
4157 8a217fa2 Olga Brani
                                                                if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
4158 8a217fa2 Olga Brani
                                                                {
4159 8a217fa2 Olga Brani
                                                                        /* Reached the end of the sorting options, remove from multi-col sort */
4160 8a217fa2 Olga Brani
                                                                        oSettings.aaSorting.splice( i, 1 );
4161 8a217fa2 Olga Brani
                                                                }
4162 8a217fa2 Olga Brani
                                                                else
4163 8a217fa2 Olga Brani
                                                                {
4164 8a217fa2 Olga Brani
                                                                        /* Move onto next sorting direction */
4165 8a217fa2 Olga Brani
                                                                        oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
4166 8a217fa2 Olga Brani
                                                                        oSettings.aaSorting[i][2] = iNextSort;
4167 8a217fa2 Olga Brani
                                                                }
4168 8a217fa2 Olga Brani
                                                                break;
4169 8a217fa2 Olga Brani
                                                        }
4170 8a217fa2 Olga Brani
                                                }
4171 8a217fa2 Olga Brani
                                                
4172 8a217fa2 Olga Brani
                                                /* No sort yet - add it in */
4173 8a217fa2 Olga Brani
                                                if ( bFound === false )
4174 8a217fa2 Olga Brani
                                                {
4175 8a217fa2 Olga Brani
                                                        oSettings.aaSorting.push( [ iDataIndex, 
4176 8a217fa2 Olga Brani
                                                                oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
4177 8a217fa2 Olga Brani
                                                }
4178 8a217fa2 Olga Brani
                                        }
4179 8a217fa2 Olga Brani
                                        else
4180 8a217fa2 Olga Brani
                                        {
4181 8a217fa2 Olga Brani
                                                /* If no shift key then single column sort */
4182 8a217fa2 Olga Brani
                                                if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
4183 8a217fa2 Olga Brani
                                                {
4184 8a217fa2 Olga Brani
                                                        iColumn = oSettings.aaSorting[0][0];
4185 8a217fa2 Olga Brani
                                                        iNextSort = oSettings.aaSorting[0][2]+1;
4186 8a217fa2 Olga Brani
                                                        if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
4187 8a217fa2 Olga Brani
                                                        {
4188 8a217fa2 Olga Brani
                                                                iNextSort = 0;
4189 8a217fa2 Olga Brani
                                                        }
4190 8a217fa2 Olga Brani
                                                        oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
4191 8a217fa2 Olga Brani
                                                        oSettings.aaSorting[0][2] = iNextSort;
4192 8a217fa2 Olga Brani
                                                }
4193 8a217fa2 Olga Brani
                                                else
4194 8a217fa2 Olga Brani
                                                {
4195 8a217fa2 Olga Brani
                                                        oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
4196 8a217fa2 Olga Brani
                                                        oSettings.aaSorting.push( [ iDataIndex, 
4197 8a217fa2 Olga Brani
                                                                oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
4198 8a217fa2 Olga Brani
                                                }
4199 8a217fa2 Olga Brani
                                        }
4200 8a217fa2 Olga Brani
                                        
4201 8a217fa2 Olga Brani
                                        /* Run the sort */
4202 8a217fa2 Olga Brani
                                        _fnSort( oSettings );
4203 8a217fa2 Olga Brani
                                }; /* /fnInnerSorting */
4204 8a217fa2 Olga Brani
                                
4205 8a217fa2 Olga Brani
                                if ( !oSettings.oFeatures.bProcessing )
4206 8a217fa2 Olga Brani
                                {
4207 8a217fa2 Olga Brani
                                        fnInnerSorting();
4208 8a217fa2 Olga Brani
                                }
4209 8a217fa2 Olga Brani
                                else
4210 8a217fa2 Olga Brani
                                {
4211 8a217fa2 Olga Brani
                                        _fnProcessingDisplay( oSettings, true );
4212 8a217fa2 Olga Brani
                                        setTimeout( function() {
4213 8a217fa2 Olga Brani
                                                fnInnerSorting();
4214 8a217fa2 Olga Brani
                                                if ( !oSettings.oFeatures.bServerSide )
4215 8a217fa2 Olga Brani
                                                {
4216 8a217fa2 Olga Brani
                                                        _fnProcessingDisplay( oSettings, false );
4217 8a217fa2 Olga Brani
                                                }
4218 8a217fa2 Olga Brani
                                        }, 0 );
4219 8a217fa2 Olga Brani
                                }
4220 8a217fa2 Olga Brani
                                
4221 8a217fa2 Olga Brani
                                /* Call the user specified callback function - used for async user interaction */
4222 8a217fa2 Olga Brani
                                if ( typeof fnCallback == 'function' )
4223 8a217fa2 Olga Brani
                                {
4224 8a217fa2 Olga Brani
                                        fnCallback( oSettings );
4225 8a217fa2 Olga Brani
                                }
4226 8a217fa2 Olga Brani
                        } );
4227 8a217fa2 Olga Brani
                }
4228 8a217fa2 Olga Brani
                
4229 8a217fa2 Olga Brani
                
4230 8a217fa2 Olga Brani
                /**
4231 8a217fa2 Olga Brani
                 * Set the sorting classes on the header, Note: it is safe to call this function 
4232 8a217fa2 Olga Brani
                 * when bSort and bSortClasses are false
4233 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4234 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4235 8a217fa2 Olga Brani
                 */
4236 8a217fa2 Olga Brani
                function _fnSortingClasses( oSettings )
4237 8a217fa2 Olga Brani
                {
4238 8a217fa2 Olga Brani
                        var i, iLen, j, jLen, iFound;
4239 8a217fa2 Olga Brani
                        var aaSort, sClass;
4240 8a217fa2 Olga Brani
                        var iColumns = oSettings.aoColumns.length;
4241 8a217fa2 Olga Brani
                        var oClasses = oSettings.oClasses;
4242 8a217fa2 Olga Brani
                        
4243 8a217fa2 Olga Brani
                        for ( i=0 ; i<iColumns ; i++ )
4244 8a217fa2 Olga Brani
                        {
4245 8a217fa2 Olga Brani
                                if ( oSettings.aoColumns[i].bSortable )
4246 8a217fa2 Olga Brani
                                {
4247 8a217fa2 Olga Brani
                                        $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
4248 8a217fa2 Olga Brani
                                                " "+ oSettings.aoColumns[i].sSortingClass );
4249 8a217fa2 Olga Brani
                                }
4250 8a217fa2 Olga Brani
                        }
4251 8a217fa2 Olga Brani
                        
4252 8a217fa2 Olga Brani
                        if ( oSettings.aaSortingFixed !== null )
4253 8a217fa2 Olga Brani
                        {
4254 8a217fa2 Olga Brani
                                aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
4255 8a217fa2 Olga Brani
                        }
4256 8a217fa2 Olga Brani
                        else
4257 8a217fa2 Olga Brani
                        {
4258 8a217fa2 Olga Brani
                                aaSort = oSettings.aaSorting.slice();
4259 8a217fa2 Olga Brani
                        }
4260 8a217fa2 Olga Brani
                        
4261 8a217fa2 Olga Brani
                        /* Apply the required classes to the header */
4262 8a217fa2 Olga Brani
                        for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
4263 8a217fa2 Olga Brani
                        {
4264 8a217fa2 Olga Brani
                                if ( oSettings.aoColumns[i].bSortable )
4265 8a217fa2 Olga Brani
                                {
4266 8a217fa2 Olga Brani
                                        sClass = oSettings.aoColumns[i].sSortingClass;
4267 8a217fa2 Olga Brani
                                        iFound = -1;
4268 8a217fa2 Olga Brani
                                        for ( j=0 ; j<aaSort.length ; j++ )
4269 8a217fa2 Olga Brani
                                        {
4270 8a217fa2 Olga Brani
                                                if ( aaSort[j][0] == i )
4271 8a217fa2 Olga Brani
                                                {
4272 8a217fa2 Olga Brani
                                                        sClass = ( aaSort[j][1] == "asc" ) ?
4273 8a217fa2 Olga Brani
                                                                oClasses.sSortAsc : oClasses.sSortDesc;
4274 8a217fa2 Olga Brani
                                                        iFound = j;
4275 8a217fa2 Olga Brani
                                                        break;
4276 8a217fa2 Olga Brani
                                                }
4277 8a217fa2 Olga Brani
                                        }
4278 8a217fa2 Olga Brani
                                        $(oSettings.aoColumns[i].nTh).addClass( sClass );
4279 8a217fa2 Olga Brani
                                        
4280 8a217fa2 Olga Brani
                                        if ( oSettings.bJUI )
4281 8a217fa2 Olga Brani
                                        {
4282 8a217fa2 Olga Brani
                                                /* jQuery UI uses extra markup */
4283 8a217fa2 Olga Brani
                                                var jqSpan = $("span."+oClasses.sSortIcon,  oSettings.aoColumns[i].nTh);
4284 8a217fa2 Olga Brani
                                                jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
4285 8a217fa2 Olga Brani
                                                        oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
4286 8a217fa2 Olga Brani
                                                
4287 8a217fa2 Olga Brani
                                                var sSpanClass;
4288 8a217fa2 Olga Brani
                                                if ( iFound == -1 )
4289 8a217fa2 Olga Brani
                                                {
4290 8a217fa2 Olga Brani
                                                         sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
4291 8a217fa2 Olga Brani
                                                }
4292 8a217fa2 Olga Brani
                                                else if ( aaSort[iFound][1] == "asc" )
4293 8a217fa2 Olga Brani
                                                {
4294 8a217fa2 Olga Brani
                                                        sSpanClass = oClasses.sSortJUIAsc;
4295 8a217fa2 Olga Brani
                                                }
4296 8a217fa2 Olga Brani
                                                else
4297 8a217fa2 Olga Brani
                                                {
4298 8a217fa2 Olga Brani
                                                        sSpanClass = oClasses.sSortJUIDesc;
4299 8a217fa2 Olga Brani
                                                }
4300 8a217fa2 Olga Brani
                                                
4301 8a217fa2 Olga Brani
                                                jqSpan.addClass( sSpanClass );
4302 8a217fa2 Olga Brani
                                        }
4303 8a217fa2 Olga Brani
                                }
4304 8a217fa2 Olga Brani
                                else
4305 8a217fa2 Olga Brani
                                {
4306 8a217fa2 Olga Brani
                                        /* No sorting on this column, so add the base class. This will have been assigned by
4307 8a217fa2 Olga Brani
                                         * _fnAddColumn
4308 8a217fa2 Olga Brani
                                         */
4309 8a217fa2 Olga Brani
                                        $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
4310 8a217fa2 Olga Brani
                                }
4311 8a217fa2 Olga Brani
                        }
4312 8a217fa2 Olga Brani
                        
4313 8a217fa2 Olga Brani
                        /* 
4314 8a217fa2 Olga Brani
                         * Apply the required classes to the table body
4315 8a217fa2 Olga Brani
                         * Note that this is given as a feature switch since it can significantly slow down a sort
4316 8a217fa2 Olga Brani
                         * on large data sets (adding and removing of classes is always slow at the best of times..)
4317 8a217fa2 Olga Brani
                         * Further to this, note that this code is admittedly fairly ugly. It could be made a lot 
4318 8a217fa2 Olga Brani
                         * simpler using jQuery selectors and add/removeClass, but that is significantly slower
4319 8a217fa2 Olga Brani
                         * (on the order of 5 times slower) - hence the direct DOM manipulation here.
4320 8a217fa2 Olga Brani
                         * Note that for deferred drawing we do use jQuery - the reason being that taking the first
4321 8a217fa2 Olga Brani
                         * row found to see if the whole column needs processed can miss classes since the first
4322 8a217fa2 Olga Brani
                         * column might be new.
4323 8a217fa2 Olga Brani
                         */
4324 8a217fa2 Olga Brani
                        sClass = oClasses.sSortColumn;
4325 8a217fa2 Olga Brani
                        
4326 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
4327 8a217fa2 Olga Brani
                        {
4328 8a217fa2 Olga Brani
                                var nTds = _fnGetTdNodes( oSettings );
4329 8a217fa2 Olga Brani
                                
4330 8a217fa2 Olga Brani
                                /* Determine what the sorting class for each column should be */
4331 8a217fa2 Olga Brani
                                var iClass, iTargetCol;
4332 8a217fa2 Olga Brani
                                var asClasses = [];
4333 8a217fa2 Olga Brani
                                for (i = 0; i < iColumns; i++)
4334 8a217fa2 Olga Brani
                                {
4335 8a217fa2 Olga Brani
                                        asClasses.push("");
4336 8a217fa2 Olga Brani
                                }
4337 8a217fa2 Olga Brani
                                for (i = 0, iClass = 1; i < aaSort.length; i++)
4338 8a217fa2 Olga Brani
                                {
4339 8a217fa2 Olga Brani
                                        iTargetCol = parseInt( aaSort[i][0], 10 );
4340 8a217fa2 Olga Brani
                                        asClasses[iTargetCol] = sClass + iClass;
4341 8a217fa2 Olga Brani
                                        
4342 8a217fa2 Olga Brani
                                        if ( iClass < 3 )
4343 8a217fa2 Olga Brani
                                        {
4344 8a217fa2 Olga Brani
                                                iClass++;
4345 8a217fa2 Olga Brani
                                        }
4346 8a217fa2 Olga Brani
                                }
4347 8a217fa2 Olga Brani
                                
4348 8a217fa2 Olga Brani
                                /* Make changes to the classes for each cell as needed */
4349 8a217fa2 Olga Brani
                                var reClass = new RegExp(sClass + "[123]");
4350 8a217fa2 Olga Brani
                                var sTmpClass, sCurrentClass, sNewClass;
4351 8a217fa2 Olga Brani
                                for ( i=0, iLen=nTds.length; i<iLen; i++ )
4352 8a217fa2 Olga Brani
                                {
4353 8a217fa2 Olga Brani
                                        /* Determine which column we're looking at */
4354 8a217fa2 Olga Brani
                                        iTargetCol = i % iColumns;
4355 8a217fa2 Olga Brani
                                        
4356 8a217fa2 Olga Brani
                                        /* What is the full list of classes now */
4357 8a217fa2 Olga Brani
                                        sCurrentClass = nTds[i].className;
4358 8a217fa2 Olga Brani
                                        /* What sorting class should be applied? */
4359 8a217fa2 Olga Brani
                                        sNewClass = asClasses[iTargetCol];
4360 8a217fa2 Olga Brani
                                        /* What would the new full list be if we did a replacement? */
4361 8a217fa2 Olga Brani
                                        sTmpClass = sCurrentClass.replace(reClass, sNewClass);
4362 8a217fa2 Olga Brani
                                        
4363 8a217fa2 Olga Brani
                                        if ( sTmpClass != sCurrentClass )
4364 8a217fa2 Olga Brani
                                        {
4365 8a217fa2 Olga Brani
                                                /* We changed something */
4366 8a217fa2 Olga Brani
                                                nTds[i].className = $.trim( sTmpClass );
4367 8a217fa2 Olga Brani
                                        }
4368 8a217fa2 Olga Brani
                                        else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
4369 8a217fa2 Olga Brani
                                        {
4370 8a217fa2 Olga Brani
                                                /* We need to add a class */
4371 8a217fa2 Olga Brani
                                                nTds[i].className = sCurrentClass + " " + sNewClass;
4372 8a217fa2 Olga Brani
                                        }
4373 8a217fa2 Olga Brani
                                }
4374 8a217fa2 Olga Brani
                        }
4375 8a217fa2 Olga Brani
                }
4376 8a217fa2 Olga Brani
                
4377 8a217fa2 Olga Brani
                
4378 8a217fa2 Olga Brani
                
4379 8a217fa2 Olga Brani
                /**
4380 8a217fa2 Olga Brani
                 * Save the state of a table in a cookie such that the page can be reloaded
4381 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4382 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4383 8a217fa2 Olga Brani
                 */
4384 8a217fa2 Olga Brani
                function _fnSaveState ( oSettings )
4385 8a217fa2 Olga Brani
                {
4386 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )
4387 8a217fa2 Olga Brani
                        {
4388 8a217fa2 Olga Brani
                                return;
4389 8a217fa2 Olga Brani
                        }
4390 8a217fa2 Olga Brani
                
4391 8a217fa2 Olga Brani
                        /* Store the interesting variables */
4392 8a217fa2 Olga Brani
                        var i, iLen, bInfinite=oSettings.oScroll.bInfinite;
4393 8a217fa2 Olga Brani
                        var oState = {
4394 8a217fa2 Olga Brani
                                "iCreate":      new Date().getTime(),
4395 8a217fa2 Olga Brani
                                "iStart":       (bInfinite ? 0 : oSettings._iDisplayStart),
4396 8a217fa2 Olga Brani
                                "iEnd":         (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),
4397 8a217fa2 Olga Brani
                                "iLength":      oSettings._iDisplayLength,
4398 8a217fa2 Olga Brani
                                "aaSorting":    $.extend( true, [], oSettings.aaSorting ),
4399 8a217fa2 Olga Brani
                                "oSearch":      $.extend( true, {}, oSettings.oPreviousSearch ),
4400 8a217fa2 Olga Brani
                                "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ),
4401 8a217fa2 Olga Brani
                                "abVisCols":    []
4402 8a217fa2 Olga Brani
                        };
4403 8a217fa2 Olga Brani
                
4404 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
4405 8a217fa2 Olga Brani
                        {
4406 8a217fa2 Olga Brani
                                oState.abVisCols.push( oSettings.aoColumns[i].bVisible );
4407 8a217fa2 Olga Brani
                        }
4408 8a217fa2 Olga Brani
                
4409 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] );
4410 8a217fa2 Olga Brani
                        
4411 8a217fa2 Olga Brani
                        oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );
4412 8a217fa2 Olga Brani
                }
4413 8a217fa2 Olga Brani
                
4414 8a217fa2 Olga Brani
                
4415 8a217fa2 Olga Brani
                /**
4416 8a217fa2 Olga Brani
                 * Attempt to load a saved table state from a cookie
4417 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4418 8a217fa2 Olga Brani
                 *  @param {object} oInit DataTables init object so we can override settings
4419 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4420 8a217fa2 Olga Brani
                 */
4421 8a217fa2 Olga Brani
                function _fnLoadState ( oSettings, oInit )
4422 8a217fa2 Olga Brani
                {
4423 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bStateSave )
4424 8a217fa2 Olga Brani
                        {
4425 8a217fa2 Olga Brani
                                return;
4426 8a217fa2 Olga Brani
                        }
4427 8a217fa2 Olga Brani
                
4428 8a217fa2 Olga Brani
                        var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );
4429 8a217fa2 Olga Brani
                        if ( !oData )
4430 8a217fa2 Olga Brani
                        {
4431 8a217fa2 Olga Brani
                                return;
4432 8a217fa2 Olga Brani
                        }
4433 8a217fa2 Olga Brani
                        
4434 8a217fa2 Olga Brani
                        /* Allow custom and plug-in manipulation functions to alter the saved data set and
4435 8a217fa2 Olga Brani
                         * cancelling of loading by returning false
4436 8a217fa2 Olga Brani
                         */
4437 8a217fa2 Olga Brani
                        var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );
4438 8a217fa2 Olga Brani
                        if ( $.inArray( false, abStateLoad ) !== -1 )
4439 8a217fa2 Olga Brani
                        {
4440 8a217fa2 Olga Brani
                                return;
4441 8a217fa2 Olga Brani
                        }
4442 8a217fa2 Olga Brani
                        
4443 8a217fa2 Olga Brani
                        /* Store the saved state so it might be accessed at any time */
4444 8a217fa2 Olga Brani
                        oSettings.oLoadedState = $.extend( true, {}, oData );
4445 8a217fa2 Olga Brani
                        
4446 8a217fa2 Olga Brani
                        /* Restore key features */
4447 8a217fa2 Olga Brani
                        oSettings._iDisplayStart    = oData.iStart;
4448 8a217fa2 Olga Brani
                        oSettings.iInitDisplayStart = oData.iStart;
4449 8a217fa2 Olga Brani
                        oSettings._iDisplayEnd      = oData.iEnd;
4450 8a217fa2 Olga Brani
                        oSettings._iDisplayLength   = oData.iLength;
4451 8a217fa2 Olga Brani
                        oSettings.aaSorting         = oData.aaSorting.slice();
4452 8a217fa2 Olga Brani
                        oSettings.saved_aaSorting   = oData.aaSorting.slice();
4453 8a217fa2 Olga Brani
                        
4454 8a217fa2 Olga Brani
                        /* Search filtering  */
4455 8a217fa2 Olga Brani
                        $.extend( oSettings.oPreviousSearch, oData.oSearch );
4456 8a217fa2 Olga Brani
                        $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
4457 8a217fa2 Olga Brani
                        
4458 8a217fa2 Olga Brani
                        /* Column visibility state
4459 8a217fa2 Olga Brani
                         * Pass back visibility settings to the init handler, but to do not here override
4460 8a217fa2 Olga Brani
                         * the init object that the user might have passed in
4461 8a217fa2 Olga Brani
                         */
4462 8a217fa2 Olga Brani
                        oInit.saved_aoColumns = [];
4463 8a217fa2 Olga Brani
                        for ( var i=0 ; i<oData.abVisCols.length ; i++ )
4464 8a217fa2 Olga Brani
                        {
4465 8a217fa2 Olga Brani
                                oInit.saved_aoColumns[i] = {};
4466 8a217fa2 Olga Brani
                                oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
4467 8a217fa2 Olga Brani
                        }
4468 8a217fa2 Olga Brani
                
4469 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );
4470 8a217fa2 Olga Brani
                }
4471 8a217fa2 Olga Brani
                
4472 8a217fa2 Olga Brani
                
4473 8a217fa2 Olga Brani
                /**
4474 8a217fa2 Olga Brani
                 * Create a new cookie with a value to store the state of a table
4475 8a217fa2 Olga Brani
                 *  @param {string} sName name of the cookie to create
4476 8a217fa2 Olga Brani
                 *  @param {string} sValue the value the cookie should take
4477 8a217fa2 Olga Brani
                 *  @param {int} iSecs duration of the cookie
4478 8a217fa2 Olga Brani
                 *  @param {string} sBaseName sName is made up of the base + file name - this is the base
4479 8a217fa2 Olga Brani
                 *  @param {function} fnCallback User definable function to modify the cookie
4480 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4481 8a217fa2 Olga Brani
                 */
4482 8a217fa2 Olga Brani
                function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
4483 8a217fa2 Olga Brani
                {
4484 8a217fa2 Olga Brani
                        var date = new Date();
4485 8a217fa2 Olga Brani
                        date.setTime( date.getTime()+(iSecs*1000) );
4486 8a217fa2 Olga Brani
                        
4487 8a217fa2 Olga Brani
                        /* 
4488 8a217fa2 Olga Brani
                         * Shocking but true - it would appear IE has major issues with having the path not having
4489 8a217fa2 Olga Brani
                         * a trailing slash on it. We need the cookie to be available based on the path, so we
4490 8a217fa2 Olga Brani
                         * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
4491 8a217fa2 Olga Brani
                         * patch to use at least some of the path
4492 8a217fa2 Olga Brani
                         */
4493 8a217fa2 Olga Brani
                        var aParts = window.location.pathname.split('/');
4494 8a217fa2 Olga Brani
                        var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
4495 8a217fa2 Olga Brani
                        var sFullCookie, oData;
4496 8a217fa2 Olga Brani
                        
4497 8a217fa2 Olga Brani
                        if ( fnCallback !== null )
4498 8a217fa2 Olga Brani
                        {
4499 8a217fa2 Olga Brani
                                oData = (typeof $.parseJSON === 'function') ? 
4500 8a217fa2 Olga Brani
                                        $.parseJSON( sValue ) : eval( '('+sValue+')' );
4501 8a217fa2 Olga Brani
                                sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
4502 8a217fa2 Olga Brani
                                        aParts.join('/')+"/" );
4503 8a217fa2 Olga Brani
                        }
4504 8a217fa2 Olga Brani
                        else
4505 8a217fa2 Olga Brani
                        {
4506 8a217fa2 Olga Brani
                                sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
4507 8a217fa2 Olga Brani
                                        "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
4508 8a217fa2 Olga Brani
                        }
4509 8a217fa2 Olga Brani
                        
4510 8a217fa2 Olga Brani
                        /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
4511 8a217fa2 Olga Brani
                         * belonging to DataTables.
4512 8a217fa2 Olga Brani
                         */
4513 8a217fa2 Olga Brani
                        var
4514 8a217fa2 Olga Brani
                                aCookies =document.cookie.split(';'),
4515 8a217fa2 Olga Brani
                                iNewCookieLen = sFullCookie.split(';')[0].length,
4516 8a217fa2 Olga Brani
                                aOldCookies = [];
4517 8a217fa2 Olga Brani
                        
4518 8a217fa2 Olga Brani
                        if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
4519 8a217fa2 Olga Brani
                        {
4520 8a217fa2 Olga Brani
                                for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
4521 8a217fa2 Olga Brani
                                {
4522 8a217fa2 Olga Brani
                                        if ( aCookies[i].indexOf( sBaseName ) != -1 )
4523 8a217fa2 Olga Brani
                                        {
4524 8a217fa2 Olga Brani
                                                /* It's a DataTables cookie, so eval it and check the time stamp */
4525 8a217fa2 Olga Brani
                                                var aSplitCookie = aCookies[i].split('=');
4526 8a217fa2 Olga Brani
                                                try {
4527 8a217fa2 Olga Brani
                                                        oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
4528 8a217fa2 Olga Brani
                
4529 8a217fa2 Olga Brani
                                                        if ( oData && oData.iCreate )
4530 8a217fa2 Olga Brani
                                                        {
4531 8a217fa2 Olga Brani
                                                                aOldCookies.push( {
4532 8a217fa2 Olga Brani
                                                                        "name": aSplitCookie[0],
4533 8a217fa2 Olga Brani
                                                                        "time": oData.iCreate
4534 8a217fa2 Olga Brani
                                                                } );
4535 8a217fa2 Olga Brani
                                                        }
4536 8a217fa2 Olga Brani
                                                }
4537 8a217fa2 Olga Brani
                                                catch( e ) {}
4538 8a217fa2 Olga Brani
                                        }
4539 8a217fa2 Olga Brani
                                }
4540 8a217fa2 Olga Brani
                
4541 8a217fa2 Olga Brani
                                // Make sure we delete the oldest ones first
4542 8a217fa2 Olga Brani
                                aOldCookies.sort( function (a, b) {
4543 8a217fa2 Olga Brani
                                        return b.time - a.time;
4544 8a217fa2 Olga Brani
                                } );
4545 8a217fa2 Olga Brani
                
4546 8a217fa2 Olga Brani
                                // Eliminate as many old DataTables cookies as we need to
4547 8a217fa2 Olga Brani
                                while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
4548 8a217fa2 Olga Brani
                                        if ( aOldCookies.length === 0 ) {
4549 8a217fa2 Olga Brani
                                                // Deleted all DT cookies and still not enough space. Can't state save
4550 8a217fa2 Olga Brani
                                                return;
4551 8a217fa2 Olga Brani
                                        }
4552 8a217fa2 Olga Brani
                                        
4553 8a217fa2 Olga Brani
                                        var old = aOldCookies.pop();
4554 8a217fa2 Olga Brani
                                        document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
4555 8a217fa2 Olga Brani
                                                aParts.join('/') + "/";
4556 8a217fa2 Olga Brani
                                }
4557 8a217fa2 Olga Brani
                        }
4558 8a217fa2 Olga Brani
                        
4559 8a217fa2 Olga Brani
                        document.cookie = sFullCookie;
4560 8a217fa2 Olga Brani
                }
4561 8a217fa2 Olga Brani
                
4562 8a217fa2 Olga Brani
                
4563 8a217fa2 Olga Brani
                /**
4564 8a217fa2 Olga Brani
                 * Read an old cookie to get a cookie with an old table state
4565 8a217fa2 Olga Brani
                 *  @param {string} sName name of the cookie to read
4566 8a217fa2 Olga Brani
                 *  @returns {string} contents of the cookie - or null if no cookie with that name found
4567 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4568 8a217fa2 Olga Brani
                 */
4569 8a217fa2 Olga Brani
                function _fnReadCookie ( sName )
4570 8a217fa2 Olga Brani
                {
4571 8a217fa2 Olga Brani
                        var
4572 8a217fa2 Olga Brani
                                aParts = window.location.pathname.split('/'),
4573 8a217fa2 Olga Brani
                                sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
4574 8a217fa2 Olga Brani
                                 sCookieContents = document.cookie.split(';');
4575 8a217fa2 Olga Brani
                        
4576 8a217fa2 Olga Brani
                        for( var i=0 ; i<sCookieContents.length ; i++ )
4577 8a217fa2 Olga Brani
                        {
4578 8a217fa2 Olga Brani
                                var c = sCookieContents[i];
4579 8a217fa2 Olga Brani
                                
4580 8a217fa2 Olga Brani
                                while (c.charAt(0)==' ')
4581 8a217fa2 Olga Brani
                                {
4582 8a217fa2 Olga Brani
                                        c = c.substring(1,c.length);
4583 8a217fa2 Olga Brani
                                }
4584 8a217fa2 Olga Brani
                                
4585 8a217fa2 Olga Brani
                                if (c.indexOf(sNameEQ) === 0)
4586 8a217fa2 Olga Brani
                                {
4587 8a217fa2 Olga Brani
                                        return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
4588 8a217fa2 Olga Brani
                                }
4589 8a217fa2 Olga Brani
                        }
4590 8a217fa2 Olga Brani
                        return null;
4591 8a217fa2 Olga Brani
                }
4592 8a217fa2 Olga Brani
                
4593 8a217fa2 Olga Brani
                
4594 8a217fa2 Olga Brani
                /**
4595 8a217fa2 Olga Brani
                 * Return the settings object for a particular table
4596 8a217fa2 Olga Brani
                 *  @param {node} nTable table we are using as a dataTable
4597 8a217fa2 Olga Brani
                 *  @returns {object} Settings object - or null if not found
4598 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4599 8a217fa2 Olga Brani
                 */
4600 8a217fa2 Olga Brani
                function _fnSettingsFromNode ( nTable )
4601 8a217fa2 Olga Brani
                {
4602 8a217fa2 Olga Brani
                        for ( var i=0 ; i<DataTable.settings.length ; i++ )
4603 8a217fa2 Olga Brani
                        {
4604 8a217fa2 Olga Brani
                                if ( DataTable.settings[i].nTable === nTable )
4605 8a217fa2 Olga Brani
                                {
4606 8a217fa2 Olga Brani
                                        return DataTable.settings[i];
4607 8a217fa2 Olga Brani
                                }
4608 8a217fa2 Olga Brani
                        }
4609 8a217fa2 Olga Brani
                        
4610 8a217fa2 Olga Brani
                        return null;
4611 8a217fa2 Olga Brani
                }
4612 8a217fa2 Olga Brani
                
4613 8a217fa2 Olga Brani
                
4614 8a217fa2 Olga Brani
                /**
4615 8a217fa2 Olga Brani
                 * Return an array with the TR nodes for the table
4616 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4617 8a217fa2 Olga Brani
                 *  @returns {array} TR array
4618 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4619 8a217fa2 Olga Brani
                 */
4620 8a217fa2 Olga Brani
                function _fnGetTrNodes ( oSettings )
4621 8a217fa2 Olga Brani
                {
4622 8a217fa2 Olga Brani
                        var aNodes = [];
4623 8a217fa2 Olga Brani
                        var aoData = oSettings.aoData;
4624 8a217fa2 Olga Brani
                        for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
4625 8a217fa2 Olga Brani
                        {
4626 8a217fa2 Olga Brani
                                if ( aoData[i].nTr !== null )
4627 8a217fa2 Olga Brani
                                {
4628 8a217fa2 Olga Brani
                                        aNodes.push( aoData[i].nTr );
4629 8a217fa2 Olga Brani
                                }
4630 8a217fa2 Olga Brani
                        }
4631 8a217fa2 Olga Brani
                        return aNodes;
4632 8a217fa2 Olga Brani
                }
4633 8a217fa2 Olga Brani
                
4634 8a217fa2 Olga Brani
                
4635 8a217fa2 Olga Brani
                /**
4636 8a217fa2 Olga Brani
                 * Return an flat array with all TD nodes for the table, or row
4637 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4638 8a217fa2 Olga Brani
                 *  @param {int} [iIndividualRow] aoData index to get the nodes for - optional 
4639 8a217fa2 Olga Brani
                 *    if not given then the return array will contain all nodes for the table
4640 8a217fa2 Olga Brani
                 *  @returns {array} TD array
4641 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4642 8a217fa2 Olga Brani
                 */
4643 8a217fa2 Olga Brani
                function _fnGetTdNodes ( oSettings, iIndividualRow )
4644 8a217fa2 Olga Brani
                {
4645 8a217fa2 Olga Brani
                        var anReturn = [];
4646 8a217fa2 Olga Brani
                        var iCorrector;
4647 8a217fa2 Olga Brani
                        var anTds, nTd;
4648 8a217fa2 Olga Brani
                        var iRow, iRows=oSettings.aoData.length,
4649 8a217fa2 Olga Brani
                                iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
4650 8a217fa2 Olga Brani
                        
4651 8a217fa2 Olga Brani
                        /* Allow the collection to be limited to just one row */
4652 8a217fa2 Olga Brani
                        if ( iIndividualRow !== undefined )
4653 8a217fa2 Olga Brani
                        {
4654 8a217fa2 Olga Brani
                                iStart = iIndividualRow;
4655 8a217fa2 Olga Brani
                                iEnd = iIndividualRow+1;
4656 8a217fa2 Olga Brani
                        }
4657 8a217fa2 Olga Brani
                
4658 8a217fa2 Olga Brani
                        for ( iRow=iStart ; iRow<iEnd ; iRow++ )
4659 8a217fa2 Olga Brani
                        {
4660 8a217fa2 Olga Brani
                                oData = oSettings.aoData[iRow];
4661 8a217fa2 Olga Brani
                                if ( oData.nTr !== null )
4662 8a217fa2 Olga Brani
                                {
4663 8a217fa2 Olga Brani
                                        /* get the TD child nodes - taking into account text etc nodes */
4664 8a217fa2 Olga Brani
                                        anTds = [];
4665 8a217fa2 Olga Brani
                                        nTd = oData.nTr.firstChild;
4666 8a217fa2 Olga Brani
                                        while ( nTd )
4667 8a217fa2 Olga Brani
                                        {
4668 8a217fa2 Olga Brani
                                                sNodeName = nTd.nodeName.toLowerCase();
4669 8a217fa2 Olga Brani
                                                if ( sNodeName == 'td' || sNodeName == 'th' )
4670 8a217fa2 Olga Brani
                                                {
4671 8a217fa2 Olga Brani
                                                        anTds.push( nTd );
4672 8a217fa2 Olga Brani
                                                }
4673 8a217fa2 Olga Brani
                                                nTd = nTd.nextSibling;
4674 8a217fa2 Olga Brani
                                        }
4675 8a217fa2 Olga Brani
                
4676 8a217fa2 Olga Brani
                                        iCorrector = 0;
4677 8a217fa2 Olga Brani
                                        for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
4678 8a217fa2 Olga Brani
                                        {
4679 8a217fa2 Olga Brani
                                                if ( oSettings.aoColumns[iColumn].bVisible )
4680 8a217fa2 Olga Brani
                                                {
4681 8a217fa2 Olga Brani
                                                        anReturn.push( anTds[iColumn-iCorrector] );
4682 8a217fa2 Olga Brani
                                                }
4683 8a217fa2 Olga Brani
                                                else
4684 8a217fa2 Olga Brani
                                                {
4685 8a217fa2 Olga Brani
                                                        anReturn.push( oData._anHidden[iColumn] );
4686 8a217fa2 Olga Brani
                                                        iCorrector++;
4687 8a217fa2 Olga Brani
                                                }
4688 8a217fa2 Olga Brani
                                        }
4689 8a217fa2 Olga Brani
                                }
4690 8a217fa2 Olga Brani
                        }
4691 8a217fa2 Olga Brani
                
4692 8a217fa2 Olga Brani
                        return anReturn;
4693 8a217fa2 Olga Brani
                }
4694 8a217fa2 Olga Brani
                
4695 8a217fa2 Olga Brani
                
4696 8a217fa2 Olga Brani
                /**
4697 8a217fa2 Olga Brani
                 * Log an error message
4698 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4699 8a217fa2 Olga Brani
                 *  @param {int} iLevel log error messages, or display them to the user
4700 8a217fa2 Olga Brani
                 *  @param {string} sMesg error message
4701 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4702 8a217fa2 Olga Brani
                 */
4703 8a217fa2 Olga Brani
                function _fnLog( oSettings, iLevel, sMesg )
4704 8a217fa2 Olga Brani
                {
4705 8a217fa2 Olga Brani
                        var sAlert = (oSettings===null) ?
4706 8a217fa2 Olga Brani
                                "DataTables warning: "+sMesg :
4707 8a217fa2 Olga Brani
                                "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg;
4708 8a217fa2 Olga Brani
                        
4709 8a217fa2 Olga Brani
                        if ( iLevel === 0 )
4710 8a217fa2 Olga Brani
                        {
4711 8a217fa2 Olga Brani
                                if ( DataTable.ext.sErrMode == 'alert' )
4712 8a217fa2 Olga Brani
                                {
4713 8a217fa2 Olga Brani
                                        alert( sAlert );
4714 8a217fa2 Olga Brani
                                }
4715 8a217fa2 Olga Brani
                                else
4716 8a217fa2 Olga Brani
                                {
4717 8a217fa2 Olga Brani
                                        throw new Error(sAlert);
4718 8a217fa2 Olga Brani
                                }
4719 8a217fa2 Olga Brani
                                return;
4720 8a217fa2 Olga Brani
                        }
4721 8a217fa2 Olga Brani
                        else if ( window.console && console.log )
4722 8a217fa2 Olga Brani
                        {
4723 8a217fa2 Olga Brani
                                console.log( sAlert );
4724 8a217fa2 Olga Brani
                        }
4725 8a217fa2 Olga Brani
                }
4726 8a217fa2 Olga Brani
                
4727 8a217fa2 Olga Brani
                
4728 8a217fa2 Olga Brani
                /**
4729 8a217fa2 Olga Brani
                 * See if a property is defined on one object, if so assign it to the other object
4730 8a217fa2 Olga Brani
                 *  @param {object} oRet target object
4731 8a217fa2 Olga Brani
                 *  @param {object} oSrc source object
4732 8a217fa2 Olga Brani
                 *  @param {string} sName property
4733 8a217fa2 Olga Brani
                 *  @param {string} [sMappedName] name to map too - optional, sName used if not given
4734 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4735 8a217fa2 Olga Brani
                 */
4736 8a217fa2 Olga Brani
                function _fnMap( oRet, oSrc, sName, sMappedName )
4737 8a217fa2 Olga Brani
                {
4738 8a217fa2 Olga Brani
                        if ( sMappedName === undefined )
4739 8a217fa2 Olga Brani
                        {
4740 8a217fa2 Olga Brani
                                sMappedName = sName;
4741 8a217fa2 Olga Brani
                        }
4742 8a217fa2 Olga Brani
                        if ( oSrc[sName] !== undefined )
4743 8a217fa2 Olga Brani
                        {
4744 8a217fa2 Olga Brani
                                oRet[sMappedName] = oSrc[sName];
4745 8a217fa2 Olga Brani
                        }
4746 8a217fa2 Olga Brani
                }
4747 8a217fa2 Olga Brani
                
4748 8a217fa2 Olga Brani
                
4749 8a217fa2 Olga Brani
                /**
4750 8a217fa2 Olga Brani
                 * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow
4751 8a217fa2 Olga Brani
                 * copy arrays. The reason we need to do this, is that we don't want to deep copy array
4752 8a217fa2 Olga Brani
                 * init values (such as aaSorting) since the dev wouldn't be able to override them, but
4753 8a217fa2 Olga Brani
                 * we do want to deep copy arrays.
4754 8a217fa2 Olga Brani
                 *  @param {object} oOut Object to extend
4755 8a217fa2 Olga Brani
                 *  @param {object} oExtender Object from which the properties will be applied to oOut
4756 8a217fa2 Olga Brani
                 *  @returns {object} oOut Reference, just for convenience - oOut === the return.
4757 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4758 8a217fa2 Olga Brani
                 *  @todo This doesn't take account of arrays inside the deep copied objects.
4759 8a217fa2 Olga Brani
                 */
4760 8a217fa2 Olga Brani
                function _fnExtend( oOut, oExtender )
4761 8a217fa2 Olga Brani
                {
4762 8a217fa2 Olga Brani
                        var val;
4763 8a217fa2 Olga Brani
                        
4764 8a217fa2 Olga Brani
                        for ( var prop in oExtender )
4765 8a217fa2 Olga Brani
                        {
4766 8a217fa2 Olga Brani
                                if ( oExtender.hasOwnProperty(prop) )
4767 8a217fa2 Olga Brani
                                {
4768 8a217fa2 Olga Brani
                                        val = oExtender[prop];
4769 8a217fa2 Olga Brani
                
4770 8a217fa2 Olga Brani
                                        if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
4771 8a217fa2 Olga Brani
                                        {
4772 8a217fa2 Olga Brani
                                                $.extend( true, oOut[prop], val );
4773 8a217fa2 Olga Brani
                                        }
4774 8a217fa2 Olga Brani
                                        else
4775 8a217fa2 Olga Brani
                                        {
4776 8a217fa2 Olga Brani
                                                oOut[prop] = val;
4777 8a217fa2 Olga Brani
                                        }
4778 8a217fa2 Olga Brani
                                }
4779 8a217fa2 Olga Brani
                        }
4780 8a217fa2 Olga Brani
                
4781 8a217fa2 Olga Brani
                        return oOut;
4782 8a217fa2 Olga Brani
                }
4783 8a217fa2 Olga Brani
                
4784 8a217fa2 Olga Brani
                
4785 8a217fa2 Olga Brani
                /**
4786 8a217fa2 Olga Brani
                 * Bind an event handers to allow a click or return key to activate the callback.
4787 8a217fa2 Olga Brani
                 * This is good for accessibility since a return on the keyboard will have the
4788 8a217fa2 Olga Brani
                 * same effect as a click, if the element has focus.
4789 8a217fa2 Olga Brani
                 *  @param {element} n Element to bind the action to
4790 8a217fa2 Olga Brani
                 *  @param {object} oData Data object to pass to the triggered function
4791 8a217fa2 Olga Brani
                 *  @param {function} fn Callback function for when the event is triggered
4792 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4793 8a217fa2 Olga Brani
                 */
4794 8a217fa2 Olga Brani
                function _fnBindAction( n, oData, fn )
4795 8a217fa2 Olga Brani
                {
4796 8a217fa2 Olga Brani
                        $(n)
4797 8a217fa2 Olga Brani
                                .bind( 'click.DT', oData, function (e) {
4798 8a217fa2 Olga Brani
                                                n.blur(); // Remove focus outline for mouse users
4799 8a217fa2 Olga Brani
                                                fn(e);
4800 8a217fa2 Olga Brani
                                        } )
4801 8a217fa2 Olga Brani
                                .bind( 'keypress.DT', oData, function (e){
4802 8a217fa2 Olga Brani
                                        if ( e.which === 13 ) {
4803 8a217fa2 Olga Brani
                                                fn(e);
4804 8a217fa2 Olga Brani
                                        } } )
4805 8a217fa2 Olga Brani
                                .bind( 'selectstart.DT', function () {
4806 8a217fa2 Olga Brani
                                        /* Take the brutal approach to cancelling text selection */
4807 8a217fa2 Olga Brani
                                        return false;
4808 8a217fa2 Olga Brani
                                        } );
4809 8a217fa2 Olga Brani
                }
4810 8a217fa2 Olga Brani
                
4811 8a217fa2 Olga Brani
                
4812 8a217fa2 Olga Brani
                /**
4813 8a217fa2 Olga Brani
                 * Register a callback function. Easily allows a callback function to be added to
4814 8a217fa2 Olga Brani
                 * an array store of callback functions that can then all be called together.
4815 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4816 8a217fa2 Olga Brani
                 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
4817 8a217fa2 Olga Brani
                 *  @param {function} fn Function to be called back
4818 8a217fa2 Olga Brani
                 *  @param {string} sName Identifying name for the callback (i.e. a label)
4819 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4820 8a217fa2 Olga Brani
                 */
4821 8a217fa2 Olga Brani
                function _fnCallbackReg( oSettings, sStore, fn, sName )
4822 8a217fa2 Olga Brani
                {
4823 8a217fa2 Olga Brani
                        if ( fn )
4824 8a217fa2 Olga Brani
                        {
4825 8a217fa2 Olga Brani
                                oSettings[sStore].push( {
4826 8a217fa2 Olga Brani
                                        "fn": fn,
4827 8a217fa2 Olga Brani
                                        "sName": sName
4828 8a217fa2 Olga Brani
                                } );
4829 8a217fa2 Olga Brani
                        }
4830 8a217fa2 Olga Brani
                }
4831 8a217fa2 Olga Brani
                
4832 8a217fa2 Olga Brani
                
4833 8a217fa2 Olga Brani
                /**
4834 8a217fa2 Olga Brani
                 * Fire callback functions and trigger events. Note that the loop over the callback
4835 8a217fa2 Olga Brani
                 * array store is done backwards! Further note that you do not want to fire off triggers
4836 8a217fa2 Olga Brani
                 * in time sensitive applications (for example cell creation) as its slow.
4837 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4838 8a217fa2 Olga Brani
                 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
4839 8a217fa2 Olga Brani
                 *  @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
4840 8a217fa2 Olga Brani
                 *    is fired
4841 8a217fa2 Olga Brani
                 *  @param {array} aArgs Array of arguments to pass to the callback function / trigger
4842 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4843 8a217fa2 Olga Brani
                 */
4844 8a217fa2 Olga Brani
                function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
4845 8a217fa2 Olga Brani
                {
4846 8a217fa2 Olga Brani
                        var aoStore = oSettings[sStore];
4847 8a217fa2 Olga Brani
                        var aRet =[];
4848 8a217fa2 Olga Brani
                
4849 8a217fa2 Olga Brani
                        for ( var i=aoStore.length-1 ; i>=0 ; i-- )
4850 8a217fa2 Olga Brani
                        {
4851 8a217fa2 Olga Brani
                                aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) );
4852 8a217fa2 Olga Brani
                        }
4853 8a217fa2 Olga Brani
                
4854 8a217fa2 Olga Brani
                        if ( sTrigger !== null )
4855 8a217fa2 Olga Brani
                        {
4856 8a217fa2 Olga Brani
                                $(oSettings.oInstance).trigger(sTrigger, aArgs);
4857 8a217fa2 Olga Brani
                        }
4858 8a217fa2 Olga Brani
                
4859 8a217fa2 Olga Brani
                        return aRet;
4860 8a217fa2 Olga Brani
                }
4861 8a217fa2 Olga Brani
                
4862 8a217fa2 Olga Brani
                
4863 8a217fa2 Olga Brani
                /**
4864 8a217fa2 Olga Brani
                 * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
4865 8a217fa2 Olga Brani
                 * library, then we use that as it is fast, safe and accurate. If the function isn't 
4866 8a217fa2 Olga Brani
                 * available then we need to built it ourselves - the inspiration for this function comes
4867 8a217fa2 Olga Brani
                 * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
4868 8a217fa2 Olga Brani
                 * not perfect and absolutely should not be used as a replacement to json2.js - but it does
4869 8a217fa2 Olga Brani
                 * do what we need, without requiring a dependency for DataTables.
4870 8a217fa2 Olga Brani
                 *  @param {object} o JSON object to be converted
4871 8a217fa2 Olga Brani
                 *  @returns {string} JSON string
4872 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4873 8a217fa2 Olga Brani
                 */
4874 8a217fa2 Olga Brani
                var _fnJsonString = (window.JSON) ? JSON.stringify : function( o )
4875 8a217fa2 Olga Brani
                {
4876 8a217fa2 Olga Brani
                        /* Not an object or array */
4877 8a217fa2 Olga Brani
                        var sType = typeof o;
4878 8a217fa2 Olga Brani
                        if (sType !== "object" || o === null)
4879 8a217fa2 Olga Brani
                        {
4880 8a217fa2 Olga Brani
                                // simple data type
4881 8a217fa2 Olga Brani
                                if (sType === "string")
4882 8a217fa2 Olga Brani
                                {
4883 8a217fa2 Olga Brani
                                        o = '"'+o+'"';
4884 8a217fa2 Olga Brani
                                }
4885 8a217fa2 Olga Brani
                                return o+"";
4886 8a217fa2 Olga Brani
                        }
4887 8a217fa2 Olga Brani
                
4888 8a217fa2 Olga Brani
                        /* If object or array, need to recurse over it */
4889 8a217fa2 Olga Brani
                        var
4890 8a217fa2 Olga Brani
                                sProp, mValue,
4891 8a217fa2 Olga Brani
                                json = [],
4892 8a217fa2 Olga Brani
                                bArr = $.isArray(o);
4893 8a217fa2 Olga Brani
                        
4894 8a217fa2 Olga Brani
                        for (sProp in o)
4895 8a217fa2 Olga Brani
                        {
4896 8a217fa2 Olga Brani
                                mValue = o[sProp];
4897 8a217fa2 Olga Brani
                                sType = typeof mValue;
4898 8a217fa2 Olga Brani
                
4899 8a217fa2 Olga Brani
                                if (sType === "string")
4900 8a217fa2 Olga Brani
                                {
4901 8a217fa2 Olga Brani
                                        mValue = '"'+mValue+'"';
4902 8a217fa2 Olga Brani
                                }
4903 8a217fa2 Olga Brani
                                else if (sType === "object" && mValue !== null)
4904 8a217fa2 Olga Brani
                                {
4905 8a217fa2 Olga Brani
                                        mValue = _fnJsonString(mValue);
4906 8a217fa2 Olga Brani
                                }
4907 8a217fa2 Olga Brani
                
4908 8a217fa2 Olga Brani
                                json.push((bArr ? "" : '"'+sProp+'":') + mValue);
4909 8a217fa2 Olga Brani
                        }
4910 8a217fa2 Olga Brani
                
4911 8a217fa2 Olga Brani
                        return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
4912 8a217fa2 Olga Brani
                };
4913 8a217fa2 Olga Brani
                
4914 8a217fa2 Olga Brani
                
4915 8a217fa2 Olga Brani
                /**
4916 8a217fa2 Olga Brani
                 * From some browsers (specifically IE6/7) we need special handling to work around browser
4917 8a217fa2 Olga Brani
                 * bugs - this function is used to detect when these workarounds are needed.
4918 8a217fa2 Olga Brani
                 *  @param {object} oSettings dataTables settings object
4919 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
4920 8a217fa2 Olga Brani
                 */
4921 8a217fa2 Olga Brani
                function _fnBrowserDetect( oSettings )
4922 8a217fa2 Olga Brani
                {
4923 8a217fa2 Olga Brani
                        /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the
4924 8a217fa2 Olga Brani
                         * width of the scrollbar, while other browsers ensure the inner element is contained
4925 8a217fa2 Olga Brani
                         * without forcing scrolling
4926 8a217fa2 Olga Brani
                         */
4927 8a217fa2 Olga Brani
                        var n = $(
4928 8a217fa2 Olga Brani
                                '<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden">'+
4929 8a217fa2 Olga Brani
                                        '<div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;">'+
4930 8a217fa2 Olga Brani
                                                '<div id="DT_BrowserTest" style="width:100%; height:10px;"></div>'+
4931 8a217fa2 Olga Brani
                                        '</div>'+
4932 8a217fa2 Olga Brani
                                '</div>')[0];
4933 8a217fa2 Olga Brani
                
4934 8a217fa2 Olga Brani
                        document.body.appendChild( n );
4935 8a217fa2 Olga Brani
                        oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;
4936 8a217fa2 Olga Brani
                        document.body.removeChild( n );
4937 8a217fa2 Olga Brani
                }
4938 8a217fa2 Olga Brani
                
4939 8a217fa2 Olga Brani
4940 8a217fa2 Olga Brani
                /**
4941 8a217fa2 Olga Brani
                 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
4942 8a217fa2 Olga Brani
                 * return the resulting jQuery object.
4943 8a217fa2 Olga Brani
                 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
4944 8a217fa2 Olga Brani
                 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
4945 8a217fa2 Olga Brani
                 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
4946 8a217fa2 Olga Brani
                 *    criterion ("applied") or all TR elements (i.e. no filter).
4947 8a217fa2 Olga Brani
                 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
4948 8a217fa2 Olga Brani
                 *    Can be either 'current', whereby the current sorting of the table is used, or
4949 8a217fa2 Olga Brani
                 *    'original' whereby the original order the data was read into the table is used.
4950 8a217fa2 Olga Brani
                 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
4951 8a217fa2 Olga Brani
                 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be 
4952 8a217fa2 Olga Brani
                 *    'current' and filter is 'applied', regardless of what they might be given as.
4953 8a217fa2 Olga Brani
                 *  @returns {object} jQuery object, filtered by the given selector.
4954 8a217fa2 Olga Brani
                 *  @dtopt API
4955 8a217fa2 Olga Brani
                 *
4956 8a217fa2 Olga Brani
                 *  @example
4957 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
4958 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
4959 8a217fa2 Olga Brani
                 *
4960 8a217fa2 Olga Brani
                 *      // Highlight every second row
4961 8a217fa2 Olga Brani
                 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
4962 8a217fa2 Olga Brani
                 *    } );
4963 8a217fa2 Olga Brani
                 *
4964 8a217fa2 Olga Brani
                 *  @example
4965 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
4966 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
4967 8a217fa2 Olga Brani
                 *
4968 8a217fa2 Olga Brani
                 *      // Filter to rows with 'Webkit' in them, add a background colour and then
4969 8a217fa2 Olga Brani
                 *      // remove the filter, thus highlighting the 'Webkit' rows only.
4970 8a217fa2 Olga Brani
                 *      oTable.fnFilter('Webkit');
4971 8a217fa2 Olga Brani
                 *      oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue');
4972 8a217fa2 Olga Brani
                 *      oTable.fnFilter('');
4973 8a217fa2 Olga Brani
                 *    } );
4974 8a217fa2 Olga Brani
                 */
4975 8a217fa2 Olga Brani
                this.$ = function ( sSelector, oOpts )
4976 8a217fa2 Olga Brani
                {
4977 8a217fa2 Olga Brani
                        var i, iLen, a = [], tr;
4978 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
4979 8a217fa2 Olga Brani
                        var aoData = oSettings.aoData;
4980 8a217fa2 Olga Brani
                        var aiDisplay = oSettings.aiDisplay;
4981 8a217fa2 Olga Brani
                        var aiDisplayMaster = oSettings.aiDisplayMaster;
4982 8a217fa2 Olga Brani
                
4983 8a217fa2 Olga Brani
                        if ( !oOpts )
4984 8a217fa2 Olga Brani
                        {
4985 8a217fa2 Olga Brani
                                oOpts = {};
4986 8a217fa2 Olga Brani
                        }
4987 8a217fa2 Olga Brani
                
4988 8a217fa2 Olga Brani
                        oOpts = $.extend( {}, {
4989 8a217fa2 Olga Brani
                                "filter": "none", // applied
4990 8a217fa2 Olga Brani
                                "order": "current", // "original"
4991 8a217fa2 Olga Brani
                                "page": "all" // current
4992 8a217fa2 Olga Brani
                        }, oOpts );
4993 8a217fa2 Olga Brani
                
4994 8a217fa2 Olga Brani
                        // Current page implies that order=current and fitler=applied, since it is fairly
4995 8a217fa2 Olga Brani
                        // senseless otherwise
4996 8a217fa2 Olga Brani
                        if ( oOpts.page == 'current' )
4997 8a217fa2 Olga Brani
                        {
4998 8a217fa2 Olga Brani
                                for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
4999 8a217fa2 Olga Brani
                                {
5000 8a217fa2 Olga Brani
                                        tr = aoData[ aiDisplay[i] ].nTr;
5001 8a217fa2 Olga Brani
                                        if ( tr )
5002 8a217fa2 Olga Brani
                                        {
5003 8a217fa2 Olga Brani
                                                a.push( tr );
5004 8a217fa2 Olga Brani
                                        }
5005 8a217fa2 Olga Brani
                                }
5006 8a217fa2 Olga Brani
                        }
5007 8a217fa2 Olga Brani
                        else if ( oOpts.order == "current" && oOpts.filter == "none" )
5008 8a217fa2 Olga Brani
                        {
5009 8a217fa2 Olga Brani
                                for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )
5010 8a217fa2 Olga Brani
                                {
5011 8a217fa2 Olga Brani
                                        tr = aoData[ aiDisplayMaster[i] ].nTr;
5012 8a217fa2 Olga Brani
                                        if ( tr )
5013 8a217fa2 Olga Brani
                                        {
5014 8a217fa2 Olga Brani
                                                a.push( tr );
5015 8a217fa2 Olga Brani
                                        }
5016 8a217fa2 Olga Brani
                                }
5017 8a217fa2 Olga Brani
                        }
5018 8a217fa2 Olga Brani
                        else if ( oOpts.order == "current" && oOpts.filter == "applied" )
5019 8a217fa2 Olga Brani
                        {
5020 8a217fa2 Olga Brani
                                for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )
5021 8a217fa2 Olga Brani
                                {
5022 8a217fa2 Olga Brani
                                        tr = aoData[ aiDisplay[i] ].nTr;
5023 8a217fa2 Olga Brani
                                        if ( tr )
5024 8a217fa2 Olga Brani
                                        {
5025 8a217fa2 Olga Brani
                                                a.push( tr );
5026 8a217fa2 Olga Brani
                                        }
5027 8a217fa2 Olga Brani
                                }
5028 8a217fa2 Olga Brani
                        }
5029 8a217fa2 Olga Brani
                        else if ( oOpts.order == "original" && oOpts.filter == "none" )
5030 8a217fa2 Olga Brani
                        {
5031 8a217fa2 Olga Brani
                                for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5032 8a217fa2 Olga Brani
                                {
5033 8a217fa2 Olga Brani
                                        tr = aoData[ i ].nTr ;
5034 8a217fa2 Olga Brani
                                        if ( tr )
5035 8a217fa2 Olga Brani
                                        {
5036 8a217fa2 Olga Brani
                                                a.push( tr );
5037 8a217fa2 Olga Brani
                                        }
5038 8a217fa2 Olga Brani
                                }
5039 8a217fa2 Olga Brani
                        }
5040 8a217fa2 Olga Brani
                        else if ( oOpts.order == "original" && oOpts.filter == "applied" )
5041 8a217fa2 Olga Brani
                        {
5042 8a217fa2 Olga Brani
                                for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5043 8a217fa2 Olga Brani
                                {
5044 8a217fa2 Olga Brani
                                        tr = aoData[ i ].nTr;
5045 8a217fa2 Olga Brani
                                        if ( $.inArray( i, aiDisplay ) !== -1 && tr )
5046 8a217fa2 Olga Brani
                                        {
5047 8a217fa2 Olga Brani
                                                a.push( tr );
5048 8a217fa2 Olga Brani
                                        }
5049 8a217fa2 Olga Brani
                                }
5050 8a217fa2 Olga Brani
                        }
5051 8a217fa2 Olga Brani
                        else
5052 8a217fa2 Olga Brani
                        {
5053 8a217fa2 Olga Brani
                                _fnLog( oSettings, 1, "Unknown selection options" );
5054 8a217fa2 Olga Brani
                        }
5055 8a217fa2 Olga Brani
                
5056 8a217fa2 Olga Brani
                        /* We need to filter on the TR elements and also 'find' in their descendants
5057 8a217fa2 Olga Brani
                         * to make the selector act like it would in a full table - so we need
5058 8a217fa2 Olga Brani
                         * to build both results and then combine them together
5059 8a217fa2 Olga Brani
                         */
5060 8a217fa2 Olga Brani
                        var jqA = $(a);
5061 8a217fa2 Olga Brani
                        var jqTRs = jqA.filter( sSelector );
5062 8a217fa2 Olga Brani
                        var jqDescendants = jqA.find( sSelector );
5063 8a217fa2 Olga Brani
                
5064 8a217fa2 Olga Brani
                        return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) );
5065 8a217fa2 Olga Brani
                };
5066 8a217fa2 Olga Brani
                
5067 8a217fa2 Olga Brani
                
5068 8a217fa2 Olga Brani
                /**
5069 8a217fa2 Olga Brani
                 * Almost identical to $ in operation, but in this case returns the data for the matched
5070 8a217fa2 Olga Brani
                 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
5071 8a217fa2 Olga Brani
                 * rather than any descendants, so the data can be obtained for the row/cell. If matching
5072 8a217fa2 Olga Brani
                 * rows are found, the data returned is the original data array/object that was used to  
5073 8a217fa2 Olga Brani
                 * create the row (or a generated array if from a DOM source).
5074 8a217fa2 Olga Brani
                 *
5075 8a217fa2 Olga Brani
                 * This method is often useful in-combination with $ where both functions are given the
5076 8a217fa2 Olga Brani
                 * same parameters and the array indexes will match identically.
5077 8a217fa2 Olga Brani
                 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
5078 8a217fa2 Olga Brani
                 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
5079 8a217fa2 Olga Brani
                 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
5080 8a217fa2 Olga Brani
                 *    criterion ("applied") or all elements (i.e. no filter).
5081 8a217fa2 Olga Brani
                 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
5082 8a217fa2 Olga Brani
                 *    Can be either 'current', whereby the current sorting of the table is used, or
5083 8a217fa2 Olga Brani
                 *    'original' whereby the original order the data was read into the table is used.
5084 8a217fa2 Olga Brani
                 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
5085 8a217fa2 Olga Brani
                 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be 
5086 8a217fa2 Olga Brani
                 *    'current' and filter is 'applied', regardless of what they might be given as.
5087 8a217fa2 Olga Brani
                 *  @returns {array} Data for the matched elements. If any elements, as a result of the
5088 8a217fa2 Olga Brani
                 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null 
5089 8a217fa2 Olga Brani
                 *    entry in the array.
5090 8a217fa2 Olga Brani
                 *  @dtopt API
5091 8a217fa2 Olga Brani
                 *
5092 8a217fa2 Olga Brani
                 *  @example
5093 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5094 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5095 8a217fa2 Olga Brani
                 *
5096 8a217fa2 Olga Brani
                 *      // Get the data from the first row in the table
5097 8a217fa2 Olga Brani
                 *      var data = oTable._('tr:first');
5098 8a217fa2 Olga Brani
                 *
5099 8a217fa2 Olga Brani
                 *      // Do something useful with the data
5100 8a217fa2 Olga Brani
                 *      alert( "First cell is: "+data[0] );
5101 8a217fa2 Olga Brani
                 *    } );
5102 8a217fa2 Olga Brani
                 *
5103 8a217fa2 Olga Brani
                 *  @example
5104 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5105 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5106 8a217fa2 Olga Brani
                 *
5107 8a217fa2 Olga Brani
                 *      // Filter to 'Webkit' and get all data for 
5108 8a217fa2 Olga Brani
                 *      oTable.fnFilter('Webkit');
5109 8a217fa2 Olga Brani
                 *      var data = oTable._('tr', {"filter": "applied"});
5110 8a217fa2 Olga Brani
                 *      
5111 8a217fa2 Olga Brani
                 *      // Do something with the data
5112 8a217fa2 Olga Brani
                 *      alert( data.length+" rows matched the filter" );
5113 8a217fa2 Olga Brani
                 *    } );
5114 8a217fa2 Olga Brani
                 */
5115 8a217fa2 Olga Brani
                this._ = function ( sSelector, oOpts )
5116 8a217fa2 Olga Brani
                {
5117 8a217fa2 Olga Brani
                        var aOut = [];
5118 8a217fa2 Olga Brani
                        var i, iLen, iIndex;
5119 8a217fa2 Olga Brani
                        var aTrs = this.$( sSelector, oOpts );
5120 8a217fa2 Olga Brani
                
5121 8a217fa2 Olga Brani
                        for ( i=0, iLen=aTrs.length ; i<iLen ; i++ )
5122 8a217fa2 Olga Brani
                        {
5123 8a217fa2 Olga Brani
                                aOut.push( this.fnGetData(aTrs[i]) );
5124 8a217fa2 Olga Brani
                        }
5125 8a217fa2 Olga Brani
                
5126 8a217fa2 Olga Brani
                        return aOut;
5127 8a217fa2 Olga Brani
                };
5128 8a217fa2 Olga Brani
                
5129 8a217fa2 Olga Brani
                
5130 8a217fa2 Olga Brani
                /**
5131 8a217fa2 Olga Brani
                 * Add a single new row or multiple rows of data to the table. Please note
5132 8a217fa2 Olga Brani
                 * that this is suitable for client-side processing only - if you are using 
5133 8a217fa2 Olga Brani
                 * server-side processing (i.e. "bServerSide": true), then to add data, you
5134 8a217fa2 Olga Brani
                 * must add it to the data source, i.e. the server-side, through an Ajax call.
5135 8a217fa2 Olga Brani
                 *  @param {array|object} mData The data to be added to the table. This can be:
5136 8a217fa2 Olga Brani
                 *    <ul>
5137 8a217fa2 Olga Brani
                 *      <li>1D array of data - add a single row with the data provided</li>
5138 8a217fa2 Olga Brani
                 *      <li>2D array of arrays - add multiple rows in a single call</li>
5139 8a217fa2 Olga Brani
                 *      <li>object - data object when using <i>mData</i></li>
5140 8a217fa2 Olga Brani
                 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
5141 8a217fa2 Olga Brani
                 *    </ul>
5142 8a217fa2 Olga Brani
                 *  @param {bool} [bRedraw=true] redraw the table or not
5143 8a217fa2 Olga Brani
                 *  @returns {array} An array of integers, representing the list of indexes in 
5144 8a217fa2 Olga Brani
                 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to 
5145 8a217fa2 Olga Brani
                 *    the table.
5146 8a217fa2 Olga Brani
                 *  @dtopt API
5147 8a217fa2 Olga Brani
                 *
5148 8a217fa2 Olga Brani
                 *  @example
5149 8a217fa2 Olga Brani
                 *    // Global var for counter
5150 8a217fa2 Olga Brani
                 *    var giCount = 2;
5151 8a217fa2 Olga Brani
                 *    
5152 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5153 8a217fa2 Olga Brani
                 *      $('#example').dataTable();
5154 8a217fa2 Olga Brani
                 *    } );
5155 8a217fa2 Olga Brani
                 *    
5156 8a217fa2 Olga Brani
                 *    function fnClickAddRow() {
5157 8a217fa2 Olga Brani
                 *      $('#example').dataTable().fnAddData( [
5158 8a217fa2 Olga Brani
                 *        giCount+".1",
5159 8a217fa2 Olga Brani
                 *        giCount+".2",
5160 8a217fa2 Olga Brani
                 *        giCount+".3",
5161 8a217fa2 Olga Brani
                 *        giCount+".4" ]
5162 8a217fa2 Olga Brani
                 *      );
5163 8a217fa2 Olga Brani
                 *        
5164 8a217fa2 Olga Brani
                 *      giCount++;
5165 8a217fa2 Olga Brani
                 *    }
5166 8a217fa2 Olga Brani
                 */
5167 8a217fa2 Olga Brani
                this.fnAddData = function( mData, bRedraw )
5168 8a217fa2 Olga Brani
                {
5169 8a217fa2 Olga Brani
                        if ( mData.length === 0 )
5170 8a217fa2 Olga Brani
                        {
5171 8a217fa2 Olga Brani
                                return [];
5172 8a217fa2 Olga Brani
                        }
5173 8a217fa2 Olga Brani
                        
5174 8a217fa2 Olga Brani
                        var aiReturn = [];
5175 8a217fa2 Olga Brani
                        var iTest;
5176 8a217fa2 Olga Brani
                        
5177 8a217fa2 Olga Brani
                        /* Find settings from table node */
5178 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5179 8a217fa2 Olga Brani
                        
5180 8a217fa2 Olga Brani
                        /* Check if we want to add multiple rows or not */
5181 8a217fa2 Olga Brani
                        if ( typeof mData[0] === "object" && mData[0] !== null )
5182 8a217fa2 Olga Brani
                        {
5183 8a217fa2 Olga Brani
                                for ( var i=0 ; i<mData.length ; i++ )
5184 8a217fa2 Olga Brani
                                {
5185 8a217fa2 Olga Brani
                                        iTest = _fnAddData( oSettings, mData[i] );
5186 8a217fa2 Olga Brani
                                        if ( iTest == -1 )
5187 8a217fa2 Olga Brani
                                        {
5188 8a217fa2 Olga Brani
                                                return aiReturn;
5189 8a217fa2 Olga Brani
                                        }
5190 8a217fa2 Olga Brani
                                        aiReturn.push( iTest );
5191 8a217fa2 Olga Brani
                                }
5192 8a217fa2 Olga Brani
                        }
5193 8a217fa2 Olga Brani
                        else
5194 8a217fa2 Olga Brani
                        {
5195 8a217fa2 Olga Brani
                                iTest = _fnAddData( oSettings, mData );
5196 8a217fa2 Olga Brani
                                if ( iTest == -1 )
5197 8a217fa2 Olga Brani
                                {
5198 8a217fa2 Olga Brani
                                        return aiReturn;
5199 8a217fa2 Olga Brani
                                }
5200 8a217fa2 Olga Brani
                                aiReturn.push( iTest );
5201 8a217fa2 Olga Brani
                        }
5202 8a217fa2 Olga Brani
                        
5203 8a217fa2 Olga Brani
                        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
5204 8a217fa2 Olga Brani
                        
5205 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
5206 8a217fa2 Olga Brani
                        {
5207 8a217fa2 Olga Brani
                                _fnReDraw( oSettings );
5208 8a217fa2 Olga Brani
                        }
5209 8a217fa2 Olga Brani
                        return aiReturn;
5210 8a217fa2 Olga Brani
                };
5211 8a217fa2 Olga Brani
                
5212 8a217fa2 Olga Brani
                
5213 8a217fa2 Olga Brani
                /**
5214 8a217fa2 Olga Brani
                 * This function will make DataTables recalculate the column sizes, based on the data 
5215 8a217fa2 Olga Brani
                 * contained in the table and the sizes applied to the columns (in the DOM, CSS or 
5216 8a217fa2 Olga Brani
                 * through the sWidth parameter). This can be useful when the width of the table's 
5217 8a217fa2 Olga Brani
                 * parent element changes (for example a window resize).
5218 8a217fa2 Olga Brani
                 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
5219 8a217fa2 Olga Brani
                 *  @dtopt API
5220 8a217fa2 Olga Brani
                 *
5221 8a217fa2 Olga Brani
                 *  @example
5222 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5223 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
5224 8a217fa2 Olga Brani
                 *        "sScrollY": "200px",
5225 8a217fa2 Olga Brani
                 *        "bPaginate": false
5226 8a217fa2 Olga Brani
                 *      } );
5227 8a217fa2 Olga Brani
                 *      
5228 8a217fa2 Olga Brani
                 *      $(window).bind('resize', function () {
5229 8a217fa2 Olga Brani
                 *        oTable.fnAdjustColumnSizing();
5230 8a217fa2 Olga Brani
                 *      } );
5231 8a217fa2 Olga Brani
                 *    } );
5232 8a217fa2 Olga Brani
                 */
5233 8a217fa2 Olga Brani
                this.fnAdjustColumnSizing = function ( bRedraw )
5234 8a217fa2 Olga Brani
                {
5235 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);
5236 8a217fa2 Olga Brani
                        _fnAdjustColumnSizing( oSettings );
5237 8a217fa2 Olga Brani
                        
5238 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
5239 8a217fa2 Olga Brani
                        {
5240 8a217fa2 Olga Brani
                                this.fnDraw( false );
5241 8a217fa2 Olga Brani
                        }
5242 8a217fa2 Olga Brani
                        else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
5243 8a217fa2 Olga Brani
                        {
5244 8a217fa2 Olga Brani
                                /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
5245 8a217fa2 Olga Brani
                                this.oApi._fnScrollDraw(oSettings);
5246 8a217fa2 Olga Brani
                        }
5247 8a217fa2 Olga Brani
                };
5248 8a217fa2 Olga Brani
                
5249 8a217fa2 Olga Brani
                
5250 8a217fa2 Olga Brani
                /**
5251 8a217fa2 Olga Brani
                 * Quickly and simply clear a table
5252 8a217fa2 Olga Brani
                 *  @param {bool} [bRedraw=true] redraw the table or not
5253 8a217fa2 Olga Brani
                 *  @dtopt API
5254 8a217fa2 Olga Brani
                 *
5255 8a217fa2 Olga Brani
                 *  @example
5256 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5257 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5258 8a217fa2 Olga Brani
                 *      
5259 8a217fa2 Olga Brani
                 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
5260 8a217fa2 Olga Brani
                 *      oTable.fnClearTable();
5261 8a217fa2 Olga Brani
                 *    } );
5262 8a217fa2 Olga Brani
                 */
5263 8a217fa2 Olga Brani
                this.fnClearTable = function( bRedraw )
5264 8a217fa2 Olga Brani
                {
5265 8a217fa2 Olga Brani
                        /* Find settings from table node */
5266 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5267 8a217fa2 Olga Brani
                        _fnClearTable( oSettings );
5268 8a217fa2 Olga Brani
                        
5269 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
5270 8a217fa2 Olga Brani
                        {
5271 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
5272 8a217fa2 Olga Brani
                        }
5273 8a217fa2 Olga Brani
                };
5274 8a217fa2 Olga Brani
                
5275 8a217fa2 Olga Brani
                
5276 8a217fa2 Olga Brani
                /**
5277 8a217fa2 Olga Brani
                 * The exact opposite of 'opening' a row, this function will close any rows which 
5278 8a217fa2 Olga Brani
                 * are currently 'open'.
5279 8a217fa2 Olga Brani
                 *  @param {node} nTr the table row to 'close'
5280 8a217fa2 Olga Brani
                 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
5281 8a217fa2 Olga Brani
                 *  @dtopt API
5282 8a217fa2 Olga Brani
                 *
5283 8a217fa2 Olga Brani
                 *  @example
5284 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5285 8a217fa2 Olga Brani
                 *      var oTable;
5286 8a217fa2 Olga Brani
                 *      
5287 8a217fa2 Olga Brani
                 *      // 'open' an information row when a row is clicked on
5288 8a217fa2 Olga Brani
                 *      $('#example tbody tr').click( function () {
5289 8a217fa2 Olga Brani
                 *        if ( oTable.fnIsOpen(this) ) {
5290 8a217fa2 Olga Brani
                 *          oTable.fnClose( this );
5291 8a217fa2 Olga Brani
                 *        } else {
5292 8a217fa2 Olga Brani
                 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
5293 8a217fa2 Olga Brani
                 *        }
5294 8a217fa2 Olga Brani
                 *      } );
5295 8a217fa2 Olga Brani
                 *      
5296 8a217fa2 Olga Brani
                 *      oTable = $('#example').dataTable();
5297 8a217fa2 Olga Brani
                 *    } );
5298 8a217fa2 Olga Brani
                 */
5299 8a217fa2 Olga Brani
                this.fnClose = function( nTr )
5300 8a217fa2 Olga Brani
                {
5301 8a217fa2 Olga Brani
                        /* Find settings from table node */
5302 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5303 8a217fa2 Olga Brani
                        
5304 8a217fa2 Olga Brani
                        for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
5305 8a217fa2 Olga Brani
                        {
5306 8a217fa2 Olga Brani
                                if ( oSettings.aoOpenRows[i].nParent == nTr )
5307 8a217fa2 Olga Brani
                                {
5308 8a217fa2 Olga Brani
                                        var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
5309 8a217fa2 Olga Brani
                                        if ( nTrParent )
5310 8a217fa2 Olga Brani
                                        {
5311 8a217fa2 Olga Brani
                                                /* Remove it if it is currently on display */
5312 8a217fa2 Olga Brani
                                                nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
5313 8a217fa2 Olga Brani
                                        }
5314 8a217fa2 Olga Brani
                                        oSettings.aoOpenRows.splice( i, 1 );
5315 8a217fa2 Olga Brani
                                        return 0;
5316 8a217fa2 Olga Brani
                                }
5317 8a217fa2 Olga Brani
                        }
5318 8a217fa2 Olga Brani
                        return 1;
5319 8a217fa2 Olga Brani
                };
5320 8a217fa2 Olga Brani
                
5321 8a217fa2 Olga Brani
                
5322 8a217fa2 Olga Brani
                /**
5323 8a217fa2 Olga Brani
                 * Remove a row for the table
5324 8a217fa2 Olga Brani
                 *  @param {mixed} mTarget The index of the row from aoData to be deleted, or
5325 8a217fa2 Olga Brani
                 *    the TR element you want to delete
5326 8a217fa2 Olga Brani
                 *  @param {function|null} [fnCallBack] Callback function
5327 8a217fa2 Olga Brani
                 *  @param {bool} [bRedraw=true] Redraw the table or not
5328 8a217fa2 Olga Brani
                 *  @returns {array} The row that was deleted
5329 8a217fa2 Olga Brani
                 *  @dtopt API
5330 8a217fa2 Olga Brani
                 *
5331 8a217fa2 Olga Brani
                 *  @example
5332 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5333 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5334 8a217fa2 Olga Brani
                 *      
5335 8a217fa2 Olga Brani
                 *      // Immediately remove the first row
5336 8a217fa2 Olga Brani
                 *      oTable.fnDeleteRow( 0 );
5337 8a217fa2 Olga Brani
                 *    } );
5338 8a217fa2 Olga Brani
                 */
5339 8a217fa2 Olga Brani
                this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
5340 8a217fa2 Olga Brani
                {
5341 8a217fa2 Olga Brani
                        /* Find settings from table node */
5342 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5343 8a217fa2 Olga Brani
                        var i, iLen, iAODataIndex;
5344 8a217fa2 Olga Brani
                        
5345 8a217fa2 Olga Brani
                        iAODataIndex = (typeof mTarget === 'object') ? 
5346 8a217fa2 Olga Brani
                                _fnNodeToDataIndex(oSettings, mTarget) : mTarget;
5347 8a217fa2 Olga Brani
                        
5348 8a217fa2 Olga Brani
                        /* Return the data array from this row */
5349 8a217fa2 Olga Brani
                        var oData = oSettings.aoData.splice( iAODataIndex, 1 );
5350 8a217fa2 Olga Brani
                
5351 8a217fa2 Olga Brani
                        /* Update the _DT_RowIndex parameter */
5352 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
5353 8a217fa2 Olga Brani
                        {
5354 8a217fa2 Olga Brani
                                if ( oSettings.aoData[i].nTr !== null )
5355 8a217fa2 Olga Brani
                                {
5356 8a217fa2 Olga Brani
                                        oSettings.aoData[i].nTr._DT_RowIndex = i;
5357 8a217fa2 Olga Brani
                                }
5358 8a217fa2 Olga Brani
                        }
5359 8a217fa2 Olga Brani
                        
5360 8a217fa2 Olga Brani
                        /* Remove the target row from the search array */
5361 8a217fa2 Olga Brani
                        var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
5362 8a217fa2 Olga Brani
                        oSettings.asDataSearch.splice( iDisplayIndex, 1 );
5363 8a217fa2 Olga Brani
                        
5364 8a217fa2 Olga Brani
                        /* Delete from the display arrays */
5365 8a217fa2 Olga Brani
                        _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
5366 8a217fa2 Olga Brani
                        _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
5367 8a217fa2 Olga Brani
                        
5368 8a217fa2 Olga Brani
                        /* If there is a user callback function - call it */
5369 8a217fa2 Olga Brani
                        if ( typeof fnCallBack === "function" )
5370 8a217fa2 Olga Brani
                        {
5371 8a217fa2 Olga Brani
                                fnCallBack.call( this, oSettings, oData );
5372 8a217fa2 Olga Brani
                        }
5373 8a217fa2 Olga Brani
                        
5374 8a217fa2 Olga Brani
                        /* Check for an 'overflow' they case for displaying the table */
5375 8a217fa2 Olga Brani
                        if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() )
5376 8a217fa2 Olga Brani
                        {
5377 8a217fa2 Olga Brani
                                oSettings._iDisplayStart -= oSettings._iDisplayLength;
5378 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayStart < 0 )
5379 8a217fa2 Olga Brani
                                {
5380 8a217fa2 Olga Brani
                                        oSettings._iDisplayStart = 0;
5381 8a217fa2 Olga Brani
                                }
5382 8a217fa2 Olga Brani
                        }
5383 8a217fa2 Olga Brani
                        
5384 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
5385 8a217fa2 Olga Brani
                        {
5386 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
5387 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
5388 8a217fa2 Olga Brani
                        }
5389 8a217fa2 Olga Brani
                        
5390 8a217fa2 Olga Brani
                        return oData;
5391 8a217fa2 Olga Brani
                };
5392 8a217fa2 Olga Brani
                
5393 8a217fa2 Olga Brani
                
5394 8a217fa2 Olga Brani
                /**
5395 8a217fa2 Olga Brani
                 * Restore the table to it's original state in the DOM by removing all of DataTables 
5396 8a217fa2 Olga Brani
                 * enhancements, alterations to the DOM structure of the table and event listeners.
5397 8a217fa2 Olga Brani
                 *  @param {boolean} [bRemove=false] Completely remove the table from the DOM
5398 8a217fa2 Olga Brani
                 *  @dtopt API
5399 8a217fa2 Olga Brani
                 *
5400 8a217fa2 Olga Brani
                 *  @example
5401 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5402 8a217fa2 Olga Brani
                 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
5403 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5404 8a217fa2 Olga Brani
                 *      oTable.fnDestroy();
5405 8a217fa2 Olga Brani
                 *    } );
5406 8a217fa2 Olga Brani
                 */
5407 8a217fa2 Olga Brani
                this.fnDestroy = function ( bRemove )
5408 8a217fa2 Olga Brani
                {
5409 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5410 8a217fa2 Olga Brani
                        var nOrig = oSettings.nTableWrapper.parentNode;
5411 8a217fa2 Olga Brani
                        var nBody = oSettings.nTBody;
5412 8a217fa2 Olga Brani
                        var i, iLen;
5413 8a217fa2 Olga Brani
                
5414 8a217fa2 Olga Brani
                        bRemove = (bRemove===undefined) ? false : bRemove;
5415 8a217fa2 Olga Brani
                        
5416 8a217fa2 Olga Brani
                        /* Flag to note that the table is currently being destroyed - no action should be taken */
5417 8a217fa2 Olga Brani
                        oSettings.bDestroying = true;
5418 8a217fa2 Olga Brani
                        
5419 8a217fa2 Olga Brani
                        /* Fire off the destroy callbacks for plug-ins etc */
5420 8a217fa2 Olga Brani
                        _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] );
5421 8a217fa2 Olga Brani
                
5422 8a217fa2 Olga Brani
                        /* If the table is not being removed, restore the hidden columns */
5423 8a217fa2 Olga Brani
                        if ( !bRemove )
5424 8a217fa2 Olga Brani
                        {
5425 8a217fa2 Olga Brani
                                for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
5426 8a217fa2 Olga Brani
                                {
5427 8a217fa2 Olga Brani
                                        if ( oSettings.aoColumns[i].bVisible === false )
5428 8a217fa2 Olga Brani
                                        {
5429 8a217fa2 Olga Brani
                                                this.fnSetColumnVis( i, true );
5430 8a217fa2 Olga Brani
                                        }
5431 8a217fa2 Olga Brani
                                }
5432 8a217fa2 Olga Brani
                        }
5433 8a217fa2 Olga Brani
                        
5434 8a217fa2 Olga Brani
                        /* Blitz all DT events */
5435 8a217fa2 Olga Brani
                        $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
5436 8a217fa2 Olga Brani
                        
5437 8a217fa2 Olga Brani
                        /* If there is an 'empty' indicator row, remove it */
5438 8a217fa2 Olga Brani
                        $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
5439 8a217fa2 Olga Brani
                        
5440 8a217fa2 Olga Brani
                        /* When scrolling we had to break the table up - restore it */
5441 8a217fa2 Olga Brani
                        if ( oSettings.nTable != oSettings.nTHead.parentNode )
5442 8a217fa2 Olga Brani
                        {
5443 8a217fa2 Olga Brani
                                $(oSettings.nTable).children('thead').remove();
5444 8a217fa2 Olga Brani
                                oSettings.nTable.appendChild( oSettings.nTHead );
5445 8a217fa2 Olga Brani
                        }
5446 8a217fa2 Olga Brani
                        
5447 8a217fa2 Olga Brani
                        if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
5448 8a217fa2 Olga Brani
                        {
5449 8a217fa2 Olga Brani
                                $(oSettings.nTable).children('tfoot').remove();
5450 8a217fa2 Olga Brani
                                oSettings.nTable.appendChild( oSettings.nTFoot );
5451 8a217fa2 Olga Brani
                        }
5452 8a217fa2 Olga Brani
                        
5453 8a217fa2 Olga Brani
                        /* Remove the DataTables generated nodes, events and classes */
5454 8a217fa2 Olga Brani
                        oSettings.nTable.parentNode.removeChild( oSettings.nTable );
5455 8a217fa2 Olga Brani
                        $(oSettings.nTableWrapper).remove();
5456 8a217fa2 Olga Brani
                        
5457 8a217fa2 Olga Brani
                        oSettings.aaSorting = [];
5458 8a217fa2 Olga Brani
                        oSettings.aaSortingFixed = [];
5459 8a217fa2 Olga Brani
                        _fnSortingClasses( oSettings );
5460 8a217fa2 Olga Brani
                        
5461 8a217fa2 Olga Brani
                        $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') );
5462 8a217fa2 Olga Brani
                        
5463 8a217fa2 Olga Brani
                        $('th, td', oSettings.nTHead).removeClass( [
5464 8a217fa2 Olga Brani
                                oSettings.oClasses.sSortable,
5465 8a217fa2 Olga Brani
                                oSettings.oClasses.sSortableAsc,
5466 8a217fa2 Olga Brani
                                oSettings.oClasses.sSortableDesc,
5467 8a217fa2 Olga Brani
                                oSettings.oClasses.sSortableNone ].join(' ')
5468 8a217fa2 Olga Brani
                        );
5469 8a217fa2 Olga Brani
                        if ( oSettings.bJUI )
5470 8a217fa2 Olga Brani
                        {
5471 8a217fa2 Olga Brani
                                $('th span.'+oSettings.oClasses.sSortIcon
5472 8a217fa2 Olga Brani
                                        + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove();
5473 8a217fa2 Olga Brani
                
5474 8a217fa2 Olga Brani
                                $('th, td', oSettings.nTHead).each( function () {
5475 8a217fa2 Olga Brani
                                        var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this);
5476 8a217fa2 Olga Brani
                                        var kids = jqWrapper.contents();
5477 8a217fa2 Olga Brani
                                        $(this).append( kids );
5478 8a217fa2 Olga Brani
                                        jqWrapper.remove();
5479 8a217fa2 Olga Brani
                                } );
5480 8a217fa2 Olga Brani
                        }
5481 8a217fa2 Olga Brani
                        
5482 8a217fa2 Olga Brani
                        /* Add the TR elements back into the table in their original order */
5483 8a217fa2 Olga Brani
                        if ( !bRemove && oSettings.nTableReinsertBefore )
5484 8a217fa2 Olga Brani
                        {
5485 8a217fa2 Olga Brani
                                nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore );
5486 8a217fa2 Olga Brani
                        }
5487 8a217fa2 Olga Brani
                        else if ( !bRemove )
5488 8a217fa2 Olga Brani
                        {
5489 8a217fa2 Olga Brani
                                nOrig.appendChild( oSettings.nTable );
5490 8a217fa2 Olga Brani
                        }
5491 8a217fa2 Olga Brani
                
5492 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
5493 8a217fa2 Olga Brani
                        {
5494 8a217fa2 Olga Brani
                                if ( oSettings.aoData[i].nTr !== null )
5495 8a217fa2 Olga Brani
                                {
5496 8a217fa2 Olga Brani
                                        nBody.appendChild( oSettings.aoData[i].nTr );
5497 8a217fa2 Olga Brani
                                }
5498 8a217fa2 Olga Brani
                        }
5499 8a217fa2 Olga Brani
                        
5500 8a217fa2 Olga Brani
                        /* Restore the width of the original table */
5501 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bAutoWidth === true )
5502 8a217fa2 Olga Brani
                        {
5503 8a217fa2 Olga Brani
                          oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
5504 8a217fa2 Olga Brani
                        }
5505 8a217fa2 Olga Brani
                        
5506 8a217fa2 Olga Brani
                        /* If the were originally stripe classes - then we add them back here. Note
5507 8a217fa2 Olga Brani
                         * this is not fool proof (for example if not all rows had stripe classes - but
5508 8a217fa2 Olga Brani
                         * it's a good effort without getting carried away
5509 8a217fa2 Olga Brani
                         */
5510 8a217fa2 Olga Brani
                        iLen = oSettings.asDestroyStripes.length;
5511 8a217fa2 Olga Brani
                        if (iLen)
5512 8a217fa2 Olga Brani
                        {
5513 8a217fa2 Olga Brani
                                var anRows = $(nBody).children('tr');
5514 8a217fa2 Olga Brani
                                for ( i=0 ; i<iLen ; i++ )
5515 8a217fa2 Olga Brani
                                {
5516 8a217fa2 Olga Brani
                                        anRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );
5517 8a217fa2 Olga Brani
                                }
5518 8a217fa2 Olga Brani
                        }
5519 8a217fa2 Olga Brani
                        
5520 8a217fa2 Olga Brani
                        /* Remove the settings object from the settings array */
5521 8a217fa2 Olga Brani
                        for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
5522 8a217fa2 Olga Brani
                        {
5523 8a217fa2 Olga Brani
                                if ( DataTable.settings[i] == oSettings )
5524 8a217fa2 Olga Brani
                                {
5525 8a217fa2 Olga Brani
                                        DataTable.settings.splice( i, 1 );
5526 8a217fa2 Olga Brani
                                }
5527 8a217fa2 Olga Brani
                        }
5528 8a217fa2 Olga Brani
                        
5529 8a217fa2 Olga Brani
                        /* End it all */
5530 8a217fa2 Olga Brani
                        oSettings = null;
5531 8a217fa2 Olga Brani
                        oInit = null;
5532 8a217fa2 Olga Brani
                };
5533 8a217fa2 Olga Brani
                
5534 8a217fa2 Olga Brani
                
5535 8a217fa2 Olga Brani
                /**
5536 8a217fa2 Olga Brani
                 * Redraw the table
5537 8a217fa2 Olga Brani
                 *  @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw.
5538 8a217fa2 Olga Brani
                 *  @dtopt API
5539 8a217fa2 Olga Brani
                 *
5540 8a217fa2 Olga Brani
                 *  @example
5541 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5542 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5543 8a217fa2 Olga Brani
                 *      
5544 8a217fa2 Olga Brani
                 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
5545 8a217fa2 Olga Brani
                 *      oTable.fnDraw();
5546 8a217fa2 Olga Brani
                 *    } );
5547 8a217fa2 Olga Brani
                 */
5548 8a217fa2 Olga Brani
                this.fnDraw = function( bComplete )
5549 8a217fa2 Olga Brani
                {
5550 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5551 8a217fa2 Olga Brani
                        if ( bComplete === false )
5552 8a217fa2 Olga Brani
                        {
5553 8a217fa2 Olga Brani
                                _fnCalculateEnd( oSettings );
5554 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
5555 8a217fa2 Olga Brani
                        }
5556 8a217fa2 Olga Brani
                        else
5557 8a217fa2 Olga Brani
                        {
5558 8a217fa2 Olga Brani
                                _fnReDraw( oSettings );
5559 8a217fa2 Olga Brani
                        }
5560 8a217fa2 Olga Brani
                };
5561 8a217fa2 Olga Brani
                
5562 8a217fa2 Olga Brani
                
5563 8a217fa2 Olga Brani
                /**
5564 8a217fa2 Olga Brani
                 * Filter the input based on data
5565 8a217fa2 Olga Brani
                 *  @param {string} sInput String to filter the table on
5566 8a217fa2 Olga Brani
                 *  @param {int|null} [iColumn] Column to limit filtering to
5567 8a217fa2 Olga Brani
                 *  @param {bool} [bRegex=false] Treat as regular expression or not
5568 8a217fa2 Olga Brani
                 *  @param {bool} [bSmart=true] Perform smart filtering or not
5569 8a217fa2 Olga Brani
                 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
5570 8a217fa2 Olga Brani
                 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
5571 8a217fa2 Olga Brani
                 *  @dtopt API
5572 8a217fa2 Olga Brani
                 *
5573 8a217fa2 Olga Brani
                 *  @example
5574 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5575 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5576 8a217fa2 Olga Brani
                 *      
5577 8a217fa2 Olga Brani
                 *      // Sometime later - filter...
5578 8a217fa2 Olga Brani
                 *      oTable.fnFilter( 'test string' );
5579 8a217fa2 Olga Brani
                 *    } );
5580 8a217fa2 Olga Brani
                 */
5581 8a217fa2 Olga Brani
                this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
5582 8a217fa2 Olga Brani
                {
5583 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5584 8a217fa2 Olga Brani
                        
5585 8a217fa2 Olga Brani
                        if ( !oSettings.oFeatures.bFilter )
5586 8a217fa2 Olga Brani
                        {
5587 8a217fa2 Olga Brani
                                return;
5588 8a217fa2 Olga Brani
                        }
5589 8a217fa2 Olga Brani
                        
5590 8a217fa2 Olga Brani
                        if ( bRegex === undefined || bRegex === null )
5591 8a217fa2 Olga Brani
                        {
5592 8a217fa2 Olga Brani
                                bRegex = false;
5593 8a217fa2 Olga Brani
                        }
5594 8a217fa2 Olga Brani
                        
5595 8a217fa2 Olga Brani
                        if ( bSmart === undefined || bSmart === null )
5596 8a217fa2 Olga Brani
                        {
5597 8a217fa2 Olga Brani
                                bSmart = true;
5598 8a217fa2 Olga Brani
                        }
5599 8a217fa2 Olga Brani
                        
5600 8a217fa2 Olga Brani
                        if ( bShowGlobal === undefined || bShowGlobal === null )
5601 8a217fa2 Olga Brani
                        {
5602 8a217fa2 Olga Brani
                                bShowGlobal = true;
5603 8a217fa2 Olga Brani
                        }
5604 8a217fa2 Olga Brani
                        
5605 8a217fa2 Olga Brani
                        if ( bCaseInsensitive === undefined || bCaseInsensitive === null )
5606 8a217fa2 Olga Brani
                        {
5607 8a217fa2 Olga Brani
                                bCaseInsensitive = true;
5608 8a217fa2 Olga Brani
                        }
5609 8a217fa2 Olga Brani
                        
5610 8a217fa2 Olga Brani
                        if ( iColumn === undefined || iColumn === null )
5611 8a217fa2 Olga Brani
                        {
5612 8a217fa2 Olga Brani
                                /* Global filter */
5613 8a217fa2 Olga Brani
                                _fnFilterComplete( oSettings, {
5614 8a217fa2 Olga Brani
                                        "sSearch":sInput+"",
5615 8a217fa2 Olga Brani
                                        "bRegex": bRegex,
5616 8a217fa2 Olga Brani
                                        "bSmart": bSmart,
5617 8a217fa2 Olga Brani
                                        "bCaseInsensitive": bCaseInsensitive
5618 8a217fa2 Olga Brani
                                }, 1 );
5619 8a217fa2 Olga Brani
                                
5620 8a217fa2 Olga Brani
                                if ( bShowGlobal && oSettings.aanFeatures.f )
5621 8a217fa2 Olga Brani
                                {
5622 8a217fa2 Olga Brani
                                        var n = oSettings.aanFeatures.f;
5623 8a217fa2 Olga Brani
                                        for ( var i=0, iLen=n.length ; i<iLen ; i++ )
5624 8a217fa2 Olga Brani
                                        {
5625 8a217fa2 Olga Brani
                                                // IE9 throws an 'unknown error' if document.activeElement is used
5626 8a217fa2 Olga Brani
                                                // inside an iframe or frame...
5627 8a217fa2 Olga Brani
                                                try {
5628 8a217fa2 Olga Brani
                                                        if ( n[i]._DT_Input != document.activeElement )
5629 8a217fa2 Olga Brani
                                                        {
5630 8a217fa2 Olga Brani
                                                                $(n[i]._DT_Input).val( sInput );
5631 8a217fa2 Olga Brani
                                                        }
5632 8a217fa2 Olga Brani
                                                }
5633 8a217fa2 Olga Brani
                                                catch ( e ) {
5634 8a217fa2 Olga Brani
                                                        $(n[i]._DT_Input).val( sInput );
5635 8a217fa2 Olga Brani
                                                }
5636 8a217fa2 Olga Brani
                                        }
5637 8a217fa2 Olga Brani
                                }
5638 8a217fa2 Olga Brani
                        }
5639 8a217fa2 Olga Brani
                        else
5640 8a217fa2 Olga Brani
                        {
5641 8a217fa2 Olga Brani
                                /* Single column filter */
5642 8a217fa2 Olga Brani
                                $.extend( oSettings.aoPreSearchCols[ iColumn ], {
5643 8a217fa2 Olga Brani
                                        "sSearch": sInput+"",
5644 8a217fa2 Olga Brani
                                        "bRegex": bRegex,
5645 8a217fa2 Olga Brani
                                        "bSmart": bSmart,
5646 8a217fa2 Olga Brani
                                        "bCaseInsensitive": bCaseInsensitive
5647 8a217fa2 Olga Brani
                                } );
5648 8a217fa2 Olga Brani
                                _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
5649 8a217fa2 Olga Brani
                        }
5650 8a217fa2 Olga Brani
                };
5651 8a217fa2 Olga Brani
                
5652 8a217fa2 Olga Brani
                
5653 8a217fa2 Olga Brani
                /**
5654 8a217fa2 Olga Brani
                 * Get the data for the whole table, an individual row or an individual cell based on the 
5655 8a217fa2 Olga Brani
                 * provided parameters.
5656 8a217fa2 Olga Brani
                 *  @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as
5657 8a217fa2 Olga Brani
                 *    a TR node then the data source for the whole row will be returned. If given as a
5658 8a217fa2 Olga Brani
                 *    TD/TH cell node then iCol will be automatically calculated and the data for the
5659 8a217fa2 Olga Brani
                 *    cell returned. If given as an integer, then this is treated as the aoData internal
5660 8a217fa2 Olga Brani
                 *    data index for the row (see fnGetPosition) and the data for that row used.
5661 8a217fa2 Olga Brani
                 *  @param {int} [iCol] Optional column index that you want the data of.
5662 8a217fa2 Olga Brani
                 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
5663 8a217fa2 Olga Brani
                 *    returned. If mRow is defined, just data for that row, and is iCol is
5664 8a217fa2 Olga Brani
                 *    defined, only data for the designated cell is returned.
5665 8a217fa2 Olga Brani
                 *  @dtopt API
5666 8a217fa2 Olga Brani
                 *
5667 8a217fa2 Olga Brani
                 *  @example
5668 8a217fa2 Olga Brani
                 *    // Row data
5669 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5670 8a217fa2 Olga Brani
                 *      oTable = $('#example').dataTable();
5671 8a217fa2 Olga Brani
                 *
5672 8a217fa2 Olga Brani
                 *      oTable.$('tr').click( function () {
5673 8a217fa2 Olga Brani
                 *        var data = oTable.fnGetData( this );
5674 8a217fa2 Olga Brani
                 *        // ... do something with the array / object of data for the row
5675 8a217fa2 Olga Brani
                 *      } );
5676 8a217fa2 Olga Brani
                 *    } );
5677 8a217fa2 Olga Brani
                 *
5678 8a217fa2 Olga Brani
                 *  @example
5679 8a217fa2 Olga Brani
                 *    // Individual cell data
5680 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5681 8a217fa2 Olga Brani
                 *      oTable = $('#example').dataTable();
5682 8a217fa2 Olga Brani
                 *
5683 8a217fa2 Olga Brani
                 *      oTable.$('td').click( function () {
5684 8a217fa2 Olga Brani
                 *        var sData = oTable.fnGetData( this );
5685 8a217fa2 Olga Brani
                 *        alert( 'The cell clicked on had the value of '+sData );
5686 8a217fa2 Olga Brani
                 *      } );
5687 8a217fa2 Olga Brani
                 *    } );
5688 8a217fa2 Olga Brani
                 */
5689 8a217fa2 Olga Brani
                this.fnGetData = function( mRow, iCol )
5690 8a217fa2 Olga Brani
                {
5691 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5692 8a217fa2 Olga Brani
                        
5693 8a217fa2 Olga Brani
                        if ( mRow !== undefined )
5694 8a217fa2 Olga Brani
                        {
5695 8a217fa2 Olga Brani
                                var iRow = mRow;
5696 8a217fa2 Olga Brani
                                if ( typeof mRow === 'object' )
5697 8a217fa2 Olga Brani
                                {
5698 8a217fa2 Olga Brani
                                        var sNode = mRow.nodeName.toLowerCase();
5699 8a217fa2 Olga Brani
                                        if (sNode === "tr" )
5700 8a217fa2 Olga Brani
                                        {
5701 8a217fa2 Olga Brani
                                                iRow = _fnNodeToDataIndex(oSettings, mRow);
5702 8a217fa2 Olga Brani
                                        }
5703 8a217fa2 Olga Brani
                                        else if ( sNode === "td" )
5704 8a217fa2 Olga Brani
                                        {
5705 8a217fa2 Olga Brani
                                                iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode);
5706 8a217fa2 Olga Brani
                                                iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow );
5707 8a217fa2 Olga Brani
                                        }
5708 8a217fa2 Olga Brani
                                }
5709 8a217fa2 Olga Brani
                
5710 8a217fa2 Olga Brani
                                if ( iCol !== undefined )
5711 8a217fa2 Olga Brani
                                {
5712 8a217fa2 Olga Brani
                                        return _fnGetCellData( oSettings, iRow, iCol, '' );
5713 8a217fa2 Olga Brani
                                }
5714 8a217fa2 Olga Brani
                                return (oSettings.aoData[iRow]!==undefined) ?
5715 8a217fa2 Olga Brani
                                        oSettings.aoData[iRow]._aData : null;
5716 8a217fa2 Olga Brani
                        }
5717 8a217fa2 Olga Brani
                        return _fnGetDataMaster( oSettings );
5718 8a217fa2 Olga Brani
                };
5719 8a217fa2 Olga Brani
                
5720 8a217fa2 Olga Brani
                
5721 8a217fa2 Olga Brani
                /**
5722 8a217fa2 Olga Brani
                 * Get an array of the TR nodes that are used in the table's body. Note that you will 
5723 8a217fa2 Olga Brani
                 * typically want to use the '$' API method in preference to this as it is more 
5724 8a217fa2 Olga Brani
                 * flexible.
5725 8a217fa2 Olga Brani
                 *  @param {int} [iRow] Optional row index for the TR element you want
5726 8a217fa2 Olga Brani
                 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
5727 8a217fa2 Olga Brani
                 *    in the table's body, or iRow is defined, just the TR element requested.
5728 8a217fa2 Olga Brani
                 *  @dtopt API
5729 8a217fa2 Olga Brani
                 *
5730 8a217fa2 Olga Brani
                 *  @example
5731 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5732 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5733 8a217fa2 Olga Brani
                 *      
5734 8a217fa2 Olga Brani
                 *      // Get the nodes from the table
5735 8a217fa2 Olga Brani
                 *      var nNodes = oTable.fnGetNodes( );
5736 8a217fa2 Olga Brani
                 *    } );
5737 8a217fa2 Olga Brani
                 */
5738 8a217fa2 Olga Brani
                this.fnGetNodes = function( iRow )
5739 8a217fa2 Olga Brani
                {
5740 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5741 8a217fa2 Olga Brani
                        
5742 8a217fa2 Olga Brani
                        if ( iRow !== undefined ) {
5743 8a217fa2 Olga Brani
                                return (oSettings.aoData[iRow]!==undefined) ?
5744 8a217fa2 Olga Brani
                                        oSettings.aoData[iRow].nTr : null;
5745 8a217fa2 Olga Brani
                        }
5746 8a217fa2 Olga Brani
                        return _fnGetTrNodes( oSettings );
5747 8a217fa2 Olga Brani
                };
5748 8a217fa2 Olga Brani
                
5749 8a217fa2 Olga Brani
                
5750 8a217fa2 Olga Brani
                /**
5751 8a217fa2 Olga Brani
                 * Get the array indexes of a particular cell from it's DOM element
5752 8a217fa2 Olga Brani
                 * and column index including hidden columns
5753 8a217fa2 Olga Brani
                 *  @param {node} nNode this can either be a TR, TD or TH in the table's body
5754 8a217fa2 Olga Brani
                 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
5755 8a217fa2 Olga Brani
                 *    if given as a cell, an array of [row index, column index (visible), 
5756 8a217fa2 Olga Brani
                 *    column index (all)] is given.
5757 8a217fa2 Olga Brani
                 *  @dtopt API
5758 8a217fa2 Olga Brani
                 *
5759 8a217fa2 Olga Brani
                 *  @example
5760 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5761 8a217fa2 Olga Brani
                 *      $('#example tbody td').click( function () {
5762 8a217fa2 Olga Brani
                 *        // Get the position of the current data from the node
5763 8a217fa2 Olga Brani
                 *        var aPos = oTable.fnGetPosition( this );
5764 8a217fa2 Olga Brani
                 *        
5765 8a217fa2 Olga Brani
                 *        // Get the data array for this row
5766 8a217fa2 Olga Brani
                 *        var aData = oTable.fnGetData( aPos[0] );
5767 8a217fa2 Olga Brani
                 *        
5768 8a217fa2 Olga Brani
                 *        // Update the data array and return the value
5769 8a217fa2 Olga Brani
                 *        aData[ aPos[1] ] = 'clicked';
5770 8a217fa2 Olga Brani
                 *        this.innerHTML = 'clicked';
5771 8a217fa2 Olga Brani
                 *      } );
5772 8a217fa2 Olga Brani
                 *      
5773 8a217fa2 Olga Brani
                 *      // Init DataTables
5774 8a217fa2 Olga Brani
                 *      oTable = $('#example').dataTable();
5775 8a217fa2 Olga Brani
                 *    } );
5776 8a217fa2 Olga Brani
                 */
5777 8a217fa2 Olga Brani
                this.fnGetPosition = function( nNode )
5778 8a217fa2 Olga Brani
                {
5779 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5780 8a217fa2 Olga Brani
                        var sNodeName = nNode.nodeName.toUpperCase();
5781 8a217fa2 Olga Brani
                        
5782 8a217fa2 Olga Brani
                        if ( sNodeName == "TR" )
5783 8a217fa2 Olga Brani
                        {
5784 8a217fa2 Olga Brani
                                return _fnNodeToDataIndex(oSettings, nNode);
5785 8a217fa2 Olga Brani
                        }
5786 8a217fa2 Olga Brani
                        else if ( sNodeName == "TD" || sNodeName == "TH" )
5787 8a217fa2 Olga Brani
                        {
5788 8a217fa2 Olga Brani
                                var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode );
5789 8a217fa2 Olga Brani
                                var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode );
5790 8a217fa2 Olga Brani
                                return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ];
5791 8a217fa2 Olga Brani
                        }
5792 8a217fa2 Olga Brani
                        return null;
5793 8a217fa2 Olga Brani
                };
5794 8a217fa2 Olga Brani
                
5795 8a217fa2 Olga Brani
                
5796 8a217fa2 Olga Brani
                /**
5797 8a217fa2 Olga Brani
                 * Check to see if a row is 'open' or not.
5798 8a217fa2 Olga Brani
                 *  @param {node} nTr the table row to check
5799 8a217fa2 Olga Brani
                 *  @returns {boolean} true if the row is currently open, false otherwise
5800 8a217fa2 Olga Brani
                 *  @dtopt API
5801 8a217fa2 Olga Brani
                 *
5802 8a217fa2 Olga Brani
                 *  @example
5803 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5804 8a217fa2 Olga Brani
                 *      var oTable;
5805 8a217fa2 Olga Brani
                 *      
5806 8a217fa2 Olga Brani
                 *      // 'open' an information row when a row is clicked on
5807 8a217fa2 Olga Brani
                 *      $('#example tbody tr').click( function () {
5808 8a217fa2 Olga Brani
                 *        if ( oTable.fnIsOpen(this) ) {
5809 8a217fa2 Olga Brani
                 *          oTable.fnClose( this );
5810 8a217fa2 Olga Brani
                 *        } else {
5811 8a217fa2 Olga Brani
                 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
5812 8a217fa2 Olga Brani
                 *        }
5813 8a217fa2 Olga Brani
                 *      } );
5814 8a217fa2 Olga Brani
                 *      
5815 8a217fa2 Olga Brani
                 *      oTable = $('#example').dataTable();
5816 8a217fa2 Olga Brani
                 *    } );
5817 8a217fa2 Olga Brani
                 */
5818 8a217fa2 Olga Brani
                this.fnIsOpen = function( nTr )
5819 8a217fa2 Olga Brani
                {
5820 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5821 8a217fa2 Olga Brani
                        var aoOpenRows = oSettings.aoOpenRows;
5822 8a217fa2 Olga Brani
                        
5823 8a217fa2 Olga Brani
                        for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
5824 8a217fa2 Olga Brani
                        {
5825 8a217fa2 Olga Brani
                                if ( oSettings.aoOpenRows[i].nParent == nTr )
5826 8a217fa2 Olga Brani
                                {
5827 8a217fa2 Olga Brani
                                        return true;
5828 8a217fa2 Olga Brani
                                }
5829 8a217fa2 Olga Brani
                        }
5830 8a217fa2 Olga Brani
                        return false;
5831 8a217fa2 Olga Brani
                };
5832 8a217fa2 Olga Brani
                
5833 8a217fa2 Olga Brani
                
5834 8a217fa2 Olga Brani
                /**
5835 8a217fa2 Olga Brani
                 * This function will place a new row directly after a row which is currently 
5836 8a217fa2 Olga Brani
                 * on display on the page, with the HTML contents that is passed into the 
5837 8a217fa2 Olga Brani
                 * function. This can be used, for example, to ask for confirmation that a 
5838 8a217fa2 Olga Brani
                 * particular record should be deleted.
5839 8a217fa2 Olga Brani
                 *  @param {node} nTr The table row to 'open'
5840 8a217fa2 Olga Brani
                 *  @param {string|node|jQuery} mHtml The HTML to put into the row
5841 8a217fa2 Olga Brani
                 *  @param {string} sClass Class to give the new TD cell
5842 8a217fa2 Olga Brani
                 *  @returns {node} The row opened. Note that if the table row passed in as the
5843 8a217fa2 Olga Brani
                 *    first parameter, is not found in the table, this method will silently
5844 8a217fa2 Olga Brani
                 *    return.
5845 8a217fa2 Olga Brani
                 *  @dtopt API
5846 8a217fa2 Olga Brani
                 *
5847 8a217fa2 Olga Brani
                 *  @example
5848 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5849 8a217fa2 Olga Brani
                 *      var oTable;
5850 8a217fa2 Olga Brani
                 *      
5851 8a217fa2 Olga Brani
                 *      // 'open' an information row when a row is clicked on
5852 8a217fa2 Olga Brani
                 *      $('#example tbody tr').click( function () {
5853 8a217fa2 Olga Brani
                 *        if ( oTable.fnIsOpen(this) ) {
5854 8a217fa2 Olga Brani
                 *          oTable.fnClose( this );
5855 8a217fa2 Olga Brani
                 *        } else {
5856 8a217fa2 Olga Brani
                 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
5857 8a217fa2 Olga Brani
                 *        }
5858 8a217fa2 Olga Brani
                 *      } );
5859 8a217fa2 Olga Brani
                 *      
5860 8a217fa2 Olga Brani
                 *      oTable = $('#example').dataTable();
5861 8a217fa2 Olga Brani
                 *    } );
5862 8a217fa2 Olga Brani
                 */
5863 8a217fa2 Olga Brani
                this.fnOpen = function( nTr, mHtml, sClass )
5864 8a217fa2 Olga Brani
                {
5865 8a217fa2 Olga Brani
                        /* Find settings from table node */
5866 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5867 8a217fa2 Olga Brani
                
5868 8a217fa2 Olga Brani
                        /* Check that the row given is in the table */
5869 8a217fa2 Olga Brani
                        var nTableRows = _fnGetTrNodes( oSettings );
5870 8a217fa2 Olga Brani
                        if ( $.inArray(nTr, nTableRows) === -1 )
5871 8a217fa2 Olga Brani
                        {
5872 8a217fa2 Olga Brani
                                return;
5873 8a217fa2 Olga Brani
                        }
5874 8a217fa2 Olga Brani
                        
5875 8a217fa2 Olga Brani
                        /* the old open one if there is one */
5876 8a217fa2 Olga Brani
                        this.fnClose( nTr );
5877 8a217fa2 Olga Brani
                        
5878 8a217fa2 Olga Brani
                        var nNewRow = document.createElement("tr");
5879 8a217fa2 Olga Brani
                        var nNewCell = document.createElement("td");
5880 8a217fa2 Olga Brani
                        nNewRow.appendChild( nNewCell );
5881 8a217fa2 Olga Brani
                        nNewCell.className = sClass;
5882 8a217fa2 Olga Brani
                        nNewCell.colSpan = _fnVisbleColumns( oSettings );
5883 8a217fa2 Olga Brani
                
5884 8a217fa2 Olga Brani
                        if (typeof mHtml === "string")
5885 8a217fa2 Olga Brani
                        {
5886 8a217fa2 Olga Brani
                                nNewCell.innerHTML = mHtml;
5887 8a217fa2 Olga Brani
                        }
5888 8a217fa2 Olga Brani
                        else
5889 8a217fa2 Olga Brani
                        {
5890 8a217fa2 Olga Brani
                                $(nNewCell).html( mHtml );
5891 8a217fa2 Olga Brani
                        }
5892 8a217fa2 Olga Brani
                
5893 8a217fa2 Olga Brani
                        /* If the nTr isn't on the page at the moment - then we don't insert at the moment */
5894 8a217fa2 Olga Brani
                        var nTrs = $('tr', oSettings.nTBody);
5895 8a217fa2 Olga Brani
                        if ( $.inArray(nTr, nTrs) != -1  )
5896 8a217fa2 Olga Brani
                        {
5897 8a217fa2 Olga Brani
                                $(nNewRow).insertAfter(nTr);
5898 8a217fa2 Olga Brani
                        }
5899 8a217fa2 Olga Brani
                        
5900 8a217fa2 Olga Brani
                        oSettings.aoOpenRows.push( {
5901 8a217fa2 Olga Brani
                                "nTr": nNewRow,
5902 8a217fa2 Olga Brani
                                "nParent": nTr
5903 8a217fa2 Olga Brani
                        } );
5904 8a217fa2 Olga Brani
                        
5905 8a217fa2 Olga Brani
                        return nNewRow;
5906 8a217fa2 Olga Brani
                };
5907 8a217fa2 Olga Brani
                
5908 8a217fa2 Olga Brani
                
5909 8a217fa2 Olga Brani
                /**
5910 8a217fa2 Olga Brani
                 * Change the pagination - provides the internal logic for pagination in a simple API 
5911 8a217fa2 Olga Brani
                 * function. With this function you can have a DataTables table go to the next, 
5912 8a217fa2 Olga Brani
                 * previous, first or last pages.
5913 8a217fa2 Olga Brani
                 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
5914 8a217fa2 Olga Brani
                 *    or page number to jump to (integer), note that page 0 is the first page.
5915 8a217fa2 Olga Brani
                 *  @param {bool} [bRedraw=true] Redraw the table or not
5916 8a217fa2 Olga Brani
                 *  @dtopt API
5917 8a217fa2 Olga Brani
                 *
5918 8a217fa2 Olga Brani
                 *  @example
5919 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5920 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5921 8a217fa2 Olga Brani
                 *      oTable.fnPageChange( 'next' );
5922 8a217fa2 Olga Brani
                 *    } );
5923 8a217fa2 Olga Brani
                 */
5924 8a217fa2 Olga Brani
                this.fnPageChange = function ( mAction, bRedraw )
5925 8a217fa2 Olga Brani
                {
5926 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5927 8a217fa2 Olga Brani
                        _fnPageChange( oSettings, mAction );
5928 8a217fa2 Olga Brani
                        _fnCalculateEnd( oSettings );
5929 8a217fa2 Olga Brani
                        
5930 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
5931 8a217fa2 Olga Brani
                        {
5932 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
5933 8a217fa2 Olga Brani
                        }
5934 8a217fa2 Olga Brani
                };
5935 8a217fa2 Olga Brani
                
5936 8a217fa2 Olga Brani
                
5937 8a217fa2 Olga Brani
                /**
5938 8a217fa2 Olga Brani
                 * Show a particular column
5939 8a217fa2 Olga Brani
                 *  @param {int} iCol The column whose display should be changed
5940 8a217fa2 Olga Brani
                 *  @param {bool} bShow Show (true) or hide (false) the column
5941 8a217fa2 Olga Brani
                 *  @param {bool} [bRedraw=true] Redraw the table or not
5942 8a217fa2 Olga Brani
                 *  @dtopt API
5943 8a217fa2 Olga Brani
                 *
5944 8a217fa2 Olga Brani
                 *  @example
5945 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
5946 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
5947 8a217fa2 Olga Brani
                 *      
5948 8a217fa2 Olga Brani
                 *      // Hide the second column after initialisation
5949 8a217fa2 Olga Brani
                 *      oTable.fnSetColumnVis( 1, false );
5950 8a217fa2 Olga Brani
                 *    } );
5951 8a217fa2 Olga Brani
                 */
5952 8a217fa2 Olga Brani
                this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
5953 8a217fa2 Olga Brani
                {
5954 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5955 8a217fa2 Olga Brani
                        var i, iLen;
5956 8a217fa2 Olga Brani
                        var aoColumns = oSettings.aoColumns;
5957 8a217fa2 Olga Brani
                        var aoData = oSettings.aoData;
5958 8a217fa2 Olga Brani
                        var nTd, bAppend, iBefore;
5959 8a217fa2 Olga Brani
                        
5960 8a217fa2 Olga Brani
                        /* No point in doing anything if we are requesting what is already true */
5961 8a217fa2 Olga Brani
                        if ( aoColumns[iCol].bVisible == bShow )
5962 8a217fa2 Olga Brani
                        {
5963 8a217fa2 Olga Brani
                                return;
5964 8a217fa2 Olga Brani
                        }
5965 8a217fa2 Olga Brani
                        
5966 8a217fa2 Olga Brani
                        /* Show the column */
5967 8a217fa2 Olga Brani
                        if ( bShow )
5968 8a217fa2 Olga Brani
                        {
5969 8a217fa2 Olga Brani
                                var iInsert = 0;
5970 8a217fa2 Olga Brani
                                for ( i=0 ; i<iCol ; i++ )
5971 8a217fa2 Olga Brani
                                {
5972 8a217fa2 Olga Brani
                                        if ( aoColumns[i].bVisible )
5973 8a217fa2 Olga Brani
                                        {
5974 8a217fa2 Olga Brani
                                                iInsert++;
5975 8a217fa2 Olga Brani
                                        }
5976 8a217fa2 Olga Brani
                                }
5977 8a217fa2 Olga Brani
                                
5978 8a217fa2 Olga Brani
                                /* Need to decide if we should use appendChild or insertBefore */
5979 8a217fa2 Olga Brani
                                bAppend = (iInsert >= _fnVisbleColumns( oSettings ));
5980 8a217fa2 Olga Brani
                
5981 8a217fa2 Olga Brani
                                /* Which coloumn should we be inserting before? */
5982 8a217fa2 Olga Brani
                                if ( !bAppend )
5983 8a217fa2 Olga Brani
                                {
5984 8a217fa2 Olga Brani
                                        for ( i=iCol ; i<aoColumns.length ; i++ )
5985 8a217fa2 Olga Brani
                                        {
5986 8a217fa2 Olga Brani
                                                if ( aoColumns[i].bVisible )
5987 8a217fa2 Olga Brani
                                                {
5988 8a217fa2 Olga Brani
                                                        iBefore = i;
5989 8a217fa2 Olga Brani
                                                        break;
5990 8a217fa2 Olga Brani
                                                }
5991 8a217fa2 Olga Brani
                                        }
5992 8a217fa2 Olga Brani
                                }
5993 8a217fa2 Olga Brani
                
5994 8a217fa2 Olga Brani
                                for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5995 8a217fa2 Olga Brani
                                {
5996 8a217fa2 Olga Brani
                                        if ( aoData[i].nTr !== null )
5997 8a217fa2 Olga Brani
                                        {
5998 8a217fa2 Olga Brani
                                                if ( bAppend )
5999 8a217fa2 Olga Brani
                                                {
6000 8a217fa2 Olga Brani
                                                        aoData[i].nTr.appendChild( 
6001 8a217fa2 Olga Brani
                                                                aoData[i]._anHidden[iCol]
6002 8a217fa2 Olga Brani
                                                        );
6003 8a217fa2 Olga Brani
                                                }
6004 8a217fa2 Olga Brani
                                                else
6005 8a217fa2 Olga Brani
                                                {
6006 8a217fa2 Olga Brani
                                                        aoData[i].nTr.insertBefore(
6007 8a217fa2 Olga Brani
                                                                aoData[i]._anHidden[iCol], 
6008 8a217fa2 Olga Brani
                                                                _fnGetTdNodes( oSettings, i )[iBefore] );
6009 8a217fa2 Olga Brani
                                                }
6010 8a217fa2 Olga Brani
                                        }
6011 8a217fa2 Olga Brani
                                }
6012 8a217fa2 Olga Brani
                        }
6013 8a217fa2 Olga Brani
                        else
6014 8a217fa2 Olga Brani
                        {
6015 8a217fa2 Olga Brani
                                /* Remove a column from display */
6016 8a217fa2 Olga Brani
                                for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
6017 8a217fa2 Olga Brani
                                {
6018 8a217fa2 Olga Brani
                                        if ( aoData[i].nTr !== null )
6019 8a217fa2 Olga Brani
                                        {
6020 8a217fa2 Olga Brani
                                                nTd = _fnGetTdNodes( oSettings, i )[iCol];
6021 8a217fa2 Olga Brani
                                                aoData[i]._anHidden[iCol] = nTd;
6022 8a217fa2 Olga Brani
                                                nTd.parentNode.removeChild( nTd );
6023 8a217fa2 Olga Brani
                                        }
6024 8a217fa2 Olga Brani
                                }
6025 8a217fa2 Olga Brani
                        }
6026 8a217fa2 Olga Brani
                
6027 8a217fa2 Olga Brani
                        /* Clear to set the visible flag */
6028 8a217fa2 Olga Brani
                        aoColumns[iCol].bVisible = bShow;
6029 8a217fa2 Olga Brani
                
6030 8a217fa2 Olga Brani
                        /* Redraw the header and footer based on the new column visibility */
6031 8a217fa2 Olga Brani
                        _fnDrawHead( oSettings, oSettings.aoHeader );
6032 8a217fa2 Olga Brani
                        if ( oSettings.nTFoot )
6033 8a217fa2 Olga Brani
                        {
6034 8a217fa2 Olga Brani
                                _fnDrawHead( oSettings, oSettings.aoFooter );
6035 8a217fa2 Olga Brani
                        }
6036 8a217fa2 Olga Brani
                        
6037 8a217fa2 Olga Brani
                        /* If there are any 'open' rows, then we need to alter the colspan for this col change */
6038 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
6039 8a217fa2 Olga Brani
                        {
6040 8a217fa2 Olga Brani
                                oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
6041 8a217fa2 Olga Brani
                        }
6042 8a217fa2 Olga Brani
                        
6043 8a217fa2 Olga Brani
                        /* Do a redraw incase anything depending on the table columns needs it 
6044 8a217fa2 Olga Brani
                         * (built-in: scrolling) 
6045 8a217fa2 Olga Brani
                         */
6046 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
6047 8a217fa2 Olga Brani
                        {
6048 8a217fa2 Olga Brani
                                _fnAdjustColumnSizing( oSettings );
6049 8a217fa2 Olga Brani
                                _fnDraw( oSettings );
6050 8a217fa2 Olga Brani
                        }
6051 8a217fa2 Olga Brani
                        
6052 8a217fa2 Olga Brani
                        _fnSaveState( oSettings );
6053 8a217fa2 Olga Brani
                };
6054 8a217fa2 Olga Brani
                
6055 8a217fa2 Olga Brani
                
6056 8a217fa2 Olga Brani
                /**
6057 8a217fa2 Olga Brani
                 * Get the settings for a particular table for external manipulation
6058 8a217fa2 Olga Brani
                 *  @returns {object} DataTables settings object. See 
6059 8a217fa2 Olga Brani
                 *    {@link DataTable.models.oSettings}
6060 8a217fa2 Olga Brani
                 *  @dtopt API
6061 8a217fa2 Olga Brani
                 *
6062 8a217fa2 Olga Brani
                 *  @example
6063 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
6064 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
6065 8a217fa2 Olga Brani
                 *      var oSettings = oTable.fnSettings();
6066 8a217fa2 Olga Brani
                 *      
6067 8a217fa2 Olga Brani
                 *      // Show an example parameter from the settings
6068 8a217fa2 Olga Brani
                 *      alert( oSettings._iDisplayStart );
6069 8a217fa2 Olga Brani
                 *    } );
6070 8a217fa2 Olga Brani
                 */
6071 8a217fa2 Olga Brani
                this.fnSettings = function()
6072 8a217fa2 Olga Brani
                {
6073 8a217fa2 Olga Brani
                        return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6074 8a217fa2 Olga Brani
                };
6075 8a217fa2 Olga Brani
                
6076 8a217fa2 Olga Brani
                
6077 8a217fa2 Olga Brani
                /**
6078 8a217fa2 Olga Brani
                 * Sort the table by a particular column
6079 8a217fa2 Olga Brani
                 *  @param {int} iCol the data index to sort on. Note that this will not match the 
6080 8a217fa2 Olga Brani
                 *    'display index' if you have hidden data entries
6081 8a217fa2 Olga Brani
                 *  @dtopt API
6082 8a217fa2 Olga Brani
                 *
6083 8a217fa2 Olga Brani
                 *  @example
6084 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
6085 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
6086 8a217fa2 Olga Brani
                 *      
6087 8a217fa2 Olga Brani
                 *      // Sort immediately with columns 0 and 1
6088 8a217fa2 Olga Brani
                 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
6089 8a217fa2 Olga Brani
                 *    } );
6090 8a217fa2 Olga Brani
                 */
6091 8a217fa2 Olga Brani
                this.fnSort = function( aaSort )
6092 8a217fa2 Olga Brani
                {
6093 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6094 8a217fa2 Olga Brani
                        oSettings.aaSorting = aaSort;
6095 8a217fa2 Olga Brani
                        _fnSort( oSettings );
6096 8a217fa2 Olga Brani
                };
6097 8a217fa2 Olga Brani
                
6098 8a217fa2 Olga Brani
                
6099 8a217fa2 Olga Brani
                /**
6100 8a217fa2 Olga Brani
                 * Attach a sort listener to an element for a given column
6101 8a217fa2 Olga Brani
                 *  @param {node} nNode the element to attach the sort listener to
6102 8a217fa2 Olga Brani
                 *  @param {int} iColumn the column that a click on this node will sort on
6103 8a217fa2 Olga Brani
                 *  @param {function} [fnCallback] callback function when sort is run
6104 8a217fa2 Olga Brani
                 *  @dtopt API
6105 8a217fa2 Olga Brani
                 *
6106 8a217fa2 Olga Brani
                 *  @example
6107 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
6108 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
6109 8a217fa2 Olga Brani
                 *      
6110 8a217fa2 Olga Brani
                 *      // Sort on column 1, when 'sorter' is clicked on
6111 8a217fa2 Olga Brani
                 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
6112 8a217fa2 Olga Brani
                 *    } );
6113 8a217fa2 Olga Brani
                 */
6114 8a217fa2 Olga Brani
                this.fnSortListener = function( nNode, iColumn, fnCallback )
6115 8a217fa2 Olga Brani
                {
6116 8a217fa2 Olga Brani
                        _fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn,
6117 8a217fa2 Olga Brani
                                 fnCallback );
6118 8a217fa2 Olga Brani
                };
6119 8a217fa2 Olga Brani
                
6120 8a217fa2 Olga Brani
                
6121 8a217fa2 Olga Brani
                /**
6122 8a217fa2 Olga Brani
                 * Update a table cell or row - this method will accept either a single value to
6123 8a217fa2 Olga Brani
                 * update the cell with, an array of values with one element for each column or
6124 8a217fa2 Olga Brani
                 * an object in the same format as the original data source. The function is
6125 8a217fa2 Olga Brani
                 * self-referencing in order to make the multi column updates easier.
6126 8a217fa2 Olga Brani
                 *  @param {object|array|string} mData Data to update the cell/row with
6127 8a217fa2 Olga Brani
                 *  @param {node|int} mRow TR element you want to update or the aoData index
6128 8a217fa2 Olga Brani
                 *  @param {int} [iColumn] The column to update (not used of mData is an array or object)
6129 8a217fa2 Olga Brani
                 *  @param {bool} [bRedraw=true] Redraw the table or not
6130 8a217fa2 Olga Brani
                 *  @param {bool} [bAction=true] Perform pre-draw actions or not
6131 8a217fa2 Olga Brani
                 *  @returns {int} 0 on success, 1 on error
6132 8a217fa2 Olga Brani
                 *  @dtopt API
6133 8a217fa2 Olga Brani
                 *
6134 8a217fa2 Olga Brani
                 *  @example
6135 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
6136 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
6137 8a217fa2 Olga Brani
                 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
6138 8a217fa2 Olga Brani
                 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
6139 8a217fa2 Olga Brani
                 *    } );
6140 8a217fa2 Olga Brani
                 */
6141 8a217fa2 Olga Brani
                this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
6142 8a217fa2 Olga Brani
                {
6143 8a217fa2 Olga Brani
                        var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6144 8a217fa2 Olga Brani
                        var i, iLen, sDisplay;
6145 8a217fa2 Olga Brani
                        var iRow = (typeof mRow === 'object') ? 
6146 8a217fa2 Olga Brani
                                _fnNodeToDataIndex(oSettings, mRow) : mRow;
6147 8a217fa2 Olga Brani
                        
6148 8a217fa2 Olga Brani
                        if ( $.isArray(mData) && iColumn === undefined )
6149 8a217fa2 Olga Brani
                        {
6150 8a217fa2 Olga Brani
                                /* Array update - update the whole row */
6151 8a217fa2 Olga Brani
                                oSettings.aoData[iRow]._aData = mData.slice();
6152 8a217fa2 Olga Brani
                                
6153 8a217fa2 Olga Brani
                                /* Flag to the function that we are recursing */
6154 8a217fa2 Olga Brani
                                for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
6155 8a217fa2 Olga Brani
                                {
6156 8a217fa2 Olga Brani
                                        this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
6157 8a217fa2 Olga Brani
                                }
6158 8a217fa2 Olga Brani
                        }
6159 8a217fa2 Olga Brani
                        else if ( $.isPlainObject(mData) && iColumn === undefined )
6160 8a217fa2 Olga Brani
                        {
6161 8a217fa2 Olga Brani
                                /* Object update - update the whole row - assume the developer gets the object right */
6162 8a217fa2 Olga Brani
                                oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
6163 8a217fa2 Olga Brani
                
6164 8a217fa2 Olga Brani
                                for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
6165 8a217fa2 Olga Brani
                                {
6166 8a217fa2 Olga Brani
                                        this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
6167 8a217fa2 Olga Brani
                                }
6168 8a217fa2 Olga Brani
                        }
6169 8a217fa2 Olga Brani
                        else
6170 8a217fa2 Olga Brani
                        {
6171 8a217fa2 Olga Brani
                                /* Individual cell update */
6172 8a217fa2 Olga Brani
                                _fnSetCellData( oSettings, iRow, iColumn, mData );
6173 8a217fa2 Olga Brani
                                sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
6174 8a217fa2 Olga Brani
                                
6175 8a217fa2 Olga Brani
                                var oCol = oSettings.aoColumns[iColumn];
6176 8a217fa2 Olga Brani
                                if ( oCol.fnRender !== null )
6177 8a217fa2 Olga Brani
                                {
6178 8a217fa2 Olga Brani
                                        sDisplay = _fnRender( oSettings, iRow, iColumn );
6179 8a217fa2 Olga Brani
                                        if ( oCol.bUseRendered )
6180 8a217fa2 Olga Brani
                                        {
6181 8a217fa2 Olga Brani
                                                _fnSetCellData( oSettings, iRow, iColumn, sDisplay );
6182 8a217fa2 Olga Brani
                                        }
6183 8a217fa2 Olga Brani
                                }
6184 8a217fa2 Olga Brani
                                
6185 8a217fa2 Olga Brani
                                if ( oSettings.aoData[iRow].nTr !== null )
6186 8a217fa2 Olga Brani
                                {
6187 8a217fa2 Olga Brani
                                        /* Do the actual HTML update */
6188 8a217fa2 Olga Brani
                                        _fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;
6189 8a217fa2 Olga Brani
                                }
6190 8a217fa2 Olga Brani
                        }
6191 8a217fa2 Olga Brani
                        
6192 8a217fa2 Olga Brani
                        /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
6193 8a217fa2 Olga Brani
                         * will rebuild the search array - however, the redraw might be disabled by the user)
6194 8a217fa2 Olga Brani
                         */
6195 8a217fa2 Olga Brani
                        var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
6196 8a217fa2 Olga Brani
                        oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(
6197 8a217fa2 Olga Brani
                                oSettings, 
6198 8a217fa2 Olga Brani
                                _fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )
6199 8a217fa2 Olga Brani
                        );
6200 8a217fa2 Olga Brani
                        
6201 8a217fa2 Olga Brani
                        /* Perform pre-draw actions */
6202 8a217fa2 Olga Brani
                        if ( bAction === undefined || bAction )
6203 8a217fa2 Olga Brani
                        {
6204 8a217fa2 Olga Brani
                                _fnAdjustColumnSizing( oSettings );
6205 8a217fa2 Olga Brani
                        }
6206 8a217fa2 Olga Brani
                        
6207 8a217fa2 Olga Brani
                        /* Redraw the table */
6208 8a217fa2 Olga Brani
                        if ( bRedraw === undefined || bRedraw )
6209 8a217fa2 Olga Brani
                        {
6210 8a217fa2 Olga Brani
                                _fnReDraw( oSettings );
6211 8a217fa2 Olga Brani
                        }
6212 8a217fa2 Olga Brani
                        return 0;
6213 8a217fa2 Olga Brani
                };
6214 8a217fa2 Olga Brani
                
6215 8a217fa2 Olga Brani
                
6216 8a217fa2 Olga Brani
                /**
6217 8a217fa2 Olga Brani
                 * Provide a common method for plug-ins to check the version of DataTables being used, in order
6218 8a217fa2 Olga Brani
                 * to ensure compatibility.
6219 8a217fa2 Olga Brani
                 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
6220 8a217fa2 Olga Brani
                 *    formats "X" and "X.Y" are also acceptable.
6221 8a217fa2 Olga Brani
                 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
6222 8a217fa2 Olga Brani
                 *    version, or false if this version of DataTales is not suitable
6223 8a217fa2 Olga Brani
                 *  @method
6224 8a217fa2 Olga Brani
                 *  @dtopt API
6225 8a217fa2 Olga Brani
                 *
6226 8a217fa2 Olga Brani
                 *  @example
6227 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
6228 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
6229 8a217fa2 Olga Brani
                 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
6230 8a217fa2 Olga Brani
                 *    } );
6231 8a217fa2 Olga Brani
                 */
6232 8a217fa2 Olga Brani
                this.fnVersionCheck = DataTable.ext.fnVersionCheck;
6233 8a217fa2 Olga Brani
                
6234 8a217fa2 Olga Brani
                
6235 8a217fa2 Olga Brani
                /*
6236 8a217fa2 Olga Brani
                 * This is really a good bit rubbish this method of exposing the internal methods
6237 8a217fa2 Olga Brani
                 * publicly... - To be fixed in 2.0 using methods on the prototype
6238 8a217fa2 Olga Brani
                 */
6239 8a217fa2 Olga Brani
                
6240 8a217fa2 Olga Brani
                
6241 8a217fa2 Olga Brani
                /**
6242 8a217fa2 Olga Brani
                 * Create a wrapper function for exporting an internal functions to an external API.
6243 8a217fa2 Olga Brani
                 *  @param {string} sFunc API function name
6244 8a217fa2 Olga Brani
                 *  @returns {function} wrapped function
6245 8a217fa2 Olga Brani
                 *  @memberof DataTable#oApi
6246 8a217fa2 Olga Brani
                 */
6247 8a217fa2 Olga Brani
                function _fnExternApiFunc (sFunc)
6248 8a217fa2 Olga Brani
                {
6249 8a217fa2 Olga Brani
                        return function() {
6250 8a217fa2 Olga Brani
                                var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( 
6251 8a217fa2 Olga Brani
                                        Array.prototype.slice.call(arguments) );
6252 8a217fa2 Olga Brani
                                return DataTable.ext.oApi[sFunc].apply( this, aArgs );
6253 8a217fa2 Olga Brani
                        };
6254 8a217fa2 Olga Brani
                }
6255 8a217fa2 Olga Brani
                
6256 8a217fa2 Olga Brani
                
6257 8a217fa2 Olga Brani
                /**
6258 8a217fa2 Olga Brani
                 * Reference to internal functions for use by plug-in developers. Note that these
6259 8a217fa2 Olga Brani
                 * methods are references to internal functions and are considered to be private.
6260 8a217fa2 Olga Brani
                 * If you use these methods, be aware that they are liable to change between versions
6261 8a217fa2 Olga Brani
                 * (check the upgrade notes).
6262 8a217fa2 Olga Brani
                 *  @namespace
6263 8a217fa2 Olga Brani
                 */
6264 8a217fa2 Olga Brani
                this.oApi = {
6265 8a217fa2 Olga Brani
                        "_fnExternApiFunc": _fnExternApiFunc,
6266 8a217fa2 Olga Brani
                        "_fnInitialise": _fnInitialise,
6267 8a217fa2 Olga Brani
                        "_fnInitComplete": _fnInitComplete,
6268 8a217fa2 Olga Brani
                        "_fnLanguageCompat": _fnLanguageCompat,
6269 8a217fa2 Olga Brani
                        "_fnAddColumn": _fnAddColumn,
6270 8a217fa2 Olga Brani
                        "_fnColumnOptions": _fnColumnOptions,
6271 8a217fa2 Olga Brani
                        "_fnAddData": _fnAddData,
6272 8a217fa2 Olga Brani
                        "_fnCreateTr": _fnCreateTr,
6273 8a217fa2 Olga Brani
                        "_fnGatherData": _fnGatherData,
6274 8a217fa2 Olga Brani
                        "_fnBuildHead": _fnBuildHead,
6275 8a217fa2 Olga Brani
                        "_fnDrawHead": _fnDrawHead,
6276 8a217fa2 Olga Brani
                        "_fnDraw": _fnDraw,
6277 8a217fa2 Olga Brani
                        "_fnReDraw": _fnReDraw,
6278 8a217fa2 Olga Brani
                        "_fnAjaxUpdate": _fnAjaxUpdate,
6279 8a217fa2 Olga Brani
                        "_fnAjaxParameters": _fnAjaxParameters,
6280 8a217fa2 Olga Brani
                        "_fnAjaxUpdateDraw": _fnAjaxUpdateDraw,
6281 8a217fa2 Olga Brani
                        "_fnServerParams": _fnServerParams,
6282 8a217fa2 Olga Brani
                        "_fnAddOptionsHtml": _fnAddOptionsHtml,
6283 8a217fa2 Olga Brani
                        "_fnFeatureHtmlTable": _fnFeatureHtmlTable,
6284 8a217fa2 Olga Brani
                        "_fnScrollDraw": _fnScrollDraw,
6285 8a217fa2 Olga Brani
                        "_fnAdjustColumnSizing": _fnAdjustColumnSizing,
6286 8a217fa2 Olga Brani
                        "_fnFeatureHtmlFilter": _fnFeatureHtmlFilter,
6287 8a217fa2 Olga Brani
                        "_fnFilterComplete": _fnFilterComplete,
6288 8a217fa2 Olga Brani
                        "_fnFilterCustom": _fnFilterCustom,
6289 8a217fa2 Olga Brani
                        "_fnFilterColumn": _fnFilterColumn,
6290 8a217fa2 Olga Brani
                        "_fnFilter": _fnFilter,
6291 8a217fa2 Olga Brani
                        "_fnBuildSearchArray": _fnBuildSearchArray,
6292 8a217fa2 Olga Brani
                        "_fnBuildSearchRow": _fnBuildSearchRow,
6293 8a217fa2 Olga Brani
                        "_fnFilterCreateSearch": _fnFilterCreateSearch,
6294 8a217fa2 Olga Brani
                        "_fnDataToSearch": _fnDataToSearch,
6295 8a217fa2 Olga Brani
                        "_fnSort": _fnSort,
6296 8a217fa2 Olga Brani
                        "_fnSortAttachListener": _fnSortAttachListener,
6297 8a217fa2 Olga Brani
                        "_fnSortingClasses": _fnSortingClasses,
6298 8a217fa2 Olga Brani
                        "_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate,
6299 8a217fa2 Olga Brani
                        "_fnPageChange": _fnPageChange,
6300 8a217fa2 Olga Brani
                        "_fnFeatureHtmlInfo": _fnFeatureHtmlInfo,
6301 8a217fa2 Olga Brani
                        "_fnUpdateInfo": _fnUpdateInfo,
6302 8a217fa2 Olga Brani
                        "_fnFeatureHtmlLength": _fnFeatureHtmlLength,
6303 8a217fa2 Olga Brani
                        "_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing,
6304 8a217fa2 Olga Brani
                        "_fnProcessingDisplay": _fnProcessingDisplay,
6305 8a217fa2 Olga Brani
                        "_fnVisibleToColumnIndex": _fnVisibleToColumnIndex,
6306 8a217fa2 Olga Brani
                        "_fnColumnIndexToVisible": _fnColumnIndexToVisible,
6307 8a217fa2 Olga Brani
                        "_fnNodeToDataIndex": _fnNodeToDataIndex,
6308 8a217fa2 Olga Brani
                        "_fnVisbleColumns": _fnVisbleColumns,
6309 8a217fa2 Olga Brani
                        "_fnCalculateEnd": _fnCalculateEnd,
6310 8a217fa2 Olga Brani
                        "_fnConvertToWidth": _fnConvertToWidth,
6311 8a217fa2 Olga Brani
                        "_fnCalculateColumnWidths": _fnCalculateColumnWidths,
6312 8a217fa2 Olga Brani
                        "_fnScrollingWidthAdjust": _fnScrollingWidthAdjust,
6313 8a217fa2 Olga Brani
                        "_fnGetWidestNode": _fnGetWidestNode,
6314 8a217fa2 Olga Brani
                        "_fnGetMaxLenString": _fnGetMaxLenString,
6315 8a217fa2 Olga Brani
                        "_fnStringToCss": _fnStringToCss,
6316 8a217fa2 Olga Brani
                        "_fnDetectType": _fnDetectType,
6317 8a217fa2 Olga Brani
                        "_fnSettingsFromNode": _fnSettingsFromNode,
6318 8a217fa2 Olga Brani
                        "_fnGetDataMaster": _fnGetDataMaster,
6319 8a217fa2 Olga Brani
                        "_fnGetTrNodes": _fnGetTrNodes,
6320 8a217fa2 Olga Brani
                        "_fnGetTdNodes": _fnGetTdNodes,
6321 8a217fa2 Olga Brani
                        "_fnEscapeRegex": _fnEscapeRegex,
6322 8a217fa2 Olga Brani
                        "_fnDeleteIndex": _fnDeleteIndex,
6323 8a217fa2 Olga Brani
                        "_fnReOrderIndex": _fnReOrderIndex,
6324 8a217fa2 Olga Brani
                        "_fnColumnOrdering": _fnColumnOrdering,
6325 8a217fa2 Olga Brani
                        "_fnLog": _fnLog,
6326 8a217fa2 Olga Brani
                        "_fnClearTable": _fnClearTable,
6327 8a217fa2 Olga Brani
                        "_fnSaveState": _fnSaveState,
6328 8a217fa2 Olga Brani
                        "_fnLoadState": _fnLoadState,
6329 8a217fa2 Olga Brani
                        "_fnCreateCookie": _fnCreateCookie,
6330 8a217fa2 Olga Brani
                        "_fnReadCookie": _fnReadCookie,
6331 8a217fa2 Olga Brani
                        "_fnDetectHeader": _fnDetectHeader,
6332 8a217fa2 Olga Brani
                        "_fnGetUniqueThs": _fnGetUniqueThs,
6333 8a217fa2 Olga Brani
                        "_fnScrollBarWidth": _fnScrollBarWidth,
6334 8a217fa2 Olga Brani
                        "_fnApplyToChildren": _fnApplyToChildren,
6335 8a217fa2 Olga Brani
                        "_fnMap": _fnMap,
6336 8a217fa2 Olga Brani
                        "_fnGetRowData": _fnGetRowData,
6337 8a217fa2 Olga Brani
                        "_fnGetCellData": _fnGetCellData,
6338 8a217fa2 Olga Brani
                        "_fnSetCellData": _fnSetCellData,
6339 8a217fa2 Olga Brani
                        "_fnGetObjectDataFn": _fnGetObjectDataFn,
6340 8a217fa2 Olga Brani
                        "_fnSetObjectDataFn": _fnSetObjectDataFn,
6341 8a217fa2 Olga Brani
                        "_fnApplyColumnDefs": _fnApplyColumnDefs,
6342 8a217fa2 Olga Brani
                        "_fnBindAction": _fnBindAction,
6343 8a217fa2 Olga Brani
                        "_fnExtend": _fnExtend,
6344 8a217fa2 Olga Brani
                        "_fnCallbackReg": _fnCallbackReg,
6345 8a217fa2 Olga Brani
                        "_fnCallbackFire": _fnCallbackFire,
6346 8a217fa2 Olga Brani
                        "_fnJsonString": _fnJsonString,
6347 8a217fa2 Olga Brani
                        "_fnRender": _fnRender,
6348 8a217fa2 Olga Brani
                        "_fnNodeToColumnIndex": _fnNodeToColumnIndex,
6349 8a217fa2 Olga Brani
                        "_fnInfoMacros": _fnInfoMacros,
6350 8a217fa2 Olga Brani
                        "_fnBrowserDetect": _fnBrowserDetect,
6351 8a217fa2 Olga Brani
                        "_fnGetColumns": _fnGetColumns
6352 8a217fa2 Olga Brani
                };
6353 8a217fa2 Olga Brani
                
6354 8a217fa2 Olga Brani
                $.extend( DataTable.ext.oApi, this.oApi );
6355 8a217fa2 Olga Brani
                
6356 8a217fa2 Olga Brani
                for ( var sFunc in DataTable.ext.oApi )
6357 8a217fa2 Olga Brani
                {
6358 8a217fa2 Olga Brani
                        if ( sFunc )
6359 8a217fa2 Olga Brani
                        {
6360 8a217fa2 Olga Brani
                                this[sFunc] = _fnExternApiFunc(sFunc);
6361 8a217fa2 Olga Brani
                        }
6362 8a217fa2 Olga Brani
                }
6363 8a217fa2 Olga Brani
                
6364 8a217fa2 Olga Brani
                
6365 8a217fa2 Olga Brani
                var _that = this;
6366 8a217fa2 Olga Brani
                this.each(function() {
6367 8a217fa2 Olga Brani
                        var i=0, iLen, j, jLen, k, kLen;
6368 8a217fa2 Olga Brani
                        var sId = this.getAttribute( 'id' );
6369 8a217fa2 Olga Brani
                        var bInitHandedOff = false;
6370 8a217fa2 Olga Brani
                        var bUsePassedData = false;
6371 8a217fa2 Olga Brani
                        
6372 8a217fa2 Olga Brani
                        
6373 8a217fa2 Olga Brani
                        /* Sanity check */
6374 8a217fa2 Olga Brani
                        if ( this.nodeName.toLowerCase() != 'table' )
6375 8a217fa2 Olga Brani
                        {
6376 8a217fa2 Olga Brani
                                _fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+
6377 8a217fa2 Olga Brani
                                        "table: "+this.nodeName );
6378 8a217fa2 Olga Brani
                                return;
6379 8a217fa2 Olga Brani
                        }
6380 8a217fa2 Olga Brani
                        
6381 8a217fa2 Olga Brani
                        /* Check to see if we are re-initialising a table */
6382 8a217fa2 Olga Brani
                        for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
6383 8a217fa2 Olga Brani
                        {
6384 8a217fa2 Olga Brani
                                /* Base check on table node */
6385 8a217fa2 Olga Brani
                                if ( DataTable.settings[i].nTable == this )
6386 8a217fa2 Olga Brani
                                {
6387 8a217fa2 Olga Brani
                                        if ( oInit === undefined || oInit.bRetrieve )
6388 8a217fa2 Olga Brani
                                        {
6389 8a217fa2 Olga Brani
                                                return DataTable.settings[i].oInstance;
6390 8a217fa2 Olga Brani
                                        }
6391 8a217fa2 Olga Brani
                                        else if ( oInit.bDestroy )
6392 8a217fa2 Olga Brani
                                        {
6393 8a217fa2 Olga Brani
                                                DataTable.settings[i].oInstance.fnDestroy();
6394 8a217fa2 Olga Brani
                                                break;
6395 8a217fa2 Olga Brani
                                        }
6396 8a217fa2 Olga Brani
                                        else
6397 8a217fa2 Olga Brani
                                        {
6398 8a217fa2 Olga Brani
                                                _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+
6399 8a217fa2 Olga Brani
                                                        "To retrieve the DataTables object for this table, pass no arguments or see "+
6400 8a217fa2 Olga Brani
                                                        "the docs for bRetrieve and bDestroy" );
6401 8a217fa2 Olga Brani
                                                return;
6402 8a217fa2 Olga Brani
                                        }
6403 8a217fa2 Olga Brani
                                }
6404 8a217fa2 Olga Brani
                                
6405 8a217fa2 Olga Brani
                                /* If the element we are initialising has the same ID as a table which was previously
6406 8a217fa2 Olga Brani
                                 * initialised, but the table nodes don't match (from before) then we destroy the old
6407 8a217fa2 Olga Brani
                                 * instance by simply deleting it. This is under the assumption that the table has been
6408 8a217fa2 Olga Brani
                                 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
6409 8a217fa2 Olga Brani
                                 */
6410 8a217fa2 Olga Brani
                                if ( DataTable.settings[i].sTableId == this.id )
6411 8a217fa2 Olga Brani
                                {
6412 8a217fa2 Olga Brani
                                        DataTable.settings.splice( i, 1 );
6413 8a217fa2 Olga Brani
                                        break;
6414 8a217fa2 Olga Brani
                                }
6415 8a217fa2 Olga Brani
                        }
6416 8a217fa2 Olga Brani
                        
6417 8a217fa2 Olga Brani
                        /* Ensure the table has an ID - required for accessibility */
6418 8a217fa2 Olga Brani
                        if ( sId === null || sId === "" )
6419 8a217fa2 Olga Brani
                        {
6420 8a217fa2 Olga Brani
                                sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
6421 8a217fa2 Olga Brani
                                this.id = sId;
6422 8a217fa2 Olga Brani
                        }
6423 8a217fa2 Olga Brani
                        
6424 8a217fa2 Olga Brani
                        /* Create the settings object for this table and set some of the default parameters */
6425 8a217fa2 Olga Brani
                        var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
6426 8a217fa2 Olga Brani
                                "nTable":        this,
6427 8a217fa2 Olga Brani
                                "oApi":          _that.oApi,
6428 8a217fa2 Olga Brani
                                "oInit":         oInit,
6429 8a217fa2 Olga Brani
                                "sDestroyWidth": $(this).width(),
6430 8a217fa2 Olga Brani
                                "sInstance":     sId,
6431 8a217fa2 Olga Brani
                                "sTableId":      sId
6432 8a217fa2 Olga Brani
                        } );
6433 8a217fa2 Olga Brani
                        DataTable.settings.push( oSettings );
6434 8a217fa2 Olga Brani
                        
6435 8a217fa2 Olga Brani
                        // Need to add the instance after the instance after the settings object has been added
6436 8a217fa2 Olga Brani
                        // to the settings array, so we can self reference the table instance if more than one
6437 8a217fa2 Olga Brani
                        oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();
6438 8a217fa2 Olga Brani
                        
6439 8a217fa2 Olga Brani
                        /* Setting up the initialisation object */
6440 8a217fa2 Olga Brani
                        if ( !oInit )
6441 8a217fa2 Olga Brani
                        {
6442 8a217fa2 Olga Brani
                                oInit = {};
6443 8a217fa2 Olga Brani
                        }
6444 8a217fa2 Olga Brani
                        
6445 8a217fa2 Olga Brani
                        // Backwards compatibility, before we apply all the defaults
6446 8a217fa2 Olga Brani
                        if ( oInit.oLanguage )
6447 8a217fa2 Olga Brani
                        {
6448 8a217fa2 Olga Brani
                                _fnLanguageCompat( oInit.oLanguage );
6449 8a217fa2 Olga Brani
                        }
6450 8a217fa2 Olga Brani
                        
6451 8a217fa2 Olga Brani
                        oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit );
6452 8a217fa2 Olga Brani
                        
6453 8a217fa2 Olga Brani
                        // Map the initialisation options onto the settings object
6454 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bPaginate" );
6455 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
6456 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bFilter" );
6457 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bSort" );
6458 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bInfo" );
6459 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bProcessing" );
6460 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
6461 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
6462 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bServerSide" );
6463 8a217fa2 Olga Brani
                        _fnMap( oSettings.oFeatures, oInit, "bDeferRender" );
6464 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
6465 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
6466 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
6467 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
6468 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
6469 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
6470 8a217fa2 Olga Brani
                        _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
6471 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "asStripeClasses" );
6472 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
6473 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "fnServerData" );
6474 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "fnFormatNumber" );
6475 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "sServerMethod" );
6476 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "aaSorting" );
6477 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "aaSortingFixed" );
6478 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "aLengthMenu" );
6479 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "sPaginationType" );
6480 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "sAjaxSource" );
6481 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "sAjaxDataProp" );
6482 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "iCookieDuration" );
6483 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "sCookiePrefix" );
6484 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "sDom" );
6485 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "bSortCellsTop" );
6486 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "iTabIndex" );
6487 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
6488 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
6489 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
6490 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
6491 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "fnCookieCallback" );
6492 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "fnStateLoad" );
6493 8a217fa2 Olga Brani
                        _fnMap( oSettings, oInit, "fnStateSave" );
6494 8a217fa2 Olga Brani
                        _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
6495 8a217fa2 Olga Brani
                        
6496 8a217fa2 Olga Brani
                        /* Callback functions which are array driven */
6497 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
6498 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
6499 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
6500 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
6501 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
6502 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
6503 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
6504 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
6505 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
6506 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
6507 8a217fa2 Olga Brani
                        _fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
6508 8a217fa2 Olga Brani
                        
6509 8a217fa2 Olga Brani
                        if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
6510 8a217fa2 Olga Brani
                                   oSettings.oFeatures.bSortClasses )
6511 8a217fa2 Olga Brani
                        {
6512 8a217fa2 Olga Brani
                                /* Enable sort classes for server-side processing. Safe to do it here, since server-side
6513 8a217fa2 Olga Brani
                                 * processing must be enabled by the developer
6514 8a217fa2 Olga Brani
                                 */
6515 8a217fa2 Olga Brani
                                _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' );
6516 8a217fa2 Olga Brani
                        }
6517 8a217fa2 Olga Brani
                        else if ( oSettings.oFeatures.bDeferRender )
6518 8a217fa2 Olga Brani
                        {
6519 8a217fa2 Olga Brani
                                _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' );
6520 8a217fa2 Olga Brani
                        }
6521 8a217fa2 Olga Brani
                        
6522 8a217fa2 Olga Brani
                        if ( oInit.bJQueryUI )
6523 8a217fa2 Olga Brani
                        {
6524 8a217fa2 Olga Brani
                                /* Use the JUI classes object for display. You could clone the oStdClasses object if 
6525 8a217fa2 Olga Brani
                                 * you want to have multiple tables with multiple independent classes 
6526 8a217fa2 Olga Brani
                                 */
6527 8a217fa2 Olga Brani
                                $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses );
6528 8a217fa2 Olga Brani
                                
6529 8a217fa2 Olga Brani
                                if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" )
6530 8a217fa2 Olga Brani
                                {
6531 8a217fa2 Olga Brani
                                        /* Set the DOM to use a layout suitable for jQuery UI's theming */
6532 8a217fa2 Olga Brani
                                        oSettings.sDom = '<"H"lfr>t<"F"ip>';
6533 8a217fa2 Olga Brani
                                }
6534 8a217fa2 Olga Brani
                        }
6535 8a217fa2 Olga Brani
                        else
6536 8a217fa2 Olga Brani
                        {
6537 8a217fa2 Olga Brani
                                $.extend( oSettings.oClasses, DataTable.ext.oStdClasses );
6538 8a217fa2 Olga Brani
                        }
6539 8a217fa2 Olga Brani
                        $(this).addClass( oSettings.oClasses.sTable );
6540 8a217fa2 Olga Brani
                        
6541 8a217fa2 Olga Brani
                        /* Calculate the scroll bar width and cache it for use later on */
6542 8a217fa2 Olga Brani
                        if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
6543 8a217fa2 Olga Brani
                        {
6544 8a217fa2 Olga Brani
                                oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
6545 8a217fa2 Olga Brani
                        }
6546 8a217fa2 Olga Brani
                        
6547 8a217fa2 Olga Brani
                        if ( oSettings.iInitDisplayStart === undefined )
6548 8a217fa2 Olga Brani
                        {
6549 8a217fa2 Olga Brani
                                /* Display start point, taking into account the save saving */
6550 8a217fa2 Olga Brani
                                oSettings.iInitDisplayStart = oInit.iDisplayStart;
6551 8a217fa2 Olga Brani
                                oSettings._iDisplayStart = oInit.iDisplayStart;
6552 8a217fa2 Olga Brani
                        }
6553 8a217fa2 Olga Brani
                        
6554 8a217fa2 Olga Brani
                        /* Must be done after everything which can be overridden by a cookie! */
6555 8a217fa2 Olga Brani
                        if ( oInit.bStateSave )
6556 8a217fa2 Olga Brani
                        {
6557 8a217fa2 Olga Brani
                                oSettings.oFeatures.bStateSave = true;
6558 8a217fa2 Olga Brani
                                _fnLoadState( oSettings, oInit );
6559 8a217fa2 Olga Brani
                                _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
6560 8a217fa2 Olga Brani
                        }
6561 8a217fa2 Olga Brani
                        
6562 8a217fa2 Olga Brani
                        if ( oInit.iDeferLoading !== null )
6563 8a217fa2 Olga Brani
                        {
6564 8a217fa2 Olga Brani
                                oSettings.bDeferLoading = true;
6565 8a217fa2 Olga Brani
                                var tmp = $.isArray( oInit.iDeferLoading );
6566 8a217fa2 Olga Brani
                                oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
6567 8a217fa2 Olga Brani
                                oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
6568 8a217fa2 Olga Brani
                        }
6569 8a217fa2 Olga Brani
                        
6570 8a217fa2 Olga Brani
                        if ( oInit.aaData !== null )
6571 8a217fa2 Olga Brani
                        {
6572 8a217fa2 Olga Brani
                                bUsePassedData = true;
6573 8a217fa2 Olga Brani
                        }
6574 8a217fa2 Olga Brani
                        
6575 8a217fa2 Olga Brani
                        /* Language definitions */
6576 8a217fa2 Olga Brani
                        if ( oInit.oLanguage.sUrl !== "" )
6577 8a217fa2 Olga Brani
                        {
6578 8a217fa2 Olga Brani
                                /* Get the language definitions from a file - because this Ajax call makes the language
6579 8a217fa2 Olga Brani
                                 * get async to the remainder of this function we use bInitHandedOff to indicate that 
6580 8a217fa2 Olga Brani
                                 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
6581 8a217fa2 Olga Brani
                                 */
6582 8a217fa2 Olga Brani
                                oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
6583 8a217fa2 Olga Brani
                                $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {
6584 8a217fa2 Olga Brani
                                        _fnLanguageCompat( json );
6585 8a217fa2 Olga Brani
                                        $.extend( true, oSettings.oLanguage, oInit.oLanguage, json );
6586 8a217fa2 Olga Brani
                                        _fnInitialise( oSettings );
6587 8a217fa2 Olga Brani
                                } );
6588 8a217fa2 Olga Brani
                                bInitHandedOff = true;
6589 8a217fa2 Olga Brani
                        }
6590 8a217fa2 Olga Brani
                        else
6591 8a217fa2 Olga Brani
                        {
6592 8a217fa2 Olga Brani
                                $.extend( true, oSettings.oLanguage, oInit.oLanguage );
6593 8a217fa2 Olga Brani
                        }
6594 8a217fa2 Olga Brani
                        
6595 8a217fa2 Olga Brani
                        
6596 8a217fa2 Olga Brani
                        /*
6597 8a217fa2 Olga Brani
                         * Stripes
6598 8a217fa2 Olga Brani
                         */
6599 8a217fa2 Olga Brani
                        if ( oInit.asStripeClasses === null )
6600 8a217fa2 Olga Brani
                        {
6601 8a217fa2 Olga Brani
                                oSettings.asStripeClasses =[
6602 8a217fa2 Olga Brani
                                        oSettings.oClasses.sStripeOdd,
6603 8a217fa2 Olga Brani
                                        oSettings.oClasses.sStripeEven
6604 8a217fa2 Olga Brani
                                ];
6605 8a217fa2 Olga Brani
                        }
6606 8a217fa2 Olga Brani
                        
6607 8a217fa2 Olga Brani
                        /* Remove row stripe classes if they are already on the table row */
6608 8a217fa2 Olga Brani
                        iLen=oSettings.asStripeClasses.length;
6609 8a217fa2 Olga Brani
                        oSettings.asDestroyStripes = [];
6610 8a217fa2 Olga Brani
                        if (iLen)
6611 8a217fa2 Olga Brani
                        {
6612 8a217fa2 Olga Brani
                                var bStripeRemove = false;
6613 8a217fa2 Olga Brani
                                var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');
6614 8a217fa2 Olga Brani
                                for ( i=0 ; i<iLen ; i++ )
6615 8a217fa2 Olga Brani
                                {
6616 8a217fa2 Olga Brani
                                        if ( anRows.hasClass( oSettings.asStripeClasses[i] ) )
6617 8a217fa2 Olga Brani
                                        {
6618 8a217fa2 Olga Brani
                                                bStripeRemove = true;
6619 8a217fa2 Olga Brani
                                                
6620 8a217fa2 Olga Brani
                                                /* Store the classes which we are about to remove so they can be re-added on destroy */
6621 8a217fa2 Olga Brani
                                                oSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );
6622 8a217fa2 Olga Brani
                                        }
6623 8a217fa2 Olga Brani
                                }
6624 8a217fa2 Olga Brani
                                
6625 8a217fa2 Olga Brani
                                if ( bStripeRemove )
6626 8a217fa2 Olga Brani
                                {
6627 8a217fa2 Olga Brani
                                        anRows.removeClass( oSettings.asStripeClasses.join(' ') );
6628 8a217fa2 Olga Brani
                                }
6629 8a217fa2 Olga Brani
                        }
6630 8a217fa2 Olga Brani
                        
6631 8a217fa2 Olga Brani
                        /*
6632 8a217fa2 Olga Brani
                         * Columns
6633 8a217fa2 Olga Brani
                         * See if we should load columns automatically or use defined ones
6634 8a217fa2 Olga Brani
                         */
6635 8a217fa2 Olga Brani
                        var anThs = [];
6636 8a217fa2 Olga Brani
                        var aoColumnsInit;
6637 8a217fa2 Olga Brani
                        var nThead = this.getElementsByTagName('thead');
6638 8a217fa2 Olga Brani
                        if ( nThead.length !== 0 )
6639 8a217fa2 Olga Brani
                        {
6640 8a217fa2 Olga Brani
                                _fnDetectHeader( oSettings.aoHeader, nThead[0] );
6641 8a217fa2 Olga Brani
                                anThs = _fnGetUniqueThs( oSettings );
6642 8a217fa2 Olga Brani
                        }
6643 8a217fa2 Olga Brani
                        
6644 8a217fa2 Olga Brani
                        /* If not given a column array, generate one with nulls */
6645 8a217fa2 Olga Brani
                        if ( oInit.aoColumns === null )
6646 8a217fa2 Olga Brani
                        {
6647 8a217fa2 Olga Brani
                                aoColumnsInit = [];
6648 8a217fa2 Olga Brani
                                for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
6649 8a217fa2 Olga Brani
                                {
6650 8a217fa2 Olga Brani
                                        aoColumnsInit.push( null );
6651 8a217fa2 Olga Brani
                                }
6652 8a217fa2 Olga Brani
                        }
6653 8a217fa2 Olga Brani
                        else
6654 8a217fa2 Olga Brani
                        {
6655 8a217fa2 Olga Brani
                                aoColumnsInit = oInit.aoColumns;
6656 8a217fa2 Olga Brani
                        }
6657 8a217fa2 Olga Brani
                        
6658 8a217fa2 Olga Brani
                        /* Add the columns */
6659 8a217fa2 Olga Brani
                        for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
6660 8a217fa2 Olga Brani
                        {
6661 8a217fa2 Olga Brani
                                /* Short cut - use the loop to check if we have column visibility state to restore */
6662 8a217fa2 Olga Brani
                                if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen )
6663 8a217fa2 Olga Brani
                                {
6664 8a217fa2 Olga Brani
                                        if ( aoColumnsInit[i] === null )
6665 8a217fa2 Olga Brani
                                        {
6666 8a217fa2 Olga Brani
                                                aoColumnsInit[i] = {};
6667 8a217fa2 Olga Brani
                                        }
6668 8a217fa2 Olga Brani
                                        aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
6669 8a217fa2 Olga Brani
                                }
6670 8a217fa2 Olga Brani
                                
6671 8a217fa2 Olga Brani
                                _fnAddColumn( oSettings, anThs ? anThs[i] : null );
6672 8a217fa2 Olga Brani
                        }
6673 8a217fa2 Olga Brani
                        
6674 8a217fa2 Olga Brani
                        /* Apply the column definitions */
6675 8a217fa2 Olga Brani
                        _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
6676 8a217fa2 Olga Brani
                                _fnColumnOptions( oSettings, iCol, oDef );
6677 8a217fa2 Olga Brani
                        } );
6678 8a217fa2 Olga Brani
                        
6679 8a217fa2 Olga Brani
                        
6680 8a217fa2 Olga Brani
                        /*
6681 8a217fa2 Olga Brani
                         * Sorting
6682 8a217fa2 Olga Brani
                         * Check the aaSorting array
6683 8a217fa2 Olga Brani
                         */
6684 8a217fa2 Olga Brani
                        for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
6685 8a217fa2 Olga Brani
                        {
6686 8a217fa2 Olga Brani
                                if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
6687 8a217fa2 Olga Brani
                                {
6688 8a217fa2 Olga Brani
                                        oSettings.aaSorting[i][0] = 0;
6689 8a217fa2 Olga Brani
                                }
6690 8a217fa2 Olga Brani
                                var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
6691 8a217fa2 Olga Brani
                                
6692 8a217fa2 Olga Brani
                                /* Add a default sorting index */
6693 8a217fa2 Olga Brani
                                if ( oSettings.aaSorting[i][2] === undefined )
6694 8a217fa2 Olga Brani
                                {
6695 8a217fa2 Olga Brani
                                        oSettings.aaSorting[i][2] = 0;
6696 8a217fa2 Olga Brani
                                }
6697 8a217fa2 Olga Brani
                                
6698 8a217fa2 Olga Brani
                                /* If aaSorting is not defined, then we use the first indicator in asSorting */
6699 8a217fa2 Olga Brani
                                if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined )
6700 8a217fa2 Olga Brani
                                {
6701 8a217fa2 Olga Brani
                                        oSettings.aaSorting[i][1] = oColumn.asSorting[0];
6702 8a217fa2 Olga Brani
                                }
6703 8a217fa2 Olga Brani
                                
6704 8a217fa2 Olga Brani
                                /* Set the current sorting index based on aoColumns.asSorting */
6705 8a217fa2 Olga Brani
                                for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
6706 8a217fa2 Olga Brani
                                {
6707 8a217fa2 Olga Brani
                                        if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
6708 8a217fa2 Olga Brani
                                        {
6709 8a217fa2 Olga Brani
                                                oSettings.aaSorting[i][2] = j;
6710 8a217fa2 Olga Brani
                                                break;
6711 8a217fa2 Olga Brani
                                        }
6712 8a217fa2 Olga Brani
                                }
6713 8a217fa2 Olga Brani
                        }
6714 8a217fa2 Olga Brani
                                
6715 8a217fa2 Olga Brani
                        /* Do a first pass on the sorting classes (allows any size changes to be taken into
6716 8a217fa2 Olga Brani
                         * account, and also will apply sorting disabled classes if disabled
6717 8a217fa2 Olga Brani
                         */
6718 8a217fa2 Olga Brani
                        _fnSortingClasses( oSettings );
6719 8a217fa2 Olga Brani
                        
6720 8a217fa2 Olga Brani
                        
6721 8a217fa2 Olga Brani
                        /*
6722 8a217fa2 Olga Brani
                         * Final init
6723 8a217fa2 Olga Brani
                         * Cache the header, body and footer as required, creating them if needed
6724 8a217fa2 Olga Brani
                         */
6725 8a217fa2 Olga Brani
                        
6726 8a217fa2 Olga Brani
                        /* Browser support detection */
6727 8a217fa2 Olga Brani
                        _fnBrowserDetect( oSettings );
6728 8a217fa2 Olga Brani
                        
6729 8a217fa2 Olga Brani
                        // Work around for Webkit bug 83867 - store the caption-side before removing from doc
6730 8a217fa2 Olga Brani
                        var captions = $(this).children('caption').each( function () {
6731 8a217fa2 Olga Brani
                                this._captionSide = $(this).css('caption-side');
6732 8a217fa2 Olga Brani
                        } );
6733 8a217fa2 Olga Brani
                        
6734 8a217fa2 Olga Brani
                        var thead = $(this).children('thead');
6735 8a217fa2 Olga Brani
                        if ( thead.length === 0 )
6736 8a217fa2 Olga Brani
                        {
6737 8a217fa2 Olga Brani
                                thead = [ document.createElement( 'thead' ) ];
6738 8a217fa2 Olga Brani
                                this.appendChild( thead[0] );
6739 8a217fa2 Olga Brani
                        }
6740 8a217fa2 Olga Brani
                        oSettings.nTHead = thead[0];
6741 8a217fa2 Olga Brani
                        
6742 8a217fa2 Olga Brani
                        var tbody = $(this).children('tbody');
6743 8a217fa2 Olga Brani
                        if ( tbody.length === 0 )
6744 8a217fa2 Olga Brani
                        {
6745 8a217fa2 Olga Brani
                                tbody = [ document.createElement( 'tbody' ) ];
6746 8a217fa2 Olga Brani
                                this.appendChild( tbody[0] );
6747 8a217fa2 Olga Brani
                        }
6748 8a217fa2 Olga Brani
                        oSettings.nTBody = tbody[0];
6749 8a217fa2 Olga Brani
                        oSettings.nTBody.setAttribute( "role", "alert" );
6750 8a217fa2 Olga Brani
                        oSettings.nTBody.setAttribute( "aria-live", "polite" );
6751 8a217fa2 Olga Brani
                        oSettings.nTBody.setAttribute( "aria-relevant", "all" );
6752 8a217fa2 Olga Brani
                        
6753 8a217fa2 Olga Brani
                        var tfoot = $(this).children('tfoot');
6754 8a217fa2 Olga Brani
                        if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
6755 8a217fa2 Olga Brani
                        {
6756 8a217fa2 Olga Brani
                                // If we are a scrolling table, and no footer has been given, then we need to create
6757 8a217fa2 Olga Brani
                                // a tfoot element for the caption element to be appended to
6758 8a217fa2 Olga Brani
                                tfoot = [ document.createElement( 'tfoot' ) ];
6759 8a217fa2 Olga Brani
                                this.appendChild( tfoot[0] );
6760 8a217fa2 Olga Brani
                        }
6761 8a217fa2 Olga Brani
                        
6762 8a217fa2 Olga Brani
                        if ( tfoot.length > 0 )
6763 8a217fa2 Olga Brani
                        {
6764 8a217fa2 Olga Brani
                                oSettings.nTFoot = tfoot[0];
6765 8a217fa2 Olga Brani
                                _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
6766 8a217fa2 Olga Brani
                        }
6767 8a217fa2 Olga Brani
                        
6768 8a217fa2 Olga Brani
                        /* Check if there is data passing into the constructor */
6769 8a217fa2 Olga Brani
                        if ( bUsePassedData )
6770 8a217fa2 Olga Brani
                        {
6771 8a217fa2 Olga Brani
                                for ( i=0 ; i<oInit.aaData.length ; i++ )
6772 8a217fa2 Olga Brani
                                {
6773 8a217fa2 Olga Brani
                                        _fnAddData( oSettings, oInit.aaData[ i ] );
6774 8a217fa2 Olga Brani
                                }
6775 8a217fa2 Olga Brani
                        }
6776 8a217fa2 Olga Brani
                        else
6777 8a217fa2 Olga Brani
                        {
6778 8a217fa2 Olga Brani
                                /* Grab the data from the page */
6779 8a217fa2 Olga Brani
                                _fnGatherData( oSettings );
6780 8a217fa2 Olga Brani
                        }
6781 8a217fa2 Olga Brani
                        
6782 8a217fa2 Olga Brani
                        /* Copy the data index array */
6783 8a217fa2 Olga Brani
                        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
6784 8a217fa2 Olga Brani
                        
6785 8a217fa2 Olga Brani
                        /* Initialisation complete - table can be drawn */
6786 8a217fa2 Olga Brani
                        oSettings.bInitialised = true;
6787 8a217fa2 Olga Brani
                        
6788 8a217fa2 Olga Brani
                        /* Check if we need to initialise the table (it might not have been handed off to the
6789 8a217fa2 Olga Brani
                         * language processor)
6790 8a217fa2 Olga Brani
                         */
6791 8a217fa2 Olga Brani
                        if ( bInitHandedOff === false )
6792 8a217fa2 Olga Brani
                        {
6793 8a217fa2 Olga Brani
                                _fnInitialise( oSettings );
6794 8a217fa2 Olga Brani
                        }
6795 8a217fa2 Olga Brani
                } );
6796 8a217fa2 Olga Brani
                _that = null;
6797 8a217fa2 Olga Brani
                return this;
6798 8a217fa2 Olga Brani
        };
6799 8a217fa2 Olga Brani
6800 8a217fa2 Olga Brani
        
6801 8a217fa2 Olga Brani
        
6802 8a217fa2 Olga Brani
        /**
6803 8a217fa2 Olga Brani
         * Provide a common method for plug-ins to check the version of DataTables being used, in order
6804 8a217fa2 Olga Brani
         * to ensure compatibility.
6805 8a217fa2 Olga Brani
         *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
6806 8a217fa2 Olga Brani
         *    formats "X" and "X.Y" are also acceptable.
6807 8a217fa2 Olga Brani
         *  @returns {boolean} true if this version of DataTables is greater or equal to the required
6808 8a217fa2 Olga Brani
         *    version, or false if this version of DataTales is not suitable
6809 8a217fa2 Olga Brani
         *  @static
6810 8a217fa2 Olga Brani
         *  @dtopt API-Static
6811 8a217fa2 Olga Brani
         *
6812 8a217fa2 Olga Brani
         *  @example
6813 8a217fa2 Olga Brani
         *    alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) );
6814 8a217fa2 Olga Brani
         */
6815 8a217fa2 Olga Brani
        DataTable.fnVersionCheck = function( sVersion )
6816 8a217fa2 Olga Brani
        {
6817 8a217fa2 Olga Brani
                /* This is cheap, but effective */
6818 8a217fa2 Olga Brani
                var fnZPad = function (Zpad, count)
6819 8a217fa2 Olga Brani
                {
6820 8a217fa2 Olga Brani
                        while(Zpad.length < count) {
6821 8a217fa2 Olga Brani
                                Zpad += '0';
6822 8a217fa2 Olga Brani
                        }
6823 8a217fa2 Olga Brani
                        return Zpad;
6824 8a217fa2 Olga Brani
                };
6825 8a217fa2 Olga Brani
                var aThis = DataTable.ext.sVersion.split('.');
6826 8a217fa2 Olga Brani
                var aThat = sVersion.split('.');
6827 8a217fa2 Olga Brani
                var sThis = '', sThat = '';
6828 8a217fa2 Olga Brani
                
6829 8a217fa2 Olga Brani
                for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
6830 8a217fa2 Olga Brani
                {
6831 8a217fa2 Olga Brani
                        sThis += fnZPad( aThis[i], 3 );
6832 8a217fa2 Olga Brani
                        sThat += fnZPad( aThat[i], 3 );
6833 8a217fa2 Olga Brani
                }
6834 8a217fa2 Olga Brani
                
6835 8a217fa2 Olga Brani
                return parseInt(sThis, 10) >= parseInt(sThat, 10);
6836 8a217fa2 Olga Brani
        };
6837 8a217fa2 Olga Brani
        
6838 8a217fa2 Olga Brani
        
6839 8a217fa2 Olga Brani
        /**
6840 8a217fa2 Olga Brani
         * Check if a TABLE node is a DataTable table already or not.
6841 8a217fa2 Olga Brani
         *  @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other
6842 8a217fa2 Olga Brani
         *    node types can be passed in, but will always return false).
6843 8a217fa2 Olga Brani
         *  @returns {boolean} true the table given is a DataTable, or false otherwise
6844 8a217fa2 Olga Brani
         *  @static
6845 8a217fa2 Olga Brani
         *  @dtopt API-Static
6846 8a217fa2 Olga Brani
         *
6847 8a217fa2 Olga Brani
         *  @example
6848 8a217fa2 Olga Brani
         *    var ex = document.getElementById('example');
6849 8a217fa2 Olga Brani
         *    if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {
6850 8a217fa2 Olga Brani
         *      $(ex).dataTable();
6851 8a217fa2 Olga Brani
         *    }
6852 8a217fa2 Olga Brani
         */
6853 8a217fa2 Olga Brani
        DataTable.fnIsDataTable = function ( nTable )
6854 8a217fa2 Olga Brani
        {
6855 8a217fa2 Olga Brani
                var o = DataTable.settings;
6856 8a217fa2 Olga Brani
        
6857 8a217fa2 Olga Brani
                for ( var i=0 ; i<o.length ; i++ )
6858 8a217fa2 Olga Brani
                {
6859 8a217fa2 Olga Brani
                        if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )
6860 8a217fa2 Olga Brani
                        {
6861 8a217fa2 Olga Brani
                                return true;
6862 8a217fa2 Olga Brani
                        }
6863 8a217fa2 Olga Brani
                }
6864 8a217fa2 Olga Brani
        
6865 8a217fa2 Olga Brani
                return false;
6866 8a217fa2 Olga Brani
        };
6867 8a217fa2 Olga Brani
        
6868 8a217fa2 Olga Brani
        
6869 8a217fa2 Olga Brani
        /**
6870 8a217fa2 Olga Brani
         * Get all DataTable tables that have been initialised - optionally you can select to
6871 8a217fa2 Olga Brani
         * get only currently visible tables.
6872 8a217fa2 Olga Brani
         *  @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or 
6873 8a217fa2 Olga Brani
         *    visible tables only.
6874 8a217fa2 Olga Brani
         *  @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables
6875 8a217fa2 Olga Brani
         *  @static
6876 8a217fa2 Olga Brani
         *  @dtopt API-Static
6877 8a217fa2 Olga Brani
         *
6878 8a217fa2 Olga Brani
         *  @example
6879 8a217fa2 Olga Brani
         *    var table = $.fn.dataTable.fnTables(true);
6880 8a217fa2 Olga Brani
         *    if ( table.length > 0 ) {
6881 8a217fa2 Olga Brani
         *      $(table).dataTable().fnAdjustColumnSizing();
6882 8a217fa2 Olga Brani
         *    }
6883 8a217fa2 Olga Brani
         */
6884 8a217fa2 Olga Brani
        DataTable.fnTables = function ( bVisible )
6885 8a217fa2 Olga Brani
        {
6886 8a217fa2 Olga Brani
                var out = [];
6887 8a217fa2 Olga Brani
        
6888 8a217fa2 Olga Brani
                jQuery.each( DataTable.settings, function (i, o) {
6889 8a217fa2 Olga Brani
                        if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )
6890 8a217fa2 Olga Brani
                        {
6891 8a217fa2 Olga Brani
                                out.push( o.nTable );
6892 8a217fa2 Olga Brani
                        }
6893 8a217fa2 Olga Brani
                } );
6894 8a217fa2 Olga Brani
        
6895 8a217fa2 Olga Brani
                return out;
6896 8a217fa2 Olga Brani
        };
6897 8a217fa2 Olga Brani
        
6898 8a217fa2 Olga Brani
6899 8a217fa2 Olga Brani
        /**
6900 8a217fa2 Olga Brani
         * Version string for plug-ins to check compatibility. Allowed format is
6901 8a217fa2 Olga Brani
         * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
6902 8a217fa2 Olga Brani
         * e are optional
6903 8a217fa2 Olga Brani
         *  @member
6904 8a217fa2 Olga Brani
         *  @type string
6905 8a217fa2 Olga Brani
         *  @default Version number
6906 8a217fa2 Olga Brani
         */
6907 8a217fa2 Olga Brani
        DataTable.version = "1.9.4";
6908 8a217fa2 Olga Brani
6909 8a217fa2 Olga Brani
        /**
6910 8a217fa2 Olga Brani
         * Private data store, containing all of the settings objects that are created for the
6911 8a217fa2 Olga Brani
         * tables on a given page.
6912 8a217fa2 Olga Brani
         * 
6913 8a217fa2 Olga Brani
         * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i> 
6914 8a217fa2 Olga Brani
         * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>.
6915 8a217fa2 Olga Brani
         *  @member
6916 8a217fa2 Olga Brani
         *  @type array
6917 8a217fa2 Olga Brani
         *  @default []
6918 8a217fa2 Olga Brani
         *  @private
6919 8a217fa2 Olga Brani
         */
6920 8a217fa2 Olga Brani
        DataTable.settings = [];
6921 8a217fa2 Olga Brani
6922 8a217fa2 Olga Brani
        /**
6923 8a217fa2 Olga Brani
         * Object models container, for the various models that DataTables has available
6924 8a217fa2 Olga Brani
         * to it. These models define the objects that are used to hold the active state 
6925 8a217fa2 Olga Brani
         * and configuration of the table.
6926 8a217fa2 Olga Brani
         *  @namespace
6927 8a217fa2 Olga Brani
         */
6928 8a217fa2 Olga Brani
        DataTable.models = {};
6929 8a217fa2 Olga Brani
        
6930 8a217fa2 Olga Brani
        
6931 8a217fa2 Olga Brani
        /**
6932 8a217fa2 Olga Brani
         * DataTables extension options and plug-ins. This namespace acts as a collection "area"
6933 8a217fa2 Olga Brani
         * for plug-ins that can be used to extend the default DataTables behaviour - indeed many
6934 8a217fa2 Olga Brani
         * of the build in methods use this method to provide their own capabilities (sorting methods
6935 8a217fa2 Olga Brani
         * for example).
6936 8a217fa2 Olga Brani
         * 
6937 8a217fa2 Olga Brani
         * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed
6938 8a217fa2 Olga Brani
         * and modified by plug-ins.
6939 8a217fa2 Olga Brani
         *  @namespace
6940 8a217fa2 Olga Brani
         */
6941 8a217fa2 Olga Brani
        DataTable.models.ext = {
6942 8a217fa2 Olga Brani
                /**
6943 8a217fa2 Olga Brani
                 * Plug-in filtering functions - this method of filtering is complimentary to the default
6944 8a217fa2 Olga Brani
                 * type based filtering, and a lot more comprehensive as it allows you complete control
6945 8a217fa2 Olga Brani
                 * over the filtering logic. Each element in this array is a function (parameters
6946 8a217fa2 Olga Brani
                 * described below) that is called for every row in the table, and your logic decides if
6947 8a217fa2 Olga Brani
                 * it should be included in the filtered data set or not.
6948 8a217fa2 Olga Brani
                 *   <ul>
6949 8a217fa2 Olga Brani
                 *     <li>
6950 8a217fa2 Olga Brani
                 *       Function input parameters:
6951 8a217fa2 Olga Brani
                 *       <ul>
6952 8a217fa2 Olga Brani
                 *         <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
6953 8a217fa2 Olga Brani
                 *         <li>{array|object} Data for the row to be processed (same as the original format
6954 8a217fa2 Olga Brani
                 *           that was passed in as the data source, or an array from a DOM data source</li>
6955 8a217fa2 Olga Brani
                 *         <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can
6956 8a217fa2 Olga Brani
                 *           be useful to retrieve the TR element if you need DOM interaction.</li>
6957 8a217fa2 Olga Brani
                 *       </ul>
6958 8a217fa2 Olga Brani
                 *     </li>
6959 8a217fa2 Olga Brani
                 *     <li>
6960 8a217fa2 Olga Brani
                 *       Function return:
6961 8a217fa2 Olga Brani
                 *       <ul>
6962 8a217fa2 Olga Brani
                 *         <li>{boolean} Include the row in the filtered result set (true) or not (false)</li>
6963 8a217fa2 Olga Brani
                 *       </ul>
6964 8a217fa2 Olga Brani
                 *     </il>
6965 8a217fa2 Olga Brani
                 *   </ul>
6966 8a217fa2 Olga Brani
                 *  @type array
6967 8a217fa2 Olga Brani
                 *  @default []
6968 8a217fa2 Olga Brani
                 *
6969 8a217fa2 Olga Brani
                 *  @example
6970 8a217fa2 Olga Brani
                 *    // The following example shows custom filtering being applied to the fourth column (i.e.
6971 8a217fa2 Olga Brani
                 *    // the aData[3] index) based on two input values from the end-user, matching the data in 
6972 8a217fa2 Olga Brani
                 *    // a certain range.
6973 8a217fa2 Olga Brani
                 *    $.fn.dataTableExt.afnFiltering.push(
6974 8a217fa2 Olga Brani
                 *      function( oSettings, aData, iDataIndex ) {
6975 8a217fa2 Olga Brani
                 *        var iMin = document.getElementById('min').value * 1;
6976 8a217fa2 Olga Brani
                 *        var iMax = document.getElementById('max').value * 1;
6977 8a217fa2 Olga Brani
                 *        var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
6978 8a217fa2 Olga Brani
                 *        if ( iMin == "" && iMax == "" ) {
6979 8a217fa2 Olga Brani
                 *          return true;
6980 8a217fa2 Olga Brani
                 *        }
6981 8a217fa2 Olga Brani
                 *        else if ( iMin == "" && iVersion < iMax ) {
6982 8a217fa2 Olga Brani
                 *          return true;
6983 8a217fa2 Olga Brani
                 *        }
6984 8a217fa2 Olga Brani
                 *        else if ( iMin < iVersion && "" == iMax ) {
6985 8a217fa2 Olga Brani
                 *          return true;
6986 8a217fa2 Olga Brani
                 *        }
6987 8a217fa2 Olga Brani
                 *        else if ( iMin < iVersion && iVersion < iMax ) {
6988 8a217fa2 Olga Brani
                 *          return true;
6989 8a217fa2 Olga Brani
                 *        }
6990 8a217fa2 Olga Brani
                 *        return false;
6991 8a217fa2 Olga Brani
                 *      }
6992 8a217fa2 Olga Brani
                 *    );
6993 8a217fa2 Olga Brani
                 */
6994 8a217fa2 Olga Brani
                "afnFiltering": [],
6995 8a217fa2 Olga Brani
        
6996 8a217fa2 Olga Brani
        
6997 8a217fa2 Olga Brani
                /**
6998 8a217fa2 Olga Brani
                 * Plug-in sorting functions - this method of sorting is complimentary to the default type
6999 8a217fa2 Olga Brani
                 * based sorting that DataTables does automatically, allowing much greater control over the
7000 8a217fa2 Olga Brani
                 * the data that is being used to sort a column. This is useful if you want to do sorting
7001 8a217fa2 Olga Brani
                 * based on live data (for example the contents of an 'input' element) rather than just the
7002 8a217fa2 Olga Brani
                 * static string that DataTables knows of. The way these plug-ins work is that you create
7003 8a217fa2 Olga Brani
                 * an array of the values you wish to be sorted for the column in question and then return
7004 8a217fa2 Olga Brani
                 * that array. Which pre-sorting function is run here depends on the sSortDataType parameter
7005 8a217fa2 Olga Brani
                 * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort 
7006 8a217fa2 Olga Brani
                 * data.
7007 8a217fa2 Olga Brani
                 *   <ul>
7008 8a217fa2 Olga Brani
             *     <li>
7009 8a217fa2 Olga Brani
             *       Function input parameters:
7010 8a217fa2 Olga Brani
             *       <ul>
7011 8a217fa2 Olga Brani
                 *         <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7012 8a217fa2 Olga Brani
             *         <li>{int} Target column index</li>
7013 8a217fa2 Olga Brani
             *       </ul>
7014 8a217fa2 Olga Brani
             *     </li>
7015 8a217fa2 Olga Brani
                 *     <li>
7016 8a217fa2 Olga Brani
                 *       Function return:
7017 8a217fa2 Olga Brani
                 *       <ul>
7018 8a217fa2 Olga Brani
                 *         <li>{array} Data for the column to be sorted upon</li>
7019 8a217fa2 Olga Brani
                 *       </ul>
7020 8a217fa2 Olga Brani
                 *     </il>
7021 8a217fa2 Olga Brani
                 *   </ul>
7022 8a217fa2 Olga Brani
                 *  
7023 8a217fa2 Olga Brani
                 * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
7024 8a217fa2 Olga Brani
                 * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
7025 8a217fa2 Olga Brani
                 * used as a function will give you a 'type' (sorting, filtering etc) that you can use to 
7026 8a217fa2 Olga Brani
                 * prepare the data as required for the different types. As such, this method is deprecated.
7027 8a217fa2 Olga Brani
                 *  @type array
7028 8a217fa2 Olga Brani
                 *  @default []
7029 8a217fa2 Olga Brani
                 *  @deprecated
7030 8a217fa2 Olga Brani
                 *
7031 8a217fa2 Olga Brani
                 *  @example
7032 8a217fa2 Olga Brani
                 *    // Updating the cached sorting information with user entered values in HTML input elements
7033 8a217fa2 Olga Brani
                 *    jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn )
7034 8a217fa2 Olga Brani
                 *    {
7035 8a217fa2 Olga Brani
                 *      var aData = [];
7036 8a217fa2 Olga Brani
                 *      $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
7037 8a217fa2 Olga Brani
                 *        aData.push( this.value );
7038 8a217fa2 Olga Brani
                 *      } );
7039 8a217fa2 Olga Brani
                 *      return aData;
7040 8a217fa2 Olga Brani
                 *    }
7041 8a217fa2 Olga Brani
                 */
7042 8a217fa2 Olga Brani
                "afnSortData": [],
7043 8a217fa2 Olga Brani
        
7044 8a217fa2 Olga Brani
        
7045 8a217fa2 Olga Brani
                /**
7046 8a217fa2 Olga Brani
                 * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are
7047 8a217fa2 Olga Brani
                 * available to DataTables. These feature plug-ins are accessible through the sDom initialisation
7048 8a217fa2 Olga Brani
                 * option. As such, each feature plug-in must describe a function that is used to initialise
7049 8a217fa2 Olga Brani
                 * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name
7050 8a217fa2 Olga Brani
                 * of the feature (sFeature). Thus the objects attached to this method must provide:
7051 8a217fa2 Olga Brani
                 *   <ul>
7052 8a217fa2 Olga Brani
                 *     <li>{function} fnInit Initialisation of the plug-in
7053 8a217fa2 Olga Brani
                 *       <ul>
7054 8a217fa2 Olga Brani
             *         <li>
7055 8a217fa2 Olga Brani
             *           Function input parameters:
7056 8a217fa2 Olga Brani
             *           <ul>
7057 8a217fa2 Olga Brani
                 *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7058 8a217fa2 Olga Brani
             *           </ul>
7059 8a217fa2 Olga Brani
             *         </li>
7060 8a217fa2 Olga Brani
                 *         <li>
7061 8a217fa2 Olga Brani
                 *           Function return:
7062 8a217fa2 Olga Brani
                 *           <ul>
7063 8a217fa2 Olga Brani
                 *             <li>{node|null} The element which contains your feature. Note that the return
7064 8a217fa2 Olga Brani
                 *                may also be void if your plug-in does not require to inject any DOM elements 
7065 8a217fa2 Olga Brani
                 *                into DataTables control (sDom) - for example this might be useful when 
7066 8a217fa2 Olga Brani
                 *                developing a plug-in which allows table control via keyboard entry.</li>
7067 8a217fa2 Olga Brani
                 *           </ul>
7068 8a217fa2 Olga Brani
                 *         </il>
7069 8a217fa2 Olga Brani
                 *       </ul>
7070 8a217fa2 Olga Brani
                 *     </li>
7071 8a217fa2 Olga Brani
                 *     <li>{character} cFeature Character that will be matched in sDom - case sensitive</li>
7072 8a217fa2 Olga Brani
                 *     <li>{string} sFeature Feature name</li>
7073 8a217fa2 Olga Brani
                 *   </ul>
7074 8a217fa2 Olga Brani
                 *  @type array
7075 8a217fa2 Olga Brani
                 *  @default []
7076 8a217fa2 Olga Brani
                 * 
7077 8a217fa2 Olga Brani
                 *  @example
7078 8a217fa2 Olga Brani
                 *    // How TableTools initialises itself.
7079 8a217fa2 Olga Brani
                 *    $.fn.dataTableExt.aoFeatures.push( {
7080 8a217fa2 Olga Brani
                 *      "fnInit": function( oSettings ) {
7081 8a217fa2 Olga Brani
                 *        return new TableTools( { "oDTSettings": oSettings } );
7082 8a217fa2 Olga Brani
                 *      },
7083 8a217fa2 Olga Brani
                 *      "cFeature": "T",
7084 8a217fa2 Olga Brani
                 *      "sFeature": "TableTools"
7085 8a217fa2 Olga Brani
                 *    } );
7086 8a217fa2 Olga Brani
                 */
7087 8a217fa2 Olga Brani
                "aoFeatures": [],
7088 8a217fa2 Olga Brani
        
7089 8a217fa2 Olga Brani
        
7090 8a217fa2 Olga Brani
                /**
7091 8a217fa2 Olga Brani
                 * Type detection plug-in functions - DataTables utilises types to define how sorting and
7092 8a217fa2 Olga Brani
                 * filtering behave, and types can be either  be defined by the developer (sType for the
7093 8a217fa2 Olga Brani
                 * column) or they can be automatically detected by the methods in this array. The functions
7094 8a217fa2 Olga Brani
                 * defined in the array are quite simple, taking a single parameter (the data to analyse) 
7095 8a217fa2 Olga Brani
                 * and returning the type if it is a known type, or null otherwise.
7096 8a217fa2 Olga Brani
                 *   <ul>
7097 8a217fa2 Olga Brani
             *     <li>
7098 8a217fa2 Olga Brani
             *       Function input parameters:
7099 8a217fa2 Olga Brani
             *       <ul>
7100 8a217fa2 Olga Brani
                 *         <li>{*} Data from the column cell to be analysed</li>
7101 8a217fa2 Olga Brani
             *       </ul>
7102 8a217fa2 Olga Brani
             *     </li>
7103 8a217fa2 Olga Brani
                 *     <li>
7104 8a217fa2 Olga Brani
                 *       Function return:
7105 8a217fa2 Olga Brani
                 *       <ul>
7106 8a217fa2 Olga Brani
                 *         <li>{string|null} Data type detected, or null if unknown (and thus pass it
7107 8a217fa2 Olga Brani
                 *           on to the other type detection functions.</li>
7108 8a217fa2 Olga Brani
                 *       </ul>
7109 8a217fa2 Olga Brani
                 *     </il>
7110 8a217fa2 Olga Brani
                 *   </ul>
7111 8a217fa2 Olga Brani
                 *  @type array
7112 8a217fa2 Olga Brani
                 *  @default []
7113 8a217fa2 Olga Brani
                 *  
7114 8a217fa2 Olga Brani
                 *  @example
7115 8a217fa2 Olga Brani
                 *    // Currency type detection plug-in:
7116 8a217fa2 Olga Brani
                 *    jQuery.fn.dataTableExt.aTypes.push(
7117 8a217fa2 Olga Brani
                 *      function ( sData ) {
7118 8a217fa2 Olga Brani
                 *        var sValidChars = "0123456789.-";
7119 8a217fa2 Olga Brani
                 *        var Char;
7120 8a217fa2 Olga Brani
                 *        
7121 8a217fa2 Olga Brani
                 *        // Check the numeric part
7122 8a217fa2 Olga Brani
                 *        for ( i=1 ; i<sData.length ; i++ ) {
7123 8a217fa2 Olga Brani
                 *          Char = sData.charAt(i); 
7124 8a217fa2 Olga Brani
                 *          if (sValidChars.indexOf(Char) == -1) {
7125 8a217fa2 Olga Brani
                 *            return null;
7126 8a217fa2 Olga Brani
                 *          }
7127 8a217fa2 Olga Brani
                 *        }
7128 8a217fa2 Olga Brani
                 *        
7129 8a217fa2 Olga Brani
                 *        // Check prefixed by currency
7130 8a217fa2 Olga Brani
                 *        if ( sData.charAt(0) == '$' || sData.charAt(0) == '&pound;' ) {
7131 8a217fa2 Olga Brani
                 *          return 'currency';
7132 8a217fa2 Olga Brani
                 *        }
7133 8a217fa2 Olga Brani
                 *        return null;
7134 8a217fa2 Olga Brani
                 *      }
7135 8a217fa2 Olga Brani
                 *    );
7136 8a217fa2 Olga Brani
                 */
7137 8a217fa2 Olga Brani
                "aTypes": [],
7138 8a217fa2 Olga Brani
        
7139 8a217fa2 Olga Brani
        
7140 8a217fa2 Olga Brani
                /**
7141 8a217fa2 Olga Brani
                 * Provide a common method for plug-ins to check the version of DataTables being used, 
7142 8a217fa2 Olga Brani
                 * in order to ensure compatibility.
7143 8a217fa2 Olga Brani
                 *  @type function
7144 8a217fa2 Olga Brani
                 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note 
7145 8a217fa2 Olga Brani
                 *    that the formats "X" and "X.Y" are also acceptable.
7146 8a217fa2 Olga Brani
                 *  @returns {boolean} true if this version of DataTables is greater or equal to the 
7147 8a217fa2 Olga Brani
                 *    required version, or false if this version of DataTales is not suitable
7148 8a217fa2 Olga Brani
                 *
7149 8a217fa2 Olga Brani
                 *  @example
7150 8a217fa2 Olga Brani
                 *    $(document).ready(function() {
7151 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable();
7152 8a217fa2 Olga Brani
                 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
7153 8a217fa2 Olga Brani
                 *    } );
7154 8a217fa2 Olga Brani
                 */
7155 8a217fa2 Olga Brani
                "fnVersionCheck": DataTable.fnVersionCheck,
7156 8a217fa2 Olga Brani
        
7157 8a217fa2 Olga Brani
        
7158 8a217fa2 Olga Brani
                /**
7159 8a217fa2 Olga Brani
                 * Index for what 'this' index API functions should use
7160 8a217fa2 Olga Brani
                 *  @type int
7161 8a217fa2 Olga Brani
                 *  @default 0
7162 8a217fa2 Olga Brani
                 */
7163 8a217fa2 Olga Brani
                "iApiIndex": 0,
7164 8a217fa2 Olga Brani
        
7165 8a217fa2 Olga Brani
        
7166 8a217fa2 Olga Brani
                /**
7167 8a217fa2 Olga Brani
                 * Pre-processing of filtering data plug-ins - When you assign the sType for a column
7168 8a217fa2 Olga Brani
                 * (or have it automatically detected for you by DataTables or a type detection plug-in), 
7169 8a217fa2 Olga Brani
                 * you will typically be using this for custom sorting, but it can also be used to provide 
7170 8a217fa2 Olga Brani
                 * custom filtering by allowing you to pre-processing the data and returning the data in
7171 8a217fa2 Olga Brani
                 * the format that should be filtered upon. This is done by adding functions this object 
7172 8a217fa2 Olga Brani
                 * with a parameter name which matches the sType for that target column. This is the
7173 8a217fa2 Olga Brani
                 * corollary of <i>afnSortData</i> for filtering data.
7174 8a217fa2 Olga Brani
                 *   <ul>
7175 8a217fa2 Olga Brani
             *     <li>
7176 8a217fa2 Olga Brani
             *       Function input parameters:
7177 8a217fa2 Olga Brani
             *       <ul>
7178 8a217fa2 Olga Brani
                 *         <li>{*} Data from the column cell to be prepared for filtering</li>
7179 8a217fa2 Olga Brani
             *       </ul>
7180 8a217fa2 Olga Brani
             *     </li>
7181 8a217fa2 Olga Brani
                 *     <li>
7182 8a217fa2 Olga Brani
                 *       Function return:
7183 8a217fa2 Olga Brani
                 *       <ul>
7184 8a217fa2 Olga Brani
                 *         <li>{string|null} Formatted string that will be used for the filtering.</li>
7185 8a217fa2 Olga Brani
                 *       </ul>
7186 8a217fa2 Olga Brani
                 *     </il>
7187 8a217fa2 Olga Brani
                 *   </ul>
7188 8a217fa2 Olga Brani
                 * 
7189 8a217fa2 Olga Brani
                 * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
7190 8a217fa2 Olga Brani
                 * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
7191 8a217fa2 Olga Brani
                 * used as a function will give you a 'type' (sorting, filtering etc) that you can use to 
7192 8a217fa2 Olga Brani
                 * prepare the data as required for the different types. As such, this method is deprecated.
7193 8a217fa2 Olga Brani
                 *  @type object
7194 8a217fa2 Olga Brani
                 *  @default {}
7195 8a217fa2 Olga Brani
                 *  @deprecated
7196 8a217fa2 Olga Brani
                 *
7197 8a217fa2 Olga Brani
                 *  @example
7198 8a217fa2 Olga Brani
                 *    $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) {
7199 8a217fa2 Olga Brani
                 *      return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
7200 8a217fa2 Olga Brani
                 *    }
7201 8a217fa2 Olga Brani
                 */
7202 8a217fa2 Olga Brani
                "ofnSearch": {},
7203 8a217fa2 Olga Brani
        
7204 8a217fa2 Olga Brani
        
7205 8a217fa2 Olga Brani
                /**
7206 8a217fa2 Olga Brani
                 * Container for all private functions in DataTables so they can be exposed externally
7207 8a217fa2 Olga Brani
                 *  @type object
7208 8a217fa2 Olga Brani
                 *  @default {}
7209 8a217fa2 Olga Brani
                 */
7210 8a217fa2 Olga Brani
                "oApi": {},
7211 8a217fa2 Olga Brani
        
7212 8a217fa2 Olga Brani
        
7213 8a217fa2 Olga Brani
                /**
7214 8a217fa2 Olga Brani
                 * Storage for the various classes that DataTables uses
7215 8a217fa2 Olga Brani
                 *  @type object
7216 8a217fa2 Olga Brani
                 *  @default {}
7217 8a217fa2 Olga Brani
                 */
7218 8a217fa2 Olga Brani
                "oStdClasses": {},
7219 8a217fa2 Olga Brani
                
7220 8a217fa2 Olga Brani
        
7221 8a217fa2 Olga Brani
                /**
7222 8a217fa2 Olga Brani
                 * Storage for the various classes that DataTables uses - jQuery UI suitable
7223 8a217fa2 Olga Brani
                 *  @type object
7224 8a217fa2 Olga Brani
                 *  @default {}
7225 8a217fa2 Olga Brani
                 */
7226 8a217fa2 Olga Brani
                "oJUIClasses": {},
7227 8a217fa2 Olga Brani
        
7228 8a217fa2 Olga Brani
        
7229 8a217fa2 Olga Brani
                /**
7230 8a217fa2 Olga Brani
                 * Pagination plug-in methods - The style and controls of the pagination can significantly 
7231 8a217fa2 Olga Brani
                 * impact on how the end user interacts with the data in your table, and DataTables allows 
7232 8a217fa2 Olga Brani
                 * the addition of pagination controls by extending this object, which can then be enabled
7233 8a217fa2 Olga Brani
                 * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that
7234 8a217fa2 Olga Brani
                 * is added is an object (the property name of which is what <i>sPaginationType</i> refers
7235 8a217fa2 Olga Brani
                 * to) that has two properties, both methods that are used by DataTables to update the
7236 8a217fa2 Olga Brani
                 * control's state.
7237 8a217fa2 Olga Brani
                 *   <ul>
7238 8a217fa2 Olga Brani
                 *     <li>
7239 8a217fa2 Olga Brani
                 *       fnInit -  Initialisation of the paging controls. Called only during initialisation 
7240 8a217fa2 Olga Brani
                 *         of the table. It is expected that this function will add the required DOM elements 
7241 8a217fa2 Olga Brani
                 *         to the page for the paging controls to work. The element pointer 
7242 8a217fa2 Olga Brani
                 *         'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging 
7243 8a217fa2 Olga Brani
                 *         controls (note that this is a 2D array to allow for multiple instances of each 
7244 8a217fa2 Olga Brani
                 *         DataTables DOM element). It is suggested that you add the controls to this element 
7245 8a217fa2 Olga Brani
                 *         as children
7246 8a217fa2 Olga Brani
                 *       <ul>
7247 8a217fa2 Olga Brani
             *         <li>
7248 8a217fa2 Olga Brani
             *           Function input parameters:
7249 8a217fa2 Olga Brani
             *           <ul>
7250 8a217fa2 Olga Brani
                 *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7251 8a217fa2 Olga Brani
                 *             <li>{node} Container into which the pagination controls must be inserted</li>
7252 8a217fa2 Olga Brani
                 *             <li>{function} Draw callback function - whenever the controls cause a page
7253 8a217fa2 Olga Brani
                 *               change, this method must be called to redraw the table.</li>
7254 8a217fa2 Olga Brani
             *           </ul>
7255 8a217fa2 Olga Brani
             *         </li>
7256 8a217fa2 Olga Brani
                 *         <li>
7257 8a217fa2 Olga Brani
                 *           Function return:
7258 8a217fa2 Olga Brani
                 *           <ul>
7259 8a217fa2 Olga Brani
                 *             <li>No return required</li>
7260 8a217fa2 Olga Brani
                 *           </ul>
7261 8a217fa2 Olga Brani
                 *         </il>
7262 8a217fa2 Olga Brani
                 *       </ul>
7263 8a217fa2 Olga Brani
                 *     </il>
7264 8a217fa2 Olga Brani
                 *     <li>
7265 8a217fa2 Olga Brani
                 *       fnInit -  This function is called whenever the paging status of the table changes and is
7266 8a217fa2 Olga Brani
                 *         typically used to update classes and/or text of the paging controls to reflex the new 
7267 8a217fa2 Olga Brani
                 *         status.
7268 8a217fa2 Olga Brani
                 *       <ul>
7269 8a217fa2 Olga Brani
             *         <li>
7270 8a217fa2 Olga Brani
             *           Function input parameters:
7271 8a217fa2 Olga Brani
             *           <ul>
7272 8a217fa2 Olga Brani
                 *             <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7273 8a217fa2 Olga Brani
                 *             <li>{function} Draw callback function - in case you need to redraw the table again
7274 8a217fa2 Olga Brani
                 *               or attach new event listeners</li>
7275 8a217fa2 Olga Brani
             *           </ul>
7276 8a217fa2 Olga Brani
             *         </li>
7277 8a217fa2 Olga Brani
                 *         <li>
7278 8a217fa2 Olga Brani
                 *           Function return:
7279 8a217fa2 Olga Brani
                 *           <ul>
7280 8a217fa2 Olga Brani
                 *             <li>No return required</li>
7281 8a217fa2 Olga Brani
                 *           </ul>
7282 8a217fa2 Olga Brani
                 *         </il>
7283 8a217fa2 Olga Brani
                 *       </ul>
7284 8a217fa2 Olga Brani
                 *     </il>
7285 8a217fa2 Olga Brani
                 *   </ul>
7286 8a217fa2 Olga Brani
                 *  @type object
7287 8a217fa2 Olga Brani
                 *  @default {}
7288 8a217fa2 Olga Brani
                 *
7289 8a217fa2 Olga Brani
                 *  @example
7290 8a217fa2 Olga Brani
                 *    $.fn.dataTableExt.oPagination.four_button = {
7291 8a217fa2 Olga Brani
                 *      "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) {
7292 8a217fa2 Olga Brani
                 *        nFirst = document.createElement( 'span' );
7293 8a217fa2 Olga Brani
                 *        nPrevious = document.createElement( 'span' );
7294 8a217fa2 Olga Brani
                 *        nNext = document.createElement( 'span' );
7295 8a217fa2 Olga Brani
                 *        nLast = document.createElement( 'span' );
7296 8a217fa2 Olga Brani
                 *        
7297 8a217fa2 Olga Brani
                 *        nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) );
7298 8a217fa2 Olga Brani
                 *        nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) );
7299 8a217fa2 Olga Brani
                 *        nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) );
7300 8a217fa2 Olga Brani
                 *        nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) );
7301 8a217fa2 Olga Brani
                 *        
7302 8a217fa2 Olga Brani
                 *        nFirst.className = "paginate_button first";
7303 8a217fa2 Olga Brani
                 *        nPrevious.className = "paginate_button previous";
7304 8a217fa2 Olga Brani
                 *        nNext.className="paginate_button next";
7305 8a217fa2 Olga Brani
                 *        nLast.className = "paginate_button last";
7306 8a217fa2 Olga Brani
                 *        
7307 8a217fa2 Olga Brani
                 *        nPaging.appendChild( nFirst );
7308 8a217fa2 Olga Brani
                 *        nPaging.appendChild( nPrevious );
7309 8a217fa2 Olga Brani
                 *        nPaging.appendChild( nNext );
7310 8a217fa2 Olga Brani
                 *        nPaging.appendChild( nLast );
7311 8a217fa2 Olga Brani
                 *        
7312 8a217fa2 Olga Brani
                 *        $(nFirst).click( function () {
7313 8a217fa2 Olga Brani
                 *          oSettings.oApi._fnPageChange( oSettings, "first" );
7314 8a217fa2 Olga Brani
                 *          fnCallbackDraw( oSettings );
7315 8a217fa2 Olga Brani
                 *        } );
7316 8a217fa2 Olga Brani
                 *        
7317 8a217fa2 Olga Brani
                 *        $(nPrevious).click( function() {
7318 8a217fa2 Olga Brani
                 *          oSettings.oApi._fnPageChange( oSettings, "previous" );
7319 8a217fa2 Olga Brani
                 *          fnCallbackDraw( oSettings );
7320 8a217fa2 Olga Brani
                 *        } );
7321 8a217fa2 Olga Brani
                 *        
7322 8a217fa2 Olga Brani
                 *        $(nNext).click( function() {
7323 8a217fa2 Olga Brani
                 *          oSettings.oApi._fnPageChange( oSettings, "next" );
7324 8a217fa2 Olga Brani
                 *          fnCallbackDraw( oSettings );
7325 8a217fa2 Olga Brani
                 *        } );
7326 8a217fa2 Olga Brani
                 *        
7327 8a217fa2 Olga Brani
                 *        $(nLast).click( function() {
7328 8a217fa2 Olga Brani
                 *          oSettings.oApi._fnPageChange( oSettings, "last" );
7329 8a217fa2 Olga Brani
                 *          fnCallbackDraw( oSettings );
7330 8a217fa2 Olga Brani
                 *        } );
7331 8a217fa2 Olga Brani
                 *        
7332 8a217fa2 Olga Brani
                 *        $(nFirst).bind( 'selectstart', function () { return false; } );
7333 8a217fa2 Olga Brani
                 *        $(nPrevious).bind( 'selectstart', function () { return false; } );
7334 8a217fa2 Olga Brani
                 *        $(nNext).bind( 'selectstart', function () { return false; } );
7335 8a217fa2 Olga Brani
                 *        $(nLast).bind( 'selectstart', function () { return false; } );
7336 8a217fa2 Olga Brani
                 *      },
7337 8a217fa2 Olga Brani
                 *      
7338 8a217fa2 Olga Brani
                 *      "fnUpdate": function ( oSettings, fnCallbackDraw ) {
7339 8a217fa2 Olga Brani
                 *        if ( !oSettings.aanFeatures.p ) {
7340 8a217fa2 Olga Brani
                 *          return;
7341 8a217fa2 Olga Brani
                 *        }
7342 8a217fa2 Olga Brani
                 *        
7343 8a217fa2 Olga Brani
                 *        // Loop over each instance of the pager
7344 8a217fa2 Olga Brani
                 *        var an = oSettings.aanFeatures.p;
7345 8a217fa2 Olga Brani
                 *        for ( var i=0, iLen=an.length ; i<iLen ; i++ ) {
7346 8a217fa2 Olga Brani
                 *          var buttons = an[i].getElementsByTagName('span');
7347 8a217fa2 Olga Brani
                 *          if ( oSettings._iDisplayStart === 0 ) {
7348 8a217fa2 Olga Brani
                 *            buttons[0].className = "paginate_disabled_previous";
7349 8a217fa2 Olga Brani
                 *            buttons[1].className = "paginate_disabled_previous";
7350 8a217fa2 Olga Brani
                 *          }
7351 8a217fa2 Olga Brani
                 *          else {
7352 8a217fa2 Olga Brani
                 *            buttons[0].className = "paginate_enabled_previous";
7353 8a217fa2 Olga Brani
                 *            buttons[1].className = "paginate_enabled_previous";
7354 8a217fa2 Olga Brani
                 *          }
7355 8a217fa2 Olga Brani
                 *          
7356 8a217fa2 Olga Brani
                 *          if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) {
7357 8a217fa2 Olga Brani
                 *            buttons[2].className = "paginate_disabled_next";
7358 8a217fa2 Olga Brani
                 *            buttons[3].className = "paginate_disabled_next";
7359 8a217fa2 Olga Brani
                 *          }
7360 8a217fa2 Olga Brani
                 *          else {
7361 8a217fa2 Olga Brani
                 *            buttons[2].className = "paginate_enabled_next";
7362 8a217fa2 Olga Brani
                 *            buttons[3].className = "paginate_enabled_next";
7363 8a217fa2 Olga Brani
                 *          }
7364 8a217fa2 Olga Brani
                 *        }
7365 8a217fa2 Olga Brani
                 *      }
7366 8a217fa2 Olga Brani
                 *    };
7367 8a217fa2 Olga Brani
                 */
7368 8a217fa2 Olga Brani
                "oPagination": {},
7369 8a217fa2 Olga Brani
        
7370 8a217fa2 Olga Brani
        
7371 8a217fa2 Olga Brani
                /**
7372 8a217fa2 Olga Brani
                 * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the
7373 8a217fa2 Olga Brani
                 * data column (you can add your own type detection functions, or override automatic 
7374 8a217fa2 Olga Brani
                 * detection using sType). With this specific type given to the column, DataTables will 
7375 8a217fa2 Olga Brani
                 * apply the required sort from the functions in the object. Each sort type must provide
7376 8a217fa2 Olga Brani
                 * two mandatory methods, one each for ascending and descending sorting, and can optionally
7377 8a217fa2 Olga Brani
                 * provide a pre-formatting method that will help speed up sorting by allowing DataTables
7378 8a217fa2 Olga Brani
                 * to pre-format the sort data only once (rather than every time the actual sort functions
7379 8a217fa2 Olga Brani
                 * are run). The two sorting functions are typical Javascript sort methods:
7380 8a217fa2 Olga Brani
                 *   <ul>
7381 8a217fa2 Olga Brani
             *     <li>
7382 8a217fa2 Olga Brani
             *       Function input parameters:
7383 8a217fa2 Olga Brani
             *       <ul>
7384 8a217fa2 Olga Brani
                 *         <li>{*} Data to compare to the second parameter</li>
7385 8a217fa2 Olga Brani
                 *         <li>{*} Data to compare to the first parameter</li>
7386 8a217fa2 Olga Brani
             *       </ul>
7387 8a217fa2 Olga Brani
             *     </li>
7388 8a217fa2 Olga Brani
                 *     <li>
7389 8a217fa2 Olga Brani
                 *       Function return:
7390 8a217fa2 Olga Brani
                 *       <ul>
7391 8a217fa2 Olga Brani
                 *         <li>{int} Sorting match: <0 if first parameter should be sorted lower than
7392 8a217fa2 Olga Brani
                 *           the second parameter, ===0 if the two parameters are equal and >0 if
7393 8a217fa2 Olga Brani
                 *           the first parameter should be sorted height than the second parameter.</li>
7394 8a217fa2 Olga Brani
                 *       </ul>
7395 8a217fa2 Olga Brani
                 *     </il>
7396 8a217fa2 Olga Brani
                 *   </ul>
7397 8a217fa2 Olga Brani
                 *  @type object
7398 8a217fa2 Olga Brani
                 *  @default {}
7399 8a217fa2 Olga Brani
                 *
7400 8a217fa2 Olga Brani
                 *  @example
7401 8a217fa2 Olga Brani
                 *    // Case-sensitive string sorting, with no pre-formatting method
7402 8a217fa2 Olga Brani
                 *    $.extend( $.fn.dataTableExt.oSort, {
7403 8a217fa2 Olga Brani
                 *      "string-case-asc": function(x,y) {
7404 8a217fa2 Olga Brani
                 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
7405 8a217fa2 Olga Brani
                 *      },
7406 8a217fa2 Olga Brani
                 *      "string-case-desc": function(x,y) {
7407 8a217fa2 Olga Brani
                 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
7408 8a217fa2 Olga Brani
                 *      }
7409 8a217fa2 Olga Brani
                 *    } );
7410 8a217fa2 Olga Brani
                 *
7411 8a217fa2 Olga Brani
                 *  @example
7412 8a217fa2 Olga Brani
                 *    // Case-insensitive string sorting, with pre-formatting
7413 8a217fa2 Olga Brani
                 *    $.extend( $.fn.dataTableExt.oSort, {
7414 8a217fa2 Olga Brani
                 *      "string-pre": function(x) {
7415 8a217fa2 Olga Brani
                 *        return x.toLowerCase();
7416 8a217fa2 Olga Brani
                 *      },
7417 8a217fa2 Olga Brani
                 *      "string-asc": function(x,y) {
7418 8a217fa2 Olga Brani
                 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
7419 8a217fa2 Olga Brani
                 *      },
7420 8a217fa2 Olga Brani
                 *      "string-desc": function(x,y) {
7421 8a217fa2 Olga Brani
                 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
7422 8a217fa2 Olga Brani
                 *      }
7423 8a217fa2 Olga Brani
                 *    } );
7424 8a217fa2 Olga Brani
                 */
7425 8a217fa2 Olga Brani
                "oSort": {},
7426 8a217fa2 Olga Brani
        
7427 8a217fa2 Olga Brani
        
7428 8a217fa2 Olga Brani
                /**
7429 8a217fa2 Olga Brani
                 * Version string for plug-ins to check compatibility. Allowed format is
7430 8a217fa2 Olga Brani
                 * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
7431 8a217fa2 Olga Brani
                 * e are optional
7432 8a217fa2 Olga Brani
                 *  @type string
7433 8a217fa2 Olga Brani
                 *  @default Version number
7434 8a217fa2 Olga Brani
                 */
7435 8a217fa2 Olga Brani
                "sVersion": DataTable.version,
7436 8a217fa2 Olga Brani
        
7437 8a217fa2 Olga Brani
        
7438 8a217fa2 Olga Brani
                /**
7439 8a217fa2 Olga Brani
                 * How should DataTables report an error. Can take the value 'alert' or 'throw'
7440 8a217fa2 Olga Brani
                 *  @type string
7441 8a217fa2 Olga Brani
                 *  @default alert
7442 8a217fa2 Olga Brani
                 */
7443 8a217fa2 Olga Brani
                "sErrMode": "alert",
7444 8a217fa2 Olga Brani
        
7445 8a217fa2 Olga Brani
        
7446 8a217fa2 Olga Brani
                /**
7447 8a217fa2 Olga Brani
                 * Store information for DataTables to access globally about other instances
7448 8a217fa2 Olga Brani
                 *  @namespace
7449 8a217fa2 Olga Brani
                 *  @private
7450 8a217fa2 Olga Brani
                 */
7451 8a217fa2 Olga Brani
                "_oExternConfig": {
7452 8a217fa2 Olga Brani
                        /* int:iNextUnique - next unique number for an instance */
7453 8a217fa2 Olga Brani
                        "iNextUnique": 0
7454 8a217fa2 Olga Brani
                }
7455 8a217fa2 Olga Brani
        };
7456 8a217fa2 Olga Brani
        
7457 8a217fa2 Olga Brani
        
7458 8a217fa2 Olga Brani
        
7459 8a217fa2 Olga Brani
        
7460 8a217fa2 Olga Brani
        /**
7461 8a217fa2 Olga Brani
         * Template object for the way in which DataTables holds information about
7462 8a217fa2 Olga Brani
         * search information for the global filter and individual column filters.
7463 8a217fa2 Olga Brani
         *  @namespace
7464 8a217fa2 Olga Brani
         */
7465 8a217fa2 Olga Brani
        DataTable.models.oSearch = {
7466 8a217fa2 Olga Brani
                /**
7467 8a217fa2 Olga Brani
                 * Flag to indicate if the filtering should be case insensitive or not
7468 8a217fa2 Olga Brani
                 *  @type boolean
7469 8a217fa2 Olga Brani
                 *  @default true
7470 8a217fa2 Olga Brani
                 */
7471 8a217fa2 Olga Brani
                "bCaseInsensitive": true,
7472 8a217fa2 Olga Brani
        
7473 8a217fa2 Olga Brani
                /**
7474 8a217fa2 Olga Brani
                 * Applied search term
7475 8a217fa2 Olga Brani
                 *  @type string
7476 8a217fa2 Olga Brani
                 *  @default <i>Empty string</i>
7477 8a217fa2 Olga Brani
                 */
7478 8a217fa2 Olga Brani
                "sSearch": "",
7479 8a217fa2 Olga Brani
        
7480 8a217fa2 Olga Brani
                /**
7481 8a217fa2 Olga Brani
                 * Flag to indicate if the search term should be interpreted as a
7482 8a217fa2 Olga Brani
                 * regular expression (true) or not (false) and therefore and special
7483 8a217fa2 Olga Brani
                 * regex characters escaped.
7484 8a217fa2 Olga Brani
                 *  @type boolean
7485 8a217fa2 Olga Brani
                 *  @default false
7486 8a217fa2 Olga Brani
                 */
7487 8a217fa2 Olga Brani
                "bRegex": false,
7488 8a217fa2 Olga Brani
        
7489 8a217fa2 Olga Brani
                /**
7490 8a217fa2 Olga Brani
                 * Flag to indicate if DataTables is to use its smart filtering or not.
7491 8a217fa2 Olga Brani
                 *  @type boolean
7492 8a217fa2 Olga Brani
                 *  @default true
7493 8a217fa2 Olga Brani
                 */
7494 8a217fa2 Olga Brani
                "bSmart": true
7495 8a217fa2 Olga Brani
        };
7496 8a217fa2 Olga Brani
        
7497 8a217fa2 Olga Brani
        
7498 8a217fa2 Olga Brani
        
7499 8a217fa2 Olga Brani
        
7500 8a217fa2 Olga Brani
        /**
7501 8a217fa2 Olga Brani
         * Template object for the way in which DataTables holds information about
7502 8a217fa2 Olga Brani
         * each individual row. This is the object format used for the settings 
7503 8a217fa2 Olga Brani
         * aoData array.
7504 8a217fa2 Olga Brani
         *  @namespace
7505 8a217fa2 Olga Brani
         */
7506 8a217fa2 Olga Brani
        DataTable.models.oRow = {
7507 8a217fa2 Olga Brani
                /**
7508 8a217fa2 Olga Brani
                 * TR element for the row
7509 8a217fa2 Olga Brani
                 *  @type node
7510 8a217fa2 Olga Brani
                 *  @default null
7511 8a217fa2 Olga Brani
                 */
7512 8a217fa2 Olga Brani
                "nTr": null,
7513 8a217fa2 Olga Brani
        
7514 8a217fa2 Olga Brani
                /**
7515 8a217fa2 Olga Brani
                 * Data object from the original data source for the row. This is either
7516 8a217fa2 Olga Brani
                 * an array if using the traditional form of DataTables, or an object if
7517 8a217fa2 Olga Brani
                 * using mData options. The exact type will depend on the passed in
7518 8a217fa2 Olga Brani
                 * data from the data source, or will be an array if using DOM a data 
7519 8a217fa2 Olga Brani
                 * source.
7520 8a217fa2 Olga Brani
                 *  @type array|object
7521 8a217fa2 Olga Brani
                 *  @default []
7522 8a217fa2 Olga Brani
                 */
7523 8a217fa2 Olga Brani
                "_aData": [],
7524 8a217fa2 Olga Brani
        
7525 8a217fa2 Olga Brani
                /**
7526 8a217fa2 Olga Brani
                 * Sorting data cache - this array is ostensibly the same length as the
7527 8a217fa2 Olga Brani
                 * number of columns (although each index is generated only as it is 
7528 8a217fa2 Olga Brani
                 * needed), and holds the data that is used for sorting each column in the
7529 8a217fa2 Olga Brani
                 * row. We do this cache generation at the start of the sort in order that
7530 8a217fa2 Olga Brani
                 * the formatting of the sort data need be done only once for each cell
7531 8a217fa2 Olga Brani
                 * per sort. This array should not be read from or written to by anything
7532 8a217fa2 Olga Brani
                 * other than the master sorting methods.
7533 8a217fa2 Olga Brani
                 *  @type array
7534 8a217fa2 Olga Brani
                 *  @default []
7535 8a217fa2 Olga Brani
                 *  @private
7536 8a217fa2 Olga Brani
                 */
7537 8a217fa2 Olga Brani
                "_aSortData": [],
7538 8a217fa2 Olga Brani
        
7539 8a217fa2 Olga Brani
                /**
7540 8a217fa2 Olga Brani
                 * Array of TD elements that are cached for hidden rows, so they can be
7541 8a217fa2 Olga Brani
                 * reinserted into the table if a column is made visible again (or to act
7542 8a217fa2 Olga Brani
                 * as a store if a column is made hidden). Only hidden columns have a 
7543 8a217fa2 Olga Brani
                 * reference in the array. For non-hidden columns the value is either
7544 8a217fa2 Olga Brani
                 * undefined or null.
7545 8a217fa2 Olga Brani
                 *  @type array nodes
7546 8a217fa2 Olga Brani
                 *  @default []
7547 8a217fa2 Olga Brani
                 *  @private
7548 8a217fa2 Olga Brani
                 */
7549 8a217fa2 Olga Brani
                "_anHidden": [],
7550 8a217fa2 Olga Brani
        
7551 8a217fa2 Olga Brani
                /**
7552 8a217fa2 Olga Brani
                 * Cache of the class name that DataTables has applied to the row, so we
7553 8a217fa2 Olga Brani
                 * can quickly look at this variable rather than needing to do a DOM check
7554 8a217fa2 Olga Brani
                 * on className for the nTr property.
7555 8a217fa2 Olga Brani
                 *  @type string
7556 8a217fa2 Olga Brani
                 *  @default <i>Empty string</i>
7557 8a217fa2 Olga Brani
                 *  @private
7558 8a217fa2 Olga Brani
                 */
7559 8a217fa2 Olga Brani
                "_sRowStripe": ""
7560 8a217fa2 Olga Brani
        };
7561 8a217fa2 Olga Brani
        
7562 8a217fa2 Olga Brani
        
7563 8a217fa2 Olga Brani
        
7564 8a217fa2 Olga Brani
        /**
7565 8a217fa2 Olga Brani
         * Template object for the column information object in DataTables. This object
7566 8a217fa2 Olga Brani
         * is held in the settings aoColumns array and contains all the information that
7567 8a217fa2 Olga Brani
         * DataTables needs about each individual column.
7568 8a217fa2 Olga Brani
         * 
7569 8a217fa2 Olga Brani
         * Note that this object is related to {@link DataTable.defaults.columns} 
7570 8a217fa2 Olga Brani
         * but this one is the internal data store for DataTables's cache of columns.
7571 8a217fa2 Olga Brani
         * It should NOT be manipulated outside of DataTables. Any configuration should
7572 8a217fa2 Olga Brani
         * be done through the initialisation options.
7573 8a217fa2 Olga Brani
         *  @namespace
7574 8a217fa2 Olga Brani
         */
7575 8a217fa2 Olga Brani
        DataTable.models.oColumn = {
7576 8a217fa2 Olga Brani
                /**
7577 8a217fa2 Olga Brani
                 * A list of the columns that sorting should occur on when this column
7578 8a217fa2 Olga Brani
                 * is sorted. That this property is an array allows multi-column sorting
7579 8a217fa2 Olga Brani
                 * to be defined for a column (for example first name / last name columns
7580 8a217fa2 Olga Brani
                 * would benefit from this). The values are integers pointing to the
7581 8a217fa2 Olga Brani
                 * columns to be sorted on (typically it will be a single integer pointing
7582 8a217fa2 Olga Brani
                 * at itself, but that doesn't need to be the case).
7583 8a217fa2 Olga Brani
                 *  @type array
7584 8a217fa2 Olga Brani
                 */
7585 8a217fa2 Olga Brani
                "aDataSort": null,
7586 8a217fa2 Olga Brani
        
7587 8a217fa2 Olga Brani
                /**
7588 8a217fa2 Olga Brani
                 * Define the sorting directions that are applied to the column, in sequence
7589 8a217fa2 Olga Brani
                 * as the column is repeatedly sorted upon - i.e. the first value is used
7590 8a217fa2 Olga Brani
                 * as the sorting direction when the column if first sorted (clicked on).
7591 8a217fa2 Olga Brani
                 * Sort it again (click again) and it will move on to the next index.
7592 8a217fa2 Olga Brani
                 * Repeat until loop.
7593 8a217fa2 Olga Brani
                 *  @type array
7594 8a217fa2 Olga Brani
                 */
7595 8a217fa2 Olga Brani
                "asSorting": null,
7596 8a217fa2 Olga Brani
                
7597 8a217fa2 Olga Brani
                /**
7598 8a217fa2 Olga Brani
                 * Flag to indicate if the column is searchable, and thus should be included
7599 8a217fa2 Olga Brani
                 * in the filtering or not.
7600 8a217fa2 Olga Brani
                 *  @type boolean
7601 8a217fa2 Olga Brani
                 */
7602 8a217fa2 Olga Brani
                "bSearchable": null,
7603 8a217fa2 Olga Brani
                
7604 8a217fa2 Olga Brani
                /**
7605 8a217fa2 Olga Brani
                 * Flag to indicate if the column is sortable or not.
7606 8a217fa2 Olga Brani
                 *  @type boolean
7607 8a217fa2 Olga Brani
                 */
7608 8a217fa2 Olga Brani
                "bSortable": null,
7609 8a217fa2 Olga Brani
                
7610 8a217fa2 Olga Brani
                /**
7611 8a217fa2 Olga Brani
                 * <code>Deprecated</code> When using fnRender, you have two options for what 
7612 8a217fa2 Olga Brani
                 * to do with the data, and this property serves as the switch. Firstly, you 
7613 8a217fa2 Olga Brani
                 * can have the sorting and filtering use the rendered value (true - default), 
7614 8a217fa2 Olga Brani
                 * or you can have the sorting and filtering us the original value (false).
7615 8a217fa2 Olga Brani
                 *
7616 8a217fa2 Olga Brani
                 * Please note that this option has now been deprecated and will be removed
7617 8a217fa2 Olga Brani
                 * in the next version of DataTables. Please use mRender / mData rather than
7618 8a217fa2 Olga Brani
                 * fnRender.
7619 8a217fa2 Olga Brani
                 *  @type boolean
7620 8a217fa2 Olga Brani
                 *  @deprecated
7621 8a217fa2 Olga Brani
                 */
7622 8a217fa2 Olga Brani
                "bUseRendered": null,
7623 8a217fa2 Olga Brani
                
7624 8a217fa2 Olga Brani
                /**
7625 8a217fa2 Olga Brani
                 * Flag to indicate if the column is currently visible in the table or not
7626 8a217fa2 Olga Brani
                 *  @type boolean
7627 8a217fa2 Olga Brani
                 */
7628 8a217fa2 Olga Brani
                "bVisible": null,
7629 8a217fa2 Olga Brani
                
7630 8a217fa2 Olga Brani
                /**
7631 8a217fa2 Olga Brani
                 * Flag to indicate to the type detection method if the automatic type
7632 8a217fa2 Olga Brani
                 * detection should be used, or if a column type (sType) has been specified
7633 8a217fa2 Olga Brani
                 *  @type boolean
7634 8a217fa2 Olga Brani
                 *  @default true
7635 8a217fa2 Olga Brani
                 *  @private
7636 8a217fa2 Olga Brani
                 */
7637 8a217fa2 Olga Brani
                "_bAutoType": true,
7638 8a217fa2 Olga Brani
                
7639 8a217fa2 Olga Brani
                /**
7640 8a217fa2 Olga Brani
                 * Developer definable function that is called whenever a cell is created (Ajax source,
7641 8a217fa2 Olga Brani
                 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
7642 8a217fa2 Olga Brani
                 * allowing you to modify the DOM element (add background colour for example) when the
7643 8a217fa2 Olga Brani
                 * element is available.
7644 8a217fa2 Olga Brani
                 *  @type function
7645 8a217fa2 Olga Brani
                 *  @param {element} nTd The TD node that has been created
7646 8a217fa2 Olga Brani
                 *  @param {*} sData The Data for the cell
7647 8a217fa2 Olga Brani
                 *  @param {array|object} oData The data for the whole row
7648 8a217fa2 Olga Brani
                 *  @param {int} iRow The row index for the aoData data store
7649 8a217fa2 Olga Brani
                 *  @default null
7650 8a217fa2 Olga Brani
                 */
7651 8a217fa2 Olga Brani
                "fnCreatedCell": null,
7652 8a217fa2 Olga Brani
                
7653 8a217fa2 Olga Brani
                /**
7654 8a217fa2 Olga Brani
                 * Function to get data from a cell in a column. You should <b>never</b>
7655 8a217fa2 Olga Brani
                 * access data directly through _aData internally in DataTables - always use
7656 8a217fa2 Olga Brani
                 * the method attached to this property. It allows mData to function as
7657 8a217fa2 Olga Brani
                 * required. This function is automatically assigned by the column 
7658 8a217fa2 Olga Brani
                 * initialisation method
7659 8a217fa2 Olga Brani
                 *  @type function
7660 8a217fa2 Olga Brani
                 *  @param {array|object} oData The data array/object for the array 
7661 8a217fa2 Olga Brani
                 *    (i.e. aoData[]._aData)
7662 8a217fa2 Olga Brani
                 *  @param {string} sSpecific The specific data type you want to get - 
7663 8a217fa2 Olga Brani
                 *    'display', 'type' 'filter' 'sort'
7664 8a217fa2 Olga Brani
                 *  @returns {*} The data for the cell from the given row's data
7665 8a217fa2 Olga Brani
                 *  @default null
7666 8a217fa2 Olga Brani
                 */
7667 8a217fa2 Olga Brani
                "fnGetData": null,
7668 8a217fa2 Olga Brani
                
7669 8a217fa2 Olga Brani
                /**
7670 8a217fa2 Olga Brani
                 * <code>Deprecated</code> Custom display function that will be called for the 
7671 8a217fa2 Olga Brani
                 * display of each cell in this column.
7672 8a217fa2 Olga Brani
                 *
7673 8a217fa2 Olga Brani
                 * Please note that this option has now been deprecated and will be removed
7674 8a217fa2 Olga Brani
                 * in the next version of DataTables. Please use mRender / mData rather than
7675 8a217fa2 Olga Brani
                 * fnRender.
7676 8a217fa2 Olga Brani
                 *  @type function
7677 8a217fa2 Olga Brani
                 *  @param {object} o Object with the following parameters:
7678 8a217fa2 Olga Brani
                 *  @param {int}    o.iDataRow The row in aoData
7679 8a217fa2 Olga Brani
                 *  @param {int}    o.iDataColumn The column in question
7680 8a217fa2 Olga Brani
                 *  @param {array}  o.aData The data for the row in question
7681 8a217fa2 Olga Brani
                 *  @param {object} o.oSettings The settings object for this DataTables instance
7682 8a217fa2 Olga Brani
                 *  @returns {string} The string you which to use in the display
7683 8a217fa2 Olga Brani
                 *  @default null
7684 8a217fa2 Olga Brani
                 *  @deprecated
7685 8a217fa2 Olga Brani
                 */
7686 8a217fa2 Olga Brani
                "fnRender": null,
7687 8a217fa2 Olga Brani
                
7688 8a217fa2 Olga Brani
                /**
7689 8a217fa2 Olga Brani
                 * Function to set data for a cell in the column. You should <b>never</b> 
7690 8a217fa2 Olga Brani
                 * set the data directly to _aData internally in DataTables - always use
7691 8a217fa2 Olga Brani
                 * this method. It allows mData to function as required. This function
7692 8a217fa2 Olga Brani
                 * is automatically assigned by the column initialisation method
7693 8a217fa2 Olga Brani
                 *  @type function
7694 8a217fa2 Olga Brani
                 *  @param {array|object} oData The data array/object for the array 
7695 8a217fa2 Olga Brani
                 *    (i.e. aoData[]._aData)
7696 8a217fa2 Olga Brani
                 *  @param {*} sValue Value to set
7697 8a217fa2 Olga Brani
                 *  @default null
7698 8a217fa2 Olga Brani
                 */
7699 8a217fa2 Olga Brani
                "fnSetData": null,
7700 8a217fa2 Olga Brani
                
7701 8a217fa2 Olga Brani
                /**
7702 8a217fa2 Olga Brani
                 * Property to read the value for the cells in the column from the data 
7703 8a217fa2 Olga Brani
                 * source array / object. If null, then the default content is used, if a
7704 8a217fa2 Olga Brani
                 * function is given then the return from the function is used.
7705 8a217fa2 Olga Brani
                 *  @type function|int|string|null
7706 8a217fa2 Olga Brani
                 *  @default null
7707 8a217fa2 Olga Brani
                 */
7708 8a217fa2 Olga Brani
                "mData": null,
7709 8a217fa2 Olga Brani
                
7710 8a217fa2 Olga Brani
                /**
7711 8a217fa2 Olga Brani
                 * Partner property to mData which is used (only when defined) to get
7712 8a217fa2 Olga Brani
                 * the data - i.e. it is basically the same as mData, but without the
7713 8a217fa2 Olga Brani
                 * 'set' option, and also the data fed to it is the result from mData.
7714 8a217fa2 Olga Brani
                 * This is the rendering method to match the data method of mData.
7715 8a217fa2 Olga Brani
                 *  @type function|int|string|null
7716 8a217fa2 Olga Brani
                 *  @default null
7717 8a217fa2 Olga Brani
                 */
7718 8a217fa2 Olga Brani
                "mRender": null,
7719 8a217fa2 Olga Brani
                
7720 8a217fa2 Olga Brani
                /**
7721 8a217fa2 Olga Brani
                 * Unique header TH/TD element for this column - this is what the sorting
7722 8a217fa2 Olga Brani
                 * listener is attached to (if sorting is enabled.)
7723 8a217fa2 Olga Brani
                 *  @type node
7724 8a217fa2 Olga Brani
                 *  @default null
7725 8a217fa2 Olga Brani
                 */
7726 8a217fa2 Olga Brani
                "nTh": null,
7727 8a217fa2 Olga Brani
                
7728 8a217fa2 Olga Brani
                /**
7729 8a217fa2 Olga Brani
                 * Unique footer TH/TD element for this column (if there is one). Not used 
7730 8a217fa2 Olga Brani
                 * in DataTables as such, but can be used for plug-ins to reference the 
7731 8a217fa2 Olga Brani
                 * footer for each column.
7732 8a217fa2 Olga Brani
                 *  @type node
7733 8a217fa2 Olga Brani
                 *  @default null
7734 8a217fa2 Olga Brani
                 */
7735 8a217fa2 Olga Brani
                "nTf": null,
7736 8a217fa2 Olga Brani
                
7737 8a217fa2 Olga Brani
                /**
7738 8a217fa2 Olga Brani
                 * The class to apply to all TD elements in the table's TBODY for the column
7739 8a217fa2 Olga Brani
                 *  @type string
7740 8a217fa2 Olga Brani
                 *  @default null
7741 8a217fa2 Olga Brani
                 */
7742 8a217fa2 Olga Brani
                "sClass": null,
7743 8a217fa2 Olga Brani
                
7744 8a217fa2 Olga Brani
                /**
7745 8a217fa2 Olga Brani
                 * When DataTables calculates the column widths to assign to each column,
7746 8a217fa2 Olga Brani
                 * it finds the longest string in each column and then constructs a
7747 8a217fa2 Olga Brani
                 * temporary table and reads the widths from that. The problem with this
7748 8a217fa2 Olga Brani
                 * is that "mmm" is much wider then "iiii", but the latter is a longer 
7749 8a217fa2 Olga Brani
                 * string - thus the calculation can go wrong (doing it properly and putting
7750 8a217fa2 Olga Brani
                 * it into an DOM object and measuring that is horribly(!) slow). Thus as
7751 8a217fa2 Olga Brani
                 * a "work around" we provide this option. It will append its value to the
7752 8a217fa2 Olga Brani
                 * text that is found to be the longest string for the column - i.e. padding.
7753 8a217fa2 Olga Brani
                 *  @type string
7754 8a217fa2 Olga Brani
                 */
7755 8a217fa2 Olga Brani
                "sContentPadding": null,
7756 8a217fa2 Olga Brani
                
7757 8a217fa2 Olga Brani
                /**
7758 8a217fa2 Olga Brani
                 * Allows a default value to be given for a column's data, and will be used
7759 8a217fa2 Olga Brani
                 * whenever a null data source is encountered (this can be because mData
7760 8a217fa2 Olga Brani
                 * is set to null, or because the data source itself is null).
7761 8a217fa2 Olga Brani
                 *  @type string
7762 8a217fa2 Olga Brani
                 *  @default null
7763 8a217fa2 Olga Brani
                 */
7764 8a217fa2 Olga Brani
                "sDefaultContent": null,
7765 8a217fa2 Olga Brani
                
7766 8a217fa2 Olga Brani
                /**
7767 8a217fa2 Olga Brani
                 * Name for the column, allowing reference to the column by name as well as
7768 8a217fa2 Olga Brani
                 * by index (needs a lookup to work by name).
7769 8a217fa2 Olga Brani
                 *  @type string
7770 8a217fa2 Olga Brani
                 */
7771 8a217fa2 Olga Brani
                "sName": null,
7772 8a217fa2 Olga Brani
                
7773 8a217fa2 Olga Brani
                /**
7774 8a217fa2 Olga Brani
                 * Custom sorting data type - defines which of the available plug-ins in
7775 8a217fa2 Olga Brani
                 * afnSortData the custom sorting will use - if any is defined.
7776 8a217fa2 Olga Brani
                 *  @type string
7777 8a217fa2 Olga Brani
                 *  @default std
7778 8a217fa2 Olga Brani
                 */
7779 8a217fa2 Olga Brani
                "sSortDataType": 'std',
7780 8a217fa2 Olga Brani
                
7781 8a217fa2 Olga Brani
                /**
7782 8a217fa2 Olga Brani
                 * Class to be applied to the header element when sorting on this column
7783 8a217fa2 Olga Brani
                 *  @type string
7784 8a217fa2 Olga Brani
                 *  @default null
7785 8a217fa2 Olga Brani
                 */
7786 8a217fa2 Olga Brani
                "sSortingClass": null,
7787 8a217fa2 Olga Brani
                
7788 8a217fa2 Olga Brani
                /**
7789 8a217fa2 Olga Brani
                 * Class to be applied to the header element when sorting on this column -
7790 8a217fa2 Olga Brani
                 * when jQuery UI theming is used.
7791 8a217fa2 Olga Brani
                 *  @type string
7792 8a217fa2 Olga Brani
                 *  @default null
7793 8a217fa2 Olga Brani
                 */
7794 8a217fa2 Olga Brani
                "sSortingClassJUI": null,
7795 8a217fa2 Olga Brani
                
7796 8a217fa2 Olga Brani
                /**
7797 8a217fa2 Olga Brani
                 * Title of the column - what is seen in the TH element (nTh).
7798 8a217fa2 Olga Brani
                 *  @type string
7799 8a217fa2 Olga Brani
                 */
7800 8a217fa2 Olga Brani
                "sTitle": null,
7801 8a217fa2 Olga Brani
                
7802 8a217fa2 Olga Brani
                /**
7803 8a217fa2 Olga Brani
                 * Column sorting and filtering type
7804 8a217fa2 Olga Brani
                 *  @type string
7805 8a217fa2 Olga Brani
                 *  @default null
7806 8a217fa2 Olga Brani
                 */
7807 8a217fa2 Olga Brani
                "sType": null,
7808 8a217fa2 Olga Brani
                
7809 8a217fa2 Olga Brani
                /**
7810 8a217fa2 Olga Brani
                 * Width of the column
7811 8a217fa2 Olga Brani
                 *  @type string
7812 8a217fa2 Olga Brani
                 *  @default null
7813 8a217fa2 Olga Brani
                 */
7814 8a217fa2 Olga Brani
                "sWidth": null,
7815 8a217fa2 Olga Brani
                
7816 8a217fa2 Olga Brani
                /**
7817 8a217fa2 Olga Brani
                 * Width of the column when it was first "encountered"
7818 8a217fa2 Olga Brani
                 *  @type string
7819 8a217fa2 Olga Brani
                 *  @default null
7820 8a217fa2 Olga Brani
                 */
7821 8a217fa2 Olga Brani
                "sWidthOrig": null
7822 8a217fa2 Olga Brani
        };
7823 8a217fa2 Olga Brani
        
7824 8a217fa2 Olga Brani
        
7825 8a217fa2 Olga Brani
        
7826 8a217fa2 Olga Brani
        /**
7827 8a217fa2 Olga Brani
         * Initialisation options that can be given to DataTables at initialisation 
7828 8a217fa2 Olga Brani
         * time.
7829 8a217fa2 Olga Brani
         *  @namespace
7830 8a217fa2 Olga Brani
         */
7831 8a217fa2 Olga Brani
        DataTable.defaults = {
7832 8a217fa2 Olga Brani
                /**
7833 8a217fa2 Olga Brani
                 * An array of data to use for the table, passed in at initialisation which 
7834 8a217fa2 Olga Brani
                 * will be used in preference to any data which is already in the DOM. This is
7835 8a217fa2 Olga Brani
                 * particularly useful for constructing tables purely in Javascript, for
7836 8a217fa2 Olga Brani
                 * example with a custom Ajax call.
7837 8a217fa2 Olga Brani
                 *  @type array
7838 8a217fa2 Olga Brani
                 *  @default null
7839 8a217fa2 Olga Brani
                 *  @dtopt Option
7840 8a217fa2 Olga Brani
                 * 
7841 8a217fa2 Olga Brani
                 *  @example
7842 8a217fa2 Olga Brani
                 *    // Using a 2D array data source
7843 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
7844 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7845 8a217fa2 Olga Brani
                 *        "aaData": [
7846 8a217fa2 Olga Brani
                 *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
7847 8a217fa2 Olga Brani
                 *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
7848 8a217fa2 Olga Brani
                 *        ],
7849 8a217fa2 Olga Brani
                 *        "aoColumns": [
7850 8a217fa2 Olga Brani
                 *          { "sTitle": "Engine" },
7851 8a217fa2 Olga Brani
                 *          { "sTitle": "Browser" },
7852 8a217fa2 Olga Brani
                 *          { "sTitle": "Platform" },
7853 8a217fa2 Olga Brani
                 *          { "sTitle": "Version" },
7854 8a217fa2 Olga Brani
                 *          { "sTitle": "Grade" }
7855 8a217fa2 Olga Brani
                 *        ]
7856 8a217fa2 Olga Brani
                 *      } );
7857 8a217fa2 Olga Brani
                 *    } );
7858 8a217fa2 Olga Brani
                 *    
7859 8a217fa2 Olga Brani
                 *  @example
7860 8a217fa2 Olga Brani
                 *    // Using an array of objects as a data source (mData)
7861 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
7862 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7863 8a217fa2 Olga Brani
                 *        "aaData": [
7864 8a217fa2 Olga Brani
                 *          {
7865 8a217fa2 Olga Brani
                 *            "engine":   "Trident",
7866 8a217fa2 Olga Brani
                 *            "browser":  "Internet Explorer 4.0",
7867 8a217fa2 Olga Brani
                 *            "platform": "Win 95+",
7868 8a217fa2 Olga Brani
                 *            "version":  4,
7869 8a217fa2 Olga Brani
                 *            "grade":    "X"
7870 8a217fa2 Olga Brani
                 *          },
7871 8a217fa2 Olga Brani
                 *          {
7872 8a217fa2 Olga Brani
                 *            "engine":   "Trident",
7873 8a217fa2 Olga Brani
                 *            "browser":  "Internet Explorer 5.0",
7874 8a217fa2 Olga Brani
                 *            "platform": "Win 95+",
7875 8a217fa2 Olga Brani
                 *            "version":  5,
7876 8a217fa2 Olga Brani
                 *            "grade":    "C"
7877 8a217fa2 Olga Brani
                 *          }
7878 8a217fa2 Olga Brani
                 *        ],
7879 8a217fa2 Olga Brani
                 *        "aoColumns": [
7880 8a217fa2 Olga Brani
                 *          { "sTitle": "Engine",   "mData": "engine" },
7881 8a217fa2 Olga Brani
                 *          { "sTitle": "Browser",  "mData": "browser" },
7882 8a217fa2 Olga Brani
                 *          { "sTitle": "Platform", "mData": "platform" },
7883 8a217fa2 Olga Brani
                 *          { "sTitle": "Version",  "mData": "version" },
7884 8a217fa2 Olga Brani
                 *          { "sTitle": "Grade",    "mData": "grade" }
7885 8a217fa2 Olga Brani
                 *        ]
7886 8a217fa2 Olga Brani
                 *      } );
7887 8a217fa2 Olga Brani
                 *    } );
7888 8a217fa2 Olga Brani
                 */
7889 8a217fa2 Olga Brani
                "aaData": null,
7890 8a217fa2 Olga Brani
        
7891 8a217fa2 Olga Brani
        
7892 8a217fa2 Olga Brani
                /**
7893 8a217fa2 Olga Brani
                 * If sorting is enabled, then DataTables will perform a first pass sort on 
7894 8a217fa2 Olga Brani
                 * initialisation. You can define which column(s) the sort is performed upon, 
7895 8a217fa2 Olga Brani
                 * and the sorting direction, with this variable. The aaSorting array should 
7896 8a217fa2 Olga Brani
                 * contain an array for each column to be sorted initially containing the 
7897 8a217fa2 Olga Brani
                 * column's index and a direction string ('asc' or 'desc').
7898 8a217fa2 Olga Brani
                 *  @type array
7899 8a217fa2 Olga Brani
                 *  @default [[0,'asc']]
7900 8a217fa2 Olga Brani
                 *  @dtopt Option
7901 8a217fa2 Olga Brani
                 * 
7902 8a217fa2 Olga Brani
                 *  @example
7903 8a217fa2 Olga Brani
                 *    // Sort by 3rd column first, and then 4th column
7904 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
7905 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7906 8a217fa2 Olga Brani
                 *        "aaSorting": [[2,'asc'], [3,'desc']]
7907 8a217fa2 Olga Brani
                 *      } );
7908 8a217fa2 Olga Brani
                 *    } );
7909 8a217fa2 Olga Brani
                 *    
7910 8a217fa2 Olga Brani
                 *    // No initial sorting
7911 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
7912 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7913 8a217fa2 Olga Brani
                 *        "aaSorting": []
7914 8a217fa2 Olga Brani
                 *      } );
7915 8a217fa2 Olga Brani
                 *    } );
7916 8a217fa2 Olga Brani
                 */
7917 8a217fa2 Olga Brani
                "aaSorting": [[0,'asc']],
7918 8a217fa2 Olga Brani
        
7919 8a217fa2 Olga Brani
        
7920 8a217fa2 Olga Brani
                /**
7921 8a217fa2 Olga Brani
                 * This parameter is basically identical to the aaSorting parameter, but 
7922 8a217fa2 Olga Brani
                 * cannot be overridden by user interaction with the table. What this means 
7923 8a217fa2 Olga Brani
                 * is that you could have a column (visible or hidden) which the sorting will 
7924 8a217fa2 Olga Brani
                 * always be forced on first - any sorting after that (from the user) will 
7925 8a217fa2 Olga Brani
                 * then be performed as required. This can be useful for grouping rows 
7926 8a217fa2 Olga Brani
                 * together.
7927 8a217fa2 Olga Brani
                 *  @type array
7928 8a217fa2 Olga Brani
                 *  @default null
7929 8a217fa2 Olga Brani
                 *  @dtopt Option
7930 8a217fa2 Olga Brani
                 * 
7931 8a217fa2 Olga Brani
                 *  @example
7932 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
7933 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7934 8a217fa2 Olga Brani
                 *        "aaSortingFixed": [[0,'asc']]
7935 8a217fa2 Olga Brani
                 *      } );
7936 8a217fa2 Olga Brani
                 *    } )
7937 8a217fa2 Olga Brani
                 */
7938 8a217fa2 Olga Brani
                "aaSortingFixed": null,
7939 8a217fa2 Olga Brani
        
7940 8a217fa2 Olga Brani
        
7941 8a217fa2 Olga Brani
                /**
7942 8a217fa2 Olga Brani
                 * This parameter allows you to readily specify the entries in the length drop
7943 8a217fa2 Olga Brani
                 * down menu that DataTables shows when pagination is enabled. It can be 
7944 8a217fa2 Olga Brani
                 * either a 1D array of options which will be used for both the displayed 
7945 8a217fa2 Olga Brani
                 * option and the value, or a 2D array which will use the array in the first 
7946 8a217fa2 Olga Brani
                 * position as the value, and the array in the second position as the 
7947 8a217fa2 Olga Brani
                 * displayed options (useful for language strings such as 'All').
7948 8a217fa2 Olga Brani
                 *  @type array
7949 8a217fa2 Olga Brani
                 *  @default [ 10, 25, 50, 100 ]
7950 8a217fa2 Olga Brani
                 *  @dtopt Option
7951 8a217fa2 Olga Brani
                 * 
7952 8a217fa2 Olga Brani
                 *  @example
7953 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
7954 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7955 8a217fa2 Olga Brani
                 *        "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
7956 8a217fa2 Olga Brani
                 *      } );
7957 8a217fa2 Olga Brani
                 *    } );
7958 8a217fa2 Olga Brani
                 *  
7959 8a217fa2 Olga Brani
                 *  @example
7960 8a217fa2 Olga Brani
                 *    // Setting the default display length as well as length menu
7961 8a217fa2 Olga Brani
                 *    // This is likely to be wanted if you remove the '10' option which
7962 8a217fa2 Olga Brani
                 *    // is the iDisplayLength default.
7963 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
7964 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
7965 8a217fa2 Olga Brani
                 *        "iDisplayLength": 25,
7966 8a217fa2 Olga Brani
                 *        "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
7967 8a217fa2 Olga Brani
                 *      } );
7968 8a217fa2 Olga Brani
                 *    } );
7969 8a217fa2 Olga Brani
                 */
7970 8a217fa2 Olga Brani
                "aLengthMenu": [ 10, 25, 50, 100 ],
7971 8a217fa2 Olga Brani
        
7972 8a217fa2 Olga Brani
        
7973 8a217fa2 Olga Brani
                /**
7974 8a217fa2 Olga Brani
                 * The aoColumns option in the initialisation parameter allows you to define
7975 8a217fa2 Olga Brani
                 * details about the way individual columns behave. For a full list of
7976 8a217fa2 Olga Brani
                 * column options that can be set, please see 
7977 8a217fa2 Olga Brani
                 * {@link DataTable.defaults.columns}. Note that if you use aoColumns to
7978 8a217fa2 Olga Brani
                 * define your columns, you must have an entry in the array for every single
7979 8a217fa2 Olga Brani
                 * column that you have in your table (these can be null if you don't which
7980 8a217fa2 Olga Brani
                 * to specify any options).
7981 8a217fa2 Olga Brani
                 *  @member
7982 8a217fa2 Olga Brani
                 */
7983 8a217fa2 Olga Brani
                "aoColumns": null,
7984 8a217fa2 Olga Brani
        
7985 8a217fa2 Olga Brani
                /**
7986 8a217fa2 Olga Brani
                 * Very similar to aoColumns, aoColumnDefs allows you to target a specific 
7987 8a217fa2 Olga Brani
                 * column, multiple columns, or all columns, using the aTargets property of 
7988 8a217fa2 Olga Brani
                 * each object in the array. This allows great flexibility when creating 
7989 8a217fa2 Olga Brani
                 * tables, as the aoColumnDefs arrays can be of any length, targeting the 
7990 8a217fa2 Olga Brani
                 * columns you specifically want. aoColumnDefs may use any of the column 
7991 8a217fa2 Olga Brani
                 * options available: {@link DataTable.defaults.columns}, but it _must_
7992 8a217fa2 Olga Brani
                 * have aTargets defined in each object in the array. Values in the aTargets
7993 8a217fa2 Olga Brani
                 * array may be:
7994 8a217fa2 Olga Brani
                 *   <ul>
7995 8a217fa2 Olga Brani
                 *     <li>a string - class name will be matched on the TH for the column</li>
7996 8a217fa2 Olga Brani
                 *     <li>0 or a positive integer - column index counting from the left</li>
7997 8a217fa2 Olga Brani
                 *     <li>a negative integer - column index counting from the right</li>
7998 8a217fa2 Olga Brani
                 *     <li>the string "_all" - all columns (i.e. assign a default)</li>
7999 8a217fa2 Olga Brani
                 *   </ul>
8000 8a217fa2 Olga Brani
                 *  @member
8001 8a217fa2 Olga Brani
                 */
8002 8a217fa2 Olga Brani
                "aoColumnDefs": null,
8003 8a217fa2 Olga Brani
        
8004 8a217fa2 Olga Brani
        
8005 8a217fa2 Olga Brani
                /**
8006 8a217fa2 Olga Brani
                 * Basically the same as oSearch, this parameter defines the individual column
8007 8a217fa2 Olga Brani
                 * filtering state at initialisation time. The array must be of the same size 
8008 8a217fa2 Olga Brani
                 * as the number of columns, and each element be an object with the parameters
8009 8a217fa2 Olga Brani
                 * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also
8010 8a217fa2 Olga Brani
                 * accepted and the default will be used.
8011 8a217fa2 Olga Brani
                 *  @type array
8012 8a217fa2 Olga Brani
                 *  @default []
8013 8a217fa2 Olga Brani
                 *  @dtopt Option
8014 8a217fa2 Olga Brani
                 * 
8015 8a217fa2 Olga Brani
                 *  @example
8016 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8017 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8018 8a217fa2 Olga Brani
                 *        "aoSearchCols": [
8019 8a217fa2 Olga Brani
                 *          null,
8020 8a217fa2 Olga Brani
                 *          { "sSearch": "My filter" },
8021 8a217fa2 Olga Brani
                 *          null,
8022 8a217fa2 Olga Brani
                 *          { "sSearch": "^[0-9]", "bEscapeRegex": false }
8023 8a217fa2 Olga Brani
                 *        ]
8024 8a217fa2 Olga Brani
                 *      } );
8025 8a217fa2 Olga Brani
                 *    } )
8026 8a217fa2 Olga Brani
                 */
8027 8a217fa2 Olga Brani
                "aoSearchCols": [],
8028 8a217fa2 Olga Brani
        
8029 8a217fa2 Olga Brani
        
8030 8a217fa2 Olga Brani
                /**
8031 8a217fa2 Olga Brani
                 * An array of CSS classes that should be applied to displayed rows. This 
8032 8a217fa2 Olga Brani
                 * array may be of any length, and DataTables will apply each class 
8033 8a217fa2 Olga Brani
                 * sequentially, looping when required.
8034 8a217fa2 Olga Brani
                 *  @type array
8035 8a217fa2 Olga Brani
                 *  @default null <i>Will take the values determined by the oClasses.sStripe*
8036 8a217fa2 Olga Brani
                 *    options</i>
8037 8a217fa2 Olga Brani
                 *  @dtopt Option
8038 8a217fa2 Olga Brani
                 * 
8039 8a217fa2 Olga Brani
                 *  @example
8040 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8041 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8042 8a217fa2 Olga Brani
                 *        "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ]
8043 8a217fa2 Olga Brani
                 *      } );
8044 8a217fa2 Olga Brani
                 *    } )
8045 8a217fa2 Olga Brani
                 */
8046 8a217fa2 Olga Brani
                "asStripeClasses": null,
8047 8a217fa2 Olga Brani
        
8048 8a217fa2 Olga Brani
        
8049 8a217fa2 Olga Brani
                /**
8050 8a217fa2 Olga Brani
                 * Enable or disable automatic column width calculation. This can be disabled
8051 8a217fa2 Olga Brani
                 * as an optimisation (it takes some time to calculate the widths) if the
8052 8a217fa2 Olga Brani
                 * tables widths are passed in using aoColumns.
8053 8a217fa2 Olga Brani
                 *  @type boolean
8054 8a217fa2 Olga Brani
                 *  @default true
8055 8a217fa2 Olga Brani
                 *  @dtopt Features
8056 8a217fa2 Olga Brani
                 * 
8057 8a217fa2 Olga Brani
                 *  @example
8058 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8059 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8060 8a217fa2 Olga Brani
                 *        "bAutoWidth": false
8061 8a217fa2 Olga Brani
                 *      } );
8062 8a217fa2 Olga Brani
                 *    } );
8063 8a217fa2 Olga Brani
                 */
8064 8a217fa2 Olga Brani
                "bAutoWidth": true,
8065 8a217fa2 Olga Brani
        
8066 8a217fa2 Olga Brani
        
8067 8a217fa2 Olga Brani
                /**
8068 8a217fa2 Olga Brani
                 * Deferred rendering can provide DataTables with a huge speed boost when you
8069 8a217fa2 Olga Brani
                 * are using an Ajax or JS data source for the table. This option, when set to
8070 8a217fa2 Olga Brani
                 * true, will cause DataTables to defer the creation of the table elements for
8071 8a217fa2 Olga Brani
                 * each row until they are needed for a draw - saving a significant amount of
8072 8a217fa2 Olga Brani
                 * time.
8073 8a217fa2 Olga Brani
                 *  @type boolean
8074 8a217fa2 Olga Brani
                 *  @default false
8075 8a217fa2 Olga Brani
                 *  @dtopt Features
8076 8a217fa2 Olga Brani
                 * 
8077 8a217fa2 Olga Brani
                 *  @example
8078 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8079 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
8080 8a217fa2 Olga Brani
                 *        "sAjaxSource": "sources/arrays.txt",
8081 8a217fa2 Olga Brani
                 *        "bDeferRender": true
8082 8a217fa2 Olga Brani
                 *      } );
8083 8a217fa2 Olga Brani
                 *    } );
8084 8a217fa2 Olga Brani
                 */
8085 8a217fa2 Olga Brani
                "bDeferRender": false,
8086 8a217fa2 Olga Brani
        
8087 8a217fa2 Olga Brani
        
8088 8a217fa2 Olga Brani
                /**
8089 8a217fa2 Olga Brani
                 * Replace a DataTable which matches the given selector and replace it with 
8090 8a217fa2 Olga Brani
                 * one which has the properties of the new initialisation object passed. If no
8091 8a217fa2 Olga Brani
                 * table matches the selector, then the new DataTable will be constructed as
8092 8a217fa2 Olga Brani
                 * per normal.
8093 8a217fa2 Olga Brani
                 *  @type boolean
8094 8a217fa2 Olga Brani
                 *  @default false
8095 8a217fa2 Olga Brani
                 *  @dtopt Options
8096 8a217fa2 Olga Brani
                 * 
8097 8a217fa2 Olga Brani
                 *  @example
8098 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8099 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8100 8a217fa2 Olga Brani
                 *        "sScrollY": "200px",
8101 8a217fa2 Olga Brani
                 *        "bPaginate": false
8102 8a217fa2 Olga Brani
                 *      } );
8103 8a217fa2 Olga Brani
                 *      
8104 8a217fa2 Olga Brani
                 *      // Some time later....
8105 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8106 8a217fa2 Olga Brani
                 *        "bFilter": false,
8107 8a217fa2 Olga Brani
                 *        "bDestroy": true
8108 8a217fa2 Olga Brani
                 *      } );
8109 8a217fa2 Olga Brani
                 *    } );
8110 8a217fa2 Olga Brani
                 */
8111 8a217fa2 Olga Brani
                "bDestroy": false,
8112 8a217fa2 Olga Brani
        
8113 8a217fa2 Olga Brani
        
8114 8a217fa2 Olga Brani
                /**
8115 8a217fa2 Olga Brani
                 * Enable or disable filtering of data. Filtering in DataTables is "smart" in
8116 8a217fa2 Olga Brani
                 * that it allows the end user to input multiple words (space separated) and
8117 8a217fa2 Olga Brani
                 * will match a row containing those words, even if not in the order that was
8118 8a217fa2 Olga Brani
                 * specified (this allow matching across multiple columns). Note that if you
8119 8a217fa2 Olga Brani
                 * wish to use filtering in DataTables this must remain 'true' - to remove the
8120 8a217fa2 Olga Brani
                 * default filtering input box and retain filtering abilities, please use
8121 8a217fa2 Olga Brani
                 * {@link DataTable.defaults.sDom}.
8122 8a217fa2 Olga Brani
                 *  @type boolean
8123 8a217fa2 Olga Brani
                 *  @default true
8124 8a217fa2 Olga Brani
                 *  @dtopt Features
8125 8a217fa2 Olga Brani
                 * 
8126 8a217fa2 Olga Brani
                 *  @example
8127 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8128 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8129 8a217fa2 Olga Brani
                 *        "bFilter": false
8130 8a217fa2 Olga Brani
                 *      } );
8131 8a217fa2 Olga Brani
                 *    } );
8132 8a217fa2 Olga Brani
                 */
8133 8a217fa2 Olga Brani
                "bFilter": true,
8134 8a217fa2 Olga Brani
        
8135 8a217fa2 Olga Brani
        
8136 8a217fa2 Olga Brani
                /**
8137 8a217fa2 Olga Brani
                 * Enable or disable the table information display. This shows information 
8138 8a217fa2 Olga Brani
                 * about the data that is currently visible on the page, including information
8139 8a217fa2 Olga Brani
                 * about filtered data if that action is being performed.
8140 8a217fa2 Olga Brani
                 *  @type boolean
8141 8a217fa2 Olga Brani
                 *  @default true
8142 8a217fa2 Olga Brani
                 *  @dtopt Features
8143 8a217fa2 Olga Brani
                 * 
8144 8a217fa2 Olga Brani
                 *  @example
8145 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8146 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8147 8a217fa2 Olga Brani
                 *        "bInfo": false
8148 8a217fa2 Olga Brani
                 *      } );
8149 8a217fa2 Olga Brani
                 *    } );
8150 8a217fa2 Olga Brani
                 */
8151 8a217fa2 Olga Brani
                "bInfo": true,
8152 8a217fa2 Olga Brani
        
8153 8a217fa2 Olga Brani
        
8154 8a217fa2 Olga Brani
                /**
8155 8a217fa2 Olga Brani
                 * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
8156 8a217fa2 Olga Brani
                 * slightly different and additional mark-up from what DataTables has
8157 8a217fa2 Olga Brani
                 * traditionally used).
8158 8a217fa2 Olga Brani
                 *  @type boolean
8159 8a217fa2 Olga Brani
                 *  @default false
8160 8a217fa2 Olga Brani
                 *  @dtopt Features
8161 8a217fa2 Olga Brani
                 * 
8162 8a217fa2 Olga Brani
                 *  @example
8163 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8164 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8165 8a217fa2 Olga Brani
                 *        "bJQueryUI": true
8166 8a217fa2 Olga Brani
                 *      } );
8167 8a217fa2 Olga Brani
                 *    } );
8168 8a217fa2 Olga Brani
                 */
8169 8a217fa2 Olga Brani
                "bJQueryUI": false,
8170 8a217fa2 Olga Brani
        
8171 8a217fa2 Olga Brani
        
8172 8a217fa2 Olga Brani
                /**
8173 8a217fa2 Olga Brani
                 * Allows the end user to select the size of a formatted page from a select
8174 8a217fa2 Olga Brani
                 * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate).
8175 8a217fa2 Olga Brani
                 *  @type boolean
8176 8a217fa2 Olga Brani
                 *  @default true
8177 8a217fa2 Olga Brani
                 *  @dtopt Features
8178 8a217fa2 Olga Brani
                 * 
8179 8a217fa2 Olga Brani
                 *  @example
8180 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8181 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8182 8a217fa2 Olga Brani
                 *        "bLengthChange": false
8183 8a217fa2 Olga Brani
                 *      } );
8184 8a217fa2 Olga Brani
                 *    } );
8185 8a217fa2 Olga Brani
                 */
8186 8a217fa2 Olga Brani
                "bLengthChange": true,
8187 8a217fa2 Olga Brani
        
8188 8a217fa2 Olga Brani
        
8189 8a217fa2 Olga Brani
                /**
8190 8a217fa2 Olga Brani
                 * Enable or disable pagination.
8191 8a217fa2 Olga Brani
                 *  @type boolean
8192 8a217fa2 Olga Brani
                 *  @default true
8193 8a217fa2 Olga Brani
                 *  @dtopt Features
8194 8a217fa2 Olga Brani
                 * 
8195 8a217fa2 Olga Brani
                 *  @example
8196 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8197 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8198 8a217fa2 Olga Brani
                 *        "bPaginate": false
8199 8a217fa2 Olga Brani
                 *      } );
8200 8a217fa2 Olga Brani
                 *    } );
8201 8a217fa2 Olga Brani
                 */
8202 8a217fa2 Olga Brani
                "bPaginate": true,
8203 8a217fa2 Olga Brani
        
8204 8a217fa2 Olga Brani
        
8205 8a217fa2 Olga Brani
                /**
8206 8a217fa2 Olga Brani
                 * Enable or disable the display of a 'processing' indicator when the table is
8207 8a217fa2 Olga Brani
                 * being processed (e.g. a sort). This is particularly useful for tables with
8208 8a217fa2 Olga Brani
                 * large amounts of data where it can take a noticeable amount of time to sort
8209 8a217fa2 Olga Brani
                 * the entries.
8210 8a217fa2 Olga Brani
                 *  @type boolean
8211 8a217fa2 Olga Brani
                 *  @default false
8212 8a217fa2 Olga Brani
                 *  @dtopt Features
8213 8a217fa2 Olga Brani
                 * 
8214 8a217fa2 Olga Brani
                 *  @example
8215 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8216 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8217 8a217fa2 Olga Brani
                 *        "bProcessing": true
8218 8a217fa2 Olga Brani
                 *      } );
8219 8a217fa2 Olga Brani
                 *    } );
8220 8a217fa2 Olga Brani
                 */
8221 8a217fa2 Olga Brani
                "bProcessing": false,
8222 8a217fa2 Olga Brani
        
8223 8a217fa2 Olga Brani
        
8224 8a217fa2 Olga Brani
                /**
8225 8a217fa2 Olga Brani
                 * Retrieve the DataTables object for the given selector. Note that if the
8226 8a217fa2 Olga Brani
                 * table has already been initialised, this parameter will cause DataTables
8227 8a217fa2 Olga Brani
                 * to simply return the object that has already been set up - it will not take
8228 8a217fa2 Olga Brani
                 * account of any changes you might have made to the initialisation object
8229 8a217fa2 Olga Brani
                 * passed to DataTables (setting this parameter to true is an acknowledgement
8230 8a217fa2 Olga Brani
                 * that you understand this). bDestroy can be used to reinitialise a table if
8231 8a217fa2 Olga Brani
                 * you need.
8232 8a217fa2 Olga Brani
                 *  @type boolean
8233 8a217fa2 Olga Brani
                 *  @default false
8234 8a217fa2 Olga Brani
                 *  @dtopt Options
8235 8a217fa2 Olga Brani
                 * 
8236 8a217fa2 Olga Brani
                 *  @example
8237 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8238 8a217fa2 Olga Brani
                 *      initTable();
8239 8a217fa2 Olga Brani
                 *      tableActions();
8240 8a217fa2 Olga Brani
                 *    } );
8241 8a217fa2 Olga Brani
                 *    
8242 8a217fa2 Olga Brani
                 *    function initTable ()
8243 8a217fa2 Olga Brani
                 *    {
8244 8a217fa2 Olga Brani
                 *      return $('#example').dataTable( {
8245 8a217fa2 Olga Brani
                 *        "sScrollY": "200px",
8246 8a217fa2 Olga Brani
                 *        "bPaginate": false,
8247 8a217fa2 Olga Brani
                 *        "bRetrieve": true
8248 8a217fa2 Olga Brani
                 *      } );
8249 8a217fa2 Olga Brani
                 *    }
8250 8a217fa2 Olga Brani
                 *    
8251 8a217fa2 Olga Brani
                 *    function tableActions ()
8252 8a217fa2 Olga Brani
                 *    {
8253 8a217fa2 Olga Brani
                 *      var oTable = initTable();
8254 8a217fa2 Olga Brani
                 *      // perform API operations with oTable 
8255 8a217fa2 Olga Brani
                 *    }
8256 8a217fa2 Olga Brani
                 */
8257 8a217fa2 Olga Brani
                "bRetrieve": false,
8258 8a217fa2 Olga Brani
        
8259 8a217fa2 Olga Brani
        
8260 8a217fa2 Olga Brani
                /**
8261 8a217fa2 Olga Brani
                 * Indicate if DataTables should be allowed to set the padding / margin
8262 8a217fa2 Olga Brani
                 * etc for the scrolling header elements or not. Typically you will want
8263 8a217fa2 Olga Brani
                 * this.
8264 8a217fa2 Olga Brani
                 *  @type boolean
8265 8a217fa2 Olga Brani
                 *  @default true
8266 8a217fa2 Olga Brani
                 *  @dtopt Options
8267 8a217fa2 Olga Brani
                 * 
8268 8a217fa2 Olga Brani
                 *  @example
8269 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8270 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8271 8a217fa2 Olga Brani
                 *        "bScrollAutoCss": false,
8272 8a217fa2 Olga Brani
                 *        "sScrollY": "200px"
8273 8a217fa2 Olga Brani
                 *      } );
8274 8a217fa2 Olga Brani
                 *    } );
8275 8a217fa2 Olga Brani
                 */
8276 8a217fa2 Olga Brani
                "bScrollAutoCss": true,
8277 8a217fa2 Olga Brani
        
8278 8a217fa2 Olga Brani
        
8279 8a217fa2 Olga Brani
                /**
8280 8a217fa2 Olga Brani
                 * When vertical (y) scrolling is enabled, DataTables will force the height of
8281 8a217fa2 Olga Brani
                 * the table's viewport to the given height at all times (useful for layout).
8282 8a217fa2 Olga Brani
                 * However, this can look odd when filtering data down to a small data set,
8283 8a217fa2 Olga Brani
                 * and the footer is left "floating" further down. This parameter (when
8284 8a217fa2 Olga Brani
                 * enabled) will cause DataTables to collapse the table's viewport down when
8285 8a217fa2 Olga Brani
                 * the result set will fit within the given Y height.
8286 8a217fa2 Olga Brani
                 *  @type boolean
8287 8a217fa2 Olga Brani
                 *  @default false
8288 8a217fa2 Olga Brani
                 *  @dtopt Options
8289 8a217fa2 Olga Brani
                 * 
8290 8a217fa2 Olga Brani
                 *  @example
8291 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8292 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8293 8a217fa2 Olga Brani
                 *        "sScrollY": "200",
8294 8a217fa2 Olga Brani
                 *        "bScrollCollapse": true
8295 8a217fa2 Olga Brani
                 *      } );
8296 8a217fa2 Olga Brani
                 *    } );
8297 8a217fa2 Olga Brani
                 */
8298 8a217fa2 Olga Brani
                "bScrollCollapse": false,
8299 8a217fa2 Olga Brani
        
8300 8a217fa2 Olga Brani
        
8301 8a217fa2 Olga Brani
                /**
8302 8a217fa2 Olga Brani
                 * Enable infinite scrolling for DataTables (to be used in combination with
8303 8a217fa2 Olga Brani
                 * sScrollY). Infinite scrolling means that DataTables will continually load
8304 8a217fa2 Olga Brani
                 * data as a user scrolls through a table, which is very useful for large
8305 8a217fa2 Olga Brani
                 * dataset. This cannot be used with pagination, which is automatically
8306 8a217fa2 Olga Brani
                 * disabled. Note - the Scroller extra for DataTables is recommended in
8307 8a217fa2 Olga Brani
                 * in preference to this option.
8308 8a217fa2 Olga Brani
                 *  @type boolean
8309 8a217fa2 Olga Brani
                 *  @default false
8310 8a217fa2 Olga Brani
                 *  @dtopt Features
8311 8a217fa2 Olga Brani
                 * 
8312 8a217fa2 Olga Brani
                 *  @example
8313 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8314 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8315 8a217fa2 Olga Brani
                 *        "bScrollInfinite": true,
8316 8a217fa2 Olga Brani
                 *        "bScrollCollapse": true,
8317 8a217fa2 Olga Brani
                 *        "sScrollY": "200px"
8318 8a217fa2 Olga Brani
                 *      } );
8319 8a217fa2 Olga Brani
                 *    } );
8320 8a217fa2 Olga Brani
                 */
8321 8a217fa2 Olga Brani
                "bScrollInfinite": false,
8322 8a217fa2 Olga Brani
        
8323 8a217fa2 Olga Brani
        
8324 8a217fa2 Olga Brani
                /**
8325 8a217fa2 Olga Brani
                 * Configure DataTables to use server-side processing. Note that the
8326 8a217fa2 Olga Brani
                 * sAjaxSource parameter must also be given in order to give DataTables a
8327 8a217fa2 Olga Brani
                 * source to obtain the required data for each draw.
8328 8a217fa2 Olga Brani
                 *  @type boolean
8329 8a217fa2 Olga Brani
                 *  @default false
8330 8a217fa2 Olga Brani
                 *  @dtopt Features
8331 8a217fa2 Olga Brani
                 *  @dtopt Server-side
8332 8a217fa2 Olga Brani
                 * 
8333 8a217fa2 Olga Brani
                 *  @example
8334 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8335 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8336 8a217fa2 Olga Brani
                 *        "bServerSide": true,
8337 8a217fa2 Olga Brani
                 *        "sAjaxSource": "xhr.php"
8338 8a217fa2 Olga Brani
                 *      } );
8339 8a217fa2 Olga Brani
                 *    } );
8340 8a217fa2 Olga Brani
                 */
8341 8a217fa2 Olga Brani
                "bServerSide": false,
8342 8a217fa2 Olga Brani
        
8343 8a217fa2 Olga Brani
        
8344 8a217fa2 Olga Brani
                /**
8345 8a217fa2 Olga Brani
                 * Enable or disable sorting of columns. Sorting of individual columns can be
8346 8a217fa2 Olga Brani
                 * disabled by the "bSortable" option for each column.
8347 8a217fa2 Olga Brani
                 *  @type boolean
8348 8a217fa2 Olga Brani
                 *  @default true
8349 8a217fa2 Olga Brani
                 *  @dtopt Features
8350 8a217fa2 Olga Brani
                 * 
8351 8a217fa2 Olga Brani
                 *  @example
8352 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8353 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8354 8a217fa2 Olga Brani
                 *        "bSort": false
8355 8a217fa2 Olga Brani
                 *      } );
8356 8a217fa2 Olga Brani
                 *    } );
8357 8a217fa2 Olga Brani
                 */
8358 8a217fa2 Olga Brani
                "bSort": true,
8359 8a217fa2 Olga Brani
        
8360 8a217fa2 Olga Brani
        
8361 8a217fa2 Olga Brani
                /**
8362 8a217fa2 Olga Brani
                 * Allows control over whether DataTables should use the top (true) unique
8363 8a217fa2 Olga Brani
                 * cell that is found for a single column, or the bottom (false - default).
8364 8a217fa2 Olga Brani
                 * This is useful when using complex headers.
8365 8a217fa2 Olga Brani
                 *  @type boolean
8366 8a217fa2 Olga Brani
                 *  @default false
8367 8a217fa2 Olga Brani
                 *  @dtopt Options
8368 8a217fa2 Olga Brani
                 * 
8369 8a217fa2 Olga Brani
                 *  @example
8370 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8371 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8372 8a217fa2 Olga Brani
                 *        "bSortCellsTop": true
8373 8a217fa2 Olga Brani
                 *      } );
8374 8a217fa2 Olga Brani
                 *    } );
8375 8a217fa2 Olga Brani
                 */
8376 8a217fa2 Olga Brani
                "bSortCellsTop": false,
8377 8a217fa2 Olga Brani
        
8378 8a217fa2 Olga Brani
        
8379 8a217fa2 Olga Brani
                /**
8380 8a217fa2 Olga Brani
                 * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and
8381 8a217fa2 Olga Brani
                 * 'sorting_3' to the columns which are currently being sorted on. This is
8382 8a217fa2 Olga Brani
                 * presented as a feature switch as it can increase processing time (while
8383 8a217fa2 Olga Brani
                 * classes are removed and added) so for large data sets you might want to
8384 8a217fa2 Olga Brani
                 * turn this off.
8385 8a217fa2 Olga Brani
                 *  @type boolean
8386 8a217fa2 Olga Brani
                 *  @default true
8387 8a217fa2 Olga Brani
                 *  @dtopt Features
8388 8a217fa2 Olga Brani
                 * 
8389 8a217fa2 Olga Brani
                 *  @example
8390 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8391 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8392 8a217fa2 Olga Brani
                 *        "bSortClasses": false
8393 8a217fa2 Olga Brani
                 *      } );
8394 8a217fa2 Olga Brani
                 *    } );
8395 8a217fa2 Olga Brani
                 */
8396 8a217fa2 Olga Brani
                "bSortClasses": true,
8397 8a217fa2 Olga Brani
        
8398 8a217fa2 Olga Brani
        
8399 8a217fa2 Olga Brani
                /**
8400 8a217fa2 Olga Brani
                 * Enable or disable state saving. When enabled a cookie will be used to save
8401 8a217fa2 Olga Brani
                 * table display information such as pagination information, display length,
8402 8a217fa2 Olga Brani
                 * filtering and sorting. As such when the end user reloads the page the
8403 8a217fa2 Olga Brani
                 * display display will match what thy had previously set up.
8404 8a217fa2 Olga Brani
                 *  @type boolean
8405 8a217fa2 Olga Brani
                 *  @default false
8406 8a217fa2 Olga Brani
                 *  @dtopt Features
8407 8a217fa2 Olga Brani
                 * 
8408 8a217fa2 Olga Brani
                 *  @example
8409 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8410 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8411 8a217fa2 Olga Brani
                 *        "bStateSave": true
8412 8a217fa2 Olga Brani
                 *      } );
8413 8a217fa2 Olga Brani
                 *    } );
8414 8a217fa2 Olga Brani
                 */
8415 8a217fa2 Olga Brani
                "bStateSave": false,
8416 8a217fa2 Olga Brani
        
8417 8a217fa2 Olga Brani
        
8418 8a217fa2 Olga Brani
                /**
8419 8a217fa2 Olga Brani
                 * Customise the cookie and / or the parameters being stored when using
8420 8a217fa2 Olga Brani
                 * DataTables with state saving enabled. This function is called whenever
8421 8a217fa2 Olga Brani
                 * the cookie is modified, and it expects a fully formed cookie string to be
8422 8a217fa2 Olga Brani
                 * returned. Note that the data object passed in is a Javascript object which
8423 8a217fa2 Olga Brani
                 * must be converted to a string (JSON.stringify for example).
8424 8a217fa2 Olga Brani
                 *  @type function
8425 8a217fa2 Olga Brani
                 *  @param {string} sName Name of the cookie defined by DataTables
8426 8a217fa2 Olga Brani
                 *  @param {object} oData Data to be stored in the cookie
8427 8a217fa2 Olga Brani
                 *  @param {string} sExpires Cookie expires string
8428 8a217fa2 Olga Brani
                 *  @param {string} sPath Path of the cookie to set
8429 8a217fa2 Olga Brani
                 *  @returns {string} Cookie formatted string (which should be encoded by
8430 8a217fa2 Olga Brani
                 *    using encodeURIComponent())
8431 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8432 8a217fa2 Olga Brani
                 * 
8433 8a217fa2 Olga Brani
                 *  @example
8434 8a217fa2 Olga Brani
                 *    $(document).ready( function () {
8435 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8436 8a217fa2 Olga Brani
                 *        "fnCookieCallback": function (sName, oData, sExpires, sPath) {
8437 8a217fa2 Olga Brani
                 *          // Customise oData or sName or whatever else here
8438 8a217fa2 Olga Brani
                 *          return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath;
8439 8a217fa2 Olga Brani
                 *        }
8440 8a217fa2 Olga Brani
                 *      } );
8441 8a217fa2 Olga Brani
                 *    } );
8442 8a217fa2 Olga Brani
                 */
8443 8a217fa2 Olga Brani
                "fnCookieCallback": null,
8444 8a217fa2 Olga Brani
        
8445 8a217fa2 Olga Brani
        
8446 8a217fa2 Olga Brani
                /**
8447 8a217fa2 Olga Brani
                 * This function is called when a TR element is created (and all TD child
8448 8a217fa2 Olga Brani
                 * elements have been inserted), or registered if using a DOM source, allowing
8449 8a217fa2 Olga Brani
                 * manipulation of the TR element (adding classes etc).
8450 8a217fa2 Olga Brani
                 *  @type function
8451 8a217fa2 Olga Brani
                 *  @param {node} nRow "TR" element for the current row
8452 8a217fa2 Olga Brani
                 *  @param {array} aData Raw data array for this row
8453 8a217fa2 Olga Brani
                 *  @param {int} iDataIndex The index of this row in aoData
8454 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8455 8a217fa2 Olga Brani
                 * 
8456 8a217fa2 Olga Brani
                 *  @example
8457 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8458 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8459 8a217fa2 Olga Brani
                 *        "fnCreatedRow": function( nRow, aData, iDataIndex ) {
8460 8a217fa2 Olga Brani
                 *          // Bold the grade for all 'A' grade browsers
8461 8a217fa2 Olga Brani
                 *          if ( aData[4] == "A" )
8462 8a217fa2 Olga Brani
                 *          {
8463 8a217fa2 Olga Brani
                 *            $('td:eq(4)', nRow).html( '<b>A</b>' );
8464 8a217fa2 Olga Brani
                 *          }
8465 8a217fa2 Olga Brani
                 *        }
8466 8a217fa2 Olga Brani
                 *      } );
8467 8a217fa2 Olga Brani
                 *    } );
8468 8a217fa2 Olga Brani
                 */
8469 8a217fa2 Olga Brani
                "fnCreatedRow": null,
8470 8a217fa2 Olga Brani
        
8471 8a217fa2 Olga Brani
        
8472 8a217fa2 Olga Brani
                /**
8473 8a217fa2 Olga Brani
                 * This function is called on every 'draw' event, and allows you to
8474 8a217fa2 Olga Brani
                 * dynamically modify any aspect you want about the created DOM.
8475 8a217fa2 Olga Brani
                 *  @type function
8476 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8477 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8478 8a217fa2 Olga Brani
                 * 
8479 8a217fa2 Olga Brani
                 *  @example
8480 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8481 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8482 8a217fa2 Olga Brani
                 *        "fnDrawCallback": function( oSettings ) {
8483 8a217fa2 Olga Brani
                 *          alert( 'DataTables has redrawn the table' );
8484 8a217fa2 Olga Brani
                 *        }
8485 8a217fa2 Olga Brani
                 *      } );
8486 8a217fa2 Olga Brani
                 *    } );
8487 8a217fa2 Olga Brani
                 */
8488 8a217fa2 Olga Brani
                "fnDrawCallback": null,
8489 8a217fa2 Olga Brani
        
8490 8a217fa2 Olga Brani
        
8491 8a217fa2 Olga Brani
                /**
8492 8a217fa2 Olga Brani
                 * Identical to fnHeaderCallback() but for the table footer this function
8493 8a217fa2 Olga Brani
                 * allows you to modify the table footer on every 'draw' even.
8494 8a217fa2 Olga Brani
                 *  @type function
8495 8a217fa2 Olga Brani
                 *  @param {node} nFoot "TR" element for the footer
8496 8a217fa2 Olga Brani
                 *  @param {array} aData Full table data (as derived from the original HTML)
8497 8a217fa2 Olga Brani
                 *  @param {int} iStart Index for the current display starting point in the 
8498 8a217fa2 Olga Brani
                 *    display array
8499 8a217fa2 Olga Brani
                 *  @param {int} iEnd Index for the current display ending point in the 
8500 8a217fa2 Olga Brani
                 *    display array
8501 8a217fa2 Olga Brani
                 *  @param {array int} aiDisplay Index array to translate the visual position
8502 8a217fa2 Olga Brani
                 *    to the full data array
8503 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8504 8a217fa2 Olga Brani
                 * 
8505 8a217fa2 Olga Brani
                 *  @example
8506 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8507 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8508 8a217fa2 Olga Brani
                 *        "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) {
8509 8a217fa2 Olga Brani
                 *          nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart;
8510 8a217fa2 Olga Brani
                 *        }
8511 8a217fa2 Olga Brani
                 *      } );
8512 8a217fa2 Olga Brani
                 *    } )
8513 8a217fa2 Olga Brani
                 */
8514 8a217fa2 Olga Brani
                "fnFooterCallback": null,
8515 8a217fa2 Olga Brani
        
8516 8a217fa2 Olga Brani
        
8517 8a217fa2 Olga Brani
                /**
8518 8a217fa2 Olga Brani
                 * When rendering large numbers in the information element for the table
8519 8a217fa2 Olga Brani
                 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
8520 8a217fa2 Olga Brani
                 * to have a comma separator for the 'thousands' units (e.g. 1 million is
8521 8a217fa2 Olga Brani
                 * rendered as "1,000,000") to help readability for the end user. This
8522 8a217fa2 Olga Brani
                 * function will override the default method DataTables uses.
8523 8a217fa2 Olga Brani
                 *  @type function
8524 8a217fa2 Olga Brani
                 *  @member
8525 8a217fa2 Olga Brani
                 *  @param {int} iIn number to be formatted
8526 8a217fa2 Olga Brani
                 *  @returns {string} formatted string for DataTables to show the number
8527 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8528 8a217fa2 Olga Brani
                 * 
8529 8a217fa2 Olga Brani
                 *  @example
8530 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8531 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8532 8a217fa2 Olga Brani
                 *        "fnFormatNumber": function ( iIn ) {
8533 8a217fa2 Olga Brani
                 *          if ( iIn &lt; 1000 ) {
8534 8a217fa2 Olga Brani
                 *            return iIn;
8535 8a217fa2 Olga Brani
                 *          } else {
8536 8a217fa2 Olga Brani
                 *            var 
8537 8a217fa2 Olga Brani
                 *              s=(iIn+""), 
8538 8a217fa2 Olga Brani
                 *              a=s.split(""), out="", 
8539 8a217fa2 Olga Brani
                 *              iLen=s.length;
8540 8a217fa2 Olga Brani
                 *            
8541 8a217fa2 Olga Brani
                 *            for ( var i=0 ; i&lt;iLen ; i++ ) {
8542 8a217fa2 Olga Brani
                 *              if ( i%3 === 0 &amp;&amp; i !== 0 ) {
8543 8a217fa2 Olga Brani
                 *                out = "'"+out;
8544 8a217fa2 Olga Brani
                 *              }
8545 8a217fa2 Olga Brani
                 *              out = a[iLen-i-1]+out;
8546 8a217fa2 Olga Brani
                 *            }
8547 8a217fa2 Olga Brani
                 *          }
8548 8a217fa2 Olga Brani
                 *          return out;
8549 8a217fa2 Olga Brani
                 *        };
8550 8a217fa2 Olga Brani
                 *      } );
8551 8a217fa2 Olga Brani
                 *    } );
8552 8a217fa2 Olga Brani
                 */
8553 8a217fa2 Olga Brani
                "fnFormatNumber": function ( iIn ) {
8554 8a217fa2 Olga Brani
                        if ( iIn < 1000 )
8555 8a217fa2 Olga Brani
                        {
8556 8a217fa2 Olga Brani
                                // A small optimisation for what is likely to be the majority of use cases
8557 8a217fa2 Olga Brani
                                return iIn;
8558 8a217fa2 Olga Brani
                        }
8559 8a217fa2 Olga Brani
        
8560 8a217fa2 Olga Brani
                        var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
8561 8a217fa2 Olga Brani
                        
8562 8a217fa2 Olga Brani
                        for ( var i=0 ; i<iLen ; i++ )
8563 8a217fa2 Olga Brani
                        {
8564 8a217fa2 Olga Brani
                                if ( i%3 === 0 && i !== 0 )
8565 8a217fa2 Olga Brani
                                {
8566 8a217fa2 Olga Brani
                                        out = this.oLanguage.sInfoThousands+out;
8567 8a217fa2 Olga Brani
                                }
8568 8a217fa2 Olga Brani
                                out = a[iLen-i-1]+out;
8569 8a217fa2 Olga Brani
                        }
8570 8a217fa2 Olga Brani
                        return out;
8571 8a217fa2 Olga Brani
                },
8572 8a217fa2 Olga Brani
        
8573 8a217fa2 Olga Brani
        
8574 8a217fa2 Olga Brani
                /**
8575 8a217fa2 Olga Brani
                 * This function is called on every 'draw' event, and allows you to
8576 8a217fa2 Olga Brani
                 * dynamically modify the header row. This can be used to calculate and
8577 8a217fa2 Olga Brani
                 * display useful information about the table.
8578 8a217fa2 Olga Brani
                 *  @type function
8579 8a217fa2 Olga Brani
                 *  @param {node} nHead "TR" element for the header
8580 8a217fa2 Olga Brani
                 *  @param {array} aData Full table data (as derived from the original HTML)
8581 8a217fa2 Olga Brani
                 *  @param {int} iStart Index for the current display starting point in the
8582 8a217fa2 Olga Brani
                 *    display array
8583 8a217fa2 Olga Brani
                 *  @param {int} iEnd Index for the current display ending point in the
8584 8a217fa2 Olga Brani
                 *    display array
8585 8a217fa2 Olga Brani
                 *  @param {array int} aiDisplay Index array to translate the visual position
8586 8a217fa2 Olga Brani
                 *    to the full data array
8587 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8588 8a217fa2 Olga Brani
                 * 
8589 8a217fa2 Olga Brani
                 *  @example
8590 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8591 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8592 8a217fa2 Olga Brani
                 *        "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) {
8593 8a217fa2 Olga Brani
                 *          nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
8594 8a217fa2 Olga Brani
                 *        }
8595 8a217fa2 Olga Brani
                 *      } );
8596 8a217fa2 Olga Brani
                 *    } )
8597 8a217fa2 Olga Brani
                 */
8598 8a217fa2 Olga Brani
                "fnHeaderCallback": null,
8599 8a217fa2 Olga Brani
        
8600 8a217fa2 Olga Brani
        
8601 8a217fa2 Olga Brani
                /**
8602 8a217fa2 Olga Brani
                 * The information element can be used to convey information about the current
8603 8a217fa2 Olga Brani
                 * state of the table. Although the internationalisation options presented by
8604 8a217fa2 Olga Brani
                 * DataTables are quite capable of dealing with most customisations, there may
8605 8a217fa2 Olga Brani
                 * be times where you wish to customise the string further. This callback
8606 8a217fa2 Olga Brani
                 * allows you to do exactly that.
8607 8a217fa2 Olga Brani
                 *  @type function
8608 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8609 8a217fa2 Olga Brani
                 *  @param {int} iStart Starting position in data for the draw
8610 8a217fa2 Olga Brani
                 *  @param {int} iEnd End position in data for the draw
8611 8a217fa2 Olga Brani
                 *  @param {int} iMax Total number of rows in the table (regardless of
8612 8a217fa2 Olga Brani
                 *    filtering)
8613 8a217fa2 Olga Brani
                 *  @param {int} iTotal Total number of rows in the data set, after filtering
8614 8a217fa2 Olga Brani
                 *  @param {string} sPre The string that DataTables has formatted using it's
8615 8a217fa2 Olga Brani
                 *    own rules
8616 8a217fa2 Olga Brani
                 *  @returns {string} The string to be displayed in the information element.
8617 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8618 8a217fa2 Olga Brani
                 * 
8619 8a217fa2 Olga Brani
                 *  @example
8620 8a217fa2 Olga Brani
                 *    $('#example').dataTable( {
8621 8a217fa2 Olga Brani
                 *      "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
8622 8a217fa2 Olga Brani
                 *        return iStart +" to "+ iEnd;
8623 8a217fa2 Olga Brani
                 *      }
8624 8a217fa2 Olga Brani
                 *    } );
8625 8a217fa2 Olga Brani
                 */
8626 8a217fa2 Olga Brani
                "fnInfoCallback": null,
8627 8a217fa2 Olga Brani
        
8628 8a217fa2 Olga Brani
        
8629 8a217fa2 Olga Brani
                /**
8630 8a217fa2 Olga Brani
                 * Called when the table has been initialised. Normally DataTables will
8631 8a217fa2 Olga Brani
                 * initialise sequentially and there will be no need for this function,
8632 8a217fa2 Olga Brani
                 * however, this does not hold true when using external language information
8633 8a217fa2 Olga Brani
                 * since that is obtained using an async XHR call.
8634 8a217fa2 Olga Brani
                 *  @type function
8635 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8636 8a217fa2 Olga Brani
                 *  @param {object} json The JSON object request from the server - only
8637 8a217fa2 Olga Brani
                 *    present if client-side Ajax sourced data is used
8638 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8639 8a217fa2 Olga Brani
                 * 
8640 8a217fa2 Olga Brani
                 *  @example
8641 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8642 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8643 8a217fa2 Olga Brani
                 *        "fnInitComplete": function(oSettings, json) {
8644 8a217fa2 Olga Brani
                 *          alert( 'DataTables has finished its initialisation.' );
8645 8a217fa2 Olga Brani
                 *        }
8646 8a217fa2 Olga Brani
                 *      } );
8647 8a217fa2 Olga Brani
                 *    } )
8648 8a217fa2 Olga Brani
                 */
8649 8a217fa2 Olga Brani
                "fnInitComplete": null,
8650 8a217fa2 Olga Brani
        
8651 8a217fa2 Olga Brani
        
8652 8a217fa2 Olga Brani
                /**
8653 8a217fa2 Olga Brani
                 * Called at the very start of each table draw and can be used to cancel the
8654 8a217fa2 Olga Brani
                 * draw by returning false, any other return (including undefined) results in
8655 8a217fa2 Olga Brani
                 * the full draw occurring).
8656 8a217fa2 Olga Brani
                 *  @type function
8657 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8658 8a217fa2 Olga Brani
                 *  @returns {boolean} False will cancel the draw, anything else (including no
8659 8a217fa2 Olga Brani
                 *    return) will allow it to complete.
8660 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8661 8a217fa2 Olga Brani
                 * 
8662 8a217fa2 Olga Brani
                 *  @example
8663 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8664 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8665 8a217fa2 Olga Brani
                 *        "fnPreDrawCallback": function( oSettings ) {
8666 8a217fa2 Olga Brani
                 *          if ( $('#test').val() == 1 ) {
8667 8a217fa2 Olga Brani
                 *            return false;
8668 8a217fa2 Olga Brani
                 *          }
8669 8a217fa2 Olga Brani
                 *        }
8670 8a217fa2 Olga Brani
                 *      } );
8671 8a217fa2 Olga Brani
                 *    } );
8672 8a217fa2 Olga Brani
                 */
8673 8a217fa2 Olga Brani
                "fnPreDrawCallback": null,
8674 8a217fa2 Olga Brani
        
8675 8a217fa2 Olga Brani
        
8676 8a217fa2 Olga Brani
                /**
8677 8a217fa2 Olga Brani
                 * This function allows you to 'post process' each row after it have been
8678 8a217fa2 Olga Brani
                 * generated for each table draw, but before it is rendered on screen. This
8679 8a217fa2 Olga Brani
                 * function might be used for setting the row class name etc.
8680 8a217fa2 Olga Brani
                 *  @type function
8681 8a217fa2 Olga Brani
                 *  @param {node} nRow "TR" element for the current row
8682 8a217fa2 Olga Brani
                 *  @param {array} aData Raw data array for this row
8683 8a217fa2 Olga Brani
                 *  @param {int} iDisplayIndex The display index for the current table draw
8684 8a217fa2 Olga Brani
                 *  @param {int} iDisplayIndexFull The index of the data in the full list of
8685 8a217fa2 Olga Brani
                 *    rows (after filtering)
8686 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8687 8a217fa2 Olga Brani
                 * 
8688 8a217fa2 Olga Brani
                 *  @example
8689 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8690 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8691 8a217fa2 Olga Brani
                 *        "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
8692 8a217fa2 Olga Brani
                 *          // Bold the grade for all 'A' grade browsers
8693 8a217fa2 Olga Brani
                 *          if ( aData[4] == "A" )
8694 8a217fa2 Olga Brani
                 *          {
8695 8a217fa2 Olga Brani
                 *            $('td:eq(4)', nRow).html( '<b>A</b>' );
8696 8a217fa2 Olga Brani
                 *          }
8697 8a217fa2 Olga Brani
                 *        }
8698 8a217fa2 Olga Brani
                 *      } );
8699 8a217fa2 Olga Brani
                 *    } );
8700 8a217fa2 Olga Brani
                 */
8701 8a217fa2 Olga Brani
                "fnRowCallback": null,
8702 8a217fa2 Olga Brani
        
8703 8a217fa2 Olga Brani
        
8704 8a217fa2 Olga Brani
                /**
8705 8a217fa2 Olga Brani
                 * This parameter allows you to override the default function which obtains
8706 8a217fa2 Olga Brani
                 * the data from the server ($.getJSON) so something more suitable for your
8707 8a217fa2 Olga Brani
                 * application. For example you could use POST data, or pull information from
8708 8a217fa2 Olga Brani
                 * a Gears or AIR database.
8709 8a217fa2 Olga Brani
                 *  @type function
8710 8a217fa2 Olga Brani
                 *  @member
8711 8a217fa2 Olga Brani
                 *  @param {string} sSource HTTP source to obtain the data from (sAjaxSource)
8712 8a217fa2 Olga Brani
                 *  @param {array} aoData A key/value pair object containing the data to send
8713 8a217fa2 Olga Brani
                 *    to the server
8714 8a217fa2 Olga Brani
                 *  @param {function} fnCallback to be called on completion of the data get
8715 8a217fa2 Olga Brani
                 *    process that will draw the data on the page.
8716 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8717 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8718 8a217fa2 Olga Brani
                 *  @dtopt Server-side
8719 8a217fa2 Olga Brani
                 * 
8720 8a217fa2 Olga Brani
                 *  @example
8721 8a217fa2 Olga Brani
                 *    // POST data to server
8722 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8723 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8724 8a217fa2 Olga Brani
                 *        "bProcessing": true,
8725 8a217fa2 Olga Brani
                 *        "bServerSide": true,
8726 8a217fa2 Olga Brani
                 *        "sAjaxSource": "xhr.php",
8727 8a217fa2 Olga Brani
                 *        "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
8728 8a217fa2 Olga Brani
                 *          oSettings.jqXHR = $.ajax( {
8729 8a217fa2 Olga Brani
                 *            "dataType": 'json', 
8730 8a217fa2 Olga Brani
                 *            "type": "POST", 
8731 8a217fa2 Olga Brani
                 *            "url": sSource, 
8732 8a217fa2 Olga Brani
                 *            "data": aoData, 
8733 8a217fa2 Olga Brani
                 *            "success": fnCallback
8734 8a217fa2 Olga Brani
                 *          } );
8735 8a217fa2 Olga Brani
                 *        }
8736 8a217fa2 Olga Brani
                 *      } );
8737 8a217fa2 Olga Brani
                 *    } );
8738 8a217fa2 Olga Brani
                 */
8739 8a217fa2 Olga Brani
                "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
8740 8a217fa2 Olga Brani
                        oSettings.jqXHR = $.ajax( {
8741 8a217fa2 Olga Brani
                                "url":  sUrl,
8742 8a217fa2 Olga Brani
                                "data": aoData,
8743 8a217fa2 Olga Brani
                                "success": function (json) {
8744 8a217fa2 Olga Brani
                                        if ( json.sError ) {
8745 8a217fa2 Olga Brani
                                                oSettings.oApi._fnLog( oSettings, 0, json.sError );
8746 8a217fa2 Olga Brani
                                        }
8747 8a217fa2 Olga Brani
                                        
8748 8a217fa2 Olga Brani
                                        $(oSettings.oInstance).trigger('xhr', [oSettings, json]);
8749 8a217fa2 Olga Brani
                                        fnCallback( json );
8750 8a217fa2 Olga Brani
                                },
8751 8a217fa2 Olga Brani
                                "dataType": "json",
8752 8a217fa2 Olga Brani
                                "cache": false,
8753 8a217fa2 Olga Brani
                                "type": oSettings.sServerMethod,
8754 8a217fa2 Olga Brani
                                "error": function (xhr, error, thrown) {
8755 8a217fa2 Olga Brani
                                        if ( error == "parsererror" ) {
8756 8a217fa2 Olga Brani
                                                oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
8757 8a217fa2 Olga Brani
                                                        "server could not be parsed. This is caused by a JSON formatting error." );
8758 8a217fa2 Olga Brani
                                        }
8759 8a217fa2 Olga Brani
                                }
8760 8a217fa2 Olga Brani
                        } );
8761 8a217fa2 Olga Brani
                },
8762 8a217fa2 Olga Brani
        
8763 8a217fa2 Olga Brani
        
8764 8a217fa2 Olga Brani
                /**
8765 8a217fa2 Olga Brani
                 * It is often useful to send extra data to the server when making an Ajax
8766 8a217fa2 Olga Brani
                 * request - for example custom filtering information, and this callback
8767 8a217fa2 Olga Brani
                 * function makes it trivial to send extra information to the server. The
8768 8a217fa2 Olga Brani
                 * passed in parameter is the data set that has been constructed by
8769 8a217fa2 Olga Brani
                 * DataTables, and you can add to this or modify it as you require.
8770 8a217fa2 Olga Brani
                 *  @type function
8771 8a217fa2 Olga Brani
                 *  @param {array} aoData Data array (array of objects which are name/value
8772 8a217fa2 Olga Brani
                 *    pairs) that has been constructed by DataTables and will be sent to the
8773 8a217fa2 Olga Brani
                 *    server. In the case of Ajax sourced data with server-side processing
8774 8a217fa2 Olga Brani
                 *    this will be an empty array, for server-side processing there will be a
8775 8a217fa2 Olga Brani
                 *    significant number of parameters!
8776 8a217fa2 Olga Brani
                 *  @returns {undefined} Ensure that you modify the aoData array passed in,
8777 8a217fa2 Olga Brani
                 *    as this is passed by reference.
8778 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8779 8a217fa2 Olga Brani
                 *  @dtopt Server-side
8780 8a217fa2 Olga Brani
                 * 
8781 8a217fa2 Olga Brani
                 *  @example
8782 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8783 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8784 8a217fa2 Olga Brani
                 *        "bProcessing": true,
8785 8a217fa2 Olga Brani
                 *        "bServerSide": true,
8786 8a217fa2 Olga Brani
                 *        "sAjaxSource": "scripts/server_processing.php",
8787 8a217fa2 Olga Brani
                 *        "fnServerParams": function ( aoData ) {
8788 8a217fa2 Olga Brani
                 *          aoData.push( { "name": "more_data", "value": "my_value" } );
8789 8a217fa2 Olga Brani
                 *        }
8790 8a217fa2 Olga Brani
                 *      } );
8791 8a217fa2 Olga Brani
                 *    } );
8792 8a217fa2 Olga Brani
                 */
8793 8a217fa2 Olga Brani
                "fnServerParams": null,
8794 8a217fa2 Olga Brani
        
8795 8a217fa2 Olga Brani
        
8796 8a217fa2 Olga Brani
                /**
8797 8a217fa2 Olga Brani
                 * Load the table state. With this function you can define from where, and how, the
8798 8a217fa2 Olga Brani
                 * state of a table is loaded. By default DataTables will load from its state saving
8799 8a217fa2 Olga Brani
                 * cookie, but you might wish to use local storage (HTML5) or a server-side database.
8800 8a217fa2 Olga Brani
                 *  @type function
8801 8a217fa2 Olga Brani
                 *  @member
8802 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8803 8a217fa2 Olga Brani
                 *  @return {object} The DataTables state object to be loaded
8804 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8805 8a217fa2 Olga Brani
                 * 
8806 8a217fa2 Olga Brani
                 *  @example
8807 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8808 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8809 8a217fa2 Olga Brani
                 *        "bStateSave": true,
8810 8a217fa2 Olga Brani
                 *        "fnStateLoad": function (oSettings) {
8811 8a217fa2 Olga Brani
                 *          var o;
8812 8a217fa2 Olga Brani
                 *          
8813 8a217fa2 Olga Brani
                 *          // Send an Ajax request to the server to get the data. Note that
8814 8a217fa2 Olga Brani
                 *          // this is a synchronous request.
8815 8a217fa2 Olga Brani
                 *          $.ajax( {
8816 8a217fa2 Olga Brani
                 *            "url": "/state_load",
8817 8a217fa2 Olga Brani
                 *            "async": false,
8818 8a217fa2 Olga Brani
                 *            "dataType": "json",
8819 8a217fa2 Olga Brani
                 *            "success": function (json) {
8820 8a217fa2 Olga Brani
                 *              o = json;
8821 8a217fa2 Olga Brani
                 *            }
8822 8a217fa2 Olga Brani
                 *          } );
8823 8a217fa2 Olga Brani
                 *          
8824 8a217fa2 Olga Brani
                 *          return o;
8825 8a217fa2 Olga Brani
                 *        }
8826 8a217fa2 Olga Brani
                 *      } );
8827 8a217fa2 Olga Brani
                 *    } );
8828 8a217fa2 Olga Brani
                 */
8829 8a217fa2 Olga Brani
                "fnStateLoad": function ( oSettings ) {
8830 8a217fa2 Olga Brani
                        var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
8831 8a217fa2 Olga Brani
                        var oData;
8832 8a217fa2 Olga Brani
        
8833 8a217fa2 Olga Brani
                        try {
8834 8a217fa2 Olga Brani
                                oData = (typeof $.parseJSON === 'function') ? 
8835 8a217fa2 Olga Brani
                                        $.parseJSON(sData) : eval( '('+sData+')' );
8836 8a217fa2 Olga Brani
                        } catch (e) {
8837 8a217fa2 Olga Brani
                                oData = null;
8838 8a217fa2 Olga Brani
                        }
8839 8a217fa2 Olga Brani
        
8840 8a217fa2 Olga Brani
                        return oData;
8841 8a217fa2 Olga Brani
                },
8842 8a217fa2 Olga Brani
        
8843 8a217fa2 Olga Brani
        
8844 8a217fa2 Olga Brani
                /**
8845 8a217fa2 Olga Brani
                 * Callback which allows modification of the saved state prior to loading that state.
8846 8a217fa2 Olga Brani
                 * This callback is called when the table is loading state from the stored data, but
8847 8a217fa2 Olga Brani
                 * prior to the settings object being modified by the saved state. Note that for 
8848 8a217fa2 Olga Brani
                 * plug-in authors, you should use the 'stateLoadParams' event to load parameters for 
8849 8a217fa2 Olga Brani
                 * a plug-in.
8850 8a217fa2 Olga Brani
                 *  @type function
8851 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8852 8a217fa2 Olga Brani
                 *  @param {object} oData The state object that is to be loaded
8853 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8854 8a217fa2 Olga Brani
                 * 
8855 8a217fa2 Olga Brani
                 *  @example
8856 8a217fa2 Olga Brani
                 *    // Remove a saved filter, so filtering is never loaded
8857 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8858 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8859 8a217fa2 Olga Brani
                 *        "bStateSave": true,
8860 8a217fa2 Olga Brani
                 *        "fnStateLoadParams": function (oSettings, oData) {
8861 8a217fa2 Olga Brani
                 *          oData.oSearch.sSearch = "";
8862 8a217fa2 Olga Brani
                 *        }
8863 8a217fa2 Olga Brani
                 *      } );
8864 8a217fa2 Olga Brani
                 *    } );
8865 8a217fa2 Olga Brani
                 * 
8866 8a217fa2 Olga Brani
                 *  @example
8867 8a217fa2 Olga Brani
                 *    // Disallow state loading by returning false
8868 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8869 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8870 8a217fa2 Olga Brani
                 *        "bStateSave": true,
8871 8a217fa2 Olga Brani
                 *        "fnStateLoadParams": function (oSettings, oData) {
8872 8a217fa2 Olga Brani
                 *          return false;
8873 8a217fa2 Olga Brani
                 *        }
8874 8a217fa2 Olga Brani
                 *      } );
8875 8a217fa2 Olga Brani
                 *    } );
8876 8a217fa2 Olga Brani
                 */
8877 8a217fa2 Olga Brani
                "fnStateLoadParams": null,
8878 8a217fa2 Olga Brani
        
8879 8a217fa2 Olga Brani
        
8880 8a217fa2 Olga Brani
                /**
8881 8a217fa2 Olga Brani
                 * Callback that is called when the state has been loaded from the state saving method
8882 8a217fa2 Olga Brani
                 * and the DataTables settings object has been modified as a result of the loaded state.
8883 8a217fa2 Olga Brani
                 *  @type function
8884 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8885 8a217fa2 Olga Brani
                 *  @param {object} oData The state object that was loaded
8886 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8887 8a217fa2 Olga Brani
                 * 
8888 8a217fa2 Olga Brani
                 *  @example
8889 8a217fa2 Olga Brani
                 *    // Show an alert with the filtering value that was saved
8890 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8891 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8892 8a217fa2 Olga Brani
                 *        "bStateSave": true,
8893 8a217fa2 Olga Brani
                 *        "fnStateLoaded": function (oSettings, oData) {
8894 8a217fa2 Olga Brani
                 *          alert( 'Saved filter was: '+oData.oSearch.sSearch );
8895 8a217fa2 Olga Brani
                 *        }
8896 8a217fa2 Olga Brani
                 *      } );
8897 8a217fa2 Olga Brani
                 *    } );
8898 8a217fa2 Olga Brani
                 */
8899 8a217fa2 Olga Brani
                "fnStateLoaded": null,
8900 8a217fa2 Olga Brani
        
8901 8a217fa2 Olga Brani
        
8902 8a217fa2 Olga Brani
                /**
8903 8a217fa2 Olga Brani
                 * Save the table state. This function allows you to define where and how the state
8904 8a217fa2 Olga Brani
                 * information for the table is stored - by default it will use a cookie, but you
8905 8a217fa2 Olga Brani
                 * might want to use local storage (HTML5) or a server-side database.
8906 8a217fa2 Olga Brani
                 *  @type function
8907 8a217fa2 Olga Brani
                 *  @member
8908 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8909 8a217fa2 Olga Brani
                 *  @param {object} oData The state object to be saved
8910 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8911 8a217fa2 Olga Brani
                 * 
8912 8a217fa2 Olga Brani
                 *  @example
8913 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8914 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8915 8a217fa2 Olga Brani
                 *        "bStateSave": true,
8916 8a217fa2 Olga Brani
                 *        "fnStateSave": function (oSettings, oData) {
8917 8a217fa2 Olga Brani
                 *          // Send an Ajax request to the server with the state object
8918 8a217fa2 Olga Brani
                 *          $.ajax( {
8919 8a217fa2 Olga Brani
                 *            "url": "/state_save",
8920 8a217fa2 Olga Brani
                 *            "data": oData,
8921 8a217fa2 Olga Brani
                 *            "dataType": "json",
8922 8a217fa2 Olga Brani
                 *            "method": "POST"
8923 8a217fa2 Olga Brani
                 *            "success": function () {}
8924 8a217fa2 Olga Brani
                 *          } );
8925 8a217fa2 Olga Brani
                 *        }
8926 8a217fa2 Olga Brani
                 *      } );
8927 8a217fa2 Olga Brani
                 *    } );
8928 8a217fa2 Olga Brani
                 */
8929 8a217fa2 Olga Brani
                "fnStateSave": function ( oSettings, oData ) {
8930 8a217fa2 Olga Brani
                        this.oApi._fnCreateCookie( 
8931 8a217fa2 Olga Brani
                                oSettings.sCookiePrefix+oSettings.sInstance, 
8932 8a217fa2 Olga Brani
                                this.oApi._fnJsonString(oData), 
8933 8a217fa2 Olga Brani
                                oSettings.iCookieDuration, 
8934 8a217fa2 Olga Brani
                                oSettings.sCookiePrefix, 
8935 8a217fa2 Olga Brani
                                oSettings.fnCookieCallback
8936 8a217fa2 Olga Brani
                        );
8937 8a217fa2 Olga Brani
                },
8938 8a217fa2 Olga Brani
        
8939 8a217fa2 Olga Brani
        
8940 8a217fa2 Olga Brani
                /**
8941 8a217fa2 Olga Brani
                 * Callback which allows modification of the state to be saved. Called when the table 
8942 8a217fa2 Olga Brani
                 * has changed state a new state save is required. This method allows modification of
8943 8a217fa2 Olga Brani
                 * the state saving object prior to actually doing the save, including addition or 
8944 8a217fa2 Olga Brani
                 * other state properties or modification. Note that for plug-in authors, you should 
8945 8a217fa2 Olga Brani
                 * use the 'stateSaveParams' event to save parameters for a plug-in.
8946 8a217fa2 Olga Brani
                 *  @type function
8947 8a217fa2 Olga Brani
                 *  @param {object} oSettings DataTables settings object
8948 8a217fa2 Olga Brani
                 *  @param {object} oData The state object to be saved
8949 8a217fa2 Olga Brani
                 *  @dtopt Callbacks
8950 8a217fa2 Olga Brani
                 * 
8951 8a217fa2 Olga Brani
                 *  @example
8952 8a217fa2 Olga Brani
                 *    // Remove a saved filter, so filtering is never saved
8953 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8954 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8955 8a217fa2 Olga Brani
                 *        "bStateSave": true,
8956 8a217fa2 Olga Brani
                 *        "fnStateSaveParams": function (oSettings, oData) {
8957 8a217fa2 Olga Brani
                 *          oData.oSearch.sSearch = "";
8958 8a217fa2 Olga Brani
                 *        }
8959 8a217fa2 Olga Brani
                 *      } );
8960 8a217fa2 Olga Brani
                 *    } );
8961 8a217fa2 Olga Brani
                 */
8962 8a217fa2 Olga Brani
                "fnStateSaveParams": null,
8963 8a217fa2 Olga Brani
        
8964 8a217fa2 Olga Brani
        
8965 8a217fa2 Olga Brani
                /**
8966 8a217fa2 Olga Brani
                 * Duration of the cookie which is used for storing session information. This
8967 8a217fa2 Olga Brani
                 * value is given in seconds.
8968 8a217fa2 Olga Brani
                 *  @type int
8969 8a217fa2 Olga Brani
                 *  @default 7200 <i>(2 hours)</i>
8970 8a217fa2 Olga Brani
                 *  @dtopt Options
8971 8a217fa2 Olga Brani
                 * 
8972 8a217fa2 Olga Brani
                 *  @example
8973 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
8974 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
8975 8a217fa2 Olga Brani
                 *        "iCookieDuration": 60*60*24; // 1 day
8976 8a217fa2 Olga Brani
                 *      } );
8977 8a217fa2 Olga Brani
                 *    } )
8978 8a217fa2 Olga Brani
                 */
8979 8a217fa2 Olga Brani
                "iCookieDuration": 7200,
8980 8a217fa2 Olga Brani
        
8981 8a217fa2 Olga Brani
        
8982 8a217fa2 Olga Brani
                /**
8983 8a217fa2 Olga Brani
                 * When enabled DataTables will not make a request to the server for the first
8984 8a217fa2 Olga Brani
                 * page draw - rather it will use the data already on the page (no sorting etc
8985 8a217fa2 Olga Brani
                 * will be applied to it), thus saving on an XHR at load time. iDeferLoading
8986 8a217fa2 Olga Brani
                 * is used to indicate that deferred loading is required, but it is also used
8987 8a217fa2 Olga Brani
                 * to tell DataTables how many records there are in the full table (allowing
8988 8a217fa2 Olga Brani
                 * the information element and pagination to be displayed correctly). In the case
8989 8a217fa2 Olga Brani
                 * where a filtering is applied to the table on initial load, this can be
8990 8a217fa2 Olga Brani
                 * indicated by giving the parameter as an array, where the first element is
8991 8a217fa2 Olga Brani
                 * the number of records available after filtering and the second element is the
8992 8a217fa2 Olga Brani
                 * number of records without filtering (allowing the table information element
8993 8a217fa2 Olga Brani
                 * to be shown correctly).
8994 8a217fa2 Olga Brani
                 *  @type int | array
8995 8a217fa2 Olga Brani
                 *  @default null
8996 8a217fa2 Olga Brani
                 *  @dtopt Options
8997 8a217fa2 Olga Brani
                 * 
8998 8a217fa2 Olga Brani
                 *  @example
8999 8a217fa2 Olga Brani
                 *    // 57 records available in the table, no filtering applied
9000 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9001 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9002 8a217fa2 Olga Brani
                 *        "bServerSide": true,
9003 8a217fa2 Olga Brani
                 *        "sAjaxSource": "scripts/server_processing.php",
9004 8a217fa2 Olga Brani
                 *        "iDeferLoading": 57
9005 8a217fa2 Olga Brani
                 *      } );
9006 8a217fa2 Olga Brani
                 *    } );
9007 8a217fa2 Olga Brani
                 * 
9008 8a217fa2 Olga Brani
                 *  @example
9009 8a217fa2 Olga Brani
                 *    // 57 records after filtering, 100 without filtering (an initial filter applied)
9010 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9011 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9012 8a217fa2 Olga Brani
                 *        "bServerSide": true,
9013 8a217fa2 Olga Brani
                 *        "sAjaxSource": "scripts/server_processing.php",
9014 8a217fa2 Olga Brani
                 *        "iDeferLoading": [ 57, 100 ],
9015 8a217fa2 Olga Brani
                 *        "oSearch": {
9016 8a217fa2 Olga Brani
                 *          "sSearch": "my_filter"
9017 8a217fa2 Olga Brani
                 *        }
9018 8a217fa2 Olga Brani
                 *      } );
9019 8a217fa2 Olga Brani
                 *    } );
9020 8a217fa2 Olga Brani
                 */
9021 8a217fa2 Olga Brani
                "iDeferLoading": null,
9022 8a217fa2 Olga Brani
        
9023 8a217fa2 Olga Brani
        
9024 8a217fa2 Olga Brani
                /**
9025 8a217fa2 Olga Brani
                 * Number of rows to display on a single page when using pagination. If
9026 8a217fa2 Olga Brani
                 * feature enabled (bLengthChange) then the end user will be able to override
9027 8a217fa2 Olga Brani
                 * this to a custom setting using a pop-up menu.
9028 8a217fa2 Olga Brani
                 *  @type int
9029 8a217fa2 Olga Brani
                 *  @default 10
9030 8a217fa2 Olga Brani
                 *  @dtopt Options
9031 8a217fa2 Olga Brani
                 * 
9032 8a217fa2 Olga Brani
                 *  @example
9033 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9034 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9035 8a217fa2 Olga Brani
                 *        "iDisplayLength": 50
9036 8a217fa2 Olga Brani
                 *      } );
9037 8a217fa2 Olga Brani
                 *    } )
9038 8a217fa2 Olga Brani
                 */
9039 8a217fa2 Olga Brani
                "iDisplayLength": 10,
9040 8a217fa2 Olga Brani
        
9041 8a217fa2 Olga Brani
        
9042 8a217fa2 Olga Brani
                /**
9043 8a217fa2 Olga Brani
                 * Define the starting point for data display when using DataTables with
9044 8a217fa2 Olga Brani
                 * pagination. Note that this parameter is the number of records, rather than
9045 8a217fa2 Olga Brani
                 * the page number, so if you have 10 records per page and want to start on
9046 8a217fa2 Olga Brani
                 * the third page, it should be "20".
9047 8a217fa2 Olga Brani
                 *  @type int
9048 8a217fa2 Olga Brani
                 *  @default 0
9049 8a217fa2 Olga Brani
                 *  @dtopt Options
9050 8a217fa2 Olga Brani
                 * 
9051 8a217fa2 Olga Brani
                 *  @example
9052 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9053 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9054 8a217fa2 Olga Brani
                 *        "iDisplayStart": 20
9055 8a217fa2 Olga Brani
                 *      } );
9056 8a217fa2 Olga Brani
                 *    } )
9057 8a217fa2 Olga Brani
                 */
9058 8a217fa2 Olga Brani
                "iDisplayStart": 0,
9059 8a217fa2 Olga Brani
        
9060 8a217fa2 Olga Brani
        
9061 8a217fa2 Olga Brani
                /**
9062 8a217fa2 Olga Brani
                 * The scroll gap is the amount of scrolling that is left to go before
9063 8a217fa2 Olga Brani
                 * DataTables will load the next 'page' of data automatically. You typically
9064 8a217fa2 Olga Brani
                 * want a gap which is big enough that the scrolling will be smooth for the
9065 8a217fa2 Olga Brani
                 * user, while not so large that it will load more data than need.
9066 8a217fa2 Olga Brani
                 *  @type int
9067 8a217fa2 Olga Brani
                 *  @default 100
9068 8a217fa2 Olga Brani
                 *  @dtopt Options
9069 8a217fa2 Olga Brani
                 * 
9070 8a217fa2 Olga Brani
                 *  @example
9071 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9072 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9073 8a217fa2 Olga Brani
                 *        "bScrollInfinite": true,
9074 8a217fa2 Olga Brani
                 *        "bScrollCollapse": true,
9075 8a217fa2 Olga Brani
                 *        "sScrollY": "200px",
9076 8a217fa2 Olga Brani
                 *        "iScrollLoadGap": 50
9077 8a217fa2 Olga Brani
                 *      } );
9078 8a217fa2 Olga Brani
                 *    } );
9079 8a217fa2 Olga Brani
                 */
9080 8a217fa2 Olga Brani
                "iScrollLoadGap": 100,
9081 8a217fa2 Olga Brani
        
9082 8a217fa2 Olga Brani
        
9083 8a217fa2 Olga Brani
                /**
9084 8a217fa2 Olga Brani
                 * By default DataTables allows keyboard navigation of the table (sorting, paging,
9085 8a217fa2 Olga Brani
                 * and filtering) by adding a tabindex attribute to the required elements. This
9086 8a217fa2 Olga Brani
                 * allows you to tab through the controls and press the enter key to activate them.
9087 8a217fa2 Olga Brani
                 * The tabindex is default 0, meaning that the tab follows the flow of the document.
9088 8a217fa2 Olga Brani
                 * You can overrule this using this parameter if you wish. Use a value of -1 to
9089 8a217fa2 Olga Brani
                 * disable built-in keyboard navigation.
9090 8a217fa2 Olga Brani
                 *  @type int
9091 8a217fa2 Olga Brani
                 *  @default 0
9092 8a217fa2 Olga Brani
                 *  @dtopt Options
9093 8a217fa2 Olga Brani
                 * 
9094 8a217fa2 Olga Brani
                 *  @example
9095 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9096 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9097 8a217fa2 Olga Brani
                 *        "iTabIndex": 1
9098 8a217fa2 Olga Brani
                 *      } );
9099 8a217fa2 Olga Brani
                 *    } );
9100 8a217fa2 Olga Brani
                 */
9101 8a217fa2 Olga Brani
                "iTabIndex": 0,
9102 8a217fa2 Olga Brani
        
9103 8a217fa2 Olga Brani
        
9104 8a217fa2 Olga Brani
                /**
9105 8a217fa2 Olga Brani
                 * All strings that DataTables uses in the user interface that it creates
9106 8a217fa2 Olga Brani
                 * are defined in this object, allowing you to modified them individually or
9107 8a217fa2 Olga Brani
                 * completely replace them all as required.
9108 8a217fa2 Olga Brani
                 *  @namespace
9109 8a217fa2 Olga Brani
                 */
9110 8a217fa2 Olga Brani
                "oLanguage": {
9111 8a217fa2 Olga Brani
                        /**
9112 8a217fa2 Olga Brani
                         * Strings that are used for WAI-ARIA labels and controls only (these are not
9113 8a217fa2 Olga Brani
                         * actually visible on the page, but will be read by screenreaders, and thus
9114 8a217fa2 Olga Brani
                         * must be internationalised as well).
9115 8a217fa2 Olga Brani
                         *  @namespace
9116 8a217fa2 Olga Brani
                         */
9117 8a217fa2 Olga Brani
                        "oAria": {
9118 8a217fa2 Olga Brani
                                /**
9119 8a217fa2 Olga Brani
                                 * ARIA label that is added to the table headers when the column may be
9120 8a217fa2 Olga Brani
                                 * sorted ascending by activing the column (click or return when focused).
9121 8a217fa2 Olga Brani
                                 * Note that the column header is prefixed to this string.
9122 8a217fa2 Olga Brani
                                 *  @type string
9123 8a217fa2 Olga Brani
                                 *  @default : activate to sort column ascending
9124 8a217fa2 Olga Brani
                                 *  @dtopt Language
9125 8a217fa2 Olga Brani
                                 * 
9126 8a217fa2 Olga Brani
                                 *  @example
9127 8a217fa2 Olga Brani
                                 *    $(document).ready( function() {
9128 8a217fa2 Olga Brani
                                 *      $('#example').dataTable( {
9129 8a217fa2 Olga Brani
                                 *        "oLanguage": {
9130 8a217fa2 Olga Brani
                                 *          "oAria": {
9131 8a217fa2 Olga Brani
                                 *            "sSortAscending": " - click/return to sort ascending"
9132 8a217fa2 Olga Brani
                                 *          }
9133 8a217fa2 Olga Brani
                                 *        }
9134 8a217fa2 Olga Brani
                                 *      } );
9135 8a217fa2 Olga Brani
                                 *    } );
9136 8a217fa2 Olga Brani
                                 */
9137 8a217fa2 Olga Brani
                                "sSortAscending": ": activate to sort column ascending",
9138 8a217fa2 Olga Brani
        
9139 8a217fa2 Olga Brani
                                /**
9140 8a217fa2 Olga Brani
                                 * ARIA label that is added to the table headers when the column may be
9141 8a217fa2 Olga Brani
                                 * sorted descending by activing the column (click or return when focused).
9142 8a217fa2 Olga Brani
                                 * Note that the column header is prefixed to this string.
9143 8a217fa2 Olga Brani
                                 *  @type string
9144 8a217fa2 Olga Brani
                                 *  @default : activate to sort column ascending
9145 8a217fa2 Olga Brani
                                 *  @dtopt Language
9146 8a217fa2 Olga Brani
                                 * 
9147 8a217fa2 Olga Brani
                                 *  @example
9148 8a217fa2 Olga Brani
                                 *    $(document).ready( function() {
9149 8a217fa2 Olga Brani
                                 *      $('#example').dataTable( {
9150 8a217fa2 Olga Brani
                                 *        "oLanguage": {
9151 8a217fa2 Olga Brani
                                 *          "oAria": {
9152 8a217fa2 Olga Brani
                                 *            "sSortDescending": " - click/return to sort descending"
9153 8a217fa2 Olga Brani
                                 *          }
9154 8a217fa2 Olga Brani
                                 *        }
9155 8a217fa2 Olga Brani
                                 *      } );
9156 8a217fa2 Olga Brani
                                 *    } );
9157 8a217fa2 Olga Brani
                                 */
9158 8a217fa2 Olga Brani
                                "sSortDescending": ": activate to sort column descending"
9159 8a217fa2 Olga Brani
                        },
9160 8a217fa2 Olga Brani
        
9161 8a217fa2 Olga Brani
                        /**
9162 8a217fa2 Olga Brani
                         * Pagination string used by DataTables for the two built-in pagination
9163 8a217fa2 Olga Brani
                         * control types ("two_button" and "full_numbers")
9164 8a217fa2 Olga Brani
                         *  @namespace
9165 8a217fa2 Olga Brani
                         */
9166 8a217fa2 Olga Brani
                        "oPaginate": {
9167 8a217fa2 Olga Brani
                                /**
9168 8a217fa2 Olga Brani
                                 * Text to use when using the 'full_numbers' type of pagination for the
9169 8a217fa2 Olga Brani
                                 * button to take the user to the first page.
9170 8a217fa2 Olga Brani
                                 *  @type string
9171 8a217fa2 Olga Brani
                                 *  @default First
9172 8a217fa2 Olga Brani
                                 *  @dtopt Language
9173 8a217fa2 Olga Brani
                                 * 
9174 8a217fa2 Olga Brani
                                 *  @example
9175 8a217fa2 Olga Brani
                                 *    $(document).ready( function() {
9176 8a217fa2 Olga Brani
                                 *      $('#example').dataTable( {
9177 8a217fa2 Olga Brani
                                 *        "oLanguage": {
9178 8a217fa2 Olga Brani
                                 *          "oPaginate": {
9179 8a217fa2 Olga Brani
                                 *            "sFirst": "First page"
9180 8a217fa2 Olga Brani
                                 *          }
9181 8a217fa2 Olga Brani
                                 *        }
9182 8a217fa2 Olga Brani
                                 *      } );
9183 8a217fa2 Olga Brani
                                 *    } );
9184 8a217fa2 Olga Brani
                                 */
9185 8a217fa2 Olga Brani
                                "sFirst": "First",
9186 8a217fa2 Olga Brani
                        
9187 8a217fa2 Olga Brani
                        
9188 8a217fa2 Olga Brani
                                /**
9189 8a217fa2 Olga Brani
                                 * Text to use when using the 'full_numbers' type of pagination for the
9190 8a217fa2 Olga Brani
                                 * button to take the user to the last page.
9191 8a217fa2 Olga Brani
                                 *  @type string
9192 8a217fa2 Olga Brani
                                 *  @default Last
9193 8a217fa2 Olga Brani
                                 *  @dtopt Language
9194 8a217fa2 Olga Brani
                                 * 
9195 8a217fa2 Olga Brani
                                 *  @example
9196 8a217fa2 Olga Brani
                                 *    $(document).ready( function() {
9197 8a217fa2 Olga Brani
                                 *      $('#example').dataTable( {
9198 8a217fa2 Olga Brani
                                 *        "oLanguage": {
9199 8a217fa2 Olga Brani
                                 *          "oPaginate": {
9200 8a217fa2 Olga Brani
                                 *            "sLast": "Last page"
9201 8a217fa2 Olga Brani
                                 *          }
9202 8a217fa2 Olga Brani
                                 *        }
9203 8a217fa2 Olga Brani
                                 *      } );
9204 8a217fa2 Olga Brani
                                 *    } );
9205 8a217fa2 Olga Brani
                                 */
9206 8a217fa2 Olga Brani
                                "sLast": "Last",
9207 8a217fa2 Olga Brani
                        
9208 8a217fa2 Olga Brani
                        
9209 8a217fa2 Olga Brani
                                /**
9210 8a217fa2 Olga Brani
                                 * Text to use for the 'next' pagination button (to take the user to the 
9211 8a217fa2 Olga Brani
                                 * next page).
9212 8a217fa2 Olga Brani
                                 *  @type string
9213 8a217fa2 Olga Brani
                                 *  @default Next
9214 8a217fa2 Olga Brani
                                 *  @dtopt Language
9215 8a217fa2 Olga Brani
                                 * 
9216 8a217fa2 Olga Brani
                                 *  @example
9217 8a217fa2 Olga Brani
                                 *    $(document).ready( function() {
9218 8a217fa2 Olga Brani
                                 *      $('#example').dataTable( {
9219 8a217fa2 Olga Brani
                                 *        "oLanguage": {
9220 8a217fa2 Olga Brani
                                 *          "oPaginate": {
9221 8a217fa2 Olga Brani
                                 *            "sNext": "Next page"
9222 8a217fa2 Olga Brani
                                 *          }
9223 8a217fa2 Olga Brani
                                 *        }
9224 8a217fa2 Olga Brani
                                 *      } );
9225 8a217fa2 Olga Brani
                                 *    } );
9226 8a217fa2 Olga Brani
                                 */
9227 8a217fa2 Olga Brani
                                "sNext": "Next",
9228 8a217fa2 Olga Brani
                        
9229 8a217fa2 Olga Brani
                        
9230 8a217fa2 Olga Brani
                                /**
9231 8a217fa2 Olga Brani
                                 * Text to use for the 'previous' pagination button (to take the user to  
9232 8a217fa2 Olga Brani
                                 * the previous page).
9233 8a217fa2 Olga Brani
                                 *  @type string
9234 8a217fa2 Olga Brani
                                 *  @default Previous
9235 8a217fa2 Olga Brani
                                 *  @dtopt Language
9236 8a217fa2 Olga Brani
                                 * 
9237 8a217fa2 Olga Brani
                                 *  @example
9238 8a217fa2 Olga Brani
                                 *    $(document).ready( function() {
9239 8a217fa2 Olga Brani
                                 *      $('#example').dataTable( {
9240 8a217fa2 Olga Brani
                                 *        "oLanguage": {
9241 8a217fa2 Olga Brani
                                 *          "oPaginate": {
9242 8a217fa2 Olga Brani
                                 *            "sPrevious": "Previous page"
9243 8a217fa2 Olga Brani
                                 *          }
9244 8a217fa2 Olga Brani
                                 *        }
9245 8a217fa2 Olga Brani
                                 *      } );
9246 8a217fa2 Olga Brani
                                 *    } );
9247 8a217fa2 Olga Brani
                                 */
9248 8a217fa2 Olga Brani
                                "sPrevious": "Previous"
9249 8a217fa2 Olga Brani
                        },
9250 8a217fa2 Olga Brani
                
9251 8a217fa2 Olga Brani
                        /**
9252 8a217fa2 Olga Brani
                         * This string is shown in preference to sZeroRecords when the table is
9253 8a217fa2 Olga Brani
                         * empty of data (regardless of filtering). Note that this is an optional
9254 8a217fa2 Olga Brani
                         * parameter - if it is not given, the value of sZeroRecords will be used
9255 8a217fa2 Olga Brani
                         * instead (either the default or given value).
9256 8a217fa2 Olga Brani
                         *  @type string
9257 8a217fa2 Olga Brani
                         *  @default No data available in table
9258 8a217fa2 Olga Brani
                         *  @dtopt Language
9259 8a217fa2 Olga Brani
                         * 
9260 8a217fa2 Olga Brani
                         *  @example
9261 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9262 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9263 8a217fa2 Olga Brani
                         *        "oLanguage": {
9264 8a217fa2 Olga Brani
                         *          "sEmptyTable": "No data available in table"
9265 8a217fa2 Olga Brani
                         *        }
9266 8a217fa2 Olga Brani
                         *      } );
9267 8a217fa2 Olga Brani
                         *    } );
9268 8a217fa2 Olga Brani
                         */
9269 8a217fa2 Olga Brani
                        "sEmptyTable": "No data available in table",
9270 8a217fa2 Olga Brani
                
9271 8a217fa2 Olga Brani
                
9272 8a217fa2 Olga Brani
                        /**
9273 8a217fa2 Olga Brani
                         * This string gives information to the end user about the information that 
9274 8a217fa2 Olga Brani
                         * is current on display on the page. The _START_, _END_ and _TOTAL_ 
9275 8a217fa2 Olga Brani
                         * variables are all dynamically replaced as the table display updates, and 
9276 8a217fa2 Olga Brani
                         * can be freely moved or removed as the language requirements change.
9277 8a217fa2 Olga Brani
                         *  @type string
9278 8a217fa2 Olga Brani
                         *  @default Showing _START_ to _END_ of _TOTAL_ entries
9279 8a217fa2 Olga Brani
                         *  @dtopt Language
9280 8a217fa2 Olga Brani
                         * 
9281 8a217fa2 Olga Brani
                         *  @example
9282 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9283 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9284 8a217fa2 Olga Brani
                         *        "oLanguage": {
9285 8a217fa2 Olga Brani
                         *          "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
9286 8a217fa2 Olga Brani
                         *        }
9287 8a217fa2 Olga Brani
                         *      } );
9288 8a217fa2 Olga Brani
                         *    } );
9289 8a217fa2 Olga Brani
                         */
9290 8a217fa2 Olga Brani
                        "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
9291 8a217fa2 Olga Brani
                
9292 8a217fa2 Olga Brani
                
9293 8a217fa2 Olga Brani
                        /**
9294 8a217fa2 Olga Brani
                         * Display information string for when the table is empty. Typically the 
9295 8a217fa2 Olga Brani
                         * format of this string should match sInfo.
9296 8a217fa2 Olga Brani
                         *  @type string
9297 8a217fa2 Olga Brani
                         *  @default Showing 0 to 0 of 0 entries
9298 8a217fa2 Olga Brani
                         *  @dtopt Language
9299 8a217fa2 Olga Brani
                         * 
9300 8a217fa2 Olga Brani
                         *  @example
9301 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9302 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9303 8a217fa2 Olga Brani
                         *        "oLanguage": {
9304 8a217fa2 Olga Brani
                         *          "sInfoEmpty": "No entries to show"
9305 8a217fa2 Olga Brani
                         *        }
9306 8a217fa2 Olga Brani
                         *      } );
9307 8a217fa2 Olga Brani
                         *    } );
9308 8a217fa2 Olga Brani
                         */
9309 8a217fa2 Olga Brani
                        "sInfoEmpty": "Showing 0 to 0 of 0 entries",
9310 8a217fa2 Olga Brani
                
9311 8a217fa2 Olga Brani
                
9312 8a217fa2 Olga Brani
                        /**
9313 8a217fa2 Olga Brani
                         * When a user filters the information in a table, this string is appended 
9314 8a217fa2 Olga Brani
                         * to the information (sInfo) to give an idea of how strong the filtering 
9315 8a217fa2 Olga Brani
                         * is. The variable _MAX_ is dynamically updated.
9316 8a217fa2 Olga Brani
                         *  @type string
9317 8a217fa2 Olga Brani
                         *  @default (filtered from _MAX_ total entries)
9318 8a217fa2 Olga Brani
                         *  @dtopt Language
9319 8a217fa2 Olga Brani
                         * 
9320 8a217fa2 Olga Brani
                         *  @example
9321 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9322 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9323 8a217fa2 Olga Brani
                         *        "oLanguage": {
9324 8a217fa2 Olga Brani
                         *          "sInfoFiltered": " - filtering from _MAX_ records"
9325 8a217fa2 Olga Brani
                         *        }
9326 8a217fa2 Olga Brani
                         *      } );
9327 8a217fa2 Olga Brani
                         *    } );
9328 8a217fa2 Olga Brani
                         */
9329 8a217fa2 Olga Brani
                        "sInfoFiltered": "(filtered from _MAX_ total entries)",
9330 8a217fa2 Olga Brani
                
9331 8a217fa2 Olga Brani
                
9332 8a217fa2 Olga Brani
                        /**
9333 8a217fa2 Olga Brani
                         * If can be useful to append extra information to the info string at times,
9334 8a217fa2 Olga Brani
                         * and this variable does exactly that. This information will be appended to
9335 8a217fa2 Olga Brani
                         * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are
9336 8a217fa2 Olga Brani
                         * being used) at all times.
9337 8a217fa2 Olga Brani
                         *  @type string
9338 8a217fa2 Olga Brani
                         *  @default <i>Empty string</i>
9339 8a217fa2 Olga Brani
                         *  @dtopt Language
9340 8a217fa2 Olga Brani
                         * 
9341 8a217fa2 Olga Brani
                         *  @example
9342 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9343 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9344 8a217fa2 Olga Brani
                         *        "oLanguage": {
9345 8a217fa2 Olga Brani
                         *          "sInfoPostFix": "All records shown are derived from real information."
9346 8a217fa2 Olga Brani
                         *        }
9347 8a217fa2 Olga Brani
                         *      } );
9348 8a217fa2 Olga Brani
                         *    } );
9349 8a217fa2 Olga Brani
                         */
9350 8a217fa2 Olga Brani
                        "sInfoPostFix": "",
9351 8a217fa2 Olga Brani
                
9352 8a217fa2 Olga Brani
                
9353 8a217fa2 Olga Brani
                        /**
9354 8a217fa2 Olga Brani
                         * DataTables has a build in number formatter (fnFormatNumber) which is used
9355 8a217fa2 Olga Brani
                         * to format large numbers that are used in the table information. By
9356 8a217fa2 Olga Brani
                         * default a comma is used, but this can be trivially changed to any
9357 8a217fa2 Olga Brani
                         * character you wish with this parameter.
9358 8a217fa2 Olga Brani
                         *  @type string
9359 8a217fa2 Olga Brani
                         *  @default ,
9360 8a217fa2 Olga Brani
                         *  @dtopt Language
9361 8a217fa2 Olga Brani
                         * 
9362 8a217fa2 Olga Brani
                         *  @example
9363 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9364 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9365 8a217fa2 Olga Brani
                         *        "oLanguage": {
9366 8a217fa2 Olga Brani
                         *          "sInfoThousands": "'"
9367 8a217fa2 Olga Brani
                         *        }
9368 8a217fa2 Olga Brani
                         *      } );
9369 8a217fa2 Olga Brani
                         *    } );
9370 8a217fa2 Olga Brani
                         */
9371 8a217fa2 Olga Brani
                        "sInfoThousands": ",",
9372 8a217fa2 Olga Brani
                
9373 8a217fa2 Olga Brani
                
9374 8a217fa2 Olga Brani
                        /**
9375 8a217fa2 Olga Brani
                         * Detail the action that will be taken when the drop down menu for the
9376 8a217fa2 Olga Brani
                         * pagination length option is changed. The '_MENU_' variable is replaced
9377 8a217fa2 Olga Brani
                         * with a default select list of 10, 25, 50 and 100, and can be replaced
9378 8a217fa2 Olga Brani
                         * with a custom select box if required.
9379 8a217fa2 Olga Brani
                         *  @type string
9380 8a217fa2 Olga Brani
                         *  @default Show _MENU_ entries
9381 8a217fa2 Olga Brani
                         *  @dtopt Language
9382 8a217fa2 Olga Brani
                         * 
9383 8a217fa2 Olga Brani
                         *  @example
9384 8a217fa2 Olga Brani
                         *    // Language change only
9385 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9386 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9387 8a217fa2 Olga Brani
                         *        "oLanguage": {
9388 8a217fa2 Olga Brani
                         *          "sLengthMenu": "Display _MENU_ records"
9389 8a217fa2 Olga Brani
                         *        }
9390 8a217fa2 Olga Brani
                         *      } );
9391 8a217fa2 Olga Brani
                         *    } );
9392 8a217fa2 Olga Brani
                         *    
9393 8a217fa2 Olga Brani
                         *  @example
9394 8a217fa2 Olga Brani
                         *    // Language and options change
9395 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9396 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9397 8a217fa2 Olga Brani
                         *        "oLanguage": {
9398 8a217fa2 Olga Brani
                         *          "sLengthMenu": 'Display <select>'+
9399 8a217fa2 Olga Brani
                         *            '<option value="10">10</option>'+
9400 8a217fa2 Olga Brani
                         *            '<option value="20">20</option>'+
9401 8a217fa2 Olga Brani
                         *            '<option value="30">30</option>'+
9402 8a217fa2 Olga Brani
                         *            '<option value="40">40</option>'+
9403 8a217fa2 Olga Brani
                         *            '<option value="50">50</option>'+
9404 8a217fa2 Olga Brani
                         *            '<option value="-1">All</option>'+
9405 8a217fa2 Olga Brani
                         *            '</select> records'
9406 8a217fa2 Olga Brani
                         *        }
9407 8a217fa2 Olga Brani
                         *      } );
9408 8a217fa2 Olga Brani
                         *    } );
9409 8a217fa2 Olga Brani
                         */
9410 8a217fa2 Olga Brani
                        "sLengthMenu": "Show _MENU_ entries",
9411 8a217fa2 Olga Brani
                
9412 8a217fa2 Olga Brani
                
9413 8a217fa2 Olga Brani
                        /**
9414 8a217fa2 Olga Brani
                         * When using Ajax sourced data and during the first draw when DataTables is
9415 8a217fa2 Olga Brani
                         * gathering the data, this message is shown in an empty row in the table to
9416 8a217fa2 Olga Brani
                         * indicate to the end user the the data is being loaded. Note that this
9417 8a217fa2 Olga Brani
                         * parameter is not used when loading data by server-side processing, just
9418 8a217fa2 Olga Brani
                         * Ajax sourced data with client-side processing.
9419 8a217fa2 Olga Brani
                         *  @type string
9420 8a217fa2 Olga Brani
                         *  @default Loading...
9421 8a217fa2 Olga Brani
                         *  @dtopt Language
9422 8a217fa2 Olga Brani
                         * 
9423 8a217fa2 Olga Brani
                         *  @example
9424 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9425 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9426 8a217fa2 Olga Brani
                         *        "oLanguage": {
9427 8a217fa2 Olga Brani
                         *          "sLoadingRecords": "Please wait - loading..."
9428 8a217fa2 Olga Brani
                         *        }
9429 8a217fa2 Olga Brani
                         *      } );
9430 8a217fa2 Olga Brani
                         *    } );
9431 8a217fa2 Olga Brani
                         */
9432 8a217fa2 Olga Brani
                        "sLoadingRecords": "Loading...",
9433 8a217fa2 Olga Brani
                
9434 8a217fa2 Olga Brani
                
9435 8a217fa2 Olga Brani
                        /**
9436 8a217fa2 Olga Brani
                         * Text which is displayed when the table is processing a user action
9437 8a217fa2 Olga Brani
                         * (usually a sort command or similar).
9438 8a217fa2 Olga Brani
                         *  @type string
9439 8a217fa2 Olga Brani
                         *  @default Processing...
9440 8a217fa2 Olga Brani
                         *  @dtopt Language
9441 8a217fa2 Olga Brani
                         * 
9442 8a217fa2 Olga Brani
                         *  @example
9443 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9444 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9445 8a217fa2 Olga Brani
                         *        "oLanguage": {
9446 8a217fa2 Olga Brani
                         *          "sProcessing": "DataTables is currently busy"
9447 8a217fa2 Olga Brani
                         *        }
9448 8a217fa2 Olga Brani
                         *      } );
9449 8a217fa2 Olga Brani
                         *    } );
9450 8a217fa2 Olga Brani
                         */
9451 8a217fa2 Olga Brani
                        "sProcessing": "Processing...",
9452 8a217fa2 Olga Brani
                
9453 8a217fa2 Olga Brani
                
9454 8a217fa2 Olga Brani
                        /**
9455 8a217fa2 Olga Brani
                         * Details the actions that will be taken when the user types into the
9456 8a217fa2 Olga Brani
                         * filtering input text box. The variable "_INPUT_", if used in the string,
9457 8a217fa2 Olga Brani
                         * is replaced with the HTML text box for the filtering input allowing
9458 8a217fa2 Olga Brani
                         * control over where it appears in the string. If "_INPUT_" is not given
9459 8a217fa2 Olga Brani
                         * then the input box is appended to the string automatically.
9460 8a217fa2 Olga Brani
                         *  @type string
9461 8a217fa2 Olga Brani
                         *  @default Search:
9462 8a217fa2 Olga Brani
                         *  @dtopt Language
9463 8a217fa2 Olga Brani
                         * 
9464 8a217fa2 Olga Brani
                         *  @example
9465 8a217fa2 Olga Brani
                         *    // Input text box will be appended at the end automatically
9466 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9467 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9468 8a217fa2 Olga Brani
                         *        "oLanguage": {
9469 8a217fa2 Olga Brani
                         *          "sSearch": "Filter records:"
9470 8a217fa2 Olga Brani
                         *        }
9471 8a217fa2 Olga Brani
                         *      } );
9472 8a217fa2 Olga Brani
                         *    } );
9473 8a217fa2 Olga Brani
                         *    
9474 8a217fa2 Olga Brani
                         *  @example
9475 8a217fa2 Olga Brani
                         *    // Specify where the filter should appear
9476 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9477 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9478 8a217fa2 Olga Brani
                         *        "oLanguage": {
9479 8a217fa2 Olga Brani
                         *          "sSearch": "Apply filter _INPUT_ to table"
9480 8a217fa2 Olga Brani
                         *        }
9481 8a217fa2 Olga Brani
                         *      } );
9482 8a217fa2 Olga Brani
                         *    } );
9483 8a217fa2 Olga Brani
                         */
9484 8a217fa2 Olga Brani
                        "sSearch": "Search:",
9485 8a217fa2 Olga Brani
                
9486 8a217fa2 Olga Brani
                
9487 8a217fa2 Olga Brani
                        /**
9488 8a217fa2 Olga Brani
                         * All of the language information can be stored in a file on the
9489 8a217fa2 Olga Brani
                         * server-side, which DataTables will look up if this parameter is passed.
9490 8a217fa2 Olga Brani
                         * It must store the URL of the language file, which is in a JSON format,
9491 8a217fa2 Olga Brani
                         * and the object has the same properties as the oLanguage object in the
9492 8a217fa2 Olga Brani
                         * initialiser object (i.e. the above parameters). Please refer to one of
9493 8a217fa2 Olga Brani
                         * the example language files to see how this works in action.
9494 8a217fa2 Olga Brani
                         *  @type string
9495 8a217fa2 Olga Brani
                         *  @default <i>Empty string - i.e. disabled</i>
9496 8a217fa2 Olga Brani
                         *  @dtopt Language
9497 8a217fa2 Olga Brani
                         * 
9498 8a217fa2 Olga Brani
                         *  @example
9499 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9500 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9501 8a217fa2 Olga Brani
                         *        "oLanguage": {
9502 8a217fa2 Olga Brani
                         *          "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
9503 8a217fa2 Olga Brani
                         *        }
9504 8a217fa2 Olga Brani
                         *      } );
9505 8a217fa2 Olga Brani
                         *    } );
9506 8a217fa2 Olga Brani
                         */
9507 8a217fa2 Olga Brani
                        "sUrl": "",
9508 8a217fa2 Olga Brani
                
9509 8a217fa2 Olga Brani
                
9510 8a217fa2 Olga Brani
                        /**
9511 8a217fa2 Olga Brani
                         * Text shown inside the table records when the is no information to be
9512 8a217fa2 Olga Brani
                         * displayed after filtering. sEmptyTable is shown when there is simply no
9513 8a217fa2 Olga Brani
                         * information in the table at all (regardless of filtering).
9514 8a217fa2 Olga Brani
                         *  @type string
9515 8a217fa2 Olga Brani
                         *  @default No matching records found
9516 8a217fa2 Olga Brani
                         *  @dtopt Language
9517 8a217fa2 Olga Brani
                         * 
9518 8a217fa2 Olga Brani
                         *  @example
9519 8a217fa2 Olga Brani
                         *    $(document).ready( function() {
9520 8a217fa2 Olga Brani
                         *      $('#example').dataTable( {
9521 8a217fa2 Olga Brani
                         *        "oLanguage": {
9522 8a217fa2 Olga Brani
                         *          "sZeroRecords": "No records to display"
9523 8a217fa2 Olga Brani
                         *        }
9524 8a217fa2 Olga Brani
                         *      } );
9525 8a217fa2 Olga Brani
                         *    } );
9526 8a217fa2 Olga Brani
                         */
9527 8a217fa2 Olga Brani
                        "sZeroRecords": "No matching records found"
9528 8a217fa2 Olga Brani
                },
9529 8a217fa2 Olga Brani
        
9530 8a217fa2 Olga Brani
        
9531 8a217fa2 Olga Brani
                /**
9532 8a217fa2 Olga Brani
                 * This parameter allows you to have define the global filtering state at
9533 8a217fa2 Olga Brani
                 * initialisation time. As an object the "sSearch" parameter must be
9534 8a217fa2 Olga Brani
                 * defined, but all other parameters are optional. When "bRegex" is true,
9535 8a217fa2 Olga Brani
                 * the search string will be treated as a regular expression, when false
9536 8a217fa2 Olga Brani
                 * (default) it will be treated as a straight string. When "bSmart"
9537 8a217fa2 Olga Brani
                 * DataTables will use it's smart filtering methods (to word match at
9538 8a217fa2 Olga Brani
                 * any point in the data), when false this will not be done.
9539 8a217fa2 Olga Brani
                 *  @namespace
9540 8a217fa2 Olga Brani
                 *  @extends DataTable.models.oSearch
9541 8a217fa2 Olga Brani
                 *  @dtopt Options
9542 8a217fa2 Olga Brani
                 * 
9543 8a217fa2 Olga Brani
                 *  @example
9544 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9545 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9546 8a217fa2 Olga Brani
                 *        "oSearch": {"sSearch": "Initial search"}
9547 8a217fa2 Olga Brani
                 *      } );
9548 8a217fa2 Olga Brani
                 *    } )
9549 8a217fa2 Olga Brani
                 */
9550 8a217fa2 Olga Brani
                "oSearch": $.extend( {}, DataTable.models.oSearch ),
9551 8a217fa2 Olga Brani
        
9552 8a217fa2 Olga Brani
        
9553 8a217fa2 Olga Brani
                /**
9554 8a217fa2 Olga Brani
                 * By default DataTables will look for the property 'aaData' when obtaining
9555 8a217fa2 Olga Brani
                 * data from an Ajax source or for server-side processing - this parameter
9556 8a217fa2 Olga Brani
                 * allows that property to be changed. You can use Javascript dotted object
9557 8a217fa2 Olga Brani
                 * notation to get a data source for multiple levels of nesting.
9558 8a217fa2 Olga Brani
                 *  @type string
9559 8a217fa2 Olga Brani
                 *  @default aaData
9560 8a217fa2 Olga Brani
                 *  @dtopt Options
9561 8a217fa2 Olga Brani
                 *  @dtopt Server-side
9562 8a217fa2 Olga Brani
                 * 
9563 8a217fa2 Olga Brani
                 *  @example
9564 8a217fa2 Olga Brani
                 *    // Get data from { "data": [...] }
9565 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9566 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
9567 8a217fa2 Olga Brani
                 *        "sAjaxSource": "sources/data.txt",
9568 8a217fa2 Olga Brani
                 *        "sAjaxDataProp": "data"
9569 8a217fa2 Olga Brani
                 *      } );
9570 8a217fa2 Olga Brani
                 *    } );
9571 8a217fa2 Olga Brani
                 *    
9572 8a217fa2 Olga Brani
                 *  @example
9573 8a217fa2 Olga Brani
                 *    // Get data from { "data": { "inner": [...] } }
9574 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9575 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
9576 8a217fa2 Olga Brani
                 *        "sAjaxSource": "sources/data.txt",
9577 8a217fa2 Olga Brani
                 *        "sAjaxDataProp": "data.inner"
9578 8a217fa2 Olga Brani
                 *      } );
9579 8a217fa2 Olga Brani
                 *    } );
9580 8a217fa2 Olga Brani
                 */
9581 8a217fa2 Olga Brani
                "sAjaxDataProp": "aaData",
9582 8a217fa2 Olga Brani
        
9583 8a217fa2 Olga Brani
        
9584 8a217fa2 Olga Brani
                /**
9585 8a217fa2 Olga Brani
                 * You can instruct DataTables to load data from an external source using this
9586 8a217fa2 Olga Brani
                 * parameter (use aData if you want to pass data in you already have). Simply
9587 8a217fa2 Olga Brani
                 * provide a url a JSON object can be obtained from. This object must include
9588 8a217fa2 Olga Brani
                 * the parameter 'aaData' which is the data source for the table.
9589 8a217fa2 Olga Brani
                 *  @type string
9590 8a217fa2 Olga Brani
                 *  @default null
9591 8a217fa2 Olga Brani
                 *  @dtopt Options
9592 8a217fa2 Olga Brani
                 *  @dtopt Server-side
9593 8a217fa2 Olga Brani
                 * 
9594 8a217fa2 Olga Brani
                 *  @example
9595 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9596 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9597 8a217fa2 Olga Brani
                 *        "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php"
9598 8a217fa2 Olga Brani
                 *      } );
9599 8a217fa2 Olga Brani
                 *    } )
9600 8a217fa2 Olga Brani
                 */
9601 8a217fa2 Olga Brani
                "sAjaxSource": null,
9602 8a217fa2 Olga Brani
        
9603 8a217fa2 Olga Brani
        
9604 8a217fa2 Olga Brani
                /**
9605 8a217fa2 Olga Brani
                 * This parameter can be used to override the default prefix that DataTables
9606 8a217fa2 Olga Brani
                 * assigns to a cookie when state saving is enabled.
9607 8a217fa2 Olga Brani
                 *  @type string
9608 8a217fa2 Olga Brani
                 *  @default SpryMedia_DataTables_
9609 8a217fa2 Olga Brani
                 *  @dtopt Options
9610 8a217fa2 Olga Brani
                 * 
9611 8a217fa2 Olga Brani
                 *  @example
9612 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9613 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9614 8a217fa2 Olga Brani
                 *        "sCookiePrefix": "my_datatable_",
9615 8a217fa2 Olga Brani
                 *      } );
9616 8a217fa2 Olga Brani
                 *    } );
9617 8a217fa2 Olga Brani
                 */
9618 8a217fa2 Olga Brani
                "sCookiePrefix": "SpryMedia_DataTables_",
9619 8a217fa2 Olga Brani
        
9620 8a217fa2 Olga Brani
        
9621 8a217fa2 Olga Brani
                /**
9622 8a217fa2 Olga Brani
                 * This initialisation variable allows you to specify exactly where in the
9623 8a217fa2 Olga Brani
                 * DOM you want DataTables to inject the various controls it adds to the page
9624 8a217fa2 Olga Brani
                 * (for example you might want the pagination controls at the top of the
9625 8a217fa2 Olga Brani
                 * table). DIV elements (with or without a custom class) can also be added to
9626 8a217fa2 Olga Brani
                 * aid styling. The follow syntax is used:
9627 8a217fa2 Olga Brani
                 *   <ul>
9628 8a217fa2 Olga Brani
                 *     <li>The following options are allowed:        
9629 8a217fa2 Olga Brani
                 *       <ul>
9630 8a217fa2 Olga Brani
                 *         <li>'l' - Length changing</li
9631 8a217fa2 Olga Brani
                 *         <li>'f' - Filtering input</li>
9632 8a217fa2 Olga Brani
                 *         <li>'t' - The table!</li>
9633 8a217fa2 Olga Brani
                 *         <li>'i' - Information</li>
9634 8a217fa2 Olga Brani
                 *         <li>'p' - Pagination</li>
9635 8a217fa2 Olga Brani
                 *         <li>'r' - pRocessing</li>
9636 8a217fa2 Olga Brani
                 *       </ul>
9637 8a217fa2 Olga Brani
                 *     </li>
9638 8a217fa2 Olga Brani
                 *     <li>The following constants are allowed:
9639 8a217fa2 Olga Brani
                 *       <ul>
9640 8a217fa2 Olga Brani
                 *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
9641 8a217fa2 Olga Brani
                 *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
9642 8a217fa2 Olga Brani
                 *       </ul>
9643 8a217fa2 Olga Brani
                 *     </li>
9644 8a217fa2 Olga Brani
                 *     <li>The following syntax is expected:
9645 8a217fa2 Olga Brani
                 *       <ul>
9646 8a217fa2 Olga Brani
                 *         <li>'&lt;' and '&gt;' - div elements</li>
9647 8a217fa2 Olga Brani
                 *         <li>'&lt;"class" and '&gt;' - div with a class</li>
9648 8a217fa2 Olga Brani
                 *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
9649 8a217fa2 Olga Brani
                 *       </ul>
9650 8a217fa2 Olga Brani
                 *     </li>
9651 8a217fa2 Olga Brani
                 *     <li>Examples:
9652 8a217fa2 Olga Brani
                 *       <ul>
9653 8a217fa2 Olga Brani
                 *         <li>'&lt;"wrapper"flipt&gt;'</li>
9654 8a217fa2 Olga Brani
                 *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
9655 8a217fa2 Olga Brani
                 *       </ul>
9656 8a217fa2 Olga Brani
                 *     </li>
9657 8a217fa2 Olga Brani
                 *   </ul>
9658 8a217fa2 Olga Brani
                 *  @type string
9659 8a217fa2 Olga Brani
                 *  @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b> 
9660 8a217fa2 Olga Brani
                 *    <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i>
9661 8a217fa2 Olga Brani
                 *  @dtopt Options
9662 8a217fa2 Olga Brani
                 * 
9663 8a217fa2 Olga Brani
                 *  @example
9664 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9665 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9666 8a217fa2 Olga Brani
                 *        "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
9667 8a217fa2 Olga Brani
                 *      } );
9668 8a217fa2 Olga Brani
                 *    } );
9669 8a217fa2 Olga Brani
                 */
9670 8a217fa2 Olga Brani
                "sDom": "lfrtip",
9671 8a217fa2 Olga Brani
        
9672 8a217fa2 Olga Brani
        
9673 8a217fa2 Olga Brani
                /**
9674 8a217fa2 Olga Brani
                 * DataTables features two different built-in pagination interaction methods
9675 8a217fa2 Olga Brani
                 * ('two_button' or 'full_numbers') which present different page controls to
9676 8a217fa2 Olga Brani
                 * the end user. Further methods can be added using the API (see below).
9677 8a217fa2 Olga Brani
                 *  @type string
9678 8a217fa2 Olga Brani
                 *  @default two_button
9679 8a217fa2 Olga Brani
                 *  @dtopt Options
9680 8a217fa2 Olga Brani
                 * 
9681 8a217fa2 Olga Brani
                 *  @example
9682 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9683 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9684 8a217fa2 Olga Brani
                 *        "sPaginationType": "full_numbers"
9685 8a217fa2 Olga Brani
                 *      } );
9686 8a217fa2 Olga Brani
                 *    } )
9687 8a217fa2 Olga Brani
                 */
9688 8a217fa2 Olga Brani
                "sPaginationType": "two_button",
9689 8a217fa2 Olga Brani
        
9690 8a217fa2 Olga Brani
        
9691 8a217fa2 Olga Brani
                /**
9692 8a217fa2 Olga Brani
                 * Enable horizontal scrolling. When a table is too wide to fit into a certain
9693 8a217fa2 Olga Brani
                 * layout, or you have a large number of columns in the table, you can enable
9694 8a217fa2 Olga Brani
                 * x-scrolling to show the table in a viewport, which can be scrolled. This
9695 8a217fa2 Olga Brani
                 * property can be any CSS unit, or a number (in which case it will be treated
9696 8a217fa2 Olga Brani
                 * as a pixel measurement).
9697 8a217fa2 Olga Brani
                 *  @type string
9698 8a217fa2 Olga Brani
                 *  @default <i>blank string - i.e. disabled</i>
9699 8a217fa2 Olga Brani
                 *  @dtopt Features
9700 8a217fa2 Olga Brani
                 * 
9701 8a217fa2 Olga Brani
                 *  @example
9702 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9703 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9704 8a217fa2 Olga Brani
                 *        "sScrollX": "100%",
9705 8a217fa2 Olga Brani
                 *        "bScrollCollapse": true
9706 8a217fa2 Olga Brani
                 *      } );
9707 8a217fa2 Olga Brani
                 *    } );
9708 8a217fa2 Olga Brani
                 */
9709 8a217fa2 Olga Brani
                "sScrollX": "",
9710 8a217fa2 Olga Brani
        
9711 8a217fa2 Olga Brani
        
9712 8a217fa2 Olga Brani
                /**
9713 8a217fa2 Olga Brani
                 * This property can be used to force a DataTable to use more width than it
9714 8a217fa2 Olga Brani
                 * might otherwise do when x-scrolling is enabled. For example if you have a
9715 8a217fa2 Olga Brani
                 * table which requires to be well spaced, this parameter is useful for
9716 8a217fa2 Olga Brani
                 * "over-sizing" the table, and thus forcing scrolling. This property can by
9717 8a217fa2 Olga Brani
                 * any CSS unit, or a number (in which case it will be treated as a pixel
9718 8a217fa2 Olga Brani
                 * measurement).
9719 8a217fa2 Olga Brani
                 *  @type string
9720 8a217fa2 Olga Brani
                 *  @default <i>blank string - i.e. disabled</i>
9721 8a217fa2 Olga Brani
                 *  @dtopt Options
9722 8a217fa2 Olga Brani
                 * 
9723 8a217fa2 Olga Brani
                 *  @example
9724 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9725 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9726 8a217fa2 Olga Brani
                 *        "sScrollX": "100%",
9727 8a217fa2 Olga Brani
                 *        "sScrollXInner": "110%"
9728 8a217fa2 Olga Brani
                 *      } );
9729 8a217fa2 Olga Brani
                 *    } );
9730 8a217fa2 Olga Brani
                 */
9731 8a217fa2 Olga Brani
                "sScrollXInner": "",
9732 8a217fa2 Olga Brani
        
9733 8a217fa2 Olga Brani
        
9734 8a217fa2 Olga Brani
                /**
9735 8a217fa2 Olga Brani
                 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
9736 8a217fa2 Olga Brani
                 * to the given height, and enable scrolling for any data which overflows the
9737 8a217fa2 Olga Brani
                 * current viewport. This can be used as an alternative to paging to display
9738 8a217fa2 Olga Brani
                 * a lot of data in a small area (although paging and scrolling can both be
9739 8a217fa2 Olga Brani
                 * enabled at the same time). This property can be any CSS unit, or a number
9740 8a217fa2 Olga Brani
                 * (in which case it will be treated as a pixel measurement).
9741 8a217fa2 Olga Brani
                 *  @type string
9742 8a217fa2 Olga Brani
                 *  @default <i>blank string - i.e. disabled</i>
9743 8a217fa2 Olga Brani
                 *  @dtopt Features
9744 8a217fa2 Olga Brani
                 * 
9745 8a217fa2 Olga Brani
                 *  @example
9746 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9747 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9748 8a217fa2 Olga Brani
                 *        "sScrollY": "200px",
9749 8a217fa2 Olga Brani
                 *        "bPaginate": false
9750 8a217fa2 Olga Brani
                 *      } );
9751 8a217fa2 Olga Brani
                 *    } );
9752 8a217fa2 Olga Brani
                 */
9753 8a217fa2 Olga Brani
                "sScrollY": "",
9754 8a217fa2 Olga Brani
        
9755 8a217fa2 Olga Brani
        
9756 8a217fa2 Olga Brani
                /**
9757 8a217fa2 Olga Brani
                 * Set the HTTP method that is used to make the Ajax call for server-side
9758 8a217fa2 Olga Brani
                 * processing or Ajax sourced data.
9759 8a217fa2 Olga Brani
                 *  @type string
9760 8a217fa2 Olga Brani
                 *  @default GET
9761 8a217fa2 Olga Brani
                 *  @dtopt Options
9762 8a217fa2 Olga Brani
                 *  @dtopt Server-side
9763 8a217fa2 Olga Brani
                 * 
9764 8a217fa2 Olga Brani
                 *  @example
9765 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9766 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9767 8a217fa2 Olga Brani
                 *        "bServerSide": true,
9768 8a217fa2 Olga Brani
                 *        "sAjaxSource": "scripts/post.php",
9769 8a217fa2 Olga Brani
                 *        "sServerMethod": "POST"
9770 8a217fa2 Olga Brani
                 *      } );
9771 8a217fa2 Olga Brani
                 *    } );
9772 8a217fa2 Olga Brani
                 */
9773 8a217fa2 Olga Brani
                "sServerMethod": "GET"
9774 8a217fa2 Olga Brani
        };
9775 8a217fa2 Olga Brani
        
9776 8a217fa2 Olga Brani
        
9777 8a217fa2 Olga Brani
        
9778 8a217fa2 Olga Brani
        /**
9779 8a217fa2 Olga Brani
         * Column options that can be given to DataTables at initialisation time.
9780 8a217fa2 Olga Brani
         *  @namespace
9781 8a217fa2 Olga Brani
         */
9782 8a217fa2 Olga Brani
        DataTable.defaults.columns = {
9783 8a217fa2 Olga Brani
                /**
9784 8a217fa2 Olga Brani
                 * Allows a column's sorting to take multiple columns into account when 
9785 8a217fa2 Olga Brani
                 * doing a sort. For example first name / last name columns make sense to 
9786 8a217fa2 Olga Brani
                 * do a multi-column sort over the two columns.
9787 8a217fa2 Olga Brani
                 *  @type array
9788 8a217fa2 Olga Brani
                 *  @default null <i>Takes the value of the column index automatically</i>
9789 8a217fa2 Olga Brani
                 *  @dtopt Columns
9790 8a217fa2 Olga Brani
                 * 
9791 8a217fa2 Olga Brani
                 *  @example
9792 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
9793 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9794 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9795 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [
9796 8a217fa2 Olga Brani
                 *          { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
9797 8a217fa2 Olga Brani
                 *          { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
9798 8a217fa2 Olga Brani
                 *          { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
9799 8a217fa2 Olga Brani
                 *        ]
9800 8a217fa2 Olga Brani
                 *      } );
9801 8a217fa2 Olga Brani
                 *    } );
9802 8a217fa2 Olga Brani
                 *    
9803 8a217fa2 Olga Brani
                 *  @example
9804 8a217fa2 Olga Brani
                 *    // Using aoColumns
9805 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9806 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9807 8a217fa2 Olga Brani
                 *        "aoColumns": [
9808 8a217fa2 Olga Brani
                 *          { "aDataSort": [ 0, 1 ] },
9809 8a217fa2 Olga Brani
                 *          { "aDataSort": [ 1, 0 ] },
9810 8a217fa2 Olga Brani
                 *          { "aDataSort": [ 2, 3, 4 ] },
9811 8a217fa2 Olga Brani
                 *          null,
9812 8a217fa2 Olga Brani
                 *          null
9813 8a217fa2 Olga Brani
                 *        ]
9814 8a217fa2 Olga Brani
                 *      } );
9815 8a217fa2 Olga Brani
                 *    } );
9816 8a217fa2 Olga Brani
                 */
9817 8a217fa2 Olga Brani
                "aDataSort": null,
9818 8a217fa2 Olga Brani
        
9819 8a217fa2 Olga Brani
        
9820 8a217fa2 Olga Brani
                /**
9821 8a217fa2 Olga Brani
                 * You can control the default sorting direction, and even alter the behaviour
9822 8a217fa2 Olga Brani
                 * of the sort handler (i.e. only allow ascending sorting etc) using this
9823 8a217fa2 Olga Brani
                 * parameter.
9824 8a217fa2 Olga Brani
                 *  @type array
9825 8a217fa2 Olga Brani
                 *  @default [ 'asc', 'desc' ]
9826 8a217fa2 Olga Brani
                 *  @dtopt Columns
9827 8a217fa2 Olga Brani
                 * 
9828 8a217fa2 Olga Brani
                 *  @example
9829 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
9830 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9831 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9832 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [
9833 8a217fa2 Olga Brani
                 *          { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
9834 8a217fa2 Olga Brani
                 *          { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] },
9835 8a217fa2 Olga Brani
                 *          { "asSorting": [ "desc" ], "aTargets": [ 3 ] }
9836 8a217fa2 Olga Brani
                 *        ]
9837 8a217fa2 Olga Brani
                 *      } );
9838 8a217fa2 Olga Brani
                 *    } );
9839 8a217fa2 Olga Brani
                 *    
9840 8a217fa2 Olga Brani
                 *  @example
9841 8a217fa2 Olga Brani
                 *    // Using aoColumns
9842 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9843 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9844 8a217fa2 Olga Brani
                 *        "aoColumns": [
9845 8a217fa2 Olga Brani
                 *          null,
9846 8a217fa2 Olga Brani
                 *          { "asSorting": [ "asc" ] },
9847 8a217fa2 Olga Brani
                 *          { "asSorting": [ "desc", "asc", "asc" ] },
9848 8a217fa2 Olga Brani
                 *          { "asSorting": [ "desc" ] },
9849 8a217fa2 Olga Brani
                 *          null
9850 8a217fa2 Olga Brani
                 *        ]
9851 8a217fa2 Olga Brani
                 *      } );
9852 8a217fa2 Olga Brani
                 *    } );
9853 8a217fa2 Olga Brani
                 */
9854 8a217fa2 Olga Brani
                "asSorting": [ 'asc', 'desc' ],
9855 8a217fa2 Olga Brani
        
9856 8a217fa2 Olga Brani
        
9857 8a217fa2 Olga Brani
                /**
9858 8a217fa2 Olga Brani
                 * Enable or disable filtering on the data in this column.
9859 8a217fa2 Olga Brani
                 *  @type boolean
9860 8a217fa2 Olga Brani
                 *  @default true
9861 8a217fa2 Olga Brani
                 *  @dtopt Columns
9862 8a217fa2 Olga Brani
                 * 
9863 8a217fa2 Olga Brani
                 *  @example
9864 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
9865 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9866 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9867 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
9868 8a217fa2 Olga Brani
                 *          { "bSearchable": false, "aTargets": [ 0 ] }
9869 8a217fa2 Olga Brani
                 *        ] } );
9870 8a217fa2 Olga Brani
                 *    } );
9871 8a217fa2 Olga Brani
                 *    
9872 8a217fa2 Olga Brani
                 *  @example
9873 8a217fa2 Olga Brani
                 *    // Using aoColumns
9874 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9875 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9876 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
9877 8a217fa2 Olga Brani
                 *          { "bSearchable": false },
9878 8a217fa2 Olga Brani
                 *          null,
9879 8a217fa2 Olga Brani
                 *          null,
9880 8a217fa2 Olga Brani
                 *          null,
9881 8a217fa2 Olga Brani
                 *          null
9882 8a217fa2 Olga Brani
                 *        ] } );
9883 8a217fa2 Olga Brani
                 *    } );
9884 8a217fa2 Olga Brani
                 */
9885 8a217fa2 Olga Brani
                "bSearchable": true,
9886 8a217fa2 Olga Brani
        
9887 8a217fa2 Olga Brani
        
9888 8a217fa2 Olga Brani
                /**
9889 8a217fa2 Olga Brani
                 * Enable or disable sorting on this column.
9890 8a217fa2 Olga Brani
                 *  @type boolean
9891 8a217fa2 Olga Brani
                 *  @default true
9892 8a217fa2 Olga Brani
                 *  @dtopt Columns
9893 8a217fa2 Olga Brani
                 * 
9894 8a217fa2 Olga Brani
                 *  @example
9895 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
9896 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9897 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9898 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
9899 8a217fa2 Olga Brani
                 *          { "bSortable": false, "aTargets": [ 0 ] }
9900 8a217fa2 Olga Brani
                 *        ] } );
9901 8a217fa2 Olga Brani
                 *    } );
9902 8a217fa2 Olga Brani
                 *    
9903 8a217fa2 Olga Brani
                 *  @example
9904 8a217fa2 Olga Brani
                 *    // Using aoColumns
9905 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9906 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9907 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
9908 8a217fa2 Olga Brani
                 *          { "bSortable": false },
9909 8a217fa2 Olga Brani
                 *          null,
9910 8a217fa2 Olga Brani
                 *          null,
9911 8a217fa2 Olga Brani
                 *          null,
9912 8a217fa2 Olga Brani
                 *          null
9913 8a217fa2 Olga Brani
                 *        ] } );
9914 8a217fa2 Olga Brani
                 *    } );
9915 8a217fa2 Olga Brani
                 */
9916 8a217fa2 Olga Brani
                "bSortable": true,
9917 8a217fa2 Olga Brani
        
9918 8a217fa2 Olga Brani
        
9919 8a217fa2 Olga Brani
                /**
9920 8a217fa2 Olga Brani
                 * <code>Deprecated</code> When using fnRender() for a column, you may wish 
9921 8a217fa2 Olga Brani
                 * to use the original data (before rendering) for sorting and filtering 
9922 8a217fa2 Olga Brani
                 * (the default is to used the rendered data that the user can see). This 
9923 8a217fa2 Olga Brani
                 * may be useful for dates etc.
9924 8a217fa2 Olga Brani
                 * 
9925 8a217fa2 Olga Brani
                 * Please note that this option has now been deprecated and will be removed
9926 8a217fa2 Olga Brani
                 * in the next version of DataTables. Please use mRender / mData rather than
9927 8a217fa2 Olga Brani
                 * fnRender.
9928 8a217fa2 Olga Brani
                 *  @type boolean
9929 8a217fa2 Olga Brani
                 *  @default true
9930 8a217fa2 Olga Brani
                 *  @dtopt Columns
9931 8a217fa2 Olga Brani
                 *  @deprecated
9932 8a217fa2 Olga Brani
                 */
9933 8a217fa2 Olga Brani
                "bUseRendered": true,
9934 8a217fa2 Olga Brani
        
9935 8a217fa2 Olga Brani
        
9936 8a217fa2 Olga Brani
                /**
9937 8a217fa2 Olga Brani
                 * Enable or disable the display of this column.
9938 8a217fa2 Olga Brani
                 *  @type boolean
9939 8a217fa2 Olga Brani
                 *  @default true
9940 8a217fa2 Olga Brani
                 *  @dtopt Columns
9941 8a217fa2 Olga Brani
                 * 
9942 8a217fa2 Olga Brani
                 *  @example
9943 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
9944 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9945 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9946 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
9947 8a217fa2 Olga Brani
                 *          { "bVisible": false, "aTargets": [ 0 ] }
9948 8a217fa2 Olga Brani
                 *        ] } );
9949 8a217fa2 Olga Brani
                 *    } );
9950 8a217fa2 Olga Brani
                 *    
9951 8a217fa2 Olga Brani
                 *  @example
9952 8a217fa2 Olga Brani
                 *    // Using aoColumns
9953 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9954 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9955 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
9956 8a217fa2 Olga Brani
                 *          { "bVisible": false },
9957 8a217fa2 Olga Brani
                 *          null,
9958 8a217fa2 Olga Brani
                 *          null,
9959 8a217fa2 Olga Brani
                 *          null,
9960 8a217fa2 Olga Brani
                 *          null
9961 8a217fa2 Olga Brani
                 *        ] } );
9962 8a217fa2 Olga Brani
                 *    } );
9963 8a217fa2 Olga Brani
                 */
9964 8a217fa2 Olga Brani
                "bVisible": true,
9965 8a217fa2 Olga Brani
                
9966 8a217fa2 Olga Brani
                
9967 8a217fa2 Olga Brani
                /**
9968 8a217fa2 Olga Brani
                 * Developer definable function that is called whenever a cell is created (Ajax source,
9969 8a217fa2 Olga Brani
                 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
9970 8a217fa2 Olga Brani
                 * allowing you to modify the DOM element (add background colour for example) when the
9971 8a217fa2 Olga Brani
                 * element is available.
9972 8a217fa2 Olga Brani
                 *  @type function
9973 8a217fa2 Olga Brani
                 *  @param {element} nTd The TD node that has been created
9974 8a217fa2 Olga Brani
                 *  @param {*} sData The Data for the cell
9975 8a217fa2 Olga Brani
                 *  @param {array|object} oData The data for the whole row
9976 8a217fa2 Olga Brani
                 *  @param {int} iRow The row index for the aoData data store
9977 8a217fa2 Olga Brani
                 *  @param {int} iCol The column index for aoColumns
9978 8a217fa2 Olga Brani
                 *  @dtopt Columns
9979 8a217fa2 Olga Brani
                 * 
9980 8a217fa2 Olga Brani
                 *  @example
9981 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
9982 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
9983 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ {
9984 8a217fa2 Olga Brani
                 *          "aTargets": [3],
9985 8a217fa2 Olga Brani
                 *          "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
9986 8a217fa2 Olga Brani
                 *            if ( sData == "1.7" ) {
9987 8a217fa2 Olga Brani
                 *              $(nTd).css('color', 'blue')
9988 8a217fa2 Olga Brani
                 *            }
9989 8a217fa2 Olga Brani
                 *          }
9990 8a217fa2 Olga Brani
                 *        } ]
9991 8a217fa2 Olga Brani
                 *      });
9992 8a217fa2 Olga Brani
                 *    } );
9993 8a217fa2 Olga Brani
                 */
9994 8a217fa2 Olga Brani
                "fnCreatedCell": null,
9995 8a217fa2 Olga Brani
        
9996 8a217fa2 Olga Brani
        
9997 8a217fa2 Olga Brani
                /**
9998 8a217fa2 Olga Brani
                 * <code>Deprecated</code> Custom display function that will be called for the 
9999 8a217fa2 Olga Brani
                 * display of each cell in this column.
10000 8a217fa2 Olga Brani
                 *
10001 8a217fa2 Olga Brani
                 * Please note that this option has now been deprecated and will be removed
10002 8a217fa2 Olga Brani
                 * in the next version of DataTables. Please use mRender / mData rather than
10003 8a217fa2 Olga Brani
                 * fnRender.
10004 8a217fa2 Olga Brani
                 *  @type function
10005 8a217fa2 Olga Brani
                 *  @param {object} o Object with the following parameters:
10006 8a217fa2 Olga Brani
                 *  @param {int}    o.iDataRow The row in aoData
10007 8a217fa2 Olga Brani
                 *  @param {int}    o.iDataColumn The column in question
10008 8a217fa2 Olga Brani
                 *  @param {array}  o.aData The data for the row in question
10009 8a217fa2 Olga Brani
                 *  @param {object} o.oSettings The settings object for this DataTables instance
10010 8a217fa2 Olga Brani
                 *  @param {object} o.mDataProp The data property used for this column
10011 8a217fa2 Olga Brani
                 *  @param {*}      val The current cell value
10012 8a217fa2 Olga Brani
                 *  @returns {string} The string you which to use in the display
10013 8a217fa2 Olga Brani
                 *  @dtopt Columns
10014 8a217fa2 Olga Brani
                 *  @deprecated
10015 8a217fa2 Olga Brani
                 */
10016 8a217fa2 Olga Brani
                "fnRender": null,
10017 8a217fa2 Olga Brani
        
10018 8a217fa2 Olga Brani
        
10019 8a217fa2 Olga Brani
                /**
10020 8a217fa2 Olga Brani
                 * The column index (starting from 0!) that you wish a sort to be performed
10021 8a217fa2 Olga Brani
                 * upon when this column is selected for sorting. This can be used for sorting
10022 8a217fa2 Olga Brani
                 * on hidden columns for example.
10023 8a217fa2 Olga Brani
                 *  @type int
10024 8a217fa2 Olga Brani
                 *  @default -1 <i>Use automatically calculated column index</i>
10025 8a217fa2 Olga Brani
                 *  @dtopt Columns
10026 8a217fa2 Olga Brani
                 * 
10027 8a217fa2 Olga Brani
                 *  @example
10028 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10029 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10030 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10031 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10032 8a217fa2 Olga Brani
                 *          { "iDataSort": 1, "aTargets": [ 0 ] }
10033 8a217fa2 Olga Brani
                 *        ]
10034 8a217fa2 Olga Brani
                 *      } );
10035 8a217fa2 Olga Brani
                 *    } );
10036 8a217fa2 Olga Brani
                 *    
10037 8a217fa2 Olga Brani
                 *  @example
10038 8a217fa2 Olga Brani
                 *    // Using aoColumns
10039 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10040 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10041 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10042 8a217fa2 Olga Brani
                 *          { "iDataSort": 1 },
10043 8a217fa2 Olga Brani
                 *          null,
10044 8a217fa2 Olga Brani
                 *          null,
10045 8a217fa2 Olga Brani
                 *          null,
10046 8a217fa2 Olga Brani
                 *          null
10047 8a217fa2 Olga Brani
                 *        ]
10048 8a217fa2 Olga Brani
                 *      } );
10049 8a217fa2 Olga Brani
                 *    } );
10050 8a217fa2 Olga Brani
                 */
10051 8a217fa2 Olga Brani
                "iDataSort": -1,
10052 8a217fa2 Olga Brani
        
10053 8a217fa2 Olga Brani
        
10054 8a217fa2 Olga Brani
                /**
10055 8a217fa2 Olga Brani
                 * This parameter has been replaced by mData in DataTables to ensure naming
10056 8a217fa2 Olga Brani
                 * consistency. mDataProp can still be used, as there is backwards compatibility
10057 8a217fa2 Olga Brani
                 * in DataTables for this option, but it is strongly recommended that you use
10058 8a217fa2 Olga Brani
                 * mData in preference to mDataProp.
10059 8a217fa2 Olga Brani
                 *  @name DataTable.defaults.columns.mDataProp
10060 8a217fa2 Olga Brani
                 */
10061 8a217fa2 Olga Brani
        
10062 8a217fa2 Olga Brani
        
10063 8a217fa2 Olga Brani
                /**
10064 8a217fa2 Olga Brani
                 * This property can be used to read data from any JSON data source property,
10065 8a217fa2 Olga Brani
                 * including deeply nested objects / properties. mData can be given in a
10066 8a217fa2 Olga Brani
                 * number of different ways which effect its behaviour:
10067 8a217fa2 Olga Brani
                 *   <ul>
10068 8a217fa2 Olga Brani
                 *     <li>integer - treated as an array index for the data source. This is the
10069 8a217fa2 Olga Brani
                 *       default that DataTables uses (incrementally increased for each column).</li>
10070 8a217fa2 Olga Brani
                 *     <li>string - read an object property from the data source. Note that you can
10071 8a217fa2 Olga Brani
                 *       use Javascript dotted notation to read deep properties / arrays from the
10072 8a217fa2 Olga Brani
                 *       data source.</li>
10073 8a217fa2 Olga Brani
                 *     <li>null - the sDefaultContent option will be used for the cell (null
10074 8a217fa2 Olga Brani
                 *       by default, so you will need to specify the default content you want -
10075 8a217fa2 Olga Brani
                 *       typically an empty string). This can be useful on generated columns such 
10076 8a217fa2 Olga Brani
                 *       as edit / delete action columns.</li>
10077 8a217fa2 Olga Brani
                 *     <li>function - the function given will be executed whenever DataTables 
10078 8a217fa2 Olga Brani
                 *       needs to set or get the data for a cell in the column. The function 
10079 8a217fa2 Olga Brani
                 *       takes three parameters:
10080 8a217fa2 Olga Brani
                 *       <ul>
10081 8a217fa2 Olga Brani
                 *         <li>{array|object} The data source for the row</li>
10082 8a217fa2 Olga Brani
                 *         <li>{string} The type call data requested - this will be 'set' when
10083 8a217fa2 Olga Brani
                 *           setting data or 'filter', 'display', 'type', 'sort' or undefined when 
10084 8a217fa2 Olga Brani
                 *           gathering data. Note that when <i>undefined</i> is given for the type
10085 8a217fa2 Olga Brani
                 *           DataTables expects to get the raw data for the object back</li>
10086 8a217fa2 Olga Brani
                 *         <li>{*} Data to set when the second parameter is 'set'.</li>
10087 8a217fa2 Olga Brani
                 *       </ul>
10088 8a217fa2 Olga Brani
                 *       The return value from the function is not required when 'set' is the type
10089 8a217fa2 Olga Brani
                 *       of call, but otherwise the return is what will be used for the data
10090 8a217fa2 Olga Brani
                 *       requested.</li>
10091 8a217fa2 Olga Brani
                 *    </ul>
10092 8a217fa2 Olga Brani
                 *
10093 8a217fa2 Olga Brani
                 * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change
10094 8a217fa2 Olga Brani
                 * reflects the flexibility of this property and is consistent with the naming of
10095 8a217fa2 Olga Brani
                 * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as
10096 8a217fa2 Olga Brani
                 * it automatically maps the old name to the new if required.
10097 8a217fa2 Olga Brani
                 *  @type string|int|function|null
10098 8a217fa2 Olga Brani
                 *  @default null <i>Use automatically calculated column index</i>
10099 8a217fa2 Olga Brani
                 *  @dtopt Columns
10100 8a217fa2 Olga Brani
                 * 
10101 8a217fa2 Olga Brani
                 *  @example
10102 8a217fa2 Olga Brani
                 *    // Read table data from objects
10103 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10104 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
10105 8a217fa2 Olga Brani
                 *        "sAjaxSource": "sources/deep.txt",
10106 8a217fa2 Olga Brani
                 *        "aoColumns": [
10107 8a217fa2 Olga Brani
                 *          { "mData": "engine" },
10108 8a217fa2 Olga Brani
                 *          { "mData": "browser" },
10109 8a217fa2 Olga Brani
                 *          { "mData": "platform.inner" },
10110 8a217fa2 Olga Brani
                 *          { "mData": "platform.details.0" },
10111 8a217fa2 Olga Brani
                 *          { "mData": "platform.details.1" }
10112 8a217fa2 Olga Brani
                 *        ]
10113 8a217fa2 Olga Brani
                 *      } );
10114 8a217fa2 Olga Brani
                 *    } );
10115 8a217fa2 Olga Brani
                 * 
10116 8a217fa2 Olga Brani
                 *  @example
10117 8a217fa2 Olga Brani
                 *    // Using mData as a function to provide different information for
10118 8a217fa2 Olga Brani
                 *    // sorting, filtering and display. In this case, currency (price)
10119 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10120 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
10121 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ {
10122 8a217fa2 Olga Brani
                 *          "aTargets": [ 0 ],
10123 8a217fa2 Olga Brani
                 *          "mData": function ( source, type, val ) {
10124 8a217fa2 Olga Brani
                 *            if (type === 'set') {
10125 8a217fa2 Olga Brani
                 *              source.price = val;
10126 8a217fa2 Olga Brani
                 *              // Store the computed dislay and filter values for efficiency
10127 8a217fa2 Olga Brani
                 *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
10128 8a217fa2 Olga Brani
                 *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
10129 8a217fa2 Olga Brani
                 *              return;
10130 8a217fa2 Olga Brani
                 *            }
10131 8a217fa2 Olga Brani
                 *            else if (type === 'display') {
10132 8a217fa2 Olga Brani
                 *              return source.price_display;
10133 8a217fa2 Olga Brani
                 *            }
10134 8a217fa2 Olga Brani
                 *            else if (type === 'filter') {
10135 8a217fa2 Olga Brani
                 *              return source.price_filter;
10136 8a217fa2 Olga Brani
                 *            }
10137 8a217fa2 Olga Brani
                 *            // 'sort', 'type' and undefined all just use the integer
10138 8a217fa2 Olga Brani
                 *            return source.price;
10139 8a217fa2 Olga Brani
                 *          }
10140 8a217fa2 Olga Brani
                 *        } ]
10141 8a217fa2 Olga Brani
                 *      } );
10142 8a217fa2 Olga Brani
                 *    } );
10143 8a217fa2 Olga Brani
                 */
10144 8a217fa2 Olga Brani
                "mData": null,
10145 8a217fa2 Olga Brani
        
10146 8a217fa2 Olga Brani
        
10147 8a217fa2 Olga Brani
                /**
10148 8a217fa2 Olga Brani
                 * This property is the rendering partner to mData and it is suggested that
10149 8a217fa2 Olga Brani
                 * when you want to manipulate data for display (including filtering, sorting etc)
10150 8a217fa2 Olga Brani
                 * but not altering the underlying data for the table, use this property. mData
10151 8a217fa2 Olga Brani
                 * can actually do everything this property can and more, but this parameter is
10152 8a217fa2 Olga Brani
                 * easier to use since there is no 'set' option. Like mData is can be given
10153 8a217fa2 Olga Brani
                 * in a number of different ways to effect its behaviour, with the addition of 
10154 8a217fa2 Olga Brani
                 * supporting array syntax for easy outputting of arrays (including arrays of
10155 8a217fa2 Olga Brani
                 * objects):
10156 8a217fa2 Olga Brani
                 *   <ul>
10157 8a217fa2 Olga Brani
                 *     <li>integer - treated as an array index for the data source. This is the
10158 8a217fa2 Olga Brani
                 *       default that DataTables uses (incrementally increased for each column).</li>
10159 8a217fa2 Olga Brani
                 *     <li>string - read an object property from the data source. Note that you can
10160 8a217fa2 Olga Brani
                 *       use Javascript dotted notation to read deep properties / arrays from the
10161 8a217fa2 Olga Brani
                 *       data source and also array brackets to indicate that the data reader should
10162 8a217fa2 Olga Brani
                 *       loop over the data source array. When characters are given between the array
10163 8a217fa2 Olga Brani
                 *       brackets, these characters are used to join the data source array together.
10164 8a217fa2 Olga Brani
                 *       For example: "accounts[, ].name" would result in a comma separated list with
10165 8a217fa2 Olga Brani
                 *       the 'name' value from the 'accounts' array of objects.</li>
10166 8a217fa2 Olga Brani
                 *     <li>function - the function given will be executed whenever DataTables 
10167 8a217fa2 Olga Brani
                 *       needs to set or get the data for a cell in the column. The function 
10168 8a217fa2 Olga Brani
                 *       takes three parameters:
10169 8a217fa2 Olga Brani
                 *       <ul>
10170 8a217fa2 Olga Brani
                 *         <li>{array|object} The data source for the row (based on mData)</li>
10171 8a217fa2 Olga Brani
                 *         <li>{string} The type call data requested - this will be 'filter', 'display', 
10172 8a217fa2 Olga Brani
                 *           'type' or 'sort'.</li>
10173 8a217fa2 Olga Brani
                 *         <li>{array|object} The full data source for the row (not based on mData)</li>
10174 8a217fa2 Olga Brani
                 *       </ul>
10175 8a217fa2 Olga Brani
                 *       The return value from the function is what will be used for the data
10176 8a217fa2 Olga Brani
                 *       requested.</li>
10177 8a217fa2 Olga Brani
                 *    </ul>
10178 8a217fa2 Olga Brani
                 *  @type string|int|function|null
10179 8a217fa2 Olga Brani
                 *  @default null <i>Use mData</i>
10180 8a217fa2 Olga Brani
                 *  @dtopt Columns
10181 8a217fa2 Olga Brani
                 * 
10182 8a217fa2 Olga Brani
                 *  @example
10183 8a217fa2 Olga Brani
                 *    // Create a comma separated list from an array of objects
10184 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10185 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
10186 8a217fa2 Olga Brani
                 *        "sAjaxSource": "sources/deep.txt",
10187 8a217fa2 Olga Brani
                 *        "aoColumns": [
10188 8a217fa2 Olga Brani
                 *          { "mData": "engine" },
10189 8a217fa2 Olga Brani
                 *          { "mData": "browser" },
10190 8a217fa2 Olga Brani
                 *          {
10191 8a217fa2 Olga Brani
                 *            "mData": "platform",
10192 8a217fa2 Olga Brani
                 *            "mRender": "[, ].name"
10193 8a217fa2 Olga Brani
                 *          }
10194 8a217fa2 Olga Brani
                 *        ]
10195 8a217fa2 Olga Brani
                 *      } );
10196 8a217fa2 Olga Brani
                 *    } );
10197 8a217fa2 Olga Brani
                 * 
10198 8a217fa2 Olga Brani
                 *  @example
10199 8a217fa2 Olga Brani
                 *    // Use as a function to create a link from the data source
10200 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10201 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
10202 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [
10203 8a217fa2 Olga Brani
                 *        {
10204 8a217fa2 Olga Brani
                 *          "aTargets": [ 0 ],
10205 8a217fa2 Olga Brani
                 *          "mData": "download_link",
10206 8a217fa2 Olga Brani
                 *          "mRender": function ( data, type, full ) {
10207 8a217fa2 Olga Brani
                 *            return '<a href="'+data+'">Download</a>';
10208 8a217fa2 Olga Brani
                 *          }
10209 8a217fa2 Olga Brani
                 *        ]
10210 8a217fa2 Olga Brani
                 *      } );
10211 8a217fa2 Olga Brani
                 *    } );
10212 8a217fa2 Olga Brani
                 */
10213 8a217fa2 Olga Brani
                "mRender": null,
10214 8a217fa2 Olga Brani
        
10215 8a217fa2 Olga Brani
        
10216 8a217fa2 Olga Brani
                /**
10217 8a217fa2 Olga Brani
                 * Change the cell type created for the column - either TD cells or TH cells. This
10218 8a217fa2 Olga Brani
                 * can be useful as TH cells have semantic meaning in the table body, allowing them
10219 8a217fa2 Olga Brani
                 * to act as a header for a row (you may wish to add scope='row' to the TH elements).
10220 8a217fa2 Olga Brani
                 *  @type string
10221 8a217fa2 Olga Brani
                 *  @default td
10222 8a217fa2 Olga Brani
                 *  @dtopt Columns
10223 8a217fa2 Olga Brani
                 * 
10224 8a217fa2 Olga Brani
                 *  @example
10225 8a217fa2 Olga Brani
                 *    // Make the first column use TH cells
10226 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10227 8a217fa2 Olga Brani
                 *      var oTable = $('#example').dataTable( {
10228 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ {
10229 8a217fa2 Olga Brani
                 *          "aTargets": [ 0 ],
10230 8a217fa2 Olga Brani
                 *          "sCellType": "th"
10231 8a217fa2 Olga Brani
                 *        } ]
10232 8a217fa2 Olga Brani
                 *      } );
10233 8a217fa2 Olga Brani
                 *    } );
10234 8a217fa2 Olga Brani
                 */
10235 8a217fa2 Olga Brani
                "sCellType": "td",
10236 8a217fa2 Olga Brani
        
10237 8a217fa2 Olga Brani
        
10238 8a217fa2 Olga Brani
                /**
10239 8a217fa2 Olga Brani
                 * Class to give to each cell in this column.
10240 8a217fa2 Olga Brani
                 *  @type string
10241 8a217fa2 Olga Brani
                 *  @default <i>Empty string</i>
10242 8a217fa2 Olga Brani
                 *  @dtopt Columns
10243 8a217fa2 Olga Brani
                 * 
10244 8a217fa2 Olga Brani
                 *  @example
10245 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10246 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10247 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10248 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10249 8a217fa2 Olga Brani
                 *          { "sClass": "my_class", "aTargets": [ 0 ] }
10250 8a217fa2 Olga Brani
                 *        ]
10251 8a217fa2 Olga Brani
                 *      } );
10252 8a217fa2 Olga Brani
                 *    } );
10253 8a217fa2 Olga Brani
                 *    
10254 8a217fa2 Olga Brani
                 *  @example
10255 8a217fa2 Olga Brani
                 *    // Using aoColumns
10256 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10257 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10258 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10259 8a217fa2 Olga Brani
                 *          { "sClass": "my_class" },
10260 8a217fa2 Olga Brani
                 *          null,
10261 8a217fa2 Olga Brani
                 *          null,
10262 8a217fa2 Olga Brani
                 *          null,
10263 8a217fa2 Olga Brani
                 *          null
10264 8a217fa2 Olga Brani
                 *        ]
10265 8a217fa2 Olga Brani
                 *      } );
10266 8a217fa2 Olga Brani
                 *    } );
10267 8a217fa2 Olga Brani
                 */
10268 8a217fa2 Olga Brani
                "sClass": "",
10269 8a217fa2 Olga Brani
                
10270 8a217fa2 Olga Brani
                /**
10271 8a217fa2 Olga Brani
                 * When DataTables calculates the column widths to assign to each column,
10272 8a217fa2 Olga Brani
                 * it finds the longest string in each column and then constructs a
10273 8a217fa2 Olga Brani
                 * temporary table and reads the widths from that. The problem with this
10274 8a217fa2 Olga Brani
                 * is that "mmm" is much wider then "iiii", but the latter is a longer 
10275 8a217fa2 Olga Brani
                 * string - thus the calculation can go wrong (doing it properly and putting
10276 8a217fa2 Olga Brani
                 * it into an DOM object and measuring that is horribly(!) slow). Thus as
10277 8a217fa2 Olga Brani
                 * a "work around" we provide this option. It will append its value to the
10278 8a217fa2 Olga Brani
                 * text that is found to be the longest string for the column - i.e. padding.
10279 8a217fa2 Olga Brani
                 * Generally you shouldn't need this, and it is not documented on the 
10280 8a217fa2 Olga Brani
                 * general DataTables.net documentation
10281 8a217fa2 Olga Brani
                 *  @type string
10282 8a217fa2 Olga Brani
                 *  @default <i>Empty string<i>
10283 8a217fa2 Olga Brani
                 *  @dtopt Columns
10284 8a217fa2 Olga Brani
                 *    
10285 8a217fa2 Olga Brani
                 *  @example
10286 8a217fa2 Olga Brani
                 *    // Using aoColumns
10287 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10288 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10289 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10290 8a217fa2 Olga Brani
                 *          null,
10291 8a217fa2 Olga Brani
                 *          null,
10292 8a217fa2 Olga Brani
                 *          null,
10293 8a217fa2 Olga Brani
                 *          {
10294 8a217fa2 Olga Brani
                 *            "sContentPadding": "mmm"
10295 8a217fa2 Olga Brani
                 *          }
10296 8a217fa2 Olga Brani
                 *        ]
10297 8a217fa2 Olga Brani
                 *      } );
10298 8a217fa2 Olga Brani
                 *    } );
10299 8a217fa2 Olga Brani
                 */
10300 8a217fa2 Olga Brani
                "sContentPadding": "",
10301 8a217fa2 Olga Brani
        
10302 8a217fa2 Olga Brani
        
10303 8a217fa2 Olga Brani
                /**
10304 8a217fa2 Olga Brani
                 * Allows a default value to be given for a column's data, and will be used
10305 8a217fa2 Olga Brani
                 * whenever a null data source is encountered (this can be because mData
10306 8a217fa2 Olga Brani
                 * is set to null, or because the data source itself is null).
10307 8a217fa2 Olga Brani
                 *  @type string
10308 8a217fa2 Olga Brani
                 *  @default null
10309 8a217fa2 Olga Brani
                 *  @dtopt Columns
10310 8a217fa2 Olga Brani
                 * 
10311 8a217fa2 Olga Brani
                 *  @example
10312 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10313 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10314 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10315 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10316 8a217fa2 Olga Brani
                 *          {
10317 8a217fa2 Olga Brani
                 *            "mData": null,
10318 8a217fa2 Olga Brani
                 *            "sDefaultContent": "Edit",
10319 8a217fa2 Olga Brani
                 *            "aTargets": [ -1 ]
10320 8a217fa2 Olga Brani
                 *          }
10321 8a217fa2 Olga Brani
                 *        ]
10322 8a217fa2 Olga Brani
                 *      } );
10323 8a217fa2 Olga Brani
                 *    } );
10324 8a217fa2 Olga Brani
                 *    
10325 8a217fa2 Olga Brani
                 *  @example
10326 8a217fa2 Olga Brani
                 *    // Using aoColumns
10327 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10328 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10329 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10330 8a217fa2 Olga Brani
                 *          null,
10331 8a217fa2 Olga Brani
                 *          null,
10332 8a217fa2 Olga Brani
                 *          null,
10333 8a217fa2 Olga Brani
                 *          {
10334 8a217fa2 Olga Brani
                 *            "mData": null,
10335 8a217fa2 Olga Brani
                 *            "sDefaultContent": "Edit"
10336 8a217fa2 Olga Brani
                 *          }
10337 8a217fa2 Olga Brani
                 *        ]
10338 8a217fa2 Olga Brani
                 *      } );
10339 8a217fa2 Olga Brani
                 *    } );
10340 8a217fa2 Olga Brani
                 */
10341 8a217fa2 Olga Brani
                "sDefaultContent": null,
10342 8a217fa2 Olga Brani
        
10343 8a217fa2 Olga Brani
        
10344 8a217fa2 Olga Brani
                /**
10345 8a217fa2 Olga Brani
                 * This parameter is only used in DataTables' server-side processing. It can
10346 8a217fa2 Olga Brani
                 * be exceptionally useful to know what columns are being displayed on the
10347 8a217fa2 Olga Brani
                 * client side, and to map these to database fields. When defined, the names
10348 8a217fa2 Olga Brani
                 * also allow DataTables to reorder information from the server if it comes
10349 8a217fa2 Olga Brani
                 * back in an unexpected order (i.e. if you switch your columns around on the
10350 8a217fa2 Olga Brani
                 * client-side, your server-side code does not also need updating).
10351 8a217fa2 Olga Brani
                 *  @type string
10352 8a217fa2 Olga Brani
                 *  @default <i>Empty string</i>
10353 8a217fa2 Olga Brani
                 *  @dtopt Columns
10354 8a217fa2 Olga Brani
                 * 
10355 8a217fa2 Olga Brani
                 *  @example
10356 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10357 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10358 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10359 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10360 8a217fa2 Olga Brani
                 *          { "sName": "engine", "aTargets": [ 0 ] },
10361 8a217fa2 Olga Brani
                 *          { "sName": "browser", "aTargets": [ 1 ] },
10362 8a217fa2 Olga Brani
                 *          { "sName": "platform", "aTargets": [ 2 ] },
10363 8a217fa2 Olga Brani
                 *          { "sName": "version", "aTargets": [ 3 ] },
10364 8a217fa2 Olga Brani
                 *          { "sName": "grade", "aTargets": [ 4 ] }
10365 8a217fa2 Olga Brani
                 *        ]
10366 8a217fa2 Olga Brani
                 *      } );
10367 8a217fa2 Olga Brani
                 *    } );
10368 8a217fa2 Olga Brani
                 *    
10369 8a217fa2 Olga Brani
                 *  @example
10370 8a217fa2 Olga Brani
                 *    // Using aoColumns
10371 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10372 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10373 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10374 8a217fa2 Olga Brani
                 *          { "sName": "engine" },
10375 8a217fa2 Olga Brani
                 *          { "sName": "browser" },
10376 8a217fa2 Olga Brani
                 *          { "sName": "platform" },
10377 8a217fa2 Olga Brani
                 *          { "sName": "version" },
10378 8a217fa2 Olga Brani
                 *          { "sName": "grade" }
10379 8a217fa2 Olga Brani
                 *        ]
10380 8a217fa2 Olga Brani
                 *      } );
10381 8a217fa2 Olga Brani
                 *    } );
10382 8a217fa2 Olga Brani
                 */
10383 8a217fa2 Olga Brani
                "sName": "",
10384 8a217fa2 Olga Brani
        
10385 8a217fa2 Olga Brani
        
10386 8a217fa2 Olga Brani
                /**
10387 8a217fa2 Olga Brani
                 * Defines a data source type for the sorting which can be used to read
10388 8a217fa2 Olga Brani
                 * real-time information from the table (updating the internally cached
10389 8a217fa2 Olga Brani
                 * version) prior to sorting. This allows sorting to occur on user editable
10390 8a217fa2 Olga Brani
                 * elements such as form inputs.
10391 8a217fa2 Olga Brani
                 *  @type string
10392 8a217fa2 Olga Brani
                 *  @default std
10393 8a217fa2 Olga Brani
                 *  @dtopt Columns
10394 8a217fa2 Olga Brani
                 * 
10395 8a217fa2 Olga Brani
                 *  @example
10396 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10397 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10398 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10399 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [
10400 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
10401 8a217fa2 Olga Brani
                 *          { "sType": "numeric", "aTargets": [ 3 ] },
10402 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-select", "aTargets": [ 4 ] },
10403 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] }
10404 8a217fa2 Olga Brani
                 *        ]
10405 8a217fa2 Olga Brani
                 *      } );
10406 8a217fa2 Olga Brani
                 *    } );
10407 8a217fa2 Olga Brani
                 *    
10408 8a217fa2 Olga Brani
                 *  @example
10409 8a217fa2 Olga Brani
                 *    // Using aoColumns
10410 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10411 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10412 8a217fa2 Olga Brani
                 *        "aoColumns": [
10413 8a217fa2 Olga Brani
                 *          null,
10414 8a217fa2 Olga Brani
                 *          null,
10415 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-text" },
10416 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-text", "sType": "numeric" },
10417 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-select" },
10418 8a217fa2 Olga Brani
                 *          { "sSortDataType": "dom-checkbox" }
10419 8a217fa2 Olga Brani
                 *        ]
10420 8a217fa2 Olga Brani
                 *      } );
10421 8a217fa2 Olga Brani
                 *    } );
10422 8a217fa2 Olga Brani
                 */
10423 8a217fa2 Olga Brani
                "sSortDataType": "std",
10424 8a217fa2 Olga Brani
        
10425 8a217fa2 Olga Brani
        
10426 8a217fa2 Olga Brani
                /**
10427 8a217fa2 Olga Brani
                 * The title of this column.
10428 8a217fa2 Olga Brani
                 *  @type string
10429 8a217fa2 Olga Brani
                 *  @default null <i>Derived from the 'TH' value for this column in the 
10430 8a217fa2 Olga Brani
                 *    original HTML table.</i>
10431 8a217fa2 Olga Brani
                 *  @dtopt Columns
10432 8a217fa2 Olga Brani
                 * 
10433 8a217fa2 Olga Brani
                 *  @example
10434 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10435 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10436 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10437 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10438 8a217fa2 Olga Brani
                 *          { "sTitle": "My column title", "aTargets": [ 0 ] }
10439 8a217fa2 Olga Brani
                 *        ]
10440 8a217fa2 Olga Brani
                 *      } );
10441 8a217fa2 Olga Brani
                 *    } );
10442 8a217fa2 Olga Brani
                 *    
10443 8a217fa2 Olga Brani
                 *  @example
10444 8a217fa2 Olga Brani
                 *    // Using aoColumns
10445 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10446 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10447 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10448 8a217fa2 Olga Brani
                 *          { "sTitle": "My column title" },
10449 8a217fa2 Olga Brani
                 *          null,
10450 8a217fa2 Olga Brani
                 *          null,
10451 8a217fa2 Olga Brani
                 *          null,
10452 8a217fa2 Olga Brani
                 *          null
10453 8a217fa2 Olga Brani
                 *        ]
10454 8a217fa2 Olga Brani
                 *      } );
10455 8a217fa2 Olga Brani
                 *    } );
10456 8a217fa2 Olga Brani
                 */
10457 8a217fa2 Olga Brani
                "sTitle": null,
10458 8a217fa2 Olga Brani
        
10459 8a217fa2 Olga Brani
        
10460 8a217fa2 Olga Brani
                /**
10461 8a217fa2 Olga Brani
                 * The type allows you to specify how the data for this column will be sorted.
10462 8a217fa2 Olga Brani
                 * Four types (string, numeric, date and html (which will strip HTML tags
10463 8a217fa2 Olga Brani
                 * before sorting)) are currently available. Note that only date formats
10464 8a217fa2 Olga Brani
                 * understood by Javascript's Date() object will be accepted as type date. For
10465 8a217fa2 Olga Brani
                 * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric',
10466 8a217fa2 Olga Brani
                 * 'date' or 'html' (by default). Further types can be adding through
10467 8a217fa2 Olga Brani
                 * plug-ins.
10468 8a217fa2 Olga Brani
                 *  @type string
10469 8a217fa2 Olga Brani
                 *  @default null <i>Auto-detected from raw data</i>
10470 8a217fa2 Olga Brani
                 *  @dtopt Columns
10471 8a217fa2 Olga Brani
                 * 
10472 8a217fa2 Olga Brani
                 *  @example
10473 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10474 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10475 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10476 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10477 8a217fa2 Olga Brani
                 *          { "sType": "html", "aTargets": [ 0 ] }
10478 8a217fa2 Olga Brani
                 *        ]
10479 8a217fa2 Olga Brani
                 *      } );
10480 8a217fa2 Olga Brani
                 *    } );
10481 8a217fa2 Olga Brani
                 *    
10482 8a217fa2 Olga Brani
                 *  @example
10483 8a217fa2 Olga Brani
                 *    // Using aoColumns
10484 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10485 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10486 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10487 8a217fa2 Olga Brani
                 *          { "sType": "html" },
10488 8a217fa2 Olga Brani
                 *          null,
10489 8a217fa2 Olga Brani
                 *          null,
10490 8a217fa2 Olga Brani
                 *          null,
10491 8a217fa2 Olga Brani
                 *          null
10492 8a217fa2 Olga Brani
                 *        ]
10493 8a217fa2 Olga Brani
                 *      } );
10494 8a217fa2 Olga Brani
                 *    } );
10495 8a217fa2 Olga Brani
                 */
10496 8a217fa2 Olga Brani
                "sType": null,
10497 8a217fa2 Olga Brani
        
10498 8a217fa2 Olga Brani
        
10499 8a217fa2 Olga Brani
                /**
10500 8a217fa2 Olga Brani
                 * Defining the width of the column, this parameter may take any CSS value
10501 8a217fa2 Olga Brani
                 * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not
10502 8a217fa2 Olga Brani
                 * been given a specific width through this interface ensuring that the table
10503 8a217fa2 Olga Brani
                 * remains readable.
10504 8a217fa2 Olga Brani
                 *  @type string
10505 8a217fa2 Olga Brani
                 *  @default null <i>Automatic</i>
10506 8a217fa2 Olga Brani
                 *  @dtopt Columns
10507 8a217fa2 Olga Brani
                 * 
10508 8a217fa2 Olga Brani
                 *  @example
10509 8a217fa2 Olga Brani
                 *    // Using aoColumnDefs
10510 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10511 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10512 8a217fa2 Olga Brani
                 *        "aoColumnDefs": [ 
10513 8a217fa2 Olga Brani
                 *          { "sWidth": "20%", "aTargets": [ 0 ] }
10514 8a217fa2 Olga Brani
                 *        ]
10515 8a217fa2 Olga Brani
                 *      } );
10516 8a217fa2 Olga Brani
                 *    } );
10517 8a217fa2 Olga Brani
                 *    
10518 8a217fa2 Olga Brani
                 *  @example
10519 8a217fa2 Olga Brani
                 *    // Using aoColumns
10520 8a217fa2 Olga Brani
                 *    $(document).ready( function() {
10521 8a217fa2 Olga Brani
                 *      $('#example').dataTable( {
10522 8a217fa2 Olga Brani
                 *        "aoColumns": [ 
10523 8a217fa2 Olga Brani
                 *          { "sWidth": "20%" },
10524 8a217fa2 Olga Brani
                 *          null,
10525 8a217fa2 Olga Brani
                 *          null,
10526 8a217fa2 Olga Brani
                 *          null,
10527 8a217fa2 Olga Brani
                 *          null
10528 8a217fa2 Olga Brani
                 *        ]
10529 8a217fa2 Olga Brani
                 *      } );
10530 8a217fa2 Olga Brani
                 *    } );
10531 8a217fa2 Olga Brani
                 */
10532 8a217fa2 Olga Brani
                "sWidth": null
10533 8a217fa2 Olga Brani
        };
10534 8a217fa2 Olga Brani
        
10535 8a217fa2 Olga Brani
        
10536 8a217fa2 Olga Brani
        
10537 8a217fa2 Olga Brani
        /**
10538 8a217fa2 Olga Brani
         * DataTables settings object - this holds all the information needed for a
10539 8a217fa2 Olga Brani
         * given table, including configuration, data and current application of the
10540 8a217fa2 Olga Brani
         * table options. DataTables does not have a single instance for each DataTable
10541 8a217fa2 Olga Brani
         * with the settings attached to that instance, but rather instances of the
10542 8a217fa2 Olga Brani
         * DataTable "class" are created on-the-fly as needed (typically by a 
10543 8a217fa2 Olga Brani
         * $().dataTable() call) and the settings object is then applied to that
10544 8a217fa2 Olga Brani
         * instance.
10545 8a217fa2 Olga Brani
         * 
10546 8a217fa2 Olga Brani
         * Note that this object is related to {@link DataTable.defaults} but this 
10547 8a217fa2 Olga Brani
         * one is the internal data store for DataTables's cache of columns. It should
10548 8a217fa2 Olga Brani
         * NOT be manipulated outside of DataTables. Any configuration should be done
10549 8a217fa2 Olga Brani
         * through the initialisation options.
10550 8a217fa2 Olga Brani
         *  @namespace
10551 8a217fa2 Olga Brani
         *  @todo Really should attach the settings object to individual instances so we
10552 8a217fa2 Olga Brani
         *    don't need to create new instances on each $().dataTable() call (if the
10553 8a217fa2 Olga Brani
         *    table already exists). It would also save passing oSettings around and
10554 8a217fa2 Olga Brani
         *    into every single function. However, this is a very significant 
10555 8a217fa2 Olga Brani
         *    architecture change for DataTables and will almost certainly break
10556 8a217fa2 Olga Brani
         *    backwards compatibility with older installations. This is something that
10557 8a217fa2 Olga Brani
         *    will be done in 2.0.
10558 8a217fa2 Olga Brani
         */
10559 8a217fa2 Olga Brani
        DataTable.models.oSettings = {
10560 8a217fa2 Olga Brani
                /**
10561 8a217fa2 Olga Brani
                 * Primary features of DataTables and their enablement state.
10562 8a217fa2 Olga Brani
                 *  @namespace
10563 8a217fa2 Olga Brani
                 */
10564 8a217fa2 Olga Brani
                "oFeatures": {
10565 8a217fa2 Olga Brani
                        
10566 8a217fa2 Olga Brani
                        /**
10567 8a217fa2 Olga Brani
                         * Flag to say if DataTables should automatically try to calculate the
10568 8a217fa2 Olga Brani
                         * optimum table and columns widths (true) or not (false).
10569 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10570 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10571 8a217fa2 Olga Brani
                         *  @type boolean
10572 8a217fa2 Olga Brani
                         */
10573 8a217fa2 Olga Brani
                        "bAutoWidth": null,
10574 8a217fa2 Olga Brani
        
10575 8a217fa2 Olga Brani
                        /**
10576 8a217fa2 Olga Brani
                         * Delay the creation of TR and TD elements until they are actually
10577 8a217fa2 Olga Brani
                         * needed by a driven page draw. This can give a significant speed
10578 8a217fa2 Olga Brani
                         * increase for Ajax source and Javascript source data, but makes no
10579 8a217fa2 Olga Brani
                         * difference at all fro DOM and server-side processing tables.
10580 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10581 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10582 8a217fa2 Olga Brani
                         *  @type boolean
10583 8a217fa2 Olga Brani
                         */
10584 8a217fa2 Olga Brani
                        "bDeferRender": null,
10585 8a217fa2 Olga Brani
                        
10586 8a217fa2 Olga Brani
                        /**
10587 8a217fa2 Olga Brani
                         * Enable filtering on the table or not. Note that if this is disabled
10588 8a217fa2 Olga Brani
                         * then there is no filtering at all on the table, including fnFilter.
10589 8a217fa2 Olga Brani
                         * To just remove the filtering input use sDom and remove the 'f' option.
10590 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10591 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10592 8a217fa2 Olga Brani
                         *  @type boolean
10593 8a217fa2 Olga Brani
                         */
10594 8a217fa2 Olga Brani
                        "bFilter": null,
10595 8a217fa2 Olga Brani
                        
10596 8a217fa2 Olga Brani
                        /**
10597 8a217fa2 Olga Brani
                         * Table information element (the 'Showing x of y records' div) enable
10598 8a217fa2 Olga Brani
                         * flag.
10599 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10600 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10601 8a217fa2 Olga Brani
                         *  @type boolean
10602 8a217fa2 Olga Brani
                         */
10603 8a217fa2 Olga Brani
                        "bInfo": null,
10604 8a217fa2 Olga Brani
                        
10605 8a217fa2 Olga Brani
                        /**
10606 8a217fa2 Olga Brani
                         * Present a user control allowing the end user to change the page size
10607 8a217fa2 Olga Brani
                         * when pagination is enabled.
10608 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10609 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10610 8a217fa2 Olga Brani
                         *  @type boolean
10611 8a217fa2 Olga Brani
                         */
10612 8a217fa2 Olga Brani
                        "bLengthChange": null,
10613 8a217fa2 Olga Brani
        
10614 8a217fa2 Olga Brani
                        /**
10615 8a217fa2 Olga Brani
                         * Pagination enabled or not. Note that if this is disabled then length
10616 8a217fa2 Olga Brani
                         * changing must also be disabled.
10617 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10618 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10619 8a217fa2 Olga Brani
                         *  @type boolean
10620 8a217fa2 Olga Brani
                         */
10621 8a217fa2 Olga Brani
                        "bPaginate": null,
10622 8a217fa2 Olga Brani
                        
10623 8a217fa2 Olga Brani
                        /**
10624 8a217fa2 Olga Brani
                         * Processing indicator enable flag whenever DataTables is enacting a
10625 8a217fa2 Olga Brani
                         * user request - typically an Ajax request for server-side processing.
10626 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10627 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10628 8a217fa2 Olga Brani
                         *  @type boolean
10629 8a217fa2 Olga Brani
                         */
10630 8a217fa2 Olga Brani
                        "bProcessing": null,
10631 8a217fa2 Olga Brani
                        
10632 8a217fa2 Olga Brani
                        /**
10633 8a217fa2 Olga Brani
                         * Server-side processing enabled flag - when enabled DataTables will
10634 8a217fa2 Olga Brani
                         * get all data from the server for every draw - there is no filtering,
10635 8a217fa2 Olga Brani
                         * sorting or paging done on the client-side.
10636 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10637 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10638 8a217fa2 Olga Brani
                         *  @type boolean
10639 8a217fa2 Olga Brani
                         */
10640 8a217fa2 Olga Brani
                        "bServerSide": null,
10641 8a217fa2 Olga Brani
                        
10642 8a217fa2 Olga Brani
                        /**
10643 8a217fa2 Olga Brani
                         * Sorting enablement flag.
10644 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10645 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10646 8a217fa2 Olga Brani
                         *  @type boolean
10647 8a217fa2 Olga Brani
                         */
10648 8a217fa2 Olga Brani
                        "bSort": null,
10649 8a217fa2 Olga Brani
                        
10650 8a217fa2 Olga Brani
                        /**
10651 8a217fa2 Olga Brani
                         * Apply a class to the columns which are being sorted to provide a
10652 8a217fa2 Olga Brani
                         * visual highlight or not. This can slow things down when enabled since
10653 8a217fa2 Olga Brani
                         * there is a lot of DOM interaction.
10654 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10655 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10656 8a217fa2 Olga Brani
                         *  @type boolean
10657 8a217fa2 Olga Brani
                         */
10658 8a217fa2 Olga Brani
                        "bSortClasses": null,
10659 8a217fa2 Olga Brani
                        
10660 8a217fa2 Olga Brani
                        /**
10661 8a217fa2 Olga Brani
                         * State saving enablement flag.
10662 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10663 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10664 8a217fa2 Olga Brani
                         *  @type boolean
10665 8a217fa2 Olga Brani
                         */
10666 8a217fa2 Olga Brani
                        "bStateSave": null
10667 8a217fa2 Olga Brani
                },
10668 8a217fa2 Olga Brani
                
10669 8a217fa2 Olga Brani
        
10670 8a217fa2 Olga Brani
                /**
10671 8a217fa2 Olga Brani
                 * Scrolling settings for a table.
10672 8a217fa2 Olga Brani
                 *  @namespace
10673 8a217fa2 Olga Brani
                 */
10674 8a217fa2 Olga Brani
                "oScroll": {
10675 8a217fa2 Olga Brani
                        /**
10676 8a217fa2 Olga Brani
                         * Indicate if DataTables should be allowed to set the padding / margin
10677 8a217fa2 Olga Brani
                         * etc for the scrolling header elements or not. Typically you will want
10678 8a217fa2 Olga Brani
                         * this.
10679 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10680 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10681 8a217fa2 Olga Brani
                         *  @type boolean
10682 8a217fa2 Olga Brani
                         */
10683 8a217fa2 Olga Brani
                        "bAutoCss": null,
10684 8a217fa2 Olga Brani
                        
10685 8a217fa2 Olga Brani
                        /**
10686 8a217fa2 Olga Brani
                         * When the table is shorter in height than sScrollY, collapse the
10687 8a217fa2 Olga Brani
                         * table container down to the height of the table (when true).
10688 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10689 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10690 8a217fa2 Olga Brani
                         *  @type boolean
10691 8a217fa2 Olga Brani
                         */
10692 8a217fa2 Olga Brani
                        "bCollapse": null,
10693 8a217fa2 Olga Brani
                        
10694 8a217fa2 Olga Brani
                        /**
10695 8a217fa2 Olga Brani
                         * Infinite scrolling enablement flag. Now deprecated in favour of
10696 8a217fa2 Olga Brani
                         * using the Scroller plug-in.
10697 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10698 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10699 8a217fa2 Olga Brani
                         *  @type boolean
10700 8a217fa2 Olga Brani
                         */
10701 8a217fa2 Olga Brani
                        "bInfinite": null,
10702 8a217fa2 Olga Brani
                        
10703 8a217fa2 Olga Brani
                        /**
10704 8a217fa2 Olga Brani
                         * Width of the scrollbar for the web-browser's platform. Calculated
10705 8a217fa2 Olga Brani
                         * during table initialisation.
10706 8a217fa2 Olga Brani
                         *  @type int
10707 8a217fa2 Olga Brani
                         *  @default 0
10708 8a217fa2 Olga Brani
                         */
10709 8a217fa2 Olga Brani
                        "iBarWidth": 0,
10710 8a217fa2 Olga Brani
                        
10711 8a217fa2 Olga Brani
                        /**
10712 8a217fa2 Olga Brani
                         * Space (in pixels) between the bottom of the scrolling container and 
10713 8a217fa2 Olga Brani
                         * the bottom of the scrolling viewport before the next page is loaded
10714 8a217fa2 Olga Brani
                         * when using infinite scrolling.
10715 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10716 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10717 8a217fa2 Olga Brani
                         *  @type int
10718 8a217fa2 Olga Brani
                         */
10719 8a217fa2 Olga Brani
                        "iLoadGap": null,
10720 8a217fa2 Olga Brani
                        
10721 8a217fa2 Olga Brani
                        /**
10722 8a217fa2 Olga Brani
                         * Viewport width for horizontal scrolling. Horizontal scrolling is 
10723 8a217fa2 Olga Brani
                         * disabled if an empty string.
10724 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10725 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10726 8a217fa2 Olga Brani
                         *  @type string
10727 8a217fa2 Olga Brani
                         */
10728 8a217fa2 Olga Brani
                        "sX": null,
10729 8a217fa2 Olga Brani
                        
10730 8a217fa2 Olga Brani
                        /**
10731 8a217fa2 Olga Brani
                         * Width to expand the table to when using x-scrolling. Typically you
10732 8a217fa2 Olga Brani
                         * should not need to use this.
10733 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10734 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10735 8a217fa2 Olga Brani
                         *  @type string
10736 8a217fa2 Olga Brani
                         *  @deprecated
10737 8a217fa2 Olga Brani
                         */
10738 8a217fa2 Olga Brani
                        "sXInner": null,
10739 8a217fa2 Olga Brani
                        
10740 8a217fa2 Olga Brani
                        /**
10741 8a217fa2 Olga Brani
                         * Viewport height for vertical scrolling. Vertical scrolling is disabled
10742 8a217fa2 Olga Brani
                         * if an empty string.
10743 8a217fa2 Olga Brani
                         * Note that this parameter will be set by the initialisation routine. To
10744 8a217fa2 Olga Brani
                         * set a default use {@link DataTable.defaults}.
10745 8a217fa2 Olga Brani
                         *  @type string
10746 8a217fa2 Olga Brani
                         */
10747 8a217fa2 Olga Brani
                        "sY": null
10748 8a217fa2 Olga Brani
                },
10749 8a217fa2 Olga Brani
                
10750 8a217fa2 Olga Brani
                /**
10751 8a217fa2 Olga Brani
                 * Language information for the table.
10752 8a217fa2 Olga Brani
                 *  @namespace
10753 8a217fa2 Olga Brani
                 *  @extends DataTable.defaults.oLanguage
10754 8a217fa2 Olga Brani
                 */
10755 8a217fa2 Olga Brani
                "oLanguage": {
10756 8a217fa2 Olga Brani
                        /**
10757 8a217fa2 Olga Brani
                         * Information callback function. See 
10758 8a217fa2 Olga Brani
                         * {@link DataTable.defaults.fnInfoCallback}
10759 8a217fa2 Olga Brani
                         *  @type function
10760 8a217fa2 Olga Brani
                         *  @default null
10761 8a217fa2 Olga Brani
                         */
10762 8a217fa2 Olga Brani
                        "fnInfoCallback": null
10763 8a217fa2 Olga Brani
                },
10764 8a217fa2 Olga Brani
                
10765 8a217fa2 Olga Brani
                /**
10766 8a217fa2 Olga Brani
                 * Browser support parameters
10767 8a217fa2 Olga Brani
                 *  @namespace
10768 8a217fa2 Olga Brani
                 */
10769 8a217fa2 Olga Brani
                "oBrowser": {
10770 8a217fa2 Olga Brani
                        /**
10771 8a217fa2 Olga Brani
                         * Indicate if the browser incorrectly calculates width:100% inside a
10772 8a217fa2 Olga Brani
                         * scrolling element (IE6/7)
10773 8a217fa2 Olga Brani
                         *  @type boolean
10774 8a217fa2 Olga Brani
                         *  @default false
10775 8a217fa2 Olga Brani
                         */
10776 8a217fa2 Olga Brani
                        "bScrollOversize": false
10777 8a217fa2 Olga Brani
                },
10778 8a217fa2 Olga Brani
                
10779 8a217fa2 Olga Brani
                /**
10780 8a217fa2 Olga Brani
                 * Array referencing the nodes which are used for the features. The 
10781 8a217fa2 Olga Brani
                 * parameters of this object match what is allowed by sDom - i.e.
10782 8a217fa2 Olga Brani
                 *   <ul>
10783 8a217fa2 Olga Brani
                 *     <li>'l' - Length changing</li>
10784 8a217fa2 Olga Brani
                 *     <li>'f' - Filtering input</li>
10785 8a217fa2 Olga Brani
                 *     <li>'t' - The table!</li>
10786 8a217fa2 Olga Brani
                 *     <li>'i' - Information</li>
10787 8a217fa2 Olga Brani
                 *     <li>'p' - Pagination</li>
10788 8a217fa2 Olga Brani
                 *     <li>'r' - pRocessing</li>
10789 8a217fa2 Olga Brani
                 *   </ul>
10790 8a217fa2 Olga Brani
                 *  @type array
10791 8a217fa2 Olga Brani
                 *  @default []
10792 8a217fa2 Olga Brani
                 */
10793 8a217fa2 Olga Brani
                "aanFeatures": [],
10794 8a217fa2 Olga Brani
                
10795 8a217fa2 Olga Brani
                /**
10796 8a217fa2 Olga Brani
                 * Store data information - see {@link DataTable.models.oRow} for detailed
10797 8a217fa2 Olga Brani
                 * information.
10798 8a217fa2 Olga Brani
                 *  @type array
10799 8a217fa2 Olga Brani
                 *  @default []
10800 8a217fa2 Olga Brani
                 */
10801 8a217fa2 Olga Brani
                "aoData": [],
10802 8a217fa2 Olga Brani
                
10803 8a217fa2 Olga Brani
                /**
10804 8a217fa2 Olga Brani
                 * Array of indexes which are in the current display (after filtering etc)
10805 8a217fa2 Olga Brani
                 *  @type array
10806 8a217fa2 Olga Brani
                 *  @default []
10807 8a217fa2 Olga Brani
                 */
10808 8a217fa2 Olga Brani
                "aiDisplay": [],
10809 8a217fa2 Olga Brani
                
10810 8a217fa2 Olga Brani
                /**
10811 8a217fa2 Olga Brani
                 * Array of indexes for display - no filtering
10812 8a217fa2 Olga Brani
                 *  @type array
10813 8a217fa2 Olga Brani
                 *  @default []
10814 8a217fa2 Olga Brani
                 */
10815 8a217fa2 Olga Brani
                "aiDisplayMaster": [],
10816 8a217fa2 Olga Brani
                
10817 8a217fa2 Olga Brani
                /**
10818 8a217fa2 Olga Brani
                 * Store information about each column that is in use
10819 8a217fa2 Olga Brani
                 *  @type array
10820 8a217fa2 Olga Brani
                 *  @default []
10821 8a217fa2 Olga Brani
                 */
10822 8a217fa2 Olga Brani
                "aoColumns": [],
10823 8a217fa2 Olga Brani
                
10824 8a217fa2 Olga Brani
                /**
10825 8a217fa2 Olga Brani
                 * Store information about the table's header
10826 8a217fa2 Olga Brani
                 *  @type array
10827 8a217fa2 Olga Brani
                 *  @default []
10828 8a217fa2 Olga Brani
                 */
10829 8a217fa2 Olga Brani
                "aoHeader": [],
10830 8a217fa2 Olga Brani
                
10831 8a217fa2 Olga Brani
                /**
10832 8a217fa2 Olga Brani
                 * Store information about the table's footer
10833 8a217fa2 Olga Brani
                 *  @type array
10834 8a217fa2 Olga Brani
                 *  @default []
10835 8a217fa2 Olga Brani
                 */
10836 8a217fa2 Olga Brani
                "aoFooter": [],
10837 8a217fa2 Olga Brani
                
10838 8a217fa2 Olga Brani
                /**
10839 8a217fa2 Olga Brani
                 * Search data array for regular expression searching
10840 8a217fa2 Olga Brani
                 *  @type array
10841 8a217fa2 Olga Brani
                 *  @default []
10842 8a217fa2 Olga Brani
                 */
10843 8a217fa2 Olga Brani
                "asDataSearch": [],
10844 8a217fa2 Olga Brani
                
10845 8a217fa2 Olga Brani
                /**
10846 8a217fa2 Olga Brani
                 * Store the applied global search information in case we want to force a 
10847 8a217fa2 Olga Brani
                 * research or compare the old search to a new one.
10848 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
10849 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
10850 8a217fa2 Olga Brani
                 *  @namespace
10851 8a217fa2 Olga Brani
                 *  @extends DataTable.models.oSearch
10852 8a217fa2 Olga Brani
                 */
10853 8a217fa2 Olga Brani
                "oPreviousSearch": {},
10854 8a217fa2 Olga Brani
                
10855 8a217fa2 Olga Brani
                /**
10856 8a217fa2 Olga Brani
                 * Store the applied search for each column - see 
10857 8a217fa2 Olga Brani
                 * {@link DataTable.models.oSearch} for the format that is used for the
10858 8a217fa2 Olga Brani
                 * filtering information for each column.
10859 8a217fa2 Olga Brani
                 *  @type array
10860 8a217fa2 Olga Brani
                 *  @default []
10861 8a217fa2 Olga Brani
                 */
10862 8a217fa2 Olga Brani
                "aoPreSearchCols": [],
10863 8a217fa2 Olga Brani
                
10864 8a217fa2 Olga Brani
                /**
10865 8a217fa2 Olga Brani
                 * Sorting that is applied to the table. Note that the inner arrays are
10866 8a217fa2 Olga Brani
                 * used in the following manner:
10867 8a217fa2 Olga Brani
                 * <ul>
10868 8a217fa2 Olga Brani
                 *   <li>Index 0 - column number</li>
10869 8a217fa2 Olga Brani
                 *   <li>Index 1 - current sorting direction</li>
10870 8a217fa2 Olga Brani
                 *   <li>Index 2 - index of asSorting for this column</li>
10871 8a217fa2 Olga Brani
                 * </ul>
10872 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
10873 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
10874 8a217fa2 Olga Brani
                 *  @type array
10875 8a217fa2 Olga Brani
                 *  @todo These inner arrays should really be objects
10876 8a217fa2 Olga Brani
                 */
10877 8a217fa2 Olga Brani
                "aaSorting": null,
10878 8a217fa2 Olga Brani
                
10879 8a217fa2 Olga Brani
                /**
10880 8a217fa2 Olga Brani
                 * Sorting that is always applied to the table (i.e. prefixed in front of
10881 8a217fa2 Olga Brani
                 * aaSorting).
10882 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
10883 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
10884 8a217fa2 Olga Brani
                 *  @type array|null
10885 8a217fa2 Olga Brani
                 *  @default null
10886 8a217fa2 Olga Brani
                 */
10887 8a217fa2 Olga Brani
                "aaSortingFixed": null,
10888 8a217fa2 Olga Brani
                
10889 8a217fa2 Olga Brani
                /**
10890 8a217fa2 Olga Brani
                 * Classes to use for the striping of a table.
10891 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
10892 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
10893 8a217fa2 Olga Brani
                 *  @type array
10894 8a217fa2 Olga Brani
                 *  @default []
10895 8a217fa2 Olga Brani
                 */
10896 8a217fa2 Olga Brani
                "asStripeClasses": null,
10897 8a217fa2 Olga Brani
                
10898 8a217fa2 Olga Brani
                /**
10899 8a217fa2 Olga Brani
                 * If restoring a table - we should restore its striping classes as well
10900 8a217fa2 Olga Brani
                 *  @type array
10901 8a217fa2 Olga Brani
                 *  @default []
10902 8a217fa2 Olga Brani
                 */
10903 8a217fa2 Olga Brani
                "asDestroyStripes": [],
10904 8a217fa2 Olga Brani
                
10905 8a217fa2 Olga Brani
                /**
10906 8a217fa2 Olga Brani
                 * If restoring a table - we should restore its width 
10907 8a217fa2 Olga Brani
                 *  @type int
10908 8a217fa2 Olga Brani
                 *  @default 0
10909 8a217fa2 Olga Brani
                 */
10910 8a217fa2 Olga Brani
                "sDestroyWidth": 0,
10911 8a217fa2 Olga Brani
                
10912 8a217fa2 Olga Brani
                /**
10913 8a217fa2 Olga Brani
                 * Callback functions array for every time a row is inserted (i.e. on a draw).
10914 8a217fa2 Olga Brani
                 *  @type array
10915 8a217fa2 Olga Brani
                 *  @default []
10916 8a217fa2 Olga Brani
                 */
10917 8a217fa2 Olga Brani
                "aoRowCallback": [],
10918 8a217fa2 Olga Brani
                
10919 8a217fa2 Olga Brani
                /**
10920 8a217fa2 Olga Brani
                 * Callback functions for the header on each draw.
10921 8a217fa2 Olga Brani
                 *  @type array
10922 8a217fa2 Olga Brani
                 *  @default []
10923 8a217fa2 Olga Brani
                 */
10924 8a217fa2 Olga Brani
                "aoHeaderCallback": [],
10925 8a217fa2 Olga Brani
                
10926 8a217fa2 Olga Brani
                /**
10927 8a217fa2 Olga Brani
                 * Callback function for the footer on each draw.
10928 8a217fa2 Olga Brani
                 *  @type array
10929 8a217fa2 Olga Brani
                 *  @default []
10930 8a217fa2 Olga Brani
                 */
10931 8a217fa2 Olga Brani
                "aoFooterCallback": [],
10932 8a217fa2 Olga Brani
                
10933 8a217fa2 Olga Brani
                /**
10934 8a217fa2 Olga Brani
                 * Array of callback functions for draw callback functions
10935 8a217fa2 Olga Brani
                 *  @type array
10936 8a217fa2 Olga Brani
                 *  @default []
10937 8a217fa2 Olga Brani
                 */
10938 8a217fa2 Olga Brani
                "aoDrawCallback": [],
10939 8a217fa2 Olga Brani
                
10940 8a217fa2 Olga Brani
                /**
10941 8a217fa2 Olga Brani
                 * Array of callback functions for row created function
10942 8a217fa2 Olga Brani
                 *  @type array
10943 8a217fa2 Olga Brani
                 *  @default []
10944 8a217fa2 Olga Brani
                 */
10945 8a217fa2 Olga Brani
                "aoRowCreatedCallback": [],
10946 8a217fa2 Olga Brani
                
10947 8a217fa2 Olga Brani
                /**
10948 8a217fa2 Olga Brani
                 * Callback functions for just before the table is redrawn. A return of 
10949 8a217fa2 Olga Brani
                 * false will be used to cancel the draw.
10950 8a217fa2 Olga Brani
                 *  @type array
10951 8a217fa2 Olga Brani
                 *  @default []
10952 8a217fa2 Olga Brani
                 */
10953 8a217fa2 Olga Brani
                "aoPreDrawCallback": [],
10954 8a217fa2 Olga Brani
                
10955 8a217fa2 Olga Brani
                /**
10956 8a217fa2 Olga Brani
                 * Callback functions for when the table has been initialised.
10957 8a217fa2 Olga Brani
                 *  @type array
10958 8a217fa2 Olga Brani
                 *  @default []
10959 8a217fa2 Olga Brani
                 */
10960 8a217fa2 Olga Brani
                "aoInitComplete": [],
10961 8a217fa2 Olga Brani
        
10962 8a217fa2 Olga Brani
                
10963 8a217fa2 Olga Brani
                /**
10964 8a217fa2 Olga Brani
                 * Callbacks for modifying the settings to be stored for state saving, prior to
10965 8a217fa2 Olga Brani
                 * saving state.
10966 8a217fa2 Olga Brani
                 *  @type array
10967 8a217fa2 Olga Brani
                 *  @default []
10968 8a217fa2 Olga Brani
                 */
10969 8a217fa2 Olga Brani
                "aoStateSaveParams": [],
10970 8a217fa2 Olga Brani
                
10971 8a217fa2 Olga Brani
                /**
10972 8a217fa2 Olga Brani
                 * Callbacks for modifying the settings that have been stored for state saving
10973 8a217fa2 Olga Brani
                 * prior to using the stored values to restore the state.
10974 8a217fa2 Olga Brani
                 *  @type array
10975 8a217fa2 Olga Brani
                 *  @default []
10976 8a217fa2 Olga Brani
                 */
10977 8a217fa2 Olga Brani
                "aoStateLoadParams": [],
10978 8a217fa2 Olga Brani
                
10979 8a217fa2 Olga Brani
                /**
10980 8a217fa2 Olga Brani
                 * Callbacks for operating on the settings object once the saved state has been
10981 8a217fa2 Olga Brani
                 * loaded
10982 8a217fa2 Olga Brani
                 *  @type array
10983 8a217fa2 Olga Brani
                 *  @default []
10984 8a217fa2 Olga Brani
                 */
10985 8a217fa2 Olga Brani
                "aoStateLoaded": [],
10986 8a217fa2 Olga Brani
                
10987 8a217fa2 Olga Brani
                /**
10988 8a217fa2 Olga Brani
                 * Cache the table ID for quick access
10989 8a217fa2 Olga Brani
                 *  @type string
10990 8a217fa2 Olga Brani
                 *  @default <i>Empty string</i>
10991 8a217fa2 Olga Brani
                 */
10992 8a217fa2 Olga Brani
                "sTableId": "",
10993 8a217fa2 Olga Brani
                
10994 8a217fa2 Olga Brani
                /**
10995 8a217fa2 Olga Brani
                 * The TABLE node for the main table
10996 8a217fa2 Olga Brani
                 *  @type node
10997 8a217fa2 Olga Brani
                 *  @default null
10998 8a217fa2 Olga Brani
                 */
10999 8a217fa2 Olga Brani
                "nTable": null,
11000 8a217fa2 Olga Brani
                
11001 8a217fa2 Olga Brani
                /**
11002 8a217fa2 Olga Brani
                 * Permanent ref to the thead element
11003 8a217fa2 Olga Brani
                 *  @type node
11004 8a217fa2 Olga Brani
                 *  @default null
11005 8a217fa2 Olga Brani
                 */
11006 8a217fa2 Olga Brani
                "nTHead": null,
11007 8a217fa2 Olga Brani
                
11008 8a217fa2 Olga Brani
                /**
11009 8a217fa2 Olga Brani
                 * Permanent ref to the tfoot element - if it exists
11010 8a217fa2 Olga Brani
                 *  @type node
11011 8a217fa2 Olga Brani
                 *  @default null
11012 8a217fa2 Olga Brani
                 */
11013 8a217fa2 Olga Brani
                "nTFoot": null,
11014 8a217fa2 Olga Brani
                
11015 8a217fa2 Olga Brani
                /**
11016 8a217fa2 Olga Brani
                 * Permanent ref to the tbody element
11017 8a217fa2 Olga Brani
                 *  @type node
11018 8a217fa2 Olga Brani
                 *  @default null
11019 8a217fa2 Olga Brani
                 */
11020 8a217fa2 Olga Brani
                "nTBody": null,
11021 8a217fa2 Olga Brani
                
11022 8a217fa2 Olga Brani
                /**
11023 8a217fa2 Olga Brani
                 * Cache the wrapper node (contains all DataTables controlled elements)
11024 8a217fa2 Olga Brani
                 *  @type node
11025 8a217fa2 Olga Brani
                 *  @default null
11026 8a217fa2 Olga Brani
                 */
11027 8a217fa2 Olga Brani
                "nTableWrapper": null,
11028 8a217fa2 Olga Brani
                
11029 8a217fa2 Olga Brani
                /**
11030 8a217fa2 Olga Brani
                 * Indicate if when using server-side processing the loading of data 
11031 8a217fa2 Olga Brani
                 * should be deferred until the second draw.
11032 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11033 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11034 8a217fa2 Olga Brani
                 *  @type boolean
11035 8a217fa2 Olga Brani
                 *  @default false
11036 8a217fa2 Olga Brani
                 */
11037 8a217fa2 Olga Brani
                "bDeferLoading": false,
11038 8a217fa2 Olga Brani
                
11039 8a217fa2 Olga Brani
                /**
11040 8a217fa2 Olga Brani
                 * Indicate if all required information has been read in
11041 8a217fa2 Olga Brani
                 *  @type boolean
11042 8a217fa2 Olga Brani
                 *  @default false
11043 8a217fa2 Olga Brani
                 */
11044 8a217fa2 Olga Brani
                "bInitialised": false,
11045 8a217fa2 Olga Brani
                
11046 8a217fa2 Olga Brani
                /**
11047 8a217fa2 Olga Brani
                 * Information about open rows. Each object in the array has the parameters
11048 8a217fa2 Olga Brani
                 * 'nTr' and 'nParent'
11049 8a217fa2 Olga Brani
                 *  @type array
11050 8a217fa2 Olga Brani
                 *  @default []
11051 8a217fa2 Olga Brani
                 */
11052 8a217fa2 Olga Brani
                "aoOpenRows": [],
11053 8a217fa2 Olga Brani
                
11054 8a217fa2 Olga Brani
                /**
11055 8a217fa2 Olga Brani
                 * Dictate the positioning of DataTables' control elements - see
11056 8a217fa2 Olga Brani
                 * {@link DataTable.model.oInit.sDom}.
11057 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11058 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11059 8a217fa2 Olga Brani
                 *  @type string
11060 8a217fa2 Olga Brani
                 *  @default null
11061 8a217fa2 Olga Brani
                 */
11062 8a217fa2 Olga Brani
                "sDom": null,
11063 8a217fa2 Olga Brani
                
11064 8a217fa2 Olga Brani
                /**
11065 8a217fa2 Olga Brani
                 * Which type of pagination should be used.
11066 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11067 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11068 8a217fa2 Olga Brani
                 *  @type string 
11069 8a217fa2 Olga Brani
                 *  @default two_button
11070 8a217fa2 Olga Brani
                 */
11071 8a217fa2 Olga Brani
                "sPaginationType": "two_button",
11072 8a217fa2 Olga Brani
                
11073 8a217fa2 Olga Brani
                /**
11074 8a217fa2 Olga Brani
                 * The cookie duration (for bStateSave) in seconds.
11075 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11076 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11077 8a217fa2 Olga Brani
                 *  @type int
11078 8a217fa2 Olga Brani
                 *  @default 0
11079 8a217fa2 Olga Brani
                 */
11080 8a217fa2 Olga Brani
                "iCookieDuration": 0,
11081 8a217fa2 Olga Brani
                
11082 8a217fa2 Olga Brani
                /**
11083 8a217fa2 Olga Brani
                 * The cookie name prefix.
11084 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11085 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11086 8a217fa2 Olga Brani
                 *  @type string
11087 8a217fa2 Olga Brani
                 *  @default <i>Empty string</i>
11088 8a217fa2 Olga Brani
                 */
11089 8a217fa2 Olga Brani
                "sCookiePrefix": "",
11090 8a217fa2 Olga Brani
                
11091 8a217fa2 Olga Brani
                /**
11092 8a217fa2 Olga Brani
                 * Callback function for cookie creation.
11093 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11094 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11095 8a217fa2 Olga Brani
                 *  @type function
11096 8a217fa2 Olga Brani
                 *  @default null
11097 8a217fa2 Olga Brani
                 */
11098 8a217fa2 Olga Brani
                "fnCookieCallback": null,
11099 8a217fa2 Olga Brani
                
11100 8a217fa2 Olga Brani
                /**
11101 8a217fa2 Olga Brani
                 * Array of callback functions for state saving. Each array element is an 
11102 8a217fa2 Olga Brani
                 * object with the following parameters:
11103 8a217fa2 Olga Brani
                 *   <ul>
11104 8a217fa2 Olga Brani
                 *     <li>function:fn - function to call. Takes two parameters, oSettings
11105 8a217fa2 Olga Brani
                 *       and the JSON string to save that has been thus far created. Returns
11106 8a217fa2 Olga Brani
                 *       a JSON string to be inserted into a json object 
11107 8a217fa2 Olga Brani
                 *       (i.e. '"param": [ 0, 1, 2]')</li>
11108 8a217fa2 Olga Brani
                 *     <li>string:sName - name of callback</li>
11109 8a217fa2 Olga Brani
                 *   </ul>
11110 8a217fa2 Olga Brani
                 *  @type array
11111 8a217fa2 Olga Brani
                 *  @default []
11112 8a217fa2 Olga Brani
                 */
11113 8a217fa2 Olga Brani
                "aoStateSave": [],
11114 8a217fa2 Olga Brani
                
11115 8a217fa2 Olga Brani
                /**
11116 8a217fa2 Olga Brani
                 * Array of callback functions for state loading. Each array element is an 
11117 8a217fa2 Olga Brani
                 * object with the following parameters:
11118 8a217fa2 Olga Brani
                 *   <ul>
11119 8a217fa2 Olga Brani
                 *     <li>function:fn - function to call. Takes two parameters, oSettings 
11120 8a217fa2 Olga Brani
                 *       and the object stored. May return false to cancel state loading</li>
11121 8a217fa2 Olga Brani
                 *     <li>string:sName - name of callback</li>
11122 8a217fa2 Olga Brani
                 *   </ul>
11123 8a217fa2 Olga Brani
                 *  @type array
11124 8a217fa2 Olga Brani
                 *  @default []
11125 8a217fa2 Olga Brani
                 */
11126 8a217fa2 Olga Brani
                "aoStateLoad": [],
11127 8a217fa2 Olga Brani
                
11128 8a217fa2 Olga Brani
                /**
11129 8a217fa2 Olga Brani
                 * State that was loaded from the cookie. Useful for back reference
11130 8a217fa2 Olga Brani
                 *  @type object
11131 8a217fa2 Olga Brani
                 *  @default null
11132 8a217fa2 Olga Brani
                 */
11133 8a217fa2 Olga Brani
                "oLoadedState": null,
11134 8a217fa2 Olga Brani
                
11135 8a217fa2 Olga Brani
                /**
11136 8a217fa2 Olga Brani
                 * Source url for AJAX data for the table.
11137 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11138 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11139 8a217fa2 Olga Brani
                 *  @type string
11140 8a217fa2 Olga Brani
                 *  @default null
11141 8a217fa2 Olga Brani
                 */
11142 8a217fa2 Olga Brani
                "sAjaxSource": null,
11143 8a217fa2 Olga Brani
                
11144 8a217fa2 Olga Brani
                /**
11145 8a217fa2 Olga Brani
                 * Property from a given object from which to read the table data from. This
11146 8a217fa2 Olga Brani
                 * can be an empty string (when not server-side processing), in which case 
11147 8a217fa2 Olga Brani
                 * it is  assumed an an array is given directly.
11148 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11149 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11150 8a217fa2 Olga Brani
                 *  @type string
11151 8a217fa2 Olga Brani
                 */
11152 8a217fa2 Olga Brani
                "sAjaxDataProp": null,
11153 8a217fa2 Olga Brani
                
11154 8a217fa2 Olga Brani
                /**
11155 8a217fa2 Olga Brani
                 * Note if draw should be blocked while getting data
11156 8a217fa2 Olga Brani
                 *  @type boolean
11157 8a217fa2 Olga Brani
                 *  @default true
11158 8a217fa2 Olga Brani
                 */
11159 8a217fa2 Olga Brani
                "bAjaxDataGet": true,
11160 8a217fa2 Olga Brani
                
11161 8a217fa2 Olga Brani
                /**
11162 8a217fa2 Olga Brani
                 * The last jQuery XHR object that was used for server-side data gathering. 
11163 8a217fa2 Olga Brani
                 * This can be used for working with the XHR information in one of the 
11164 8a217fa2 Olga Brani
                 * callbacks
11165 8a217fa2 Olga Brani
                 *  @type object
11166 8a217fa2 Olga Brani
                 *  @default null
11167 8a217fa2 Olga Brani
                 */
11168 8a217fa2 Olga Brani
                "jqXHR": null,
11169 8a217fa2 Olga Brani
                
11170 8a217fa2 Olga Brani
                /**
11171 8a217fa2 Olga Brani
                 * Function to get the server-side data.
11172 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11173 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11174 8a217fa2 Olga Brani
                 *  @type function
11175 8a217fa2 Olga Brani
                 */
11176 8a217fa2 Olga Brani
                "fnServerData": null,
11177 8a217fa2 Olga Brani
                
11178 8a217fa2 Olga Brani
                /**
11179 8a217fa2 Olga Brani
                 * Functions which are called prior to sending an Ajax request so extra 
11180 8a217fa2 Olga Brani
                 * parameters can easily be sent to the server
11181 8a217fa2 Olga Brani
                 *  @type array
11182 8a217fa2 Olga Brani
                 *  @default []
11183 8a217fa2 Olga Brani
                 */
11184 8a217fa2 Olga Brani
                "aoServerParams": [],
11185 8a217fa2 Olga Brani
                
11186 8a217fa2 Olga Brani
                /**
11187 8a217fa2 Olga Brani
                 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if 
11188 8a217fa2 Olga Brani
                 * required).
11189 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11190 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11191 8a217fa2 Olga Brani
                 *  @type string
11192 8a217fa2 Olga Brani
                 */
11193 8a217fa2 Olga Brani
                "sServerMethod": null,
11194 8a217fa2 Olga Brani
                
11195 8a217fa2 Olga Brani
                /**
11196 8a217fa2 Olga Brani
                 * Format numbers for display.
11197 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11198 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11199 8a217fa2 Olga Brani
                 *  @type function
11200 8a217fa2 Olga Brani
                 */
11201 8a217fa2 Olga Brani
                "fnFormatNumber": null,
11202 8a217fa2 Olga Brani
                
11203 8a217fa2 Olga Brani
                /**
11204 8a217fa2 Olga Brani
                 * List of options that can be used for the user selectable length menu.
11205 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11206 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11207 8a217fa2 Olga Brani
                 *  @type array
11208 8a217fa2 Olga Brani
                 *  @default []
11209 8a217fa2 Olga Brani
                 */
11210 8a217fa2 Olga Brani
                "aLengthMenu": null,
11211 8a217fa2 Olga Brani
                
11212 8a217fa2 Olga Brani
                /**
11213 8a217fa2 Olga Brani
                 * Counter for the draws that the table does. Also used as a tracker for
11214 8a217fa2 Olga Brani
                 * server-side processing
11215 8a217fa2 Olga Brani
                 *  @type int
11216 8a217fa2 Olga Brani
                 *  @default 0
11217 8a217fa2 Olga Brani
                 */
11218 8a217fa2 Olga Brani
                "iDraw": 0,
11219 8a217fa2 Olga Brani
                
11220 8a217fa2 Olga Brani
                /**
11221 8a217fa2 Olga Brani
                 * Indicate if a redraw is being done - useful for Ajax
11222 8a217fa2 Olga Brani
                 *  @type boolean
11223 8a217fa2 Olga Brani
                 *  @default false
11224 8a217fa2 Olga Brani
                 */
11225 8a217fa2 Olga Brani
                "bDrawing": false,
11226 8a217fa2 Olga Brani
                
11227 8a217fa2 Olga Brani
                /**
11228 8a217fa2 Olga Brani
                 * Draw index (iDraw) of the last error when parsing the returned data
11229 8a217fa2 Olga Brani
                 *  @type int
11230 8a217fa2 Olga Brani
                 *  @default -1
11231 8a217fa2 Olga Brani
                 */
11232 8a217fa2 Olga Brani
                "iDrawError": -1,
11233 8a217fa2 Olga Brani
                
11234 8a217fa2 Olga Brani
                /**
11235 8a217fa2 Olga Brani
                 * Paging display length
11236 8a217fa2 Olga Brani
                 *  @type int
11237 8a217fa2 Olga Brani
                 *  @default 10
11238 8a217fa2 Olga Brani
                 */
11239 8a217fa2 Olga Brani
                "_iDisplayLength": 10,
11240 8a217fa2 Olga Brani
        
11241 8a217fa2 Olga Brani
                /**
11242 8a217fa2 Olga Brani
                 * Paging start point - aiDisplay index
11243 8a217fa2 Olga Brani
                 *  @type int
11244 8a217fa2 Olga Brani
                 *  @default 0
11245 8a217fa2 Olga Brani
                 */
11246 8a217fa2 Olga Brani
                "_iDisplayStart": 0,
11247 8a217fa2 Olga Brani
        
11248 8a217fa2 Olga Brani
                /**
11249 8a217fa2 Olga Brani
                 * Paging end point - aiDisplay index. Use fnDisplayEnd rather than
11250 8a217fa2 Olga Brani
                 * this property to get the end point
11251 8a217fa2 Olga Brani
                 *  @type int
11252 8a217fa2 Olga Brani
                 *  @default 10
11253 8a217fa2 Olga Brani
                 *  @private
11254 8a217fa2 Olga Brani
                 */
11255 8a217fa2 Olga Brani
                "_iDisplayEnd": 10,
11256 8a217fa2 Olga Brani
                
11257 8a217fa2 Olga Brani
                /**
11258 8a217fa2 Olga Brani
                 * Server-side processing - number of records in the result set
11259 8a217fa2 Olga Brani
                 * (i.e. before filtering), Use fnRecordsTotal rather than
11260 8a217fa2 Olga Brani
                 * this property to get the value of the number of records, regardless of
11261 8a217fa2 Olga Brani
                 * the server-side processing setting.
11262 8a217fa2 Olga Brani
                 *  @type int
11263 8a217fa2 Olga Brani
                 *  @default 0
11264 8a217fa2 Olga Brani
                 *  @private
11265 8a217fa2 Olga Brani
                 */
11266 8a217fa2 Olga Brani
                "_iRecordsTotal": 0,
11267 8a217fa2 Olga Brani
        
11268 8a217fa2 Olga Brani
                /**
11269 8a217fa2 Olga Brani
                 * Server-side processing - number of records in the current display set
11270 8a217fa2 Olga Brani
                 * (i.e. after filtering). Use fnRecordsDisplay rather than
11271 8a217fa2 Olga Brani
                 * this property to get the value of the number of records, regardless of
11272 8a217fa2 Olga Brani
                 * the server-side processing setting.
11273 8a217fa2 Olga Brani
                 *  @type boolean
11274 8a217fa2 Olga Brani
                 *  @default 0
11275 8a217fa2 Olga Brani
                 *  @private
11276 8a217fa2 Olga Brani
                 */
11277 8a217fa2 Olga Brani
                "_iRecordsDisplay": 0,
11278 8a217fa2 Olga Brani
                
11279 8a217fa2 Olga Brani
                /**
11280 8a217fa2 Olga Brani
                 * Flag to indicate if jQuery UI marking and classes should be used.
11281 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11282 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11283 8a217fa2 Olga Brani
                 *  @type boolean
11284 8a217fa2 Olga Brani
                 */
11285 8a217fa2 Olga Brani
                "bJUI": null,
11286 8a217fa2 Olga Brani
                
11287 8a217fa2 Olga Brani
                /**
11288 8a217fa2 Olga Brani
                 * The classes to use for the table
11289 8a217fa2 Olga Brani
                 *  @type object
11290 8a217fa2 Olga Brani
                 *  @default {}
11291 8a217fa2 Olga Brani
                 */
11292 8a217fa2 Olga Brani
                "oClasses": {},
11293 8a217fa2 Olga Brani
                
11294 8a217fa2 Olga Brani
                /**
11295 8a217fa2 Olga Brani
                 * Flag attached to the settings object so you can check in the draw 
11296 8a217fa2 Olga Brani
                 * callback if filtering has been done in the draw. Deprecated in favour of
11297 8a217fa2 Olga Brani
                 * events.
11298 8a217fa2 Olga Brani
                 *  @type boolean
11299 8a217fa2 Olga Brani
                 *  @default false
11300 8a217fa2 Olga Brani
                 *  @deprecated
11301 8a217fa2 Olga Brani
                 */
11302 8a217fa2 Olga Brani
                "bFiltered": false,
11303 8a217fa2 Olga Brani
                
11304 8a217fa2 Olga Brani
                /**
11305 8a217fa2 Olga Brani
                 * Flag attached to the settings object so you can check in the draw 
11306 8a217fa2 Olga Brani
                 * callback if sorting has been done in the draw. Deprecated in favour of
11307 8a217fa2 Olga Brani
                 * events.
11308 8a217fa2 Olga Brani
                 *  @type boolean
11309 8a217fa2 Olga Brani
                 *  @default false
11310 8a217fa2 Olga Brani
                 *  @deprecated
11311 8a217fa2 Olga Brani
                 */
11312 8a217fa2 Olga Brani
                "bSorted": false,
11313 8a217fa2 Olga Brani
                
11314 8a217fa2 Olga Brani
                /**
11315 8a217fa2 Olga Brani
                 * Indicate that if multiple rows are in the header and there is more than 
11316 8a217fa2 Olga Brani
                 * one unique cell per column, if the top one (true) or bottom one (false) 
11317 8a217fa2 Olga Brani
                 * should be used for sorting / title by DataTables.
11318 8a217fa2 Olga Brani
                 * Note that this parameter will be set by the initialisation routine. To
11319 8a217fa2 Olga Brani
                 * set a default use {@link DataTable.defaults}.
11320 8a217fa2 Olga Brani
                 *  @type boolean
11321 8a217fa2 Olga Brani
                 */
11322 8a217fa2 Olga Brani
                "bSortCellsTop": null,
11323 8a217fa2 Olga Brani
                
11324 8a217fa2 Olga Brani
                /**
11325 8a217fa2 Olga Brani
                 * Initialisation object that is used for the table
11326 8a217fa2 Olga Brani
                 *  @type object
11327 8a217fa2 Olga Brani
                 *  @default null
11328 8a217fa2 Olga Brani
                 */
11329 8a217fa2 Olga Brani
                "oInit": null,
11330 8a217fa2 Olga Brani
                
11331 8a217fa2 Olga Brani
                /**
11332 8a217fa2 Olga Brani
                 * Destroy callback functions - for plug-ins to attach themselves to the
11333 8a217fa2 Olga Brani
                 * destroy so they can clean up markup and events.
11334 8a217fa2 Olga Brani
                 *  @type array
11335 8a217fa2 Olga Brani
                 *  @default []
11336 8a217fa2 Olga Brani
                 */
11337 8a217fa2 Olga Brani
                "aoDestroyCallback": [],
11338 8a217fa2 Olga Brani
        
11339 8a217fa2 Olga Brani
                
11340 8a217fa2 Olga Brani
                /**
11341 8a217fa2 Olga Brani
                 * Get the number of records in the current record set, before filtering
11342 8a217fa2 Olga Brani
                 *  @type function
11343 8a217fa2 Olga Brani
                 */
11344 8a217fa2 Olga Brani
                "fnRecordsTotal": function ()
11345 8a217fa2 Olga Brani
                {
11346 8a217fa2 Olga Brani
                        if ( this.oFeatures.bServerSide ) {
11347 8a217fa2 Olga Brani
                                return parseInt(this._iRecordsTotal, 10);
11348 8a217fa2 Olga Brani
                        } else {
11349 8a217fa2 Olga Brani
                                return this.aiDisplayMaster.length;
11350 8a217fa2 Olga Brani
                        }
11351 8a217fa2 Olga Brani
                },
11352 8a217fa2 Olga Brani
                
11353 8a217fa2 Olga Brani
                /**
11354 8a217fa2 Olga Brani
                 * Get the number of records in the current record set, after filtering
11355 8a217fa2 Olga Brani
                 *  @type function
11356 8a217fa2 Olga Brani
                 */
11357 8a217fa2 Olga Brani
                "fnRecordsDisplay": function ()
11358 8a217fa2 Olga Brani
                {
11359 8a217fa2 Olga Brani
                        if ( this.oFeatures.bServerSide ) {
11360 8a217fa2 Olga Brani
                                return parseInt(this._iRecordsDisplay, 10);
11361 8a217fa2 Olga Brani
                        } else {
11362 8a217fa2 Olga Brani
                                return this.aiDisplay.length;
11363 8a217fa2 Olga Brani
                        }
11364 8a217fa2 Olga Brani
                },
11365 8a217fa2 Olga Brani
                
11366 8a217fa2 Olga Brani
                /**
11367 8a217fa2 Olga Brani
                 * Set the display end point - aiDisplay index
11368 8a217fa2 Olga Brani
                 *  @type function
11369 8a217fa2 Olga Brani
                 *  @todo Should do away with _iDisplayEnd and calculate it on-the-fly here
11370 8a217fa2 Olga Brani
                 */
11371 8a217fa2 Olga Brani
                "fnDisplayEnd": function ()
11372 8a217fa2 Olga Brani
                {
11373 8a217fa2 Olga Brani
                        if ( this.oFeatures.bServerSide ) {
11374 8a217fa2 Olga Brani
                                if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
11375 8a217fa2 Olga Brani
                                        return this._iDisplayStart+this.aiDisplay.length;
11376 8a217fa2 Olga Brani
                                } else {
11377 8a217fa2 Olga Brani
                                        return Math.min( this._iDisplayStart+this._iDisplayLength, 
11378 8a217fa2 Olga Brani
                                                this._iRecordsDisplay );
11379 8a217fa2 Olga Brani
                                }
11380 8a217fa2 Olga Brani
                        } else {
11381 8a217fa2 Olga Brani
                                return this._iDisplayEnd;
11382 8a217fa2 Olga Brani
                        }
11383 8a217fa2 Olga Brani
                },
11384 8a217fa2 Olga Brani
                
11385 8a217fa2 Olga Brani
                /**
11386 8a217fa2 Olga Brani
                 * The DataTables object for this table
11387 8a217fa2 Olga Brani
                 *  @type object
11388 8a217fa2 Olga Brani
                 *  @default null
11389 8a217fa2 Olga Brani
                 */
11390 8a217fa2 Olga Brani
                "oInstance": null,
11391 8a217fa2 Olga Brani
                
11392 8a217fa2 Olga Brani
                /**
11393 8a217fa2 Olga Brani
                 * Unique identifier for each instance of the DataTables object. If there
11394 8a217fa2 Olga Brani
                 * is an ID on the table node, then it takes that value, otherwise an
11395 8a217fa2 Olga Brani
                 * incrementing internal counter is used.
11396 8a217fa2 Olga Brani
                 *  @type string
11397 8a217fa2 Olga Brani
                 *  @default null
11398 8a217fa2 Olga Brani
                 */
11399 8a217fa2 Olga Brani
                "sInstance": null,
11400 8a217fa2 Olga Brani
        
11401 8a217fa2 Olga Brani
                /**
11402 8a217fa2 Olga Brani
                 * tabindex attribute value that is added to DataTables control elements, allowing
11403 8a217fa2 Olga Brani
                 * keyboard navigation of the table and its controls.
11404 8a217fa2 Olga Brani
                 */
11405 8a217fa2 Olga Brani
                "iTabIndex": 0,
11406 8a217fa2 Olga Brani
        
11407 8a217fa2 Olga Brani
                /**
11408 8a217fa2 Olga Brani
                 * DIV container for the footer scrolling table if scrolling
11409 8a217fa2 Olga Brani
                 */
11410 8a217fa2 Olga Brani
                "nScrollHead": null,
11411 8a217fa2 Olga Brani
        
11412 8a217fa2 Olga Brani
                /**
11413 8a217fa2 Olga Brani
                 * DIV container for the footer scrolling table if scrolling
11414 8a217fa2 Olga Brani
                 */
11415 8a217fa2 Olga Brani
                "nScrollFoot": null
11416 8a217fa2 Olga Brani
        };
11417 8a217fa2 Olga Brani
11418 8a217fa2 Olga Brani
        /**
11419 8a217fa2 Olga Brani
         * Extension object for DataTables that is used to provide all extension options.
11420 8a217fa2 Olga Brani
         * 
11421 8a217fa2 Olga Brani
         * Note that the <i>DataTable.ext</i> object is available through
11422 8a217fa2 Olga Brani
         * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is
11423 8a217fa2 Olga Brani
         * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons.
11424 8a217fa2 Olga Brani
         *  @namespace
11425 8a217fa2 Olga Brani
         *  @extends DataTable.models.ext
11426 8a217fa2 Olga Brani
         */
11427 8a217fa2 Olga Brani
        DataTable.ext = $.extend( true, {}, DataTable.models.ext );
11428 8a217fa2 Olga Brani
        
11429 8a217fa2 Olga Brani
        $.extend( DataTable.ext.oStdClasses, {
11430 8a217fa2 Olga Brani
                "sTable": "dataTable",
11431 8a217fa2 Olga Brani
        
11432 8a217fa2 Olga Brani
                /* Two buttons buttons */
11433 8a217fa2 Olga Brani
                "sPagePrevEnabled": "paginate_enabled_previous",
11434 8a217fa2 Olga Brani
                "sPagePrevDisabled": "paginate_disabled_previous",
11435 8a217fa2 Olga Brani
                "sPageNextEnabled": "paginate_enabled_next",
11436 8a217fa2 Olga Brani
                "sPageNextDisabled": "paginate_disabled_next",
11437 8a217fa2 Olga Brani
                "sPageJUINext": "",
11438 8a217fa2 Olga Brani
                "sPageJUIPrev": "",
11439 8a217fa2 Olga Brani
                
11440 8a217fa2 Olga Brani
                /* Full numbers paging buttons */
11441 8a217fa2 Olga Brani
                "sPageButton": "paginate_button",
11442 8a217fa2 Olga Brani
                "sPageButtonActive": "paginate_active",
11443 8a217fa2 Olga Brani
                "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled",
11444 8a217fa2 Olga Brani
                "sPageFirst": "first",
11445 8a217fa2 Olga Brani
                "sPagePrevious": "previous",
11446 8a217fa2 Olga Brani
                "sPageNext": "next",
11447 8a217fa2 Olga Brani
                "sPageLast": "last",
11448 8a217fa2 Olga Brani
                
11449 8a217fa2 Olga Brani
                /* Striping classes */
11450 8a217fa2 Olga Brani
                "sStripeOdd": "odd",
11451 8a217fa2 Olga Brani
                "sStripeEven": "even",
11452 8a217fa2 Olga Brani
                
11453 8a217fa2 Olga Brani
                /* Empty row */
11454 8a217fa2 Olga Brani
                "sRowEmpty": "dataTables_empty",
11455 8a217fa2 Olga Brani
                
11456 8a217fa2 Olga Brani
                /* Features */
11457 8a217fa2 Olga Brani
                "sWrapper": "dataTables_wrapper",
11458 8a217fa2 Olga Brani
                "sFilter": "dataTables_filter",
11459 8a217fa2 Olga Brani
                "sInfo": "dataTables_info",
11460 8a217fa2 Olga Brani
                "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
11461 8a217fa2 Olga Brani
                "sLength": "dataTables_length",
11462 8a217fa2 Olga Brani
                "sProcessing": "dataTables_processing",
11463 8a217fa2 Olga Brani
                
11464 8a217fa2 Olga Brani
                /* Sorting */
11465 8a217fa2 Olga Brani
                "sSortAsc": "sorting_asc",
11466 8a217fa2 Olga Brani
                "sSortDesc": "sorting_desc",
11467 8a217fa2 Olga Brani
                "sSortable": "sorting", /* Sortable in both directions */
11468 8a217fa2 Olga Brani
                "sSortableAsc": "sorting_asc_disabled",
11469 8a217fa2 Olga Brani
                "sSortableDesc": "sorting_desc_disabled",
11470 8a217fa2 Olga Brani
                "sSortableNone": "sorting_disabled",
11471 8a217fa2 Olga Brani
                "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
11472 8a217fa2 Olga Brani
                "sSortJUIAsc": "",
11473 8a217fa2 Olga Brani
                "sSortJUIDesc": "",
11474 8a217fa2 Olga Brani
                "sSortJUI": "",
11475 8a217fa2 Olga Brani
                "sSortJUIAscAllowed": "",
11476 8a217fa2 Olga Brani
                "sSortJUIDescAllowed": "",
11477 8a217fa2 Olga Brani
                "sSortJUIWrapper": "",
11478 8a217fa2 Olga Brani
                "sSortIcon": "",
11479 8a217fa2 Olga Brani
                
11480 8a217fa2 Olga Brani
                /* Scrolling */
11481 8a217fa2 Olga Brani
                "sScrollWrapper": "dataTables_scroll",
11482 8a217fa2 Olga Brani
                "sScrollHead": "dataTables_scrollHead",
11483 8a217fa2 Olga Brani
                "sScrollHeadInner": "dataTables_scrollHeadInner",
11484 8a217fa2 Olga Brani
                "sScrollBody": "dataTables_scrollBody",
11485 8a217fa2 Olga Brani
                "sScrollFoot": "dataTables_scrollFoot",
11486 8a217fa2 Olga Brani
                "sScrollFootInner": "dataTables_scrollFootInner",
11487 8a217fa2 Olga Brani
                
11488 8a217fa2 Olga Brani
                /* Misc */
11489 8a217fa2 Olga Brani
                "sFooterTH": "",
11490 8a217fa2 Olga Brani
                "sJUIHeader": "",
11491 8a217fa2 Olga Brani
                "sJUIFooter": ""
11492 8a217fa2 Olga Brani
        } );
11493 8a217fa2 Olga Brani
        
11494 8a217fa2 Olga Brani
        
11495 8a217fa2 Olga Brani
        $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, {
11496 8a217fa2 Olga Brani
                /* Two buttons buttons */
11497 8a217fa2 Olga Brani
                "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
11498 8a217fa2 Olga Brani
                "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
11499 8a217fa2 Olga Brani
                "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
11500 8a217fa2 Olga Brani
                "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
11501 8a217fa2 Olga Brani
                "sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
11502 8a217fa2 Olga Brani
                "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
11503 8a217fa2 Olga Brani
                
11504 8a217fa2 Olga Brani
                /* Full numbers paging buttons */
11505 8a217fa2 Olga Brani
                "sPageButton": "fg-button ui-button ui-state-default",
11506 8a217fa2 Olga Brani
                "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
11507 8a217fa2 Olga Brani
                "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
11508 8a217fa2 Olga Brani
                "sPageFirst": "first ui-corner-tl ui-corner-bl",
11509 8a217fa2 Olga Brani
                "sPageLast": "last ui-corner-tr ui-corner-br",
11510 8a217fa2 Olga Brani
                
11511 8a217fa2 Olga Brani
                /* Features */
11512 8a217fa2 Olga Brani
                "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
11513 8a217fa2 Olga Brani
                        "ui-buttonset-multi paging_", /* Note that the type is postfixed */
11514 8a217fa2 Olga Brani
                
11515 8a217fa2 Olga Brani
                /* Sorting */
11516 8a217fa2 Olga Brani
                "sSortAsc": "ui-state-default",
11517 8a217fa2 Olga Brani
                "sSortDesc": "ui-state-default",
11518 8a217fa2 Olga Brani
                "sSortable": "ui-state-default",
11519 8a217fa2 Olga Brani
                "sSortableAsc": "ui-state-default",
11520 8a217fa2 Olga Brani
                "sSortableDesc": "ui-state-default",
11521 8a217fa2 Olga Brani
                "sSortableNone": "ui-state-default",
11522 8a217fa2 Olga Brani
                "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
11523 8a217fa2 Olga Brani
                "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
11524 8a217fa2 Olga Brani
                "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
11525 8a217fa2 Olga Brani
                "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
11526 8a217fa2 Olga Brani
                "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
11527 8a217fa2 Olga Brani
                "sSortJUIWrapper": "DataTables_sort_wrapper",
11528 8a217fa2 Olga Brani
                "sSortIcon": "DataTables_sort_icon",
11529 8a217fa2 Olga Brani
                
11530 8a217fa2 Olga Brani
                /* Scrolling */
11531 8a217fa2 Olga Brani
                "sScrollHead": "dataTables_scrollHead ui-state-default",
11532 8a217fa2 Olga Brani
                "sScrollFoot": "dataTables_scrollFoot ui-state-default",
11533 8a217fa2 Olga Brani
                
11534 8a217fa2 Olga Brani
                /* Misc */
11535 8a217fa2 Olga Brani
                "sFooterTH": "ui-state-default",
11536 8a217fa2 Olga Brani
                "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",
11537 8a217fa2 Olga Brani
                "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"
11538 8a217fa2 Olga Brani
        } );
11539 8a217fa2 Olga Brani
        
11540 8a217fa2 Olga Brani
        /*
11541 8a217fa2 Olga Brani
         * Variable: oPagination
11542 8a217fa2 Olga Brani
         * Purpose:  
11543 8a217fa2 Olga Brani
         * Scope:    jQuery.fn.dataTableExt
11544 8a217fa2 Olga Brani
         */
11545 8a217fa2 Olga Brani
        $.extend( DataTable.ext.oPagination, {
11546 8a217fa2 Olga Brani
                /*
11547 8a217fa2 Olga Brani
                 * Variable: two_button
11548 8a217fa2 Olga Brani
                 * Purpose:  Standard two button (forward/back) pagination
11549 8a217fa2 Olga Brani
                 * Scope:    jQuery.fn.dataTableExt.oPagination
11550 8a217fa2 Olga Brani
                 */
11551 8a217fa2 Olga Brani
                "two_button": {
11552 8a217fa2 Olga Brani
                        /*
11553 8a217fa2 Olga Brani
                         * Function: oPagination.two_button.fnInit
11554 8a217fa2 Olga Brani
                         * Purpose:  Initialise dom elements required for pagination with forward/back buttons only
11555 8a217fa2 Olga Brani
                         * Returns:  -
11556 8a217fa2 Olga Brani
                         * Inputs:   object:oSettings - dataTables settings object
11557 8a217fa2 Olga Brani
                         *           node:nPaging - the DIV which contains this pagination control
11558 8a217fa2 Olga Brani
                         *           function:fnCallbackDraw - draw function which must be called on update
11559 8a217fa2 Olga Brani
                         */
11560 8a217fa2 Olga Brani
                        "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
11561 8a217fa2 Olga Brani
                        {
11562 8a217fa2 Olga Brani
                                var oLang = oSettings.oLanguage.oPaginate;
11563 8a217fa2 Olga Brani
                                var oClasses = oSettings.oClasses;
11564 8a217fa2 Olga Brani
                                var fnClickHandler = function ( e ) {
11565 8a217fa2 Olga Brani
                                        if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
11566 8a217fa2 Olga Brani
                                        {
11567 8a217fa2 Olga Brani
                                                fnCallbackDraw( oSettings );
11568 8a217fa2 Olga Brani
                                        }
11569 8a217fa2 Olga Brani
                                };
11570 8a217fa2 Olga Brani
        
11571 8a217fa2 Olga Brani
                                var sAppend = (!oSettings.bJUI) ?
11572 8a217fa2 Olga Brani
                                        '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+
11573 8a217fa2 Olga Brani
                                        '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>'
11574 8a217fa2 Olga Brani
                                        :
11575 8a217fa2 Olga Brani
                                        '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+
11576 8a217fa2 Olga Brani
                                        '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>';
11577 8a217fa2 Olga Brani
                                $(nPaging).append( sAppend );
11578 8a217fa2 Olga Brani
                                
11579 8a217fa2 Olga Brani
                                var els = $('a', nPaging);
11580 8a217fa2 Olga Brani
                                var nPrevious = els[0],
11581 8a217fa2 Olga Brani
                                        nNext = els[1];
11582 8a217fa2 Olga Brani
                                
11583 8a217fa2 Olga Brani
                                oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler );
11584 8a217fa2 Olga Brani
                                oSettings.oApi._fnBindAction( nNext,     {action: "next"},     fnClickHandler );
11585 8a217fa2 Olga Brani
                                
11586 8a217fa2 Olga Brani
                                /* ID the first elements only */
11587 8a217fa2 Olga Brani
                                if ( !oSettings.aanFeatures.p )
11588 8a217fa2 Olga Brani
                                {
11589 8a217fa2 Olga Brani
                                        nPaging.id = oSettings.sTableId+'_paginate';
11590 8a217fa2 Olga Brani
                                        nPrevious.id = oSettings.sTableId+'_previous';
11591 8a217fa2 Olga Brani
                                        nNext.id = oSettings.sTableId+'_next';
11592 8a217fa2 Olga Brani
        
11593 8a217fa2 Olga Brani
                                        nPrevious.setAttribute('aria-controls', oSettings.sTableId);
11594 8a217fa2 Olga Brani
                                        nNext.setAttribute('aria-controls', oSettings.sTableId);
11595 8a217fa2 Olga Brani
                                }
11596 8a217fa2 Olga Brani
                        },
11597 8a217fa2 Olga Brani
                        
11598 8a217fa2 Olga Brani
                        /*
11599 8a217fa2 Olga Brani
                         * Function: oPagination.two_button.fnUpdate
11600 8a217fa2 Olga Brani
                         * Purpose:  Update the two button pagination at the end of the draw
11601 8a217fa2 Olga Brani
                         * Returns:  -
11602 8a217fa2 Olga Brani
                         * Inputs:   object:oSettings - dataTables settings object
11603 8a217fa2 Olga Brani
                         *           function:fnCallbackDraw - draw function to call on page change
11604 8a217fa2 Olga Brani
                         */
11605 8a217fa2 Olga Brani
                        "fnUpdate": function ( oSettings, fnCallbackDraw )
11606 8a217fa2 Olga Brani
                        {
11607 8a217fa2 Olga Brani
                                if ( !oSettings.aanFeatures.p )
11608 8a217fa2 Olga Brani
                                {
11609 8a217fa2 Olga Brani
                                        return;
11610 8a217fa2 Olga Brani
                                }
11611 8a217fa2 Olga Brani
                                
11612 8a217fa2 Olga Brani
                                var oClasses = oSettings.oClasses;
11613 8a217fa2 Olga Brani
                                var an = oSettings.aanFeatures.p;
11614 8a217fa2 Olga Brani
                                var nNode;
11615 8a217fa2 Olga Brani
        
11616 8a217fa2 Olga Brani
                                /* Loop over each instance of the pager */
11617 8a217fa2 Olga Brani
                                for ( var i=0, iLen=an.length ; i<iLen ; i++ )
11618 8a217fa2 Olga Brani
                                {
11619 8a217fa2 Olga Brani
                                        nNode = an[i].firstChild;
11620 8a217fa2 Olga Brani
                                        if ( nNode )
11621 8a217fa2 Olga Brani
                                        {
11622 8a217fa2 Olga Brani
                                                /* Previous page */
11623 8a217fa2 Olga Brani
                                                nNode.className = ( oSettings._iDisplayStart === 0 ) ?
11624 8a217fa2 Olga Brani
                                                    oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
11625 8a217fa2 Olga Brani
                                                    
11626 8a217fa2 Olga Brani
                                                /* Next page */
11627 8a217fa2 Olga Brani
                                                nNode = nNode.nextSibling;
11628 8a217fa2 Olga Brani
                                                nNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
11629 8a217fa2 Olga Brani
                                                    oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
11630 8a217fa2 Olga Brani
                                        }
11631 8a217fa2 Olga Brani
                                }
11632 8a217fa2 Olga Brani
                        }
11633 8a217fa2 Olga Brani
                },
11634 8a217fa2 Olga Brani
                
11635 8a217fa2 Olga Brani
                
11636 8a217fa2 Olga Brani
                /*
11637 8a217fa2 Olga Brani
                 * Variable: iFullNumbersShowPages
11638 8a217fa2 Olga Brani
                 * Purpose:  Change the number of pages which can be seen
11639 8a217fa2 Olga Brani
                 * Scope:    jQuery.fn.dataTableExt.oPagination
11640 8a217fa2 Olga Brani
                 */
11641 8a217fa2 Olga Brani
                "iFullNumbersShowPages": 5,
11642 8a217fa2 Olga Brani
                
11643 8a217fa2 Olga Brani
                /*
11644 8a217fa2 Olga Brani
                 * Variable: full_numbers
11645 8a217fa2 Olga Brani
                 * Purpose:  Full numbers pagination
11646 8a217fa2 Olga Brani
                 * Scope:    jQuery.fn.dataTableExt.oPagination
11647 8a217fa2 Olga Brani
                 */
11648 8a217fa2 Olga Brani
                "full_numbers": {
11649 8a217fa2 Olga Brani
                        /*
11650 8a217fa2 Olga Brani
                         * Function: oPagination.full_numbers.fnInit
11651 8a217fa2 Olga Brani
                         * Purpose:  Initialise dom elements required for pagination with a list of the pages
11652 8a217fa2 Olga Brani
                         * Returns:  -
11653 8a217fa2 Olga Brani
                         * Inputs:   object:oSettings - dataTables settings object
11654 8a217fa2 Olga Brani
                         *           node:nPaging - the DIV which contains this pagination control
11655 8a217fa2 Olga Brani
                         *           function:fnCallbackDraw - draw function which must be called on update
11656 8a217fa2 Olga Brani
                         */
11657 8a217fa2 Olga Brani
                        "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
11658 8a217fa2 Olga Brani
                        {
11659 8a217fa2 Olga Brani
                                var oLang = oSettings.oLanguage.oPaginate;
11660 8a217fa2 Olga Brani
                                var oClasses = oSettings.oClasses;
11661 8a217fa2 Olga Brani
                                var fnClickHandler = function ( e ) {
11662 8a217fa2 Olga Brani
                                        if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
11663 8a217fa2 Olga Brani
                                        {
11664 8a217fa2 Olga Brani
                                                fnCallbackDraw( oSettings );
11665 8a217fa2 Olga Brani
                                        }
11666 8a217fa2 Olga Brani
                                };
11667 8a217fa2 Olga Brani
        
11668 8a217fa2 Olga Brani
                                $(nPaging).append(
11669 8a217fa2 Olga Brani
                                        '<a  tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+
11670 8a217fa2 Olga Brani
                                        '<a  tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+
11671 8a217fa2 Olga Brani
                                        '<span></span>'+
11672 8a217fa2 Olga Brani
                                        '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+
11673 8a217fa2 Olga Brani
                                        '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>'
11674 8a217fa2 Olga Brani
                                );
11675 8a217fa2 Olga Brani
                                var els = $('a', nPaging);
11676 8a217fa2 Olga Brani
                                var nFirst = els[0],
11677 8a217fa2 Olga Brani
                                        nPrev = els[1],
11678 8a217fa2 Olga Brani
                                        nNext = els[2],
11679 8a217fa2 Olga Brani
                                        nLast = els[3];
11680 8a217fa2 Olga Brani
                                
11681 8a217fa2 Olga Brani
                                oSettings.oApi._fnBindAction( nFirst, {action: "first"},    fnClickHandler );
11682 8a217fa2 Olga Brani
                                oSettings.oApi._fnBindAction( nPrev,  {action: "previous"}, fnClickHandler );
11683 8a217fa2 Olga Brani
                                oSettings.oApi._fnBindAction( nNext,  {action: "next"},     fnClickHandler );
11684 8a217fa2 Olga Brani
                                oSettings.oApi._fnBindAction( nLast,  {action: "last"},     fnClickHandler );
11685 8a217fa2 Olga Brani
                                
11686 8a217fa2 Olga Brani
                                /* ID the first elements only */
11687 8a217fa2 Olga Brani
                                if ( !oSettings.aanFeatures.p )
11688 8a217fa2 Olga Brani
                                {
11689 8a217fa2 Olga Brani
                                        nPaging.id = oSettings.sTableId+'_paginate';
11690 8a217fa2 Olga Brani
                                        nFirst.id =oSettings.sTableId+'_first';
11691 8a217fa2 Olga Brani
                                        nPrev.id =oSettings.sTableId+'_previous';
11692 8a217fa2 Olga Brani
                                        nNext.id =oSettings.sTableId+'_next';
11693 8a217fa2 Olga Brani
                                        nLast.id =oSettings.sTableId+'_last';
11694 8a217fa2 Olga Brani
                                }
11695 8a217fa2 Olga Brani
                        },
11696 8a217fa2 Olga Brani
                        
11697 8a217fa2 Olga Brani
                        /*
11698 8a217fa2 Olga Brani
                         * Function: oPagination.full_numbers.fnUpdate
11699 8a217fa2 Olga Brani
                         * Purpose:  Update the list of page buttons shows
11700 8a217fa2 Olga Brani
                         * Returns:  -
11701 8a217fa2 Olga Brani
                         * Inputs:   object:oSettings - dataTables settings object
11702 8a217fa2 Olga Brani
                         *           function:fnCallbackDraw - draw function to call on page change
11703 8a217fa2 Olga Brani
                         */
11704 8a217fa2 Olga Brani
                        "fnUpdate": function ( oSettings, fnCallbackDraw )
11705 8a217fa2 Olga Brani
                        {
11706 8a217fa2 Olga Brani
                                if ( !oSettings.aanFeatures.p )
11707 8a217fa2 Olga Brani
                                {
11708 8a217fa2 Olga Brani
                                        return;
11709 8a217fa2 Olga Brani
                                }
11710 8a217fa2 Olga Brani
                                
11711 8a217fa2 Olga Brani
                                var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages;
11712 8a217fa2 Olga Brani
                                var iPageCountHalf = Math.floor(iPageCount / 2);
11713 8a217fa2 Olga Brani
                                var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
11714 8a217fa2 Olga Brani
                                var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
11715 8a217fa2 Olga Brani
                                var sList = "";
11716 8a217fa2 Olga Brani
                                var iStartButton, iEndButton, i, iLen;
11717 8a217fa2 Olga Brani
                                var oClasses = oSettings.oClasses;
11718 8a217fa2 Olga Brani
                                var anButtons, anStatic, nPaginateList, nNode;
11719 8a217fa2 Olga Brani
                                var an = oSettings.aanFeatures.p;
11720 8a217fa2 Olga Brani
                                var fnBind = function (j) {
11721 8a217fa2 Olga Brani
                                        oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
11722 8a217fa2 Olga Brani
                                                /* Use the information in the element to jump to the required page */
11723 8a217fa2 Olga Brani
                                                oSettings.oApi._fnPageChange( oSettings, e.data.page );
11724 8a217fa2 Olga Brani
                                                fnCallbackDraw( oSettings );
11725 8a217fa2 Olga Brani
                                                e.preventDefault();
11726 8a217fa2 Olga Brani
                                        } );
11727 8a217fa2 Olga Brani
                                };
11728 8a217fa2 Olga Brani
                                
11729 8a217fa2 Olga Brani
                                /* Pages calculation */
11730 8a217fa2 Olga Brani
                                if ( oSettings._iDisplayLength === -1 )
11731 8a217fa2 Olga Brani
                                {
11732 8a217fa2 Olga Brani
                                        iStartButton = 1;
11733 8a217fa2 Olga Brani
                                        iEndButton = 1;
11734 8a217fa2 Olga Brani
                                        iCurrentPage = 1;
11735 8a217fa2 Olga Brani
                                }
11736 8a217fa2 Olga Brani
                                else if (iPages < iPageCount)
11737 8a217fa2 Olga Brani
                                {
11738 8a217fa2 Olga Brani
                                        iStartButton = 1;
11739 8a217fa2 Olga Brani
                                        iEndButton = iPages;
11740 8a217fa2 Olga Brani
                                }
11741 8a217fa2 Olga Brani
                                else if (iCurrentPage <= iPageCountHalf)
11742 8a217fa2 Olga Brani
                                {
11743 8a217fa2 Olga Brani
                                        iStartButton = 1;
11744 8a217fa2 Olga Brani
                                        iEndButton = iPageCount;
11745 8a217fa2 Olga Brani
                                }
11746 8a217fa2 Olga Brani
                                else if (iCurrentPage >= (iPages - iPageCountHalf))
11747 8a217fa2 Olga Brani
                                {
11748 8a217fa2 Olga Brani
                                        iStartButton = iPages - iPageCount + 1;
11749 8a217fa2 Olga Brani
                                        iEndButton = iPages;
11750 8a217fa2 Olga Brani
                                }
11751 8a217fa2 Olga Brani
                                else
11752 8a217fa2 Olga Brani
                                {
11753 8a217fa2 Olga Brani
                                        iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
11754 8a217fa2 Olga Brani
                                        iEndButton = iStartButton + iPageCount - 1;
11755 8a217fa2 Olga Brani
                                }
11756 8a217fa2 Olga Brani
        
11757 8a217fa2 Olga Brani
                                
11758 8a217fa2 Olga Brani
                                /* Build the dynamic list */
11759 8a217fa2 Olga Brani
                                for ( i=iStartButton ; i<=iEndButton ; i++ )
11760 8a217fa2 Olga Brani
                                {
11761 8a217fa2 Olga Brani
                                        sList += (iCurrentPage !== i) ?
11762 8a217fa2 Olga Brani
                                                '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' :
11763 8a217fa2 Olga Brani
                                                '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>';
11764 8a217fa2 Olga Brani
                                }
11765 8a217fa2 Olga Brani
                                
11766 8a217fa2 Olga Brani
                                /* Loop over each instance of the pager */
11767 8a217fa2 Olga Brani
                                for ( i=0, iLen=an.length ; i<iLen ; i++ )
11768 8a217fa2 Olga Brani
                                {
11769 8a217fa2 Olga Brani
                                        nNode = an[i];
11770 8a217fa2 Olga Brani
                                        if ( !nNode.hasChildNodes() )
11771 8a217fa2 Olga Brani
                                        {
11772 8a217fa2 Olga Brani
                                                continue;
11773 8a217fa2 Olga Brani
                                        }
11774 8a217fa2 Olga Brani
                                        
11775 8a217fa2 Olga Brani
                                        /* Build up the dynamic list first - html and listeners */
11776 8a217fa2 Olga Brani
                                        $('span:eq(0)', nNode)
11777 8a217fa2 Olga Brani
                                                .html( sList )
11778 8a217fa2 Olga Brani
                                                .children('a').each( fnBind );
11779 8a217fa2 Olga Brani
                                        
11780 8a217fa2 Olga Brani
                                        /* Update the permanent button's classes */
11781 8a217fa2 Olga Brani
                                        anButtons = nNode.getElementsByTagName('a');
11782 8a217fa2 Olga Brani
                                        anStatic = [
11783 8a217fa2 Olga Brani
                                                anButtons[0], anButtons[1], 
11784 8a217fa2 Olga Brani
                                                anButtons[anButtons.length-2], anButtons[anButtons.length-1]
11785 8a217fa2 Olga Brani
                                        ];
11786 8a217fa2 Olga Brani
        
11787 8a217fa2 Olga Brani
                                        $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
11788 8a217fa2 Olga Brani
                                        $([anStatic[0], anStatic[1]]).addClass( 
11789 8a217fa2 Olga Brani
                                                (iCurrentPage==1) ?
11790 8a217fa2 Olga Brani
                                                        oClasses.sPageButtonStaticDisabled :
11791 8a217fa2 Olga Brani
                                                        oClasses.sPageButton
11792 8a217fa2 Olga Brani
                                        );
11793 8a217fa2 Olga Brani
                                        $([anStatic[2], anStatic[3]]).addClass(
11794 8a217fa2 Olga Brani
                                                (iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?
11795 8a217fa2 Olga Brani
                                                        oClasses.sPageButtonStaticDisabled :
11796 8a217fa2 Olga Brani
                                                        oClasses.sPageButton
11797 8a217fa2 Olga Brani
                                        );
11798 8a217fa2 Olga Brani
                                }
11799 8a217fa2 Olga Brani
                        }
11800 8a217fa2 Olga Brani
                }
11801 8a217fa2 Olga Brani
        } );
11802 8a217fa2 Olga Brani
        
11803 8a217fa2 Olga Brani
        $.extend( DataTable.ext.oSort, {
11804 8a217fa2 Olga Brani
                /*
11805 8a217fa2 Olga Brani
                 * text sorting
11806 8a217fa2 Olga Brani
                 */
11807 8a217fa2 Olga Brani
                "string-pre": function ( a )
11808 8a217fa2 Olga Brani
                {
11809 8a217fa2 Olga Brani
                        if ( typeof a != 'string' ) {
11810 8a217fa2 Olga Brani
                                a = (a !== null && a.toString) ? a.toString() : '';
11811 8a217fa2 Olga Brani
                        }
11812 8a217fa2 Olga Brani
                        return a.toLowerCase();
11813 8a217fa2 Olga Brani
                },
11814 8a217fa2 Olga Brani
        
11815 8a217fa2 Olga Brani
                "string-asc": function ( x, y )
11816 8a217fa2 Olga Brani
                {
11817 8a217fa2 Olga Brani
                        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
11818 8a217fa2 Olga Brani
                },
11819 8a217fa2 Olga Brani
                
11820 8a217fa2 Olga Brani
                "string-desc": function ( x, y )
11821 8a217fa2 Olga Brani
                {
11822 8a217fa2 Olga Brani
                        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
11823 8a217fa2 Olga Brani
                },
11824 8a217fa2 Olga Brani
                
11825 8a217fa2 Olga Brani
                
11826 8a217fa2 Olga Brani
                /*
11827 8a217fa2 Olga Brani
                 * html sorting (ignore html tags)
11828 8a217fa2 Olga Brani
                 */
11829 8a217fa2 Olga Brani
                "html-pre": function ( a )
11830 8a217fa2 Olga Brani
                {
11831 8a217fa2 Olga Brani
                        return a.replace( /<.*?>/g, "" ).toLowerCase();
11832 8a217fa2 Olga Brani
                },
11833 8a217fa2 Olga Brani
                
11834 8a217fa2 Olga Brani
                "html-asc": function ( x, y )
11835 8a217fa2 Olga Brani
                {
11836 8a217fa2 Olga Brani
                        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
11837 8a217fa2 Olga Brani
                },
11838 8a217fa2 Olga Brani
                
11839 8a217fa2 Olga Brani
                "html-desc": function ( x, y )
11840 8a217fa2 Olga Brani
                {
11841 8a217fa2 Olga Brani
                        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
11842 8a217fa2 Olga Brani
                },
11843 8a217fa2 Olga Brani
                
11844 8a217fa2 Olga Brani
                
11845 8a217fa2 Olga Brani
                /*
11846 8a217fa2 Olga Brani
                 * date sorting
11847 8a217fa2 Olga Brani
                 */
11848 8a217fa2 Olga Brani
                "date-pre": function ( a )
11849 8a217fa2 Olga Brani
                {
11850 8a217fa2 Olga Brani
                        var x = Date.parse( a );
11851 8a217fa2 Olga Brani
                        
11852 8a217fa2 Olga Brani
                        if ( isNaN(x) || x==="" )
11853 8a217fa2 Olga Brani
                        {
11854 8a217fa2 Olga Brani
                                x = Date.parse( "01/01/1970 00:00:00" );
11855 8a217fa2 Olga Brani
                        }
11856 8a217fa2 Olga Brani
                        return x;
11857 8a217fa2 Olga Brani
                },
11858 8a217fa2 Olga Brani
        
11859 8a217fa2 Olga Brani
                "date-asc": function ( x, y )
11860 8a217fa2 Olga Brani
                {
11861 8a217fa2 Olga Brani
                        return x - y;
11862 8a217fa2 Olga Brani
                },
11863 8a217fa2 Olga Brani
                
11864 8a217fa2 Olga Brani
                "date-desc": function ( x, y )
11865 8a217fa2 Olga Brani
                {
11866 8a217fa2 Olga Brani
                        return y - x;
11867 8a217fa2 Olga Brani
                },
11868 8a217fa2 Olga Brani
                
11869 8a217fa2 Olga Brani
                
11870 8a217fa2 Olga Brani
                /*
11871 8a217fa2 Olga Brani
                 * numerical sorting
11872 8a217fa2 Olga Brani
                 */
11873 8a217fa2 Olga Brani
                "numeric-pre": function ( a )
11874 8a217fa2 Olga Brani
                {
11875 8a217fa2 Olga Brani
                        return (a=="-" || a==="") ? 0 : a*1;
11876 8a217fa2 Olga Brani
                },
11877 8a217fa2 Olga Brani
        
11878 8a217fa2 Olga Brani
                "numeric-asc": function ( x, y )
11879 8a217fa2 Olga Brani
                {
11880 8a217fa2 Olga Brani
                        return x - y;
11881 8a217fa2 Olga Brani
                },
11882 8a217fa2 Olga Brani
                
11883 8a217fa2 Olga Brani
                "numeric-desc": function ( x, y )
11884 8a217fa2 Olga Brani
                {
11885 8a217fa2 Olga Brani
                        return y - x;
11886 8a217fa2 Olga Brani
                }
11887 8a217fa2 Olga Brani
        } );
11888 8a217fa2 Olga Brani
        
11889 8a217fa2 Olga Brani
        
11890 8a217fa2 Olga Brani
        $.extend( DataTable.ext.aTypes, [
11891 8a217fa2 Olga Brani
                /*
11892 8a217fa2 Olga Brani
                 * Function: -
11893 8a217fa2 Olga Brani
                 * Purpose:  Check to see if a string is numeric
11894 8a217fa2 Olga Brani
                 * Returns:  string:'numeric' or null
11895 8a217fa2 Olga Brani
                 * Inputs:   mixed:sText - string to check
11896 8a217fa2 Olga Brani
                 */
11897 8a217fa2 Olga Brani
                function ( sData )
11898 8a217fa2 Olga Brani
                {
11899 8a217fa2 Olga Brani
                        /* Allow zero length strings as a number */
11900 8a217fa2 Olga Brani
                        if ( typeof sData === 'number' )
11901 8a217fa2 Olga Brani
                        {
11902 8a217fa2 Olga Brani
                                return 'numeric';
11903 8a217fa2 Olga Brani
                        }
11904 8a217fa2 Olga Brani
                        else if ( typeof sData !== 'string' )
11905 8a217fa2 Olga Brani
                        {
11906 8a217fa2 Olga Brani
                                return null;
11907 8a217fa2 Olga Brani
                        }
11908 8a217fa2 Olga Brani
                        
11909 8a217fa2 Olga Brani
                        var sValidFirstChars = "0123456789-";
11910 8a217fa2 Olga Brani
                        var sValidChars = "0123456789.";
11911 8a217fa2 Olga Brani
                        var Char;
11912 8a217fa2 Olga Brani
                        var bDecimal = false;
11913 8a217fa2 Olga Brani
                        
11914 8a217fa2 Olga Brani
                        /* Check for a valid first char (no period and allow negatives) */
11915 8a217fa2 Olga Brani
                        Char = sData.charAt(0); 
11916 8a217fa2 Olga Brani
                        if (sValidFirstChars.indexOf(Char) == -1) 
11917 8a217fa2 Olga Brani
                        {
11918 8a217fa2 Olga Brani
                                return null;
11919 8a217fa2 Olga Brani
                        }
11920 8a217fa2 Olga Brani
                        
11921 8a217fa2 Olga Brani
                        /* Check all the other characters are valid */
11922 8a217fa2 Olga Brani
                        for ( var i=1 ; i<sData.length ; i++ ) 
11923 8a217fa2 Olga Brani
                        {
11924 8a217fa2 Olga Brani
                                Char = sData.charAt(i); 
11925 8a217fa2 Olga Brani
                                if (sValidChars.indexOf(Char) == -1) 
11926 8a217fa2 Olga Brani
                                {
11927 8a217fa2 Olga Brani
                                        return null;
11928 8a217fa2 Olga Brani
                                }
11929 8a217fa2 Olga Brani
                                
11930 8a217fa2 Olga Brani
                                /* Only allowed one decimal place... */
11931 8a217fa2 Olga Brani
                                if ( Char == "." )
11932 8a217fa2 Olga Brani
                                {
11933 8a217fa2 Olga Brani
                                        if ( bDecimal )
11934 8a217fa2 Olga Brani
                                        {
11935 8a217fa2 Olga Brani
                                                return null;
11936 8a217fa2 Olga Brani
                                        }
11937 8a217fa2 Olga Brani
                                        bDecimal = true;
11938 8a217fa2 Olga Brani
                                }
11939 8a217fa2 Olga Brani
                        }
11940 8a217fa2 Olga Brani
                        
11941 8a217fa2 Olga Brani
                        return 'numeric';
11942 8a217fa2 Olga Brani
                },
11943 8a217fa2 Olga Brani
                
11944 8a217fa2 Olga Brani
                /*
11945 8a217fa2 Olga Brani
                 * Function: -
11946 8a217fa2 Olga Brani
                 * Purpose:  Check to see if a string is actually a formatted date
11947 8a217fa2 Olga Brani
                 * Returns:  string:'date' or null
11948 8a217fa2 Olga Brani
                 * Inputs:   string:sText - string to check
11949 8a217fa2 Olga Brani
                 */
11950 8a217fa2 Olga Brani
                function ( sData )
11951 8a217fa2 Olga Brani
                {
11952 8a217fa2 Olga Brani
                        var iParse = Date.parse(sData);
11953 8a217fa2 Olga Brani
                        if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) )
11954 8a217fa2 Olga Brani
                        {
11955 8a217fa2 Olga Brani
                                return 'date';
11956 8a217fa2 Olga Brani
                        }
11957 8a217fa2 Olga Brani
                        return null;
11958 8a217fa2 Olga Brani
                },
11959 8a217fa2 Olga Brani
                
11960 8a217fa2 Olga Brani
                /*
11961 8a217fa2 Olga Brani
                 * Function: -
11962 8a217fa2 Olga Brani
                 * Purpose:  Check to see if a string should be treated as an HTML string
11963 8a217fa2 Olga Brani
                 * Returns:  string:'html' or null
11964 8a217fa2 Olga Brani
                 * Inputs:   string:sText - string to check
11965 8a217fa2 Olga Brani
                 */
11966 8a217fa2 Olga Brani
                function ( sData )
11967 8a217fa2 Olga Brani
                {
11968 8a217fa2 Olga Brani
                        if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
11969 8a217fa2 Olga Brani
                        {
11970 8a217fa2 Olga Brani
                                return 'html';
11971 8a217fa2 Olga Brani
                        }
11972 8a217fa2 Olga Brani
                        return null;
11973 8a217fa2 Olga Brani
                }
11974 8a217fa2 Olga Brani
        ] );
11975 8a217fa2 Olga Brani
        
11976 8a217fa2 Olga Brani
11977 8a217fa2 Olga Brani
        // jQuery aliases
11978 8a217fa2 Olga Brani
        $.fn.DataTable = DataTable;
11979 8a217fa2 Olga Brani
        $.fn.dataTable = DataTable;
11980 8a217fa2 Olga Brani
        $.fn.dataTableSettings = DataTable.settings;
11981 8a217fa2 Olga Brani
        $.fn.dataTableExt = DataTable.ext;
11982 8a217fa2 Olga Brani
11983 8a217fa2 Olga Brani
11984 8a217fa2 Olga Brani
        // Information about events fired by DataTables - for documentation.
11985 8a217fa2 Olga Brani
        /**
11986 8a217fa2 Olga Brani
         * Draw event, fired whenever the table is redrawn on the page, at the same point as
11987 8a217fa2 Olga Brani
         * fnDrawCallback. This may be useful for binding events or performing calculations when
11988 8a217fa2 Olga Brani
         * the table is altered at all.
11989 8a217fa2 Olga Brani
         *  @name DataTable#draw
11990 8a217fa2 Olga Brani
         *  @event
11991 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
11992 8a217fa2 Olga Brani
         *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
11993 8a217fa2 Olga Brani
         */
11994 8a217fa2 Olga Brani
11995 8a217fa2 Olga Brani
        /**
11996 8a217fa2 Olga Brani
         * Filter event, fired when the filtering applied to the table (using the build in global
11997 8a217fa2 Olga Brani
         * global filter, or column filters) is altered.
11998 8a217fa2 Olga Brani
         *  @name DataTable#filter
11999 8a217fa2 Olga Brani
         *  @event
12000 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12001 8a217fa2 Olga Brani
         *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12002 8a217fa2 Olga Brani
         */
12003 8a217fa2 Olga Brani
12004 8a217fa2 Olga Brani
        /**
12005 8a217fa2 Olga Brani
         * Page change event, fired when the paging of the table is altered.
12006 8a217fa2 Olga Brani
         *  @name DataTable#page
12007 8a217fa2 Olga Brani
         *  @event
12008 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12009 8a217fa2 Olga Brani
         *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12010 8a217fa2 Olga Brani
         */
12011 8a217fa2 Olga Brani
12012 8a217fa2 Olga Brani
        /**
12013 8a217fa2 Olga Brani
         * Sort event, fired when the sorting applied to the table is altered.
12014 8a217fa2 Olga Brani
         *  @name DataTable#sort
12015 8a217fa2 Olga Brani
         *  @event
12016 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12017 8a217fa2 Olga Brani
         *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12018 8a217fa2 Olga Brani
         */
12019 8a217fa2 Olga Brani
12020 8a217fa2 Olga Brani
        /**
12021 8a217fa2 Olga Brani
         * DataTables initialisation complete event, fired when the table is fully drawn,
12022 8a217fa2 Olga Brani
         * including Ajax data loaded, if Ajax data is required.
12023 8a217fa2 Olga Brani
         *  @name DataTable#init
12024 8a217fa2 Olga Brani
         *  @event
12025 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12026 8a217fa2 Olga Brani
         *  @param {object} oSettings DataTables settings object
12027 8a217fa2 Olga Brani
         *  @param {object} json The JSON object request from the server - only
12028 8a217fa2 Olga Brani
         *    present if client-side Ajax sourced data is used</li></ol>
12029 8a217fa2 Olga Brani
         */
12030 8a217fa2 Olga Brani
12031 8a217fa2 Olga Brani
        /**
12032 8a217fa2 Olga Brani
         * State save event, fired when the table has changed state a new state save is required.
12033 8a217fa2 Olga Brani
         * This method allows modification of the state saving object prior to actually doing the
12034 8a217fa2 Olga Brani
         * save, including addition or other state properties (for plug-ins) or modification
12035 8a217fa2 Olga Brani
         * of a DataTables core property.
12036 8a217fa2 Olga Brani
         *  @name DataTable#stateSaveParams
12037 8a217fa2 Olga Brani
         *  @event
12038 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12039 8a217fa2 Olga Brani
         *  @param {object} oSettings DataTables settings object
12040 8a217fa2 Olga Brani
         *  @param {object} json The state information to be saved
12041 8a217fa2 Olga Brani
         */
12042 8a217fa2 Olga Brani
12043 8a217fa2 Olga Brani
        /**
12044 8a217fa2 Olga Brani
         * State load event, fired when the table is loading state from the stored data, but
12045 8a217fa2 Olga Brani
         * prior to the settings object being modified by the saved state - allowing modification
12046 8a217fa2 Olga Brani
         * of the saved state is required or loading of state for a plug-in.
12047 8a217fa2 Olga Brani
         *  @name DataTable#stateLoadParams
12048 8a217fa2 Olga Brani
         *  @event
12049 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12050 8a217fa2 Olga Brani
         *  @param {object} oSettings DataTables settings object
12051 8a217fa2 Olga Brani
         *  @param {object} json The saved state information
12052 8a217fa2 Olga Brani
         */
12053 8a217fa2 Olga Brani
12054 8a217fa2 Olga Brani
        /**
12055 8a217fa2 Olga Brani
         * State loaded event, fired when state has been loaded from stored data and the settings
12056 8a217fa2 Olga Brani
         * object has been modified by the loaded data.
12057 8a217fa2 Olga Brani
         *  @name DataTable#stateLoaded
12058 8a217fa2 Olga Brani
         *  @event
12059 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12060 8a217fa2 Olga Brani
         *  @param {object} oSettings DataTables settings object
12061 8a217fa2 Olga Brani
         *  @param {object} json The saved state information
12062 8a217fa2 Olga Brani
         */
12063 8a217fa2 Olga Brani
12064 8a217fa2 Olga Brani
        /**
12065 8a217fa2 Olga Brani
         * Processing event, fired when DataTables is doing some kind of processing (be it,
12066 8a217fa2 Olga Brani
         * sort, filter or anything else). Can be used to indicate to the end user that
12067 8a217fa2 Olga Brani
         * there is something happening, or that something has finished.
12068 8a217fa2 Olga Brani
         *  @name DataTable#processing
12069 8a217fa2 Olga Brani
         *  @event
12070 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12071 8a217fa2 Olga Brani
         *  @param {object} oSettings DataTables settings object
12072 8a217fa2 Olga Brani
         *  @param {boolean} bShow Flag for if DataTables is doing processing or not
12073 8a217fa2 Olga Brani
         */
12074 8a217fa2 Olga Brani
12075 8a217fa2 Olga Brani
        /**
12076 8a217fa2 Olga Brani
         * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to 
12077 8a217fa2 Olga Brani
         * made to the server for new data (note that this trigger is called in fnServerData,
12078 8a217fa2 Olga Brani
         * if you override fnServerData and which to use this event, you need to trigger it in
12079 8a217fa2 Olga Brani
         * you success function).
12080 8a217fa2 Olga Brani
         *  @name DataTable#xhr
12081 8a217fa2 Olga Brani
         *  @event
12082 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12083 8a217fa2 Olga Brani
         *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12084 8a217fa2 Olga Brani
         *  @param {object} json JSON returned from the server
12085 8a217fa2 Olga Brani
         */
12086 8a217fa2 Olga Brani
12087 8a217fa2 Olga Brani
        /**
12088 8a217fa2 Olga Brani
         * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing
12089 8a217fa2 Olga Brani
         * the bDestroy:true parameter in the initialisation object. This can be used to remove
12090 8a217fa2 Olga Brani
         * bound events, added DOM nodes, etc.
12091 8a217fa2 Olga Brani
         *  @name DataTable#destroy
12092 8a217fa2 Olga Brani
         *  @event
12093 8a217fa2 Olga Brani
         *  @param {event} e jQuery event object
12094 8a217fa2 Olga Brani
         *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12095 8a217fa2 Olga Brani
         */
12096 8a217fa2 Olga Brani
}));
12097 8a217fa2 Olga Brani
12098 8a217fa2 Olga Brani
}(window, document));