function _fnColumnOptions( oSettings, iCol, oOptions )
		{
			var oCol = oSettings.aoColumns[ iCol ];
			var oClasses = oSettings.oClasses;
			var th = $(oCol.nTh);
		
			// Try to get width information from the DOM. We can't get it from CSS
			// as we'd need to parse the CSS stylesheet. `width` option can override
			if ( ! oCol.sWidthOrig ) {
				// Width attribute
				oCol.sWidthOrig = th.attr('width') || null;
		
				// Style attribute
				var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
				if ( t ) {
					oCol.sWidthOrig = t[1];
				}
			}
		
			/* User specified column options */
			if ( oOptions !== undefined$1 && oOptions !== null )
			{
				// Backwards compatibility
				_fnCompatCols( oOptions );
		
				// Map camel case parameters to their Hungarian counterparts
				_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );
		
				/* Backwards compatibility for mDataProp */
				if ( oOptions.mDataProp !== undefined$1 && !oOptions.mData )
				{
					oOptions.mData = oOptions.mDataProp;
				}
		
				if ( oOptions.sType )
				{
					oCol._sManualType = oOptions.sType;
				}
		
				// `class` is a reserved word in Javascript, so we need to provide
				// the ability to use a valid name for the camel case input
				if ( oOptions.className && ! oOptions.sClass )
				{
					oOptions.sClass = oOptions.className;
				}
				if ( oOptions.sClass ) {
					th.addClass( oOptions.sClass );
				}
		
				$.extend( oCol, oOptions );
				_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
		
				/* iDataSort to be applied (backwards compatibility), but aDataSort will take
				 * priority if defined
				 */
				if ( oOptions.iDataSort !== undefined$1 )
				{
					oCol.aDataSort = [ oOptions.iDataSort ];
				}
				_fnMap( oCol, oOptions, "aDataSort" );
			}
		
			/* Cache the data get and set functions for speed */
			var mDataSrc = oCol.mData;
			var mData = _fnGetObjectDataFn( mDataSrc );
			var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
		
			var attrTest = function( src ) {
				return typeof src === 'string' && src.indexOf('@') !== -1;
			};
			oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
				attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
			);
			oCol._setter = null;
		
			oCol.fnGetData = function (rowData, type, meta) {
				var innerData = mData( rowData, type, undefined$1, meta );
		
				return mRender && type ?
					mRender( innerData, type, rowData, meta ) :
					innerData;
			};
			oCol.fnSetData = function ( rowData, val, meta ) {
				return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
			};
		
			// Indicate if DataTables should read DOM data as an object or array
			// Used in _fnGetRowElements
			if ( typeof mDataSrc !== 'number' ) {
				oSettings._rowReadObject = true;
			}
		
			/* Feature sorting overrides column specific when off */
			if ( !oSettings.oFeatures.bSort )
			{
				oCol.bSortable = false;
				th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
			}
		
			/* Check that the class assignment is correct for sorting */
			var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
			var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
			if ( !oCol.bSortable || (!bAsc && !bDesc) )
			{
				oCol.sSortingClass = oClasses.sSortableNone;
				oCol.sSortingClassJUI = "";
			}
			else if ( bAsc && !bDesc )
			{
				oCol.sSortingClass = oClasses.sSortableAsc;
				oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
			}
			else if ( !bAsc && bDesc )
			{
				oCol.sSortingClass = oClasses.sSortableDesc;
				oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
			}
			else
			{
				oCol.sSortingClass = oClasses.sSortable;
				oCol.sSortingClassJUI = oClasses.sSortJUI;
			}
		}
/**
		 * Apply options for a column
		 *  @param {object} oSettings dataTables settings object
		 *  @param {int} iCol column index to consider
		 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
		 *  @memberof DataTable#oApi
		 */
Apply options for a column
@param {object} oSettings dataTables settings object
@param {int} iCol column index to consider
@param {object} oOptions object with sType, bVisible and bSearchable etc
@memberof DataTable#oApi
Apply options for a column @param { object } oSettings dataTables settings object @param { int } iCol column index to consider @param { object } oOptions object with sType bVisible and bSearchable etc @memberof DataTable#oApi
function _fnColumnOptions( oSettings, iCol, oOptions )
		{
			var oCol = oSettings.aoColumns[ iCol ];
			var oClasses = oSettings.oClasses;
			var th = $(oCol.nTh);
			if ( ! oCol.sWidthOrig ) {
				oCol.sWidthOrig = th.attr('width') || null;
				var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
				if ( t ) {
					oCol.sWidthOrig = t[1];
				}
			}
			if ( oOptions !== undefined$1 && oOptions !== null )
			{
				_fnCompatCols( oOptions );
				_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );
				if ( oOptions.mDataProp !== undefined$1 && !oOptions.mData )
				{
					oOptions.mData = oOptions.mDataProp;
				}
				if ( oOptions.sType )
				{
					oCol._sManualType = oOptions.sType;
				}
				if ( oOptions.className && ! oOptions.sClass )
				{
					oOptions.sClass = oOptions.className;
				}
				if ( oOptions.sClass ) {
					th.addClass( oOptions.sClass );
				}
				$.extend( oCol, oOptions );
				_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
				if ( oOptions.iDataSort !== undefined$1 )
				{
					oCol.aDataSort = [ oOptions.iDataSort ];
				}
				_fnMap( oCol, oOptions, "aDataSort" );
			}
			var mDataSrc = oCol.mData;
			var mData = _fnGetObjectDataFn( mDataSrc );
			var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
			var attrTest = function( src ) {
				return typeof src === 'string' && src.indexOf('@') !== -1;
			};
			oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
				attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
			);
			oCol._setter = null;
			oCol.fnGetData = function (rowData, type, meta) {
				var innerData = mData( rowData, type, undefined$1, meta );
				return mRender && type ?
					mRender( innerData, type, rowData, meta ) :
					innerData;
			};
			oCol.fnSetData = function ( rowData, val, meta ) {
				return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
			};
			if ( typeof mDataSrc !== 'number' ) {
				oSettings._rowReadObject = true;
			}
			if ( !oSettings.oFeatures.bSort )
			{
				oCol.bSortable = false;
				th.addClass( oClasses.sSortableNone ); 
			}
			var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
			var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
			if ( !oCol.bSortable || (!bAsc && !bDesc) )
			{
				oCol.sSortingClass = oClasses.sSortableNone;
				oCol.sSortingClassJUI = "";
			}
			else if ( bAsc && !bDesc )
			{
				oCol.sSortingClass = oClasses.sSortableAsc;
				oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
			}
			else if ( !bAsc && bDesc )
			{
				oCol.sSortingClass = oClasses.sSortableDesc;
				oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
			}
			else
			{
				oCol.sSortingClass = oClasses.sSortable;
				oCol.sSortingClassJUI = oClasses.sSortJUI;
			}
		}
function _fnColumnOptions ( oSettings , iCol , oOptions ) { var oCol = oSettings . aoColumns [ iCol ] ; var oClasses = oSettings . oClasses ; var th = $ ( oCol . nTh ) ; if ( ! oCol . sWidthOrig ) { oCol . sWidthOrig = th . attr ( 'width' ) || null ; var t = ( th . attr ( 'style' ) || '' ) . match ( / width:\s*(\d+[pxem%]+) / ) ; if ( t ) { oCol . sWidthOrig = t [ 1 ] ; } } if ( oOptions !== undefined$1 && oOptions !== null ) { _fnCompatCols ( oOptions ) ; _fnCamelToHungarian ( DataTable . defaults . column , oOptions , true ) ; if ( oOptions . mDataProp !== undefined$1 && ! oOptions . mData ) { oOptions . mData = oOptions . mDataProp ; } if ( oOptions . sType ) { oCol . _sManualType = oOptions . sType ; } if ( oOptions . className && ! oOptions . sClass ) { oOptions . sClass = oOptions . className ; } if ( oOptions . sClass ) { th . addClass ( oOptions . sClass ) ; } $ . extend ( oCol , oOptions ) ; _fnMap ( oCol , oOptions , "sWidth" , "sWidthOrig" ) ; if ( oOptions . iDataSort !== undefined$1 ) { oCol . aDataSort = [ oOptions . iDataSort ] ; } _fnMap ( oCol , oOptions , "aDataSort" ) ; } var mDataSrc = oCol . mData ; var mData = _fnGetObjectDataFn ( mDataSrc ) ; var mRender = oCol . mRender ? _fnGetObjectDataFn ( oCol . mRender ) : null ; var attrTest = function ( src ) { return typeof src === 'string' && src . indexOf ( '@' ) !== - 1 ; } ; oCol . _bAttrSrc = $ . isPlainObject ( mDataSrc ) && ( attrTest ( mDataSrc . sort ) || attrTest ( mDataSrc . type ) || attrTest ( mDataSrc . filter ) ) ; oCol . _setter = null ; oCol . fnGetData = function ( rowData , type , meta ) { var innerData = mData ( rowData , type , undefined$1 , meta ) ; return mRender && type ? mRender ( innerData , type , rowData , meta ) : innerData ; } ; oCol . fnSetData = function ( rowData , val , meta ) { return _fnSetObjectDataFn ( mDataSrc ) ( rowData , val , meta ) ; } ; if ( typeof mDataSrc !== 'number' ) { oSettings . _rowReadObject = true ; } if ( ! oSettings . oFeatures . bSort ) { oCol . bSortable = false ; th . addClass ( oClasses . sSortableNone ) ; } var bAsc = $ . inArray ( 'asc' , oCol . asSorting ) !== - 1 ; var bDesc = $ . inArray ( 'desc' , oCol . asSorting ) !== - 1 ; if ( ! oCol . bSortable || ( ! bAsc && ! bDesc ) ) { oCol . sSortingClass = oClasses . sSortableNone ; oCol . sSortingClassJUI = "" ; } else if ( bAsc && ! bDesc ) { oCol . sSortingClass = oClasses . sSortableAsc ; oCol . sSortingClassJUI = oClasses . sSortJUIAscAllowed ; } else if ( ! bAsc && bDesc ) { oCol . sSortingClass = oClasses . sSortableDesc ; oCol . sSortingClassJUI = oClasses . sSortJUIDescAllowed ; } else { oCol . sSortingClass = oClasses . sSortable ; oCol . sSortingClassJUI = oClasses . sSortJUI ; } }
Apply options for a column
  @param {object} oSettings dataTables settings object
  @param {int} iCol column index to consider
  @param {object} oOptions object with sType, bVisible and bSearchable etc
  @memberof DataTable#oApi
Apply options for a column @param { object } oSettings dataTables settings object @param { int } iCol column index to consider @param { object } oOptions object with sType bVisible and bSearchable etc @memberof DataTable#oApi
// Try to get width information from the DOM. We can't get it from CSS // as we'd need to parse the CSS stylesheet. `width` option can override // Width attribute // Style attribute /* User specified column options */ // Backwards compatibility // Map camel case parameters to their Hungarian counterparts /* Backwards compatibility for mDataProp */ // `class` is a reserved word in Javascript, so we need to provide // the ability to use a valid name for the camel case input /* iDataSort to be applied (backwards compatibility), but aDataSort will take
				 * priority if defined
				 */ /* Cache the data get and set functions for speed */ // Indicate if DataTables should read DOM data as an object or array // Used in _fnGetRowElements /* Feature sorting overrides column specific when off */ // Have to add class here as order event isn't called /* Check that the class assignment is correct for sorting */