AutorÃa | Ultima modificación | Ver Log |
{"version":3,"sources":["../src/jquery.dataTables.js"],"names":["window","document","undefined","factory","define","amd","jQuery","fn","dataTable","$","DataTable","oInit","_fnAddColumn","oSettings","nTh","oDefaults","defaults","columns","iCol","aoColumns","length","oCol","extend","models","oColumn","oClasses","sSortable","sSortJUI","createElement","sTitle","innerHTML","aDataSort","mData","push","aoPreSearchCols","oSearch","oPre","bRegex","bSmart","bCaseInsensitive","_fnColumnOptions","oOptions","mDataProp","sType","_bAutoType","_fnMap","iDataSort","mRender","_fnGetObjectDataFn","fnGetData","oData","sSpecific","innerData","fnSetData","_fnSetObjectDataFn","oFeatures","bSort","bSortable","inArray","asSorting","sSortingClass","sSortableNone","sSortingClassJUI","sSortableAsc","sSortJUIAscAllowed","sSortableDesc","sSortJUIDescAllowed","_fnAdjustColumnSizing","bAutoWidth","_fnCalculateColumnWidths","i","iLen","style","width","sWidth","_fnVisibleToColumnIndex","iMatch","aiVis","_fnGetColumns","_fnColumnIndexToVisibl
e","iPos","_fnVisbleColumns","sParam","a","map","val","_fnDetectType","sData","aTypes","ext","_fnReOrderIndex","sColumns","aColumns","split","aiReturn","j","sName","_fnColumnOrdering","sNames","slice","_fnApplyColumnDefs","aoColDefs","aoCols","jLen","k","kLen","aTargets","isArray","_fnLog","hasClass","_fnAddData","aDataSupplied","aDataIn","iRow","aoData","oRow","_aData","sThisType","fnRender","bUseRendered","_fnSetCellData","_fnRender","_fnGetCellData","sVarType","aiDisplayMaster","bDeferRender","_fnCreateTr","_fnGatherData","jInner","nTds","nTrs","nTd","nTr","iThisIndex","iRows","iColumn","iColumns","sNodeName","bDeferLoading","sAjaxSource","nTBody","firstChild","nodeName","toUpperCase","_DT_RowIndex","trim","nextSibling","_fnGetTrNodes","bAutoType","bRender","bClass","sClass","bVisible","nCell","sRendered","sValType","className","_anHidden","parentNode","removeChild","fnCreatedCell","call","oInstance","aoRowCreatedCallback","_fnCallbackFire","_fnNodeToDataIndex","n","_fnNodeToColumnIndex","anCells","_fnGet
TdNodes","_fnGetRowData","aiColumns","out","iDrawError","iDraw","sDefaultContent","__reArray","mSource","data","type","extra","indexOf","fetchData","src","arrayNotation","innerSrc","match","replace","splice","join","substring","setData","b","o","_fnGetDataMaster","aData","_fnClearTable","aiDisplay","_fnCalculateEnd","_fnDeleteIndex","iTarget","iTargetIndex","DT_RowId","id","DT_RowClass","sCellType","appendChild","_fnBuildHead","iThs","nTHead","setAttribute","iTabIndex","sTableId","addClass","html","_fnDetectHeader","aoHeader","children","attr","bJUI","nDiv","sSortJUIWrapper","contents","appendTo","nSpan","sSortIcon","_fnSortAttachListener","sFooterTH","nTFoot","_fnGetUniqueThs","aoFooter","nTf","_fnDrawHead","aoSource","bIncludeHidden","nLocalTr","aoLocal","aApplied","iRowspan","iColspan","cell","rowSpan","colSpan","_fnDraw","aPreDraw","_fnProcessingDisplay","anRows","iRowCount","iStripes","asStripeClasses","iOpenRows","aoOpenRows","bDrawing","iInitDisplayStart","bServerSide","_iDisplayStart","fnRecordsDispl
ay","bDestroying","_fnAjaxUpdate","iStart","iEnd","_iDisplayEnd","nRow","sStripe","_sRowStripe","removeClass","nParent","oLang","oLanguage","sZero","sZeroRecords","sLoadingRecords","sEmptyTable","fnRecordsTotal","sRowEmpty","_fnInfoMacros","fnDisplayEnd","nAddFrag","createDocumentFragment","nRemoveFrag","nBodyPar","oScroll","bInfinite","_bInitComplete","bSorted","bFiltered","_fnInitComplete","_fnReDraw","_fnSort","oPreviousSearch","bFilter","_fnFilterComplete","_fnAddOptionsHtml","nHolding","nTable","insertBefore","nTableWrapper","sWrapper","nTableReinsertBefore","nInsertNode","aDom","sDom","nTmp","iPushFeature","cOption","nNewNode","cNext","sAttr","sJUIHeader","sJUIFooter","aSplit","substr","charAt","bPaginate","bLengthChange","_fnFeatureHtmlLength","_fnFeatureHtmlFilter","bProcessing","_fnFeatureHtmlProcessing","_fnFeatureHtmlTable","bInfo","_fnFeatureHtmlInfo","_fnFeatureHtmlPaginate","aoFeatures","cFeature","fnInit","aanFeatures","replaceChild","aLayout","nThead","l","iColShifted","bUnique","fnShiftCol",
"getAttribute","nHeader","aReturn","unique","bSortCellsTop","bAjaxDataGet","_fnAjaxParameters","_fnServerParams","fnServerData","json","_fnAjaxUpdateDraw","aaSort","_iDisplayLength","sSearch","bSearchable","iCounter","aaSortingFixed","concat","aaSorting","sEcho","_iRecordsTotal","parseInt","iTotalRecords","_iRecordsDisplay","iTotalDisplayRecords","sOrdering","bReOrder","aiIndex","sAjaxDataProp","aDataSorted","sSearchStr","nFilter","sFilter","f","jqFilter","_DT_Input","bind","value","parents","e","keyCode","oInput","iForce","oPrevSearch","aoPrevSearch","fnSaveFilter","oFilter","_fnFilter","_fnFilterColumn","_fnFilterCustom","trigger","_fnBuildSearchArray","afnFilters","afnFiltering","aiFilterColumns","iCorrector","iDisIndex","bTest","sInput","iIndexCorrector","rpSearch","_fnFilterCreateSearch","_fnDataToSearch","test","asDataSearch","iMaster","_fnBuildSearchRow","text","asSearch","sRegExpString","_fnEscapeRegex","RegExp","ofnSearch","sVal","reReplace","nInfo","sInfo","aoDrawCallback","_fnUpdateInfo","iMax","i
Total","sOut","sInfoEmpty","sInfoFiltered","sInfoPostFix","fnInfoCallback","str","sStart","fnFormatNumber","sEnd","sTotal","sMax","_fnInitialise","iAjaxStart","bInitialised","setTimeout","_fnStringToCss","_fnLanguageCompat","sStdMenu","aLengthMenu","nLength","sLength","sLengthMenu","iVal","nPaginate","sPaging","sPaginationType","oPagination","p","fnUpdate","_fnPageChange","mAction","iOldStart","iPages","nProcessing","r","sProcessing","bShow","an","visibility","sX","sY","nScroller","nScrollHead","nScrollHeadInner","nScrollBody","nScrollFoot","nScrollFootInner","nScrollHeadTable","cloneNode","nScrollFootTable","getElementsByTagName","nTfoot","sScrollWrapper","sScrollHead","sScrollHeadInner","sScrollBody","sScrollFoot","sScrollFootInner","bAutoCss","overflow","position","border","sXInner","removeAttribute","marginLeft","nCaption","_captionSide","scroll","scrollLeft","height","_fnScrollDraw","scrollTop","iLoadGap","anHeadToSize","anHeadSizers","anFootSizers","anFootToSize","oStyle","iVis","nTheadSize","nTfootSiz
e","aAppliedFooter","iSanityWidth","ie67","oBrowser","bScrollOversize","zeroOut","nSizer","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","remove","clone","childNodes","nThs","_fnApplyToChildren","bCollapse","offsetHeight","outerWidth","css","iBarWidth","nToSize","iCorrection","scrollHeight","iExtra","offsetWidth","iOuterWidth","bScrolling","clientHeight","paddingRight","an1","an2","index","nNode1","nNode2","nodeType","_fnConvertToWidth","body","iWidth","iTableWidth","iUserInputs","iTmpWidth","iVisibleColumns","iColums","oHeaders","widthAttr","nWrapper","sWidthOrig","nCalcTmp","nTheadClone","nBody","jqColSizing","_fnGetWidestNode","sContentPadding","_fnScrollingWidthAdjust","oNodes","cssWidth","iMaxIndex","_fnGetMaxLenString","s","c","charCodeAt","_fnScrollBarWidth","inner","padding","outer","top","left","w1","w2","clientWidth","bApplyClasses","sDataType","aiOrig","oSort","oAria","iVisColumn","sSortDataType","afnSortData","iSortLen","fnSortFormat","_aSortData","sort","lLen","iTest","_fnSort
ingClasses","nextSort","sSortAscending","sSortDescending","nNode","iDataIndex","fnCallback","_fnBindAction","fnInnerSorting","iNextSort","shiftKey","bFound","iFound","sSortAsc","sSortDesc","jqSpan","sSortJUIAsc","sSortJUIDesc","sSpanClass","sSortColumn","bSortClasses","iClass","iTargetCol","asClasses","reClass","sTmpClass","sCurrentClass","sNewClass","_fnSaveState","bStateSave","oState","Date","getTime","abVisCols","fnStateSave","_fnLoadState","fnStateLoad","abStateLoad","oLoadedState","iLength","saved_aaSorting","aoSearchCols","saved_aoColumns","_fnCreateCookie","sValue","iSecs","sBaseName","date","setTime","aParts","location","pathname","sNameFile","pop","toLowerCase","sFullCookie","parseJSON","eval","toGMTString","encodeURIComponent","aCookies","cookie","iNewCookieLen","aOldCookies","aSplitCookie","decodeURIComponent","iCreate","time","old","name","_fnReadCookie","sNameEQ","sCookieContents","_fnSettingsFromNode","settings","aNodes","iIndividualRow","anReturn","anTds","iLevel","sMesg","sAlert","sErrMode","
alert","Error","console","log","oRet","oSrc","sMappedName","_fnExtend","oOut","oExtender","prop","hasOwnProperty","blur","which","_fnCallbackReg","sStore","sTrigger","aArgs","aoStore","aRet","apply","_fnJsonString","JSON","stringify","sProp","mValue","bArr","_fnBrowserDetect","sSelector","oOpts","tr","iApiIndex","page","order","filter","jqA","jqTRs","jqDescendants","find","makeArray","_","aOut","aTrs","fnAddData","bRedraw","fnAdjustColumnSizing","fnDraw","oApi","fnClearTable","fnClose","nTrParent","fnDeleteRow","mTarget","fnCallBack","iAODataIndex","iDisplayIndex","fnDestroy","bRemove","nOrig","fnSetColumnVis","andSelf","unbind","parent","each","jqWrapper","kids","append","sDestroyWidth","asDestroyStripes","bComplete","fnFilter","bShowGlobal","activeElement","mRow","sNode","fnGetNodes","fnGetPosition","iColumnIndex","fnIsOpen","fnOpen","mHtml","nTableRows","nNewRow","nNewCell","insertAfter","fnPageChange","bAppend","iBefore","iInsert","fnSettings","fnSort","fnSortListener","bAction","sDisplay","isPlainObject
","fnVersionCheck","_fnExternApiFunc","sFunc","Array","prototype","arguments","_that","sId","bInitHandedOff","bUsePassedData","bRetrieve","bDestroy","_oExternConfig","iNextUnique","fnDrawCallback","fnServerParams","fnStateSaveParams","fnStateLoadParams","fnStateLoaded","fnRowCallback","fnCreatedRow","fnHeaderCallback","fnFooterCallback","fnInitComplete","fnPreDrawCallback","bJQueryUI","oJUIClasses","oStdClasses","sTable","iDisplayStart","iDeferLoading","tmp","aaData","sUrl","getJSON","sStripeOdd","sStripeEven","bStripeRemove","anThs","aoColumnsInit","aoColumnDefs","oDef","captions","thead","tbody","tfoot","sVersion","fnZPad","Zpad","count","aThis","aThat","sThis","sThat","fnIsDataTable","fnTables","is","version","iIn","sInfoThousands","jqXHR","ajax","sError","sServerMethod","xhr","error","sCookiePrefix","sInstance","iCookieDuration","fnCookieCallback","Math","min","nPaging","fnCallbackDraw","oPaginate","fnClickHandler","action","sAppend","sPagePrevDisabled","sPrevious","sPageNextDisabled","sNext","sPageJUIPr
ev","sPageJUINext","els","nPrevious","nNext","sPagePrevEnabled","sPageNextEnabled","sPageButton","sPageFirst","sFirst","sPagePrevious","sPageNext","sPageLast","sLast","nFirst","nPrev","nLast","iPageCount","iFullNumbersShowPages","iPageCountHalf","floor","ceil","iCurrentPage","sList","iStartButton","iEndButton","anButtons","anStatic","fnBind","preventDefault","sPageButtonActive","hasChildNodes","sPageButtonStaticDisabled","toString","x","y","parse","isNaN","Char","bDecimal","iParse","dataTableSettings","dataTableExt"],"mappings":"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","sourcesContent":["/*eslint-disable*/\n/**\n * @summary DataTables\n * @description Paginate, search and sort HTML tables\n * @version 1.9.4\n * @file jquery.dataTables.js\n * @author Allan Jardine (www.sprymedia.co.uk)\n * @contact www.sprymedia.co.uk/contact\n *\n * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.\n *\n * This source file is free software, under either the GPL v2 license or a\n * BSD style license, available at:\n * http://datatables.net/license_gpl2\n * http://datatables
.net/license_bsd\n * \n * This source file is distributed in the hope that it will be useful, but \n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY \n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n * \n * For details please refer to: http://www.datatables.net\n */\n\n/*jslint evil: true, undef: true, browser: true */\n/*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,_fnFea
tureHtmlProcessing,_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*/\n\n(/** @lends <global> */function( window, document, undefined ) {\n\n(function( factory ) {\n\t\"use strict\";\n\n\t// Define as an AMD module if possible\n\tif ( typeof define === 'function' && define.amd )\n\t{\n\t\tdefine( ['j
query'], factory );\n\t}\n\t/* Define using browser globals otherwise\n\t * Prevent multiple instantiations if the script is loaded twice\n\t */\n\telse if ( jQuery && !jQuery.fn.dataTable )\n\t{\n\t\tfactory( jQuery );\n\t}\n}\n(/** @lends <global> */function( $ ) {\n\t\"use strict\";\n\t/** \n\t * DataTables is a plug-in for the jQuery Javascript library. It is a \n\t * highly flexible tool, based upon the foundations of progressive \n\t * enhancement, which will add advanced interaction controls to any \n\t * HTML table. For a full list of features please refer to\n\t * <a href=\"http://datatables.net\">DataTables.net</a>.\n\t *\n\t * Note that the <i>DataTable</i> object is not a global variable but is\n\t * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which \n\t * it may be accessed.\n\t *\n\t * @class\n\t * @param {object} [oInit={}] Configuration object for DataTables. Options\n\t * are defined by {@link DataTable.defaults}\n\t * @requires jQuery 1.3+\n\t * \n\t
* @example\n\t * // Basic initialisation\n\t * $(document).ready( function {\n\t * $('#example').dataTable();\n\t * } );\n\t * \n\t * @example\n\t * // Initialisation with configuration options - in this case, disable\n\t * // pagination and sorting.\n\t * $(document).ready( function {\n\t * $('#example').dataTable( {\n\t * \"bPaginate\": false,\n\t * \"bSort\": false \n\t * } );\n\t * } );\n\t */\n\tvar DataTable = function( oInit )\n\t{\n\t\t\n\t\t\n\t\t/**\n\t\t * Add a column to the list used for the table with default values\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {node} nTh The th element for this column\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAddColumn( oSettings, nTh )\n\t\t{\n\t\t\tvar oDefaults = DataTable.defaults.columns;\n\t\t\tvar iCol = oSettings.aoColumns.length;\n\t\t\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\t\t\"sSortingClass\": oSettings.oClasses.sSor
table,\n\t\t\t\t\"sSortingClassJUI\": oSettings.oClasses.sSortJUI,\n\t\t\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\t\t\"sTitle\": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',\n\t\t\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\t\t\"mData\": oDefaults.mData ? oDefaults.oDefaults : iCol\n\t\t\t} );\n\t\t\toSettings.aoColumns.push( oCol );\n\t\t\t\n\t\t\t/* Add a column specific filter */\n\t\t\tif ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )\n\t\t\t{\n\t\t\t\toSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tvar oPre = oSettings.aoPreSearchCols[ iCol ];\n\t\t\t\t\n\t\t\t\t/* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */\n\t\t\t\tif ( oPre.bRegex === undefined )\n\t\t\t\t{\n\t\t\t\t\toPre.bRegex = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( oPre.bSmart === undefined )\n\t\t\t\t{\n\t\t\t\t\
toPre.bSmart = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( oPre.bCaseInsensitive === undefined )\n\t\t\t\t{\n\t\t\t\t\toPre.bCaseInsensitive = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Use the column options function to initialise classes etc */\n\t\t\t_fnColumnOptions( oSettings, iCol, null );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Apply options for a column\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iCol column index to consider\n\t\t * @param {object} oOptions object with sType, bVisible and bSearchable etc\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnColumnOptions( oSettings, iCol, oOptions )\n\t\t{\n\t\t\tvar oCol = oSettings.aoColumns[ iCol ];\n\t\t\t\n\t\t\t/* User specified column options */\n\t\t\tif ( oOptions !== undefined && oOptions !== null )\n\t\t\t{\n\t\t\t\t/* Backwards compatibility for mDataProp */\n\t\t\t\tif ( oOptions.mDataProp && !oOptions.mData )\n\t\t\t\t{\n\t\t\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t\t\t}\n\t\t\n\t\t\t\tif
( oOptions.sType !== undefined )\n\t\t\t\t{\n\t\t\t\t\toCol.sType = oOptions.sType;\n\t\t\t\t\toCol._bAutoType = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$.extend( oCol, oOptions );\n\t\t\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\t\t\n\t\t\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t\t\t * priority if defined\n\t\t\t\t */\n\t\t\t\tif ( oOptions.iDataSort !== undefined )\n\t\t\t\t{\n\t\t\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t\t\t}\n\t\t\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t\t\t}\n\t\t\n\t\t\t/* Cache the data get and set functions for speed */\n\t\t\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\t\t\tvar mData = _fnGetObjectDataFn( oCol.mData );\n\t\t\n\t\t\toCol.fnGetData = function (oData, sSpecific) {\n\t\t\t\tvar innerData = mData( oData, sSpecific );\n\t\t\n\t\t\t\tif ( oCol.mRender && (sSpecific && sSpecific !== '') )\n\t\t\t\t{\n\t\t\t\t\treturn mRender( innerData, sSpecific, oData );\n\t\t\t\t}\n
\t\t\t\treturn innerData;\n\t\t\t};\n\t\t\toCol.fnSetData = _fnSetObjectDataFn( oCol.mData );\n\t\t\t\n\t\t\t/* Feature sorting overrides column specific when off */\n\t\t\tif ( !oSettings.oFeatures.bSort )\n\t\t\t{\n\t\t\t\toCol.bSortable = false;\n\t\t\t}\n\t\t\t\n\t\t\t/* Check that the class assignment is correct for sorting */\n\t\t\tif ( !oCol.bSortable ||\n\t\t\t\t ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )\n\t\t\t{\n\t\t\t\toCol.sSortingClass = oSettings.oClasses.sSortableNone;\n\t\t\t\toCol.sSortingClassJUI = \"\";\n\t\t\t}\n\t\t\telse if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )\n\t\t\t{\n\t\t\t\toCol.sSortingClass = oSettings.oClasses.sSortable;\n\t\t\t\toCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;\n\t\t\t}\n\t\t\telse if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )\n\t\t\t{\n\t\t\t\toCol.sSortingClass = oSettings.oClasses.sSortableAsc;\n\t\t\t\toCol.sSortingClass
JUI = oSettings.oClasses.sSortJUIAscAllowed;\n\t\t\t}\n\t\t\telse if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )\n\t\t\t{\n\t\t\t\toCol.sSortingClass = oSettings.oClasses.sSortableDesc;\n\t\t\t\toCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Adjust the table column widths for new data. Note: you would probably want to \n\t\t * do a redraw after calling this function!\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAdjustColumnSizing ( oSettings )\n\t\t{\n\t\t\t/* Not interested in doing column width calculation if auto-width is disabled */\n\t\t\tif ( oSettings.oFeatures.bAutoWidth === false )\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t_fnCalculateColumnWidths( oSettings );\n\t\t\tfor ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toSettings.aoColumns[i].nTh.style.width = oSettings.aoColumn
s[i].sWidth;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Covert the index of a visible column to the index in the data array (take account\n\t\t * of hidden columns)\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iMatch Visible column index to lookup\n\t\t * @returns {int} i the data index\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n\t\t{\n\t\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\t\n\t\t\treturn typeof aiVis[iMatch] === 'number' ?\n\t\t\t\taiVis[iMatch] :\n\t\t\t\tnull;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Covert the index of an index in the data array and convert it to the visible\n\t\t * column index (take account of hidden columns)\n\t\t * @param {int} iMatch Column index to lookup\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {int} i the data index\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnColumnIndexToVisible( oSettings, iMatch )\n\t
\t{\n\t\t\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\t\t\tvar iPos = $.inArray( iMatch, aiVis );\n\t\t\n\t\t\treturn iPos !== -1 ? iPos : null;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the number of visible columns\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {int} i the number of visible columns\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnVisbleColumns( oSettings )\n\t\t{\n\t\t\treturn _fnGetColumns( oSettings, 'bVisible' ).length;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of column indexes that match a given property\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {string} sParam Parameter in aoColumns to look for - typically \n\t\t * bVisible or bSearchable\n\t\t * @returns {array} Array of indexes with matched properties\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetColumns( oSettings, sParam )\n\t\t{\n\t\t\tvar a = [];\n\t\t\n\t\t\t$.map( oSettings.aoColumns, function(val, i) {\n\t\t\t
\tif ( val[sParam] ) {\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t} );\n\t\t\n\t\t\treturn a;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the sort type based on an input string\n\t\t * @param {string} sData data we wish to know the type of\n\t\t * @returns {string} type (defaults to 'string' if no type can be detected)\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnDetectType( sData )\n\t\t{\n\t\t\tvar aTypes = DataTable.ext.aTypes;\n\t\t\tvar iLen = aTypes.length;\n\t\t\t\n\t\t\tfor ( var i=0 ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar sType = aTypes[i]( sData );\n\t\t\t\tif ( sType !== null )\n\t\t\t\t{\n\t\t\t\t\treturn sType;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn 'string';\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Figure out how to reorder a display list\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns array {int} aiReturn index list for reordering\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnReOrderIndex ( oSettings, sColumns )\n\t\t{\n\t\t\tvar aColumns
= sColumns.split(',');\n\t\t\tvar aiReturn = [];\n\t\t\t\n\t\t\tfor ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfor ( var j=0 ; j<iLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( oSettings.aoColumns[i].sName == aColumns[j] )\n\t\t\t\t\t{\n\t\t\t\t\t\taiReturn.push( j );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn aiReturn;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the column ordering that DataTables expects\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {string} comma separated list of names\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnColumnOrdering ( oSettings )\n\t\t{\n\t\t\tvar sNames = '';\n\t\t\tfor ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tsNames += oSettings.aoColumns[i].sName+',';\n\t\t\t}\n\t\t\tif ( sNames.length == iLen )\n\t\t\t{\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn sNames.slice(0, -1);\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Take the column definitions an
d static columns arrays and calculate how\n\t\t * they relate to column indexes. The callback function will then apply the\n\t\t * definition found for a column to a suitable configuration object.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {array} aoColDefs The aoColumnDefs array that is to be applied\n\t\t * @param {array} aoCols The aoColumns array that defines columns individually\n\t\t * @param {function} fn Callback function - takes two parameters, the calculated\n\t\t * column index and the definition for that column.\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n\t\t{\n\t\t\tvar i, iLen, j, jLen, k, kLen;\n\t\t\n\t\t\t// Column definitions with aTargets\n\t\t\tif ( aoColDefs )\n\t\t\t{\n\t\t\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\t\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t\t\t{\n\t\t\t\t\t/* Each definition can target multiple column
s, as it is an array */\n\t\t\t\t\tvar aTargets = aoColDefs[i].aTargets;\n\t\t\t\t\tif ( !$.isArray( aTargets ) )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\t\t\twhile( oSettings.aoColumns.length <= aTargets[j] )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\t\t\tfn( aTargets[j], aoColDefs[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\t\t\tfn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( typeof aTargets[j] === '
string' )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\t\t\tfor ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t\t\t $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfn( k, aoColDefs[i] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t// Statically defined columns array\n\t\t\tif ( aoCols )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tfn( i, aoCols[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t/**\n\t\t * Add a data array to the table, creating DOM node etc. This is the parallel to \n\t\t * _fnGatherData, but for adding rows from a Javascript source, rather than a\n\t\t * DOM source.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {array} aData data array to be added\n\t\t * @returns {int} >=0 if successful (index of new
aoData entry), -1 if failed\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAddData ( oSettings, aDataSupplied )\n\t\t{\n\t\t\tvar oCol;\n\t\t\t\n\t\t\t/* Take an independent copy of the data source so we can bash it about as we wish */\n\t\t\tvar aDataIn = ($.isArray(aDataSupplied)) ?\n\t\t\t\taDataSupplied.slice() :\n\t\t\t\t$.extend( true, {}, aDataSupplied );\n\t\t\t\n\t\t\t/* Create the object for storing information about this new row */\n\t\t\tvar iRow = oSettings.aoData.length;\n\t\t\tvar oData = $.extend( true, {}, DataTable.models.oRow );\n\t\t\toData._aData = aDataIn;\n\t\t\toSettings.aoData.push( oData );\n\t\t\n\t\t\t/* Create the cells */\n\t\t\tvar nTd, sThisType;\n\t\t\tfor ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[i];\n\t\t\n\t\t\t\t/* Use rendered data for filtering / sorting */\n\t\t\t\tif ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )\n\t\t\t\t{\n\t\t\t\t\t_fnSetCellData( oSett
ings, iRow, i, _fnRender(oSettings, iRow, i) );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* See if we should auto-detect the column type */\n\t\t\t\tif ( oCol._bAutoType && oCol.sType != 'string' )\n\t\t\t\t{\n\t\t\t\t\t/* Attempt to auto detect the type - same as _fnGatherData() */\n\t\t\t\t\tvar sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );\n\t\t\t\t\tif ( sVarType !== null && sVarType !== '' )\n\t\t\t\t\t{\n\t\t\t\t\t\tsThisType = _fnDetectType( sVarType );\n\t\t\t\t\t\tif ( oCol.sType === null )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toCol.sType = sThisType;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( oCol.sType != sThisType && oCol.sType != \"html\" )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* String is always the 'fallback' option */\n\t\t\t\t\t\t\toCol.sType = 'string';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Add to the display array */\n\t\t\toSettings.aiDisplayMaster.push( iRow
);\n\t\t\n\t\t\t/* Create the DOM information */\n\t\t\tif ( !oSettings.oFeatures.bDeferRender )\n\t\t\t{\n\t\t\t\t_fnCreateTr( oSettings, iRow );\n\t\t\t}\n\t\t\n\t\t\treturn iRow;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Read in the data from the target table from the DOM\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGatherData( oSettings )\n\t\t{\n\t\t\tvar iLoop, i, iLen, j, jLen, jInner,\n\t\t\t \tnTds, nTrs, nTd, nTr, aLocalData, iThisIndex,\n\t\t\t\tiRow, iRows, iColumn, iColumns, sNodeName,\n\t\t\t\toCol, oData;\n\t\t\t\n\t\t\t/*\n\t\t\t * Process by row first\n\t\t\t * Add the data object for the whole table - storing the tr node. Note - no point in getting\n\t\t\t * DOM based data if we are going to go and replace it with Ajax source data.\n\t\t\t */\n\t\t\tif ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )\n\t\t\t{\n\t\t\t\tnTr = oSettings.nTBody.firstChild;\n\t\t\t\twhile ( nTr )\n\t\t\t\t{\n\t\t\t\t\tif ( nTr.no
deName.toUpperCase() == \"TR\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tiThisIndex = oSettings.aoData.length;\n\t\t\t\t\t\tnTr._DT_RowIndex = iThisIndex;\n\t\t\t\t\t\toSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {\n\t\t\t\t\t\t\t\"nTr\": nTr\n\t\t\t\t\t\t} ) );\n\t\t\n\t\t\t\t\t\toSettings.aiDisplayMaster.push( iThisIndex );\n\t\t\t\t\t\tnTd = nTr.firstChild;\n\t\t\t\t\t\tjInner = 0;\n\t\t\t\t\t\twhile ( nTd )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsNodeName = nTd.nodeName.toUpperCase();\n\t\t\t\t\t\t\tif ( sNodeName == \"TD\" || sNodeName == \"TH\" )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );\n\t\t\t\t\t\t\t\tjInner++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnTd = nTd.nextSibling;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnTr = nTr.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Gather in the TD elements of the Table - note that this is basically the same as\n\t\t\t * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet\n
\t\t\t * setup!\n\t\t\t */\n\t\t\tnTrs = _fnGetTrNodes( oSettings );\n\t\t\tnTds = [];\n\t\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tnTd = nTrs[i].firstChild;\n\t\t\t\twhile ( nTd )\n\t\t\t\t{\n\t\t\t\t\tsNodeName = nTd.nodeName.toUpperCase();\n\t\t\t\t\tif ( sNodeName == \"TD\" || sNodeName == \"TH\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTds.push( nTd );\n\t\t\t\t\t}\n\t\t\t\t\tnTd = nTd.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Now process by column */\n\t\t\tfor ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )\n\t\t\t{\n\t\t\t\toCol = oSettings.aoColumns[iColumn];\n\t\t\n\t\t\t\t/* Get the title of the column - unless there is a user set one */\n\t\t\t\tif ( oCol.sTitle === null )\n\t\t\t\t{\n\t\t\t\t\toCol.sTitle = oCol.nTh.innerHTML;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar\n\t\t\t\t\tbAutoType = oCol._bAutoType,\n\t\t\t\t\tbRender = typeof oCol.fnRender === 'function',\n\t\t\t\t\tbClass = oCol.sClass !== null,\n\t\t\t\t\tbVisible = oCol.bVisible,\n\t\t\
t\t\tnCell, sThisType, sRendered, sValType;\n\t\t\t\t\n\t\t\t\t/* A single loop to rule them all (and be more efficient) */\n\t\t\t\tif ( bAutoType || bRender || bClass || !bVisible )\n\t\t\t\t{\n\t\t\t\t\tfor ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )\n\t\t\t\t\t{\n\t\t\t\t\t\toData = oSettings.aoData[iRow];\n\t\t\t\t\t\tnCell = nTds[ (iRow*iColumns) + iColumn ];\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Type detection */\n\t\t\t\t\t\tif ( bAutoType && oCol.sType != 'string' )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );\n\t\t\t\t\t\t\tif ( sValType !== '' )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsThisType = _fnDetectType( sValType );\n\t\t\t\t\t\t\t\tif ( oCol.sType === null )\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\toCol.sType = sThisType;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if ( oCol.sType != sThisType && \n\t\t\t\t\t\t\t\t oCol.sType != \"html\" )\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* String is always the 'fallback' option */\n\t\t\t\t\t\
t\t\t\toCol.sType = 'string';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif ( oCol.mRender )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// mRender has been defined, so we need to get the value and set it\n\t\t\t\t\t\t\tnCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( oCol.mData !== iColumn )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// If mData is not the same as the column number, then we need to\n\t\t\t\t\t\t\t// get the dev set value. If it is the column, no point in wasting\n\t\t\t\t\t\t\t// time setting the value that is already there!\n\t\t\t\t\t\t\tnCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Rendering */\n\t\t\t\t\t\tif ( bRender )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsRendered = _fnRender( oSettings, iRow, iColumn );\n\t\t\t\t\t\t\tnCell.innerHTML = sRendered;\n\t\t\t\t\t\t\tif ( oCol.bUseRendered )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* Use the rendered data for filtering
/ sorting */\n\t\t\t\t\t\t\t\t_fnSetCellData( oSettings, iRow, iColumn, sRendered );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Classes */\n\t\t\t\t\t\tif ( bClass )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnCell.className += ' '+oCol.sClass;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Column visibility */\n\t\t\t\t\t\tif ( !bVisible )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toData._anHidden[iColumn] = nCell;\n\t\t\t\t\t\t\tnCell.parentNode.removeChild( nCell );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toData._anHidden[iColumn] = null;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\t\t\tnCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* Row created callbacks */\n\t\t\tif ( oSettings.aoRowCreatedCallback.length !== 0 )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=oSettings.aoData.len
gth ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\toData = oSettings.aoData[i];\n\t\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Take a TR element and convert it to an index in aoData\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {node} n the TR element to find\n\t\t * @returns {int} index if the node is found, null if not\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnNodeToDataIndex( oSettings, n )\n\t\t{\n\t\t\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Take a TD element and convert it into a column data index (not the visible index)\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iRow The row number the TD/TH can be found in\n\t\t * @param {node} n The TD/TH element to find\n\t\t * @returns {int} index if the node is found, -1 if not\n\t\t * @memberof DataTable#oApi\n\t
\t */\n\t\tfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n\t\t{\n\t\t\tvar anCells = _fnGetTdNodes( oSettings, iRow );\n\t\t\n\t\t\tfor ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( anCells[i] === n )\n\t\t\t\t{\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of data for a given row from the internal data cache\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iRow aoData row id\n\t\t * @param {string} sSpecific data get type ('type' 'filter' 'sort')\n\t\t * @param {array} aiColumns Array of column indexes to get data from\n\t\t * @returns {array} Data array\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )\n\t\t{\n\t\t\tvar out = [];\n\t\t\tfor ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tout.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );\n\t\t\t}\n\t\t\treturn out;
\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the data for a given cell from the internal cache, taking into account data mapping\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iRow aoData row id\n\t\t * @param {int} iCol Column index\n\t\t * @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')\n\t\t * @returns {*} Cell data\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetCellData( oSettings, iRow, iCol, sSpecific )\n\t\t{\n\t\t\tvar sData;\n\t\t\tvar oCol = oSettings.aoColumns[iCol];\n\t\t\tvar oData = oSettings.aoData[iRow]._aData;\n\t\t\n\t\t\tif ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )\n\t\t\t{\n\t\t\t\tif ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )\n\t\t\t\t{\n\t\t\t\t\t_fnLog( oSettings, 0, \"Requested unknown parameter \"+\n\t\t\t\t\t\t(typeof oCol.mData=='function' ? '{mData function}' : \"'\"+oCol.mData+\"'\")+\n\t\t\t\t\t\t\" from the data source for row \"+iRow );\n\t\t\t\t
\toSettings.iDrawError = oSettings.iDraw;\n\t\t\t\t}\n\t\t\t\treturn oCol.sDefaultContent;\n\t\t\t}\n\t\t\n\t\t\t/* When the data source is null, we can use default column data */\n\t\t\tif ( sData === null && oCol.sDefaultContent !== null )\n\t\t\t{\n\t\t\t\tsData = oCol.sDefaultContent;\n\t\t\t}\n\t\t\telse if ( typeof sData === 'function' )\n\t\t\t{\n\t\t\t\t/* If the data source is a function, then we run it and use the return */\n\t\t\t\treturn sData();\n\t\t\t}\n\t\t\n\t\t\tif ( sSpecific == 'display' && sData === null )\n\t\t\t{\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn sData;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Set the value for a specific cell, into the internal data cache\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iRow aoData row id\n\t\t * @param {int} iCol Column index\n\t\t * @param {*} val Value to set\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnSetCellData( oSettings, iRow, iCol, val )\n\t\t{\n\t\t\tvar oCol = oSettings.aoColumns[iCol
];\n\t\t\tvar oData = oSettings.aoData[iRow]._aData;\n\t\t\n\t\t\toCol.fnSetData( oData, val );\n\t\t}\n\t\t\n\t\t\n\t\t// Private variable that is used to match array syntax in the data property object\n\t\tvar __reArray = /\\[.*?\\]$/;\n\t\t\n\t\t/**\n\t\t * Return a function that can be used to get data from a source object, taking\n\t\t * into account the ability to use nested objects as a source\n\t\t * @param {string|int|function} mSource The data source for the object\n\t\t * @returns {function} Data get function\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetObjectDataFn( mSource )\n\t\t{\n\t\t\tif ( mSource === null )\n\t\t\t{\n\t\t\t\t/* Give an empty string for rendering / sorting etc */\n\t\t\t\treturn function (data, type) {\n\t\t\t\t\treturn null;\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( typeof mSource === 'function' )\n\t\t\t{\n\t\t\t\treturn function (data, type, extra) {\n\t\t\t\t\treturn mSource( data, type, extra );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( typeof mSource === 's
tring' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )\n\t\t\t{\n\t\t\t\t/* If there is a . in the source string then the data source is in a \n\t\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t\t * be used if defined, rather than throwing an error\n\t\t\t\t */\n\t\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\t\tvar a = src.split('.');\n\t\t\t\t\tvar arrayNotation, out, innerSrc;\n\t\t\n\t\t\t\t\tif ( src !== \"\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\n\t\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\n\t\t\t\t\t\t\t\t// Condition allows simply [] t
o be passed in\n\t\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tout = [];\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\t\n\t\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\t\n\t\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t\t// of the source requested
, so we exit from the loop\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\treturn data;\n\t\t\t\t};\n\t\t\n\t\t\t\treturn function (data, type) {\n\t\t\t\t\treturn fetchData( data, type, mSource );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Array or flat object mapping */\n\t\t\t\treturn function (data, type) {\n\t\t\t\t\treturn data[mSource];\t\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Return a function that can be used to set data from a source object, taking\n\t\t * into account the ability to use nested objects as a source\n\t\t * @param {string|int|function} mSource The data source for the object\n\t\t * @returns {function} Data set function\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnSetObjectDataFn( mSource )\n\t\t{\n\t\t\tif ( mSource === null )\
n\t\t\t{\n\t\t\t\t/* Nothing to do when the data source is null */\n\t\t\t\treturn function (data, val) {};\n\t\t\t}\n\t\t\telse if ( typeof mSource === 'function' )\n\t\t\t{\n\t\t\t\treturn function (data, val) {\n\t\t\t\t\tmSource( data, 'set', val );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )\n\t\t\t{\n\t\t\t\t/* Like the get, we need to get data from a nested object */\n\t\t\t\tvar setData = function (data, val, src) {\n\t\t\t\t\tvar a = src.split('.'), b;\n\t\t\t\t\tvar arrayNotation, o, innerSrc;\n\t\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\n\t\t\t\t\t\tif ( arrayNotation )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to set so we
can recurse\n\t\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\t\n\t\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// If array notation is used, we just want to strip it and use
the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ a[a.length-1].replace(__reArray, '') ] = val;\n\t\t\t\t};\n\t\t\n\t\t\t\treturn function (data, val) {\n\t\t\t\t\treturn setData( data, val, mSource );\n\t\t\t\t};\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Array or flat object mapping */\n\t\t\t\treturn function (data, val) {\n\t\t\t\t\tdata[mSource] = val;\t\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Return an array with the full table data\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns array {array} aData Master data array\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetDataMaster ( oSettings )\n\t\t{\n\t\t\tvar aData = [];\n\t\t\tvar iLen = oSettings.aoData.length;\n\t\t\tfor ( var i=0 ; i<iLen; i++ )\n\t\t\t{\n\t\t\t\taData.push( oSettings.aoData[i]._aData );\n\t\t\t}\n\t\t\treturn aData;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Nuke the table\n\t\t * @param {object} oSet
tings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnClearTable( oSettings )\n\t\t{\n\t\t\toSettings.aoData.splice( 0, oSettings.aoData.length );\n\t\t\toSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );\n\t\t\toSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );\n\t\t\t_fnCalculateEnd( oSettings );\n\t\t}\n\t\t\n\t\t\n\t\t /**\n\t\t * Take an array of integers (index array) and remove a target integer (value - not \n\t\t * the key!)\n\t\t * @param {array} a Index array to target\n\t\t * @param {int} iTarget value to find\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnDeleteIndex( a, iTarget )\n\t\t{\n\t\t\tvar iTargetIndex = -1;\n\t\t\t\n\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( a[i] == iTarget )\n\t\t\t\t{\n\t\t\t\t\tiTargetIndex = i;\n\t\t\t\t}\n\t\t\t\telse if ( a[i] > iTarget )\n\t\t\t\t{\n\t\t\t\t\ta[i]--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( iTargetIndex != -1 )\n\t\t\t{\n\t\t\t\ta.
splice( iTargetIndex, 1 );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t /**\n\t\t * Call the developer defined fnRender function for a given cell (row/column) with\n\t\t * the required parameters and return the result.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iRow aoData index for the row\n\t\t * @param {int} iCol aoColumns index for the column\n\t\t * @returns {*} Return of the developer's fnRender function\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnRender( oSettings, iRow, iCol )\n\t\t{\n\t\t\tvar oCol = oSettings.aoColumns[iCol];\n\t\t\n\t\t\treturn oCol.fnRender( {\n\t\t\t\t\"iDataRow\": iRow,\n\t\t\t\t\"iDataColumn\": iCol,\n\t\t\t\t\"oSettings\": oSettings,\n\t\t\t\t\"aData\": oSettings.aoData[iRow]._aData,\n\t\t\t\t\"mDataProp\": oCol.mData\n\t\t\t}, _fnGetCellData(oSettings, iRow, iCol, 'display') );\n\t\t}\n\t\t/**\n\t\t * Create a new TR element (and it's TD children) for a row\n\t\t * @param {object} oSettings dataTables settings obj
ect\n\t\t * @param {int} iRow Row to consider\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnCreateTr ( oSettings, iRow )\n\t\t{\n\t\t\tvar oData = oSettings.aoData[iRow];\n\t\t\tvar nTd;\n\t\t\n\t\t\tif ( oData.nTr === null )\n\t\t\t{\n\t\t\t\toData.nTr = document.createElement('tr');\n\t\t\n\t\t\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t\t\t * to the aoData array for fast look up\n\t\t\t\t */\n\t\t\t\toData.nTr._DT_RowIndex = iRow;\n\t\t\n\t\t\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t\t\tif ( oData._aData.DT_RowId )\n\t\t\t\t{\n\t\t\t\t\toData.nTr.id = oData._aData.DT_RowId;\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( oData._aData.DT_RowClass )\n\t\t\t\t{\n\t\t\t\t\toData.nTr.className = oData._aData.DT_RowClass;\n\t\t\t\t}\n\t\t\n\t\t\t\t/* Process each column */\n\t\t\t\tfor ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tvar oCol = oSettings.aoColumns[i];\n\t\t\t\t\tnTd = document.
createElement( oCol.sCellType );\n\t\t\n\t\t\t\t\t/* Render if needed - if bUseRendered is true then we already have the rendered\n\t\t\t\t\t * value in the data source - so can just use that\n\t\t\t\t\t */\n\t\t\t\t\tnTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?\n\t\t\t\t\t\t_fnRender( oSettings, iRow, i ) :\n\t\t\t\t\t\t_fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t\t\n\t\t\t\t\t/* Add user defined class */\n\t\t\t\t\tif ( oCol.sClass !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTd.className = oCol.sClass;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( oCol.bVisible )\n\t\t\t\t\t{\n\t\t\t\t\t\toData.nTr.appendChild( nTd );\n\t\t\t\t\t\toData._anHidden[i] = null;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\toData._anHidden[i] = nTd;\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t\t\t{\n\t\t\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow
, i\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Create the HTML header for the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnBuildHead( oSettings )\n\t\t{\n\t\t\tvar i, nTh, iLen, j, jLen;\n\t\t\tvar iThs = $('th, td', oSettings.nTHead).length;\n\t\t\tvar iCorrector = 0;\n\t\t\tvar jqChildren;\n\t\t\t\n\t\t\t/* If there is a header in place - then use it - otherwise it's going to get nuked... */\n\t\t\tif ( iThs !== 0 )\n\t\t\t{\n\t\t\t\t/* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */\n\t\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tnTh = oSettings.aoColumns[i].nTh;\n\t\t\t\t\tnTh.setAttribute('role', 'columnheader');\n\t\t\t\t\tif ( oSettings.aoColumns[i].bSortable )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTh.
setAttribute('tabindex', oSettings.iTabIndex);\n\t\t\t\t\t\tnTh.setAttribute('aria-controls', oSettings.sTableId);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tif ( oSettings.aoColumns[i].sClass !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nTh).addClass( oSettings.aoColumns[i].sClass );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/* Set the title of the column if it is user defined (not what was auto detected) */\n\t\t\t\t\tif ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTh.innerHTML = oSettings.aoColumns[i].sTitle;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* We don't have a header in the DOM - so we are going to have to create one */\n\t\t\t\tvar nTr = document.createElement( \"tr\" );\n\t\t\t\t\n\t\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tnTh = oSettings.aoColumns[i].nTh;\n\t\t\t\t\tnTh.innerHTML = oSettings.aoColumns[i].sTitle;\n\t\t\t\t\tnTh.setAttribute('tabindex', '0');\n\t\t\t\t\t\n\t\t\t\t\tif ( oSettings.aoColumns[i].sClass !==
null )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(nTh).addClass( oSettings.aoColumns[i].sClass );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnTr.appendChild( nTh );\n\t\t\t\t}\n\t\t\t\t$(oSettings.nTHead).html( '' )[0].appendChild( nTr );\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );\n\t\t\t}\n\t\t\t\n\t\t\t/* ARIA role for the rows */\t\n\t\t\t$(oSettings.nTHead).children('tr').attr('role', 'row');\n\t\t\t\n\t\t\t/* Add the extra markup needed by jQuery UI's themes */\n\t\t\tif ( oSettings.bJUI )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tnTh = oSettings.aoColumns[i].nTh;\n\t\t\t\t\t\n\t\t\t\t\tvar nDiv = document.createElement('div');\n\t\t\t\t\tnDiv.className = oSettings.oClasses.sSortJUIWrapper;\n\t\t\t\t\t$(nTh).contents().appendTo(nDiv);\n\t\t\t\t\t\n\t\t\t\t\tvar nSpan = document.createElement('span');\n\t\t\t\t\tnSpan.className = oSettings.oClasses.sSortIcon;\n\t\t\t\t\tnDiv.appendChild( nSpan );\n\t\t\t\t\tnTh.appendChild( nDiv );\n\t\t\t\t}\n\t
\t\t}\n\t\t\t\n\t\t\tif ( oSettings.oFeatures.bSort )\n\t\t\t{\n\t\t\t\tfor ( i=0 ; i<oSettings.aoColumns.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( oSettings.aoColumns[i].bSortable !== false )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Deal with the footer - add classes if required */\n\t\t\tif ( oSettings.oClasses.sFooterTH !== \"\" )\n\t\t\t{\n\t\t\t\t$(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );\n\t\t\t}\n\t\t\t\n\t\t\t/* Cache the footer elements */\n\t\t\tif ( oSettings.nTFoot !== null )\n\t\t\t{\n\t\t\t\tvar anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );\n\t\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( anCells[i] )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.aoColumns[i].n
Tf = anCells[i];\n\t\t\t\t\t\tif ( oSettings.aoColumns[i].sClass )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$(anCells[i]).addClass( oSettings.aoColumns[i].sClass );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Draw the header (or footer) element based on the column visibility states. The\n\t\t * methodology here is to use the layout array from _fnDetectHeader, modified for\n\t\t * the instantaneous column visibility, to construct the new layout. The grid is\n\t\t * traversed over cell at a time in a rows x columns grid fashion, although each \n\t\t * cell insert can cover multiple elements in the grid - which is tracks using the\n\t\t * aApplied array. Cell inserts in the grid will only occur where there isn't\n\t\t * already a cell in that position.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param array {objects} aoSource Layout array from _fnDetectHeader\n\t\t * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the c
alc, \n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n\t\t{\n\t\t\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\t\t\tvar aoLocal = [];\n\t\t\tvar aApplied = [];\n\t\t\tvar iColumns = oSettings.aoColumns.length;\n\t\t\tvar iRowspan, iColspan;\n\t\t\n\t\t\tif ( bIncludeHidden === undefined )\n\t\t\t{\n\t\t\t\tbIncludeHidden = false;\n\t\t\t}\n\t\t\n\t\t\t/* Make a copy of the master layout array, but without the visible columns in it */\n\t\t\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taoLocal[i] = aoSource[i].slice();\n\t\t\t\taoLocal[i].nTr = aoSource[i].nTr;\n\t\t\n\t\t\t\t/* Remove any columns which are currently hidden */\n\t\t\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t\t\t{\n\t\t\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t\t\t{\n\t\t\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\t/* Prep the applied array - it needs an element for each row */\n\t\t\t\taApplied.push(
[] );\n\t\t\t}\n\t\t\n\t\t\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tnLocalTr = aoLocal[i].nTr;\n\t\t\t\t\n\t\t\t\t/* All cells are going to be replaced, so empty out the row */\n\t\t\t\tif ( nLocalTr )\n\t\t\t\t{\n\t\t\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t\t\t{\n\t\t\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tiRowspan = 1;\n\t\t\t\t\tiColspan = 1;\n\t\t\n\t\t\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t\t\t */\n\t\t\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t\t\t{\n\t\t\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\t\t\taApplied[i][j] = 1;\n\t\t\n\t\t\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t\t\t aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\
n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\t\t\tiRowspan++;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t\t\t aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tiColspan++;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t\t\taoLocal[i][j].cell.rowSpan = iRowspan;\n\t\t\t\t\t\taoLocal[i][j].cell.colSpan = iColspan;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Insert the required TR nodes into the table for display\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnDraw( oSettings )\n\t\t{\n\t\t\t/*
Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\t\t\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\t\t\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t\t\t{\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tvar i, iLen, n;\n\t\t\tvar anRows = [];\n\t\t\tvar iRowCount = 0;\n\t\t\tvar iStripes = oSettings.asStripeClasses.length;\n\t\t\tvar iOpenRows = oSettings.aoOpenRows.length;\n\t\t\t\n\t\t\toSettings.bDrawing = true;\n\t\t\t\n\t\t\t/* Check and see if we have an initial draw position from state saving */\n\t\t\tif ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )\n\t\t\t{\n\t\t\t\tif ( oSettings.oFeatures.bServerSide )\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = oSettings.iInitDisplayStart;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?\n\t\t\t\t\t
\t0 : oSettings.iInitDisplayStart;\n\t\t\t\t}\n\t\t\t\toSettings.iInitDisplayStart = -1;\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* Server-side processing draw intercept */\n\t\t\tif ( oSettings.bDeferLoading )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = false;\n\t\t\t\toSettings.iDraw++;\n\t\t\t}\n\t\t\telse if ( !oSettings.oFeatures.bServerSide )\n\t\t\t{\n\t\t\t\toSettings.iDraw++;\n\t\t\t}\n\t\t\telse if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif ( oSettings.aiDisplay.length !== 0 )\n\t\t\t{\n\t\t\t\tvar iStart = oSettings._iDisplayStart;\n\t\t\t\tvar iEnd = oSettings._iDisplayEnd;\n\t\t\t\t\n\t\t\t\tif ( oSettings.oFeatures.bServerSide )\n\t\t\t\t{\n\t\t\t\t\tiStart = 0;\n\t\t\t\t\tiEnd = oSettings.aoData.length;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t\t\t{\n\t\t\t\t\tvar aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];\n\t\t\t\t\tif ( aoData.nTr === null )\n\t\t\t\t\t{\n\t\t\t\
t\t\t_fnCreateTr( oSettings, oSettings.aiDisplay[j] );\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tvar nRow = aoData.nTr;\n\t\t\t\t\t\n\t\t\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\t\t\tif ( iStripes !== 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/* Row callback functions - might want to manipulate the row */\n\t\t\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null, \n\t\t\t\t\t\t[nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );\n\t\t\t\t\t\n\t\t\t\t\tanRows.push( nRow );\n\t\t\t\t\tiRowCount++;\n\t\t\t\t\t\n\t\t\t\t\t/* If there is an open row - and it is attached to this parent - attach it on redraw */\n\t\t\t\t\tif ( iOpenRows !== 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tfor ( var k=
0 ; k<iOpenRows ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( nRow == oSettings.aoOpenRows[k].nParent )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tanRows.push( oSettings.aoOpenRows[k].nTr );\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Table is empty - create a row with an empty message in it */\n\t\t\t\tanRows[ 0 ] = document.createElement( 'tr' );\n\t\t\t\t\n\t\t\t\tif ( oSettings.asStripeClasses[0] )\n\t\t\t\t{\n\t\t\t\t\tanRows[ 0 ].className = oSettings.asStripeClasses[0];\n\t\t\t\t}\n\t\t\n\t\t\t\tvar oLang = oSettings.oLanguage;\n\t\t\t\tvar sZero = oLang.sZeroRecords;\n\t\t\t\tif ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )\n\t\t\t\t{\n\t\t\t\t\tsZero = oLang.sLoadingRecords;\n\t\t\t\t}\n\t\t\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t\t\t{\n\t\t\t\t\tsZero = oLang.sEmptyTable;\n\t\t\t\t}\n\t\t\n\t\t\t\tvar nTd = document.createElement( 'td' );\n\t\t\t\tnTd
.setAttribute( 'valign', \"top\" );\n\t\t\t\tnTd.colSpan = _fnVisbleColumns( oSettings );\n\t\t\t\tnTd.className = oSettings.oClasses.sRowEmpty;\n\t\t\t\tnTd.innerHTML = _fnInfoMacros( oSettings, sZero );\n\t\t\t\t\n\t\t\t\tanRows[ iRowCount ].appendChild( nTd );\n\t\t\t}\n\t\t\t\n\t\t\t/* Header and footer callbacks */\n\t\t\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], \n\t\t\t\t_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );\n\t\t\t\n\t\t\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], \n\t\t\t\t_fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );\n\t\t\t\n\t\t\t/* \n\t\t\t * Need to remove any old row from the display - note we can't just empty the tbody using\n\t\t\t * $().html('') since this will unbind the jQuery event handlers (even although the node \n\t\t\t * still exists!) - equal
ly we can't use innerHTML, since IE throws an exception.\n\t\t\t */\n\t\t\tvar\n\t\t\t\tnAddFrag = document.createDocumentFragment(),\n\t\t\t\tnRemoveFrag = document.createDocumentFragment(),\n\t\t\t\tnBodyPar, nTrs;\n\t\t\t\n\t\t\tif ( oSettings.nTBody )\n\t\t\t{\n\t\t\t\tnBodyPar = oSettings.nTBody.parentNode;\n\t\t\t\tnRemoveFrag.appendChild( oSettings.nTBody );\n\t\t\t\t\n\t\t\t\t/* When doing infinite scrolling, only remove child rows when sorting, filtering or start\n\t\t\t\t * up. When not infinite scroll, always do it.\n\t\t\t\t */\n\t\t\t\tif ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||\n\t\t\t\t \toSettings.bSorted || oSettings.bFiltered )\n\t\t\t\t{\n\t\t\t\t\twhile( (n = oSettings.nTBody.firstChild) )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.nTBody.removeChild( n );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Put the draw table into the dom */\n\t\t\t\tfor ( i=0, iLen=anRows.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tnAddFrag.appendChild( anRows[i] );\n\t\t\t\t}\n\t\t\t\t\n\t\t\
t\toSettings.nTBody.appendChild( nAddFrag );\n\t\t\t\tif ( nBodyPar !== null )\n\t\t\t\t{\n\t\t\t\t\tnBodyPar.appendChild( oSettings.nTBody );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Call all required callback functions for the end of a draw */\n\t\t\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\t\t\t\n\t\t\t/* Draw is complete, sorting and filtering must be as well */\n\t\t\toSettings.bSorted = false;\n\t\t\toSettings.bFiltered = false;\n\t\t\toSettings.bDrawing = false;\n\t\t\t\n\t\t\tif ( oSettings.oFeatures.bServerSide )\n\t\t\t{\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t\tif ( !oSettings._bInitComplete )\n\t\t\t\t{\n\t\t\t\t\t_fnInitComplete( oSettings );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Redraw the table - taking account of the various features which are enabled\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnReDraw( oSettings )\n\t\t{\n\t\t\tif ( oSettings.oFeatures.b
Sort )\n\t\t\t{\n\t\t\t\t/* Sorting will refilter and draw for us */\n\t\t\t\t_fnSort( oSettings, oSettings.oPreviousSearch );\n\t\t\t}\n\t\t\telse if ( oSettings.oFeatures.bFilter )\n\t\t\t{\n\t\t\t\t/* Filtering will redraw for us */\n\t\t\t\t_fnFilterComplete( oSettings, oSettings.oPreviousSearch );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Add the options to the page HTML for the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAddOptionsHtml ( oSettings )\n\t\t{\n\t\t\t/*\n\t\t\t * Create a temporary, empty, div which we can later on replace with what we have generated\n\t\t\t * we do it this way to rendering the 'options' html offline - speed :-)\n\t\t\t */\n\t\t\tvar nHolding = $('<div></div>')[0];\n\t\t\toSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );\n\t\t\t\n\t\t\t/* \n\t\t\t * All DataTables are
wrapped in a div\n\t\t\t */\n\t\t\toSettings.nTableWrapper = $('<div id=\"'+oSettings.sTableId+'_wrapper\" class=\"'+oSettings.oClasses.sWrapper+'\" role=\"grid\"></div>')[0];\n\t\t\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\t\t\n\t\t\t/* Track where we want to insert the option */\n\t\t\tvar nInsertNode = oSettings.nTableWrapper;\n\t\t\t\n\t\t\t/* Loop over the user set positioning and place the elements as needed */\n\t\t\tvar aDom = oSettings.sDom.split('');\n\t\t\tvar nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;\n\t\t\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t\t\t{\n\t\t\t\tiPushFeature = 0;\n\t\t\t\tcOption = aDom[i];\n\t\t\t\t\n\t\t\t\tif ( cOption == '<' )\n\t\t\t\t{\n\t\t\t\t\t/* New container div */\n\t\t\t\t\tnNewNode = $('<div></div>')[0];\n\t\t\t\t\t\n\t\t\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\t\t\tcNext = aDom[i+1];\n\t\t\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t\t\t{\n\t\t\t\t\t\tsAttr = \"\";\n\
t\t\t\t\t\tj = 2;\n\t\t\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Replace jQuery UI constants */\n\t\t\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsAttr = oSettings.oClasses.sJUIHeader;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsAttr = oSettings.oClasses.sJUIFooter;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t
\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\ti += j; /* Move along the position array */\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnInsertNode.appendChild( nNewNode );\n\t\t\t\t\tnInsertNode = nNewNode;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == '>' )\n\t\t\t\t{\n\t\t\t\t\t/* End container div */\n\t\t\t\t\tnInsertNode = nInsertNode.parentNode;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )\n\t\t\t\t{\n\t\t\t\t\t/* Length */\n\t\t\t\t\tnTmp = _fnFeatureHtmlLength( oSettings );\n\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == 'f' && oSettings.oFeatures.bFilter )\n\t\t\t\t{\n\t\t\t\t\t/* Filter */\n\t\t\t\t\tnTmp = _fnFeatureHtmlFilter( oSettings );\n\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == 'r' && oSettings.oFeatures.bProcessing )\n\t\t\t\t{\n\t\t\t\t\t/* pRocessing */\n\t\t\t\t\tnTmp = _fnFeatureHtmlProcessing( oSettin
gs );\n\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == 't' )\n\t\t\t\t{\n\t\t\t\t\t/* Table */\n\t\t\t\t\tnTmp = _fnFeatureHtmlTable( oSettings );\n\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == 'i' && oSettings.oFeatures.bInfo )\n\t\t\t\t{\n\t\t\t\t\t/* Info */\n\t\t\t\t\tnTmp = _fnFeatureHtmlInfo( oSettings );\n\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t}\n\t\t\t\telse if ( cOption == 'p' && oSettings.oFeatures.bPaginate )\n\t\t\t\t{\n\t\t\t\t\t/* Pagination */\n\t\t\t\t\tnTmp = _fnFeatureHtmlPaginate( oSettings );\n\t\t\t\t\tiPushFeature = 1;\n\t\t\t\t}\n\t\t\t\telse if ( DataTable.ext.aoFeatures.length !== 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Plug-in features */\n\t\t\t\t\tvar aoFeatures = DataTable.ext.aoFeatures;\n\t\t\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnTmp = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\t\t\tif ( nTmp )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t
\tiPushFeature = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Add to the 2D features array */\n\t\t\t\tif ( iPushFeature == 1 && nTmp !== null )\n\t\t\t\t{\n\t\t\t\t\tif ( typeof oSettings.aanFeatures[cOption] !== 'object' )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.aanFeatures[cOption] = [];\n\t\t\t\t\t}\n\t\t\t\t\toSettings.aanFeatures[cOption].push( nTmp );\n\t\t\t\t\tnInsertNode.appendChild( nTmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Built our DOM structure - replace the holding div with what we want */\n\t\t\tnHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Use the DOM source to create up an array of header cells. The idea here is to\n\t\t * create a layout grid (array) of rows x columns, which contains a reference\n\t\t * to the cell that that point in the grid (regardless of col/rowspan), such that\n\t\t * any column / row could be removed and the new grid constructed\n\t\t * @param array
{object} aLayout Array to store the calculated layout in\n\t\t * @param {node} nThead The header/footer element for the table\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnDetectHeader ( aLayout, nThead )\n\t\t{\n\t\t\tvar nTrs = $(nThead).children('tr');\n\t\t\tvar nTr, nCell;\n\t\t\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\t\t\tvar bUnique;\n\t\t\tvar fnShiftCol = function ( a, i, j ) {\n\t\t\t\tvar k = a[i];\n\t\t while ( k[j] ) {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\treturn j;\n\t\t\t};\n\t\t\n\t\t\taLayout.splice( 0, aLayout.length );\n\t\t\t\n\t\t\t/* We know how many rows there are in the layout - so prep it */\n\t\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taLayout.push( [] );\n\t\t\t}\n\t\t\t\n\t\t\t/* Calculate a layout array */\n\t\t\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tnTr = nTrs[i];\n\t\t\t\tiColumn = 0;\n\t\t\t\t\n\t\t\t\t/* For every cell in the row... */\n\t\t\t\tnCell = nTr.firstChild;\n\
t\t\t\twhile ( nCell ) {\n\t\t\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t\t\t nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\t\t\n\t\t\t\t\t\t/* There might be colspan cells already in this row, so shift our target \n\t\t\t\t\t\t * accordingly\n\t\t\t\t\t\t */\n\t\t\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\
tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnCell = nCell.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of unique th elements, one for each column\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {node} nHeader automatically detect the layout from this node - optional\n\t\t * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n\t\t * @returns array {node} aReturn list of unique th's\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n\t\t{\n\t\t\tvar aReturn = [];\n\t\t\tif ( !aLayout )\n\t\t\t{\n\t\t\t\taLayout = oSettings.aoHeader;\n\t\t\t\tif ( nHeader )\n\t\t\t\t{\n\t\t\t\t\taLayout = [];\n\t\t\t\t\t_fnDetectHeader( aLayo
ut, nHeader );\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( aLayout[i][j].unique && \n\t\t\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t\t\t{\n\t\t\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn aReturn;\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Update the table using an Ajax call\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {boolean} Block the table drawing or not\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAjaxUpdate( oSettings )\n\t\t{\n\t\t\tif ( oSettings.bAjaxDataGet )\n\t\t\t{\n\t\t\t\toSettings.iDraw++;\n\t\t\t\t_fnProcessingDisplay( oSettings, true );\n\t\t\t\tvar iColumns = oSettings.aoColumns.length;\n\t\t\t\tvar aoData = _fnAjaxParameters( oSettings );\n\t\t\t\t_fnServerParams( oSettings, aoData );\n\t\t\t\t\n\t\t\t\toSettings.fnServerData.call( oS
ettings.oInstance, oSettings.sAjaxSource, aoData,\n\t\t\t\t\tfunction(json) {\n\t\t\t\t\t\t_fnAjaxUpdateDraw( oSettings, json );\n\t\t\t\t\t}, oSettings );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Build up the parameters in an object needed for a server-side processing request\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {bool} block the table drawing or not\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAjaxParameters( oSettings )\n\t\t{\n\t\t\tvar iColumns = oSettings.aoColumns.length;\n\t\t\tvar aoData = [], mDataProp, aaSort, aDataSort;\n\t\t\tvar i, j;\n\t\t\t\n\t\t\taoData.push( { \"name\": \"sEcho\", \"value\": oSettings.iDraw } );\n\t\t\taoData.push( { \"name\": \"iColumns\", \"value\": iColumns } );\n\t\t\taoData.push( { \"name\": \"sColumns\", \"value\": _fnColumnOrdering(oSettings) } );\n\t\t\taoData.push( { \"name\": \"iDisplayStart\", \"value\": oSe
ttings._iDisplayStart } );\n\t\t\taoData.push( { \"name\": \"iDisplayLength\", \"value\": oSettings.oFeatures.bPaginate !== false ?\n\t\t\t\toSettings._iDisplayLength : -1 } );\n\t\t\t\t\n\t\t\tfor ( i=0 ; i<iColumns ; i++ )\n\t\t\t{\n\t\t\t mDataProp = oSettings.aoColumns[i].mData;\n\t\t\t\taoData.push( { \"name\": \"mDataProp_\"+i, \"value\": typeof(mDataProp)===\"function\" ? 'function' : mDataProp } );\n\t\t\t}\n\t\t\t\n\t\t\t/* Filtering */\n\t\t\tif ( oSettings.oFeatures.bFilter !== false )\n\t\t\t{\n\t\t\t\taoData.push( { \"name\": \"sSearch\", \"value\": oSettings.oPreviousSearch.sSearch } );\n\t\t\t\taoData.push( { \"name\": \"bRegex\", \"value\": oSettings.oPreviousSearch.bRegex } );\n\t\t\t\tfor ( i=0 ; i<iColumns ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoData.push( { \"name\": \"sSearch_\"+i, \"value\": oSettings.aoPreSearchCols[i].sSearch } );\n\t\t\t\t\taoData.push( { \"name\": \"bRegex_\"+i, \"value\": oSettings.aoPreSearchCols[i].bRegex } );\n\t\t\t\t\taoData.push( { \"name\": \"bSearchable_
\"+i, \"value\": oSettings.aoColumns[i].bSearchable } );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Sorting */\n\t\t\tif ( oSettings.oFeatures.bSort !== false )\n\t\t\t{\n\t\t\t\tvar iCounter = 0;\n\t\t\n\t\t\t\taaSort = ( oSettings.aaSortingFixed !== null ) ?\n\t\t\t\t\toSettings.aaSortingFixed.concat( oSettings.aaSorting ) :\n\t\t\t\t\toSettings.aaSorting.slice();\n\t\t\t\t\n\t\t\t\tfor ( i=0 ; i<aaSort.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\taDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;\n\t\t\t\t\t\n\t\t\t\t\tfor ( j=0 ; j<aDataSort.length ; j++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taoData.push( { \"name\": \"iSortCol_\"+iCounter, \"value\": aDataSort[j] } );\n\t\t\t\t\t\taoData.push( { \"name\": \"sSortDir_\"+iCounter, \"value\": aaSort[i][1] } );\n\t\t\t\t\t\tiCounter++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taoData.push( { \"name\": \"iSortingCols\", \"value\": iCounter } );\n\t\t\t\t\n\t\t\t\tfor ( i=0 ; i<iColumns ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoData.push( { \"name\": \"bSortable_\"+i, \"value\": oSettings
.aoColumns[i].bSortable } );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn aoData;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Add Ajax parameters from plug-ins\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param array {objects} aoData name/value pairs to send to the server\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnServerParams( oSettings, aoData )\n\t\t{\n\t\t\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Data the data from the server (nuking the old) and redraw the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {object} json json data return from the server.\n\t\t * @param {string} json.sEcho Tracking flag for DataTables to match requests\n\t\t * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n\t\t * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n\t\t * @param {array} js
on.aaData The data to display on this page\n\t\t * @param {string} [json.sColumns] Column ordering (sName, comma separated)\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnAjaxUpdateDraw ( oSettings, json )\n\t\t{\n\t\t\tif ( json.sEcho !== undefined )\n\t\t\t{\n\t\t\t\t/* Protect against old returns over-writing a new one. Possible when you get\n\t\t\t\t * very fast interaction, and later queries are completed much faster\n\t\t\t\t */\n\t\t\t\tif ( json.sEcho*1 < oSettings.iDraw )\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toSettings.iDraw = json.sEcho * 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( !oSettings.oScroll.bInfinite ||\n\t\t\t\t (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )\n\t\t\t{\n\t\t\t\t_fnClearTable( oSettings );\n\t\t\t}\n\t\t\toSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);\n\t\t\toSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);\n\t\t\t\n\t\t\t/* Determine if reordering is requi
red */\n\t\t\tvar sOrdering = _fnColumnOrdering(oSettings);\n\t\t\tvar bReOrder = (json.sColumns !== undefined && sOrdering !== \"\" && json.sColumns != sOrdering );\n\t\t\tvar aiIndex;\n\t\t\tif ( bReOrder )\n\t\t\t{\n\t\t\t\taiIndex = _fnReOrderIndex( oSettings, json.sColumns );\n\t\t\t}\n\t\t\t\n\t\t\tvar aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );\n\t\t\tfor ( var i=0, iLen=aData.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( bReOrder )\n\t\t\t\t{\n\t\t\t\t\t/* If we need to re-order, then create a new array with the correct order and add it */\n\t\t\t\t\tvar aDataSorted = [];\n\t\t\t\t\tfor ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taDataSorted.push( aData[i][ aiIndex[j] ] );\n\t\t\t\t\t}\n\t\t\t\t\t_fnAddData( oSettings, aDataSorted );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* No re-order required, sever got it \"right\" - just straight add */\n\t\t\t\t\t_fnAddData( oSettings, aData[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t\toSettings.aiDispla
y = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\toSettings.bAjaxDataGet = false;\n\t\t\t_fnDraw( oSettings );\n\t\t\toSettings.bAjaxDataGet = true;\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Generate the node required for filtering text\n\t\t * @returns {node} Filter control element\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFeatureHtmlFilter ( oSettings )\n\t\t{\n\t\t\tvar oPreviousSearch = oSettings.oPreviousSearch;\n\t\t\t\n\t\t\tvar sSearchStr = oSettings.oLanguage.sSearch;\n\t\t\tsSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?\n\t\t\t sSearchStr.replace('_INPUT_', '<input type=\"text\" />') :\n\t\t\t sSearchStr===\"\" ? '<input type=\"text\" />' : sSearchStr+' <input type=\"text\" />';\n\t\t\t\n\t\t\tvar nFilter = document.createElement( 'div' );\n\t\t\tnFilter.className = oSettings.oClasses.sFilter;\n\t\t\tnFilter.innerHTML = '<label>'+sSearchStr+'</label>';\n\t\t
\tif ( !oSettings.aanFeatures.f )\n\t\t\t{\n\t\t\t\tnFilter.id = oSettings.sTableId+'_filter';\n\t\t\t}\n\t\t\t\n\t\t\tvar jqFilter = $('input[type=\"text\"]', nFilter);\n\t\t\n\t\t\t// Store a reference to the input element, so other input elements could be\n\t\t\t// added to the filter wrapper if needed (submit button for example)\n\t\t\tnFilter._DT_Input = jqFilter[0];\n\t\t\n\t\t\tjqFilter.val( oPreviousSearch.sSearch.replace('\"','"') );\n\t\t\tjqFilter.bind( 'keyup.DT', function(e) {\n\t\t\t\t/* Update all other filter input elements for the new display */\n\t\t\t\tvar n = oSettings.aanFeatures.f;\n\t\t\t\tvar val = this.value===\"\" ? \"\" : this.value; // mental IE8 fix :-(\n\t\t\n\t\t\t\tfor ( var i=0, iLen=n.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( n[i] != $(this).parents('div.dataTables_filter')[0] )\n\t\t\t\t\t{\n\t\t\t\t\t\t$(n[i]._DT_Input).val( val );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Now do the filter */\n\t\t\t\tif ( val != oPreviousSearch.sSearch )\n\t\t\t\t{\n\t\
t\t\t\t_fnFilterComplete( oSettings, { \n\t\t\t\t\t\t\"sSearch\": val, \n\t\t\t\t\t\t\"bRegex\": oPreviousSearch.bRegex,\n\t\t\t\t\t\t\"bSmart\": oPreviousSearch.bSmart ,\n\t\t\t\t\t\t\"bCaseInsensitive\": oPreviousSearch.bCaseInsensitive \n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t\n\t\t\tjqFilter\n\t\t\t\t.attr('aria-controls', oSettings.sTableId)\n\t\t\t\t.bind( 'keypress.DT', function(e) {\n\t\t\t\t\t/* Prevent form submission */\n\t\t\t\t\tif ( e.keyCode == 13 )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\treturn nFilter;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the table using both the global filter and column based filtering\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {object} oSearch search information\n\t\t * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFilterComplete ( oSettings, oInput, iForce )\n\t\t{\n\t\t\tvar oPr
evSearch = oSettings.oPreviousSearch;\n\t\t\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\t\t\tvar fnSaveFilter = function ( oFilter ) {\n\t\t\t\t/* Save the filtering values */\n\t\t\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\t\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\t\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\t\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\t\t};\n\t\t\n\t\t\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\t\t\tif ( !oSettings.oFeatures.bServerSide )\n\t\t\t{\n\t\t\t\t/* Global filter */\n\t\t\t\t_fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );\n\t\t\t\tfnSaveFilter( oInput );\n\t\t\n\t\t\t\t/* Now do the individual column filter */\n\t\t\t\tfor ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex, \n\t\t\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].b
CaseInsensitive );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Custom filtering */\n\t\t\t\t_fnFilterCustom( oSettings );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfnSaveFilter( oInput );\n\t\t\t}\n\t\t\t\n\t\t\t/* Tell the draw function we have been filtering */\n\t\t\toSettings.bFiltered = true;\n\t\t\t$(oSettings.oInstance).trigger('filter', oSettings);\n\t\t\t\n\t\t\t/* Redraw the table */\n\t\t\toSettings._iDisplayStart = 0;\n\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t_fnDraw( oSettings );\n\t\t\t\n\t\t\t/* Rebuild search array 'offline' */\n\t\t\t_fnBuildSearchArray( oSettings, 0 );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Apply custom filtering functions\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFilterCustom( oSettings )\n\t\t{\n\t\t\tvar afnFilters = DataTable.ext.afnFiltering;\n\t\t\tvar aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );\n\t\t\n\t\t\tfor ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar iCo
rrector = 0;\n\t\t\t\tfor ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tvar iDisIndex = oSettings.aiDisplay[j-iCorrector];\n\t\t\t\t\tvar bTest = afnFilters[i](\n\t\t\t\t\t\toSettings,\n\t\t\t\t\t\t_fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),\n\t\t\t\t\t\tiDisIndex\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t/* Check if we should use this row based on the filtering function */\n\t\t\t\t\tif ( !bTest )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.aiDisplay.splice( j-iCorrector, 1 );\n\t\t\t\t\t\tiCorrector++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the table on a per-column basis\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {string} sInput string to filter on\n\t\t * @param {int} iColumn column to filter\n\t\t * @param {bool} bRegex treat search string as a regular expression or not\n\t\t * @param {bool} bSmart use smart filtering or not\n\t\t * @param {bool} bCaseInsensitive Do case insenstive ma
tching or not\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )\n\t\t{\n\t\t\tif ( sInput === \"\" )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tvar iIndexCorrector = 0;\n\t\t\tvar rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\t\n\t\t\tfor ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\tvar sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),\n\t\t\t\t\toSettings.aoColumns[iColumn].sType );\n\t\t\t\tif ( ! rpSearch.test( sData ) )\n\t\t\t\t{\n\t\t\t\t\toSettings.aiDisplay.splice( i, 1 );\n\t\t\t\t\tiIndexCorrector++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the data table based on user input and draw the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {string} sInput string to filter on\n\t\t * @param {int} iForce optional - force a research of the master
array (1) or not (undefined or 0)\n\t\t * @param {bool} bRegex treat as a regular expression or not\n\t\t * @param {bool} bSmart perform smart filtering or not\n\t\t * @param {bool} bCaseInsensitive Do case insenstive matching or not\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )\n\t\t{\n\t\t\tvar i;\n\t\t\tvar rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t\tvar oPrevSearch = oSettings.oPreviousSearch;\n\t\t\t\n\t\t\t/* Check if we are forcing or not - optional parameter */\n\t\t\tif ( !iForce )\n\t\t\t{\n\t\t\t\tiForce = 0;\n\t\t\t}\n\t\t\t\n\t\t\t/* Need to take account of custom filtering functions - always filter */\n\t\t\tif ( DataTable.ext.afnFiltering.length !== 0 )\n\t\t\t{\n\t\t\t\tiForce = 1;\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * If the input is blank - we want the full data set\n\t\t\t */\n\t\t\tif ( sInput.length <= 0 )\n\t\t\t{\n\t\t\t\toSettings.aiDisplay.splice( 0, oSetting
s.aiDisplay.length);\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * We are starting a new search or the new search string is smaller \n\t\t\t\t * then the old one (i.e. delete). Search from the master array\n\t\t\t \t */\n\t\t\t\tif ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||\n\t\t\t\t\t oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||\n\t\t\t\t\t sInput.indexOf(oPrevSearch.sSearch) !== 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Nuke the old display array - we are going to rebuild it */\n\t\t\t\t\toSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);\n\t\t\t\t\t\n\t\t\t\t\t/* Force a rebuild of the search array */\n\t\t\t\t\t_fnBuildSearchArray( oSettings, 1 );\n\t\t\t\t\t\n\t\t\t\t\t/* Search through all records to populate the search array\n\t\t\t\t\t * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 \n\t\t\t\t\t * mapping\n\t\t\t\t\t */\n\t\t\t\t\tfor ( i=0 ; i<oSettings.aiDisplay
Master.length ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( rpSearch.test(oSettings.asDataSearch[i]) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t }\n\t\t\t else\n\t\t\t\t{\n\t\t\t \t/* Using old search array - refine it - do it this way for speed\n\t\t\t \t * Don't have to search the whole master array again\n\t\t\t\t\t */\n\t\t\t \tvar iIndexCorrector = 0;\n\t\t\t \t\n\t\t\t \t/* Search the current results */\n\t\t\t \tfor ( i=0 ; i<oSettings.asDataSearch.length ; i++ )\n\t\t\t\t\t{\n\t\t\t \t\tif ( ! rpSearch.test(oSettings.asDataSearch[i]) )\n\t\t\t\t\t\t{\n\t\t\t \t\t\toSettings.aiDisplay.splice( i-iIndexCorrector, 1 );\n\t\t\t \t\t\tiIndexCorrector++;\n\t\t\t \t\t}\n\t\t\t \t}\n\t\t\t }\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Create an array which can be quickly search through\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iMaster use the master data array - optional\n\t\t *
@memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnBuildSearchArray ( oSettings, iMaster )\n\t\t{\n\t\t\tif ( !oSettings.oFeatures.bServerSide )\n\t\t\t{\n\t\t\t\t/* Clear out the old data */\n\t\t\t\toSettings.asDataSearch = [];\n\t\t\n\t\t\t\tvar aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );\n\t\t\t\tvar aiIndex = (iMaster===1) ?\n\t\t\t\t \toSettings.aiDisplayMaster :\n\t\t\t\t \toSettings.aiDisplay;\n\t\t\t\t\n\t\t\t\tfor ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\toSettings.asDataSearch[i] = _fnBuildSearchRow(\n\t\t\t\t\t\toSettings,\n\t\t\t\t\t\t_fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a searchable string from a single data row\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {array} aData Row data array to use for the data to search\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnBuildSearchRow( oSettings, aData )\n\t\t
{\n\t\t\tvar sSearch = aData.join(' ');\n\t\t\t\n\t\t\t/* If it looks like there is an HTML entity in the string, attempt to decode it */\n\t\t\tif ( sSearch.indexOf('&') !== -1 )\n\t\t\t{\n\t\t\t\tsSearch = $('<div>').html(sSearch).text();\n\t\t\t}\n\t\t\t\n\t\t\t// Strip newline characters\n\t\t\treturn sSearch.replace( /[\\n\\r]/g, \" \" );\n\t\t}\n\t\t\n\t\t/**\n\t\t * Build a regular expression object suitable for searching a table\n\t\t * @param {string} sSearch string to search for\n\t\t * @param {bool} bRegex treat as a regular expression or not\n\t\t * @param {bool} bSmart perform smart filtering or not\n\t\t * @param {bool} bCaseInsensitive Do case insensitive matching or not\n\t\t * @returns {RegExp} constructed object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )\n\t\t{\n\t\t\tvar asSearch, sRegExpString;\n\t\t\t\n\t\t\tif ( bSmart )\n\t\t\t{\n\t\t\t\t/* Generate the regular expression to use. Something along the
lines of:\n\t\t\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo\\b)(?=.*?\\bthree\\b).*$\n\t\t\t\t */\n\t\t\t\tasSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );\n\t\t\t\tsRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';\n\t\t\t\treturn new RegExp( sRegExpString, bCaseInsensitive ? \"i\" : \"\" );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );\n\t\t\t\treturn new RegExp( sSearch, bCaseInsensitive ? \"i\" : \"\" );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Convert raw data into something that the user can search on\n\t\t * @param {string} sData data to be modified\n\t\t * @param {string} sType data type\n\t\t * @returns {string} search string\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnDataToSearch ( sData, sType )\n\t\t{\n\t\t\tif ( typeof DataTable.ext.ofnSearch[sType] === \"function\" )\n\t\t\t{\n\t\t\t\treturn DataTable.ext.ofnSearch[sType]( sData );\n\t\t\t}\n\t\t\telse if ( sData === null )\n\t\t\t{\n\t\
t\t\treturn '';\n\t\t\t}\n\t\t\telse if ( sType == \"html\" )\n\t\t\t{\n\t\t\t\treturn sData.replace(/[\\r\\n]/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t\t}\n\t\t\telse if ( typeof sData === \"string\" )\n\t\t\t{\n\t\t\t\treturn sData.replace(/[\\r\\n]/g,\" \");\n\t\t\t}\n\t\t\treturn sData;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * scape a string such that it can be used in a regular expression\n\t\t * @param {string} sVal string to escape\n\t\t * @returns {string} escaped string\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnEscapeRegex ( sVal )\n\t\t{\n\t\t\tvar acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ];\n\t\t\tvar reReplace = new RegExp( '(\\\\' + acEscape.join('|\\\\') + ')', 'g' );\n\t\t\treturn sVal.replace(reReplace, '\\\\$1');\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Generate the node required for the info display\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {node} Information element\n\t\t * @memberof Data
Table#oApi\n\t\t */\n\t\tfunction _fnFeatureHtmlInfo ( oSettings )\n\t\t{\n\t\t\tvar nInfo = document.createElement( 'div' );\n\t\t\tnInfo.className = oSettings.oClasses.sInfo;\n\t\t\t\n\t\t\t/* Actions that are to be taken once only for this feature */\n\t\t\tif ( !oSettings.aanFeatures.i )\n\t\t\t{\n\t\t\t\t/* Add draw callback */\n\t\t\t\toSettings.aoDrawCallback.push( {\n\t\t\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\t\t\"sName\": \"information\"\n\t\t\t\t} );\n\t\t\t\t\n\t\t\t\t/* Add id */\n\t\t\t\tnInfo.id = oSettings.sTableId+'_info';\n\t\t\t}\n\t\t\toSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );\n\t\t\t\n\t\t\treturn nInfo;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Update the information elements in the display\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnUpdateInfo ( oSettings )\n\t\t{\n\t\t\t/* Show information about the table */\n\t\t\tif ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.lengt
h === 0 )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tvar\n\t\t\t\toLang = oSettings.oLanguage,\n\t\t\t\tiStart = oSettings._iDisplayStart+1,\n\t\t\t\tiEnd = oSettings.fnDisplayEnd(),\n\t\t\t\tiMax = oSettings.fnRecordsTotal(),\n\t\t\t\tiTotal = oSettings.fnRecordsDisplay(),\n\t\t\t\tsOut;\n\t\t\t\n\t\t\tif ( iTotal === 0 )\n\t\t\t{\n\t\t\t\t/* Empty record set */\n\t\t\t\tsOut = oLang.sInfoEmpty;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* Normal record set */\n\t\t\t\tsOut = oLang.sInfo;\n\t\t\t}\n\t\t\n\t\t\tif ( iTotal != iMax )\n\t\t\t{\n\t\t\t\t/* Record set after filtering */\n\t\t\t\tsOut += ' ' + oLang.sInfoFiltered;\n\t\t\t}\n\t\t\n\t\t\t// Convert the macros\n\t\t\tsOut += oLang.sInfoPostFix;\n\t\t\tsOut = _fnInfoMacros( oSettings, sOut );\n\t\t\t\n\t\t\tif ( oLang.fnInfoCallback !== null )\n\t\t\t{\n\t\t\t\tsOut = oLang.fnInfoCallback.call( oSettings.oInstance, \n\t\t\t\t\toSettings, iStart, iEnd, iMax, iTotal, sOut );\n\t\t\t}\n\t\t\t\n\t\t\tvar n = oSettings.aanFeatures.i;\n\t\t\tfor ( var i=0, iL
en=n.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t$(n[i]).html( sOut );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\tfunction _fnInfoMacros ( oSettings, str )\n\t\t{\n\t\t\tvar\n\t\t\t\tiStart = oSettings._iDisplayStart+1,\n\t\t\t\tsStart = oSettings.fnFormatNumber( iStart ),\n\t\t\t\tiEnd = oSettings.fnDisplayEnd(),\n\t\t\t\tsEnd = oSettings.fnFormatNumber( iEnd ),\n\t\t\t\tiTotal = oSettings.fnRecordsDisplay(),\n\t\t\t\tsTotal = oSettings.fnFormatNumber( iTotal ),\n\t\t\t\tiMax = oSettings.fnRecordsTotal(),\n\t\t\t\tsMax = oSettings.fnFormatNumber( iMax );\n\t\t\n\t\t\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t\t\t// internally\n\t\t\tif ( oSettings.oScroll.bInfinite )\n\t\t\t{\n\t\t\t\tsStart = oSettings.fnFormatNumber( 1 );\n\t\t\t}\n\t\t\n\t\t\treturn str.\n\t\t\t\treplace(/_START_/g, sStart).\n\t\t\t\treplace(/_END_/g, sEnd).\n\t\t\t\treplace(/_TOTAL_/g, sTotal).\n\t\t\t\treplace(/_MAX_/g, sMax);\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Draw the table for the first t
ime, adding all required features\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnInitialise ( oSettings )\n\t\t{\n\t\t\tvar i, iLen, iAjaxStart=oSettings.iInitDisplayStart;\n\t\t\t\n\t\t\t/* Ensure that the table data is fully initialised */\n\t\t\tif ( oSettings.bInitialised === false )\n\t\t\t{\n\t\t\t\tsetTimeout( function(){ _fnInitialise( oSettings ); }, 200 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Show the display HTML options */\n\t\t\t_fnAddOptionsHtml( oSettings );\n\t\t\t\n\t\t\t/* Build and draw the header / footer for the table */\n\t\t\t_fnBuildHead( oSettings );\n\t\t\t_fnDrawHead( oSettings, oSettings.aoHeader );\n\t\t\tif ( oSettings.nTFoot )\n\t\t\t{\n\t\t\t\t_fnDrawHead( oSettings, oSettings.aoFooter );\n\t\t\t}\n\t\t\n\t\t\t/* Okay to show that something is going on now */\n\t\t\t_fnProcessingDisplay( oSettings, true );\n\t\t\t\n\t\t\t/* Calculate sizes for columns */\n\t\t\tif ( oSettings.oFeatures.bAutoWidth
)\n\t\t\t{\n\t\t\t\t_fnCalculateColumnWidths( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoColumns[i].sWidth !== null )\n\t\t\t\t{\n\t\t\t\t\toSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* If there is default sorting required - let's do it. The sort function will do the\n\t\t\t * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows\n\t\t\t * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)\n\t\t\t */\n\t\t\tif ( oSettings.oFeatures.bSort )\n\t\t\t{\n\t\t\t\t_fnSort( oSettings );\n\t\t\t}\n\t\t\telse if ( oSettings.oFeatures.bFilter )\n\t\t\t{\n\t\t\t\t_fnFilterComplete( oSettings, oSettings.oPreviousSearch );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t_fnDraw( oSettings )
;\n\t\t\t}\n\t\t\t\n\t\t\t/* if there is an ajax source load the data */\n\t\t\tif ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )\n\t\t\t{\n\t\t\t\tvar aoData = [];\n\t\t\t\t_fnServerParams( oSettings, aoData );\n\t\t\t\toSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {\n\t\t\t\t\tvar aData = (oSettings.sAjaxDataProp !== \"\") ?\n\t\t\t\t\t \t_fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;\n\t\t\n\t\t\t\t\t/* Got the data - add it to the table */\n\t\t\t\t\tfor ( i=0 ; i<aData.length ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnAddData( oSettings, aData[i] );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/* Reset the init display for cookie saving. We've already done a filter, and\n\t\t\t\t\t * therefore cleared it before. So we need to make it appear 'fresh'\n\t\t\t\t\t */\n\t\t\t\t\toSettings.iInitDisplayStart = iAjaxStart;\n\t\t\t\t\t\n\t\t\t\t\tif ( oSettings.oFeatures.bSort )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnSort( oSettings );\n\t\t\t\t\t}\n\
t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t\t\t_fnDraw( oSettings );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t\t\t_fnInitComplete( oSettings, json );\n\t\t\t\t}, oSettings );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Server-side processing initialisation complete is done at the end of _fnDraw */\n\t\t\tif ( !oSettings.oFeatures.bServerSide )\n\t\t\t{\n\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t\t_fnInitComplete( oSettings );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Draw the table for the first time, adding all required features\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {object} [json] JSON from the server that completed the table, if using Ajax source\n\t\t * with client-side processing (optional)\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnInitComplete ( oSettings, json )\n\t\t{\n\t\t\t
oSettings._bInitComplete = true;\n\t\t\t_fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Language compatibility - when certain options are given, and others aren't, we\n\t\t * need to duplicate the values over, in order to provide backwards compatibility\n\t\t * with older language files.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnLanguageCompat( oLanguage )\n\t\t{\n\t\t\tvar oDefaults = DataTable.defaults.oLanguage;\n\t\t\n\t\t\t/* Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t\t * sZeroRecords - assuming that is given.\n\t\t\t */\n\t\t\tif ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&\n\t\t\t\toDefaults.sEmptyTable === \"No data available in table\" )\n\t\t\t{\n\t\t\t\t_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );\n\t\t\t}\n\t\t\n\t\t\t/* Likewise with loading records */\n\t\t\tif ( !oLanguage.sLoadingRe
cords && oLanguage.sZeroRecords &&\n\t\t\t\toDefaults.sLoadingRecords === \"Loading...\" )\n\t\t\t{\n\t\t\t\t_fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Generate the node required for user display length changing\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {node} Display length feature node\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFeatureHtmlLength ( oSettings )\n\t\t{\n\t\t\tif ( oSettings.oScroll.bInfinite )\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\t/* This can be overruled by not using the _MENU_ var/macro in the language variable */\n\t\t\tvar sName = 'name=\"'+oSettings.sTableId+'_length\"';\n\t\t\tvar sStdMenu = '<select size=\"1\" '+sName+'>';\n\t\t\tvar i, iLen;\n\t\t\tvar aLengthMenu = oSettings.aLengthMenu;\n\t\t\t\n\t\t\tif ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && \n\t\t\t\t\ttypeof aLengthMenu[1] === 'object' )\n\t\t\t{\n\t\t\t\tfo
r ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tsStdMenu += '<option value=\"'+aLengthMenu[0][i]+'\">'+aLengthMenu[1][i]+'</option>';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tsStdMenu += '<option value=\"'+aLengthMenu[i]+'\">'+aLengthMenu[i]+'</option>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tsStdMenu += '</select>';\n\t\t\t\n\t\t\tvar nLength = document.createElement( 'div' );\n\t\t\tif ( !oSettings.aanFeatures.l )\n\t\t\t{\n\t\t\t\tnLength.id = oSettings.sTableId+'_length';\n\t\t\t}\n\t\t\tnLength.className = oSettings.oClasses.sLength;\n\t\t\tnLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';\n\t\t\t\n\t\t\t/*\n\t\t\t * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,\n\t\t\t * and Stefan Skopnik for fixing the fix!\n\t\t\t */\n\t\t\t$('select option[value=\"'+oSettings._iDisplayLength+'\"]', nLength).attr(\"selected\",
true);\n\t\t\t\n\t\t\t$('select', nLength).bind( 'change.DT', function(e) {\n\t\t\t\tvar iVal = $(this).val();\n\t\t\t\t\n\t\t\t\t/* Update all other length options for the new display */\n\t\t\t\tvar n = oSettings.aanFeatures.l;\n\t\t\t\tfor ( i=0, iLen=n.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( n[i] != this.parentNode )\n\t\t\t\t\t{\n\t\t\t\t\t\t$('select', n[i]).val( iVal );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Redraw the table */\n\t\t\t\toSettings._iDisplayLength = parseInt(iVal, 10);\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t\n\t\t\t\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\t\t\t\tif ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;\n\t\t\t\t\tif ( oSettings._iDisplayStart < 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( oSettings._iDisplayLength == -1 )\n\t
\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t} );\n\t\t\n\t\t\n\t\t\t$('select', nLength).attr('aria-controls', oSettings.sTableId);\n\t\t\t\n\t\t\treturn nLength;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Recalculate the end point based on the start point\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnCalculateEnd( oSettings )\n\t\t{\n\t\t\tif ( oSettings.oFeatures.bPaginate === false )\n\t\t\t{\n\t\t\t\toSettings._iDisplayEnd = oSettings.aiDisplay.length;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Set the end point of the display - based on how many elements there are\n\t\t\t\t * still to display\n\t\t\t\t */\n\t\t\t\tif ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||\n\t\t\t\t\t oSettings._iDisplayLength == -1 )\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayEnd = oSettings.aiDisplay.length;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toSet
tings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t\t * Note that most of the paging logic is done in \n\t\t * DataTable.ext.oPagination\n\t\t */\n\t\t\n\t\t/**\n\t\t * Generate the node required for default pagination\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {node} Pagination feature node\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFeatureHtmlPaginate ( oSettings )\n\t\t{\n\t\t\tif ( oSettings.oScroll.bInfinite )\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\tvar nPaginate = document.createElement( 'div' );\n\t\t\tnPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;\n\t\t\t\n\t\t\tDataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, \n\t\t\t\tfunction( oSettings ) {\n\t\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t\t_fnDraw
( oSettings );\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\t\t\tif ( !oSettings.aanFeatures.p )\n\t\t\t{\n\t\t\t\toSettings.aoDrawCallback.push( {\n\t\t\t\t\t\"fn\": function( oSettings ) {\n\t\t\t\t\t\tDataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {\n\t\t\t\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t\t\t\t_fnDraw( oSettings );\n\t\t\t\t\t\t} );\n\t\t\t\t\t},\n\t\t\t\t\t\"sName\": \"pagination\"\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn nPaginate;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Alter the display settings to change the page\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t * or page number to jump to (integer)\n\t\t * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1\n\t\t * @memberof DataTable#oApi\n\t\
t */\n\t\tfunction _fnPageChange ( oSettings, mAction )\n\t\t{\n\t\t\tvar iOldStart = oSettings._iDisplayStart;\n\t\t\t\n\t\t\tif ( typeof mAction === \"number\" )\n\t\t\t{\n\t\t\t\toSettings._iDisplayStart = mAction * oSettings._iDisplayLength;\n\t\t\t\tif ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( mAction == \"first\" )\n\t\t\t{\n\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t}\n\t\t\telse if ( mAction == \"previous\" )\n\t\t\t{\n\t\t\t\toSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?\n\t\t\t\t\toSettings._iDisplayStart - oSettings._iDisplayLength :\n\t\t\t\t\t0;\n\t\t\t\t\n\t\t\t\t/* Correct for under-run */\n\t\t\t\tif ( oSettings._iDisplayStart < 0 )\n\t\t\t\t{\n\t\t\t\t oSettings._iDisplayStart = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( mAction == \"next\" )\n\t\t\t{\n\t\t\t\tif ( oSettings._iDisplayLength >= 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Make sure we are not over running the display array *
/\n\t\t\t\t\tif ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings._iDisplayStart += oSettings._iDisplayLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( mAction == \"last\" )\n\t\t\t{\n\t\t\t\tif ( oSettings._iDisplayLength >= 0 )\n\t\t\t\t{\n\t\t\t\t\tvar iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;\n\t\t\t\t\toSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_fnLog( oSettings, 0, \"Unknown paging action: \"+mAction );\n\t\t\t}\n\t\t\t$(oSettings.oInstance).trigger('page', oSettings);\n\t\t\t\n\t\t\treturn iOldStart != oSettings._iDisplayStart;\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Generate the node required for the processing node\n\t\t * @param {object} oSet
tings dataTables settings object\n\t\t * @returns {node} Processing element\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFeatureHtmlProcessing ( oSettings )\n\t\t{\n\t\t\tvar nProcessing = document.createElement( 'div' );\n\t\t\t\n\t\t\tif ( !oSettings.aanFeatures.r )\n\t\t\t{\n\t\t\t\tnProcessing.id = oSettings.sTableId+'_processing';\n\t\t\t}\n\t\t\tnProcessing.innerHTML = oSettings.oLanguage.sProcessing;\n\t\t\tnProcessing.className = oSettings.oClasses.sProcessing;\n\t\t\toSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );\n\t\t\t\n\t\t\treturn nProcessing;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Display or hide the processing indicator\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {bool} bShow Show the processing indicator (true) or not (false)\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnProcessingDisplay ( oSettings, bShow )\n\t\t{\n\t\t\tif ( oSettings.oFeatures.bProcessing )\n\t\t\t{\n\t\t\t\tvar an = oSettings.aanFeat
ures.r;\n\t\t\t\tfor ( var i=0, iLen=an.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tan[i].style.visibility = bShow ? \"visible\" : \"hidden\";\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t$(oSettings.oInstance).trigger('processing', [oSettings, bShow]);\n\t\t}\n\t\t\n\t\t/**\n\t\t * Add any control elements for the table - specifically scrolling\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {node} Node to add to the DOM\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnFeatureHtmlTable ( oSettings )\n\t\t{\n\t\t\t/* Check if scrolling is enabled or not - if not then leave the DOM unaltered */\n\t\t\tif ( oSettings.oScroll.sX === \"\" && oSettings.oScroll.sY === \"\" )\n\t\t\t{\n\t\t\t\treturn oSettings.nTable;\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * The HTML structure that we want to generate in this function is:\n\t\t\t * div - nScroller\n\t\t\t * div - nScrollHead\n\t\t\t * div - nScrollHeadInner\n\t\t\t * table - nScrollHeadTable\n\t\t\t * thead - nT
head\n\t\t\t * div - nScrollBody\n\t\t\t * table - oSettings.nTable\n\t\t\t * thead - nTheadSize\n\t\t\t * tbody - nTbody\n\t\t\t * div - nScrollFoot\n\t\t\t * div - nScrollFootInner\n\t\t\t * table - nScrollFootTable\n\t\t\t * tfoot - nTfoot\n\t\t\t */\n\t\t\tvar\n\t\t\t \tnScroller = document.createElement('div'),\n\t\t\t \tnScrollHead = document.createElement('div'),\n\t\t\t \tnScrollHeadInner = document.createElement('div'),\n\t\t\t \tnScrollBody = document.createElement('div'),\n\t\t\t \tnScrollFoot = document.createElement('div'),\n\t\t\t \tnScrollFootInner = document.createElement('div'),\n\t\t\t \tnScrollHeadTable = oSettings.nTable.cloneNode(false),\n\t\t\t \tnScrollFootTable = oSettings.nTable.cloneNode(false),\n\t\t\t\tnThead = oSettings.nTable.getElementsByTagName('thead')[0],\n\t\t\t \tnTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : \n\t\t\t\t\toSettings.nTable.getElementsByTagName('tfoot')[0],\n\t\t\t\toClasses = oSetti
ngs.oClasses;\n\t\t\t\n\t\t\tnScrollHead.appendChild( nScrollHeadInner );\n\t\t\tnScrollFoot.appendChild( nScrollFootInner );\n\t\t\tnScrollBody.appendChild( oSettings.nTable );\n\t\t\tnScroller.appendChild( nScrollHead );\n\t\t\tnScroller.appendChild( nScrollBody );\n\t\t\tnScrollHeadInner.appendChild( nScrollHeadTable );\n\t\t\tnScrollHeadTable.appendChild( nThead );\n\t\t\tif ( nTfoot !== null )\n\t\t\t{\n\t\t\t\tnScroller.appendChild( nScrollFoot );\n\t\t\t\tnScrollFootInner.appendChild( nScrollFootTable );\n\t\t\t\tnScrollFootTable.appendChild( nTfoot );\n\t\t\t}\n\t\t\t\n\t\t\tnScroller.className = oClasses.sScrollWrapper;\n\t\t\tnScrollHead.className = oClasses.sScrollHead;\n\t\t\tnScrollHeadInner.className = oClasses.sScrollHeadInner;\n\t\t\tnScrollBody.className = oClasses.sScrollBody;\n\t\t\tnScrollFoot.className = oClasses.sScrollFoot;\n\t\t\tnScrollFootInner.className = oClasses.sScrollFootInner;\n\t\t\t\n\t\t\tif ( oSettings.oScroll.bAutoCss )\n\t\t\t{\n\t\t\t\tnScrollHead.style.overflow = \"hid
den\";\n\t\t\t\tnScrollHead.style.position = \"relative\";\n\t\t\t\tnScrollFoot.style.overflow = \"hidden\";\n\t\t\t\tnScrollBody.style.overflow = \"auto\";\n\t\t\t}\n\t\t\t\n\t\t\tnScrollHead.style.border = \"0\";\n\t\t\tnScrollHead.style.width = \"100%\";\n\t\t\tnScrollFoot.style.border = \"0\";\n\t\t\tnScrollHeadInner.style.width = oSettings.oScroll.sXInner !== \"\" ?\n\t\t\t\toSettings.oScroll.sXInner : \"100%\"; /* will be overwritten */\n\t\t\t\n\t\t\t/* Modify attributes to respect the clones */\n\t\t\tnScrollHeadTable.removeAttribute('id');\n\t\t\tnScrollHeadTable.style.marginLeft = \"0\";\n\t\t\toSettings.nTable.style.marginLeft = \"0\";\n\t\t\tif ( nTfoot !== null )\n\t\t\t{\n\t\t\t\tnScrollFootTable.removeAttribute('id');\n\t\t\t\tnScrollFootTable.style.marginLeft = \"0\";\n\t\t\t}\n\t\t\t\n\t\t\t/* Move caption elements from the body to the header, footer or leave where it is\n\t\t\t * depending on the configuration. Note that the DTD says there can be only one caption */\n\t\t\tvar nCaption = $(
oSettings.nTable).children('caption');\n\t\t\tif ( nCaption.length > 0 )\n\t\t\t{\n\t\t\t\tnCaption = nCaption[0];\n\t\t\t\tif ( nCaption._captionSide === \"top\" )\n\t\t\t\t{\n\t\t\t\t\tnScrollHeadTable.appendChild( nCaption );\n\t\t\t\t}\n\t\t\t\telse if ( nCaption._captionSide === \"bottom\" && nTfoot )\n\t\t\t\t{\n\t\t\t\t\tnScrollFootTable.appendChild( nCaption );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Sizing\n\t\t\t */\n\t\t\t/* When x-scrolling add the width and a scroller to move the header with the body */\n\t\t\tif ( oSettings.oScroll.sX !== \"\" )\n\t\t\t{\n\t\t\t\tnScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );\n\t\t\t\tnScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );\n\t\t\t\t\n\t\t\t\tif ( nTfoot !== null )\n\t\t\t\t{\n\t\t\t\t\tnScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* When the body is scrolled, then we also want to scroll the headers */\n\t\t\t\t$(nScrollBody).scroll( function (e) {\n\t\t\t\
t\tnScrollHead.scrollLeft = this.scrollLeft;\n\t\t\t\t\t\n\t\t\t\t\tif ( nTfoot !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\tnScrollFoot.scrollLeft = this.scrollLeft;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\t/* When yscrolling, add the height */\n\t\t\tif ( oSettings.oScroll.sY !== \"\" )\n\t\t\t{\n\t\t\t\tnScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );\n\t\t\t}\n\t\t\t\n\t\t\t/* Redraw - align columns across the tables */\n\t\t\toSettings.aoDrawCallback.push( {\n\t\t\t\t\"fn\": _fnScrollDraw,\n\t\t\t\t\"sName\": \"scrolling\"\n\t\t\t} );\n\t\t\t\n\t\t\t/* Infinite scrolling event handlers */\n\t\t\tif ( oSettings.oScroll.bInfinite )\n\t\t\t{\n\t\t\t\t$(nScrollBody).scroll( function() {\n\t\t\t\t\t/* Use a blocker to stop scrolling from loading more data while other data is still loading */\n\t\t\t\t\tif ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Check if we should load the next data set */\n\t\t\t\t\t\tif ( $(this).scrollTop() + $(this).height() >
\n\t\t\t\t\t\t\t$(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* Only do the redraw if we have to - we might be at the end of the data */\n\t\t\t\t\t\t\tif ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_fnPageChange( oSettings, 'next' );\n\t\t\t\t\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t\t\t\t\t_fnDraw( oSettings );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\toSettings.nScrollHead = nScrollHead;\n\t\t\toSettings.nScrollFoot = nScrollFoot;\n\t\t\t\n\t\t\treturn nScroller;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Update the various tables for resizing. It's a bit of a pig this function, but\n\t\t * basically the idea to:\n\t\t * 1. Re-create the table inside the scrolling div\n\t\t * 2. Take live measurements from the DOM\n\t\t * 3. Apply the measurements\n\t\t * 4. Clean up\n\t\t * @param {object} o dataTables settings object\n\t\t * @returns {node} Node to add to the D
OM\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnScrollDraw ( o )\n\t\t{\n\t\t\tvar\n\t\t\t\tnScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],\n\t\t\t\tnScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],\n\t\t\t\tnScrollBody = o.nTable.parentNode,\n\t\t\t\ti, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,\n\t\t\t\tnTheadSize, nTfootSize,\n\t\t\t\tiWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,\n\t\t\t\tnScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,\n\t\t\t\tnScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,\n\t\t\t\tie67 = o.oBrowser.bScrollOversize,\n\t\t\t\tzeroOut = function(nSizer) {\n\t\t\t\t\toStyle = nSizer.style;\n\t\t\t\t\toStyle.paddingTop = \"0\";\n\t\t\t\t\toStyle.paddingBottom = \"0\";\n\t\t\t\t\toStyle.borderTopWidth = \"0\";\n\t\t\t\t\toStyle.borderBottomWidth = \"0\";\n\t\t\t\t\toStyle.height = 0;\n\t\t\t\t};\
n\t\t\t\n\t\t\t/*\n\t\t\t * 1. Re-create the table inside the scrolling div\n\t\t\t */\n\t\t\t\n\t\t\t/* Remove the old minimised thead and tfoot elements in the inner table */\n\t\t\t$(o.nTable).children('thead, tfoot').remove();\n\t\t\n\t\t\t/* Clone the current header and footer elements and then place it into the inner table */\n\t\t\tnTheadSize = $(o.nTHead).clone()[0];\n\t\t\to.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );\n\t\t\tanHeadToSize = o.nTHead.getElementsByTagName('tr');\n\t\t\tanHeadSizers = nTheadSize.getElementsByTagName('tr');\n\t\t\t\n\t\t\tif ( o.nTFoot !== null )\n\t\t\t{\n\t\t\t\tnTfootSize = $(o.nTFoot).clone()[0];\n\t\t\t\to.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );\n\t\t\t\tanFootToSize = o.nTFoot.getElementsByTagName('tr');\n\t\t\t\tanFootSizers = nTfootSize.getElementsByTagName('tr');\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t\t\t */\n\t\t\t\n\t\t\t/* Remove old sizing and apply the
calculated column widths\n\t\t\t * Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t\t\t * calculated sizes to this header\n\t\t\t */\n\t\t\tif ( o.oScroll.sX === \"\" )\n\t\t\t{\n\t\t\t\tnScrollBody.style.width = '100%';\n\t\t\t\tnScrollHeadInner.parentNode.style.width = '100%';\n\t\t\t}\n\t\t\t\n\t\t\tvar nThs = _fnGetUniqueThs( o, nTheadSize );\n\t\t\tfor ( i=0, iLen=nThs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tiVis = _fnVisibleToColumnIndex( o, i );\n\t\t\t\tnThs[i].style.width = o.aoColumns[iVis].sWidth;\n\t\t\t}\n\t\t\t\n\t\t\tif ( o.nTFoot !== null )\n\t\t\t{\n\t\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\t\tn.style.width = \"\";\n\t\t\t\t}, anFootSizers );\n\t\t\t}\n\t\t\n\t\t\t// If scroll collapse is enabled, when we put the headers back into the body for sizing, we\n\t\t\t// will end up forcing the scrollbar to appear, making our measurements wrong for when we\n\t\t\t// then hide it (end of this function), so add the header height to the body scroll
er.\n\t\t\tif ( o.oScroll.bCollapse && o.oScroll.sY !== \"\" )\n\t\t\t{\n\t\t\t\tnScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+\"px\";\n\t\t\t}\n\t\t\t\n\t\t\t/* Size the table as a whole */\n\t\t\tiSanityWidth = $(o.nTable).outerWidth();\n\t\t\tif ( o.oScroll.sX === \"\" )\n\t\t\t{\n\t\t\t\t/* No x scrolling */\n\t\t\t\to.nTable.style.width = \"100%\";\n\t\t\t\t\n\t\t\t\t/* I know this is rubbish - but IE7 will make the width of the table when 100% include\n\t\t\t\t * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this\n\t\t\t\t * into account.\n\t\t\t\t */\n\t\t\t\tif ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || \n\t\t\t\t\t$(nScrollBody).css('overflow-y') == \"scroll\") )\n\t\t\t\t{\n\t\t\t\t\to.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( o.oScroll.sXInner !== \"\" )\n\t\t\t\t{\n\t\t\t\t\t/* x scroll inner has been giv
en - use it */\n\t\t\t\t\to.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);\n\t\t\t\t}\n\t\t\t\telse if ( iSanityWidth == $(nScrollBody).width() &&\n\t\t\t\t $(nScrollBody).height() < $(o.nTable).height() )\n\t\t\t\t{\n\t\t\t\t\t/* There is y-scrolling - try to take account of the y scroll bar */\n\t\t\t\t\to.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );\n\t\t\t\t\tif ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Not possible to take account of it */\n\t\t\t\t\t\to.nTable.style.width = _fnStringToCss( iSanityWidth );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* All else fails */\n\t\t\t\t\to.nTable.style.width = _fnStringToCss( iSanityWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Recalculate the sanity width - now that we've applied the required width, before it was\n\t\t\t * a temporary variable. This is required because the column width calculation is done\n\t\t\t * before this table DOM is created.\n\t\t
\t */\n\t\t\tiSanityWidth = $(o.nTable).outerWidth();\n\t\t\t\n\t\t\t/* We want the hidden header to have zero height, so remove padding and borders. Then\n\t\t\t * set the width based on the real headers\n\t\t\t */\n\t\t\t\n\t\t\t// Apply all styles in one pass. Invalidates layout only once because we don't read any \n\t\t\t// DOM properties.\n\t\t\t_fnApplyToChildren( zeroOut, anHeadSizers );\n\t\t\t \n\t\t\t// Read all widths in next pass. Forces layout only once because we do not change \n\t\t\t// any DOM properties.\n\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\taApplied.push( _fnStringToCss( $(nSizer).width() ) );\n\t\t\t}, anHeadSizers );\n\t\t\t \n\t\t\t// Apply all widths in final pass. Invalidates layout only once because we do not\n\t\t\t// read any DOM properties.\n\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\tnToSize.style.width = aApplied[i];\n\t\t\t}, anHeadToSize );\n\t\t\n\t\t\t$(anHeadSizers).height(0);\n\t\t\t\n\t\t\t/* Same again with the footer if we have one */\n\t\t
\tif ( o.nTFoot !== null )\n\t\t\t{\n\t\t\t\t_fnApplyToChildren( zeroOut, anFootSizers );\n\t\t\t\t \n\t\t\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\t\t\taAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );\n\t\t\t\t}, anFootSizers );\n\t\t\t\t \n\t\t\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\t\t\tnToSize.style.width = aAppliedFooter[i];\n\t\t\t\t}, anFootToSize );\n\t\t\n\t\t\t\t$(anFootSizers).height(0);\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * 3. Apply the measurements\n\t\t\t */\n\t\t\t\n\t\t\t/* \"Hide\" the header and footer that we used for the sizing. We want to also fix their width\n\t\t\t * to what they currently are\n\t\t\t */\n\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\tnSizer.innerHTML = \"\";\n\t\t\t\tnSizer.style.width = aApplied[i];\n\t\t\t}, anHeadSizers );\n\t\t\t\n\t\t\tif ( o.nTFoot !== null )\n\t\t\t{\n\t\t\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\t\t\tnSizer.innerHTML = \"\";\n\t\t\t\t\tnSizer.style.width = aAppliedFooter[i];\n\t\t\t\t}, anFootS
izers );\n\t\t\t}\n\t\t\t\n\t\t\t/* Sanity check that the table is of a sensible width. If not then we are going to get\n\t\t\t * misalignment - try to prevent this by not allowing the table to shrink below its min width\n\t\t\t */\n\t\t\tif ( $(o.nTable).outerWidth() < iSanityWidth )\n\t\t\t{\n\t\t\t\t/* The min width depends upon if we have a vertical scrollbar visible or not */\n\t\t\t\tvar iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || \n\t\t\t\t\t$(nScrollBody).css('overflow-y') == \"scroll\")) ?\n\t\t\t\t\t\tiSanityWidth+o.oScroll.iBarWidth : iSanityWidth;\n\t\t\t\t\n\t\t\t\t/* IE6/7 are a law unto themselves... */\n\t\t\t\tif ( ie67 && (nScrollBody.scrollHeight > \n\t\t\t\t\tnScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == \"scroll\") )\n\t\t\t\t{\n\t\t\t\t\to.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Apply the calculated minimum width to the table wrappers */\n\t\t\t\tnScrollBody.style.width = _fnSt
ringToCss( iCorrection );\n\t\t\t\to.nScrollHead.style.width = _fnStringToCss( iCorrection );\n\t\t\t\t\n\t\t\t\tif ( o.nTFoot !== null )\n\t\t\t\t{\n\t\t\t\t\to.nScrollFoot.style.width = _fnStringToCss( iCorrection );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* And give the user a warning that we've stopped the table getting too small */\n\t\t\t\tif ( o.oScroll.sX === \"\" )\n\t\t\t\t{\n\t\t\t\t\t_fnLog( o, 1, \"The table cannot fit into the current element which will cause column\"+\n\t\t\t\t\t\t\" misalignment. The table has been drawn at its minimum possible width.\" );\n\t\t\t\t}\n\t\t\t\telse if ( o.oScroll.sXInner !== \"\" )\n\t\t\t\t{\n\t\t\t\t\t_fnLog( o, 1, \"The table cannot fit into the current element which will cause column\"+\n\t\t\t\t\t\t\" misalignment. Increase the sScrollXInner value or remove it to allow automatic\"+\n\t\t\t\t\t\t\" calculation\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnScrollBody.style.width = _fnStringToCss( '100%' );\n\t\t\t\to.nScrollHead.style.width = _fnStringToCs
s( '100%' );\n\t\t\t\t\n\t\t\t\tif ( o.nTFoot !== null )\n\t\t\t\t{\n\t\t\t\t\to.nScrollFoot.style.width = _fnStringToCss( '100%' );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t/*\n\t\t\t * 4. Clean up\n\t\t\t */\n\t\t\tif ( o.oScroll.sY === \"\" )\n\t\t\t{\n\t\t\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t\t\t */\n\t\t\t\tif ( ie67 )\n\t\t\t\t{\n\t\t\t\t\tnScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( o.oScroll.sY !== \"\" && o.oScroll.bCollapse )\n\t\t\t{\n\t\t\t\tnScrollBody.style.height = _fnStringToCss( o.oScroll.sY );\n\t\t\t\t\n\t\t\t\tvar iExtra = (o.oScroll.sX !== \"\" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?\n\t\t\t\t \to.oScroll.iBarWidth : 0;\n\t\t\t\tif ( o.nTable.offsetH
eight < nScrollBody.offsetHeight )\n\t\t\t\t{\n\t\t\t\t\tnScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Finally set the width's of the header and footer tables */\n\t\t\tvar iOuterWidth = $(o.nTable).outerWidth();\n\t\t\tnScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );\n\t\t\tnScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );\n\t\t\n\t\t\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t\t\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\t\t\tvar bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == \"scroll\";\n\t\t\tnScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+\"px\" : \"0px\";\n\t\t\t\n\t\t\tif ( o.nTFoot !== null )\n\t\t\t{\n\t\t\t\tnScrollFootTable.style.width = _fnStringToCss( iOuterWidth );\n\t\t\t\tnScrollFootInner.style.width = _fnStringToCss( iOuterWidth
);\n\t\t\t\tnScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+\"px\" : \"0px\";\n\t\t\t}\n\t\t\n\t\t\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\t\t\t$(nScrollBody).scroll();\n\t\t\t\n\t\t\t/* If sorting or filtering has occurred, jump the scrolling back to the top */\n\t\t\tif ( o.bSorted || o.bFiltered )\n\t\t\t{\n\t\t\t\tnScrollBody.scrollTop = 0;\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Apply a given function to the display child nodes of an element array (typically\n\t\t * TD children of TR rows\n\t\t * @param {function} fn Method to apply to the objects\n\t\t * @param array {nodes} an1 List of elements to look through for display children\n\t\t * @param array {nodes} an2 Another list (identical structure to the first) - optional\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnApplyToChildren( fn, an1, an2 )\n\t\t{\n\t\t\tvar index=0, i=0, iLen=an1.length;\n\t\t\tvar nNode1, nNode2;\n\t\t\n\t\t\twhile ( i < iLen )\n\t\t\t{\n\t\t\t\
tnNode1 = an1[i].firstChild;\n\t\t\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\t\t\t\twhile ( nNode1 )\n\t\t\t\t{\n\t\t\t\t\tif ( nNode1.nodeType === 1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( an2 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tindex++;\n\t\t\t\t\t}\n\t\t\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/**\n\t\t * Convert a CSS unit width to pixels (e.g. 2em)\n\t\t * @param {string} sWidth width to be converted\n\t\t * @param {node} nParent parent to get the with for (required for relative widths) - optional\n\t\t * @returns {int} iWidth width in pixels\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnConvertToWidth ( sWidth, nParent )\n\t\t{\n\t\t\tif ( !sWidth || sWidth === null || sWidth === '' )\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\t\n\t\t\tif ( !nParent )\n\t\t
\t{\n\t\t\t\tnParent = document.body;\n\t\t\t}\n\t\t\t\n\t\t\tvar iWidth;\n\t\t\tvar nTmp = document.createElement( \"div\" );\n\t\t\tnTmp.style.width = _fnStringToCss( sWidth );\n\t\t\t\n\t\t\tnParent.appendChild( nTmp );\n\t\t\tiWidth = nTmp.offsetWidth;\n\t\t\tnParent.removeChild( nTmp );\n\t\t\t\n\t\t\treturn ( iWidth );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Calculate the width of columns for the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnCalculateColumnWidths ( oSettings )\n\t\t{\n\t\t\tvar iTableWidth = oSettings.nTable.offsetWidth;\n\t\t\tvar iUserInputs = 0;\n\t\t\tvar iTmpWidth;\n\t\t\tvar iVisibleColumns = 0;\n\t\t\tvar iColums = oSettings.aoColumns.length;\n\t\t\tvar i, iIndex, iCorrector, iWidth;\n\t\t\tvar oHeaders = $('th', oSettings.nTHead);\n\t\t\tvar widthAttr = oSettings.nTable.getAttribute('width');\n\t\t\tvar nWrapper = oSettings.nTable.parentNode;\n\t\t\t\n\t\t\t/* Convert any user input sizes into pixel s
izes */\n\t\t\tfor ( i=0 ; i<iColums ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoColumns[i].bVisible )\n\t\t\t\t{\n\t\t\t\t\tiVisibleColumns++;\n\t\t\t\t\t\n\t\t\t\t\tif ( oSettings.aoColumns[i].sWidth !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\tiTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, \n\t\t\t\t\t\t\tnWrapper );\n\t\t\t\t\t\tif ( iTmpWidth !== null )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tiUserInputs++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* If the number of columns in the DOM equals the number that we have to process in \n\t\t\t * DataTables, then we can use the offsets that are created by the web-browser. No custom \n\t\t\t * sizes can be set in order for this to happen, nor scrolling used\n\t\t\t */\n\t\t\tif ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&\n\t\t\t\toSettings.oScroll.sX === \"\" && oSettings.oScroll.sY === \"\" )\n\t\t\t{\n\t\t\t\t
for ( i=0 ; i<oSettings.aoColumns.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\tiTmpWidth = $(oHeaders[i]).width();\n\t\t\t\t\tif ( iTmpWidth !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Otherwise we are going to have to do some calculations to get the width of each column.\n\t\t\t\t * Construct a 1 row table with the widest node in the data, and any user defined widths,\n\t\t\t\t * then insert it into the DOM and allow the browser to do all the hard work of\n\t\t\t\t * calculating table widths.\n\t\t\t\t */\n\t\t\t\tvar\n\t\t\t\t\tnCalcTmp = oSettings.nTable.cloneNode( false ),\n\t\t\t\t\tnTheadClone = oSettings.nTHead.cloneNode(true),\n\t\t\t\t\tnBody = document.createElement( 'tbody' ),\n\t\t\t\t\tnTr = document.createElement( 'tr' ),\n\t\t\t\t\tnDivSizing;\n\t\t\t\t\n\t\t\t\tnCalcTmp.removeAttribute( \"id\" );\n\t\t\t\tnCalcTmp.appendChild( nTheadClone );\n\t\t\t\tif ( oSettings.nTFoot !== null )
\n\t\t\t\t{\n\t\t\t\t\tnCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );\n\t\t\t\t\t_fnApplyToChildren( function(n) {\n\t\t\t\t\t\tn.style.width = \"\";\n\t\t\t\t\t}, nCalcTmp.getElementsByTagName('tr') );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tnCalcTmp.appendChild( nBody );\n\t\t\t\tnBody.appendChild( nTr );\n\t\t\t\t\n\t\t\t\t/* Remove any sizing that was previously applied by the styles */\n\t\t\t\tvar jqColSizing = $('thead th', nCalcTmp);\n\t\t\t\tif ( jqColSizing.length === 0 )\n\t\t\t\t{\n\t\t\t\t\tjqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);\n\t\t\t\t}\n\t\t\n\t\t\t\t/* Apply custom sizing to the cloned header */\n\t\t\t\tvar nThs = _fnGetUniqueThs( oSettings, nTheadClone );\n\t\t\t\tiCorrector = 0;\n\t\t\t\tfor ( i=0 ; i<iColums ; i++ )\n\t\t\t\t{\n\t\t\t\t\tvar oColumn = oSettings.aoColumns[i];\n\t\t\t\t\tif ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== \"\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tnThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );\n\t\t\t\t\t
}\n\t\t\t\t\telse if ( oColumn.bVisible )\n\t\t\t\t\t{\n\t\t\t\t\t\tnThs[i-iCorrector].style.width = \"\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tiCorrector++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\t/* Find the biggest td for each column and put it into the table */\n\t\t\t\tfor ( i=0 ; i<iColums ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( oSettings.aoColumns[i].bVisible )\n\t\t\t\t\t{\n\t\t\t\t\t\tvar nTd = _fnGetWidestNode( oSettings, i );\n\t\t\t\t\t\tif ( nTd !== null )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnTd = nTd.cloneNode(true);\n\t\t\t\t\t\t\tif ( oSettings.aoColumns[i].sContentPadding !== \"\" )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnTd.innerHTML += oSettings.aoColumns[i].sContentPadding;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnTr.appendChild( nTd );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Build the table and 'display' it */\n\t\t\t\tnWrapper.appendChild( nCalcTmp );\n\t\t\t\t\n\t\t\t\t/* When scrolling (X or Y) we want to set the width of the table as appropriate. However,\n\t\t\t\t * wh
en not scrolling leave the table width as it is. This results in slightly different,\n\t\t\t\t * but I think correct behaviour\n\t\t\t\t */\n\t\t\t\tif ( oSettings.oScroll.sX !== \"\" && oSettings.oScroll.sXInner !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tnCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);\n\t\t\t\t}\n\t\t\t\telse if ( oSettings.oScroll.sX !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tnCalcTmp.style.width = \"\";\n\t\t\t\t\tif ( $(nCalcTmp).width() < nWrapper.offsetWidth )\n\t\t\t\t\t{\n\t\t\t\t\t\tnCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( oSettings.oScroll.sY !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tnCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );\n\t\t\t\t}\n\t\t\t\telse if ( widthAttr )\n\t\t\t\t{\n\t\t\t\t\tnCalcTmp.style.width = _fnStringToCss( widthAttr );\n\t\t\t\t}\n\t\t\t\tnCalcTmp.style.visibility = \"hidden\";\n\t\t\t\t\n\t\t\t\t/* Scrolling considerations */\n\t\t\t\t_fnScrollingWidthAdjust( oSettings, nCalcTmp );\n\t\t
\t\t\n\t\t\t\t/* Read the width's calculated by the browser and store them for use by the caller. We\n\t\t\t\t * first of all try to use the elements in the body, but it is possible that there are\n\t\t\t\t * no elements there, under which circumstances we use the header elements\n\t\t\t\t */\n\t\t\t\tvar oNodes = $(\"tbody tr:eq(0)\", nCalcTmp).children();\n\t\t\t\tif ( oNodes.length === 0 )\n\t\t\t\t{\n\t\t\t\t\toNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );\n\t\t\t\t}\n\t\t\n\t\t\t\t/* Browsers need a bit of a hand when a width is assigned to any columns when \n\t\t\t\t * x-scrolling as they tend to collapse the table to the min-width, even if\n\t\t\t\t * we sent the column widths. So we need to keep track of what the table width\n\t\t\t\t * should be by summing the user given values, and the automatic values\n\t\t\t\t */\n\t\t\t\tif ( oSettings.oScroll.sX !== \"\" )\n\t\t\t\t{\n\t\t\t\t\tvar iTotal = 0;\n\t\t\t\t\tiCorrector = 0;\n\t\t\t\t\tfor ( i=0 ; i<oSettings.aoColumns.length ; i++
)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( oSettings.aoColumns[i].bVisible )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( oSettings.aoColumns[i].sWidthOrig === null )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tiTotal += $(oNodes[iCorrector]).outerWidth();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tiTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +\n\t\t\t\t\t\t\t\t\t($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tiCorrector++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tnCalcTmp.style.width = _fnStringToCss( iTotal );\n\t\t\t\t\toSettings.nTable.style.width = _fnStringToCss( iTotal );\n\t\t\t\t}\n\t\t\n\t\t\t\tiCorrector = 0;\n\t\t\t\tfor ( i=0 ; i<oSettings.aoColumns.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( oSettings.aoColumns[i].bVisible )\n\t\t\t\t\t{\n\t\t\t\t\t\tiWidth = $(oNodes[iCorrector]).width();\n\t\t\t\t\t\tif ( iWidth !== null && iWidth > 0 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toSettings.aoColumns[i].sWidth = _fnStringT
oCss( iWidth );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tiCorrector++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\tvar cssWidth = $(nCalcTmp).css('width');\n\t\t\t\toSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?\n\t\t\t\t cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );\n\t\t\t\tnCalcTmp.parentNode.removeChild( nCalcTmp );\n\t\t\t}\n\t\t\n\t\t\tif ( widthAttr )\n\t\t\t{\n\t\t\t\toSettings.nTable.style.width = _fnStringToCss( widthAttr );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Adjust a table's width to take account of scrolling\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {node} n table node\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnScrollingWidthAdjust ( oSettings, n )\n\t\t{\n\t\t\tif ( oSettings.oScroll.sX === \"\" && oSettings.oScroll.sY !== \"\" )\n\t\t\t{\n\t\t\t\t/* When y-scrolling only, we want to remove the width of the scroll bar so the table\n\t\t\t\t * + scroll bar will fit into the area avaialble.\n\t\t\t\t */\n\t\t\t\tvar iOrigWid
th = $(n).width();\n\t\t\t\tn.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );\n\t\t\t}\n\t\t\telse if ( oSettings.oScroll.sX !== \"\" )\n\t\t\t{\n\t\t\t\t/* When x-scrolling both ways, fix the table at it's current size, without adjusting */\n\t\t\t\tn.style.width = _fnStringToCss( $(n).outerWidth() );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the widest node\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iCol column of interest\n\t\t * @returns {node} widest table node\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetWidestNode( oSettings, iCol )\n\t\t{\n\t\t\tvar iMaxIndex = _fnGetMaxLenString( oSettings, iCol );\n\t\t\tif ( iMaxIndex < 0 )\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\n\t\t\tif ( oSettings.aoData[iMaxIndex].nTr === null )\n\t\t\t{\n\t\t\t\tvar n = document.createElement('td');\n\t\t\t\tn.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );\n\t\t\t\treturn n;\n\t\t\t}\n\t\t\treturn _fnGetTdNo
des(oSettings, iMaxIndex)[iCol];\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the maximum strlen for each data column\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iCol column of interest\n\t\t * @returns {string} max string length for each column\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetMaxLenString( oSettings, iCol )\n\t\t{\n\t\t\tvar iMax = -1;\n\t\t\tvar iMaxIndex = -1;\n\t\t\t\n\t\t\tfor ( var i=0 ; i<oSettings.aoData.length ; i++ )\n\t\t\t{\n\t\t\t\tvar s = _fnGetCellData( oSettings, i, iCol, 'display' )+\"\";\n\t\t\t\ts = s.replace( /<.*?>/g, \"\" );\n\t\t\t\tif ( s.length > iMax )\n\t\t\t\t{\n\t\t\t\t\tiMax = s.length;\n\t\t\t\t\tiMaxIndex = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn iMaxIndex;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Append a CSS unit (only if required) to a string\n\t\t * @param {array} aArray1 first array\n\t\t * @param {array} aArray2 second array\n\t\t * @returns {int} 0 if match, 1 if length is different, 2 if no match\n\t
\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnStringToCss( s )\n\t\t{\n\t\t\tif ( s === null )\n\t\t\t{\n\t\t\t\treturn \"0px\";\n\t\t\t}\n\t\t\t\n\t\t\tif ( typeof s == 'number' )\n\t\t\t{\n\t\t\t\tif ( s < 0 )\n\t\t\t\t{\n\t\t\t\t\treturn \"0px\";\n\t\t\t\t}\n\t\t\t\treturn s+\"px\";\n\t\t\t}\n\t\t\t\n\t\t\t/* Check if the last character is not 0-9 */\n\t\t\tvar c = s.charCodeAt( s.length-1 );\n\t\t\tif (c < 0x30 || c > 0x39)\n\t\t\t{\n\t\t\t\treturn s;\n\t\t\t}\n\t\t\treturn s+\"px\";\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the width of a scroll bar in this browser being used\n\t\t * @returns {int} width in pixels\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnScrollBarWidth ()\n\t\t{ \n\t\t\tvar inner = document.createElement('p');\n\t\t\tvar style = inner.style;\n\t\t\tstyle.width = \"100%\";\n\t\t\tstyle.height = \"200px\";\n\t\t\tstyle.padding = \"0px\";\n\t\t\t\n\t\t\tvar outer = document.createElement('div');\n\t\t\tstyle = outer.style;\n\t\t\tstyle.position = \"absolute\";
\n\t\t\tstyle.top = \"0px\";\n\t\t\tstyle.left = \"0px\";\n\t\t\tstyle.visibility = \"hidden\";\n\t\t\tstyle.width = \"200px\";\n\t\t\tstyle.height = \"150px\";\n\t\t\tstyle.padding = \"0px\";\n\t\t\tstyle.overflow = \"hidden\";\n\t\t\touter.appendChild(inner);\n\t\t\t\n\t\t\tdocument.body.appendChild(outer);\n\t\t\tvar w1 = inner.offsetWidth;\n\t\t\touter.style.overflow = 'scroll';\n\t\t\tvar w2 = inner.offsetWidth;\n\t\t\tif ( w1 == w2 )\n\t\t\t{\n\t\t\t\tw2 = outer.clientWidth;\n\t\t\t}\n\t\t\t\n\t\t\tdocument.body.removeChild(outer);\n\t\t\treturn (w1 - w2); \n\t\t}\n\t\t\n\t\t/**\n\t\t * Change the order of the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {bool} bApplyClasses optional - should we apply classes or not\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnSort ( oSettings, bApplyClasses )\n\t\t{\n\t\t\tvar\n\t\t\t\ti, iLen, j, jLen, k, kLen,\n\t\t\t\tsDataType, nTh,\n\t\t\t\taaSort = [],\n\t\t\t \taiOrig = [],\n\t\t\t\toSort = DataTable.ext.oS
ort,\n\t\t\t\taoData = oSettings.aoData,\n\t\t\t\taoColumns = oSettings.aoColumns,\n\t\t\t\toAria = oSettings.oLanguage.oAria;\n\t\t\t\n\t\t\t/* No sorting required if server-side or no sorting array */\n\t\t\tif ( !oSettings.oFeatures.bServerSide && \n\t\t\t\t(oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )\n\t\t\t{\n\t\t\t\taaSort = ( oSettings.aaSortingFixed !== null ) ?\n\t\t\t\t\toSettings.aaSortingFixed.concat( oSettings.aaSorting ) :\n\t\t\t\t\toSettings.aaSorting.slice();\n\t\t\t\t\n\t\t\t\t/* If there is a sorting data type, and a function belonging to it, then we need to\n\t\t\t\t * get the data from the developer's function and apply it for this column\n\t\t\t\t */\n\t\t\t\tfor ( i=0 ; i<aaSort.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\tvar iColumn = aaSort[i][0];\n\t\t\t\t\tvar iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );\n\t\t\t\t\tsDataType = oSettings.aoColumns[ iColumn ].sSortDataType;\n\t\t\t\t\tif ( DataTable.ext.afnSortData[sDataType] )\n\t\t\t\t\t{\n\t\t\
t\t\t\tvar aData = DataTable.ext.afnSortData[sDataType].call( \n\t\t\t\t\t\t\toSettings.oInstance, oSettings, iColumn, iVisColumn\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( aData.length === aoData.length )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfor ( j=0, jLen=aoData.length ; j<jLen ; j++ )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_fnSetCellData( oSettings, j, iColumn, aData[j] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnLog( oSettings, 0, \"Returned data sort array (col \"+iColumn+\") is the wrong length\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Create a value - key array of the current row positions such that we can use their\n\t\t\t\t * current position during the sort, if values match, in order to perform stable sorting\n\t\t\t\t */\n\t\t\t\tfor ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taiOrig[ oSettings.aiDisplayMaster[i] ] = i;\n\t\t\t\t}\n\t\t\n\t\t\t\t/* Build an internal data array which is specific to the sort, so we
can get and prep\n\t\t\t\t * the data to be sorted only once, rather than needing to do it every time the sorting\n\t\t\t\t * function runs. This make the sorting function a very simple comparison\n\t\t\t\t */\n\t\t\t\tvar iSortLen = aaSort.length;\n\t\t\t\tvar fnSortFormat, aDataSort;\n\t\t\t\tfor ( i=0, iLen=aoData.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tfor ( j=0 ; j<iSortLen ; j++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taDataSort = aoColumns[ aaSort[j][0] ].aDataSort;\n\t\t\n\t\t\t\t\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsDataType = aoColumns[ aDataSort[k] ].sType;\n\t\t\t\t\t\t\tfnSortFormat = oSort[ (sDataType ? sDataType : 'string')+\"-pre\" ];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\taoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?\n\t\t\t\t\t\t\t\tfnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :\n\t\t\t\t\t\t\t\t_fnGetCellData( oSettings, i, aDataSort[k], 'sort' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Do the sort - here
we want multi-column sorting based on a given data source (column)\n\t\t\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t\t\t * fnLocalSorting = function(a,b){\n\t\t\t\t * \tvar iTest;\n\t\t\t\t * \tiTest = oSort['string-asc']('data11', 'data12');\n\t\t\t\t * \tif (iTest !== 0)\n\t\t\t\t * \t\treturn iTest;\n\t\t\t\t * iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t\t\t * if (iTest !== 0)\n\t\t\t\t * \t\treturn iTest;\n\t\t\t\t * \treturn oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t\t * }\n\t\t\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t\t\t * test the next column. If all columns match, then we use a numeric sort on the row \n\t\t\t\t * positions in the original data array to provide a stable sort.\n\t\t\t\t */\n\t\t\t\toSettings.aiDisplayMaster.sort( function ( a, b ) {\n\t\t\t\t\tvar k,
l, lLen, iTest, aDataSort, sDataType;\n\t\t\t\t\tfor ( k=0 ; k<iSortLen ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taDataSort = aoColumns[ aaSort[k][0] ].aDataSort;\n\t\t\n\t\t\t\t\t\tfor ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsDataType = aoColumns[ aDataSort[l] ].sType;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tiTest = oSort[ (sDataType ? sDataType : 'string')+\"-\"+aaSort[k][1] ](\n\t\t\t\t\t\t\t\taoData[a]._aSortData[ aDataSort[l] ],\n\t\t\t\t\t\t\t\taoData[b]._aSortData[ aDataSort[l] ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tif ( iTest !== 0 )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn iTest;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\t/* Alter the sorting classes to take account of the changes */\n\t\t\tif ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )\n\t\t\t{\n\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t}\n\t\t\n\t\t\tfor (
i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tvar sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, \"\" );\n\t\t\t\tnTh = aoColumns[i].nTh;\n\t\t\t\tnTh.removeAttribute('aria-sort');\n\t\t\t\tnTh.removeAttribute('aria-label');\n\t\t\t\t\n\t\t\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\t\t\tif ( aoColumns[i].bSortable )\n\t\t\t\t{\n\t\t\t\t\tif ( aaSort.length > 0 && aaSort[0][0] == i )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTh.setAttribute('aria-sort', aaSort[0][1]==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? \n\t\t\t\t\t\t\taoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];\n\t\t\t\t\t\tnTh.setAttribute('aria-label', sTitle+\n\t\t\t\t\t\t\t(nextSort==\"asc\" ? oAria.sSortAscending : oAria.sSortDescending) );\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tnTh.setAttribute('aria-label', sTitle+\n\t\t\t\t\t\t\t(aoColumns[i].asSort
ing[0]==\"asc\" ? oAria.sSortAscending : oAria.sSortDescending) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnTh.setAttribute('aria-label', sTitle);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Tell the draw function that we have sorted the data */\n\t\t\toSettings.bSorted = true;\n\t\t\t$(oSettings.oInstance).trigger('sort', oSettings);\n\t\t\t\n\t\t\t/* Copy the master data into the draw array and re-draw */\n\t\t\tif ( oSettings.oFeatures.bFilter )\n\t\t\t{\n\t\t\t\t/* _fnFilter() will redraw the table for us */\n\t\t\t\t_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\toSettings._iDisplayStart = 0; /* reset display back to page 0 */\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Attach a sort handler (click) to a node\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {node} nNode node
to attach the handler to\n\t\t * @param {int} iDataIndex column sorting index\n\t\t * @param {function} [fnCallback] callback function\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )\n\t\t{\n\t\t\t_fnBindAction( nNode, {}, function (e) {\n\t\t\t\t/* If the column is not sortable - don't to anything */\n\t\t\t\tif ( oSettings.aoColumns[iDataIndex].bSortable === false )\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/*\n\t\t\t\t * This is a little bit odd I admit... I declare a temporary function inside the scope of\n\t\t\t\t * _fnBuildHead and the click handler in order that the code presented here can be used \n\t\t\t\t * twice - once for when bProcessing is enabled, and another time for when it is \n\t\t\t\t * disabled, as we need to perform slightly different actions.\n\t\t\t\t * Basically the issue here is that the Javascript engine in modern browsers don't \n\t\t\t\t * appear to allow the rendering engine to upd
ate the display while it is still executing\n\t\t\t\t * it's thread (well - it does but only after long intervals). This means that the \n\t\t\t\t * 'processing' display doesn't appear for a table sort. To break the js thread up a bit\n\t\t\t\t * I force an execution break by using setTimeout - but this breaks the expected \n\t\t\t\t * thread continuation for the end-developer's point of view (their code would execute\n\t\t\t\t * too early), so we only do it when we absolutely have to.\n\t\t\t\t */\n\t\t\t\tvar fnInnerSorting = function () {\n\t\t\t\t\tvar iColumn, iNextSort;\n\t\t\t\t\t\n\t\t\t\t\t/* If the shift key is pressed then we are multiple column sorting */\n\t\t\t\t\tif ( e.shiftKey )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Are we already doing some kind of sort on this column? */\n\t\t\t\t\t\tvar bFound = false;\n\t\t\t\t\t\tfor ( var i=0 ; i<oSettings.aaSorting.length ; i++ )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ( oSettings.aaSorting[i][0] == iDataIndex )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbFound = true;\n\t\t\
t\t\t\t\t\tiColumn = oSettings.aaSorting[i][0];\n\t\t\t\t\t\t\t\tiNextSort = oSettings.aaSorting[i][2]+1;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* Reached the end of the sorting options, remove from multi-col sort */\n\t\t\t\t\t\t\t\t\toSettings.aaSorting.splice( i, 1 );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* Move onto next sorting direction */\n\t\t\t\t\t\t\t\t\toSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];\n\t\t\t\t\t\t\t\t\toSettings.aaSorting[i][2] = iNextSort;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* No sort yet - add it in */\n\t\t\t\t\t\tif ( bFound === false )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toSettings.aaSorting.push( [ iDataIndex, \n\t\t\t\t\t\t\t\toSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t/* I
f no shift key then single column sort */\n\t\t\t\t\t\tif ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiColumn = oSettings.aaSorting[0][0];\n\t\t\t\t\t\t\tiNextSort = oSettings.aaSorting[0][2]+1;\n\t\t\t\t\t\t\tif ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tiNextSort = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\toSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];\n\t\t\t\t\t\t\toSettings.aaSorting[0][2] = iNextSort;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toSettings.aaSorting.splice( 0, oSettings.aaSorting.length );\n\t\t\t\t\t\t\toSettings.aaSorting.push( [ iDataIndex, \n\t\t\t\t\t\t\t\toSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/* Run the sort */\n\t\t\t\t\t_fnSort( oSettings );\n\t\t\t\t}; /* /fnInnerSorting */\n\t\t\t\t\n\t\t\t\tif ( !oSettings.oFeatures.bProcessing )\n\t\t\t\t{\n\t\t\t\t\tfnInnerS
orting();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_fnProcessingDisplay( oSettings, true );\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tfnInnerSorting();\n\t\t\t\t\t\tif ( !oSettings.oFeatures.bServerSide )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 0 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Call the user specified callback function - used for async user interaction */\n\t\t\t\tif ( typeof fnCallback == 'function' )\n\t\t\t\t{\n\t\t\t\t\tfnCallback( oSettings );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Set the sorting classes on the header, Note: it is safe to call this function \n\t\t * when bSort and bSortClasses are false\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnSortingClasses( oSettings )\n\t\t{\n\t\t\tvar i, iLen, j, jLen, iFound;\n\t\t\tvar aaSort, sClass;\n\t\t\tvar iColumns = oSettings.aoColumns.length;\n\t\t\tvar oClasses = oSettings.oClas
ses;\n\t\t\t\n\t\t\tfor ( i=0 ; i<iColumns ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoColumns[i].bSortable )\n\t\t\t\t{\n\t\t\t\t\t$(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +\" \"+ oClasses.sSortDesc +\n\t\t\t\t\t\t\" \"+ oSettings.aoColumns[i].sSortingClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( oSettings.aaSortingFixed !== null )\n\t\t\t{\n\t\t\t\taaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taaSort = oSettings.aaSorting.slice();\n\t\t\t}\n\t\t\t\n\t\t\t/* Apply the required classes to the header */\n\t\t\tfor ( i=0 ; i<oSettings.aoColumns.length ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoColumns[i].bSortable )\n\t\t\t\t{\n\t\t\t\t\tsClass = oSettings.aoColumns[i].sSortingClass;\n\t\t\t\t\tiFound = -1;\n\t\t\t\t\tfor ( j=0 ; j<aaSort.length ; j++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( aaSort[j][0] == i )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsClass = ( aaSort[j][1] == \"asc\" ) ?\n\t\t\t\t\t\t\t\toClasses.sSortAsc : oClasses.sSortDesc;\n\t\
t\t\t\t\t\tiFound = j;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$(oSettings.aoColumns[i].nTh).addClass( sClass );\n\t\t\t\t\t\n\t\t\t\t\tif ( oSettings.bJUI )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* jQuery UI uses extra markup */\n\t\t\t\t\t\tvar jqSpan = $(\"span.\"+oClasses.sSortIcon, oSettings.aoColumns[i].nTh);\n\t\t\t\t\t\tjqSpan.removeClass(oClasses.sSortJUIAsc +\" \"+ oClasses.sSortJUIDesc +\" \"+ \n\t\t\t\t\t\t\toClasses.sSortJUI +\" \"+ oClasses.sSortJUIAscAllowed +\" \"+ oClasses.sSortJUIDescAllowed );\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar sSpanClass;\n\t\t\t\t\t\tif ( iFound == -1 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t \tsSpanClass = oSettings.aoColumns[i].sSortingClassJUI;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( aaSort[iFound][1] == \"asc\" )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsSpanClass = oClasses.sSortJUIAsc;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsSpanClass = oClasses.sSortJUIDesc;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tjqSpan.addClass( sSpanClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\
t\t\telse\n\t\t\t\t{\n\t\t\t\t\t/* No sorting on this column, so add the base class. This will have been assigned by\n\t\t\t\t\t * _fnAddColumn\n\t\t\t\t\t */\n\t\t\t\t\t$(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* \n\t\t\t * Apply the required classes to the table body\n\t\t\t * Note that this is given as a feature switch since it can significantly slow down a sort\n\t\t\t * on large data sets (adding and removing of classes is always slow at the best of times..)\n\t\t\t * Further to this, note that this code is admittedly fairly ugly. It could be made a lot \n\t\t\t * simpler using jQuery selectors and add/removeClass, but that is significantly slower\n\t\t\t * (on the order of 5 times slower) - hence the direct DOM manipulation here.\n\t\t\t * Note that for deferred drawing we do use jQuery - the reason being that taking the first\n\t\t\t * row found to see if the whole column needs processed can miss classes since the first\n\t\t\t
* column might be new.\n\t\t\t */\n\t\t\tsClass = oClasses.sSortColumn;\n\t\t\t\n\t\t\tif ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )\n\t\t\t{\n\t\t\t\tvar nTds = _fnGetTdNodes( oSettings );\n\t\t\t\t\n\t\t\t\t/* Determine what the sorting class for each column should be */\n\t\t\t\tvar iClass, iTargetCol;\n\t\t\t\tvar asClasses = [];\n\t\t\t\tfor (i = 0; i < iColumns; i++)\n\t\t\t\t{\n\t\t\t\t\tasClasses.push(\"\");\n\t\t\t\t}\n\t\t\t\tfor (i = 0, iClass = 1; i < aaSort.length; i++)\n\t\t\t\t{\n\t\t\t\t\tiTargetCol = parseInt( aaSort[i][0], 10 );\n\t\t\t\t\tasClasses[iTargetCol] = sClass + iClass;\n\t\t\t\t\t\n\t\t\t\t\tif ( iClass < 3 )\n\t\t\t\t\t{\n\t\t\t\t\t\tiClass++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Make changes to the classes for each cell as needed */\n\t\t\t\tvar reClass = new RegExp(sClass + \"[123]\");\n\t\t\t\tvar sTmpClass, sCurrentClass, sNewClass;\n\t\t\t\tfor ( i=0, iLen=nTds.length; i<iLen; i++ )\n\t\t\t\t{\n\t\t\t\t\t/* Determine which column we're lookin
g at */\n\t\t\t\t\tiTargetCol = i % iColumns;\n\t\t\t\t\t\n\t\t\t\t\t/* What is the full list of classes now */\n\t\t\t\t\tsCurrentClass = nTds[i].className;\n\t\t\t\t\t/* What sorting class should be applied? */\n\t\t\t\t\tsNewClass = asClasses[iTargetCol];\n\t\t\t\t\t/* What would the new full list be if we did a replacement? */\n\t\t\t\t\tsTmpClass = sCurrentClass.replace(reClass, sNewClass);\n\t\t\t\t\t\n\t\t\t\t\tif ( sTmpClass != sCurrentClass )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* We changed something */\n\t\t\t\t\t\tnTds[i].className = $.trim( sTmpClass );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* We need to add a class */\n\t\t\t\t\t\tnTds[i].className = sCurrentClass + \" \" + sNewClass;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t/**\n\t\t * Save the state of a table in a cookie such that the page can be reloaded\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable
#oApi\n\t\t */\n\t\tfunction _fnSaveState ( oSettings )\n\t\t{\n\t\t\tif ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\n\t\t\t/* Store the interesting variables */\n\t\t\tvar i, iLen, bInfinite=oSettings.oScroll.bInfinite;\n\t\t\tvar oState = {\n\t\t\t\t\"iCreate\": new Date().getTime(),\n\t\t\t\t\"iStart\": (bInfinite ? 0 : oSettings._iDisplayStart),\n\t\t\t\t\"iEnd\": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),\n\t\t\t\t\"iLength\": oSettings._iDisplayLength,\n\t\t\t\t\"aaSorting\": $.extend( true, [], oSettings.aaSorting ),\n\t\t\t\t\"oSearch\": $.extend( true, {}, oSettings.oPreviousSearch ),\n\t\t\t\t\"aoSearchCols\": $.extend( true, [], oSettings.aoPreSearchCols ),\n\t\t\t\t\"abVisCols\": []\n\t\t\t};\n\t\t\n\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toState.abVisCols.push( oSettings.aoColumns[i].bVisible );\n\t\t\t}\n\t\t\n\t\t\t_fnCallbackFire( oSett
ings, \"aoStateSaveParams\", 'stateSaveParams', [oSettings, oState] );\n\t\t\t\n\t\t\toSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Attempt to load a saved table state from a cookie\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {object} oInit DataTables init object so we can override settings\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnLoadState ( oSettings, oInit )\n\t\t{\n\t\t\tif ( !oSettings.oFeatures.bStateSave )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\n\t\t\tvar oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );\n\t\t\tif ( !oData )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Allow custom and plug-in manipulation functions to alter the saved data set and\n\t\t\t * cancelling of loading by returning false\n\t\t\t */\n\t\t\tvar abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );\n\t\t\tif ( $.inArray( false, abStateLoa
d ) !== -1 )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Store the saved state so it might be accessed at any time */\n\t\t\toSettings.oLoadedState = $.extend( true, {}, oData );\n\t\t\t\n\t\t\t/* Restore key features */\n\t\t\toSettings._iDisplayStart = oData.iStart;\n\t\t\toSettings.iInitDisplayStart = oData.iStart;\n\t\t\toSettings._iDisplayEnd = oData.iEnd;\n\t\t\toSettings._iDisplayLength = oData.iLength;\n\t\t\toSettings.aaSorting = oData.aaSorting.slice();\n\t\t\toSettings.saved_aaSorting = oData.aaSorting.slice();\n\t\t\t\n\t\t\t/* Search filtering */\n\t\t\t$.extend( oSettings.oPreviousSearch, oData.oSearch );\n\t\t\t$.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );\n\t\t\t\n\t\t\t/* Column visibility state\n\t\t\t * Pass back visibility settings to the init handler, but to do not here override\n\t\t\t * the init object that the user might have passed in\n\t\t\t */\n\t\t\toInit.saved_aoColumns = [];\n\t\t\tfor ( var i=0 ; i<oData.abVisCols.length ; i++ )\
n\t\t\t{\n\t\t\t\toInit.saved_aoColumns[i] = {};\n\t\t\t\toInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];\n\t\t\t}\n\t\t\n\t\t\t_fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a new cookie with a value to store the state of a table\n\t\t * @param {string} sName name of the cookie to create\n\t\t * @param {string} sValue the value the cookie should take\n\t\t * @param {int} iSecs duration of the cookie\n\t\t * @param {string} sBaseName sName is made up of the base + file name - this is the base\n\t\t * @param {function} fnCallback User definable function to modify the cookie\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )\n\t\t{\n\t\t\tvar date = new Date();\n\t\t\tdate.setTime( date.getTime()+(iSecs*1000) );\n\t\t\t\n\t\t\t/* \n\t\t\t * Shocking but true - it would appear IE has major issues with having the path not having\n\t\t\t * a trailing slas
h on it. We need the cookie to be available based on the path, so we\n\t\t\t * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the\n\t\t\t * patch to use at least some of the path\n\t\t\t */\n\t\t\tvar aParts = window.location.pathname.split('/');\n\t\t\tvar sNameFile = sName + '_' + aParts.pop().replace(/[\\/:]/g,\"\").toLowerCase();\n\t\t\tvar sFullCookie, oData;\n\t\t\t\n\t\t\tif ( fnCallback !== null )\n\t\t\t{\n\t\t\t\toData = (typeof $.parseJSON === 'function') ? \n\t\t\t\t\t$.parseJSON( sValue ) : eval( '('+sValue+')' );\n\t\t\t\tsFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),\n\t\t\t\t\taParts.join('/')+\"/\" );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsFullCookie = sNameFile + \"=\" + encodeURIComponent(sValue) +\n\t\t\t\t\t\"; expires=\" + date.toGMTString() +\"; path=\" + aParts.join('/')+\"/\";\n\t\t\t}\n\t\t\t\n\t\t\t/* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies\n\t\t\t * belonging to DataTables.\n\t\t\t */\
n\t\t\tvar\n\t\t\t\taCookies =document.cookie.split(';'),\n\t\t\t\tiNewCookieLen = sFullCookie.split(';')[0].length,\n\t\t\t\taOldCookies = [];\n\t\t\t\n\t\t\tif ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */\n\t\t\t{\n\t\t\t\tfor ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( aCookies[i].indexOf( sBaseName ) != -1 )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* It's a DataTables cookie, so eval it and check the time stamp */\n\t\t\t\t\t\tvar aSplitCookie = aCookies[i].split('=');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\toData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );\n\t\t\n\t\t\t\t\t\t\tif ( oData && oData.iCreate )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taOldCookies.push( {\n\t\t\t\t\t\t\t\t\t\"name\": aSplitCookie[0],\n\t\t\t\t\t\t\t\t\t\"time\": oData.iCreate\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch( e ) {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\t// Make sure we delete the oldest ones first\n\t\t\t\taOldCookies.sort( function (a,
b) {\n\t\t\t\t\treturn b.time - a.time;\n\t\t\t\t} );\n\t\t\n\t\t\t\t// Eliminate as many old DataTables cookies as we need to\n\t\t\t\twhile ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {\n\t\t\t\t\tif ( aOldCookies.length === 0 ) {\n\t\t\t\t\t\t// Deleted all DT cookies and still not enough space. Can't state save\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar old = aOldCookies.pop();\n\t\t\t\t\tdocument.cookie = old.name+\"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=\"+\n\t\t\t\t\t\taParts.join('/') + \"/\";\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tdocument.cookie = sFullCookie;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Read an old cookie to get a cookie with an old table state\n\t\t * @param {string} sName name of the cookie to read\n\t\t * @returns {string} contents of the cookie - or null if no cookie with that name found\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnReadCookie ( sName )\n\t\t{\n\t\t\tvar\n\t\t\t\taParts = window.location.pathname.split('/'),\n\t\t\t\tsNa
meEQ = sName + '_' + aParts[aParts.length-1].replace(/[\\/:]/g,\"\").toLowerCase() + '=',\n\t\t\t \tsCookieContents = document.cookie.split(';');\n\t\t\t\n\t\t\tfor( var i=0 ; i<sCookieContents.length ; i++ )\n\t\t\t{\n\t\t\t\tvar c = sCookieContents[i];\n\t\t\t\t\n\t\t\t\twhile (c.charAt(0)==' ')\n\t\t\t\t{\n\t\t\t\t\tc = c.substring(1,c.length);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (c.indexOf(sNameEQ) === 0)\n\t\t\t\t{\n\t\t\t\t\treturn decodeURIComponent( c.substring(sNameEQ.length,c.length) );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Return the settings object for a particular table\n\t\t * @param {node} nTable table we are using as a dataTable\n\t\t * @returns {object} Settings object - or null if not found\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnSettingsFromNode ( nTable )\n\t\t{\n\t\t\tfor ( var i=0 ; i<DataTable.settings.length ; i++ )\n\t\t\t{\n\t\t\t\tif ( DataTable.settings[i].nTable === nTable )\n\t\t\t\t{\n\t\t\t\t\treturn DataTable.settings[i
];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Return an array with the TR nodes for the table\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @returns {array} TR array\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetTrNodes ( oSettings )\n\t\t{\n\t\t\tvar aNodes = [];\n\t\t\tvar aoData = oSettings.aoData;\n\t\t\tfor ( var i=0, iLen=aoData.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( aoData[i].nTr !== null )\n\t\t\t\t{\n\t\t\t\t\taNodes.push( aoData[i].nTr );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn aNodes;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Return an flat array with all TD nodes for the table, or row\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} [iIndividualRow] aoData index to get the nodes for - optional \n\t\t * if not given then the return array will contain all nodes for the table\n\t\t * @returns {array} TD array\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnGetTdNodes ( oS
ettings, iIndividualRow )\n\t\t{\n\t\t\tvar anReturn = [];\n\t\t\tvar iCorrector;\n\t\t\tvar anTds, nTd;\n\t\t\tvar iRow, iRows=oSettings.aoData.length,\n\t\t\t\tiColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;\n\t\t\t\n\t\t\t/* Allow the collection to be limited to just one row */\n\t\t\tif ( iIndividualRow !== undefined )\n\t\t\t{\n\t\t\t\tiStart = iIndividualRow;\n\t\t\t\tiEnd = iIndividualRow+1;\n\t\t\t}\n\t\t\n\t\t\tfor ( iRow=iStart ; iRow<iEnd ; iRow++ )\n\t\t\t{\n\t\t\t\toData = oSettings.aoData[iRow];\n\t\t\t\tif ( oData.nTr !== null )\n\t\t\t\t{\n\t\t\t\t\t/* get the TD child nodes - taking into account text etc nodes */\n\t\t\t\t\tanTds = [];\n\t\t\t\t\tnTd = oData.nTr.firstChild;\n\t\t\t\t\twhile ( nTd )\n\t\t\t\t\t{\n\t\t\t\t\t\tsNodeName = nTd.nodeName.toLowerCase();\n\t\t\t\t\t\tif ( sNodeName == 'td' || sNodeName == 'th' )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tanTds.push( nTd );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnTd = nTd.nextSibling;\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tiCorrector = 0;\n\t\t\t\t\tfor (
iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( oSettings.aoColumns[iColumn].bVisible )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tanReturn.push( anTds[iColumn-iCorrector] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tanReturn.push( oData._anHidden[iColumn] );\n\t\t\t\t\t\t\tiCorrector++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn anReturn;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Log an error message\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {int} iLevel log error messages, or display them to the user\n\t\t * @param {string} sMesg error message\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnLog( oSettings, iLevel, sMesg )\n\t\t{\n\t\t\tvar sAlert = (oSettings===null) ?\n\t\t\t\t\"DataTables warning: \"+sMesg :\n\t\t\t\t\"DataTables warning (table id = '\"+oSettings.sTableId+\"'): \"+sMesg;\n\t\t\t\n\t\t\tif ( iLevel === 0 )\n\t\t\t{\n\t\t\t\tif ( DataTable.ext.sErrMode
== 'alert' )\n\t\t\t\t{\n\t\t\t\t\talert( sAlert );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthrow new Error(sAlert);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if ( window.console && console.log )\n\t\t\t{\n\t\t\t\tconsole.log( sAlert );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * See if a property is defined on one object, if so assign it to the other object\n\t\t * @param {object} oRet target object\n\t\t * @param {object} oSrc source object\n\t\t * @param {string} sName property\n\t\t * @param {string} [sMappedName] name to map too - optional, sName used if not given\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnMap( oRet, oSrc, sName, sMappedName )\n\t\t{\n\t\t\tif ( sMappedName === undefined )\n\t\t\t{\n\t\t\t\tsMappedName = sName;\n\t\t\t}\n\t\t\tif ( oSrc[sName] !== undefined )\n\t\t\t{\n\t\t\t\toRet[sMappedName] = oSrc[sName];\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow\n\t\t * copy ar
rays. The reason we need to do this, is that we don't want to deep copy array\n\t\t * init values (such as aaSorting) since the dev wouldn't be able to override them, but\n\t\t * we do want to deep copy arrays.\n\t\t * @param {object} oOut Object to extend\n\t\t * @param {object} oExtender Object from which the properties will be applied to oOut\n\t\t * @returns {object} oOut Reference, just for convenience - oOut === the return.\n\t\t * @memberof DataTable#oApi\n\t\t * @todo This doesn't take account of arrays inside the deep copied objects.\n\t\t */\n\t\tfunction _fnExtend( oOut, oExtender )\n\t\t{\n\t\t\tvar val;\n\t\t\t\n\t\t\tfor ( var prop in oExtender )\n\t\t\t{\n\t\t\t\tif ( oExtender.hasOwnProperty(prop) )\n\t\t\t\t{\n\t\t\t\t\tval = oExtender[prop];\n\t\t\n\t\t\t\t\tif ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )\n\t\t\t\t\t{\n\t\t\t\t\t\t$.extend( true, oOut[prop], val );\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\toOut[prop] = val;\n\t\t\t\t\t}\n
\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn oOut;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Bind an event handers to allow a click or return key to activate the callback.\n\t\t * This is good for accessibility since a return on the keyboard will have the\n\t\t * same effect as a click, if the element has focus.\n\t\t * @param {element} n Element to bind the action to\n\t\t * @param {object} oData Data object to pass to the triggered function\n\t\t * @param {function} fn Callback function for when the event is triggered\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnBindAction( n, oData, fn )\n\t\t{\n\t\t\t$(n)\n\t\t\t\t.bind( 'click.DT', oData, function (e) {\n\t\t\t\t\t\tn.blur(); // Remove focus outline for mouse users\n\t\t\t\t\t\tfn(e);\n\t\t\t\t\t} )\n\t\t\t\t.bind( 'keypress.DT', oData, function (e){\n\t\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\t\tfn(e);\n\t\t\t\t\t} } )\n\t\t\t\t.bind( 'selectstart.DT', function () {\n\t\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\t
\treturn false;\n\t\t\t\t\t} );\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Register a callback function. Easily allows a callback function to be added to\n\t\t * an array store of callback functions that can then all be called together.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t\t * @param {function} fn Function to be called back\n\t\t * @param {string} sName Identifying name for the callback (i.e. a label)\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n\t\t{\n\t\t\tif ( fn )\n\t\t\t{\n\t\t\t\toSettings[sStore].push( {\n\t\t\t\t\t\"fn\": fn,\n\t\t\t\t\t\"sName\": sName\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Fire callback functions and trigger events. Note that the loop over the callback\n\t\t * array store is done backwards! Further note that you do not want to fire off triggers\n\t\t * in time sensitive applications (for exam
ple cell creation) as its slow.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @param {string} sStore Name of the array storage for the callbacks in oSettings\n\t\t * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger\n\t\t * is fired\n\t\t * @param {array} aArgs Array of arguments to pass to the callback function / trigger\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )\n\t\t{\n\t\t\tvar aoStore = oSettings[sStore];\n\t\t\tvar aRet =[];\n\t\t\n\t\t\tfor ( var i=aoStore.length-1 ; i>=0 ; i-- )\n\t\t\t{\n\t\t\t\taRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) );\n\t\t\t}\n\t\t\n\t\t\tif ( sTrigger !== null )\n\t\t\t{\n\t\t\t\t$(oSettings.oInstance).trigger(sTrigger, aArgs);\n\t\t\t}\n\t\t\n\t\t\treturn aRet;\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other\n\t\t * library, then we use that as it is f
ast, safe and accurate. If the function isn't \n\t\t * available then we need to built it ourselves - the inspiration for this function comes\n\t\t * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is\n\t\t * not perfect and absolutely should not be used as a replacement to json2.js - but it does\n\t\t * do what we need, without requiring a dependency for DataTables.\n\t\t * @param {object} o JSON object to be converted\n\t\t * @returns {string} JSON string\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tvar _fnJsonString = (window.JSON) ? JSON.stringify : function( o )\n\t\t{\n\t\t\t/* Not an object or array */\n\t\t\tvar sType = typeof o;\n\t\t\tif (sType !== \"object\" || o === null)\n\t\t\t{\n\t\t\t\t// simple data type\n\t\t\t\tif (sType === \"string\")\n\t\t\t\t{\n\t\t\t\t\to = '\"'+o+'\"';\n\t\t\t\t}\n\t\t\t\treturn o+\"\";\n\t\t\t}\n\t\t\n\t\t\t/* If object or array, need to recurse over it */\n\t\t\tvar\n\t\t\t\tsProp, mValue,\n\t\t\t\tjson = [],\n\t\t\t\tbArr =
$.isArray(o);\n\t\t\t\n\t\t\tfor (sProp in o)\n\t\t\t{\n\t\t\t\tmValue = o[sProp];\n\t\t\t\tsType = typeof mValue;\n\t\t\n\t\t\t\tif (sType === \"string\")\n\t\t\t\t{\n\t\t\t\t\tmValue = '\"'+mValue+'\"';\n\t\t\t\t}\n\t\t\t\telse if (sType === \"object\" && mValue !== null)\n\t\t\t\t{\n\t\t\t\t\tmValue = _fnJsonString(mValue);\n\t\t\t\t}\n\t\t\n\t\t\t\tjson.push((bArr ? \"\" : '\"'+sProp+'\":') + mValue);\n\t\t\t}\n\t\t\n\t\t\treturn (bArr ? \"[\" : \"{\") + json + (bArr ? \"]\" : \"}\");\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * From some browsers (specifically IE6/7) we need special handling to work around browser\n\t\t * bugs - this function is used to detect when these workarounds are needed.\n\t\t * @param {object} oSettings dataTables settings object\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnBrowserDetect( oSettings )\n\t\t{\n\t\t\t/* IE6/7 will oversize a width 100% element inside a scrolling element, to include the\n\t\t\t * width of the scrollbar, while other browsers ensure the inner
element is contained\n\t\t\t * without forcing scrolling\n\t\t\t */\n\t\t\tvar n = $(\n\t\t\t\t'<div style=\"position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden\">'+\n\t\t\t\t\t'<div style=\"position:absolute; top:1px; left:1px; width:100px; overflow:scroll;\">'+\n\t\t\t\t\t\t'<div id=\"DT_BrowserTest\" style=\"width:100%; height:10px;\"></div>'+\n\t\t\t\t\t'</div>'+\n\t\t\t\t'</div>')[0];\n\t\t\n\t\t\tdocument.body.appendChild( n );\n\t\t\toSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;\n\t\t\tdocument.body.removeChild( n );\n\t\t}\n\t\t\n\n\t\t/**\n\t\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t\t * return the resulting jQuery object.\n\t\t * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t * @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t * @param {string} [oOpts.filter=none] Select TR elements that meet the
current filter\n\t\t * criterion (\"applied\") or all TR elements (i.e. no filter).\n\t\t * @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t\t * Can be either 'current', whereby the current sorting of the table is used, or\n\t\t * 'original' whereby the original order the data was read into the table is used.\n\t\t * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t * (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be \n\t\t * 'current' and filter is 'applied', regardless of what they might be given as.\n\t\t * @returns {object} jQuery object, filtered by the given selector.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t *\n\t\t * // Highlight every second row\n\t\t * oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t\t * } );\n\t\t *\n\t\t * @example\n\t\t *
$(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t *\n\t\t * // Filter to rows with 'Webkit' in them, add a background colour and then\n\t\t * // remove the filter, thus highlighting the 'Webkit' rows only.\n\t\t * oTable.fnFilter('Webkit');\n\t\t * oTable.$('tr', {\"filter\": \"applied\"}).css('backgroundColor', 'blue');\n\t\t * oTable.fnFilter('');\n\t\t * } );\n\t\t */\n\t\tthis.$ = function ( sSelector, oOpts )\n\t\t{\n\t\t\tvar i, iLen, a = [], tr;\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar aoData = oSettings.aoData;\n\t\t\tvar aiDisplay = oSettings.aiDisplay;\n\t\t\tvar aiDisplayMaster = oSettings.aiDisplayMaster;\n\t\t\n\t\t\tif ( !oOpts )\n\t\t\t{\n\t\t\t\toOpts = {};\n\t\t\t}\n\t\t\n\t\t\toOpts = $.extend( {}, {\n\t\t\t\t\"filter\": \"none\", // applied\n\t\t\t\t\"order\": \"current\", // \"original\"\n\t\t\t\t\"page\": \"all\" // current\n\t\t\t}, oOpts );\n\t\t\n\t\t\t// Current page im
plies that order=current and fitler=applied, since it is fairly\n\t\t\t// senseless otherwise\n\t\t\tif ( oOpts.page == 'current' )\n\t\t\t{\n\t\t\t\tfor ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttr = aoData[ aiDisplay[i] ].nTr;\n\t\t\t\t\tif ( tr )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( tr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oOpts.order == \"current\" && oOpts.filter == \"none\" )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttr = aoData[ aiDisplayMaster[i] ].nTr;\n\t\t\t\t\tif ( tr )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( tr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oOpts.order == \"current\" && oOpts.filter == \"applied\" )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttr = aoData[ aiDisplay[i] ].nTr;\n\t\t\t\t\tif ( tr )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( tr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oOpts.order == \"original\" &
& oOpts.filter == \"none\" )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=aoData.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttr = aoData[ i ].nTr ;\n\t\t\t\t\tif ( tr )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( tr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oOpts.order == \"original\" && oOpts.filter == \"applied\" )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=aoData.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\ttr = aoData[ i ].nTr;\n\t\t\t\t\tif ( $.inArray( i, aiDisplay ) !== -1 && tr )\n\t\t\t\t\t{\n\t\t\t\t\t\ta.push( tr );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_fnLog( oSettings, 1, \"Unknown selection options\" );\n\t\t\t}\n\t\t\n\t\t\t/* We need to filter on the TR elements and also 'find' in their descendants\n\t\t\t * to make the selector act like it would in a full table - so we need\n\t\t\t * to build both results and then combine them together\n\t\t\t */\n\t\t\tvar jqA = $(a);\n\t\t\tvar jqTRs = jqA.filter( sSelector );\n\t\t\tvar jqDescendants = jqA.find( sSelector );\n\t\t\n\t\t\treturn
$( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t\t * rows are found, the data returned is the original data array/object that was used to \n\t\t * create the row (or a generated array if from a DOM source).\n\t\t *\n\t\t * This method is often useful in-combination with $ where both functions are given the\n\t\t * same parameters and the array indexes will match identically.\n\t\t * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t\t * @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t\t * @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t\t * criterion (\"applied\") or a
ll elements (i.e. no filter).\n\t\t * @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t\t * Can be either 'current', whereby the current sorting of the table is used, or\n\t\t * 'original' whereby the original order the data was read into the table is used.\n\t\t * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t\t * (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be \n\t\t * 'current' and filter is 'applied', regardless of what they might be given as.\n\t\t * @returns {array} Data for the matched elements. If any elements, as a result of the\n\t\t * selector, were not TR, TD or TH elements in the DataTable, they will have a null \n\t\t * entry in the array.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t *\n\t\t * // Get the data from the first row in the table\n\t\t * var da
ta = oTable._('tr:first');\n\t\t *\n\t\t * // Do something useful with the data\n\t\t * alert( \"First cell is: \"+data[0] );\n\t\t * } );\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t *\n\t\t * // Filter to 'Webkit' and get all data for \n\t\t * oTable.fnFilter('Webkit');\n\t\t * var data = oTable._('tr', {\"filter\": \"applied\"});\n\t\t * \n\t\t * // Do something with the data\n\t\t * alert( data.length+\" rows matched the filter\" );\n\t\t * } );\n\t\t */\n\t\tthis._ = function ( sSelector, oOpts )\n\t\t{\n\t\t\tvar aOut = [];\n\t\t\tvar i, iLen, iIndex;\n\t\t\tvar aTrs = this.$( sSelector, oOpts );\n\t\t\n\t\t\tfor ( i=0, iLen=aTrs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taOut.push( this.fnGetData(aTrs[i]) );\n\t\t\t}\n\t\t\n\t\t\treturn aOut;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Add a single new row or multiple rows of data to the table. Please note\n\t\t * that this is suitab
le for client-side processing only - if you are using \n\t\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t\t * @param {array|object} mData The data to be added to the table. This can be:\n\t\t * <ul>\n\t\t * <li>1D array of data - add a single row with the data provided</li>\n\t\t * <li>2D array of arrays - add multiple rows in a single call</li>\n\t\t * <li>object - data object when using <i>mData</i></li>\n\t\t * <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t\t * </ul>\n\t\t * @param {bool} [bRedraw=true] redraw the table or not\n\t\t * @returns {array} An array of integers, representing the list of indexes in \n\t\t * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to \n\t\t * the table.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * // Global var for counter\n\t\t * var giCount = 2;\n\t
\t * \n\t\t * $(document).ready(function() {\n\t\t * $('#example').dataTable();\n\t\t * } );\n\t\t * \n\t\t * function fnClickAddRow() {\n\t\t * $('#example').dataTable().fnAddData( [\n\t\t * giCount+\".1\",\n\t\t * giCount+\".2\",\n\t\t * giCount+\".3\",\n\t\t * giCount+\".4\" ]\n\t\t * );\n\t\t * \n\t\t * giCount++;\n\t\t * }\n\t\t */\n\t\tthis.fnAddData = function( mData, bRedraw )\n\t\t{\n\t\t\tif ( mData.length === 0 )\n\t\t\t{\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\t\n\t\t\tvar aiReturn = [];\n\t\t\tvar iTest;\n\t\t\t\n\t\t\t/* Find settings from table node */\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t\n\t\t\t/* Check if we want to add multiple rows or not */\n\t\t\tif ( typeof mData[0] === \"object\" && mData[0] !== null )\n\t\t\t{\n\t\t\t\tfor ( var i=0 ; i<mData.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\tiTest = _fnAddData( oSettings, mData[i] );\n\t\t\t\t\tif ( iTest == -1 )\n\t\t\t\t\t{\n\t\t\t
\t\t\treturn aiReturn;\n\t\t\t\t\t}\n\t\t\t\t\taiReturn.push( iTest );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tiTest = _fnAddData( oSettings, mData );\n\t\t\t\tif ( iTest == -1 )\n\t\t\t\t{\n\t\t\t\t\treturn aiReturn;\n\t\t\t\t}\n\t\t\t\taiReturn.push( iTest );\n\t\t\t}\n\t\t\t\n\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\t_fnReDraw( oSettings );\n\t\t\t}\n\t\t\treturn aiReturn;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will make DataTables recalculate the column sizes, based on the data \n\t\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or \n\t\t * through the sWidth parameter). This can be useful when the width of the table's \n\t\t * parent element changes (for example a window resize).\n\t\t * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function()
{\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"sScrollY\": \"200px\",\n\t\t * \"bPaginate\": false\n\t\t * } );\n\t\t * \n\t\t * $(window).bind('resize', function () {\n\t\t * oTable.fnAdjustColumnSizing();\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);\n\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\tthis.fnDraw( false );\n\t\t\t}\n\t\t\telse if ( oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\" )\n\t\t\t{\n\t\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t\tthis.oApi._fnScrollDraw(oSettings);\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Quickly and simply clear a table\n\t\t * @param {bool} [bRedraw=true] redraw the table or not\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(documen
t).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t\t * oTable.fnClearTable();\n\t\t * } );\n\t\t */\n\t\tthis.fnClearTable = function( bRedraw )\n\t\t{\n\t\t\t/* Find settings from table node */\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t_fnClearTable( oSettings );\n\t\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * The exact opposite of 'opening' a row, this function will close any rows which \n\t\t * are currently 'open'.\n\t\t * @param {node} nTr the table row to 'close'\n\t\t * @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable;\n\t\t * \n\t\t * // 'open' an information row when a row is clicked on\n
\t\t * $('#example tbody tr').click( function () {\n\t\t * if ( oTable.fnIsOpen(this) ) {\n\t\t * oTable.fnClose( this );\n\t\t * } else {\n\t\t * oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t * }\n\t\t * } );\n\t\t * \n\t\t * oTable = $('#example').dataTable();\n\t\t * } );\n\t\t */\n\t\tthis.fnClose = function( nTr )\n\t\t{\n\t\t\t/* Find settings from table node */\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t\n\t\t\tfor ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoOpenRows[i].nParent == nTr )\n\t\t\t\t{\n\t\t\t\t\tvar nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;\n\t\t\t\t\tif ( nTrParent )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Remove it if it is currently on display */\n\t\t\t\t\t\tnTrParent.removeChild( oSettings.aoOpenRows[i].nTr );\n\t\t\t\t\t}\n\t\t\t\t\toSettings.aoOpenRows.splice( i, 1 );\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tret
urn 1;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Remove a row for the table\n\t\t * @param {mixed} mTarget The index of the row from aoData to be deleted, or\n\t\t * the TR element you want to delete\n\t\t * @param {function|null} [fnCallBack] Callback function\n\t\t * @param {bool} [bRedraw=true] Redraw the table or not\n\t\t * @returns {array} The row that was deleted\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Immediately remove the first row\n\t\t * oTable.fnDeleteRow( 0 );\n\t\t * } );\n\t\t */\n\t\tthis.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )\n\t\t{\n\t\t\t/* Find settings from table node */\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar i, iLen, iAODataIndex;\n\t\t\t\n\t\t\tiAODataIndex = (typeof mTarget === 'object') ? \n\t\t\t\t_fnNodeToDataIndex(oSettings, mTarget) : mTarget;\n\t\t\t\n\t\t\t/* Return the data
array from this row */\n\t\t\tvar oData = oSettings.aoData.splice( iAODataIndex, 1 );\n\t\t\n\t\t\t/* Update the _DT_RowIndex parameter */\n\t\t\tfor ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoData[i].nTr !== null )\n\t\t\t\t{\n\t\t\t\t\toSettings.aoData[i].nTr._DT_RowIndex = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove the target row from the search array */\n\t\t\tvar iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );\n\t\t\toSettings.asDataSearch.splice( iDisplayIndex, 1 );\n\t\t\t\n\t\t\t/* Delete from the display arrays */\n\t\t\t_fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );\n\t\t\t_fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );\n\t\t\t\n\t\t\t/* If there is a user callback function - call it */\n\t\t\tif ( typeof fnCallBack === \"function\" )\n\t\t\t{\n\t\t\t\tfnCallBack.call( this, oSettings, oData );\n\t\t\t}\n\t\t\t\n\t\t\t/* Check for an 'overflow' they case for displaying the table */\n\t\t\tif ( oSettings._iDisplaySta
rt >= oSettings.fnRecordsDisplay() )\n\t\t\t{\n\t\t\t\toSettings._iDisplayStart -= oSettings._iDisplayLength;\n\t\t\t\tif ( oSettings._iDisplayStart < 0 )\n\t\t\t\t{\n\t\t\t\t\toSettings._iDisplayStart = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\treturn oData;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Restore the table to it's original state in the DOM by removing all of DataTables \n\t\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t\t * @param {boolean} [bRemove=false] Completely remove the table from the DOM\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t\t * var oTable = $('#example').dataTable();\n\t\t * oTable.fnDestroy();\n\t\t * } );\n\t\t */\n\t\tthis.fnDestroy = function ( bRe
move )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar nOrig = oSettings.nTableWrapper.parentNode;\n\t\t\tvar nBody = oSettings.nTBody;\n\t\t\tvar i, iLen;\n\t\t\n\t\t\tbRemove = (bRemove===undefined) ? false : bRemove;\n\t\t\t\n\t\t\t/* Flag to note that the table is currently being destroyed - no action should be taken */\n\t\t\toSettings.bDestroying = true;\n\t\t\t\n\t\t\t/* Fire off the destroy callbacks for plug-ins etc */\n\t\t\t_fnCallbackFire( oSettings, \"aoDestroyCallback\", \"destroy\", [oSettings] );\n\t\t\n\t\t\t/* If the table is not being removed, restore the hidden columns */\n\t\t\tif ( !bRemove )\n\t\t\t{\n\t\t\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( oSettings.aoColumns[i].bVisible === false )\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.fnSetColumnVis( i, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Blitz all DT events */\n\t\t\t$(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');\n\t\
t\t\n\t\t\t/* If there is an 'empty' indicator row, remove it */\n\t\t\t$('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();\n\t\t\t\n\t\t\t/* When scrolling we had to break the table up - restore it */\n\t\t\tif ( oSettings.nTable != oSettings.nTHead.parentNode )\n\t\t\t{\n\t\t\t\t$(oSettings.nTable).children('thead').remove();\n\t\t\t\toSettings.nTable.appendChild( oSettings.nTHead );\n\t\t\t}\n\t\t\t\n\t\t\tif ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )\n\t\t\t{\n\t\t\t\t$(oSettings.nTable).children('tfoot').remove();\n\t\t\t\toSettings.nTable.appendChild( oSettings.nTFoot );\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove the DataTables generated nodes, events and classes */\n\t\t\toSettings.nTable.parentNode.removeChild( oSettings.nTable );\n\t\t\t$(oSettings.nTableWrapper).remove();\n\t\t\t\n\t\t\toSettings.aaSorting = [];\n\t\t\toSettings.aaSortingFixed = [];\n\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\n\t\t\t$(_fnGetTrNodes( oSettings )).removeClass( oS
ettings.asStripeClasses.join(' ') );\n\t\t\t\n\t\t\t$('th, td', oSettings.nTHead).removeClass( [\n\t\t\t\toSettings.oClasses.sSortable,\n\t\t\t\toSettings.oClasses.sSortableAsc,\n\t\t\t\toSettings.oClasses.sSortableDesc,\n\t\t\t\toSettings.oClasses.sSortableNone ].join(' ')\n\t\t\t);\n\t\t\tif ( oSettings.bJUI )\n\t\t\t{\n\t\t\t\t$('th span.'+oSettings.oClasses.sSortIcon\n\t\t\t\t\t+ ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove();\n\t\t\n\t\t\t\t$('th, td', oSettings.nTHead).each( function () {\n\t\t\t\t\tvar jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this);\n\t\t\t\t\tvar kids = jqWrapper.contents();\n\t\t\t\t\t$(this).append( kids );\n\t\t\t\t\tjqWrapper.remove();\n\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\t/* Add the TR elements back into the table in their original order */\n\t\t\tif ( !bRemove && oSettings.nTableReinsertBefore )\n\t\t\t{\n\t\t\t\tnOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore );\n\t\t\t}\n\t\t\telse if ( !bRemove )\n\t\t\t{\n\t\t\t\tn
Orig.appendChild( oSettings.nTable );\n\t\t\t}\n\t\t\n\t\t\tfor ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoData[i].nTr !== null )\n\t\t\t\t{\n\t\t\t\t\tnBody.appendChild( oSettings.aoData[i].nTr );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Restore the width of the original table */\n\t\t\tif ( oSettings.oFeatures.bAutoWidth === true )\n\t\t\t{\n\t\t\t oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);\n\t\t\t}\n\t\t\t\n\t\t\t/* If the were originally stripe classes - then we add them back here. Note\n\t\t\t * this is not fool proof (for example if not all rows had stripe classes - but\n\t\t\t * it's a good effort without getting carried away\n\t\t\t */\n\t\t\tiLen = oSettings.asDestroyStripes.length;\n\t\t\tif (iLen)\n\t\t\t{\n\t\t\t\tvar anRows = $(nBody).children('tr');\n\t\t\t\tfor ( i=0 ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tanRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );\n\t\t\t\t}\n\t\t\t}\n
\t\t\t\n\t\t\t/* Remove the settings object from the settings array */\n\t\t\tfor ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( DataTable.settings[i] == oSettings )\n\t\t\t\t{\n\t\t\t\t\tDataTable.settings.splice( i, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* End it all */\n\t\t\toSettings = null;\n\t\t\toInit = null;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Redraw the table\n\t\t * @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t\t * oTable.fnDraw();\n\t\t * } );\n\t\t */\n\t\tthis.fnDraw = function( bComplete )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tif ( bComplete === false )\n\t\t\t{\n\t\t\t\t_fnCalculateEnd( oSettings );\n\t\t\
t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_fnReDraw( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Filter the input based on data\n\t\t * @param {string} sInput String to filter the table on\n\t\t * @param {int|null} [iColumn] Column to limit filtering to\n\t\t * @param {bool} [bRegex=false] Treat as regular expression or not\n\t\t * @param {bool} [bSmart=true] Perform smart filtering or not\n\t\t * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t\t * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Sometime later - filter...\n\t\t * oTable.fnFilter( 'test string' );\n\t\t * } );\n\t\t */\n\t\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t\t{\n\t\t\tvar oSettings = _f
nSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t\n\t\t\tif ( !oSettings.oFeatures.bFilter )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif ( bRegex === undefined || bRegex === null )\n\t\t\t{\n\t\t\t\tbRegex = false;\n\t\t\t}\n\t\t\t\n\t\t\tif ( bSmart === undefined || bSmart === null )\n\t\t\t{\n\t\t\t\tbSmart = true;\n\t\t\t}\n\t\t\t\n\t\t\tif ( bShowGlobal === undefined || bShowGlobal === null )\n\t\t\t{\n\t\t\t\tbShowGlobal = true;\n\t\t\t}\n\t\t\t\n\t\t\tif ( bCaseInsensitive === undefined || bCaseInsensitive === null )\n\t\t\t{\n\t\t\t\tbCaseInsensitive = true;\n\t\t\t}\n\t\t\t\n\t\t\tif ( iColumn === undefined || iColumn === null )\n\t\t\t{\n\t\t\t\t/* Global filter */\n\t\t\t\t_fnFilterComplete( oSettings, {\n\t\t\t\t\t\"sSearch\":sInput+\"\",\n\t\t\t\t\t\"bRegex\": bRegex,\n\t\t\t\t\t\"bSmart\": bSmart,\n\t\t\t\t\t\"bCaseInsensitive\": bCaseInsensitive\n\t\t\t\t}, 1 );\n\t\t\t\t\n\t\t\t\tif ( bShowGlobal && oSettings.aanFeatures.f )\n\t\t\t\t{\n\t\t\t\t\tvar n = oSettings.aanFeature
s.f;\n\t\t\t\t\tfor ( var i=0, iLen=n.length ; i<iLen ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t\t\t\t// inside an iframe or frame...\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif ( n[i]._DT_Input != document.activeElement )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$(n[i]._DT_Input).val( sInput );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch ( e ) {\n\t\t\t\t\t\t\t$(n[i]._DT_Input).val( sInput );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Single column filter */\n\t\t\t\t$.extend( oSettings.aoPreSearchCols[ iColumn ], {\n\t\t\t\t\t\"sSearch\": sInput+\"\",\n\t\t\t\t\t\"bRegex\": bRegex,\n\t\t\t\t\t\"bSmart\": bSmart,\n\t\t\t\t\t\"bCaseInsensitive\": bCaseInsensitive\n\t\t\t\t} );\n\t\t\t\t_fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the data for the whole table, an individual row or an individual cell based on the \n\t\t * provided parameters.\n\t\t
* @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as\n\t\t * a TR node then the data source for the whole row will be returned. If given as a\n\t\t * TD/TH cell node then iCol will be automatically calculated and the data for the\n\t\t * cell returned. If given as an integer, then this is treated as the aoData internal\n\t\t * data index for the row (see fnGetPosition) and the data for that row used.\n\t\t * @param {int} [iCol] Optional column index that you want the data of.\n\t\t * @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t\t * returned. If mRow is defined, just data for that row, and is iCol is\n\t\t * defined, only data for the designated cell is returned.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * // Row data\n\t\t * $(document).ready(function() {\n\t\t * oTable = $('#example').dataTable();\n\t\t *\n\t\t * oTable.$('tr').click( function () {\n\t\t * var data = oTable.fnGetDa
ta( this );\n\t\t * // ... do something with the array / object of data for the row\n\t\t * } );\n\t\t * } );\n\t\t *\n\t\t * @example\n\t\t * // Individual cell data\n\t\t * $(document).ready(function() {\n\t\t * oTable = $('#example').dataTable();\n\t\t *\n\t\t * oTable.$('td').click( function () {\n\t\t * var sData = oTable.fnGetData( this );\n\t\t * alert( 'The cell clicked on had the value of '+sData );\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\tthis.fnGetData = function( mRow, iCol )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t\n\t\t\tif ( mRow !== undefined )\n\t\t\t{\n\t\t\t\tvar iRow = mRow;\n\t\t\t\tif ( typeof mRow === 'object' )\n\t\t\t\t{\n\t\t\t\t\tvar sNode = mRow.nodeName.toLowerCase();\n\t\t\t\t\tif (sNode === \"tr\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tiRow = _fnNodeToDataIndex(oSettings, mRow);\n\t\t\t\t\t}\n\t\t\t\t\telse if ( sNode === \"td\" )\n\t\t\t\t\t{\n\t\t\t\t\t\tiRow = _fnNodeToDataIndex(oSet
tings, mRow.parentNode);\n\t\t\t\t\t\tiCol = _fnNodeToColumnIndex( oSettings, iRow, mRow );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( iCol !== undefined )\n\t\t\t\t{\n\t\t\t\t\treturn _fnGetCellData( oSettings, iRow, iCol, '' );\n\t\t\t\t}\n\t\t\t\treturn (oSettings.aoData[iRow]!==undefined) ?\n\t\t\t\t\toSettings.aoData[iRow]._aData : null;\n\t\t\t}\n\t\t\treturn _fnGetDataMaster( oSettings );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get an array of the TR nodes that are used in the table's body. Note that you will \n\t\t * typically want to use the '$' API method in preference to this as it is more \n\t\t * flexible.\n\t\t * @param {int} [iRow] Optional row index for the TR element you want\n\t\t * @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t\t * in the table's body, or iRow is defined, just the TR element requested.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t *
\n\t\t * // Get the nodes from the table\n\t\t * var nNodes = oTable.fnGetNodes( );\n\t\t * } );\n\t\t */\n\t\tthis.fnGetNodes = function( iRow )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t\n\t\t\tif ( iRow !== undefined ) {\n\t\t\t\treturn (oSettings.aoData[iRow]!==undefined) ?\n\t\t\t\t\toSettings.aoData[iRow].nTr : null;\n\t\t\t}\n\t\t\treturn _fnGetTrNodes( oSettings );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the array indexes of a particular cell from it's DOM element\n\t\t * and column index including hidden columns\n\t\t * @param {node} nNode this can either be a TR, TD or TH in the table's body\n\t\t * @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t\t * if given as a cell, an array of [row index, column index (visible), \n\t\t * column index (all)] is given.\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * $('#example tbody td').click( functio
n () {\n\t\t * // Get the position of the current data from the node\n\t\t * var aPos = oTable.fnGetPosition( this );\n\t\t * \n\t\t * // Get the data array for this row\n\t\t * var aData = oTable.fnGetData( aPos[0] );\n\t\t * \n\t\t * // Update the data array and return the value\n\t\t * aData[ aPos[1] ] = 'clicked';\n\t\t * this.innerHTML = 'clicked';\n\t\t * } );\n\t\t * \n\t\t * // Init DataTables\n\t\t * oTable = $('#example').dataTable();\n\t\t * } );\n\t\t */\n\t\tthis.fnGetPosition = function( nNode )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar sNodeName = nNode.nodeName.toUpperCase();\n\t\t\t\n\t\t\tif ( sNodeName == \"TR\" )\n\t\t\t{\n\t\t\t\treturn _fnNodeToDataIndex(oSettings, nNode);\n\t\t\t}\n\t\t\telse if ( sNodeName == \"TD\" || sNodeName == \"TH\" )\n\t\t\t{\n\t\t\t\tvar iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode );\n\t\t\t\tvar iColumnInd
ex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode );\n\t\t\t\treturn [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ];\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Check to see if a row is 'open' or not.\n\t\t * @param {node} nTr the table row to check\n\t\t * @returns {boolean} true if the row is currently open, false otherwise\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable;\n\t\t * \n\t\t * // 'open' an information row when a row is clicked on\n\t\t * $('#example tbody tr').click( function () {\n\t\t * if ( oTable.fnIsOpen(this) ) {\n\t\t * oTable.fnClose( this );\n\t\t * } else {\n\t\t * oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t * }\n\t\t * } );\n\t\t * \n\t\t * oTable = $('#example').dataTable();\n\t\t * } );\n\t\t */\n\t\tthis.fnIsOpen = function( nTr )\n\t\t{\n\t\t\tvar oSettings =
_fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar aoOpenRows = oSettings.aoOpenRows;\n\t\t\t\n\t\t\tfor ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aoOpenRows[i].nParent == nTr )\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * This function will place a new row directly after a row which is currently \n\t\t * on display on the page, with the HTML contents that is passed into the \n\t\t * function. This can be used, for example, to ask for confirmation that a \n\t\t * particular record should be deleted.\n\t\t * @param {node} nTr The table row to 'open'\n\t\t * @param {string|node|jQuery} mHtml The HTML to put into the row\n\t\t * @param {string} sClass Class to give the new TD cell\n\t\t * @returns {node} The row opened. Note that if the table row passed in as the\n\t\t * first parameter, is not found in the table, this method will silently\n\t\t * return.\n\t\t * @dtopt API\n\t\t
*\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable;\n\t\t * \n\t\t * // 'open' an information row when a row is clicked on\n\t\t * $('#example tbody tr').click( function () {\n\t\t * if ( oTable.fnIsOpen(this) ) {\n\t\t * oTable.fnClose( this );\n\t\t * } else {\n\t\t * oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t\t * }\n\t\t * } );\n\t\t * \n\t\t * oTable = $('#example').dataTable();\n\t\t * } );\n\t\t */\n\t\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t\t{\n\t\t\t/* Find settings from table node */\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\n\t\t\t/* Check that the row given is in the table */\n\t\t\tvar nTableRows = _fnGetTrNodes( oSettings );\n\t\t\tif ( $.inArray(nTr, nTableRows) === -1 )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* the old open one if there is one */\n\t\t\tthis.fnClose( nTr );\n\t\t\t\n\t\t\tvar nNewRow =
document.createElement(\"tr\");\n\t\t\tvar nNewCell = document.createElement(\"td\");\n\t\t\tnNewRow.appendChild( nNewCell );\n\t\t\tnNewCell.className = sClass;\n\t\t\tnNewCell.colSpan = _fnVisbleColumns( oSettings );\n\t\t\n\t\t\tif (typeof mHtml === \"string\")\n\t\t\t{\n\t\t\t\tnNewCell.innerHTML = mHtml;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$(nNewCell).html( mHtml );\n\t\t\t}\n\t\t\n\t\t\t/* If the nTr isn't on the page at the moment - then we don't insert at the moment */\n\t\t\tvar nTrs = $('tr', oSettings.nTBody);\n\t\t\tif ( $.inArray(nTr, nTrs) != -1 )\n\t\t\t{\n\t\t\t\t$(nNewRow).insertAfter(nTr);\n\t\t\t}\n\t\t\t\n\t\t\toSettings.aoOpenRows.push( {\n\t\t\t\t\"nTr\": nNewRow,\n\t\t\t\t\"nParent\": nTr\n\t\t\t} );\n\t\t\t\n\t\t\treturn nNewRow;\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Change the pagination - provides the internal logic for pagination in a simple API \n\t\t * function. With this function you can have a DataTables table go to the next, \n\t\t * previous, first or last pages.\n\t\t *
@param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t\t * or page number to jump to (integer), note that page 0 is the first page.\n\t\t * @param {bool} [bRedraw=true] Redraw the table or not\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * oTable.fnPageChange( 'next' );\n\t\t * } );\n\t\t */\n\t\tthis.fnPageChange = function ( mAction, bRedraw )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\t_fnPageChange( oSettings, mAction );\n\t\t\t_fnCalculateEnd( oSettings );\n\t\t\t\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Show a particular column\n\t\t * @param {int} iCol The column whose display should be changed\n\t\t * @param {bool} bShow Show (true) or hide (false) the column\n\t\t * @param {bool} [bRedraw=true] Redraw t
he table or not\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Hide the second column after initialisation\n\t\t * oTable.fnSetColumnVis( 1, false );\n\t\t * } );\n\t\t */\n\t\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar i, iLen;\n\t\t\tvar aoColumns = oSettings.aoColumns;\n\t\t\tvar aoData = oSettings.aoData;\n\t\t\tvar nTd, bAppend, iBefore;\n\t\t\t\n\t\t\t/* No point in doing anything if we are requesting what is already true */\n\t\t\tif ( aoColumns[iCol].bVisible == bShow )\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Show the column */\n\t\t\tif ( bShow )\n\t\t\t{\n\t\t\t\tvar iInsert = 0;\n\t\t\t\tfor ( i=0 ; i<iCol ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( aoColumns[i].bVisible )\n\t\t\t\t\t{\n\t\t\t\t\t\tiInsert++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Nee
d to decide if we should use appendChild or insertBefore */\n\t\t\t\tbAppend = (iInsert >= _fnVisbleColumns( oSettings ));\n\t\t\n\t\t\t\t/* Which coloumn should we be inserting before? */\n\t\t\t\tif ( !bAppend )\n\t\t\t\t{\n\t\t\t\t\tfor ( i=iCol ; i<aoColumns.length ; i++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( aoColumns[i].bVisible )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiBefore = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\tfor ( i=0, iLen=aoData.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( aoData[i].nTr !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( bAppend )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taoData[i].nTr.appendChild( \n\t\t\t\t\t\t\t\taoData[i]._anHidden[iCol]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taoData[i].nTr.insertBefore(\n\t\t\t\t\t\t\t\taoData[i]._anHidden[iCol], \n\t\t\t\t\t\t\t\t_fnGetTdNodes( oSettings, i )[iBefore] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Remove a column from display */\n\t\
t\t\tfor ( i=0, iLen=aoData.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( aoData[i].nTr !== null )\n\t\t\t\t\t{\n\t\t\t\t\t\tnTd = _fnGetTdNodes( oSettings, i )[iCol];\n\t\t\t\t\t\taoData[i]._anHidden[iCol] = nTd;\n\t\t\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* Clear to set the visible flag */\n\t\t\taoColumns[iCol].bVisible = bShow;\n\t\t\n\t\t\t/* Redraw the header and footer based on the new column visibility */\n\t\t\t_fnDrawHead( oSettings, oSettings.aoHeader );\n\t\t\tif ( oSettings.nTFoot )\n\t\t\t{\n\t\t\t\t_fnDrawHead( oSettings, oSettings.aoFooter );\n\t\t\t}\n\t\t\t\n\t\t\t/* If there are any 'open' rows, then we need to alter the colspan for this col change */\n\t\t\tfor ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\toSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* Do a redraw incase anything depending on the table columns needs it \n\t\t\t * (built-in: scrolling) \n\t\
t\t */\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t\t_fnDraw( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t_fnSaveState( oSettings );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Get the settings for a particular table for external manipulation\n\t\t * @returns {object} DataTables settings object. See \n\t\t * {@link DataTable.models.oSettings}\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * var oSettings = oTable.fnSettings();\n\t\t * \n\t\t * // Show an example parameter from the settings\n\t\t * alert( oSettings._iDisplayStart );\n\t\t * } );\n\t\t */\n\t\tthis.fnSettings = function()\n\t\t{\n\t\t\treturn _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Sort the table by a particular column\n\t\t * @param {int} iCol the data index to sort on. Note that this will not match the \n\t\t * 'd
isplay index' if you have hidden data entries\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Sort immediately with columns 0 and 1\n\t\t * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t\t * } );\n\t\t */\n\t\tthis.fnSort = function( aaSort )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\toSettings.aaSorting = aaSort;\n\t\t\t_fnSort( oSettings );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Attach a sort listener to an element for a given column\n\t\t * @param {node} nNode the element to attach the sort listener to\n\t\t * @param {int} iColumn the column that a click on this node will sort on\n\t\t * @param {function} [fnCallback] callback function when sort is run\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * \n\t\t * // Sort on
column 1, when 'sorter' is clicked on\n\t\t * oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t\t * } );\n\t\t */\n\t\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t\t{\n\t\t\t_fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn,\n\t\t\t \tfnCallback );\n\t\t};\n\t\t\n\t\t\n\t\t/**\n\t\t * Update a table cell or row - this method will accept either a single value to\n\t\t * update the cell with, an array of values with one element for each column or\n\t\t * an object in the same format as the original data source. The function is\n\t\t * self-referencing in order to make the multi column updates easier.\n\t\t * @param {object|array|string} mData Data to update the cell/row with\n\t\t * @param {node|int} mRow TR element you want to update or the aoData index\n\t\t * @param {int} [iColumn] The column to update (not used of mData is an array or object)\n\t\t * @param {bool} [bRedraw=true] Redraw the table or not\n\t\t * @para
m {bool} [bAction=true] Perform pre-draw actions or not\n\t\t * @returns {int} 0 on success, 1 on error\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t\t * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row\n\t\t * } );\n\t\t */\n\t\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t\t{\n\t\t\tvar oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );\n\t\t\tvar i, iLen, sDisplay;\n\t\t\tvar iRow = (typeof mRow === 'object') ? \n\t\t\t\t_fnNodeToDataIndex(oSettings, mRow) : mRow;\n\t\t\t\n\t\t\tif ( $.isArray(mData) && iColumn === undefined )\n\t\t\t{\n\t\t\t\t/* Array update - update the whole row */\n\t\t\t\toSettings.aoData[iRow]._aData = mData.slice();\n\t\t\t\t\n\t\t\t\t/* Flag to the function that we are recursing */\n\t\t\t\tfor ( i=0 ; i<oSettings.aoColumns.length ; i++ )\n\t\t\t\t{\n\t\t
\t\t\tthis.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( $.isPlainObject(mData) && iColumn === undefined )\n\t\t\t{\n\t\t\t\t/* Object update - update the whole row - assume the developer gets the object right */\n\t\t\t\toSettings.aoData[iRow]._aData = $.extend( true, {}, mData );\n\t\t\n\t\t\t\tfor ( i=0 ; i<oSettings.aoColumns.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\tthis.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Individual cell update */\n\t\t\t\t_fnSetCellData( oSettings, iRow, iColumn, mData );\n\t\t\t\tsDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' );\n\t\t\t\t\n\t\t\t\tvar oCol = oSettings.aoColumns[iColumn];\n\t\t\t\tif ( oCol.fnRender !== null )\n\t\t\t\t{\n\t\t\t\t\tsDisplay = _fnRender( oSettings, iRow, iColumn );\n\t\t\t\t\tif ( oCol.bUseRendered )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnSetCellData( oSettings, iRow, iColumn, sDisplay );\n\t\t\t\t\t
}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( oSettings.aoData[iRow].nTr !== null )\n\t\t\t\t{\n\t\t\t\t\t/* Do the actual HTML update */\n\t\t\t\t\t_fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Modify the search index for this row (strictly this is likely not needed, since fnReDraw\n\t\t\t * will rebuild the search array - however, the redraw might be disabled by the user)\n\t\t\t */\n\t\t\tvar iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );\n\t\t\toSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(\n\t\t\t\toSettings, \n\t\t\t\t_fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )\n\t\t\t);\n\t\t\t\n\t\t\t/* Perform pre-draw actions */\n\t\t\tif ( bAction === undefined || bAction )\n\t\t\t{\n\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* Redraw the table */\n\t\t\tif ( bRedraw === undefined || bRedraw )\n\t\t\t{\n\t\t\t\t_fnReDraw( oSettings );\n\t\t\t}\n\t\t\treturn 0;\n\t\t};\n\t\t\n\t\t\
n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t\t * to ensure compatibility.\n\t\t * @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t\t * formats \"X\" and \"X.Y\" are also acceptable.\n\t\t * @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t\t * version, or false if this version of DataTales is not suitable\n\t\t * @method\n\t\t * @dtopt API\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t * } );\n\t\t */\n\t\tthis.fnVersionCheck = DataTable.ext.fnVersionCheck;\n\t\t\n\t\t\n\t\t/*\n\t\t * This is really a good bit rubbish this method of exposing the internal methods\n\t\t * publicly... - To be fixed in 2.0 using methods on the prototype\n\t\t */\n\t\t\n\t\t\n\t\t/**\n\t\t * Create a wrapper function for expo
rting an internal functions to an external API.\n\t\t * @param {string} sFunc API function name\n\t\t * @returns {function} wrapped function\n\t\t * @memberof DataTable#oApi\n\t\t */\n\t\tfunction _fnExternApiFunc (sFunc)\n\t\t{\n\t\t\treturn function() {\n\t\t\t\tvar aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( \n\t\t\t\t\tArray.prototype.slice.call(arguments) );\n\t\t\t\treturn DataTable.ext.oApi[sFunc].apply( this, aArgs );\n\t\t\t};\n\t\t}\n\t\t\n\t\t\n\t\t/**\n\t\t * Reference to internal functions for use by plug-in developers. Note that these\n\t\t * methods are references to internal functions and are considered to be private.\n\t\t * If you use these methods, be aware that they are liable to change between versions\n\t\t * (check the upgrade notes).\n\t\t * @namespace\n\t\t */\n\t\tthis.oApi = {\n\t\t\t\"_fnExternApiFunc\": _fnExternApiFunc,\n\t\t\t\"_fnInitialise\": _fnInitialise,\n\t\t\t\"_fnInitComplete\": _fnInitComplete,\n\t\t\t\"_fnLanguageCompat\": _fnLanguageCompa
t,\n\t\t\t\"_fnAddColumn\": _fnAddColumn,\n\t\t\t\"_fnColumnOptions\": _fnColumnOptions,\n\t\t\t\"_fnAddData\": _fnAddData,\n\t\t\t\"_fnCreateTr\": _fnCreateTr,\n\t\t\t\"_fnGatherData\": _fnGatherData,\n\t\t\t\"_fnBuildHead\": _fnBuildHead,\n\t\t\t\"_fnDrawHead\": _fnDrawHead,\n\t\t\t\"_fnDraw\": _fnDraw,\n\t\t\t\"_fnReDraw\": _fnReDraw,\n\t\t\t\"_fnAjaxUpdate\": _fnAjaxUpdate,\n\t\t\t\"_fnAjaxParameters\": _fnAjaxParameters,\n\t\t\t\"_fnAjaxUpdateDraw\": _fnAjaxUpdateDraw,\n\t\t\t\"_fnServerParams\": _fnServerParams,\n\t\t\t\"_fnAddOptionsHtml\": _fnAddOptionsHtml,\n\t\t\t\"_fnFeatureHtmlTable\": _fnFeatureHtmlTable,\n\t\t\t\"_fnScrollDraw\": _fnScrollDraw,\n\t\t\t\"_fnAdjustColumnSizing\": _fnAdjustColumnSizing,\n\t\t\t\"_fnFeatureHtmlFilter\": _fnFeatureHtmlFilter,\n\t\t\t\"_fnFilterComplete\": _fnFilterComplete,\n\t\t\t\"_fnFilterCustom\": _fnFilterCustom,\n\t\t\t\"_fnFilterColumn\": _fnFilterColumn,\n\t\t\t\"_fnFilter\": _fnFilter,\n\t\t\t\"_fnBuildSearchArray\": _fnBuildSearchArray,\n\t\t\t\"_fnBuildSe
archRow\": _fnBuildSearchRow,\n\t\t\t\"_fnFilterCreateSearch\": _fnFilterCreateSearch,\n\t\t\t\"_fnDataToSearch\": _fnDataToSearch,\n\t\t\t\"_fnSort\": _fnSort,\n\t\t\t\"_fnSortAttachListener\": _fnSortAttachListener,\n\t\t\t\"_fnSortingClasses\": _fnSortingClasses,\n\t\t\t\"_fnFeatureHtmlPaginate\": _fnFeatureHtmlPaginate,\n\t\t\t\"_fnPageChange\": _fnPageChange,\n\t\t\t\"_fnFeatureHtmlInfo\": _fnFeatureHtmlInfo,\n\t\t\t\"_fnUpdateInfo\": _fnUpdateInfo,\n\t\t\t\"_fnFeatureHtmlLength\": _fnFeatureHtmlLength,\n\t\t\t\"_fnFeatureHtmlProcessing\": _fnFeatureHtmlProcessing,\n\t\t\t\"_fnProcessingDisplay\": _fnProcessingDisplay,\n\t\t\t\"_fnVisibleToColumnIndex\": _fnVisibleToColumnIndex,\n\t\t\t\"_fnColumnIndexToVisible\": _fnColumnIndexToVisible,\n\t\t\t\"_fnNodeToDataIndex\": _fnNodeToDataIndex,\n\t\t\t\"_fnVisbleColumns\": _fnVisbleColumns,\n\t\t\t\"_fnCalculateEnd\": _fnCalculateEnd,\n\t\t\t\"_fnConvertToWidth\": _fnConvertToWidth,\n\t\t\t\"_fnCalculateColumnWidths\": _fnCalculateColumnWidths,\n\t\t\t\"_fnSc
rollingWidthAdjust\": _fnScrollingWidthAdjust,\n\t\t\t\"_fnGetWidestNode\": _fnGetWidestNode,\n\t\t\t\"_fnGetMaxLenString\": _fnGetMaxLenString,\n\t\t\t\"_fnStringToCss\": _fnStringToCss,\n\t\t\t\"_fnDetectType\": _fnDetectType,\n\t\t\t\"_fnSettingsFromNode\": _fnSettingsFromNode,\n\t\t\t\"_fnGetDataMaster\": _fnGetDataMaster,\n\t\t\t\"_fnGetTrNodes\": _fnGetTrNodes,\n\t\t\t\"_fnGetTdNodes\": _fnGetTdNodes,\n\t\t\t\"_fnEscapeRegex\": _fnEscapeRegex,\n\t\t\t\"_fnDeleteIndex\": _fnDeleteIndex,\n\t\t\t\"_fnReOrderIndex\": _fnReOrderIndex,\n\t\t\t\"_fnColumnOrdering\": _fnColumnOrdering,\n\t\t\t\"_fnLog\": _fnLog,\n\t\t\t\"_fnClearTable\": _fnClearTable,\n\t\t\t\"_fnSaveState\": _fnSaveState,\n\t\t\t\"_fnLoadState\": _fnLoadState,\n\t\t\t\"_fnCreateCookie\": _fnCreateCookie,\n\t\t\t\"_fnReadCookie\": _fnReadCookie,\n\t\t\t\"_fnDetectHeader\": _fnDetectHeader,\n\t\t\t\"_fnGetUniqueThs\": _fnGetUniqueThs,\n\t\t\t\"_fnScrollBarWidth\": _fnScrollBarWidth,\n\t\t\t\"_fnApplyToChildren\": _fnApplyToChildren,\n\t\t\t\"_
fnMap\": _fnMap,\n\t\t\t\"_fnGetRowData\": _fnGetRowData,\n\t\t\t\"_fnGetCellData\": _fnGetCellData,\n\t\t\t\"_fnSetCellData\": _fnSetCellData,\n\t\t\t\"_fnGetObjectDataFn\": _fnGetObjectDataFn,\n\t\t\t\"_fnSetObjectDataFn\": _fnSetObjectDataFn,\n\t\t\t\"_fnApplyColumnDefs\": _fnApplyColumnDefs,\n\t\t\t\"_fnBindAction\": _fnBindAction,\n\t\t\t\"_fnExtend\": _fnExtend,\n\t\t\t\"_fnCallbackReg\": _fnCallbackReg,\n\t\t\t\"_fnCallbackFire\": _fnCallbackFire,\n\t\t\t\"_fnJsonString\": _fnJsonString,\n\t\t\t\"_fnRender\": _fnRender,\n\t\t\t\"_fnNodeToColumnIndex\": _fnNodeToColumnIndex,\n\t\t\t\"_fnInfoMacros\": _fnInfoMacros,\n\t\t\t\"_fnBrowserDetect\": _fnBrowserDetect,\n\t\t\t\"_fnGetColumns\": _fnGetColumns\n\t\t};\n\t\t\n\t\t$.extend( DataTable.ext.oApi, this.oApi );\n\t\t\n\t\tfor ( var sFunc in DataTable.ext.oApi )\n\t\t{\n\t\t\tif ( sFunc )\n\t\t\t{\n\t\t\t\tthis[sFunc] = _fnExternApiFunc(sFunc);\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\tvar _that = this;\n\t\tthis.each(function() {\n\t\t\tvar i=0, iLen, j, jLen,
k, kLen;\n\t\t\tvar sId = this.getAttribute( 'id' );\n\t\t\tvar bInitHandedOff = false;\n\t\t\tvar bUsePassedData = false;\n\t\t\t\n\t\t\t\n\t\t\t/* Sanity check */\n\t\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t\t{\n\t\t\t\t_fnLog( null, 0, \"Attempted to initialise DataTables on a node which is not a \"+\n\t\t\t\t\t\"table: \"+this.nodeName );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t/* Check to see if we are re-initialising a table */\n\t\t\tfor ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t/* Base check on table node */\n\t\t\t\tif ( DataTable.settings[i].nTable == this )\n\t\t\t\t{\n\t\t\t\t\tif ( oInit === undefined || oInit.bRetrieve )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn DataTable.settings[i].oInstance;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( oInit.bDestroy )\n\t\t\t\t\t{\n\t\t\t\t\t\tDataTable.settings[i].oInstance.fnDestroy();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnLog( DataTable.settings[i], 0, \"Cannot reinitialise DataTable.\\n\\
n\"+\n\t\t\t\t\t\t\t\"To retrieve the DataTables object for this table, pass no arguments or see \"+\n\t\t\t\t\t\t\t\"the docs for bRetrieve and bDestroy\" );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t\t */\n\t\t\t\tif ( DataTable.settings[i].sTableId == this.id )\n\t\t\t\t{\n\t\t\t\t\tDataTable.settings.splice( i, 1 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* Ensure the table has an ID - required for accessibility */\n\t\t\tif ( sId === null || sId === \"\" )\n\t\t\t{\n\t\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._oExternConfig.iNextUnique++);\n\t\t\t\tthis.id = sId;\n\t\t\t}\n\t\t\t\n\t
\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\t\"nTable\": this,\n\t\t\t\t\"oApi\": _that.oApi,\n\t\t\t\t\"oInit\": oInit,\n\t\t\t\t\"sDestroyWidth\": $(this).width(),\n\t\t\t\t\"sInstance\": sId,\n\t\t\t\t\"sTableId\": sId\n\t\t\t} );\n\t\t\tDataTable.settings.push( oSettings );\n\t\t\t\n\t\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\t\toSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();\n\t\t\t\n\t\t\t/* Setting up the initialisation object */\n\t\t\tif ( !oInit )\n\t\t\t{\n\t\t\t\toInit = {};\n\t\t\t}\n\t\t\t\n\t\t\t// Backwards compatibility, before we apply all the defaults\n\t\t\tif ( oInit.oLanguage )\n\t\t\t{\n\t\t\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\t}\n\t\t\t\n\t\t\toIn
it = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit );\n\t\t\t\n\t\t\t// Map the initialisation options onto the settings object\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bPaginate\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bLengthChange\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bFilter\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bSort\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bInfo\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bProcessing\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bAutoWidth\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bSortClasses\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bServerSide\" );\n\t\t\t_fnMap( oSettings.oFeatures, oInit, \"bDeferRender\" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"sScrollX\", \"sX\" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"sScrollXInner\", \"sXInner\" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"sScrollY\", \"sY\" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"bScrollCollapse\", \"bCollapse\
" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"bScrollInfinite\", \"bInfinite\" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"iScrollLoadGap\", \"iLoadGap\" );\n\t\t\t_fnMap( oSettings.oScroll, oInit, \"bScrollAutoCss\", \"bAutoCss\" );\n\t\t\t_fnMap( oSettings, oInit, \"asStripeClasses\" );\n\t\t\t_fnMap( oSettings, oInit, \"asStripClasses\", \"asStripeClasses\" ); // legacy\n\t\t\t_fnMap( oSettings, oInit, \"fnServerData\" );\n\t\t\t_fnMap( oSettings, oInit, \"fnFormatNumber\" );\n\t\t\t_fnMap( oSettings, oInit, \"sServerMethod\" );\n\t\t\t_fnMap( oSettings, oInit, \"aaSorting\" );\n\t\t\t_fnMap( oSettings, oInit, \"aaSortingFixed\" );\n\t\t\t_fnMap( oSettings, oInit, \"aLengthMenu\" );\n\t\t\t_fnMap( oSettings, oInit, \"sPaginationType\" );\n\t\t\t_fnMap( oSettings, oInit, \"sAjaxSource\" );\n\t\t\t_fnMap( oSettings, oInit, \"sAjaxDataProp\" );\n\t\t\t_fnMap( oSettings, oInit, \"iCookieDuration\" );\n\t\t\t_fnMap( oSettings, oInit, \"sCookiePrefix\" );\n\t\t\t_fnMap( oSettings, oInit, \"sDom\" );\n\t\t\t
_fnMap( oSettings, oInit, \"bSortCellsTop\" );\n\t\t\t_fnMap( oSettings, oInit, \"iTabIndex\" );\n\t\t\t_fnMap( oSettings, oInit, \"oSearch\", \"oPreviousSearch\" );\n\t\t\t_fnMap( oSettings, oInit, \"aoSearchCols\", \"aoPreSearchCols\" );\n\t\t\t_fnMap( oSettings, oInit, \"iDisplayLength\", \"_iDisplayLength\" );\n\t\t\t_fnMap( oSettings, oInit, \"bJQueryUI\", \"bJUI\" );\n\t\t\t_fnMap( oSettings, oInit, \"fnCookieCallback\" );\n\t\t\t_fnMap( oSettings, oInit, \"fnStateLoad\" );\n\t\t\t_fnMap( oSettings, oInit, \"fnStateSave\" );\n\t\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\t\n\t\t\t/* Callback functions which are array driven */\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLo
adParams, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' );\n\t\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' );\n\t\t\t\n\t\t\tif ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&\n\t\t\t\t oSettings.oFeatures.bSortClasses )\n\t\t\t{\n\t\t\t\t/* Enable sort classes for server-side processing. Safe to do it here, since server-side\n\t\t\t\t * processing must be enabled by the developer\n\t\t\t\t */\n\t\t\t\t_fnCallbackReg( oSet
tings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' );\n\t\t\t}\n\t\t\telse if ( oSettings.oFeatures.bDeferRender )\n\t\t\t{\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' );\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.bJQueryUI )\n\t\t\t{\n\t\t\t\t/* Use the JUI classes object for display. You could clone the oStdClasses object if \n\t\t\t\t * you want to have multiple tables with multiple independent classes \n\t\t\t\t */\n\t\t\t\t$.extend( oSettings.oClasses, DataTable.ext.oJUIClasses );\n\t\t\t\t\n\t\t\t\tif ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === \"lfrtip\" )\n\t\t\t\t{\n\t\t\t\t\t/* Set the DOM to use a layout suitable for jQuery UI's theming */\n\t\t\t\t\toSettings.sDom = '<\"H\"lfr>t<\"F\"ip>';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$.extend( oSettings.oClasses, DataTable.ext.oStdClasses );\n\t\t\t}\n\t\t\t$(this).addClass( oSettings.oClasses.sTable );\n\t\t\t\n\t\t\t/* Calculate the scroll bar width a
nd cache it for use later on */\n\t\t\tif ( oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\" )\n\t\t\t{\n\t\t\t\toSettings.oScroll.iBarWidth = _fnScrollBarWidth();\n\t\t\t}\n\t\t\t\n\t\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t\t{\n\t\t\t\t/* Display start point, taking into account the save saving */\n\t\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t\t}\n\t\t\t\n\t\t\t/* Must be done after everything which can be overridden by a cookie! */\n\t\t\tif ( oInit.bStateSave )\n\t\t\t{\n\t\t\t\toSettings.oFeatures.bStateSave = true;\n\t\t\t\t_fnLoadState( oSettings, oInit );\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.iDeferLoading !== null )\n\t\t\t{\n\t\t\t\toSettings.bDeferLoading = true;\n\t\t\t\tvar tmp = $.isArray( oInit.iDeferLoading );\n\t\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\t\t
oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t\t}\n\t\t\t\n\t\t\tif ( oInit.aaData !== null )\n\t\t\t{\n\t\t\t\tbUsePassedData = true;\n\t\t\t}\n\t\t\t\n\t\t\t/* Language definitions */\n\t\t\tif ( oInit.oLanguage.sUrl !== \"\" )\n\t\t\t{\n\t\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that \n\t\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t\t */\n\t\t\t\toSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;\n\t\t\t\t$.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {\n\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t$.extend( true, oSettings.oLanguage, oInit.oLanguage, json );\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t} );\n\t\t\t\tbInitHandedOff = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$.extend( true, oSettings.oLanguage, oInit.oLanguage );\n\t\t\t}\n\t\t\t\n\t\t
\t\n\t\t\t/*\n\t\t\t * Stripes\n\t\t\t */\n\t\t\tif ( oInit.asStripeClasses === null )\n\t\t\t{\n\t\t\t\toSettings.asStripeClasses =[\n\t\t\t\t\toSettings.oClasses.sStripeOdd,\n\t\t\t\t\toSettings.oClasses.sStripeEven\n\t\t\t\t];\n\t\t\t}\n\t\t\t\n\t\t\t/* Remove row stripe classes if they are already on the table row */\n\t\t\tiLen=oSettings.asStripeClasses.length;\n\t\t\toSettings.asDestroyStripes = [];\n\t\t\tif (iLen)\n\t\t\t{\n\t\t\t\tvar bStripeRemove = false;\n\t\t\t\tvar anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');\n\t\t\t\tfor ( i=0 ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tif ( anRows.hasClass( oSettings.asStripeClasses[i] ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tbStripeRemove = true;\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* Store the classes which we are about to remove so they can be re-added on destroy */\n\t\t\t\t\t\toSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( bStripeRemove )\n\t\t\t\t{\n\t\t\t\t\tanRows.removeClass( oSettings.a
sStripeClasses.join(' ') );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * Columns\n\t\t\t * See if we should load columns automatically or use defined ones\n\t\t\t */\n\t\t\tvar anThs = [];\n\t\t\tvar aoColumnsInit;\n\t\t\tvar nThead = this.getElementsByTagName('thead');\n\t\t\tif ( nThead.length !== 0 )\n\t\t\t{\n\t\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* If not given a column array, generate one with nulls */\n\t\t\tif ( oInit.aoColumns === null )\n\t\t\t{\n\t\t\t\taoColumnsInit = [];\n\t\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\taoColumnsInit.push( null );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t\t}\n\t\t\t\n\t\t\t/* Add the columns */\n\t\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\t/* Short cut - use the loop to check if we have column visibility state to restore */\n\t\t\t\tif ( oInit.saved_aoColumns !== u
ndefined && oInit.saved_aoColumns.length == iLen )\n\t\t\t\t{\n\t\t\t\t\tif ( aoColumnsInit[i] === null )\n\t\t\t\t\t{\n\t\t\t\t\t\taoColumnsInit[i] = {};\n\t\t\t\t\t}\n\t\t\t\t\taoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t\t}\n\t\t\t\n\t\t\t/* Apply the column definitions */\n\t\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t\t} );\n\t\t\t\n\t\t\t\n\t\t\t/*\n\t\t\t * Sorting\n\t\t\t * Check the aaSorting array\n\t\t\t */\n\t\t\tfor ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )\n\t\t\t\t{\n\t\t\t\t\toSettings.aaSorting[i][0] = 0;\n\t\t\t\t}\n\t\t\t\tvar oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];\n\t\t\t\t\n\t\t\t\t/* Add a default sorting index */\n\t\t\t\tif ( oSettings.aaSorting[i][2] === undefi
ned )\n\t\t\t\t{\n\t\t\t\t\toSettings.aaSorting[i][2] = 0;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* If aaSorting is not defined, then we use the first indicator in asSorting */\n\t\t\t\tif ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined )\n\t\t\t\t{\n\t\t\t\t\toSettings.aaSorting[i][1] = oColumn.asSorting[0];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Set the current sorting index based on aoColumns.asSorting */\n\t\t\t\tfor ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )\n\t\t\t\t{\n\t\t\t\t\tif ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )\n\t\t\t\t\t{\n\t\t\t\t\t\toSettings.aaSorting[i][2] = j;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\n\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t */\n\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\n\t\t\t\n\t\t\t/*\n\t\t\t * Final init\n\t\t\t * Cache the header, body and footer as required, creating th
em if needed\n\t\t\t */\n\t\t\t\n\t\t\t/* Browser support detection */\n\t\t\t_fnBrowserDetect( oSettings );\n\t\t\t\n\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\tvar captions = $(this).children('caption').each( function () {\n\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t} );\n\t\t\t\n\t\t\tvar thead = $(this).children('thead');\n\t\t\tif ( thead.length === 0 )\n\t\t\t{\n\t\t\t\tthead = [ document.createElement( 'thead' ) ];\n\t\t\t\tthis.appendChild( thead[0] );\n\t\t\t}\n\t\t\toSettings.nTHead = thead[0];\n\t\t\t\n\t\t\tvar tbody = $(this).children('tbody');\n\t\t\tif ( tbody.length === 0 )\n\t\t\t{\n\t\t\t\ttbody = [ document.createElement( 'tbody' ) ];\n\t\t\t\tthis.appendChild( tbody[0] );\n\t\t\t}\n\t\t\toSettings.nTBody = tbody[0];\n\t\t\toSettings.nTBody.setAttribute( \"role\", \"alert\" );\n\t\t\toSettings.nTBody.setAttribute( \"aria-live\", \"polite\" );\n\t\t\toSettings.nTBody.setAttribute( \"aria-relevant\", \"all\" );\n\t\t
\t\n\t\t\tvar tfoot = $(this).children('tfoot');\n\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") )\n\t\t\t{\n\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\ttfoot = [ document.createElement( 'tfoot' ) ];\n\t\t\t\tthis.appendChild( tfoot[0] );\n\t\t\t}\n\t\t\t\n\t\t\tif ( tfoot.length > 0 )\n\t\t\t{\n\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t}\n\t\t\t\n\t\t\t/* Check if there is data passing into the constructor */\n\t\t\tif ( bUsePassedData )\n\t\t\t{\n\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ )\n\t\t\t\t{\n\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t/* Grab the data from the page */\n\t\t\t\t_fnGatherData( oSettings );\n\t\t\t}\n\t\t\t\n\t\t\t/* Copy the data index array */\n\t\t\t
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\t\n\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\toSettings.bInitialised = true;\n\t\t\t\n\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t * language processor)\n\t\t\t */\n\t\t\tif ( bInitHandedOff === false )\n\t\t\t{\n\t\t\t\t_fnInitialise( oSettings );\n\t\t\t}\n\t\t} );\n\t\t_that = null;\n\t\treturn this;\n\t};\n\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t * to ensure compatibility.\n\t * @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t * formats \"X\" and \"X.Y\" are also acceptable.\n\t * @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t * version, or false if this version of DataTales is not suitable\n\t * @static\n\t * @dtopt API-Static\n\t *\n\t * @example\n\t * alert( $.fn.dataTable.fnVersio
nCheck( '1.9.0' ) );\n\t */\n\tDataTable.fnVersionCheck = function( sVersion )\n\t{\n\t\t/* This is cheap, but effective */\n\t\tvar fnZPad = function (Zpad, count)\n\t\t{\n\t\t\twhile(Zpad.length < count) {\n\t\t\t\tZpad += '0';\n\t\t\t}\n\t\t\treturn Zpad;\n\t\t};\n\t\tvar aThis = DataTable.ext.sVersion.split('.');\n\t\tvar aThat = sVersion.split('.');\n\t\tvar sThis = '', sThat = '';\n\t\t\n\t\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tsThis += fnZPad( aThis[i], 3 );\n\t\t\tsThat += fnZPad( aThat[i], 3 );\n\t\t}\n\t\t\n\t\treturn parseInt(sThis, 10) >= parseInt(sThat, 10);\n\t};\n\t\n\t\n\t/**\n\t * Check if a TABLE node is a DataTable table already or not.\n\t * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other\n\t * node types can be passed in, but will always return false).\n\t * @returns {boolean} true the table given is a DataTable, or false otherwise\n\t * @static\n\t * @dtopt API-Static\n\t *\n\t * @example\n\t * var ex = docu
ment.getElementById('example');\n\t * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {\n\t * $(ex).dataTable();\n\t * }\n\t */\n\tDataTable.fnIsDataTable = function ( nTable )\n\t{\n\t\tvar o = DataTable.settings;\n\t\n\t\tfor ( var i=0 ; i<o.length ; i++ )\n\t\t{\n\t\t\tif ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\n\t\treturn false;\n\t};\n\t\n\t\n\t/**\n\t * Get all DataTable tables that have been initialised - optionally you can select to\n\t * get only currently visible tables.\n\t * @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or \n\t * visible tables only.\n\t * @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables\n\t * @static\n\t * @dtopt API-Static\n\t *\n\t * @example\n\t * var table = $.fn.dataTable.fnTables(true);\n\t * if ( table.length > 0 ) {\n\t * $(table).dataTable().fnAdjustColumnSizing();\n\t * }\n\t
*/\n\tDataTable.fnTables = function ( bVisible )\n\t{\n\t\tvar out = [];\n\t\n\t\tjQuery.each( DataTable.settings, function (i, o) {\n\t\t\tif ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )\n\t\t\t{\n\t\t\t\tout.push( o.nTable );\n\t\t\t}\n\t\t} );\n\t\n\t\treturn out;\n\t};\n\t\n\n\t/**\n\t * Version string for plug-ins to check compatibility. Allowed format is\n\t * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and\n\t * e are optional\n\t * @member\n\t * @type string\n\t * @default Version number\n\t */\n\tDataTable.version = \"1.9.4\";\n\n\t/**\n\t * Private data store, containing all of the settings objects that are created for the\n\t * tables on a given page.\n\t * \n\t * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i> \n\t * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>.\n\t * @member\n\t * @type array\n\t * @default []\n\t * @private\n\t */\n\tDataTable.settings = [];
\n\n\t/**\n\t * Object models container, for the various models that DataTables has available\n\t * to it. These models define the objects that are used to hold the active state \n\t * and configuration of the table.\n\t * @namespace\n\t */\n\tDataTable.models = {};\n\t\n\t\n\t/**\n\t * DataTables extension options and plug-ins. This namespace acts as a collection \"area\"\n\t * for plug-ins that can be used to extend the default DataTables behaviour - indeed many\n\t * of the build in methods use this method to provide their own capabilities (sorting methods\n\t * for example).\n\t * \n\t * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed\n\t * and modified by plug-ins.\n\t * @namespace\n\t */\n\tDataTable.models.ext = {\n\t\t/**\n\t\t * Plug-in filtering functions - this method of filtering is complimentary to the default\n\t\t * type based filtering, and a lot more comprehensive as it allows you complete control\n\t\t * over the filtering logic. Each element in
this array is a function (parameters\n\t\t * described below) that is called for every row in the table, and your logic decides if\n\t\t * it should be included in the filtered data set or not.\n\t\t * <ul>\n\t\t * <li>\n\t\t * Function input parameters:\n\t\t * <ul>\n\t\t * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>\n\t\t * <li>{array|object} Data for the row to be processed (same as the original format\n\t\t * that was passed in as the data source, or an array from a DOM data source</li>\n\t\t * <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can\n\t\t * be useful to retrieve the TR element if you need DOM interaction.</li>\n\t\t * </ul>\n\t\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>{boolean} Include the row in the filtered result set (true) or not (false)</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t *
</ul>\n\t\t * @type array\n\t\t * @default []\n\t\t *\n\t\t * @example\n\t\t * // The following example shows custom filtering being applied to the fourth column (i.e.\n\t\t * // the aData[3] index) based on two input values from the end-user, matching the data in \n\t\t * // a certain range.\n\t\t * $.fn.dataTableExt.afnFiltering.push(\n\t\t * function( oSettings, aData, iDataIndex ) {\n\t\t * var iMin = document.getElementById('min').value * 1;\n\t\t * var iMax = document.getElementById('max').value * 1;\n\t\t * var iVersion = aData[3] == \"-\" ? 0 : aData[3]*1;\n\t\t * if ( iMin == \"\" && iMax == \"\" ) {\n\t\t * return true;\n\t\t * }\n\t\t * else if ( iMin == \"\" && iVersion < iMax ) {\n\t\t * return true;\n\t\t * }\n\t\t * else if ( iMin < iVersion && \"\" == iMax ) {\n\t\t * return true;\n\t\t * }\n\t\t * else if ( iMin < iVersion && iVersion < iMax ) {\n\t\t * return true
;\n\t\t * }\n\t\t * return false;\n\t\t * }\n\t\t * );\n\t\t */\n\t\t\"afnFiltering\": [],\n\t\n\t\n\t\t/**\n\t\t * Plug-in sorting functions - this method of sorting is complimentary to the default type\n\t\t * based sorting that DataTables does automatically, allowing much greater control over the\n\t\t * the data that is being used to sort a column. This is useful if you want to do sorting\n\t\t * based on live data (for example the contents of an 'input' element) rather than just the\n\t\t * static string that DataTables knows of. The way these plug-ins work is that you create\n\t\t * an array of the values you wish to be sorted for the column in question and then return\n\t\t * that array. Which pre-sorting function is run here depends on the sSortDataType parameter\n\t\t * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort \n\t\t * data.\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t *
<li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>\n\t * <li>{int} Target column index</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>{array} Data for the column to be sorted upon</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * \n\t\t * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for\n\t\t * the different uses that DataTables can put the data to. Specifically <i>mData</i> when\n\t\t * used as a function will give you a 'type' (sorting, filtering etc) that you can use to \n\t\t * prepare the data as required for the different types. As such, this method is deprecated.\n\t\t * @type array\n\t\t * @default []\n\t\t * @deprecated\n\t\t *\n\t\t * @example\n\t\t * // Updating the cached sorting information with user entered values in HTML input elements\n\t\t * jQuery.fn.dataTableExt.afnSortData['dom-text'
] = function ( oSettings, iColumn )\n\t\t * {\n\t\t * var aData = [];\n\t\t * $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {\n\t\t * aData.push( this.value );\n\t\t * } );\n\t\t * return aData;\n\t\t * }\n\t\t */\n\t\t\"afnSortData\": [],\n\t\n\t\n\t\t/**\n\t\t * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are\n\t\t * available to DataTables. These feature plug-ins are accessible through the sDom initialisation\n\t\t * option. As such, each feature plug-in must describe a function that is used to initialise\n\t\t * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name\n\t\t * of the feature (sFeature). Thus the objects attached to this method must provide:\n\t\t * <ul>\n\t\t * <li>{function} fnInit Initialisation of the plug-in\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t
* <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>{node|null} The element which contains your feature. Note that the return\n\t\t * may also be void if your plug-in does not require to inject any DOM elements \n\t\t * into DataTables control (sDom) - for example this might be useful when \n\t\t * developing a plug-in which allows table control via keyboard entry.</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * </li>\n\t\t * <li>{character} cFeature Character that will be matched in sDom - case sensitive</li>\n\t\t * <li>{string} sFeature Feature name</li>\n\t\t * </ul>\n\t\t * @type array\n\t\t * @default []\n\t\t * \n\t\t * @example\n\t\t * // How TableTools initialises itself.\n\t\t * $.fn.dataTableExt.aoFeat
ures.push( {\n\t\t * \"fnInit\": function( oSettings ) {\n\t\t * return new TableTools( { \"oDTSettings\": oSettings } );\n\t\t * },\n\t\t * \"cFeature\": \"T\",\n\t\t * \"sFeature\": \"TableTools\"\n\t\t * } );\n\t\t */\n\t\t\"aoFeatures\": [],\n\t\n\t\n\t\t/**\n\t\t * Type detection plug-in functions - DataTables utilises types to define how sorting and\n\t\t * filtering behave, and types can be either be defined by the developer (sType for the\n\t\t * column) or they can be automatically detected by the methods in this array. The functions\n\t\t * defined in the array are quite simple, taking a single parameter (the data to analyse) \n\t\t * and returning the type if it is a known type, or null otherwise.\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t * <li>{*} Data from the column cell to be analysed</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <u
l>\n\t\t * <li>{string|null} Data type detected, or null if unknown (and thus pass it\n\t\t * on to the other type detection functions.</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * @type array\n\t\t * @default []\n\t\t * \n\t\t * @example\n\t\t * // Currency type detection plug-in:\n\t\t * jQuery.fn.dataTableExt.aTypes.push(\n\t\t * function ( sData ) {\n\t\t * var sValidChars = \"0123456789.-\";\n\t\t * var Char;\n\t\t * \n\t\t * // Check the numeric part\n\t\t * for ( i=1 ; i<sData.length ; i++ ) {\n\t\t * Char = sData.charAt(i); \n\t\t * if (sValidChars.indexOf(Char) == -1) {\n\t\t * return null;\n\t\t * }\n\t\t * }\n\t\t * \n\t\t * // Check prefixed by currency\n\t\t * if ( sData.charAt(0) == '$' || sData.charAt(0) == '£' ) {\n\t\t * return 'currency';\n\t\t * }\n\t\t * return null;\n\t\t * }\n\t\t * );\n\t\t */\n\
t\t\"aTypes\": [],\n\t\n\t\n\t\t/**\n\t\t * Provide a common method for plug-ins to check the version of DataTables being used, \n\t\t * in order to ensure compatibility.\n\t\t * @type function\n\t\t * @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note \n\t\t * that the formats \"X\" and \"X.Y\" are also acceptable.\n\t\t * @returns {boolean} true if this version of DataTables is greater or equal to the \n\t\t * required version, or false if this version of DataTales is not suitable\n\t\t *\n\t\t * @example\n\t\t * $(document).ready(function() {\n\t\t * var oTable = $('#example').dataTable();\n\t\t * alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t\t * } );\n\t\t */\n\t\t\"fnVersionCheck\": DataTable.fnVersionCheck,\n\t\n\t\n\t\t/**\n\t\t * Index for what 'this' index API functions should use\n\t\t * @type int\n\t\t * @default 0\n\t\t */\n\t\t\"iApiIndex\": 0,\n\t\n\t\n\t\t/**\n\t\t * Pre-processing of filtering data plug-ins - When you assign the sT
ype for a column\n\t\t * (or have it automatically detected for you by DataTables or a type detection plug-in), \n\t\t * you will typically be using this for custom sorting, but it can also be used to provide \n\t\t * custom filtering by allowing you to pre-processing the data and returning the data in\n\t\t * the format that should be filtered upon. This is done by adding functions this object \n\t\t * with a parameter name which matches the sType for that target column. This is the\n\t\t * corollary of <i>afnSortData</i> for filtering data.\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t * <li>{*} Data from the column cell to be prepared for filtering</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>{string|null} Formatted string that will be used for the filtering.</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * \n\t\t * Note that as of v1.
9, it is typically preferable to use <i>mData</i> to prepare data for\n\t\t * the different uses that DataTables can put the data to. Specifically <i>mData</i> when\n\t\t * used as a function will give you a 'type' (sorting, filtering etc) that you can use to \n\t\t * prepare the data as required for the different types. As such, this method is deprecated.\n\t\t * @type object\n\t\t * @default {}\n\t\t * @deprecated\n\t\t *\n\t\t * @example\n\t\t * $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) {\n\t\t * return sData.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t * }\n\t\t */\n\t\t\"ofnSearch\": {},\n\t\n\t\n\t\t/**\n\t\t * Container for all private functions in DataTables so they can be exposed externally\n\t\t * @type object\n\t\t * @default {}\n\t\t */\n\t\t\"oApi\": {},\n\t\n\t\n\t\t/**\n\t\t * Storage for the various classes that DataTables uses\n\t\t * @type object\n\t\t * @default {}\n\t\t */\n\t\t\"oStdClasses\": {},\n\t\t\n\t\n\t\t/**\n\t\t * Storage for
the various classes that DataTables uses - jQuery UI suitable\n\t\t * @type object\n\t\t * @default {}\n\t\t */\n\t\t\"oJUIClasses\": {},\n\t\n\t\n\t\t/**\n\t\t * Pagination plug-in methods - The style and controls of the pagination can significantly \n\t\t * impact on how the end user interacts with the data in your table, and DataTables allows \n\t\t * the addition of pagination controls by extending this object, which can then be enabled\n\t\t * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that\n\t\t * is added is an object (the property name of which is what <i>sPaginationType</i> refers\n\t\t * to) that has two properties, both methods that are used by DataTables to update the\n\t\t * control's state.\n\t\t * <ul>\n\t\t * <li>\n\t\t * fnInit - Initialisation of the paging controls. Called only during initialisation \n\t\t * of the table. It is expected that this function will add the required DOM elements \n\t\t * to the page for the p
aging controls to work. The element pointer \n\t\t * 'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging \n\t\t * controls (note that this is a 2D array to allow for multiple instances of each \n\t\t * DataTables DOM element). It is suggested that you add the controls to this element \n\t\t * as children\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>\n\t\t * <li>{node} Container into which the pagination controls must be inserted</li>\n\t\t * <li>{function} Draw callback function - whenever the controls cause a page\n\t\t * change, this method must be called to redraw the table.</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>No retur
n required</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * </il>\n\t\t * <li>\n\t\t * fnInit - This function is called whenever the paging status of the table changes and is\n\t\t * typically used to update classes and/or text of the paging controls to reflex the new \n\t\t * status.\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>\n\t\t * <li>{function} Draw callback function - in case you need to redraw the table again\n\t\t * or attach new event listeners</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>No return required</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * @type obje
ct\n\t\t * @default {}\n\t\t *\n\t\t * @example\n\t\t * $.fn.dataTableExt.oPagination.four_button = {\n\t\t * \"fnInit\": function ( oSettings, nPaging, fnCallbackDraw ) {\n\t\t * nFirst = document.createElement( 'span' );\n\t\t * nPrevious = document.createElement( 'span' );\n\t\t * nNext = document.createElement( 'span' );\n\t\t * nLast = document.createElement( 'span' );\n\t\t * \n\t\t * nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) );\n\t\t * nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) );\n\t\t * nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) );\n\t\t * nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) );\n\t\t * \n\t\t * nFirst.className = \"paginate_button first\";\n\t\t * nPrevious.className = \"paginate_button previous\";\n\t\t * nNext.className=\"pagin
ate_button next\";\n\t\t * nLast.className = \"paginate_button last\";\n\t\t * \n\t\t * nPaging.appendChild( nFirst );\n\t\t * nPaging.appendChild( nPrevious );\n\t\t * nPaging.appendChild( nNext );\n\t\t * nPaging.appendChild( nLast );\n\t\t * \n\t\t * $(nFirst).click( function () {\n\t\t * oSettings.oApi._fnPageChange( oSettings, \"first\" );\n\t\t * fnCallbackDraw( oSettings );\n\t\t * } );\n\t\t * \n\t\t * $(nPrevious).click( function() {\n\t\t * oSettings.oApi._fnPageChange( oSettings, \"previous\" );\n\t\t * fnCallbackDraw( oSettings );\n\t\t * } );\n\t\t * \n\t\t * $(nNext).click( function() {\n\t\t * oSettings.oApi._fnPageChange( oSettings, \"next\" );\n\t\t * fnCallbackDraw( oSettings );\n\t\t * } );\n\t\t * \n\t\t * $(nLast).click( function() {\n\t\t * oSettings.oApi._fnPageChange( oSettings, \"last\" );\n\t\t *
fnCallbackDraw( oSettings );\n\t\t * } );\n\t\t * \n\t\t * $(nFirst).bind( 'selectstart', function () { return false; } );\n\t\t * $(nPrevious).bind( 'selectstart', function () { return false; } );\n\t\t * $(nNext).bind( 'selectstart', function () { return false; } );\n\t\t * $(nLast).bind( 'selectstart', function () { return false; } );\n\t\t * },\n\t\t * \n\t\t * \"fnUpdate\": function ( oSettings, fnCallbackDraw ) {\n\t\t * if ( !oSettings.aanFeatures.p ) {\n\t\t * return;\n\t\t * }\n\t\t * \n\t\t * // Loop over each instance of the pager\n\t\t * var an = oSettings.aanFeatures.p;\n\t\t * for ( var i=0, iLen=an.length ; i<iLen ; i++ ) {\n\t\t * var buttons = an[i].getElementsByTagName('span');\n\t\t * if ( oSettings._iDisplayStart === 0 ) {\n\t\t * buttons[0].className = \"paginate_disabled_previous\";\n\t\t * buttons[1].className = \"paginate_disabled_previo
us\";\n\t\t * }\n\t\t * else {\n\t\t * buttons[0].className = \"paginate_enabled_previous\";\n\t\t * buttons[1].className = \"paginate_enabled_previous\";\n\t\t * }\n\t\t * \n\t\t * if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) {\n\t\t * buttons[2].className = \"paginate_disabled_next\";\n\t\t * buttons[3].className = \"paginate_disabled_next\";\n\t\t * }\n\t\t * else {\n\t\t * buttons[2].className = \"paginate_enabled_next\";\n\t\t * buttons[3].className = \"paginate_enabled_next\";\n\t\t * }\n\t\t * }\n\t\t * }\n\t\t * };\n\t\t */\n\t\t\"oPagination\": {},\n\t\n\t\n\t\t/**\n\t\t * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the\n\t\t * data column (you can add your own type detection functions, or override automatic \n\t\t * detection using sType). With this specific type given to the column, DataTable
s will \n\t\t * apply the required sort from the functions in the object. Each sort type must provide\n\t\t * two mandatory methods, one each for ascending and descending sorting, and can optionally\n\t\t * provide a pre-formatting method that will help speed up sorting by allowing DataTables\n\t\t * to pre-format the sort data only once (rather than every time the actual sort functions\n\t\t * are run). The two sorting functions are typical Javascript sort methods:\n\t\t * <ul>\n\t * <li>\n\t * Function input parameters:\n\t * <ul>\n\t\t * <li>{*} Data to compare to the second parameter</li>\n\t\t * <li>{*} Data to compare to the first parameter</li>\n\t * </ul>\n\t * </li>\n\t\t * <li>\n\t\t * Function return:\n\t\t * <ul>\n\t\t * <li>{int} Sorting match: <0 if first parameter should be sorted lower than\n\t\t * the second parameter, ===0 if the two parameters are equal and >0 if\n\t\t * the first pa
rameter should be sorted height than the second parameter.</li>\n\t\t * </ul>\n\t\t * </il>\n\t\t * </ul>\n\t\t * @type object\n\t\t * @default {}\n\t\t *\n\t\t * @example\n\t\t * // Case-sensitive string sorting, with no pre-formatting method\n\t\t * $.extend( $.fn.dataTableExt.oSort, {\n\t\t * \"string-case-asc\": function(x,y) {\n\t\t * return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t * },\n\t\t * \"string-case-desc\": function(x,y) {\n\t\t * return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t * }\n\t\t * } );\n\t\t *\n\t\t * @example\n\t\t * // Case-insensitive string sorting, with pre-formatting\n\t\t * $.extend( $.fn.dataTableExt.oSort, {\n\t\t * \"string-pre\": function(x) {\n\t\t * return x.toLowerCase();\n\t\t * },\n\t\t * \"string-asc\": function(x,y) {\n\t\t * return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t * },\n\t\t * \"string-desc\": function(x,y) {\n\t\t * return ((x < y) ? 1 : ((x > y)
? -1 : 0));\n\t\t * }\n\t\t * } );\n\t\t */\n\t\t\"oSort\": {},\n\t\n\t\n\t\t/**\n\t\t * Version string for plug-ins to check compatibility. Allowed format is\n\t\t * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and\n\t\t * e are optional\n\t\t * @type string\n\t\t * @default Version number\n\t\t */\n\t\t\"sVersion\": DataTable.version,\n\t\n\t\n\t\t/**\n\t\t * How should DataTables report an error. Can take the value 'alert' or 'throw'\n\t\t * @type string\n\t\t * @default alert\n\t\t */\n\t\t\"sErrMode\": \"alert\",\n\t\n\t\n\t\t/**\n\t\t * Store information for DataTables to access globally about other instances\n\t\t * @namespace\n\t\t * @private\n\t\t */\n\t\t\"_oExternConfig\": {\n\t\t\t/* int:iNextUnique - next unique number for an instance */\n\t\t\t\"iNextUnique\": 0\n\t\t}\n\t};\n\t\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * search information for the global filter and individual column filters.\n\t *
@namespace\n\t */\n\tDataTable.models.oSearch = {\n\t\t/**\n\t\t * Flag to indicate if the filtering should be case insensitive or not\n\t\t * @type boolean\n\t\t * @default true\n\t\t */\n\t\t\"bCaseInsensitive\": true,\n\t\n\t\t/**\n\t\t * Applied search term\n\t\t * @type string\n\t\t * @default <i>Empty string</i>\n\t\t */\n\t\t\"sSearch\": \"\",\n\t\n\t\t/**\n\t\t * Flag to indicate if the search term should be interpreted as a\n\t\t * regular expression (true) or not (false) and therefore and special\n\t\t * regex characters escaped.\n\t\t * @type boolean\n\t\t * @default false\n\t\t */\n\t\t\"bRegex\": false,\n\t\n\t\t/**\n\t\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t\t * @type boolean\n\t\t * @default true\n\t\t */\n\t\t\"bSmart\": true\n\t};\n\t\n\t\n\t\n\t\n\t/**\n\t * Template object for the way in which DataTables holds information about\n\t * each individual row. This is the object format used for the settings \n\t * aoData array.\n\t * @namespace\n\t *
/\n\tDataTable.models.oRow = {\n\t\t/**\n\t\t * TR element for the row\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTr\": null,\n\t\n\t\t/**\n\t\t * Data object from the original data source for the row. This is either\n\t\t * an array if using the traditional form of DataTables, or an object if\n\t\t * using mData options. The exact type will depend on the passed in\n\t\t * data from the data source, or will be an array if using DOM a data \n\t\t * source.\n\t\t * @type array|object\n\t\t * @default []\n\t\t */\n\t\t\"_aData\": [],\n\t\n\t\t/**\n\t\t * Sorting data cache - this array is ostensibly the same length as the\n\t\t * number of columns (although each index is generated only as it is \n\t\t * needed), and holds the data that is used for sorting each column in the\n\t\t * row. We do this cache generation at the start of the sort in order that\n\t\t * the formatting of the sort data need be done only once for each cell\n\t\t * per sort. This array should not be read from or written t
o by anything\n\t\t * other than the master sorting methods.\n\t\t * @type array\n\t\t * @default []\n\t\t * @private\n\t\t */\n\t\t\"_aSortData\": [],\n\t\n\t\t/**\n\t\t * Array of TD elements that are cached for hidden rows, so they can be\n\t\t * reinserted into the table if a column is made visible again (or to act\n\t\t * as a store if a column is made hidden). Only hidden columns have a \n\t\t * reference in the array. For non-hidden columns the value is either\n\t\t * undefined or null.\n\t\t * @type array nodes\n\t\t * @default []\n\t\t * @private\n\t\t */\n\t\t\"_anHidden\": [],\n\t\n\t\t/**\n\t\t * Cache of the class name that DataTables has applied to the row, so we\n\t\t * can quickly look at this variable rather than needing to do a DOM check\n\t\t * on className for the nTr property.\n\t\t * @type string\n\t\t * @default <i>Empty string</i>\n\t\t * @private\n\t\t */\n\t\t\"_sRowStripe\": \"\"\n\t};\n\t\n\t\n\t\n\t/**\n\t * Template object for the column information object in DataTables
. This object\n\t * is held in the settings aoColumns array and contains all the information that\n\t * DataTables needs about each individual column.\n\t * \n\t * Note that this object is related to {@link DataTable.defaults.columns} \n\t * but this one is the internal data store for DataTables's cache of columns.\n\t * It should NOT be manipulated outside of DataTables. Any configuration should\n\t * be done through the initialisation options.\n\t * @namespace\n\t */\n\tDataTable.models.oColumn = {\n\t\t/**\n\t\t * A list of the columns that sorting should occur on when this column\n\t\t * is sorted. That this property is an array allows multi-column sorting\n\t\t * to be defined for a column (for example first name / last name columns\n\t\t * would benefit from this). The values are integers pointing to the\n\t\t * columns to be sorted on (typically it will be a single integer pointing\n\t\t * at itself, but that doesn't need to be the case).\n\t\t * @type array\n\t\t */\n\t\t\"aDataSort\": null,\n\t\n\
t\t/**\n\t\t * Define the sorting directions that are applied to the column, in sequence\n\t\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t\t * as the sorting direction when the column if first sorted (clicked on).\n\t\t * Sort it again (click again) and it will move on to the next index.\n\t\t * Repeat until loop.\n\t\t * @type array\n\t\t */\n\t\t\"asSorting\": null,\n\t\t\n\t\t/**\n\t\t * Flag to indicate if the column is searchable, and thus should be included\n\t\t * in the filtering or not.\n\t\t * @type boolean\n\t\t */\n\t\t\"bSearchable\": null,\n\t\t\n\t\t/**\n\t\t * Flag to indicate if the column is sortable or not.\n\t\t * @type boolean\n\t\t */\n\t\t\"bSortable\": null,\n\t\t\n\t\t/**\n\t\t * <code>Deprecated</code> When using fnRender, you have two options for what \n\t\t * to do with the data, and this property serves as the switch. Firstly, you \n\t\t * can have the sorting and filtering use the rendered value (true - default), \n\t\t * or you can have the s
orting and filtering us the original value (false).\n\t\t *\n\t\t * Please note that this option has now been deprecated and will be removed\n\t\t * in the next version of DataTables. Please use mRender / mData rather than\n\t\t * fnRender.\n\t\t * @type boolean\n\t\t * @deprecated\n\t\t */\n\t\t\"bUseRendered\": null,\n\t\t\n\t\t/**\n\t\t * Flag to indicate if the column is currently visible in the table or not\n\t\t * @type boolean\n\t\t */\n\t\t\"bVisible\": null,\n\t\t\n\t\t/**\n\t\t * Flag to indicate to the type detection method if the automatic type\n\t\t * detection should be used, or if a column type (sType) has been specified\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @private\n\t\t */\n\t\t\"_bAutoType\": true,\n\t\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for
example) when the\n\t\t * element is available.\n\t\t * @type function\n\t\t * @param {element} nTd The TD node that has been created\n\t\t * @param {*} sData The Data for the cell\n\t\t * @param {array|object} oData The data for the whole row\n\t\t * @param {int} iRow The row index for the aoData data store\n\t\t * @default null\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\t\n\t\t/**\n\t\t * Function to get data from a cell in a column. You should <b>never</b>\n\t\t * access data directly through _aData internally in DataTables - always use\n\t\t * the method attached to this property. It allows mData to function as\n\t\t * required. This function is automatically assigned by the column \n\t\t * initialisation method\n\t\t * @type function\n\t\t * @param {array|object} oData The data array/object for the array \n\t\t * (i.e. aoData[]._aData)\n\t\t * @param {string} sSpecific The specific data type you want to get - \n\t\t * 'display', 'type' 'filter' 'sort'\n\t\t * @returns {*} The data for th
e cell from the given row's data\n\t\t * @default null\n\t\t */\n\t\t\"fnGetData\": null,\n\t\t\n\t\t/**\n\t\t * <code>Deprecated</code> Custom display function that will be called for the \n\t\t * display of each cell in this column.\n\t\t *\n\t\t * Please note that this option has now been deprecated and will be removed\n\t\t * in the next version of DataTables. Please use mRender / mData rather than\n\t\t * fnRender.\n\t\t * @type function\n\t\t * @param {object} o Object with the following parameters:\n\t\t * @param {int} o.iDataRow The row in aoData\n\t\t * @param {int} o.iDataColumn The column in question\n\t\t * @param {array} o.aData The data for the row in question\n\t\t * @param {object} o.oSettings The settings object for this DataTables instance\n\t\t * @returns {string} The string you which to use in the display\n\t\t * @default null\n\t\t * @deprecated\n\t\t */\n\t\t\"fnRender\": null,\n\t\t\n\t\t/**\n\t\t * Function to set data for a cell in the column. You should <b>never</b>
\n\t\t * set the data directly to _aData internally in DataTables - always use\n\t\t * this method. It allows mData to function as required. This function\n\t\t * is automatically assigned by the column initialisation method\n\t\t * @type function\n\t\t * @param {array|object} oData The data array/object for the array \n\t\t * (i.e. aoData[]._aData)\n\t\t * @param {*} sValue Value to set\n\t\t * @default null\n\t\t */\n\t\t\"fnSetData\": null,\n\t\t\n\t\t/**\n\t\t * Property to read the value for the cells in the column from the data \n\t\t * source array / object. If null, then the default content is used, if a\n\t\t * function is given then the return from the function is used.\n\t\t * @type function|int|string|null\n\t\t * @default null\n\t\t */\n\t\t\"mData\": null,\n\t\t\n\t\t/**\n\t\t * Partner property to mData which is used (only when defined) to get\n\t\t * the data - i.e. it is basically the same as mData, but without the\n\t\t * 'set' option, and also the data fed to it is the result fro
m mData.\n\t\t * This is the rendering method to match the data method of mData.\n\t\t * @type function|int|string|null\n\t\t * @default null\n\t\t */\n\t\t\"mRender\": null,\n\t\t\n\t\t/**\n\t\t * Unique header TH/TD element for this column - this is what the sorting\n\t\t * listener is attached to (if sorting is enabled.)\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTh\": null,\n\t\t\n\t\t/**\n\t\t * Unique footer TH/TD element for this column (if there is one). Not used \n\t\t * in DataTables as such, but can be used for plug-ins to reference the \n\t\t * footer for each column.\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTf\": null,\n\t\t\n\t\t/**\n\t\t * The class to apply to all TD elements in the table's TBODY for the column\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sClass\": null,\n\t\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\
t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer \n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t * @type string\n\t\t */\n\t\t\"sContentPadding\": null,\n\t\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because mData\n\t\t * is set to null, or because the data source itself is null).\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\t\n\t\t/**\n\t\t * Name for the column, allowing reference to the column by name as well as\n\t\t * by index (needs a lookup to work by name).\n\t\
t * @type string\n\t\t */\n\t\t\"sName\": null,\n\t\t\n\t\t/**\n\t\t * Custom sorting data type - defines which of the available plug-ins in\n\t\t * afnSortData the custom sorting will use - if any is defined.\n\t\t * @type string\n\t\t * @default std\n\t\t */\n\t\t\"sSortDataType\": 'std',\n\t\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sSortingClass\": null,\n\t\t\n\t\t/**\n\t\t * Class to be applied to the header element when sorting on this column -\n\t\t * when jQuery UI theming is used.\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sSortingClassJUI\": null,\n\t\t\n\t\t/**\n\t\t * Title of the column - what is seen in the TH element (nTh).\n\t\t * @type string\n\t\t */\n\t\t\"sTitle\": null,\n\t\t\n\t\t/**\n\t\t * Column sorting and filtering type\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sType\": null,\n\t\t\n\t\t/**\n\t\t * Width of the column\n\t\t * @type s
tring\n\t\t * @default null\n\t\t */\n\t\t\"sWidth\": null,\n\t\t\n\t\t/**\n\t\t * Width of the column when it was first \"encountered\"\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sWidthOrig\": null\n\t};\n\t\n\t\n\t\n\t/**\n\t * Initialisation options that can be given to DataTables at initialisation \n\t * time.\n\t * @namespace\n\t */\n\tDataTable.defaults = {\n\t\t/**\n\t\t * An array of data to use for the table, passed in at initialisation which \n\t\t * will be used in preference to any data which is already in the DOM. This is\n\t\t * particularly useful for constructing tables purely in Javascript, for\n\t\t * example with a custom Ajax call.\n\t\t * @type array\n\t\t * @default null\n\t\t * @dtopt Option\n\t\t * \n\t\t * @example\n\t\t * // Using a 2D array data source\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"aaData\": [\n\t\t * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t\t * ['
Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t\t * ],\n\t\t * \"aoColumns\": [\n\t\t * { \"sTitle\": \"Engine\" },\n\t\t * { \"sTitle\": \"Browser\" },\n\t\t * { \"sTitle\": \"Platform\" },\n\t\t * { \"sTitle\": \"Version\" },\n\t\t * { \"sTitle\": \"Grade\" }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using an array of objects as a data source (mData)\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"aaData\": [\n\t\t * {\n\t\t * \"engine\": \"Trident\",\n\t\t * \"browser\": \"Internet Explorer 4.0\",\n\t\t * \"platform\": \"Win 95+\",\n\t\t * \"version\": 4,\n\t\t * \"grade\": \"X\"\n\t\t * },\n\t\t * {\n\t\t * \"engine\": \"Trident\",\n\t\t * \"browser\": \"Internet Explorer 5.0\",\n\t\t * \"platform\": \"Win 95
+\",\n\t\t * \"version\": 5,\n\t\t * \"grade\": \"C\"\n\t\t * }\n\t\t * ],\n\t\t * \"aoColumns\": [\n\t\t * { \"sTitle\": \"Engine\", \"mData\": \"engine\" },\n\t\t * { \"sTitle\": \"Browser\", \"mData\": \"browser\" },\n\t\t * { \"sTitle\": \"Platform\", \"mData\": \"platform\" },\n\t\t * { \"sTitle\": \"Version\", \"mData\": \"version\" },\n\t\t * { \"sTitle\": \"Grade\", \"mData\": \"grade\" }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"aaData\": null,\n\t\n\t\n\t\t/**\n\t\t * If sorting is enabled, then DataTables will perform a first pass sort on \n\t\t * initialisation. You can define which column(s) the sort is performed upon, \n\t\t * and the sorting direction, with this variable. The aaSorting array should \n\t\t * contain an array for each column to be sorted initially containing the \n\t\t * column's index and a direction string ('asc' or 'desc').\n\t\t * @type array\n\t\t *
@default [[0,'asc']]\n\t\t * @dtopt Option\n\t\t * \n\t\t * @example\n\t\t * // Sort by 3rd column first, and then 4th column\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aaSorting\": [[2,'asc'], [3,'desc']]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * // No initial sorting\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aaSorting\": []\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"aaSorting\": [[0,'asc']],\n\t\n\t\n\t\t/**\n\t\t * This parameter is basically identical to the aaSorting parameter, but \n\t\t * cannot be overridden by user interaction with the table. What this means \n\t\t * is that you could have a column (visible or hidden) which the sorting will \n\t\t * always be forced on first - any sorting after that (from the user) will \n\t\t * then be performed as required. This can be useful for grouping rows \n\t\t * together.\n\t\t * @type array\n\t\t * @default null\
n\t\t * @dtopt Option\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aaSortingFixed\": [[0,'asc']]\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"aaSortingFixed\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to readily specify the entries in the length drop\n\t\t * down menu that DataTables shows when pagination is enabled. It can be \n\t\t * either a 1D array of options which will be used for both the displayed \n\t\t * option and the value, or a 2D array which will use the array in the first \n\t\t * position as the value, and the array in the second position as the \n\t\t * displayed options (useful for language strings such as 'All').\n\t\t * @type array\n\t\t * @default [ 10, 25, 50, 100 ]\n\t\t * @dtopt Option\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aLengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t\t * }
);\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Setting the default display length as well as length menu\n\t\t * // This is likely to be wanted if you remove the '10' option which\n\t\t * // is the iDisplayLength default.\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"iDisplayLength\": 25,\n\t\t * \"aLengthMenu\": [[25, 50, 100, -1], [25, 50, 100, \"All\"]]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\t\n\t\n\t\t/**\n\t\t * The aoColumns option in the initialisation parameter allows you to define\n\t\t * details about the way individual columns behave. For a full list of\n\t\t * column options that can be set, please see \n\t\t * {@link DataTable.defaults.columns}. Note that if you use aoColumns to\n\t\t * define your columns, you must have an entry in the array for every single\n\t\t * column that you have in your table (these can be null if you don't which\n\t\t * to specify any optio
ns).\n\t\t * @member\n\t\t */\n\t\t\"aoColumns\": null,\n\t\n\t\t/**\n\t\t * Very similar to aoColumns, aoColumnDefs allows you to target a specific \n\t\t * column, multiple columns, or all columns, using the aTargets property of \n\t\t * each object in the array. This allows great flexibility when creating \n\t\t * tables, as the aoColumnDefs arrays can be of any length, targeting the \n\t\t * columns you specifically want. aoColumnDefs may use any of the column \n\t\t * options available: {@link DataTable.defaults.columns}, but it _must_\n\t\t * have aTargets defined in each object in the array. Values in the aTargets\n\t\t * array may be:\n\t\t * <ul>\n\t\t * <li>a string - class name will be matched on the TH for the column</li>\n\t\t * <li>0 or a positive integer - column index counting from the left</li>\n\t\t * <li>a negative integer - column index counting from the right</li>\n\t\t * <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t\t * </ul>\n\t\t * @membe
r\n\t\t */\n\t\t\"aoColumnDefs\": null,\n\t\n\t\n\t\t/**\n\t\t * Basically the same as oSearch, this parameter defines the individual column\n\t\t * filtering state at initialisation time. The array must be of the same size \n\t\t * as the number of columns, and each element be an object with the parameters\n\t\t * \"sSearch\" and \"bEscapeRegex\" (the latter is optional). 'null' is also\n\t\t * accepted and the default will be used.\n\t\t * @type array\n\t\t * @default []\n\t\t * @dtopt Option\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoSearchCols\": [\n\t\t * null,\n\t\t * { \"sSearch\": \"My filter\" },\n\t\t * null,\n\t\t * { \"sSearch\": \"^[0-9]\", \"bEscapeRegex\": false }\n\t\t * ]\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"aoSearchCols\": [],\n\t\n\t\n\t\t/**\n\t\t * An array of CSS classes that should be applied to displayed rows. This \n\t\t * array may be of any
length, and DataTables will apply each class \n\t\t * sequentially, looping when required.\n\t\t * @type array\n\t\t * @default null <i>Will take the values determined by the oClasses.sStripe*\n\t\t * options</i>\n\t\t * @dtopt Option\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"asStripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable automatic column width calculation. This can be disabled\n\t\t * as an optimisation (it takes some time to calculate the widths) if the\n\t\t * tables widths are passed in using aoColumns.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bAutoWidth\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bAutoWidth\": true,\n\t\n\t
\n\t\t/**\n\t\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t\t * are using an Ajax or JS data source for the table. This option, when set to\n\t\t * true, will cause DataTables to defer the creation of the table elements for\n\t\t * each row until they are needed for a draw - saving a significant amount of\n\t\t * time.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"sAjaxSource\": \"sources/arrays.txt\",\n\t\t * \"bDeferRender\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bDeferRender\": false,\n\t\n\t\n\t\t/**\n\t\t * Replace a DataTable which matches the given selector and replace it with \n\t\t * one which has the properties of the new initialisation object passed. If no\n\t\t * table matches the selector, then the new DataTable will be constructed as\n\t\t * per normal.\n\t\t * @type boo
lean\n\t\t * @default false\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sScrollY\": \"200px\",\n\t\t * \"bPaginate\": false\n\t\t * } );\n\t\t * \n\t\t * // Some time later....\n\t\t * $('#example').dataTable( {\n\t\t * \"bFilter\": false,\n\t\t * \"bDestroy\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bDestroy\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t\t * that it allows the end user to input multiple words (space separated) and\n\t\t * will match a row containing those words, even if not in the order that was\n\t\t * specified (this allow matching across multiple columns). Note that if you\n\t\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t\t * default filtering input box and retain filtering abilities, please use\n\t\t * {@link DataTable.d
efaults.sDom}.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bFilter\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bFilter\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the table information display. This shows information \n\t\t * about the data that is currently visible on the page, including information\n\t\t * about filtered data if that action is being performed.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bInfo\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bInfo\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some\n\t\t * slightly different and additional mark-up from what DataTables has\n\t\t * traditionally use
d).\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bJQueryUI\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bJQueryUI\": false,\n\t\n\t\n\t\t/**\n\t\t * Allows the end user to select the size of a formatted page from a select\n\t\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate).\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bLengthChange\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bLengthChange\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable pagination.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bPagina
te\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bPaginate\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of a 'processing' indicator when the table is\n\t\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t\t * large amounts of data where it can take a noticeable amount of time to sort\n\t\t * the entries.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bProcessing\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bProcessing\": false,\n\t\n\t\n\t\t/**\n\t\t * Retrieve the DataTables object for the given selector. Note that if the\n\t\t * table has already been initialised, this parameter will cause DataTables\n\t\t * to simply return the object that has already been set up - it will not take\n\t\t * account of any changes you might have made to the initialisation object\n\t\t * passed to D
ataTables (setting this parameter to true is an acknowledgement\n\t\t * that you understand this). bDestroy can be used to reinitialise a table if\n\t\t * you need.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * initTable();\n\t\t * tableActions();\n\t\t * } );\n\t\t * \n\t\t * function initTable ()\n\t\t * {\n\t\t * return $('#example').dataTable( {\n\t\t * \"sScrollY\": \"200px\",\n\t\t * \"bPaginate\": false,\n\t\t * \"bRetrieve\": true\n\t\t * } );\n\t\t * }\n\t\t * \n\t\t * function tableActions ()\n\t\t * {\n\t\t * var oTable = initTable();\n\t\t * // perform API operations with oTable \n\t\t * }\n\t\t */\n\t\t\"bRetrieve\": false,\n\t\n\t\n\t\t/**\n\t\t * Indicate if DataTables should be allowed to set the padding / margin\n\t\t * etc for the scrolling header elements or not. Typically you will want\n\t\t * this.\n\t\t * @t
ype boolean\n\t\t * @default true\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bScrollAutoCss\": false,\n\t\t * \"sScrollY\": \"200px\"\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bScrollAutoCss\": true,\n\t\n\t\n\t\t/**\n\t\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t\t * the table's viewport to the given height at all times (useful for layout).\n\t\t * However, this can look odd when filtering data down to a small data set,\n\t\t * and the footer is left \"floating\" further down. This parameter (when\n\t\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t\t * the result set will fit within the given Y height.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sScrollY\": \"20
0\",\n\t\t * \"bScrollCollapse\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bScrollCollapse\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable infinite scrolling for DataTables (to be used in combination with\n\t\t * sScrollY). Infinite scrolling means that DataTables will continually load\n\t\t * data as a user scrolls through a table, which is very useful for large\n\t\t * dataset. This cannot be used with pagination, which is automatically\n\t\t * disabled. Note - the Scroller extra for DataTables is recommended in\n\t\t * in preference to this option.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bScrollInfinite\": true,\n\t\t * \"bScrollCollapse\": true,\n\t\t * \"sScrollY\": \"200px\"\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bScrollInfinite\": false,\n\t\n\t\n\t\t/**\n\t\t * Configure DataTables to use server-side proc
essing. Note that the\n\t\t * sAjaxSource parameter must also be given in order to give DataTables a\n\t\t * source to obtain the required data for each draw.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Features\n\t\t * @dtopt Server-side\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bServerSide\": true,\n\t\t * \"sAjaxSource\": \"xhr.php\"\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bServerSide\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t\t * disabled by the \"bSortable\" option for each column.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bSort\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bSort\": true,\n\t\n\t\n\t\t/**\n\t\t * Allows control over whether DataT
ables should use the top (true) unique\n\t\t * cell that is found for a single column, or the bottom (false - default).\n\t\t * This is useful when using complex headers.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bSortCellsTop\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bSortCellsTop\": false,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and\n\t\t * 'sorting_3' to the columns which are currently being sorted on. This is\n\t\t * presented as a feature switch as it can increase processing time (while\n\t\t * classes are removed and added) so for large data sets you might want to\n\t\t * turn this off.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t *
\"bSortClasses\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bSortClasses\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable state saving. When enabled a cookie will be used to save\n\t\t * table display information such as pagination information, display length,\n\t\t * filtering and sorting. As such when the end user reloads the page the\n\t\t * display display will match what thy had previously set up.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"bStateSave\": false,\n\t\n\t\n\t\t/**\n\t\t * Customise the cookie and / or the parameters being stored when using\n\t\t * DataTables with state saving enabled. This function is called whenever\n\t\t * the cookie is modified, and it expects a fully formed cookie string to be\n\t\t * returned. Note that the data object passed in
is a Javascript object which\n\t\t * must be converted to a string (JSON.stringify for example).\n\t\t * @type function\n\t\t * @param {string} sName Name of the cookie defined by DataTables\n\t\t * @param {object} oData Data to be stored in the cookie\n\t\t * @param {string} sExpires Cookie expires string\n\t\t * @param {string} sPath Path of the cookie to set\n\t\t * @returns {string} Cookie formatted string (which should be encoded by\n\t\t * using encodeURIComponent())\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function () {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnCookieCallback\": function (sName, oData, sExpires, sPath) {\n\t\t * // Customise oData or sName or whatever else here\n\t\t * return sName + \"=\"+JSON.stringify(oData)+\"; expires=\" + sExpires +\"; path=\" + sPath;\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnCookieCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * This function is called w
hen a TR element is created (and all TD child\n\t\t * elements have been inserted), or registered if using a DOM source, allowing\n\t\t * manipulation of the TR element (adding classes etc).\n\t\t * @type function\n\t\t * @param {node} nRow \"TR\" element for the current row\n\t\t * @param {array} aData Raw data array for this row\n\t\t * @param {int} iDataIndex The index of this row in aoData\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnCreatedRow\": function( nRow, aData, iDataIndex ) {\n\t\t * // Bold the grade for all 'A' grade browsers\n\t\t * if ( aData[4] == \"A\" )\n\t\t * {\n\t\t * $('td:eq(4)', nRow).html( '<b>A</b>' );\n\t\t * }\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnCreatedRow\": null,\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify any aspe
ct you want about the created DOM.\n\t\t * @type function\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnDrawCallback\": function( oSettings ) {\n\t\t * alert( 'DataTables has redrawn the table' );\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Identical to fnHeaderCallback() but for the table footer this function\n\t\t * allows you to modify the table footer on every 'draw' even.\n\t\t * @type function\n\t\t * @param {node} nFoot \"TR\" element for the footer\n\t\t * @param {array} aData Full table data (as derived from the original HTML)\n\t\t * @param {int} iStart Index for the current display starting point in the \n\t\t * display array\n\t\t * @param {int} iEnd Index for the current display ending point in the \n\t\t * display array\n\t\t * @param
{array int} aiDisplay Index array to translate the visual position\n\t\t * to the full data array\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnFooterCallback\": function( nFoot, aData, iStart, iEnd, aiDisplay ) {\n\t\t * nFoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+iStart;\n\t\t * }\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"fnFooterCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * When rendering large numbers in the information element for the table\n\t\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t\t * function will override the default method DataTables uses.\n\t\t * @type function\n\t\t * @member\n\t\t * @param {int} iIn number to be formatted\n\t\t * @ret
urns {string} formatted string for DataTables to show the number\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnFormatNumber\": function ( iIn ) {\n\t\t * if ( iIn < 1000 ) {\n\t\t * return iIn;\n\t\t * } else {\n\t\t * var \n\t\t * s=(iIn+\"\"), \n\t\t * a=s.split(\"\"), out=\"\", \n\t\t * iLen=s.length;\n\t\t * \n\t\t * for ( var i=0 ; i<iLen ; i++ ) {\n\t\t * if ( i%3 === 0 && i !== 0 ) {\n\t\t * out = \"'\"+out;\n\t\t * }\n\t\t * out = a[iLen-i-1]+out;\n\t\t * }\n\t\t * }\n\t\t * return out;\n\t\t * };\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnFormatNumber\": function ( iIn ) {\n\t\t\tif ( iIn < 1000 )\n\t\t\t{\n\t\t\t\t// A small optimisation for what is likely to be the majority of use
cases\n\t\t\t\treturn iIn;\n\t\t\t}\n\t\n\t\t\tvar s=(iIn+\"\"), a=s.split(\"\"), out=\"\", iLen=s.length;\n\t\t\t\n\t\t\tfor ( var i=0 ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\tif ( i%3 === 0 && i !== 0 )\n\t\t\t\t{\n\t\t\t\t\tout = this.oLanguage.sInfoThousands+out;\n\t\t\t\t}\n\t\t\t\tout = a[iLen-i-1]+out;\n\t\t\t}\n\t\t\treturn out;\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This function is called on every 'draw' event, and allows you to\n\t\t * dynamically modify the header row. This can be used to calculate and\n\t\t * display useful information about the table.\n\t\t * @type function\n\t\t * @param {node} nHead \"TR\" element for the header\n\t\t * @param {array} aData Full table data (as derived from the original HTML)\n\t\t * @param {int} iStart Index for the current display starting point in the\n\t\t * display array\n\t\t * @param {int} iEnd Index for the current display ending point in the\n\t\t * display array\n\t\t * @param {array int} aiDisplay Index array to translate the visual position\n\t\t
* to the full data array\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnHeaderCallback\": function( nHead, aData, iStart, iEnd, aiDisplay ) {\n\t\t * nHead.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(iEnd-iStart)+\" records\";\n\t\t * }\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"fnHeaderCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * The information element can be used to convey information about the current\n\t\t * state of the table. Although the internationalisation options presented by\n\t\t * DataTables are quite capable of dealing with most customisations, there may\n\t\t * be times where you wish to customise the string further. This callback\n\t\t * allows you to do exactly that.\n\t\t * @type function\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @param {int} iStart Starting position in data for the draw\n\t\t * @param {int} iEnd En
d position in data for the draw\n\t\t * @param {int} iMax Total number of rows in the table (regardless of\n\t\t * filtering)\n\t\t * @param {int} iTotal Total number of rows in the data set, after filtering\n\t\t * @param {string} sPre The string that DataTables has formatted using it's\n\t\t * own rules\n\t\t * @returns {string} The string to be displayed in the information element.\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $('#example').dataTable( {\n\t\t * \"fnInfoCallback\": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {\n\t\t * return iStart +\" to \"+ iEnd;\n\t\t * }\n\t\t * } );\n\t\t */\n\t\t\"fnInfoCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * Called when the table has been initialised. Normally DataTables will\n\t\t * initialise sequentially and there will be no need for this function,\n\t\t * however, this does not hold true when using external language information\n\t\t * since that is obtained using an async XHR call.\n\t\t * @type fu
nction\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @param {object} json The JSON object request from the server - only\n\t\t * present if client-side Ajax sourced data is used\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnInitComplete\": function(oSettings, json) {\n\t\t * alert( 'DataTables has finished its initialisation.' );\n\t\t * }\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"fnInitComplete\": null,\n\t\n\t\n\t\t/**\n\t\t * Called at the very start of each table draw and can be used to cancel the\n\t\t * draw by returning false, any other return (including undefined) results in\n\t\t * the full draw occurring).\n\t\t * @type function\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @returns {boolean} False will cancel the draw, anything else (including no\n\t\t * return) will allow it to complete.\n\t\t * @dtopt Callbac
ks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnPreDrawCallback\": function( oSettings ) {\n\t\t * if ( $('#test').val() == 1 ) {\n\t\t * return false;\n\t\t * }\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnPreDrawCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * This function allows you to 'post process' each row after it have been\n\t\t * generated for each table draw, but before it is rendered on screen. This\n\t\t * function might be used for setting the row class name etc.\n\t\t * @type function\n\t\t * @param {node} nRow \"TR\" element for the current row\n\t\t * @param {array} aData Raw data array for this row\n\t\t * @param {int} iDisplayIndex The display index for the current table draw\n\t\t * @param {int} iDisplayIndexFull The index of the data in the full list of\n\t\t * rows (after filtering)\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(do
cument).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"fnRowCallback\": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {\n\t\t * // Bold the grade for all 'A' grade browsers\n\t\t * if ( aData[4] == \"A\" )\n\t\t * {\n\t\t * $('td:eq(4)', nRow).html( '<b>A</b>' );\n\t\t * }\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnRowCallback\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to override the default function which obtains\n\t\t * the data from the server ($.getJSON) so something more suitable for your\n\t\t * application. For example you could use POST data, or pull information from\n\t\t * a Gears or AIR database.\n\t\t * @type function\n\t\t * @member\n\t\t * @param {string} sSource HTTP source to obtain the data from (sAjaxSource)\n\t\t * @param {array} aoData A key/value pair object containing the data to send\n\t\t * to the server\n\t\t * @param {function} fnCallback to be
called on completion of the data get\n\t\t * process that will draw the data on the page.\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @dtopt Callbacks\n\t\t * @dtopt Server-side\n\t\t * \n\t\t * @example\n\t\t * // POST data to server\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bProcessing\": true,\n\t\t * \"bServerSide\": true,\n\t\t * \"sAjaxSource\": \"xhr.php\",\n\t\t * \"fnServerData\": function ( sSource, aoData, fnCallback, oSettings ) {\n\t\t * oSettings.jqXHR = $.ajax( {\n\t\t * \"dataType\": 'json', \n\t\t * \"type\": \"POST\", \n\t\t * \"url\": sSource, \n\t\t * \"data\": aoData, \n\t\t * \"success\": fnCallback\n\t\t * } );\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnServerData\": function ( sUrl, aoData, fnCallback, oSettings ) {\n\t\t\toSettings.jqXHR = $.ajax( {\n\t\t\t\t\"url\": sUrl,
\n\t\t\t\t\"data\": aoData,\n\t\t\t\t\"success\": function (json) {\n\t\t\t\t\tif ( json.sError ) {\n\t\t\t\t\t\toSettings.oApi._fnLog( oSettings, 0, json.sError );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t$(oSettings.oInstance).trigger('xhr', [oSettings, json]);\n\t\t\t\t\tfnCallback( json );\n\t\t\t\t},\n\t\t\t\t\"dataType\": \"json\",\n\t\t\t\t\"cache\": false,\n\t\t\t\t\"type\": oSettings.sServerMethod,\n\t\t\t\t\"error\": function (xhr, error, thrown) {\n\t\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t\toSettings.oApi._fnLog( oSettings, 0, \"DataTables warning: JSON data from \"+\n\t\t\t\t\t\t\t\"server could not be parsed. This is caused by a JSON formatting error.\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * It is often useful to send extra data to the server when making an Ajax\n\t\t * request - for example custom filtering information, and this callback\n\t\t * function makes it trivial to send extra information to the server. The\n\t\t * passed in parameter is the dat
a set that has been constructed by\n\t\t * DataTables, and you can add to this or modify it as you require.\n\t\t * @type function\n\t\t * @param {array} aoData Data array (array of objects which are name/value\n\t\t * pairs) that has been constructed by DataTables and will be sent to the\n\t\t * server. In the case of Ajax sourced data with server-side processing\n\t\t * this will be an empty array, for server-side processing there will be a\n\t\t * significant number of parameters!\n\t\t * @returns {undefined} Ensure that you modify the aoData array passed in,\n\t\t * as this is passed by reference.\n\t\t * @dtopt Callbacks\n\t\t * @dtopt Server-side\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bProcessing\": true,\n\t\t * \"bServerSide\": true,\n\t\t * \"sAjaxSource\": \"scripts/server_processing.php\",\n\t\t * \"fnServerParams\": function ( aoData ) {\n\t\t * aoData.push( {
\"name\": \"more_data\", \"value\": \"my_value\" } );\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnServerParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Load the table state. With this function you can define from where, and how, the\n\t\t * state of a table is loaded. By default DataTables will load from its state saving\n\t\t * cookie, but you might wish to use local storage (HTML5) or a server-side database.\n\t\t * @type function\n\t\t * @member\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @return {object} The DataTables state object to be loaded\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true,\n\t\t * \"fnStateLoad\": function (oSettings) {\n\t\t * var o;\n\t\t * \n\t\t * // Send an Ajax request to the server to get the data. Note that\n\t\t * // this is a synchronous request.\n\t\t * $
.ajax( {\n\t\t * \"url\": \"/state_load\",\n\t\t * \"async\": false,\n\t\t * \"dataType\": \"json\",\n\t\t * \"success\": function (json) {\n\t\t * o = json;\n\t\t * }\n\t\t * } );\n\t\t * \n\t\t * return o;\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnStateLoad\": function ( oSettings ) {\n\t\t\tvar sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );\n\t\t\tvar oData;\n\t\n\t\t\ttry {\n\t\t\t\toData = (typeof $.parseJSON === 'function') ? \n\t\t\t\t\t$.parseJSON(sData) : eval( '('+sData+')' );\n\t\t\t} catch (e) {\n\t\t\t\toData = null;\n\t\t\t}\n\t\n\t\t\treturn oData;\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the saved state prior to loading that state.\n\t\t * This callback is called when the table is loading state from the stored data, but\n\t\t * prior to the settings object being modified by the saved state. Note that for \n\t\t
* plug-in authors, you should use the 'stateLoadParams' event to load parameters for \n\t\t * a plug-in.\n\t\t * @type function\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @param {object} oData The state object that is to be loaded\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * // Remove a saved filter, so filtering is never loaded\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true,\n\t\t * \"fnStateLoadParams\": function (oSettings, oData) {\n\t\t * oData.oSearch.sSearch = \"\";\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Disallow state loading by returning false\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true,\n\t\t * \"fnStateLoadParams\": function (oSettings, oData) {\n\t\t * return false;\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\
t */\n\t\t\"fnStateLoadParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Callback that is called when the state has been loaded from the state saving method\n\t\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t\t * @type function\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @param {object} oData The state object that was loaded\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * // Show an alert with the filtering value that was saved\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true,\n\t\t * \"fnStateLoaded\": function (oSettings, oData) {\n\t\t * alert( 'Saved filter was: '+oData.oSearch.sSearch );\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnStateLoaded\": null,\n\t\n\t\n\t\t/**\n\t\t * Save the table state. This function allows you to define where and how the state\n\t\t * information for the table is stored - by default it
will use a cookie, but you\n\t\t * might want to use local storage (HTML5) or a server-side database.\n\t\t * @type function\n\t\t * @member\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @param {object} oData The state object to be saved\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true,\n\t\t * \"fnStateSave\": function (oSettings, oData) {\n\t\t * // Send an Ajax request to the server with the state object\n\t\t * $.ajax( {\n\t\t * \"url\": \"/state_save\",\n\t\t * \"data\": oData,\n\t\t * \"dataType\": \"json\",\n\t\t * \"method\": \"POST\"\n\t\t * \"success\": function () {}\n\t\t * } );\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnStateSave\": function ( oSettings, oData ) {\n\t\t\tthis.oApi._fnCreateCookie( \n\t\t\t\toSettings.sCookiePrefix+oSet
tings.sInstance, \n\t\t\t\tthis.oApi._fnJsonString(oData), \n\t\t\t\toSettings.iCookieDuration, \n\t\t\t\toSettings.sCookiePrefix, \n\t\t\t\toSettings.fnCookieCallback\n\t\t\t);\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * Callback which allows modification of the state to be saved. Called when the table \n\t\t * has changed state a new state save is required. This method allows modification of\n\t\t * the state saving object prior to actually doing the save, including addition or \n\t\t * other state properties or modification. Note that for plug-in authors, you should \n\t\t * use the 'stateSaveParams' event to save parameters for a plug-in.\n\t\t * @type function\n\t\t * @param {object} oSettings DataTables settings object\n\t\t * @param {object} oData The state object to be saved\n\t\t * @dtopt Callbacks\n\t\t * \n\t\t * @example\n\t\t * // Remove a saved filter, so filtering is never saved\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bStateSave\": true,
\n\t\t * \"fnStateSaveParams\": function (oSettings, oData) {\n\t\t * oData.oSearch.sSearch = \"\";\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"fnStateSaveParams\": null,\n\t\n\t\n\t\t/**\n\t\t * Duration of the cookie which is used for storing session information. This\n\t\t * value is given in seconds.\n\t\t * @type int\n\t\t * @default 7200 <i>(2 hours)</i>\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"iCookieDuration\": 60*60*24; // 1 day\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"iCookieDuration\": 7200,\n\t\n\t\n\t\t/**\n\t\t * When enabled DataTables will not make a request to the server for the first\n\t\t * page draw - rather it will use the data already on the page (no sorting etc\n\t\t * will be applied to it), thus saving on an XHR at load time. iDeferLoading\n\t\t * is used to indicate that deferred loading is required, but it is also used\n\t\t
* to tell DataTables how many records there are in the full table (allowing\n\t\t * the information element and pagination to be displayed correctly). In the case\n\t\t * where a filtering is applied to the table on initial load, this can be\n\t\t * indicated by giving the parameter as an array, where the first element is\n\t\t * the number of records available after filtering and the second element is the\n\t\t * number of records without filtering (allowing the table information element\n\t\t * to be shown correctly).\n\t\t * @type int | array\n\t\t * @default null\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * // 57 records available in the table, no filtering applied\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bServerSide\": true,\n\t\t * \"sAjaxSource\": \"scripts/server_processing.php\",\n\t\t * \"iDeferLoading\": 57\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // 57 records after filtering
, 100 without filtering (an initial filter applied)\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bServerSide\": true,\n\t\t * \"sAjaxSource\": \"scripts/server_processing.php\",\n\t\t * \"iDeferLoading\": [ 57, 100 ],\n\t\t * \"oSearch\": {\n\t\t * \"sSearch\": \"my_filter\"\n\t\t * }\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"iDeferLoading\": null,\n\t\n\t\n\t\t/**\n\t\t * Number of rows to display on a single page when using pagination. If\n\t\t * feature enabled (bLengthChange) then the end user will be able to override\n\t\t * this to a custom setting using a pop-up menu.\n\t\t * @type int\n\t\t * @default 10\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"iDisplayLength\": 50\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"iDisplayLength\": 10,\n\t\n\t\n\t\t/**\n\t\t * Define the starting point for dat
a display when using DataTables with\n\t\t * pagination. Note that this parameter is the number of records, rather than\n\t\t * the page number, so if you have 10 records per page and want to start on\n\t\t * the third page, it should be \"20\".\n\t\t * @type int\n\t\t * @default 0\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"iDisplayStart\": 20\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"iDisplayStart\": 0,\n\t\n\t\n\t\t/**\n\t\t * The scroll gap is the amount of scrolling that is left to go before\n\t\t * DataTables will load the next 'page' of data automatically. You typically\n\t\t * want a gap which is big enough that the scrolling will be smooth for the\n\t\t * user, while not so large that it will load more data than need.\n\t\t * @type int\n\t\t * @default 100\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTabl
e( {\n\t\t * \"bScrollInfinite\": true,\n\t\t * \"bScrollCollapse\": true,\n\t\t * \"sScrollY\": \"200px\",\n\t\t * \"iScrollLoadGap\": 50\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"iScrollLoadGap\": 100,\n\t\n\t\n\t\t/**\n\t\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t\t * and filtering) by adding a tabindex attribute to the required elements. This\n\t\t * allows you to tab through the controls and press the enter key to activate them.\n\t\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t\t * disable built-in keyboard navigation.\n\t\t * @type int\n\t\t * @default 0\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"iTabIndex\": 1\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\n\t\
t/**\n\t\t * All strings that DataTables uses in the user interface that it creates\n\t\t * are defined in this object, allowing you to modified them individually or\n\t\t * completely replace them all as required.\n\t\t * @namespace\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t\t * must be internationalised as well).\n\t\t\t * @namespace\n\t\t\t */\n\t\t\t\"oAria\": {\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t * @type string\n\t\t\t\t * @default : activate to sort column ascending\n\t\t\t\t * @dtopt Language\n\t\t\t\t * \n\t\t\t\t * @example\n\t\t\t\t * $(document).ready( function() {\n\t\t\t\t * $('#example').dataTa
ble( {\n\t\t\t\t * \"oLanguage\": {\n\t\t\t\t * \"oAria\": {\n\t\t\t\t * \"sSortAscending\": \" - click/return to sort ascending\"\n\t\t\t\t * }\n\t\t\t\t * }\n\t\t\t\t * } );\n\t\t\t\t * } );\n\t\t\t\t */\n\t\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\t\n\t\t\t\t/**\n\t\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t\t * @type string\n\t\t\t\t * @default : activate to sort column ascending\n\t\t\t\t * @dtopt Language\n\t\t\t\t * \n\t\t\t\t * @example\n\t\t\t\t * $(document).ready( function() {\n\t\t\t\t * $('#example').dataTable( {\n\t\t\t\t * \"oLanguage\": {\n\t\t\t\t * \"oAria\": {\n\t\t\t\t * \"sSortDescending\": \" - click/return to sort descending\"\n\t\t\t\t * }\n\t\t\t\t * }\n\t\t\t\t
* } );\n\t\t\t\t * } );\n\t\t\t\t */\n\t\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t\t},\n\t\n\t\t\t/**\n\t\t\t * Pagination string used by DataTables for the two built-in pagination\n\t\t\t * control types (\"two_button\" and \"full_numbers\")\n\t\t\t * @namespace\n\t\t\t */\n\t\t\t\"oPaginate\": {\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the first page.\n\t\t\t\t * @type string\n\t\t\t\t * @default First\n\t\t\t\t * @dtopt Language\n\t\t\t\t * \n\t\t\t\t * @example\n\t\t\t\t * $(document).ready( function() {\n\t\t\t\t * $('#example').dataTable( {\n\t\t\t\t * \"oLanguage\": {\n\t\t\t\t * \"oPaginate\": {\n\t\t\t\t * \"sFirst\": \"First page\"\n\t\t\t\t * }\n\t\t\t\t * }\n\t\t\t\t * } );\n\t\t\t\t * } );\n\t\t\t\t */\n\t\t\t\t\"sFirst\": \"First\",\n\t\t\t\n\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Text to use when using the 'f
ull_numbers' type of pagination for the\n\t\t\t\t * button to take the user to the last page.\n\t\t\t\t * @type string\n\t\t\t\t * @default Last\n\t\t\t\t * @dtopt Language\n\t\t\t\t * \n\t\t\t\t * @example\n\t\t\t\t * $(document).ready( function() {\n\t\t\t\t * $('#example').dataTable( {\n\t\t\t\t * \"oLanguage\": {\n\t\t\t\t * \"oPaginate\": {\n\t\t\t\t * \"sLast\": \"Last page\"\n\t\t\t\t * }\n\t\t\t\t * }\n\t\t\t\t * } );\n\t\t\t\t * } );\n\t\t\t\t */\n\t\t\t\t\"sLast\": \"Last\",\n\t\t\t\n\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'next' pagination button (to take the user to the \n\t\t\t\t * next page).\n\t\t\t\t * @type string\n\t\t\t\t * @default Next\n\t\t\t\t * @dtopt Language\n\t\t\t\t * \n\t\t\t\t * @example\n\t\t\t\t * $(document).ready( function() {\n\t\t\t\t * $('#example').dataTable( {\n\t\t\t\t * \"oLanguage\": {\n\t\t\t\t * \"oPaginate\": {\n\t\t\t\t * \"sNext\": \"Next page\"\n\t\
t\t\t * }\n\t\t\t\t * }\n\t\t\t\t * } );\n\t\t\t\t * } );\n\t\t\t\t */\n\t\t\t\t\"sNext\": \"Next\",\n\t\t\t\n\t\t\t\n\t\t\t\t/**\n\t\t\t\t * Text to use for the 'previous' pagination button (to take the user to \n\t\t\t\t * the previous page).\n\t\t\t\t * @type string\n\t\t\t\t * @default Previous\n\t\t\t\t * @dtopt Language\n\t\t\t\t * \n\t\t\t\t * @example\n\t\t\t\t * $(document).ready( function() {\n\t\t\t\t * $('#example').dataTable( {\n\t\t\t\t * \"oLanguage\": {\n\t\t\t\t * \"oPaginate\": {\n\t\t\t\t * \"sPrevious\": \"Previous page\"\n\t\t\t\t * }\n\t\t\t\t * }\n\t\t\t\t * } );\n\t\t\t\t * } );\n\t\t\t\t */\n\t\t\t\t\"sPrevious\": \"Previous\"\n\t\t\t},\n\t\t\n\t\t\t/**\n\t\t\t * This string is shown in preference to sZeroRecords when the table is\n\t\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t\t * parameter - if it is not given, the value of sZeroRecords will be used\n\t\t\t
* instead (either the default or given value).\n\t\t\t * @type string\n\t\t\t * @default No data available in table\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sEmptyTable\": \"No data available in table\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sEmptyTable\": \"No data available in table\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * This string gives information to the end user about the information that \n\t\t\t * is current on display on the page. The _START_, _END_ and _TOTAL_ \n\t\t\t * variables are all dynamically replaced as the table display updates, and \n\t\t\t * can be freely moved or removed as the language requirements change.\n\t\t\t * @type string\n\t\t\t * @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function()
{\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sInfo\": \"Got a total of _TOTAL_ entries to show (_START_ to _END_)\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Display information string for when the table is empty. Typically the \n\t\t\t * format of this string should match sInfo.\n\t\t\t * @type string\n\t\t\t * @default Showing 0 to 0 of 0 entries\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sInfoEmpty\": \"No entries to show\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * When a user filters the information in a table, this string is appended \n\t\t\t * to the infor
mation (sInfo) to give an idea of how strong the filtering \n\t\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t\t * @type string\n\t\t\t * @default (filtered from _MAX_ total entries)\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sInfoFiltered\": \" - filtering from _MAX_ records\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * If can be useful to append extra information to the info string at times,\n\t\t\t * and this variable does exactly that. This information will be appended to\n\t\t\t * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are\n\t\t\t * being used) at all times.\n\t\t\t * @type string\n\t\t\t * @default <i>Empty string</i>\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\
t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sInfoPostFix\": \"All records shown are derived from real information.\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sInfoPostFix\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * DataTables has a build in number formatter (fnFormatNumber) which is used\n\t\t\t * to format large numbers that are used in the table information. By\n\t\t\t * default a comma is used, but this can be trivially changed to any\n\t\t\t * character you wish with this parameter.\n\t\t\t * @type string\n\t\t\t * @default ,\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sInfoThousands\": \"'\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sInfoThousands\": \",\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t *
Detail the action that will be taken when the drop down menu for the\n\t\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t\t * with a custom select box if required.\n\t\t\t * @type string\n\t\t\t * @default Show _MENU_ entries\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * // Language change only\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sLengthMenu\": \"Display _MENU_ records\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t * \n\t\t\t * @example\n\t\t\t * // Language and options change\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sLengthMenu\": 'Display <select>'+\n\t\t\t * '<option value=\"10\">10</option>'+\n\t\t\t * '<option val
ue=\"20\">20</option>'+\n\t\t\t * '<option value=\"30\">30</option>'+\n\t\t\t * '<option value=\"40\">40</option>'+\n\t\t\t * '<option value=\"50\">50</option>'+\n\t\t\t * '<option value=\"-1\">All</option>'+\n\t\t\t * '</select> records'\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t\t * parameter is not used when loading data by server-side processing, just\n\t\t\t * Ajax sourced data with client-side processing.\n\t\t\t * @type string\n\t\t\t * @default Loading...\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\
t\t\t * \"oLanguage\": {\n\t\t\t * \"sLoadingRecords\": \"Please wait - loading...\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sLoadingRecords\": \"Loading...\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Text which is displayed when the table is processing a user action\n\t\t\t * (usually a sort command or similar).\n\t\t\t * @type string\n\t\t\t * @default Processing...\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sProcessing\": \"DataTables is currently busy\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sProcessing\": \"Processing...\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Details the actions that will be taken when the user types into the\n\t\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t\t * is replaced with the HTML text box for the filteri
ng input allowing\n\t\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t\t * then the input box is appended to the string automatically.\n\t\t\t * @type string\n\t\t\t * @default Search:\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * // Input text box will be appended at the end automatically\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sSearch\": \"Filter records:\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t * \n\t\t\t * @example\n\t\t\t * // Specify where the filter should appear\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sSearch\": \"Apply filter _INPUT_ to table\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sSearch\": \"Search:\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * All of the language informati
on can be stored in a file on the\n\t\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t\t * and the object has the same properties as the oLanguage object in the\n\t\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t\t * the example language files to see how this works in action.\n\t\t\t * @type string\n\t\t\t * @default <i>Empty string - i.e. disabled</i>\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sUrl\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sUrl\": \"\",\n\t\t\n\t\t\n\t\t\t/**\n\t\t\t * Text shown inside the table records when the is no information to be\n\t\t\t * displayed after filtering. sEmptyTable is shown when
there is simply no\n\t\t\t * information in the table at all (regardless of filtering).\n\t\t\t * @type string\n\t\t\t * @default No matching records found\n\t\t\t * @dtopt Language\n\t\t\t * \n\t\t\t * @example\n\t\t\t * $(document).ready( function() {\n\t\t\t * $('#example').dataTable( {\n\t\t\t * \"oLanguage\": {\n\t\t\t * \"sZeroRecords\": \"No records to display\"\n\t\t\t * }\n\t\t\t * } );\n\t\t\t * } );\n\t\t\t */\n\t\t\t\"sZeroRecords\": \"No matching records found\"\n\t\t},\n\t\n\t\n\t\t/**\n\t\t * This parameter allows you to have define the global filtering state at\n\t\t * initialisation time. As an object the \"sSearch\" parameter must be\n\t\t * defined, but all other parameters are optional. When \"bRegex\" is true,\n\t\t * the search string will be treated as a regular expression, when false\n\t\t * (default) it will be treated as a straight string. When \"bSmart\"\n\t\t * DataTables will use it's smart filtering methods (to word match at\n\t\t * any
point in the data), when false this will not be done.\n\t\t * @namespace\n\t\t * @extends DataTable.models.oSearch\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"oSearch\": {\"sSearch\": \"Initial search\"}\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\t\n\t\n\t\t/**\n\t\t * By default DataTables will look for the property 'aaData' when obtaining\n\t\t * data from an Ajax source or for server-side processing - this parameter\n\t\t * allows that property to be changed. You can use Javascript dotted object\n\t\t * notation to get a data source for multiple levels of nesting.\n\t\t * @type string\n\t\t * @default aaData\n\t\t * @dtopt Options\n\t\t * @dtopt Server-side\n\t\t * \n\t\t * @example\n\t\t * // Get data from { \"data\": [...] }\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t *
\"sAjaxSource\": \"sources/data.txt\",\n\t\t * \"sAjaxDataProp\": \"data\"\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Get data from { \"data\": { \"inner\": [...] } }\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"sAjaxSource\": \"sources/data.txt\",\n\t\t * \"sAjaxDataProp\": \"data.inner\"\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sAjaxDataProp\": \"aaData\",\n\t\n\t\n\t\t/**\n\t\t * You can instruct DataTables to load data from an external source using this\n\t\t * parameter (use aData if you want to pass data in you already have). Simply\n\t\t * provide a url a JSON object can be obtained from. This object must include\n\t\t * the parameter 'aaData' which is the data source for the table.\n\t\t * @type string\n\t\t * @default null\n\t\t * @dtopt Options\n\t\t * @dtopt Server-side\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example
').dataTable( {\n\t\t * \"sAjaxSource\": \"http://www.sprymedia.co.uk/dataTables/json.php\"\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter can be used to override the default prefix that DataTables\n\t\t * assigns to a cookie when state saving is enabled.\n\t\t * @type string\n\t\t * @default SpryMedia_DataTables_\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sCookiePrefix\": \"my_datatable_\",\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sCookiePrefix\": \"SpryMedia_DataTables_\",\n\t\n\t\n\t\t/**\n\t\t * This initialisation variable allows you to specify exactly where in the\n\t\t * DOM you want DataTables to inject the various controls it adds to the page\n\t\t * (for example you might want the pagination controls at the top of the\n\t\t * table). DIV elements (with or without a custom class) can also be added to\n\t\t * aid s
tyling. The follow syntax is used:\n\t\t * <ul>\n\t\t * <li>The following options are allowed:\t\n\t\t * <ul>\n\t\t * <li>'l' - Length changing</li\n\t\t * <li>'f' - Filtering input</li>\n\t\t * <li>'t' - The table!</li>\n\t\t * <li>'i' - Information</li>\n\t\t * <li>'p' - Pagination</li>\n\t\t * <li>'r' - pRocessing</li>\n\t\t * </ul>\n\t\t * </li>\n\t\t * <li>The following constants are allowed:\n\t\t * <ul>\n\t\t * <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t\t * <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t\t * </ul>\n\t\t * </li>\n\t\t * <li>The following syntax is expected:\n\t\t * <ul>\n\t\t * <li>'<' and '>' - div elements</li>\n\t\t * <li>'<\"class\" and '>' - div with a class</li>\n\t\t *
<li>'<\"#id\" and '>' - div with an ID</li>\n\t\t * </ul>\n\t\t * </li>\n\t\t * <li>Examples:\n\t\t * <ul>\n\t\t * <li>'<\"wrapper\"flipt>'</li>\n\t\t * <li>'<lf<t>ip>'</li>\n\t\t * </ul>\n\t\t * </li>\n\t\t * </ul>\n\t\t * @type string\n\t\t * @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b> \n\t\t * <\"H\"lfr>t<\"F\"ip> <i>(when bJQueryUI is true)</i>\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sDom\": '<\"top\"i>rt<\"bottom\"flp><\"clear\">'\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sDom\": \"lfrtip\",\n\t\n\t\n\t\t/**\n\t\t * DataTables features two different built-in pagination interaction methods\n\t\t * ('two_button' or 'full_numbers') which present different page controls to\n\t\t * the end user. Further methods can be added using the API (see below).\n\t\t * @type string\n\t\t
* @default two_button\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sPaginationType\": \"full_numbers\"\n\t\t * } );\n\t\t * } )\n\t\t */\n\t\t\"sPaginationType\": \"two_button\",\n\t\n\t\n\t\t/**\n\t\t * Enable horizontal scrolling. When a table is too wide to fit into a certain\n\t\t * layout, or you have a large number of columns in the table, you can enable\n\t\t * x-scrolling to show the table in a viewport, which can be scrolled. This\n\t\t * property can be any CSS unit, or a number (in which case it will be treated\n\t\t * as a pixel measurement).\n\t\t * @type string\n\t\t * @default <i>blank string - i.e. disabled</i>\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sScrollX\": \"100%\",\n\t\t * \"bScrollCollapse\": true\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sScro
llX\": \"\",\n\t\n\t\n\t\t/**\n\t\t * This property can be used to force a DataTable to use more width than it\n\t\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t\t * table which requires to be well spaced, this parameter is useful for\n\t\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t\t * measurement).\n\t\t * @type string\n\t\t * @default <i>blank string - i.e. disabled</i>\n\t\t * @dtopt Options\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sScrollX\": \"100%\",\n\t\t * \"sScrollXInner\": \"110%\"\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sScrollXInner\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t\t * to the given height, and enable scrolling for any data which overflows the\n\t\t * current view
port. This can be used as an alternative to paging to display\n\t\t * a lot of data in a small area (although paging and scrolling can both be\n\t\t * enabled at the same time). This property can be any CSS unit, or a number\n\t\t * (in which case it will be treated as a pixel measurement).\n\t\t * @type string\n\t\t * @default <i>blank string - i.e. disabled</i>\n\t\t * @dtopt Features\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"sScrollY\": \"200px\",\n\t\t * \"bPaginate\": false\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sScrollY\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t\t * processing or Ajax sourced data.\n\t\t * @type string\n\t\t * @default GET\n\t\t * @dtopt Options\n\t\t * @dtopt Server-side\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"bServerSide\": t
rue,\n\t\t * \"sAjaxSource\": \"scripts/post.php\",\n\t\t * \"sServerMethod\": \"POST\"\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sServerMethod\": \"GET\"\n\t};\n\t\n\t\n\t\n\t/**\n\t * Column options that can be given to DataTables at initialisation time.\n\t * @namespace\n\t */\n\tDataTable.defaults.columns = {\n\t\t/**\n\t\t * Allows a column's sorting to take multiple columns into account when \n\t\t * doing a sort. For example first name / last name columns make sense to \n\t\t * do a multi-column sort over the two columns.\n\t\t * @type array\n\t\t * @default null <i>Takes the value of the column index automatically</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [\n\t\t * { \"aDataSort\": [ 0, 1 ], \"aTargets\": [ 0 ] },\n\t\t * { \"aDataSort\": [ 1, 0 ], \"aTargets\": [ 1 ] },\n\t\t * { \"aDataSo
rt\": [ 2, 3, 4 ], \"aTargets\": [ 2 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [\n\t\t * { \"aDataSort\": [ 0, 1 ] },\n\t\t * { \"aDataSort\": [ 1, 0 ] },\n\t\t * { \"aDataSort\": [ 2, 3, 4 ] },\n\t\t * null,\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"aDataSort\": null,\n\t\n\t\n\t\t/**\n\t\t * You can control the default sorting direction, and even alter the behaviour\n\t\t * of the sort handler (i.e. only allow ascending sorting etc) using this\n\t\t * parameter.\n\t\t * @type array\n\t\t * @default [ 'asc', 'desc' ]\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [\n\t\t * { \"asSor
ting\": [ \"asc\" ], \"aTargets\": [ 1 ] },\n\t\t * { \"asSorting\": [ \"desc\", \"asc\", \"asc\" ], \"aTargets\": [ 2 ] },\n\t\t * { \"asSorting\": [ \"desc\" ], \"aTargets\": [ 3 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [\n\t\t * null,\n\t\t * { \"asSorting\": [ \"asc\" ] },\n\t\t * { \"asSorting\": [ \"desc\", \"asc\", \"asc\" ] },\n\t\t * { \"asSorting\": [ \"desc\" ] },\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"asSorting\": [ 'asc', 'desc' ],\n\t\n\t\n\t\t/**\n\t\t * Enable or disable filtering on the data in this column.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').da
taTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"bSearchable\": false, \"aTargets\": [ 0 ] }\n\t\t * ] } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"bSearchable\": false },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ] } );\n\t\t * } );\n\t\t */\n\t\t\"bSearchable\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable sorting on this column.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"bSortable\": false, \"aTargets\": [ 0 ] }\n\t\t * ] } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t *
$(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"bSortable\": false },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ] } );\n\t\t * } );\n\t\t */\n\t\t\"bSortable\": true,\n\t\n\t\n\t\t/**\n\t\t * <code>Deprecated</code> When using fnRender() for a column, you may wish \n\t\t * to use the original data (before rendering) for sorting and filtering \n\t\t * (the default is to used the rendered data that the user can see). This \n\t\t * may be useful for dates etc.\n\t\t * \n\t\t * Please note that this option has now been deprecated and will be removed\n\t\t * in the next version of DataTables. Please use mRender / mData rather than\n\t\t * fnRender.\n\t\t * @type boolean\n\t\t * @default true\n\t\t * @dtopt Columns\n\t\t * @deprecated\n\t\t */\n\t\t\"bUseRendered\": true,\n\t\n\t\n\t\t/**\n\t\t * Enable or disable the display of this column.\n\t\t * @type boolean\n
\t\t * @default true\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"bVisible\": false, \"aTargets\": [ 0 ] }\n\t\t * ] } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"bVisible\": false },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ] } );\n\t\t * } );\n\t\t */\n\t\t\"bVisible\": true,\n\t\t\n\t\t\n\t\t/**\n\t\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t\t * allowing you to modify the DOM element (add background colour for example) when the\n\t\t * element i
s available.\n\t\t * @type function\n\t\t * @param {element} nTd The TD node that has been created\n\t\t * @param {*} sData The Data for the cell\n\t\t * @param {array|object} oData The data for the whole row\n\t\t * @param {int} iRow The row index for the aoData data store\n\t\t * @param {int} iCol The column index for aoColumns\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ {\n\t\t * \"aTargets\": [3],\n\t\t * \"fnCreatedCell\": function (nTd, sData, oData, iRow, iCol) {\n\t\t * if ( sData == \"1.7\" ) {\n\t\t * $(nTd).css('color', 'blue')\n\t\t * }\n\t\t * }\n\t\t * } ]\n\t\t * });\n\t\t * } );\n\t\t */\n\t\t\"fnCreatedCell\": null,\n\t\n\t\n\t\t/**\n\t\t * <code>Deprecated</code> Custom display function that will be called for the \n\t\t * display of each cell in this column.\n\t\t *\n\t\t * Please note
that this option has now been deprecated and will be removed\n\t\t * in the next version of DataTables. Please use mRender / mData rather than\n\t\t * fnRender.\n\t\t * @type function\n\t\t * @param {object} o Object with the following parameters:\n\t\t * @param {int} o.iDataRow The row in aoData\n\t\t * @param {int} o.iDataColumn The column in question\n\t\t * @param {array} o.aData The data for the row in question\n\t\t * @param {object} o.oSettings The settings object for this DataTables instance\n\t\t * @param {object} o.mDataProp The data property used for this column\n\t\t * @param {*} val The current cell value\n\t\t * @returns {string} The string you which to use in the display\n\t\t * @dtopt Columns\n\t\t * @deprecated\n\t\t */\n\t\t\"fnRender\": null,\n\t\n\t\n\t\t/**\n\t\t * The column index (starting from 0!) that you wish a sort to be performed\n\t\t * upon when this column is selected for sorting. This can be used for sorting\n\t\t * on hidden columns for example.\n\t\t
* @type int\n\t\t * @default -1 <i>Use automatically calculated column index</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"iDataSort\": 1, \"aTargets\": [ 0 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"iDataSort\": 1 },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"iDataSort\": -1,\n\t\n\t\n\t\t/**\n\t\t * This parameter has been replaced by mData in DataTables to ensure naming\n\t\t * consistency. mDataProp can still be used, as there is backwards compatibility\n\t\t * in DataTables for this option, but it is stro
ngly recommended that you use\n\t\t * mData in preference to mDataProp.\n\t\t * @name DataTable.defaults.columns.mDataProp\n\t\t */\n\t\n\t\n\t\t/**\n\t\t * This property can be used to read data from any JSON data source property,\n\t\t * including deeply nested objects / properties. mData can be given in a\n\t\t * number of different ways which effect its behaviour:\n\t\t * <ul>\n\t\t * <li>integer - treated as an array index for the data source. This is the\n\t\t * default that DataTables uses (incrementally increased for each column).</li>\n\t\t * <li>string - read an object property from the data source. Note that you can\n\t\t * use Javascript dotted notation to read deep properties / arrays from the\n\t\t * data source.</li>\n\t\t * <li>null - the sDefaultContent option will be used for the cell (null\n\t\t * by default, so you will need to specify the default content you want -\n\t\t * typically an empty string). This can be useful on generated columns suc
h \n\t\t * as edit / delete action columns.</li>\n\t\t * <li>function - the function given will be executed whenever DataTables \n\t\t * needs to set or get the data for a cell in the column. The function \n\t\t * takes three parameters:\n\t\t * <ul>\n\t\t * <li>{array|object} The data source for the row</li>\n\t\t * <li>{string} The type call data requested - this will be 'set' when\n\t\t * setting data or 'filter', 'display', 'type', 'sort' or undefined when \n\t\t * gathering data. Note that when <i>undefined</i> is given for the type\n\t\t * DataTables expects to get the raw data for the object back</li>\n\t\t * <li>{*} Data to set when the second parameter is 'set'.</li>\n\t\t * </ul>\n\t\t * The return value from the function is not required when 'set' is the type\n\t\t * of call, but otherwise the return is what will be used for the data\n\t\t * requested.</li>\n\t\t * </ul>\n\t\t *\n\t\t * Not
e that prior to DataTables 1.9.2 mData was called mDataProp. The name change\n\t\t * reflects the flexibility of this property and is consistent with the naming of\n\t\t * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as\n\t\t * it automatically maps the old name to the new if required.\n\t\t * @type string|int|function|null\n\t\t * @default null <i>Use automatically calculated column index</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Read table data from objects\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"sAjaxSource\": \"sources/deep.txt\",\n\t\t * \"aoColumns\": [\n\t\t * { \"mData\": \"engine\" },\n\t\t * { \"mData\": \"browser\" },\n\t\t * { \"mData\": \"platform.inner\" },\n\t\t * { \"mData\": \"platform.details.0\" },\n\t\t * { \"mData\": \"platform.details.1\" }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t
* @example\n\t\t * // Using mData as a function to provide different information for\n\t\t * // sorting, filtering and display. In this case, currency (price)\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ {\n\t\t * \"aTargets\": [ 0 ],\n\t\t * \"mData\": function ( source, type, val ) {\n\t\t * if (type === 'set') {\n\t\t * source.price = val;\n\t\t * // Store the computed dislay and filter values for efficiency\n\t\t * source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t\t * source.price_filter = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t\t * return;\n\t\t * }\n\t\t * else if (type === 'display') {\n\t\t * return source.price_display;\n\t\t * }\n\t\t * else if (type === 'filter') {\n\t\t * return source.price_filter;\n\t\
t * }\n\t\t * // 'sort', 'type' and undefined all just use the integer\n\t\t * return source.price;\n\t\t * }\n\t\t * } ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"mData\": null,\n\t\n\t\n\t\t/**\n\t\t * This property is the rendering partner to mData and it is suggested that\n\t\t * when you want to manipulate data for display (including filtering, sorting etc)\n\t\t * but not altering the underlying data for the table, use this property. mData\n\t\t * can actually do everything this property can and more, but this parameter is\n\t\t * easier to use since there is no 'set' option. Like mData is can be given\n\t\t * in a number of different ways to effect its behaviour, with the addition of \n\t\t * supporting array syntax for easy outputting of arrays (including arrays of\n\t\t * objects):\n\t\t * <ul>\n\t\t * <li>integer - treated as an array index for the data source. This is the\n\t\t * default that DataTables uses (incrementally increa
sed for each column).</li>\n\t\t * <li>string - read an object property from the data source. Note that you can\n\t\t * use Javascript dotted notation to read deep properties / arrays from the\n\t\t * data source and also array brackets to indicate that the data reader should\n\t\t * loop over the data source array. When characters are given between the array\n\t\t * brackets, these characters are used to join the data source array together.\n\t\t * For example: \"accounts[, ].name\" would result in a comma separated list with\n\t\t * the 'name' value from the 'accounts' array of objects.</li>\n\t\t * <li>function - the function given will be executed whenever DataTables \n\t\t * needs to set or get the data for a cell in the column. The function \n\t\t * takes three parameters:\n\t\t * <ul>\n\t\t * <li>{array|object} The data source for the row (based on mData)</li>\n\t\t * <li>{string} The type call data requested - this will be
'filter', 'display', \n\t\t * 'type' or 'sort'.</li>\n\t\t * <li>{array|object} The full data source for the row (not based on mData)</li>\n\t\t * </ul>\n\t\t * The return value from the function is what will be used for the data\n\t\t * requested.</li>\n\t\t * </ul>\n\t\t * @type string|int|function|null\n\t\t * @default null <i>Use mData</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Create a comma separated list from an array of objects\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"sAjaxSource\": \"sources/deep.txt\",\n\t\t * \"aoColumns\": [\n\t\t * { \"mData\": \"engine\" },\n\t\t * { \"mData\": \"browser\" },\n\t\t * {\n\t\t * \"mData\": \"platform\",\n\t\t * \"mRender\": \"[, ].name\"\n\t\t * }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Use as a function to crea
te a link from the data source\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [\n\t\t * {\n\t\t * \"aTargets\": [ 0 ],\n\t\t * \"mData\": \"download_link\",\n\t\t * \"mRender\": function ( data, type, full ) {\n\t\t * return '<a href=\"'+data+'\">Download</a>';\n\t\t * }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"mRender\": null,\n\t\n\t\n\t\t/**\n\t\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t\t * @type string\n\t\t * @default td\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Make the first column use TH cells\n\t\t * $(document).ready( function() {\n\t\t * var oTable = $('#example').dataTable( {\n\t\t *
\"aoColumnDefs\": [ {\n\t\t * \"aTargets\": [ 0 ],\n\t\t * \"sCellType\": \"th\"\n\t\t * } ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sCellType\": \"td\",\n\t\n\t\n\t\t/**\n\t\t * Class to give to each cell in this column.\n\t\t * @type string\n\t\t * @default <i>Empty string</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"sClass\": \"my_class\", \"aTargets\": [ 0 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"sClass\": \"my_class\" },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t
\t\"sClass\": \"\",\n\t\t\n\t\t/**\n\t\t * When DataTables calculates the column widths to assign to each column,\n\t\t * it finds the longest string in each column and then constructs a\n\t\t * temporary table and reads the widths from that. The problem with this\n\t\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer \n\t\t * string - thus the calculation can go wrong (doing it properly and putting\n\t\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t\t * a \"work around\" we provide this option. It will append its value to the\n\t\t * text that is found to be the longest string for the column - i.e. padding.\n\t\t * Generally you shouldn't need this, and it is not documented on the \n\t\t * general DataTables.net documentation\n\t\t * @type string\n\t\t * @default <i>Empty string<i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\
t * \"aoColumns\": [ \n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * {\n\t\t * \"sContentPadding\": \"mmm\"\n\t\t * }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sContentPadding\": \"\",\n\t\n\t\n\t\t/**\n\t\t * Allows a default value to be given for a column's data, and will be used\n\t\t * whenever a null data source is encountered (this can be because mData\n\t\t * is set to null, or because the data source itself is null).\n\t\t * @type string\n\t\t * @default null\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * {\n\t\t * \"mData\": null,\n\t\t * \"sDefaultContent\": \"Edit\",\n\t\t * \"aTargets\": [ -1 ]\n\t\t * }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t *
// Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * {\n\t\t * \"mData\": null,\n\t\t * \"sDefaultContent\": \"Edit\"\n\t\t * }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sDefaultContent\": null,\n\t\n\t\n\t\t/**\n\t\t * This parameter is only used in DataTables' server-side processing. It can\n\t\t * be exceptionally useful to know what columns are being displayed on the\n\t\t * client side, and to map these to database fields. When defined, the names\n\t\t * also allow DataTables to reorder information from the server if it comes\n\t\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t\t * client-side, your server-side code does not also need updating).\n\t\t * @type string\n\t\t * @default <i>Empty string</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @ex
ample\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"sName\": \"engine\", \"aTargets\": [ 0 ] },\n\t\t * { \"sName\": \"browser\", \"aTargets\": [ 1 ] },\n\t\t * { \"sName\": \"platform\", \"aTargets\": [ 2 ] },\n\t\t * { \"sName\": \"version\", \"aTargets\": [ 3 ] },\n\t\t * { \"sName\": \"grade\", \"aTargets\": [ 4 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"sName\": \"engine\" },\n\t\t * { \"sName\": \"browser\" },\n\t\t * { \"sName\": \"platform\" },\n\t\t * { \"sName\": \"version\" },\n\t\t * { \"sName\": \"grade\" }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sName\": \"\",\n\t\n\t
\n\t\t/**\n\t\t * Defines a data source type for the sorting which can be used to read\n\t\t * real-time information from the table (updating the internally cached\n\t\t * version) prior to sorting. This allows sorting to occur on user editable\n\t\t * elements such as form inputs.\n\t\t * @type string\n\t\t * @default std\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [\n\t\t * { \"sSortDataType\": \"dom-text\", \"aTargets\": [ 2, 3 ] },\n\t\t * { \"sType\": \"numeric\", \"aTargets\": [ 3 ] },\n\t\t * { \"sSortDataType\": \"dom-select\", \"aTargets\": [ 4 ] },\n\t\t * { \"sSortDataType\": \"dom-checkbox\", \"aTargets\": [ 5 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n
\t\t * \"aoColumns\": [\n\t\t * null,\n\t\t * null,\n\t\t * { \"sSortDataType\": \"dom-text\" },\n\t\t * { \"sSortDataType\": \"dom-text\", \"sType\": \"numeric\" },\n\t\t * { \"sSortDataType\": \"dom-select\" },\n\t\t * { \"sSortDataType\": \"dom-checkbox\" }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sSortDataType\": \"std\",\n\t\n\t\n\t\t/**\n\t\t * The title of this column.\n\t\t * @type string\n\t\t * @default null <i>Derived from the 'TH' value for this column in the \n\t\t * original HTML table.</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"sTitle\": \"My column title\", \"aTargets\": [ 0 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( fun
ction() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"sTitle\": \"My column title\" },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sTitle\": null,\n\t\n\t\n\t\t/**\n\t\t * The type allows you to specify how the data for this column will be sorted.\n\t\t * Four types (string, numeric, date and html (which will strip HTML tags\n\t\t * before sorting)) are currently available. Note that only date formats\n\t\t * understood by Javascript's Date() object will be accepted as type date. For\n\t\t * example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string', 'numeric',\n\t\t * 'date' or 'html' (by default). Further types can be adding through\n\t\t * plug-ins.\n\t\t * @type string\n\t\t * @default null <i>Auto-detected from raw data</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumnDefs\n\t\t * $(document).ready
( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"sType\": \"html\", \"aTargets\": [ 0 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"sType\": \"html\" },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sType\": null,\n\t\n\t\n\t\t/**\n\t\t * Defining the width of the column, this parameter may take any CSS value\n\t\t * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not\n\t\t * been given a specific width through this interface ensuring that the table\n\t\t * remains readable.\n\t\t * @type string\n\t\t * @default null <i>Automatic</i>\n\t\t * @dtopt Columns\n\t\t * \n\t\t * @example\n\t\t * // Using aoCol
umnDefs\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumnDefs\": [ \n\t\t * { \"sWidth\": \"20%\", \"aTargets\": [ 0 ] }\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t * \n\t\t * @example\n\t\t * // Using aoColumns\n\t\t * $(document).ready( function() {\n\t\t * $('#example').dataTable( {\n\t\t * \"aoColumns\": [ \n\t\t * { \"sWidth\": \"20%\" },\n\t\t * null,\n\t\t * null,\n\t\t * null,\n\t\t * null\n\t\t * ]\n\t\t * } );\n\t\t * } );\n\t\t */\n\t\t\"sWidth\": null\n\t};\n\t\n\t\n\t\n\t/**\n\t * DataTables settings object - this holds all the information needed for a\n\t * given table, including configuration, data and current application of the\n\t * table options. DataTables does not have a single instance for each DataTable\n\t * with the settings attached to that instance, but rather instances of the\n\t * DataTable \"class\" are created on-the-f
ly as needed (typically by a \n\t * $().dataTable() call) and the settings object is then applied to that\n\t * instance.\n\t * \n\t * Note that this object is related to {@link DataTable.defaults} but this \n\t * one is the internal data store for DataTables's cache of columns. It should\n\t * NOT be manipulated outside of DataTables. Any configuration should be done\n\t * through the initialisation options.\n\t * @namespace\n\t * @todo Really should attach the settings object to individual instances so we\n\t * don't need to create new instances on each $().dataTable() call (if the\n\t * table already exists). It would also save passing oSettings around and\n\t * into every single function. However, this is a very significant \n\t * architecture change for DataTables and will almost certainly break\n\t * backwards compatibility with older installations. This is something that\n\t * will be done in 2.0.\n\t */\n\tDataTable.models.oSettings = {\n\t\t/**\n\t\t * Primary features of DataTab
les and their enablement state.\n\t\t * @namespace\n\t\t */\n\t\t\"oFeatures\": {\n\t\t\t\n\t\t\t/**\n\t\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t\t * optimum table and columns widths (true) or not (false).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bAutoWidth\": null,\n\t\n\t\t\t/**\n\t\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t\t * needed by a driven page draw. This can give a significant speed\n\t\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t\t * difference at all fro DOM and server-side processing tables.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bDeferRender\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Enable filtering on the table o
r not. Note that if this is disabled\n\t\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bFilter\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t\t * flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bInfo\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Present a user control allowing the end user to change the page size\n\t\t\t * when pagination is enabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"
bLengthChange\": null,\n\t\n\t\t\t/**\n\t\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t\t * changing must also be disabled.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bPaginate\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t\t * user request - typically an Ajax request for server-side processing.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bProcessing\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t\t * get all data from the server for every draw - there is no filtering,\n\t\t\t * sorting or paging done on the client-side.\n\t\t\t * Note that this parameter will be set by the ini
tialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bServerSide\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Sorting enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bSort\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t\t * there is a lot of DOM interaction.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bSortClasses\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * State saving enablement flag.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t
* @type boolean\n\t\t\t */\n\t\t\t\"bStateSave\": null\n\t\t},\n\t\t\n\t\n\t\t/**\n\t\t * Scrolling settings for a table.\n\t\t * @namespace\n\t\t */\n\t\t\"oScroll\": {\n\t\t\t/**\n\t\t\t * Indicate if DataTables should be allowed to set the padding / margin\n\t\t\t * etc for the scrolling header elements or not. Typically you will want\n\t\t\t * this.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bAutoCss\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t\t * table container down to the height of the table (when true).\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bCollapse\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Infinite scrolling enablement flag. Now deprecated in favour of\n\t\t\
t * using the Scroller plug-in.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type boolean\n\t\t\t */\n\t\t\t\"bInfinite\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t\t * during table initialisation.\n\t\t\t * @type int\n\t\t\t * @default 0\n\t\t\t */\n\t\t\t\"iBarWidth\": 0,\n\t\t\t\n\t\t\t/**\n\t\t\t * Space (in pixels) between the bottom of the scrolling container and \n\t\t\t * the bottom of the scrolling viewport before the next page is loaded\n\t\t\t * when using infinite scrolling.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type int\n\t\t\t */\n\t\t\t\"iLoadGap\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is \n\t\t\t * disabled if an empty string.\n\t\t\t * Note that this param
eter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type string\n\t\t\t */\n\t\t\t\"sX\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t\t * should not need to use this.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type string\n\t\t\t * @deprecated\n\t\t\t */\n\t\t\t\"sXInner\": null,\n\t\t\t\n\t\t\t/**\n\t\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t\t * if an empty string.\n\t\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t\t * set a default use {@link DataTable.defaults}.\n\t\t\t * @type string\n\t\t\t */\n\t\t\t\"sY\": null\n\t\t},\n\t\t\n\t\t/**\n\t\t * Language information for the table.\n\t\t * @namespace\n\t\t * @extends DataTable.defaults.oLanguage\n\t\t */\n\t\t\"oLanguage\": {\n\t\t\t/**\n\t\t\
t * Information callback function. See \n\t\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t\t * @type function\n\t\t\t * @default null\n\t\t\t */\n\t\t\t\"fnInfoCallback\": null\n\t\t},\n\t\t\n\t\t/**\n\t\t * Browser support parameters\n\t\t * @namespace\n\t\t */\n\t\t\"oBrowser\": {\n\t\t\t/**\n\t\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t\t * scrolling element (IE6/7)\n\t\t\t * @type boolean\n\t\t\t * @default false\n\t\t\t */\n\t\t\t\"bScrollOversize\": false\n\t\t},\n\t\t\n\t\t/**\n\t\t * Array referencing the nodes which are used for the features. The \n\t\t * parameters of this object match what is allowed by sDom - i.e.\n\t\t * <ul>\n\t\t * <li>'l' - Length changing</li>\n\t\t * <li>'f' - Filtering input</li>\n\t\t * <li>'t' - The table!</li>\n\t\t * <li>'i' - Information</li>\n\t\t * <li>'p' - Pagination</li>\n\t\t * <li>'r' - pRocessing</li>\n\t\t * </ul>\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aanFeatures\"
: [],\n\t\t\n\t\t/**\n\t\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t\t * information.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoData\": [],\n\t\t\n\t\t/**\n\t\t * Array of indexes which are in the current display (after filtering etc)\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aiDisplay\": [],\n\t\t\n\t\t/**\n\t\t * Array of indexes for display - no filtering\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aiDisplayMaster\": [],\n\t\t\n\t\t/**\n\t\t * Store information about each column that is in use\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoColumns\": [],\n\t\t\n\t\t/**\n\t\t * Store information about the table's header\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoHeader\": [],\n\t\t\n\t\t/**\n\t\t * Store information about the table's footer\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoFooter\": [],\n\t\t\n\t\t/**\n\t\t * Search data array for regular expression searching\n\t\t *
@type array\n\t\t * @default []\n\t\t */\n\t\t\"asDataSearch\": [],\n\t\t\n\t\t/**\n\t\t * Store the applied global search information in case we want to force a \n\t\t * research or compare the old search to a new one.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @namespace\n\t\t * @extends DataTable.models.oSearch\n\t\t */\n\t\t\"oPreviousSearch\": {},\n\t\t\n\t\t/**\n\t\t * Store the applied search for each column - see \n\t\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t\t * filtering information for each column.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoPreSearchCols\": [],\n\t\t\n\t\t/**\n\t\t * Sorting that is applied to the table. Note that the inner arrays are\n\t\t * used in the following manner:\n\t\t * <ul>\n\t\t * <li>Index 0 - column number</li>\n\t\t * <li>Index 1 - current sorting direction</li>\n\t\t * <li>Index 2 - index of asSorting for th
is column</li>\n\t\t * </ul>\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type array\n\t\t * @todo These inner arrays should really be objects\n\t\t */\n\t\t\"aaSorting\": null,\n\t\t\n\t\t/**\n\t\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t\t * aaSorting).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type array|null\n\t\t * @default null\n\t\t */\n\t\t\"aaSortingFixed\": null,\n\t\t\n\t\t/**\n\t\t * Classes to use for the striping of a table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"asStripeClasses\": null,\n\t\t\n\t\t/**\n\t\t * If restoring a table - we should restore its striping classes as well\n\t\t * @type array\n\t\t * @def
ault []\n\t\t */\n\t\t\"asDestroyStripes\": [],\n\t\t\n\t\t/**\n\t\t * If restoring a table - we should restore its width \n\t\t * @type int\n\t\t * @default 0\n\t\t */\n\t\t\"sDestroyWidth\": 0,\n\t\t\n\t\t/**\n\t\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoRowCallback\": [],\n\t\t\n\t\t/**\n\t\t * Callback functions for the header on each draw.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoHeaderCallback\": [],\n\t\t\n\t\t/**\n\t\t * Callback function for the footer on each draw.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoFooterCallback\": [],\n\t\t\n\t\t/**\n\t\t * Array of callback functions for draw callback functions\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoDrawCallback\": [],\n\t\t\n\t\t/**\n\t\t * Array of callback functions for row created function\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoRowCreatedCallback\": [],\n\t\t\n\t\t/**\n\t\t
* Callback functions for just before the table is redrawn. A return of \n\t\t * false will be used to cancel the draw.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoPreDrawCallback\": [],\n\t\t\n\t\t/**\n\t\t * Callback functions for when the table has been initialised.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoInitComplete\": [],\n\t\n\t\t\n\t\t/**\n\t\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t\t * saving state.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoStateSaveParams\": [],\n\t\t\n\t\t/**\n\t\t * Callbacks for modifying the settings that have been stored for state saving\n\t\t * prior to using the stored values to restore the state.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoStateLoadParams\": [],\n\t\t\n\t\t/**\n\t\t * Callbacks for operating on the settings object once the saved state has been\n\t\t * loaded\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoStateLoaded\": [],\n\t\t\n\t\
t/**\n\t\t * Cache the table ID for quick access\n\t\t * @type string\n\t\t * @default <i>Empty string</i>\n\t\t */\n\t\t\"sTableId\": \"\",\n\t\t\n\t\t/**\n\t\t * The TABLE node for the main table\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTable\": null,\n\t\t\n\t\t/**\n\t\t * Permanent ref to the thead element\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTHead\": null,\n\t\t\n\t\t/**\n\t\t * Permanent ref to the tfoot element - if it exists\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTFoot\": null,\n\t\t\n\t\t/**\n\t\t * Permanent ref to the tbody element\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTBody\": null,\n\t\t\n\t\t/**\n\t\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t\t * @type node\n\t\t * @default null\n\t\t */\n\t\t\"nTableWrapper\": null,\n\t\t\n\t\t/**\n\t\t * Indicate if when using server-side processing the loading of data \n\t\t * should be deferred until the second draw.\n\t\t * Note that th
is parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type boolean\n\t\t * @default false\n\t\t */\n\t\t\"bDeferLoading\": false,\n\t\t\n\t\t/**\n\t\t * Indicate if all required information has been read in\n\t\t * @type boolean\n\t\t * @default false\n\t\t */\n\t\t\"bInitialised\": false,\n\t\t\n\t\t/**\n\t\t * Information about open rows. Each object in the array has the parameters\n\t\t * 'nTr' and 'nParent'\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoOpenRows\": [],\n\t\t\n\t\t/**\n\t\t * Dictate the positioning of DataTables' control elements - see\n\t\t * {@link DataTable.model.oInit.sDom}.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sDom\": null,\n\t\t\n\t\t/**\n\t\t * Which type of pagination should be used.\n\t\t * Note that this parameter will be set by the initial
isation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type string \n\t\t * @default two_button\n\t\t */\n\t\t\"sPaginationType\": \"two_button\",\n\t\t\n\t\t/**\n\t\t * The cookie duration (for bStateSave) in seconds.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type int\n\t\t * @default 0\n\t\t */\n\t\t\"iCookieDuration\": 0,\n\t\t\n\t\t/**\n\t\t * The cookie name prefix.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type string\n\t\t * @default <i>Empty string</i>\n\t\t */\n\t\t\"sCookiePrefix\": \"\",\n\t\t\n\t\t/**\n\t\t * Callback function for cookie creation.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type function\n\t\t * @default null\n\t\t */\n\t\t\"fnCookieCallback\": null,\n
\t\t\n\t\t/**\n\t\t * Array of callback functions for state saving. Each array element is an \n\t\t * object with the following parameters:\n\t\t * <ul>\n\t\t * <li>function:fn - function to call. Takes two parameters, oSettings\n\t\t * and the JSON string to save that has been thus far created. Returns\n\t\t * a JSON string to be inserted into a json object \n\t\t * (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t\t * <li>string:sName - name of callback</li>\n\t\t * </ul>\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoStateSave\": [],\n\t\t\n\t\t/**\n\t\t * Array of callback functions for state loading. Each array element is an \n\t\t * object with the following parameters:\n\t\t * <ul>\n\t\t * <li>function:fn - function to call. Takes two parameters, oSettings \n\t\t * and the object stored. May return false to cancel state loading</li>\n\t\t * <li>string:sName - name of callback</li>\n\t\t * </ul>\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\
"aoStateLoad\": [],\n\t\t\n\t\t/**\n\t\t * State that was loaded from the cookie. Useful for back reference\n\t\t * @type object\n\t\t * @default null\n\t\t */\n\t\t\"oLoadedState\": null,\n\t\t\n\t\t/**\n\t\t * Source url for AJAX data for the table.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sAjaxSource\": null,\n\t\t\n\t\t/**\n\t\t * Property from a given object from which to read the table data from. This\n\t\t * can be an empty string (when not server-side processing), in which case \n\t\t * it is assumed an an array is given directly.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type string\n\t\t */\n\t\t\"sAjaxDataProp\": null,\n\t\t\n\t\t/**\n\t\t * Note if draw should be blocked while getting data\n\t\t * @type boolean\n\t\t * @default true\n\t\t */\
n\t\t\"bAjaxDataGet\": true,\n\t\t\n\t\t/**\n\t\t * The last jQuery XHR object that was used for server-side data gathering. \n\t\t * This can be used for working with the XHR information in one of the \n\t\t * callbacks\n\t\t * @type object\n\t\t * @default null\n\t\t */\n\t\t\"jqXHR\": null,\n\t\t\n\t\t/**\n\t\t * Function to get the server-side data.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type function\n\t\t */\n\t\t\"fnServerData\": null,\n\t\t\n\t\t/**\n\t\t * Functions which are called prior to sending an Ajax request so extra \n\t\t * parameters can easily be sent to the server\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aoServerParams\": [],\n\t\t\n\t\t/**\n\t\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if \n\t\t * required).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t
\t * @type string\n\t\t */\n\t\t\"sServerMethod\": null,\n\t\t\n\t\t/**\n\t\t * Format numbers for display.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type function\n\t\t */\n\t\t\"fnFormatNumber\": null,\n\t\t\n\t\t/**\n\t\t * List of options that can be used for the user selectable length menu.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type array\n\t\t * @default []\n\t\t */\n\t\t\"aLengthMenu\": null,\n\t\t\n\t\t/**\n\t\t * Counter for the draws that the table does. Also used as a tracker for\n\t\t * server-side processing\n\t\t * @type int\n\t\t * @default 0\n\t\t */\n\t\t\"iDraw\": 0,\n\t\t\n\t\t/**\n\t\t * Indicate if a redraw is being done - useful for Ajax\n\t\t * @type boolean\n\t\t * @default false\n\t\t */\n\t\t\"bDrawing\": false,\n\t\t\n\t\t/**\n\t\t * Draw index (iDraw) of the last error whe
n parsing the returned data\n\t\t * @type int\n\t\t * @default -1\n\t\t */\n\t\t\"iDrawError\": -1,\n\t\t\n\t\t/**\n\t\t * Paging display length\n\t\t * @type int\n\t\t * @default 10\n\t\t */\n\t\t\"_iDisplayLength\": 10,\n\t\n\t\t/**\n\t\t * Paging start point - aiDisplay index\n\t\t * @type int\n\t\t * @default 0\n\t\t */\n\t\t\"_iDisplayStart\": 0,\n\t\n\t\t/**\n\t\t * Paging end point - aiDisplay index. Use fnDisplayEnd rather than\n\t\t * this property to get the end point\n\t\t * @type int\n\t\t * @default 10\n\t\t * @private\n\t\t */\n\t\t\"_iDisplayEnd\": 10,\n\t\t\n\t\t/**\n\t\t * Server-side processing - number of records in the result set\n\t\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t * @type int\n\t\t * @default 0\n\t\t * @private\n\t\t */\n\t\t\"_iRecordsTotal\": 0,\n\t\n\t\t/**\n\t\t * Server-side processing - number of records in the curr
ent display set\n\t\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t\t * this property to get the value of the number of records, regardless of\n\t\t * the server-side processing setting.\n\t\t * @type boolean\n\t\t * @default 0\n\t\t * @private\n\t\t */\n\t\t\"_iRecordsDisplay\": 0,\n\t\t\n\t\t/**\n\t\t * Flag to indicate if jQuery UI marking and classes should be used.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type boolean\n\t\t */\n\t\t\"bJUI\": null,\n\t\t\n\t\t/**\n\t\t * The classes to use for the table\n\t\t * @type object\n\t\t * @default {}\n\t\t */\n\t\t\"oClasses\": {},\n\t\t\n\t\t/**\n\t\t * Flag attached to the settings object so you can check in the draw \n\t\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @deprecated\n\t\t */\n\t\t\"bFiltered\": false,\n\t\t\n\t\t/**\n\t\t *
Flag attached to the settings object so you can check in the draw \n\t\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t\t * events.\n\t\t * @type boolean\n\t\t * @default false\n\t\t * @deprecated\n\t\t */\n\t\t\"bSorted\": false,\n\t\t\n\t\t/**\n\t\t * Indicate that if multiple rows are in the header and there is more than \n\t\t * one unique cell per column, if the top one (true) or bottom one (false) \n\t\t * should be used for sorting / title by DataTables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t * @type boolean\n\t\t */\n\t\t\"bSortCellsTop\": null,\n\t\t\n\t\t/**\n\t\t * Initialisation object that is used for the table\n\t\t * @type object\n\t\t * @default null\n\t\t */\n\t\t\"oInit\": null,\n\t\t\n\t\t/**\n\t\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t\t * destroy so they can clean up markup and events.\n\t\t * @type array\n\t\t * @
default []\n\t\t */\n\t\t\"aoDestroyCallback\": [],\n\t\n\t\t\n\t\t/**\n\t\t * Get the number of records in the current record set, before filtering\n\t\t * @type function\n\t\t */\n\t\t\"fnRecordsTotal\": function ()\n\t\t{\n\t\t\tif ( this.oFeatures.bServerSide ) {\n\t\t\t\treturn parseInt(this._iRecordsTotal, 10);\n\t\t\t} else {\n\t\t\t\treturn this.aiDisplayMaster.length;\n\t\t\t}\n\t\t},\n\t\t\n\t\t/**\n\t\t * Get the number of records in the current record set, after filtering\n\t\t * @type function\n\t\t */\n\t\t\"fnRecordsDisplay\": function ()\n\t\t{\n\t\t\tif ( this.oFeatures.bServerSide ) {\n\t\t\t\treturn parseInt(this._iRecordsDisplay, 10);\n\t\t\t} else {\n\t\t\t\treturn this.aiDisplay.length;\n\t\t\t}\n\t\t},\n\t\t\n\t\t/**\n\t\t * Set the display end point - aiDisplay index\n\t\t * @type function\n\t\t * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here\n\t\t */\n\t\t\"fnDisplayEnd\": function ()\n\t\t{\n\t\t\tif ( this.oFeatures.bServerSide ) {\n\t\t\t\tif ( this.o
Features.bPaginate === false || this._iDisplayLength == -1 ) {\n\t\t\t\t\treturn this._iDisplayStart+this.aiDisplay.length;\n\t\t\t\t} else {\n\t\t\t\t\treturn Math.min( this._iDisplayStart+this._iDisplayLength, \n\t\t\t\t\t\tthis._iRecordsDisplay );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn this._iDisplayEnd;\n\t\t\t}\n\t\t},\n\t\t\n\t\t/**\n\t\t * The DataTables object for this table\n\t\t * @type object\n\t\t * @default null\n\t\t */\n\t\t\"oInstance\": null,\n\t\t\n\t\t/**\n\t\t * Unique identifier for each instance of the DataTables object. If there\n\t\t * is an ID on the table node, then it takes that value, otherwise an\n\t\t * incrementing internal counter is used.\n\t\t * @type string\n\t\t * @default null\n\t\t */\n\t\t\"sInstance\": null,\n\t\n\t\t/**\n\t\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t\t * keyboard navigation of the table and its controls.\n\t\t */\n\t\t\"iTabIndex\": 0,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table
if scrolling\n\t\t */\n\t\t\"nScrollHead\": null,\n\t\n\t\t/**\n\t\t * DIV container for the footer scrolling table if scrolling\n\t\t */\n\t\t\"nScrollFoot\": null\n\t};\n\n\t/**\n\t * Extension object for DataTables that is used to provide all extension options.\n\t * \n\t * Note that the <i>DataTable.ext</i> object is available through\n\t * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is\n\t * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons.\n\t * @namespace\n\t * @extends DataTable.models.ext\n\t */\n\tDataTable.ext = $.extend( true, {}, DataTable.models.ext );\n\t\n\t$.extend( DataTable.ext.oStdClasses, {\n\t\t\"sTable\": \"dataTable\",\n\t\n\t\t/* Two buttons buttons */\n\t\t\"sPagePrevEnabled\": \"paginate_enabled_previous\",\n\t\t\"sPagePrevDisabled\": \"paginate_disabled_previous\",\n\t\t\"sPageNextEnabled\": \"paginate_enabled_next\",\n\t\t\"sPageNextDisabled\": \"paginate_disabled_next\",\n\t\t\"sPageJUINext\": \"\",\n\t\t\"sPageJUIPrev\": \"\"
,\n\t\t\n\t\t/* Full numbers paging buttons */\n\t\t\"sPageButton\": \"paginate_button\",\n\t\t\"sPageButtonActive\": \"paginate_active\",\n\t\t\"sPageButtonStaticDisabled\": \"paginate_button paginate_button_disabled\",\n\t\t\"sPageFirst\": \"first\",\n\t\t\"sPagePrevious\": \"previous\",\n\t\t\"sPageNext\": \"next\",\n\t\t\"sPageLast\": \"last\",\n\t\t\n\t\t/* Striping classes */\n\t\t\"sStripeOdd\": \"odd\",\n\t\t\"sStripeEven\": \"even\",\n\t\t\n\t\t/* Empty row */\n\t\t\"sRowEmpty\": \"dataTables_empty\",\n\t\t\n\t\t/* Features */\n\t\t\"sWrapper\": \"dataTables_wrapper\",\n\t\t\"sFilter\": \"dataTables_filter\",\n\t\t\"sInfo\": \"dataTables_info\",\n\t\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\t\"sLength\": \"dataTables_length\",\n\t\t\"sProcessing\": \"dataTables_processing\",\n\t\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\": \"sorting_asc\",\n\t\t\"sSortDesc\": \"sorting_desc\",\n\t\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\t\"sSortabl
eAsc\": \"sorting_asc_disabled\",\n\t\t\"sSortableDesc\": \"sorting_desc_disabled\",\n\t\t\"sSortableNone\": \"sorting_disabled\",\n\t\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\t\t\"sSortJUIAsc\": \"\",\n\t\t\"sSortJUIDesc\": \"\",\n\t\t\"sSortJUI\": \"\",\n\t\t\"sSortJUIAscAllowed\": \"\",\n\t\t\"sSortJUIDescAllowed\": \"\",\n\t\t\"sSortJUIWrapper\": \"\",\n\t\t\"sSortIcon\": \"\",\n\t\t\n\t\t/* Scrolling */\n\t\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\t\t\n\t\t/* Misc */\n\t\t\"sFooterTH\": \"\",\n\t\t\"sJUIHeader\": \"\",\n\t\t\"sJUIFooter\": \"\"\n\t} );\n\t\n\t\n\t$.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, {\n\t\t/* Two buttons buttons */\n\t\t\"sPagePrevEnabled\": \"f
g-button ui-button ui-state-default ui-corner-left\",\n\t\t\"sPagePrevDisabled\": \"fg-button ui-button ui-state-default ui-corner-left ui-state-disabled\",\n\t\t\"sPageNextEnabled\": \"fg-button ui-button ui-state-default ui-corner-right\",\n\t\t\"sPageNextDisabled\": \"fg-button ui-button ui-state-default ui-corner-right ui-state-disabled\",\n\t\t\"sPageJUINext\": \"ui-icon ui-icon-circle-arrow-e\",\n\t\t\"sPageJUIPrev\": \"ui-icon ui-icon-circle-arrow-w\",\n\t\t\n\t\t/* Full numbers paging buttons */\n\t\t\"sPageButton\": \"fg-button ui-button ui-state-default\",\n\t\t\"sPageButtonActive\": \"fg-button ui-button ui-state-default ui-state-disabled\",\n\t\t\"sPageButtonStaticDisabled\": \"fg-button ui-button ui-state-default ui-state-disabled\",\n\t\t\"sPageFirst\": \"first ui-corner-tl ui-corner-bl\",\n\t\t\"sPageLast\": \"last ui-corner-tr ui-corner-br\",\n\t\t\n\t\t/* Features */\n\t\t\"sPaging\": \"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi \"+\n\t\t\t\"ui-buttonset-multi paging_\"
, /* Note that the type is postfixed */\n\t\t\n\t\t/* Sorting */\n\t\t\"sSortAsc\": \"ui-state-default\",\n\t\t\"sSortDesc\": \"ui-state-default\",\n\t\t\"sSortable\": \"ui-state-default\",\n\t\t\"sSortableAsc\": \"ui-state-default\",\n\t\t\"sSortableDesc\": \"ui-state-default\",\n\t\t\"sSortableNone\": \"ui-state-default\",\n\t\t\"sSortJUIAsc\": \"css_right ui-icon ui-icon-triangle-1-n\",\n\t\t\"sSortJUIDesc\": \"css_right ui-icon ui-icon-triangle-1-s\",\n\t\t\"sSortJUI\": \"css_right ui-icon ui-icon-carat-2-n-s\",\n\t\t\"sSortJUIAscAllowed\": \"css_right ui-icon ui-icon-carat-1-n\",\n\t\t\"sSortJUIDescAllowed\": \"css_right ui-icon ui-icon-carat-1-s\",\n\t\t\"sSortJUIWrapper\": \"DataTables_sort_wrapper\",\n\t\t\"sSortIcon\": \"DataTables_sort_icon\",\n\t\t\n\t\t/* Scrolling */\n\t\t\"sScrollHead\": \"dataTables_scrollHead ui-state-default\",\n\t\t\"sScrollFoot\": \"dataTables_scrollFoot ui-state-default\",\n\t\t\n\t\t/* Misc */\n\t\t\"sFooterTH\": \"ui-state-default\",\n\t\t\"sJUIHeader\": \"fg-toolbar ui
-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix\",\n\t\t\"sJUIFooter\": \"fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix\"\n\t} );\n\t\n\t/*\n\t * Variable: oPagination\n\t * Purpose: \n\t * Scope: jQuery.fn.dataTableExt\n\t */\n\t$.extend( DataTable.ext.oPagination, {\n\t\t/*\n\t\t * Variable: two_button\n\t\t * Purpose: Standard two button (forward/back) pagination\n\t\t * Scope: jQuery.fn.dataTableExt.oPagination\n\t\t */\n\t\t\"two_button\": {\n\t\t\t/*\n\t\t\t * Function: oPagination.two_button.fnInit\n\t\t\t * Purpose: Initialise dom elements required for pagination with forward/back buttons only\n\t\t\t * Returns: -\n\t\t\t * Inputs: object:oSettings - dataTables settings object\n\t\t\t * node:nPaging - the DIV which contains this pagination control\n\t\t\t * function:fnCallbackDraw - draw function which must be called on update\n\t\t\t */\n\t\t\t\"fnInit\": function ( oSettings, nPaging, fnCallbackDraw )\n\t\t
\t{\n\t\t\t\tvar oLang = oSettings.oLanguage.oPaginate;\n\t\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\tvar fnClickHandler = function ( e ) {\n\t\t\t\t\tif ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tfnCallbackDraw( oSettings );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\n\t\t\t\tvar sAppend = (!oSettings.bJUI) ?\n\t\t\t\t\t'<a class=\"'+oSettings.oClasses.sPagePrevDisabled+'\" tabindex=\"'+oSettings.iTabIndex+'\" role=\"button\">'+oLang.sPrevious+'</a>'+\n\t\t\t\t\t'<a class=\"'+oSettings.oClasses.sPageNextDisabled+'\" tabindex=\"'+oSettings.iTabIndex+'\" role=\"button\">'+oLang.sNext+'</a>'\n\t\t\t\t\t:\n\t\t\t\t\t'<a class=\"'+oSettings.oClasses.sPagePrevDisabled+'\" tabindex=\"'+oSettings.iTabIndex+'\" role=\"button\"><span class=\"'+oSettings.oClasses.sPageJUIPrev+'\"></span></a>'+\n\t\t\t\t\t'<a class=\"'+oSettings.oClasses.sPageNextDisabled+'\" tabindex=\"'+oSettings.iTabIndex+'\" role=\"button\"><span class=\"'+oSettings.oClasses.sPageJUINext+'\"></span></a>';\n\t\t\
t\t$(nPaging).append( sAppend );\n\t\t\t\t\n\t\t\t\tvar els = $('a', nPaging);\n\t\t\t\tvar nPrevious = els[0],\n\t\t\t\t\tnNext = els[1];\n\t\t\t\t\n\t\t\t\toSettings.oApi._fnBindAction( nPrevious, {action: \"previous\"}, fnClickHandler );\n\t\t\t\toSettings.oApi._fnBindAction( nNext, {action: \"next\"}, fnClickHandler );\n\t\t\t\t\n\t\t\t\t/* ID the first elements only */\n\t\t\t\tif ( !oSettings.aanFeatures.p )\n\t\t\t\t{\n\t\t\t\t\tnPaging.id = oSettings.sTableId+'_paginate';\n\t\t\t\t\tnPrevious.id = oSettings.sTableId+'_previous';\n\t\t\t\t\tnNext.id = oSettings.sTableId+'_next';\n\t\n\t\t\t\t\tnPrevious.setAttribute('aria-controls', oSettings.sTableId);\n\t\t\t\t\tnNext.setAttribute('aria-controls', oSettings.sTableId);\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\t/*\n\t\t\t * Function: oPagination.two_button.fnUpdate\n\t\t\t * Purpose: Update the two button pagination at the end of the draw\n\t\t\t * Returns: -\n\t\t\t * Inputs: object:oSettings - dataTables settings object\n\t\t\t * fun
ction:fnCallbackDraw - draw function to call on page change\n\t\t\t */\n\t\t\t\"fnUpdate\": function ( oSettings, fnCallbackDraw )\n\t\t\t{\n\t\t\t\tif ( !oSettings.aanFeatures.p )\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\tvar an = oSettings.aanFeatures.p;\n\t\t\t\tvar nNode;\n\t\n\t\t\t\t/* Loop over each instance of the pager */\n\t\t\t\tfor ( var i=0, iLen=an.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tnNode = an[i].firstChild;\n\t\t\t\t\tif ( nNode )\n\t\t\t\t\t{\n\t\t\t\t\t\t/* Previous page */\n\t\t\t\t\t\tnNode.className = ( oSettings._iDisplayStart === 0 ) ?\n\t\t\t\t\t\t oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;\n\t\t\t\t\t\t \n\t\t\t\t\t\t/* Next page */\n\t\t\t\t\t\tnNode = nNode.nextSibling;\n\t\t\t\t\t\tnNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?\n\t\t\t\t\t\t oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\t\n\t\t/
*\n\t\t * Variable: iFullNumbersShowPages\n\t\t * Purpose: Change the number of pages which can be seen\n\t\t * Scope: jQuery.fn.dataTableExt.oPagination\n\t\t */\n\t\t\"iFullNumbersShowPages\": 5,\n\t\t\n\t\t/*\n\t\t * Variable: full_numbers\n\t\t * Purpose: Full numbers pagination\n\t\t * Scope: jQuery.fn.dataTableExt.oPagination\n\t\t */\n\t\t\"full_numbers\": {\n\t\t\t/*\n\t\t\t * Function: oPagination.full_numbers.fnInit\n\t\t\t * Purpose: Initialise dom elements required for pagination with a list of the pages\n\t\t\t * Returns: -\n\t\t\t * Inputs: object:oSettings - dataTables settings object\n\t\t\t * node:nPaging - the DIV which contains this pagination control\n\t\t\t * function:fnCallbackDraw - draw function which must be called on update\n\t\t\t */\n\t\t\t\"fnInit\": function ( oSettings, nPaging, fnCallbackDraw )\n\t\t\t{\n\t\t\t\tvar oLang = oSettings.oLanguage.oPaginate;\n\t\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\tvar fnClickHandler = function ( e ) {\n
\t\t\t\t\tif ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tfnCallbackDraw( oSettings );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\n\t\t\t\t$(nPaging).append(\n\t\t\t\t\t'<a tabindex=\"'+oSettings.iTabIndex+'\" class=\"'+oClasses.sPageButton+\" \"+oClasses.sPageFirst+'\">'+oLang.sFirst+'</a>'+\n\t\t\t\t\t'<a tabindex=\"'+oSettings.iTabIndex+'\" class=\"'+oClasses.sPageButton+\" \"+oClasses.sPagePrevious+'\">'+oLang.sPrevious+'</a>'+\n\t\t\t\t\t'<span></span>'+\n\t\t\t\t\t'<a tabindex=\"'+oSettings.iTabIndex+'\" class=\"'+oClasses.sPageButton+\" \"+oClasses.sPageNext+'\">'+oLang.sNext+'</a>'+\n\t\t\t\t\t'<a tabindex=\"'+oSettings.iTabIndex+'\" class=\"'+oClasses.sPageButton+\" \"+oClasses.sPageLast+'\">'+oLang.sLast+'</a>'\n\t\t\t\t);\n\t\t\t\tvar els = $('a', nPaging);\n\t\t\t\tvar nFirst = els[0],\n\t\t\t\t\tnPrev = els[1],\n\t\t\t\t\tnNext = els[2],\n\t\t\t\t\tnLast = els[3];\n\t\t\t\t\n\t\t\t\toSettings.oApi._fnBindAction( nFirst, {action: \"first\"}, fnClickHandler );\n\t\
t\t\toSettings.oApi._fnBindAction( nPrev, {action: \"previous\"}, fnClickHandler );\n\t\t\t\toSettings.oApi._fnBindAction( nNext, {action: \"next\"}, fnClickHandler );\n\t\t\t\toSettings.oApi._fnBindAction( nLast, {action: \"last\"}, fnClickHandler );\n\t\t\t\t\n\t\t\t\t/* ID the first elements only */\n\t\t\t\tif ( !oSettings.aanFeatures.p )\n\t\t\t\t{\n\t\t\t\t\tnPaging.id = oSettings.sTableId+'_paginate';\n\t\t\t\t\tnFirst.id =oSettings.sTableId+'_first';\n\t\t\t\t\tnPrev.id =oSettings.sTableId+'_previous';\n\t\t\t\t\tnNext.id =oSettings.sTableId+'_next';\n\t\t\t\t\tnLast.id =oSettings.sTableId+'_last';\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\t/*\n\t\t\t * Function: oPagination.full_numbers.fnUpdate\n\t\t\t * Purpose: Update the list of page buttons shows\n\t\t\t * Returns: -\n\t\t\t * Inputs: object:oSettings - dataTables settings object\n\t\t\t * function:fnCallbackDraw - draw function to call on page change\n\t\t\t */\n\t\t\t\"fnUpdate\": function ( oSettings, fnCallbackDraw )\n\t\t
\t{\n\t\t\t\tif ( !oSettings.aanFeatures.p )\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages;\n\t\t\t\tvar iPageCountHalf = Math.floor(iPageCount / 2);\n\t\t\t\tvar iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);\n\t\t\t\tvar iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;\n\t\t\t\tvar sList = \"\";\n\t\t\t\tvar iStartButton, iEndButton, i, iLen;\n\t\t\t\tvar oClasses = oSettings.oClasses;\n\t\t\t\tvar anButtons, anStatic, nPaginateList, nNode;\n\t\t\t\tvar an = oSettings.aanFeatures.p;\n\t\t\t\tvar fnBind = function (j) {\n\t\t\t\t\toSettings.oApi._fnBindAction( this, {\"page\": j+iStartButton-1}, function(e) {\n\t\t\t\t\t\t/* Use the information in the element to jump to the required page */\n\t\t\t\t\t\toSettings.oApi._fnPageChange( oSettings, e.data.page );\n\t\t\t\t\t\tfnCallbackDraw( oSettings );\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} );\n\t\t\t\t};\n\t
\t\t\t\n\t\t\t\t/* Pages calculation */\n\t\t\t\tif ( oSettings._iDisplayLength === -1 )\n\t\t\t\t{\n\t\t\t\t\tiStartButton = 1;\n\t\t\t\t\tiEndButton = 1;\n\t\t\t\t\tiCurrentPage = 1;\n\t\t\t\t}\n\t\t\t\telse if (iPages < iPageCount)\n\t\t\t\t{\n\t\t\t\t\tiStartButton = 1;\n\t\t\t\t\tiEndButton = iPages;\n\t\t\t\t}\n\t\t\t\telse if (iCurrentPage <= iPageCountHalf)\n\t\t\t\t{\n\t\t\t\t\tiStartButton = 1;\n\t\t\t\t\tiEndButton = iPageCount;\n\t\t\t\t}\n\t\t\t\telse if (iCurrentPage >= (iPages - iPageCountHalf))\n\t\t\t\t{\n\t\t\t\t\tiStartButton = iPages - iPageCount + 1;\n\t\t\t\t\tiEndButton = iPages;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tiStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;\n\t\t\t\t\tiEndButton = iStartButton + iPageCount - 1;\n\t\t\t\t}\n\t\n\t\t\t\t\n\t\t\t\t/* Build the dynamic list */\n\t\t\t\tfor ( i=iStartButton ; i<=iEndButton ; i++ )\n\t\t\t\t{\n\t\t\t\t\tsList += (iCurrentPage !== i) ?\n\t\t\t\t\t\t'<a tabindex=\"'+oSettings.iTabIndex+'\" class=\"'+oClasses.sPageB
utton+'\">'+oSettings.fnFormatNumber(i)+'</a>' :\n\t\t\t\t\t\t'<a tabindex=\"'+oSettings.iTabIndex+'\" class=\"'+oClasses.sPageButtonActive+'\">'+oSettings.fnFormatNumber(i)+'</a>';\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Loop over each instance of the pager */\n\t\t\t\tfor ( i=0, iLen=an.length ; i<iLen ; i++ )\n\t\t\t\t{\n\t\t\t\t\tnNode = an[i];\n\t\t\t\t\tif ( !nNode.hasChildNodes() )\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t/* Build up the dynamic list first - html and listeners */\n\t\t\t\t\t$('span:eq(0)', nNode)\n\t\t\t\t\t\t.html( sList )\n\t\t\t\t\t\t.children('a').each( fnBind );\n\t\t\t\t\t\n\t\t\t\t\t/* Update the permanent button's classes */\n\t\t\t\t\tanButtons = nNode.getElementsByTagName('a');\n\t\t\t\t\tanStatic = [\n\t\t\t\t\t\tanButtons[0], anButtons[1], \n\t\t\t\t\t\tanButtons[anButtons.length-2], anButtons[anButtons.length-1]\n\t\t\t\t\t];\n\t\n\t\t\t\t\t$(anStatic).removeClass( oClasses.sPageButton+\" \"+oClasses.sPageButtonActive+\" \"+oClasses.sPageButtonStat
icDisabled );\n\t\t\t\t\t$([anStatic[0], anStatic[1]]).addClass( \n\t\t\t\t\t\t(iCurrentPage==1) ?\n\t\t\t\t\t\t\toClasses.sPageButtonStaticDisabled :\n\t\t\t\t\t\t\toClasses.sPageButton\n\t\t\t\t\t);\n\t\t\t\t\t$([anStatic[2], anStatic[3]]).addClass(\n\t\t\t\t\t\t(iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?\n\t\t\t\t\t\t\toClasses.sPageButtonStaticDisabled :\n\t\t\t\t\t\t\toClasses.sPageButton\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} );\n\t\n\t$.extend( DataTable.ext.oSort, {\n\t\t/*\n\t\t * text sorting\n\t\t */\n\t\t\"string-pre\": function ( a )\n\t\t{\n\t\t\tif ( typeof a != 'string' ) {\n\t\t\t\ta = (a !== null && a.toString) ? a.toString() : '';\n\t\t\t}\n\t\t\treturn a.toLowerCase();\n\t\t},\n\t\n\t\t\"string-asc\": function ( x, y )\n\t\t{\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t},\n\t\t\n\t\t\"string-desc\": function ( x, y )\n\t\t{\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t},\n\t\t\n\t\t\n\t\t/*\n\t\t * html sorting (ignore html tags)\n
\t\t */\n\t\t\"html-pre\": function ( a )\n\t\t{\n\t\t\treturn a.replace( /<.*?>/g, \"\" ).toLowerCase();\n\t\t},\n\t\t\n\t\t\"html-asc\": function ( x, y )\n\t\t{\n\t\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t},\n\t\t\n\t\t\"html-desc\": function ( x, y )\n\t\t{\n\t\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t},\n\t\t\n\t\t\n\t\t/*\n\t\t * date sorting\n\t\t */\n\t\t\"date-pre\": function ( a )\n\t\t{\n\t\t\tvar x = Date.parse( a );\n\t\t\t\n\t\t\tif ( isNaN(x) || x===\"\" )\n\t\t\t{\n\t\t\t\tx = Date.parse( \"01/01/1970 00:00:00\" );\n\t\t\t}\n\t\t\treturn x;\n\t\t},\n\t\n\t\t\"date-asc\": function ( x, y )\n\t\t{\n\t\t\treturn x - y;\n\t\t},\n\t\t\n\t\t\"date-desc\": function ( x, y )\n\t\t{\n\t\t\treturn y - x;\n\t\t},\n\t\t\n\t\t\n\t\t/*\n\t\t * numerical sorting\n\t\t */\n\t\t\"numeric-pre\": function ( a )\n\t\t{\n\t\t\treturn (a==\"-\" || a===\"\") ? 0 : a*1;\n\t\t},\n\t\n\t\t\"numeric-asc\": function ( x, y )\n\t\t{\n\t\t\treturn x - y;\n\t\t},\n\t\t\n\t\t\"numeric-desc\": function (
x, y )\n\t\t{\n\t\t\treturn y - x;\n\t\t}\n\t} );\n\t\n\t\n\t$.extend( DataTable.ext.aTypes, [\n\t\t/*\n\t\t * Function: -\n\t\t * Purpose: Check to see if a string is numeric\n\t\t * Returns: string:'numeric' or null\n\t\t * Inputs: mixed:sText - string to check\n\t\t */\n\t\tfunction ( sData )\n\t\t{\n\t\t\t/* Allow zero length strings as a number */\n\t\t\tif ( typeof sData === 'number' )\n\t\t\t{\n\t\t\t\treturn 'numeric';\n\t\t\t}\n\t\t\telse if ( typeof sData !== 'string' )\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\tvar sValidFirstChars = \"0123456789-\";\n\t\t\tvar sValidChars = \"0123456789.\";\n\t\t\tvar Char;\n\t\t\tvar bDecimal = false;\n\t\t\t\n\t\t\t/* Check for a valid first char (no period and allow negatives) */\n\t\t\tChar = sData.charAt(0); \n\t\t\tif (sValidFirstChars.indexOf(Char) == -1) \n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\t/* Check all the other characters are valid */\n\t\t\tfor ( var i=1 ; i<sData.length ; i++ ) \n\t\t\t{\n\t\t\t\tChar = sData.charAt
(i); \n\t\t\t\tif (sValidChars.indexOf(Char) == -1) \n\t\t\t\t{\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* Only allowed one decimal place... */\n\t\t\t\tif ( Char == \".\" )\n\t\t\t\t{\n\t\t\t\t\tif ( bDecimal )\n\t\t\t\t\t{\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tbDecimal = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn 'numeric';\n\t\t},\n\t\t\n\t\t/*\n\t\t * Function: -\n\t\t * Purpose: Check to see if a string is actually a formatted date\n\t\t * Returns: string:'date' or null\n\t\t * Inputs: string:sText - string to check\n\t\t */\n\t\tfunction ( sData )\n\t\t{\n\t\t\tvar iParse = Date.parse(sData);\n\t\t\tif ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) )\n\t\t\t{\n\t\t\t\treturn 'date';\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t\n\t\t/*\n\t\t * Function: -\n\t\t * Purpose: Check to see if a string should be treated as an HTML string\n\t\t * Returns: string:'html' or null\n\t\t * Inputs: string:sText - string to check\n\t\t *
/\n\t\tfunction ( sData )\n\t\t{\n\t\t\tif ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )\n\t\t\t{\n\t\t\t\treturn 'html';\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t] );\n\t\n\n\t// jQuery aliases\n\t$.fn.DataTable = DataTable;\n\t$.fn.dataTable = DataTable;\n\t$.fn.dataTableSettings = DataTable.settings;\n\t$.fn.dataTableExt = DataTable.ext;\n\n\n\t// Information about events fired by DataTables - for documentation.\n\t/**\n\t * Draw event, fired whenever the table is redrawn on the page, at the same point as\n\t * fnDrawCallback. This may be useful for binding events or performing calculations when\n\t * the table is altered at all.\n\t * @name DataTable#draw\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Filter event, fired when the filtering applied to the table (using the build in global\n\t * global filter, or column filters) is altered.\n\t * @na
me DataTable#filter\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Page change event, fired when the paging of the table is altered.\n\t * @name DataTable#page\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * Sort event, fired when the sorting applied to the table is altered.\n\t * @name DataTable#sort\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n\n\t/**\n\t * DataTables initialisation complete event, fired when the table is fully drawn,\n\t * including Ajax data loaded, if Ajax data is required.\n\t * @name DataTable#init\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} oSettings DataTables settings object\n\t * @param {object} json
The JSON object request from the server - only\n\t * present if client-side Ajax sourced data is used</li></ol>\n\t */\n\n\t/**\n\t * State save event, fired when the table has changed state a new state save is required.\n\t * This method allows modification of the state saving object prior to actually doing the\n\t * save, including addition or other state properties (for plug-ins) or modification\n\t * of a DataTables core property.\n\t * @name DataTable#stateSaveParams\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} oSettings DataTables settings object\n\t * @param {object} json The state information to be saved\n\t */\n\n\t/**\n\t * State load event, fired when the table is loading state from the stored data, but\n\t * prior to the settings object being modified by the saved state - allowing modification\n\t * of the saved state is required or loading of state for a plug-in.\n\t * @name DataTable#stateLoadParams\n\t * @event\n\t * @param {event} e jQuery event ob
ject\n\t * @param {object} oSettings DataTables settings object\n\t * @param {object} json The saved state information\n\t */\n\n\t/**\n\t * State loaded event, fired when state has been loaded from stored data and the settings\n\t * object has been modified by the loaded data.\n\t * @name DataTable#stateLoaded\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} oSettings DataTables settings object\n\t * @param {object} json The saved state information\n\t */\n\n\t/**\n\t * Processing event, fired when DataTables is doing some kind of processing (be it,\n\t * sort, filter or anything else). Can be used to indicate to the end user that\n\t * there is something happening, or that something has finished.\n\t * @name DataTable#processing\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} oSettings DataTables settings object\n\t * @param {boolean} bShow Flag for if DataTables is doing processing or not\n\t */\n\n\t/**\n\t * Ajax (XHR) event, fired w
henever an Ajax request is completed from a request to \n\t * made to the server for new data (note that this trigger is called in fnServerData,\n\t * if you override fnServerData and which to use this event, you need to trigger it in\n\t * you success function).\n\t * @name DataTable#xhr\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t * @param {object} json JSON returned from the server\n\t */\n\n\t/**\n\t * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing\n\t * the bDestroy:true parameter in the initialisation object. This can be used to remove\n\t * bound events, added DOM nodes, etc.\n\t * @name DataTable#destroy\n\t * @event\n\t * @param {event} e jQuery event object\n\t * @param {object} o DataTables settings object {@link DataTable.models.oSettings}\n\t */\n}));\n\n}(window, document));\n\n"],"file":"jquery.dataTables.min.js"}