WP Google Maps - Version 5.05

Version Description

This is a must for users on IIS. Older WP Google Maps versions will not be compatible.

Download this release

Release Info

Developer WPGMaps
Plugin Icon 128x128 WP Google Maps
Version 5.05
Comparing to
See all releases

Code changes from version 5.04 to 5.05

js/jquery.dataTables.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * @summary DataTables
3
  * @description Paginate, search and sort HTML tables
4
- * @version 1.9.0
5
  * @file jquery.dataTables.js
6
  * @author Allan Jardine (www.sprymedia.co.uk)
7
  * @contact www.sprymedia.co.uk/contact
@@ -21,9 +21,28 @@
21
  */
22
 
23
  /*jslint evil: true, undef: true, browser: true */
24
- /*globals $, jQuery,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex*/
25
 
26
- (/** @lends <global> */function($, window, document, undefined) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  /**
28
  * DataTables is a plug-in for the jQuery Javascript library. It is a
29
  * highly flexible tool, based upon the foundations of progressive
@@ -76,7 +95,7 @@
76
  "nTh": nTh ? nTh : document.createElement('th'),
77
  "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
78
  "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
79
- "mDataProp": oDefaults.mDataProp ? oDefaults.oDefaults : iCol
80
  } );
81
  oSettings.aoColumns.push( oCol );
82
 
@@ -115,7 +134,7 @@
115
  * Apply options for a column
116
  * @param {object} oSettings dataTables settings object
117
  * @param {int} iCol column index to consider
118
- * @param {object} oOptions object with sType, bVisible and bSearchable
119
  * @memberof DataTable#oApi
120
  */
121
  function _fnColumnOptions( oSettings, iCol, oOptions )
@@ -125,6 +144,12 @@
125
  /* User specified column options */
126
  if ( oOptions !== undefined && oOptions !== null )
127
  {
 
 
 
 
 
 
128
  if ( oOptions.sType !== undefined )
129
  {
130
  oCol.sType = oOptions.sType;
@@ -145,8 +170,19 @@
145
  }
146
 
147
  /* Cache the data get and set functions for speed */
148
- oCol.fnGetData = _fnGetObjectDataFn( oCol.mDataProp );
149
- oCol.fnSetData = _fnSetObjectDataFn( oCol.mDataProp );
 
 
 
 
 
 
 
 
 
 
 
150
 
151
  /* Feature sorting overrides column specific when off */
152
  if ( !oSettings.oFeatures.bSort )
@@ -161,11 +197,10 @@
161
  oCol.sSortingClass = oSettings.oClasses.sSortableNone;
162
  oCol.sSortingClassJUI = "";
163
  }
164
- else if ( oCol.bSortable ||
165
- ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
166
  {
167
- oCol.sSortingClass = oSettings.oClasses.sSortable;
168
- oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
169
  }
170
  else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
171
  {
@@ -188,7 +223,7 @@
188
  */
189
  function _fnAdjustColumnSizing ( oSettings )
190
  {
191
- /* Not interested in doing column width calculation if autowidth is disabled */
192
  if ( oSettings.oFeatures.bAutoWidth === false )
193
  {
194
  return false;
@@ -212,22 +247,11 @@
212
  */
213
  function _fnVisibleToColumnIndex( oSettings, iMatch )
214
  {
215
- var iColumn = -1;
216
-
217
- for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
218
- {
219
- if ( oSettings.aoColumns[i].bVisible === true )
220
- {
221
- iColumn++;
222
- }
223
-
224
- if ( iColumn == iMatch )
225
- {
226
- return i;
227
- }
228
- }
229
-
230
- return null;
231
  }
232
 
233
 
@@ -241,41 +265,44 @@
241
  */
242
  function _fnColumnIndexToVisible( oSettings, iMatch )
243
  {
244
- var iVisible = -1;
245
- for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
246
- {
247
- if ( oSettings.aoColumns[i].bVisible === true )
248
- {
249
- iVisible++;
250
- }
251
-
252
- if ( i == iMatch )
253
- {
254
- return oSettings.aoColumns[i].bVisible === true ? iVisible : null;
255
- }
256
- }
257
-
258
- return null;
259
  }
260
 
261
 
262
  /**
263
  * Get the number of visible columns
 
264
  * @returns {int} i the number of visible columns
265
- * @param {object} oS dataTables settings object
266
  * @memberof DataTable#oApi
267
  */
268
- function _fnVisbleColumns( oS )
269
  {
270
- var iVis = 0;
271
- for ( var i=0 ; i<oS.aoColumns.length ; i++ )
272
- {
273
- if ( oS.aoColumns[i].bVisible === true )
274
- {
275
- iVis++;
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  }
277
- }
278
- return iVis;
 
279
  }
280
 
281
 
@@ -423,8 +450,6 @@
423
  }
424
  }
425
 
426
-
427
-
428
  /**
429
  * Add a data array to the table, creating DOM node etc. This is the parallel to
430
  * _fnGatherData, but for adding rows from a Javascript source, rather than a
@@ -445,9 +470,8 @@
445
 
446
  /* Create the object for storing information about this new row */
447
  var iRow = oSettings.aoData.length;
448
- var oData = $.extend( true, {}, DataTable.models.oRow, {
449
- "_aData": aDataIn
450
- } );
451
  oSettings.aoData.push( oData );
452
 
453
  /* Create the cells */
@@ -456,11 +480,15 @@
456
  {
457
  oCol = oSettings.aoColumns[i];
458
 
459
- /* Use rendered data for filtering/sorting */
460
- if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mDataProp !== null )
461
  {
462
  _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
463
  }
 
 
 
 
464
 
465
  /* See if we should auto-detect the column type */
466
  if ( oCol._bAutoType && oCol.sType != 'string' )
@@ -486,7 +514,7 @@
486
  /* Add to the display array */
487
  oSettings.aiDisplayMaster.push( iRow );
488
 
489
- /* Create the DOM imformation */
490
  if ( !oSettings.oFeatures.bDeferRender )
491
  {
492
  _fnCreateTr( oSettings, iRow );
@@ -504,7 +532,7 @@
504
  function _fnGatherData( oSettings )
505
  {
506
  var iLoop, i, iLen, j, jLen, jInner,
507
- nTds, nTrs, nTd, aLocalData, iThisIndex,
508
  iRow, iRows, iColumn, iColumns, sNodeName,
509
  oCol, oData;
510
 
@@ -515,31 +543,32 @@
515
  */
516
  if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
517
  {
518
- nTrs = oSettings.nTBody.childNodes;
519
- for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
520
  {
521
- if ( nTrs[i].nodeName.toUpperCase() == "TR" )
522
  {
523
  iThisIndex = oSettings.aoData.length;
524
- nTrs[i]._DT_RowIndex = iThisIndex;
525
  oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
526
- "nTr": nTrs[i]
527
  } ) );
528
-
529
  oSettings.aiDisplayMaster.push( iThisIndex );
530
- nTds = nTrs[i].childNodes;
531
  jInner = 0;
532
-
533
- for ( j=0, jLen=nTds.length ; j<jLen ; j++ )
534
  {
535
- sNodeName = nTds[j].nodeName.toUpperCase();
536
  if ( sNodeName == "TD" || sNodeName == "TH" )
537
  {
538
- _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTds[j].innerHTML) );
539
  jInner++;
540
  }
 
541
  }
542
  }
 
543
  }
544
  }
545
 
@@ -551,14 +580,15 @@
551
  nTds = [];
552
  for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
553
  {
554
- for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ )
 
555
  {
556
- nTd = nTrs[i].childNodes[j];
557
  sNodeName = nTd.nodeName.toUpperCase();
558
  if ( sNodeName == "TD" || sNodeName == "TH" )
559
  {
560
  nTds.push( nTd );
561
  }
 
562
  }
563
  }
564
 
@@ -608,8 +638,16 @@
608
  }
609
  }
610
 
611
- if ( typeof oCol.mDataProp === 'function' )
 
 
 
 
 
612
  {
 
 
 
613
  nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
614
  }
615
 
@@ -620,7 +658,7 @@
620
  nCell.innerHTML = sRendered;
621
  if ( oCol.bUseRendered )
622
  {
623
- /* Use the rendered data for filtering/sorting */
624
  _fnSetCellData( oSettings, iRow, iColumn, sRendered );
625
  }
626
  }
@@ -631,7 +669,7 @@
631
  nCell.className += ' '+oCol.sClass;
632
  }
633
 
634
- /* Column visability */
635
  if ( !bVisible )
636
  {
637
  oData._anHidden[iColumn] = nCell;
@@ -705,15 +743,16 @@
705
  * @param {object} oSettings dataTables settings object
706
  * @param {int} iRow aoData row id
707
  * @param {string} sSpecific data get type ('type' 'filter' 'sort')
 
708
  * @returns {array} Data array
709
  * @memberof DataTable#oApi
710
  */
711
- function _fnGetRowData( oSettings, iRow, sSpecific )
712
  {
713
  var out = [];
714
- for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
715
  {
716
- out.push( _fnGetCellData( oSettings, iRow, i, sSpecific ) );
717
  }
718
  return out;
719
  }
@@ -738,8 +777,9 @@
738
  {
739
  if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
740
  {
741
- _fnLog( oSettings, 0, "Requested unknown parameter '"+oCol.mDataProp+
742
- "' from the data source for row "+iRow );
 
743
  oSettings.iDrawError = oSettings.iDraw;
744
  }
745
  return oCol.sDefaultContent;
@@ -781,6 +821,9 @@
781
  }
782
 
783
 
 
 
 
784
  /**
785
  * Return a function that can be used to get data from a source object, taking
786
  * into account the ability to use nested objects as a source
@@ -799,30 +842,71 @@
799
  }
800
  else if ( typeof mSource === 'function' )
801
  {
802
- return function (data, type) {
803
- return mSource( data, type );
804
  };
805
  }
806
- else if ( typeof mSource === 'string' && mSource.indexOf('.') != -1 )
807
  {
808
  /* If there is a . in the source string then the data source is in a
809
  * nested object so we loop over the data for each level to get the next
810
- * level down. On each loop we test for undefined, and if found immediatly
811
  * return. This allows entire objects to be missing and sDefaultContent to
812
  * be used if defined, rather than throwing an error
813
  */
814
- var a = mSource.split('.');
815
- return function (data, type) {
816
- for ( var i=0, iLen=a.length ; i<iLen ; i++ )
 
 
817
  {
818
- data = data[ a[i] ];
819
- if ( data === undefined )
820
  {
821
- return undefined;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
822
  }
823
  }
 
824
  return data;
825
  };
 
 
 
 
826
  }
827
  else
828
  {
@@ -854,16 +938,57 @@
854
  mSource( data, 'set', val );
855
  };
856
  }
857
- else if ( typeof mSource === 'string' && mSource.indexOf('.') != -1 )
858
  {
859
- /* Like the get, we need to get data from a nested object. */
860
- var a = mSource.split('.');
861
- return function (data, val) {
 
 
862
  for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
863
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
864
  data = data[ a[i] ];
865
  }
866
- data[ a[a.length-1] ] = val;
 
 
 
 
 
 
 
867
  };
868
  }
869
  else
@@ -956,11 +1081,9 @@
956
  "iDataColumn": iCol,
957
  "oSettings": oSettings,
958
  "aData": oSettings.aoData[iRow]._aData,
959
- "mDataProp": oCol.mDataProp
960
  }, _fnGetCellData(oSettings, iRow, iCol, 'display') );
961
  }
962
-
963
-
964
  /**
965
  * Create a new TR element (and it's TD children) for a row
966
  * @param {object} oSettings dataTables settings object
@@ -989,19 +1112,19 @@
989
 
990
  if ( oData._aData.DT_RowClass )
991
  {
992
- $(oData.nTr).addClass( oData._aData.DT_RowClass );
993
  }
994
 
995
  /* Process each column */
996
  for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
997
  {
998
  var oCol = oSettings.aoColumns[i];
999
- nTd = document.createElement('td');
1000
 
1001
  /* Render if needed - if bUseRendered is true then we already have the rendered
1002
  * value in the data source - so can just use that
1003
  */
1004
- nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mDataProp === null)) ?
1005
  _fnRender( oSettings, iRow, i ) :
1006
  _fnGetCellData( oSettings, iRow, i, 'display' );
1007
 
@@ -1042,7 +1165,7 @@
1042
  function _fnBuildHead( oSettings )
1043
  {
1044
  var i, nTh, iLen, j, jLen;
1045
- var iThs = oSettings.nTHead.getElementsByTagName('th').length;
1046
  var iCorrector = 0;
1047
  var jqChildren;
1048
 
@@ -1262,19 +1385,20 @@
1262
  */
1263
  function _fnDraw( oSettings )
1264
  {
1265
- var i, iLen, n;
1266
- var anRows = [];
1267
- var iRowCount = 0;
1268
- var iStripes = oSettings.asStripeClasses.length;
1269
- var iOpenRows = oSettings.aoOpenRows.length;
1270
-
1271
  /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
1272
  var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
1273
  if ( $.inArray( false, aPreDraw ) !== -1 )
1274
  {
 
1275
  return;
1276
  }
1277
 
 
 
 
 
 
 
1278
  oSettings.bDrawing = true;
1279
 
1280
  /* Check and see if we have an initial draw position from state saving */
@@ -1340,7 +1464,7 @@
1340
  }
1341
  }
1342
 
1343
- /* Row callback functions - might want to manipule the row */
1344
  _fnCallbackFire( oSettings, 'aoRowCallback', null,
1345
  [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
1346
 
@@ -1371,22 +1495,22 @@
1371
  anRows[ 0 ].className = oSettings.asStripeClasses[0];
1372
  }
1373
 
1374
- var sZero = oSettings.oLanguage.sZeroRecords.replace(
1375
- '_MAX_', oSettings.fnFormatNumber(oSettings.fnRecordsTotal()) );
1376
  if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
1377
  {
1378
- sZero = oSettings.oLanguage.sLoadingRecords;
1379
  }
1380
- else if ( oSettings.oLanguage.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
1381
  {
1382
- sZero = oSettings.oLanguage.sEmptyTable;
1383
  }
1384
 
1385
  var nTd = document.createElement( 'td' );
1386
  nTd.setAttribute( 'valign', "top" );
1387
  nTd.colSpan = _fnVisbleColumns( oSettings );
1388
  nTd.className = oSettings.oClasses.sRowEmpty;
1389
- nTd.innerHTML = sZero;
1390
 
1391
  anRows[ iRowCount ].appendChild( nTd );
1392
  }
@@ -1533,11 +1657,11 @@
1533
  /* Replace jQuery UI constants */
1534
  if ( sAttr == "H" )
1535
  {
1536
- sAttr = "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix";
1537
  }
1538
  else if ( sAttr == "F" )
1539
  {
1540
- sAttr = "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix";
1541
  }
1542
 
1543
  /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
@@ -1652,10 +1776,12 @@
1652
  function _fnDetectHeader ( aLayout, nThead )
1653
  {
1654
  var nTrs = $(nThead).children('tr');
1655
- var nCell;
1656
- var i, j, k, l, iLen, jLen, iColShifted;
 
1657
  var fnShiftCol = function ( a, i, j ) {
1658
- while ( a[i][j] ) {
 
1659
  j++;
1660
  }
1661
  return j;
@@ -1672,19 +1798,18 @@
1672
  /* Calculate a layout array */
1673
  for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
1674
  {
1675
- var iColumn = 0;
 
1676
 
1677
  /* For every cell in the row... */
1678
- for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ )
1679
- {
1680
- nCell = nTrs[i].childNodes[j];
1681
-
1682
  if ( nCell.nodeName.toUpperCase() == "TD" ||
1683
  nCell.nodeName.toUpperCase() == "TH" )
1684
  {
1685
  /* Get the col and rowspan attributes from the DOM and sanitise them */
1686
- var iColspan = nCell.getAttribute('colspan') * 1;
1687
- var iRowspan = nCell.getAttribute('rowspan') * 1;
1688
  iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
1689
  iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
1690
 
@@ -1693,6 +1818,9 @@
1693
  */
1694
  iColShifted = fnShiftCol( aLayout, i, iColumn );
1695
 
 
 
 
1696
  /* If there is col / rowspan, copy the information into the layout grid */
1697
  for ( l=0 ; l<iColspan ; l++ )
1698
  {
@@ -1700,12 +1828,13 @@
1700
  {
1701
  aLayout[i+k][iColShifted+l] = {
1702
  "cell": nCell,
1703
- "unique": iColspan == 1 ? true : false
1704
  };
1705
- aLayout[i+k].nTr = nTrs[i];
1706
  }
1707
  }
1708
  }
 
1709
  }
1710
  }
1711
  }
@@ -1716,7 +1845,7 @@
1716
  * @param {object} oSettings dataTables settings object
1717
  * @param {node} nHeader automatically detect the layout from this node - optional
1718
  * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
1719
- * @returns array {node} aReturn list of unique ths
1720
  * @memberof DataTable#oApi
1721
  */
1722
  function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
@@ -1787,8 +1916,8 @@
1787
  function _fnAjaxParameters( oSettings )
1788
  {
1789
  var iColumns = oSettings.aoColumns.length;
1790
- var aoData = [], mDataProp;
1791
- var i;
1792
 
1793
  aoData.push( { "name": "sEcho", "value": oSettings.iDraw } );
1794
  aoData.push( { "name": "iColumns", "value": iColumns } );
@@ -1799,7 +1928,7 @@
1799
 
1800
  for ( i=0 ; i<iColumns ; i++ )
1801
  {
1802
- mDataProp = oSettings.aoColumns[i].mDataProp;
1803
  aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
1804
  }
1805
 
@@ -1819,20 +1948,24 @@
1819
  /* Sorting */
1820
  if ( oSettings.oFeatures.bSort !== false )
1821
  {
1822
- var iFixed = oSettings.aaSortingFixed !== null ? oSettings.aaSortingFixed.length : 0;
1823
- var iUser = oSettings.aaSorting.length;
1824
- aoData.push( { "name": "iSortingCols", "value": iFixed+iUser } );
1825
- for ( i=0 ; i<iFixed ; i++ )
1826
- {
1827
- aoData.push( { "name": "iSortCol_"+i, "value": oSettings.aaSortingFixed[i][0] } );
1828
- aoData.push( { "name": "sSortDir_"+i, "value": oSettings.aaSortingFixed[i][1] } );
1829
- }
1830
 
1831
- for ( i=0 ; i<iUser ; i++ )
1832
  {
1833
- aoData.push( { "name": "iSortCol_"+(i+iFixed), "value": oSettings.aaSorting[i][0] } );
1834
- aoData.push( { "name": "sSortDir_"+(i+iFixed), "value": oSettings.aaSorting[i][1] } );
 
 
 
 
 
 
1835
  }
 
1836
 
1837
  for ( i=0 ; i<iColumns ; i++ )
1838
  {
@@ -1845,7 +1978,7 @@
1845
 
1846
 
1847
  /**
1848
- * Add Ajax parameters from plugins
1849
  * @param {object} oSettings dataTables settings object
1850
  * @param array {objects} aoData name/value pairs to send to the server
1851
  * @memberof DataTable#oApi
@@ -1872,7 +2005,7 @@
1872
  if ( json.sEcho !== undefined )
1873
  {
1874
  /* Protect against old returns over-writing a new one. Possible when you get
1875
- * very fast interaction, and later queires are completed much faster
1876
  */
1877
  if ( json.sEcho*1 < oSettings.iDraw )
1878
  {
@@ -1953,24 +2086,31 @@
1953
  nFilter.id = oSettings.sTableId+'_filter';
1954
  }
1955
 
1956
- var jqFilter = $("input", nFilter);
 
 
 
 
 
1957
  jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
1958
  jqFilter.bind( 'keyup.DT', function(e) {
1959
  /* Update all other filter input elements for the new display */
1960
  var n = oSettings.aanFeatures.f;
 
 
1961
  for ( var i=0, iLen=n.length ; i<iLen ; i++ )
1962
  {
1963
  if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
1964
  {
1965
- $('input', n[i]).val( this.value );
1966
  }
1967
  }
1968
 
1969
  /* Now do the filter */
1970
- if ( this.value != oPreviousSearch.sSearch )
1971
  {
1972
  _fnFilterComplete( oSettings, {
1973
- "sSearch": this.value,
1974
  "bRegex": oPreviousSearch.bRegex,
1975
  "bSmart": oPreviousSearch.bSmart ,
1976
  "bCaseInsensitive": oPreviousSearch.bCaseInsensitive
@@ -2056,15 +2196,22 @@
2056
  function _fnFilterCustom( oSettings )
2057
  {
2058
  var afnFilters = DataTable.ext.afnFiltering;
 
 
2059
  for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
2060
  {
2061
  var iCorrector = 0;
2062
  for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
2063
  {
2064
  var iDisIndex = oSettings.aiDisplay[j-iCorrector];
 
 
 
 
 
2065
 
2066
  /* Check if we should use this row based on the filtering function */
2067
- if ( !afnFilters[i]( oSettings, _fnGetRowData( oSettings, iDisIndex, 'filter' ), iDisIndex ) )
2068
  {
2069
  oSettings.aiDisplay.splice( j-iCorrector, 1 );
2070
  iCorrector++;
@@ -2203,15 +2350,19 @@
2203
  if ( !oSettings.oFeatures.bServerSide )
2204
  {
2205
  /* Clear out the old data */
2206
- oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length );
2207
-
2208
- var aArray = (iMaster && iMaster===1) ?
2209
- oSettings.aiDisplayMaster : oSettings.aiDisplay;
 
 
2210
 
2211
- for ( var i=0, iLen=aArray.length ; i<iLen ; i++ )
2212
  {
2213
- oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings,
2214
- _fnGetRowData( oSettings, aArray[i], 'filter' ) );
 
 
2215
  }
2216
  }
2217
  }
@@ -2225,33 +2376,16 @@
2225
  */
2226
  function _fnBuildSearchRow( oSettings, aData )
2227
  {
2228
- var sSearch = '';
2229
- if ( oSettings.__nTmpFilter === undefined )
2230
- {
2231
- oSettings.__nTmpFilter = document.createElement('div');
2232
- }
2233
- var nTmp = oSettings.__nTmpFilter;
2234
-
2235
- for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
2236
- {
2237
- if ( oSettings.aoColumns[j].bSearchable )
2238
- {
2239
- var sData = aData[j];
2240
- sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' ';
2241
- }
2242
- }
2243
 
2244
  /* If it looks like there is an HTML entity in the string, attempt to decode it */
2245
  if ( sSearch.indexOf('&') !== -1 )
2246
  {
2247
- nTmp.innerHTML = sSearch;
2248
- sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
2249
-
2250
- /* IE and Opera appear to put an newline where there is a <br> tag - remove it */
2251
- sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,"");
2252
  }
2253
 
2254
- return sSearch;
 
2255
  }
2256
 
2257
  /**
@@ -2259,7 +2393,7 @@
2259
  * @param {string} sSearch string to search for
2260
  * @param {bool} bRegex treat as a regular expression or not
2261
  * @param {bool} bSmart perform smart filtering or not
2262
- * @param {bool} bCaseInsensitive Do case insenstive matching or not
2263
  * @returns {RegExp} constructed object
2264
  * @memberof DataTable#oApi
2265
  */
@@ -2297,6 +2431,10 @@
2297
  {
2298
  return DataTable.ext.ofnSearch[sType]( sData );
2299
  }
 
 
 
 
2300
  else if ( sType == "html" )
2301
  {
2302
  return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
@@ -2305,29 +2443,24 @@
2305
  {
2306
  return sData.replace(/[\r\n]/g," ");
2307
  }
2308
- else if ( sData === null )
2309
- {
2310
- return '';
2311
- }
2312
  return sData;
2313
  }
2314
 
2315
 
2316
  /**
2317
- * scape a string stuch that it can be used in a regular expression
2318
  * @param {string} sVal string to escape
2319
  * @returns {string} escaped string
2320
  * @memberof DataTable#oApi
2321
  */
2322
  function _fnEscapeRegex ( sVal )
2323
  {
2324
- var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^' ];
2325
  var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
2326
  return sVal.replace(reReplace, '\\$1');
2327
  }
2328
 
2329
 
2330
-
2331
  /**
2332
  * Generate the node required for the info display
2333
  * @param {object} oSettings dataTables settings object
@@ -2371,57 +2504,36 @@
2371
  }
2372
 
2373
  var
2374
- iStart = oSettings._iDisplayStart+1, iEnd = oSettings.fnDisplayEnd(),
2375
- iMax = oSettings.fnRecordsTotal(), iTotal = oSettings.fnRecordsDisplay(),
2376
- sStart = oSettings.fnFormatNumber( iStart ), sEnd = oSettings.fnFormatNumber( iEnd ),
2377
- sMax = oSettings.fnFormatNumber( iMax ), sTotal = oSettings.fnFormatNumber( iTotal ),
 
2378
  sOut;
2379
 
2380
- /* When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
2381
- * internally
2382
- */
2383
- if ( oSettings.oScroll.bInfinite )
2384
- {
2385
- sStart = oSettings.fnFormatNumber( 1 );
2386
- }
2387
-
2388
- if ( oSettings.fnRecordsDisplay() === 0 &&
2389
- oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
2390
  {
2391
  /* Empty record set */
2392
- sOut = oSettings.oLanguage.sInfoEmpty+ oSettings.oLanguage.sInfoPostFix;
2393
  }
2394
- else if ( oSettings.fnRecordsDisplay() === 0 )
2395
- {
2396
- /* Rmpty record set after filtering */
2397
- sOut = oSettings.oLanguage.sInfoEmpty +' '+
2398
- oSettings.oLanguage.sInfoFiltered.replace('_MAX_', sMax)+
2399
- oSettings.oLanguage.sInfoPostFix;
2400
- }
2401
- else if ( oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
2402
- {
2403
  /* Normal record set */
2404
- sOut = oSettings.oLanguage.sInfo.
2405
- replace('_START_', sStart).
2406
- replace('_END_', sEnd).
2407
- replace('_TOTAL_', sTotal)+
2408
- oSettings.oLanguage.sInfoPostFix;
2409
  }
2410
- else
 
2411
  {
2412
  /* Record set after filtering */
2413
- sOut = oSettings.oLanguage.sInfo.
2414
- replace('_START_', sStart).
2415
- replace('_END_', sEnd).
2416
- replace('_TOTAL_', sTotal) +' '+
2417
- oSettings.oLanguage.sInfoFiltered.replace('_MAX_',
2418
- oSettings.fnFormatNumber(oSettings.fnRecordsTotal()))+
2419
- oSettings.oLanguage.sInfoPostFix;
2420
  }
 
 
 
 
2421
 
2422
- if ( oSettings.oLanguage.fnInfoCallback !== null )
2423
  {
2424
- sOut = oSettings.oLanguage.fnInfoCallback.call( oSettings.oInstance,
2425
  oSettings, iStart, iEnd, iMax, iTotal, sOut );
2426
  }
2427
 
@@ -2433,6 +2545,33 @@
2433
  }
2434
 
2435
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2436
 
2437
  /**
2438
  * Draw the table for the first time, adding all required features
@@ -2566,16 +2705,20 @@
2566
  */
2567
  function _fnLanguageCompat( oLanguage )
2568
  {
 
 
2569
  /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
2570
  * sZeroRecords - assuming that is given.
2571
  */
2572
- if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords )
 
2573
  {
2574
  _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
2575
  }
2576
 
2577
  /* Likewise with loading records */
2578
- if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords )
 
2579
  {
2580
  _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
2581
  }
@@ -2676,7 +2819,7 @@
2676
 
2677
 
2678
  /**
2679
- * Rcalculate the end point based on the start point
2680
  * @param {object} oSettings dataTables settings object
2681
  * @memberof DataTable#oApi
2682
  */
@@ -2780,7 +2923,7 @@
2780
  oSettings._iDisplayStart - oSettings._iDisplayLength :
2781
  0;
2782
 
2783
- /* Correct for underrun */
2784
  if ( oSettings._iDisplayStart < 0 )
2785
  {
2786
  oSettings._iDisplayStart = 0;
@@ -2866,8 +3009,6 @@
2866
  $(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
2867
  }
2868
 
2869
-
2870
-
2871
  /**
2872
  * Add any control elements for the table - specifically scrolling
2873
  * @param {object} oSettings dataTables settings object
@@ -2944,7 +3085,8 @@
2944
  nScrollHead.style.border = "0";
2945
  nScrollHead.style.width = "100%";
2946
  nScrollFoot.style.border = "0";
2947
- nScrollHeadInner.style.width = "150%"; /* will be overwritten */
 
2948
 
2949
  /* Modify attributes to respect the clones */
2950
  nScrollHeadTable.removeAttribute('id');
@@ -2956,17 +3098,26 @@
2956
  nScrollFootTable.style.marginLeft = "0";
2957
  }
2958
 
2959
- /* Move any caption elements from the body to the header */
2960
- var nCaptions = $(oSettings.nTable).children('caption');
2961
- for ( var i=0, iLen=nCaptions.length ; i<iLen ; i++ )
 
2962
  {
2963
- nScrollHeadTable.appendChild( nCaptions[i] );
 
 
 
 
 
 
 
 
2964
  }
2965
 
2966
  /*
2967
  * Sizing
2968
  */
2969
- /* When xscrolling add the width and a scroller to move the header with the body */
2970
  if ( oSettings.oScroll.sX !== "" )
2971
  {
2972
  nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
@@ -3048,41 +3199,39 @@
3048
  nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
3049
  nScrollBody = o.nTable.parentNode,
3050
  i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
3051
- iWidth, aApplied=[], iSanityWidth,
 
3052
  nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
3053
  nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
3054
- ie67 = $.browser.msie && $.browser.version <= 7;
 
 
 
 
 
 
 
 
3055
 
3056
  /*
3057
  * 1. Re-create the table inside the scrolling div
3058
  */
3059
 
3060
  /* Remove the old minimised thead and tfoot elements in the inner table */
3061
- var nTheadSize = o.nTable.getElementsByTagName('thead');
3062
- if ( nTheadSize.length > 0 )
3063
- {
3064
- o.nTable.removeChild( nTheadSize[0] );
3065
- }
3066
-
3067
- var nTfootSize;
3068
- if ( o.nTFoot !== null )
3069
- {
3070
- /* Remove the old minimised footer element in the cloned header */
3071
- nTfootSize = o.nTable.getElementsByTagName('tfoot');
3072
- if ( nTfootSize.length > 0 )
3073
- {
3074
- o.nTable.removeChild( nTfootSize[0] );
3075
- }
3076
- }
3077
-
3078
  /* Clone the current header and footer elements and then place it into the inner table */
3079
- nTheadSize = o.nTHead.cloneNode(true);
3080
  o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
 
 
3081
 
3082
  if ( o.nTFoot !== null )
3083
  {
3084
- nTfootSize = o.nTFoot.cloneNode(true);
3085
  o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
 
 
3086
  }
3087
 
3088
  /*
@@ -3091,7 +3240,7 @@
3091
 
3092
  /* Remove old sizing and apply the calculated column widths
3093
  * Get the unique column headers in the newly created (cloned) header. We want to apply the
3094
- * calclated sizes to this header
3095
  */
3096
  if ( o.oScroll.sX === "" )
3097
  {
@@ -3110,7 +3259,15 @@
3110
  {
3111
  _fnApplyToChildren( function(n) {
3112
  n.style.width = "";
3113
- }, nTfootSize.getElementsByTagName('tr') );
 
 
 
 
 
 
 
 
3114
  }
3115
 
3116
  /* Size the table as a whole */
@@ -3127,7 +3284,7 @@
3127
  if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight ||
3128
  $(nScrollBody).css('overflow-y') == "scroll") )
3129
  {
3130
- o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth()-o.oScroll.iBarWidth );
3131
  }
3132
  }
3133
  else
@@ -3164,41 +3321,38 @@
3164
  /* We want the hidden header to have zero height, so remove padding and borders. Then
3165
  * set the width based on the real headers
3166
  */
3167
- anHeadToSize = o.nTHead.getElementsByTagName('tr');
3168
- anHeadSizers = nTheadSize.getElementsByTagName('tr');
3169
 
3170
- _fnApplyToChildren( function(nSizer, nToSize) {
3171
- oStyle = nSizer.style;
3172
- oStyle.paddingTop = "0";
3173
- oStyle.paddingBottom = "0";
3174
- oStyle.borderTopWidth = "0";
3175
- oStyle.borderBottomWidth = "0";
3176
- oStyle.height = 0;
3177
-
3178
- iWidth = $(nSizer).width();
3179
- nToSize.style.width = _fnStringToCss( iWidth );
3180
- aApplied.push( iWidth );
3181
- }, anHeadSizers, anHeadToSize );
 
 
 
 
3182
  $(anHeadSizers).height(0);
3183
 
 
3184
  if ( o.nTFoot !== null )
3185
  {
3186
- /* Clone the current footer and then place it into the body table as a "hidden header" */
3187
- anFootSizers = nTfootSize.getElementsByTagName('tr');
3188
- anFootToSize = o.nTFoot.getElementsByTagName('tr');
3189
-
3190
- _fnApplyToChildren( function(nSizer, nToSize) {
3191
- oStyle = nSizer.style;
3192
- oStyle.paddingTop = "0";
3193
- oStyle.paddingBottom = "0";
3194
- oStyle.borderTopWidth = "0";
3195
- oStyle.borderBottomWidth = "0";
3196
- oStyle.height = 0;
3197
-
3198
- iWidth = $(nSizer).width();
3199
- nToSize.style.width = _fnStringToCss( iWidth );
3200
- aApplied.push( iWidth );
3201
- }, anFootSizers, anFootToSize );
3202
  $(anFootSizers).height(0);
3203
  }
3204
 
@@ -3209,16 +3363,16 @@
3209
  /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
3210
  * to what they currently are
3211
  */
3212
- _fnApplyToChildren( function(nSizer) {
3213
  nSizer.innerHTML = "";
3214
- nSizer.style.width = _fnStringToCss( aApplied.shift() );
3215
  }, anHeadSizers );
3216
 
3217
  if ( o.nTFoot !== null )
3218
  {
3219
- _fnApplyToChildren( function(nSizer) {
3220
  nSizer.innerHTML = "";
3221
- nSizer.style.width = _fnStringToCss( aApplied.shift() );
3222
  }, anFootSizers );
3223
  }
3224
 
@@ -3241,11 +3395,11 @@
3241
 
3242
  /* Apply the calculated minimum width to the table wrappers */
3243
  nScrollBody.style.width = _fnStringToCss( iCorrection );
3244
- nScrollHeadInner.parentNode.style.width = _fnStringToCss( iCorrection );
3245
 
3246
  if ( o.nTFoot !== null )
3247
  {
3248
- nScrollFootInner.parentNode.style.width = _fnStringToCss( iCorrection );
3249
  }
3250
 
3251
  /* And give the user a warning that we've stopped the table getting too small */
@@ -3264,11 +3418,11 @@
3264
  else
3265
  {
3266
  nScrollBody.style.width = _fnStringToCss( '100%' );
3267
- nScrollHeadInner.parentNode.style.width = _fnStringToCss( '100%' );
3268
 
3269
  if ( o.nTFoot !== null )
3270
  {
3271
- nScrollFootInner.parentNode.style.width = _fnStringToCss( '100%' );
3272
  }
3273
  }
3274
 
@@ -3296,7 +3450,7 @@
3296
  o.oScroll.iBarWidth : 0;
3297
  if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
3298
  {
3299
- nScrollBody.style.height = _fnStringToCss( $(o.nTable).height()+iExtra );
3300
  }
3301
  }
3302
 
@@ -3304,12 +3458,21 @@
3304
  var iOuterWidth = $(o.nTable).outerWidth();
3305
  nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
3306
  nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
 
 
 
 
 
3307
 
3308
  if ( o.nTFoot !== null )
3309
  {
3310
- nScrollFootInner.style.width = _fnStringToCss( o.nTable.offsetWidth );
3311
- nScrollFootTable.style.width = _fnStringToCss( o.nTable.offsetWidth );
 
3312
  }
 
 
 
3313
 
3314
  /* If sorting or filtering has occurred, jump the scrolling back to the top */
3315
  if ( o.bSorted || o.bFiltered )
@@ -3329,27 +3492,34 @@
3329
  */
3330
  function _fnApplyToChildren( fn, an1, an2 )
3331
  {
3332
- for ( var i=0, iLen=an1.length ; i<iLen ; i++ )
 
 
 
3333
  {
3334
- for ( var j=0, jLen=an1[i].childNodes.length ; j<jLen ; j++ )
 
 
3335
  {
3336
- if ( an1[i].childNodes[j].nodeType == 1 )
3337
  {
3338
  if ( an2 )
3339
  {
3340
- fn( an1[i].childNodes[j], an2[i].childNodes[j] );
3341
  }
3342
  else
3343
  {
3344
- fn( an1[i].childNodes[j] );
3345
  }
 
3346
  }
 
 
3347
  }
 
3348
  }
3349
  }
3350
 
3351
-
3352
-
3353
  /**
3354
  * Convert a CSS unit width to pixels (e.g. 2em)
3355
  * @param {string} sWidth width to be converted
@@ -3366,7 +3536,7 @@
3366
 
3367
  if ( !nParent )
3368
  {
3369
- nParent = document.getElementsByTagName('body')[0];
3370
  }
3371
 
3372
  var iWidth;
@@ -3396,6 +3566,7 @@
3396
  var i, iIndex, iCorrector, iWidth;
3397
  var oHeaders = $('th', oSettings.nTHead);
3398
  var widthAttr = oSettings.nTable.getAttribute('width');
 
3399
 
3400
  /* Convert any user input sizes into pixel sizes */
3401
  for ( i=0 ; i<iColums ; i++ )
@@ -3407,7 +3578,7 @@
3407
  if ( oSettings.aoColumns[i].sWidth !== null )
3408
  {
3409
  iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig,
3410
- oSettings.nTable.parentNode );
3411
  if ( iTmpWidth !== null )
3412
  {
3413
  oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
@@ -3507,7 +3678,6 @@
3507
  }
3508
 
3509
  /* Build the table and 'display' it */
3510
- var nWrapper = oSettings.nTable.parentNode;
3511
  nWrapper.appendChild( nCalcTmp );
3512
 
3513
  /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
@@ -3634,7 +3804,7 @@
3634
  * Get the widest node
3635
  * @param {object} oSettings dataTables settings object
3636
  * @param {int} iCol column of interest
3637
- * @returns {string} max strlens for each column
3638
  * @memberof DataTable#oApi
3639
  */
3640
  function _fnGetWidestNode( oSettings, iCol )
@@ -3659,7 +3829,7 @@
3659
  * Get the maximum strlen for each data column
3660
  * @param {object} oSettings dataTables settings object
3661
  * @param {int} iCol column of interest
3662
- * @returns {string} max strlens for each column
3663
  * @memberof DataTable#oApi
3664
  */
3665
  function _fnGetMaxLenString( oSettings, iCol )
@@ -3753,8 +3923,6 @@
3753
  return (w1 - w2);
3754
  }
3755
 
3756
-
3757
-
3758
  /**
3759
  * Change the order of the table
3760
  * @param {object} oSettings dataTables settings object
@@ -3777,16 +3945,11 @@
3777
  if ( !oSettings.oFeatures.bServerSide &&
3778
  (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
3779
  {
3780
- if ( oSettings.aaSortingFixed !== null )
3781
- {
3782
- aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
3783
- }
3784
- else
3785
- {
3786
- aaSort = oSettings.aaSorting.slice();
3787
- }
3788
 
3789
- /* If there is a sorting data type, and a fuction belonging to it, then we need to
3790
  * get the data from the developer's function and apply it for this column
3791
  */
3792
  for ( i=0 ; i<aaSort.length ; i++ )
@@ -3796,10 +3959,19 @@
3796
  sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
3797
  if ( DataTable.ext.afnSortData[sDataType] )
3798
  {
3799
- var aData = DataTable.ext.afnSortData[sDataType]( oSettings, iColumn, iVisColumn );
3800
- for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
 
 
 
 
 
 
 
 
 
3801
  {
3802
- _fnSetCellData( oSettings, j, iColumn, aData[j] );
3803
  }
3804
  }
3805
  }
@@ -3887,6 +4059,7 @@
3887
 
3888
  for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
3889
  {
 
3890
  nTh = aoColumns[i].nTh;
3891
  nTh.removeAttribute('aria-sort');
3892
  nTh.removeAttribute('aria-label');
@@ -3900,18 +4073,18 @@
3900
 
3901
  var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ?
3902
  aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
3903
- nTh.setAttribute('aria-label', aoColumns[i].sTitle+
3904
  (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
3905
  }
3906
  else
3907
  {
3908
- nTh.setAttribute('aria-label', aoColumns[i].sTitle+
3909
  (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
3910
  }
3911
  }
3912
  else
3913
  {
3914
- nTh.setAttribute('aria-label', aoColumns[i].sTitle);
3915
  }
3916
  }
3917
 
@@ -3958,17 +4131,17 @@
3958
  * twice - once for when bProcessing is enabled, and another time for when it is
3959
  * disabled, as we need to perform slightly different actions.
3960
  * Basically the issue here is that the Javascript engine in modern browsers don't
3961
- * appear to allow the rendering engine to update the display while it is still excuting
3962
  * it's thread (well - it does but only after long intervals). This means that the
3963
  * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
3964
  * I force an execution break by using setTimeout - but this breaks the expected
3965
  * thread continuation for the end-developer's point of view (their code would execute
3966
- * too early), so we on;y do it when we absolutely have to.
3967
  */
3968
  var fnInnerSorting = function () {
3969
  var iColumn, iNextSort;
3970
 
3971
- /* If the shift key is pressed then we are multipe column sorting */
3972
  if ( e.shiftKey )
3973
  {
3974
  /* Are we already doing some kind of sort on this column? */
@@ -4141,10 +4314,10 @@
4141
  * Apply the required classes to the table body
4142
  * Note that this is given as a feature switch since it can significantly slow down a sort
4143
  * on large data sets (adding and removing of classes is always slow at the best of times..)
4144
- * Further to this, note that this code is admitadly fairly ugly. It could be made a lot
4145
- * simpiler using jQuery selectors and add/removeClass, but that is significantly slower
4146
  * (on the order of 5 times slower) - hence the direct DOM manipulation here.
4147
- * Note that for defered drawing we do use jQuery - the reason being that taking the first
4148
  * row found to see if the whole column needs processed can miss classes since the first
4149
  * column might be new.
4150
  */
@@ -4153,56 +4326,49 @@
4153
  if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
4154
  {
4155
  var nTds = _fnGetTdNodes( oSettings );
4156
-
4157
- /* Remove the old classes */
4158
- if ( oSettings.oFeatures.bDeferRender )
 
 
4159
  {
4160
- $(nTds).removeClass(sClass+'1 '+sClass+'2 '+sClass+'3');
4161
  }
4162
- else if ( nTds.length >= iColumns )
4163
  {
4164
- for ( i=0 ; i<iColumns ; i++ )
 
 
 
4165
  {
4166
- if ( nTds[i].className.indexOf(sClass+"1") != -1 )
4167
- {
4168
- for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
4169
- {
4170
- nTds[(iColumns*j)+i].className =
4171
- $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"1", "" ) );
4172
- }
4173
- }
4174
- else if ( nTds[i].className.indexOf(sClass+"2") != -1 )
4175
- {
4176
- for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
4177
- {
4178
- nTds[(iColumns*j)+i].className =
4179
- $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"2", "" ) );
4180
- }
4181
- }
4182
- else if ( nTds[i].className.indexOf(sClass+"3") != -1 )
4183
- {
4184
- for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
4185
- {
4186
- nTds[(iColumns*j)+i].className =
4187
- $.trim( nTds[(iColumns*j)+i].className.replace( " "+sClass+"3", "" ) );
4188
- }
4189
- }
4190
  }
4191
  }
4192
 
4193
- /* Add the new classes to the table */
4194
- var iClass = 1, iTargetCol;
4195
- for ( i=0 ; i<aaSort.length ; i++ )
 
4196
  {
4197
- iTargetCol = parseInt( aaSort[i][0], 10 );
4198
- for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
 
 
 
 
 
 
 
 
 
4199
  {
4200
- nTds[(iColumns*j)+iTargetCol].className += " "+sClass+iClass;
 
4201
  }
4202
-
4203
- if ( iClass < 3 )
4204
  {
4205
- iClass++;
 
4206
  }
4207
  }
4208
  }
@@ -4290,7 +4456,7 @@
4290
  $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
4291
 
4292
  /* Column visibility state
4293
- * Pass back visibiliy settings to the init handler, but to do not here override
4294
  * the init object that the user might have passed in
4295
  */
4296
  oInit.saved_aoColumns = [];
@@ -4342,35 +4508,50 @@
4342
  }
4343
 
4344
  /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
4345
- * belonging to DataTables. This is FAR from bullet proof
4346
  */
4347
- var sOldName="", iOldTime=9999999999999;
4348
- var iLength = _fnReadCookie( sNameFile )!==null ? document.cookie.length :
4349
- sFullCookie.length + document.cookie.length;
 
4350
 
4351
- if ( iLength+10 > 4096 ) /* Magic 10 for padding */
4352
  {
4353
- var aCookies =document.cookie.split(';');
4354
  for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
4355
  {
4356
  if ( aCookies[i].indexOf( sBaseName ) != -1 )
4357
  {
4358
  /* It's a DataTables cookie, so eval it and check the time stamp */
4359
  var aSplitCookie = aCookies[i].split('=');
4360
- try { oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' ); }
4361
- catch( e ) { continue; }
4362
-
4363
- if ( oData.iCreate && oData.iCreate < iOldTime )
4364
- {
4365
- sOldName = aSplitCookie[0];
4366
- iOldTime = oData.iCreate;
 
 
 
4367
  }
 
4368
  }
4369
  }
4370
-
4371
- if ( sOldName !== "" )
4372
- {
4373
- document.cookie = sOldName+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
 
 
 
 
 
 
 
 
 
 
 
4374
  aParts.join('/') + "/";
4375
  }
4376
  }
@@ -4410,7 +4591,6 @@
4410
  }
4411
 
4412
 
4413
-
4414
  /**
4415
  * Return the settings object for a particular table
4416
  * @param {node} nTable table we are using as a dataTable
@@ -4464,7 +4644,7 @@
4464
  {
4465
  var anReturn = [];
4466
  var iCorrector;
4467
- var anTds;
4468
  var iRow, iRows=oSettings.aoData.length,
4469
  iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
4470
 
@@ -4482,13 +4662,15 @@
4482
  {
4483
  /* get the TD child nodes - taking into account text etc nodes */
4484
  anTds = [];
4485
- for ( iColumn=0, iColumns=oData.nTr.childNodes.length ; iColumn<iColumns ; iColumn++ )
 
4486
  {
4487
- sNodeName = oData.nTr.childNodes[iColumn].nodeName.toLowerCase();
4488
  if ( sNodeName == 'td' || sNodeName == 'th' )
4489
  {
4490
- anTds.push( oData.nTr.childNodes[iColumn] );
4491
  }
 
4492
  }
4493
 
4494
  iCorrector = 0;
@@ -4532,11 +4714,11 @@
4532
  }
4533
  else
4534
  {
4535
- throw sAlert;
4536
  }
4537
  return;
4538
  }
4539
- else if ( console !== undefined && console.log )
4540
  {
4541
  console.log( sAlert );
4542
  }
@@ -4577,17 +4759,21 @@
4577
  */
4578
  function _fnExtend( oOut, oExtender )
4579
  {
4580
- for ( var prop in oOut )
 
 
4581
  {
4582
- if ( oOut.hasOwnProperty(prop) && oExtender[prop] !== undefined )
4583
  {
4584
- if ( typeof oInit[prop] === 'object' && $.isArray(oExtender[prop]) === false )
 
 
4585
  {
4586
- $.extend( true, oOut[prop], oExtender[prop] );
4587
  }
4588
  else
4589
  {
4590
- oOut[prop] = oExtender[prop];
4591
  }
4592
  }
4593
  }
@@ -4598,19 +4784,19 @@
4598
 
4599
  /**
4600
  * Bind an event handers to allow a click or return key to activate the callback.
4601
- * This is good for accessability since a return on the keyboard will have the
4602
  * same effect as a click, if the element has focus.
4603
  * @param {element} n Element to bind the action to
4604
  * @param {object} oData Data object to pass to the triggered function
4605
- * @param {function) fn Callback function for when the event is triggered
4606
  * @memberof DataTable#oApi
4607
  */
4608
  function _fnBindAction( n, oData, fn )
4609
  {
4610
  $(n)
4611
  .bind( 'click.DT', oData, function (e) {
4612
- fn(e);
4613
  n.blur(); // Remove focus outline for mouse users
 
4614
  } )
4615
  .bind( 'keypress.DT', oData, function (e){
4616
  if ( e.which === 13 ) {
@@ -4627,9 +4813,9 @@
4627
  * Register a callback function. Easily allows a callback function to be added to
4628
  * an array store of callback functions that can then all be called together.
4629
  * @param {object} oSettings dataTables settings object
4630
- * @param {string} sStore Name of the array storeage for the callbacks in oSettings
4631
  * @param {function} fn Function to be called back
4632
- * @param {string) sName Identifying name for the callback (i.e. a label)
4633
  * @memberof DataTable#oApi
4634
  */
4635
  function _fnCallbackReg( oSettings, sStore, fn, sName )
@@ -4649,10 +4835,10 @@
4649
  * array store is done backwards! Further note that you do not want to fire off triggers
4650
  * in time sensitive applications (for example cell creation) as its slow.
4651
  * @param {object} oSettings dataTables settings object
4652
- * @param {string} sStore Name of the array storeage for the callbacks in oSettings
4653
  * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
4654
  * is fired
4655
- * @param {array) aArgs Array of arguments to pass to the callback function / trigger
4656
  * @memberof DataTable#oApi
4657
  */
4658
  function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
@@ -4677,7 +4863,7 @@
4677
  /**
4678
  * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
4679
  * library, then we use that as it is fast, safe and accurate. If the function isn't
4680
- * available then we need to built it ourselves - the insperation for this function comes
4681
  * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
4682
  * not perfect and absolutely should not be used as a replacement to json2.js - but it does
4683
  * do what we need, without requiring a dependency for DataTables.
@@ -4725,9 +4911,32 @@
4725
  return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
4726
  };
4727
 
4728
-
4729
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4730
 
 
4731
  /**
4732
  * Perform a jQuery selector action on the table's TR elements (from the tbody) and
4733
  * return the resulting jQuery object.
@@ -4765,8 +4974,11 @@
4765
  */
4766
  this.$ = function ( sSelector, oOpts )
4767
  {
4768
- var i, iLen, a = [];
4769
  var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
 
 
 
4770
 
4771
  if ( !oOpts )
4772
  {
@@ -4785,37 +4997,54 @@
4785
  {
4786
  for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
4787
  {
4788
- a.push( oSettings.aoData[ oSettings.aiDisplay[i] ].nTr );
 
 
 
 
4789
  }
4790
  }
4791
  else if ( oOpts.order == "current" && oOpts.filter == "none" )
4792
  {
4793
- for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
4794
  {
4795
- a.push( oSettings.aoData[ oSettings.aiDisplayMaster[i] ].nTr );
 
 
 
 
4796
  }
4797
  }
4798
  else if ( oOpts.order == "current" && oOpts.filter == "applied" )
4799
  {
4800
- for ( i=0, iLen=oSettings.aiDisplay.length ; i<iLen ; i++ )
4801
  {
4802
- a.push( oSettings.aoData[ oSettings.aiDisplay[i] ].nTr );
 
 
 
 
4803
  }
4804
  }
4805
  else if ( oOpts.order == "original" && oOpts.filter == "none" )
4806
  {
4807
- for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
4808
  {
4809
- a.push( oSettings.aoData[ i ].nTr );
 
 
 
 
4810
  }
4811
  }
4812
  else if ( oOpts.order == "original" && oOpts.filter == "applied" )
4813
  {
4814
- for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
4815
  {
4816
- if ( $.inArray( i, oSettings.aiDisplay ) !== -1 )
 
4817
  {
4818
- a.push( oSettings.aoData[ i ].nTr );
4819
  }
4820
  }
4821
  }
@@ -4839,11 +5068,11 @@
4839
  /**
4840
  * Almost identical to $ in operation, but in this case returns the data for the matched
4841
  * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
4842
- * rather than any decendents, so the data can be obtained for the row/cell. If matching
4843
  * rows are found, the data returned is the original data array/object that was used to
4844
  * create the row (or a generated array if from a DOM source).
4845
  *
4846
- * This method is often useful incombination with $ where both functions are given the
4847
  * same parameters and the array indexes will match identically.
4848
  * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
4849
  * @param {object} [oOpts] Optional parameters for modifying the rows to be included
@@ -4907,8 +5136,8 @@
4907
  * <ul>
4908
  * <li>1D array of data - add a single row with the data provided</li>
4909
  * <li>2D array of arrays - add multiple rows in a single call</li>
4910
- * <li>object - data object when using <i>mDataProp</i></li>
4911
- * <li>array of objects - multiple data objects when using <i>mDataProp</i></li>
4912
  * </ul>
4913
  * @param {bool} [bRedraw=true] redraw the table or not
4914
  * @returns {array} An array of integers, representing the list of indexes in
@@ -5142,8 +5371,8 @@
5142
  fnCallBack.call( this, oSettings, oData );
5143
  }
5144
 
5145
- /* Check for an 'overflow' they case for dislaying the table */
5146
- if ( oSettings._iDisplayStart >= oSettings.aiDisplay.length )
5147
  {
5148
  oSettings._iDisplayStart -= oSettings._iDisplayLength;
5149
  if ( oSettings._iDisplayStart < 0 )
@@ -5182,22 +5411,23 @@
5182
  var nBody = oSettings.nTBody;
5183
  var i, iLen;
5184
 
5185
- bRemove = (bRemove===undefined) ? false : true;
5186
 
5187
  /* Flag to note that the table is currently being destroyed - no action should be taken */
5188
  oSettings.bDestroying = true;
5189
 
5190
- /* Restore hidden columns */
5191
- for ( i=0, iLen=oSettings.aoDestroyCallback.length ; i<iLen ; i++ ) {
5192
- oSettings.aoDestroyCallback[i].fn();
5193
- }
5194
-
5195
- /* Restore hidden columns */
5196
- for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
5197
  {
5198
- if ( oSettings.aoColumns[i].bVisible === false )
5199
  {
5200
- this.fnSetColumnVis( i, true );
 
 
 
5201
  }
5202
  }
5203
 
@@ -5273,12 +5503,19 @@
5273
  oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
5274
  }
5275
 
5276
- /* If the were originally odd/even type classes - then we add them back here. Note
5277
- * this is not fool proof (for example if not all rows as odd/even classes - but
5278
  * it's a good effort without getting carried away
5279
  */
5280
- $(nBody).children('tr:even').addClass( oSettings.asDestroyStripes[0] );
5281
- $(nBody).children('tr:odd').addClass( oSettings.asDestroyStripes[1] );
 
 
 
 
 
 
 
5282
 
5283
  /* Remove the settings object from the settings array */
5284
  for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
@@ -5291,6 +5528,7 @@
5291
 
5292
  /* End it all */
5293
  oSettings = null;
 
5294
  };
5295
 
5296
 
@@ -5310,7 +5548,7 @@
5310
  this.fnDraw = function( bComplete )
5311
  {
5312
  var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5313
- if ( bComplete )
5314
  {
5315
  _fnCalculateEnd( oSettings );
5316
  _fnDraw( oSettings );
@@ -5384,7 +5622,17 @@
5384
  var n = oSettings.aanFeatures.f;
5385
  for ( var i=0, iLen=n.length ; i<iLen ; i++ )
5386
  {
5387
- $('input', n[i]).val( sInput );
 
 
 
 
 
 
 
 
 
 
5388
  }
5389
  }
5390
  }
@@ -5504,7 +5752,8 @@
5504
  * and column index including hidden columns
5505
  * @param {node} nNode this can either be a TR, TD or TH in the table's body
5506
  * @returns {int} If nNode is given as a TR, then a single index is returned, or
5507
- * if given as a cell, an array of [row index, column index (visible)] is given.
 
5508
  * @dtopt API
5509
  *
5510
  * @example
@@ -5706,7 +5955,7 @@
5706
  var i, iLen;
5707
  var aoColumns = oSettings.aoColumns;
5708
  var aoData = oSettings.aoData;
5709
- var nTd, nCell, anTrs, jqChildren, bAppend, iBefore;
5710
 
5711
  /* No point in doing anything if we are requesting what is already true */
5712
  if ( aoColumns[iCol].bVisible == bShow )
@@ -5826,7 +6075,7 @@
5826
 
5827
 
5828
  /**
5829
- * Sort the table by a particular row
5830
  * @param {int} iCol the data index to sort on. Note that this will not match the
5831
  * 'display index' if you have hidden data entries
5832
  * @dtopt API
@@ -5878,7 +6127,7 @@
5878
  * @param {node|int} mRow TR element you want to update or the aoData index
5879
  * @param {int} [iColumn] The column to update (not used of mData is an array or object)
5880
  * @param {bool} [bRedraw=true] Redraw the table or not
5881
- * @param {bool} [bAction=true] Perform predraw actions or not
5882
  * @returns {int} 0 on success, 1 on error
5883
  * @dtopt API
5884
  *
@@ -5892,34 +6141,30 @@
5892
  this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
5893
  {
5894
  var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5895
- var iVisibleColumn, i, iLen, sDisplay;
5896
  var iRow = (typeof mRow === 'object') ?
5897
  _fnNodeToDataIndex(oSettings, mRow) : mRow;
5898
 
5899
- if ( oSettings.__fnUpdateDeep === undefined && $.isArray(mData) && typeof mData === 'object' )
5900
  {
5901
  /* Array update - update the whole row */
5902
  oSettings.aoData[iRow]._aData = mData.slice();
5903
 
5904
  /* Flag to the function that we are recursing */
5905
- oSettings.__fnUpdateDeep = true;
5906
  for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
5907
  {
5908
  this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
5909
  }
5910
- oSettings.__fnUpdateDeep = undefined;
5911
  }
5912
- else if ( oSettings.__fnUpdateDeep === undefined && mData !== null && typeof mData === 'object' )
5913
  {
5914
  /* Object update - update the whole row - assume the developer gets the object right */
5915
  oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
5916
 
5917
- oSettings.__fnUpdateDeep = true;
5918
  for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
5919
  {
5920
  this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
5921
  }
5922
- oSettings.__fnUpdateDeep = undefined;
5923
  }
5924
  else
5925
  {
@@ -5948,8 +6193,10 @@
5948
  * will rebuild the search array - however, the redraw might be disabled by the user)
5949
  */
5950
  var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
5951
- oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings,
5952
- _fnGetRowData( oSettings, iRow, 'filter' ) );
 
 
5953
 
5954
  /* Perform pre-draw actions */
5955
  if ( bAction === undefined || bAction )
@@ -5987,7 +6234,7 @@
5987
 
5988
  /*
5989
  * This is really a good bit rubbish this method of exposing the internal methods
5990
- * publically... - To be fixed in 2.0 using methods on the prototype
5991
  */
5992
 
5993
 
@@ -6098,7 +6345,10 @@
6098
  "_fnCallbackFire": _fnCallbackFire,
6099
  "_fnJsonString": _fnJsonString,
6100
  "_fnRender": _fnRender,
6101
- "_fnNodeToColumnIndex": _fnNodeToColumnIndex
 
 
 
6102
  };
6103
 
6104
  $.extend( DataTable.ext.oApi, this.oApi );
@@ -6113,8 +6363,7 @@
6113
 
6114
 
6115
  var _that = this;
6116
- return this.each(function() {
6117
-
6118
  var i=0, iLen, j, jLen, k, kLen;
6119
  var sId = this.getAttribute( 'id' );
6120
  var bInitHandedOff = false;
@@ -6166,7 +6415,7 @@
6166
  }
6167
 
6168
  /* Ensure the table has an ID - required for accessibility */
6169
- if ( sId === null )
6170
  {
6171
  sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
6172
  this.id = sId;
@@ -6219,8 +6468,8 @@
6219
  _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
6220
  _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
6221
  _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
6222
- _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
6223
  _fnMap( oSettings, oInit, "asStripeClasses" );
 
6224
  _fnMap( oSettings, oInit, "fnServerData" );
6225
  _fnMap( oSettings, oInit, "fnFormatNumber" );
6226
  _fnMap( oSettings, oInit, "sServerMethod" );
@@ -6313,8 +6562,9 @@
6313
  if ( oInit.iDeferLoading !== null )
6314
  {
6315
  oSettings.bDeferLoading = true;
6316
- oSettings._iRecordsTotal = oInit.iDeferLoading;
6317
- oSettings._iRecordsDisplay = oInit.iDeferLoading;
 
6318
  }
6319
 
6320
  if ( oInit.aaData !== null )
@@ -6346,44 +6596,38 @@
6346
  /*
6347
  * Stripes
6348
  */
6349
-
6350
- /* Remove row stripe classes if they are already on the table row */
6351
- var bStripeRemove = false;
6352
- var anRows = $(this).children('tbody').children('tr');
6353
- for ( i=0, iLen=oSettings.asStripeClasses.length ; i<iLen ; i++ )
6354
  {
6355
- if ( anRows.filter(":lt(2)").hasClass( oSettings.asStripeClasses[i]) )
6356
- {
6357
- bStripeRemove = true;
6358
- break;
6359
- }
6360
  }
6361
-
6362
- if ( bStripeRemove )
 
 
 
6363
  {
6364
- /* Store the classes which we are about to remove so they can be readded on destroy */
6365
- oSettings.asDestroyStripes = [ '', '' ];
6366
- if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripeOdd) )
6367
- {
6368
- oSettings.asDestroyStripes[0] += oSettings.oClasses.sStripeOdd+" ";
6369
- }
6370
- if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripeEven) )
6371
- {
6372
- oSettings.asDestroyStripes[0] += oSettings.oClasses.sStripeEven;
6373
- }
6374
- if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripeOdd) )
6375
  {
6376
- oSettings.asDestroyStripes[1] += oSettings.oClasses.sStripeOdd+" ";
 
 
 
 
 
 
6377
  }
6378
- if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripeEven) )
 
6379
  {
6380
- oSettings.asDestroyStripes[1] += oSettings.oClasses.sStripeEven;
6381
  }
6382
-
6383
- anRows.removeClass( oSettings.asStripeClasses.join(' ') );
6384
  }
6385
 
6386
-
6387
  /*
6388
  * Columns
6389
  * See if we should load columns automatically or use defined ones
@@ -6478,6 +6722,15 @@
6478
  * Final init
6479
  * Cache the header, body and footer as required, creating them if needed
6480
  */
 
 
 
 
 
 
 
 
 
6481
  var thead = $(this).children('thead');
6482
  if ( thead.length === 0 )
6483
  {
@@ -6498,6 +6751,14 @@
6498
  oSettings.nTBody.setAttribute( "aria-relevant", "all" );
6499
 
6500
  var tfoot = $(this).children('tfoot');
 
 
 
 
 
 
 
 
6501
  if ( tfoot.length > 0 )
6502
  {
6503
  oSettings.nTFoot = tfoot[0];
@@ -6532,7 +6793,108 @@
6532
  _fnInitialise( oSettings );
6533
  }
6534
  } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6535
  };
 
6536
 
6537
  /**
6538
  * Version string for plug-ins to check compatibility. Allowed format is
@@ -6542,7 +6904,7 @@
6542
  * @type string
6543
  * @default Version number
6544
  */
6545
- DataTable.version = "1.9.0";
6546
 
6547
  /**
6548
  * Private data store, containing all of the settings objects that are created for the
@@ -6658,8 +7020,8 @@
6658
  * </il>
6659
  * </ul>
6660
  *
6661
- * Note that as of v1.9, it is typically preferable to use <i>mDataProp</i> to prepare data for
6662
- * the different uses that DataTables can put the data to. Specifically <i>mDataProp</i> when
6663
  * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
6664
  * prepare the data as required for the different types. As such, this method is deprecated.
6665
  * @type array
@@ -6790,28 +7152,7 @@
6790
  * alert( oTable.fnVersionCheck( '1.9.0' ) );
6791
  * } );
6792
  */
6793
- "fnVersionCheck": function( sVersion )
6794
- {
6795
- /* This is cheap, but very effective */
6796
- var fnZPad = function (Zpad, count)
6797
- {
6798
- while(Zpad.length < count) {
6799
- Zpad += '0';
6800
- }
6801
- return Zpad;
6802
- };
6803
- var aThis = DataTable.ext.sVersion.split('.');
6804
- var aThat = sVersion.split('.');
6805
- var sThis = '', sThat = '';
6806
-
6807
- for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
6808
- {
6809
- sThis += fnZPad( aThis[i], 3 );
6810
- sThat += fnZPad( aThat[i], 3 );
6811
- }
6812
-
6813
- return parseInt(sThis, 10) >= parseInt(sThat, 10);
6814
- },
6815
 
6816
 
6817
  /**
@@ -6845,8 +7186,8 @@
6845
  * </il>
6846
  * </ul>
6847
  *
6848
- * Note that as of v1.9, it is typically preferable to use <i>mDataProp</i> to prepare data for
6849
- * the different uses that DataTables can put the data to. Specifically <i>mDataProp</i> when
6850
  * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
6851
  * prepare the data as required for the different types. As such, this method is deprecated.
6852
  * @type object
@@ -7173,7 +7514,7 @@
7173
  /**
7174
  * Data object from the original data source for the row. This is either
7175
  * an array if using the traditional form of DataTables, or an object if
7176
- * using mDataProp options. The exact type will depend on the passed in
7177
  * data from the data source, or will be an array if using DOM a data
7178
  * source.
7179
  * @type array|object
@@ -7267,14 +7608,14 @@
7267
  "bSortable": null,
7268
 
7269
  /**
7270
- * When using fnRender, you have two options for what to do with the data,
7271
- * and this property serves as the switch. Firstly, you can have the sorting
7272
- * and filtering use the rendered value (true - default), or you can have
7273
- * the sorting and filtering us the original value (false).
7274
- *
7275
- * *NOTE* It is it is advisable now to use mDataProp as a function and make
7276
- * use of the 'type' that it gives, allowing (potentially) different data to
7277
- * be used for sorting, filtering, display and type detection.
7278
  * @type boolean
7279
  * @deprecated
7280
  */
@@ -7297,9 +7638,9 @@
7297
 
7298
  /**
7299
  * Developer definable function that is called whenever a cell is created (Ajax source,
7300
- * etc) or processed for input (DOM source). This can be used as a compliment to fnRender
7301
  * allowing you to modify the DOM element (add background colour for example) when the
7302
- * element is available (since it is not when fnRender is called).
7303
  * @type function
7304
  * @param {element} nTd The TD node that has been created
7305
  * @param {*} sData The Data for the cell
@@ -7312,7 +7653,7 @@
7312
  /**
7313
  * Function to get data from a cell in a column. You should <b>never</b>
7314
  * access data directly through _aData internally in DataTables - always use
7315
- * the method attached to this property. It allows mDataProp to function as
7316
  * required. This function is automatically assigned by the column
7317
  * initialisation method
7318
  * @type function
@@ -7326,23 +7667,28 @@
7326
  "fnGetData": null,
7327
 
7328
  /**
7329
- * Custom display function that will be called for the display of each cell
7330
- * in this column.
 
 
 
 
7331
  * @type function
7332
  * @param {object} o Object with the following parameters:
7333
  * @param {int} o.iDataRow The row in aoData
7334
  * @param {int} o.iDataColumn The column in question
7335
- * @param {array o.aData The data for the row in question
7336
  * @param {object} o.oSettings The settings object for this DataTables instance
7337
  * @returns {string} The string you which to use in the display
7338
  * @default null
 
7339
  */
7340
  "fnRender": null,
7341
 
7342
  /**
7343
  * Function to set data for a cell in the column. You should <b>never</b>
7344
  * set the data directly to _aData internally in DataTables - always use
7345
- * this method. It allows mDataProp to function as required. This function
7346
  * is automatically assigned by the column initialisation method
7347
  * @type function
7348
  * @param {array|object} oData The data array/object for the array
@@ -7359,7 +7705,17 @@
7359
  * @type function|int|string|null
7360
  * @default null
7361
  */
7362
- "mDataProp": null,
 
 
 
 
 
 
 
 
 
 
7363
 
7364
  /**
7365
  * Unique header TH/TD element for this column - this is what the sorting
@@ -7400,7 +7756,7 @@
7400
 
7401
  /**
7402
  * Allows a default value to be given for a column's data, and will be used
7403
- * whenever a null data source is encountered (this can be because mDataProp
7404
  * is set to null, or because the data source itself is null).
7405
  * @type string
7406
  * @default null
@@ -7501,7 +7857,7 @@
7501
  * } );
7502
  *
7503
  * @example
7504
- * // Using an array of objects as a data source (mDataProp)
7505
  * $(document).ready( function () {
7506
  * $('#example').dataTable( {
7507
  * "aaData": [
@@ -7521,11 +7877,11 @@
7521
  * }
7522
  * ],
7523
  * "aoColumns": [
7524
- * { "sTitle": "Engine", "mDataProp": "engine" },
7525
- * { "sTitle": "Browser", "mDataProp": "browser" },
7526
- * { "sTitle": "Platform", "mDataProp": "platform" },
7527
- * { "sTitle": "Version", "mDataProp": "version" },
7528
- * { "sTitle": "Grade", "mDataProp": "grade" }
7529
  * ]
7530
  * } );
7531
  * } );
@@ -7594,7 +7950,7 @@
7594
  * @dtopt Option
7595
  *
7596
  * @example
7597
- * $(document).ready(function() {
7598
  * $('#example').dataTable( {
7599
  * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
7600
  * } );
@@ -7604,7 +7960,7 @@
7604
  * // Setting the default display length as well as length menu
7605
  * // This is likely to be wanted if you remove the '10' option which
7606
  * // is the iDisplayLength default.
7607
- * $(document).ready(function() {
7608
  * $('#example').dataTable( {
7609
  * "iDisplayLength": 25,
7610
  * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
@@ -7676,7 +8032,8 @@
7676
  * array may be of any length, and DataTables will apply each class
7677
  * sequentially, looping when required.
7678
  * @type array
7679
- * @default [ 'odd', 'even' ]
 
7680
  * @dtopt Option
7681
  *
7682
  * @example
@@ -7686,7 +8043,7 @@
7686
  * } );
7687
  * } )
7688
  */
7689
- "asStripeClasses": [ 'odd', 'even' ],
7690
 
7691
 
7692
  /**
@@ -7718,7 +8075,7 @@
7718
  * @dtopt Features
7719
  *
7720
  * @example
7721
- * $(document).ready(function() {
7722
  * var oTable = $('#example').dataTable( {
7723
  * "sAjaxSource": "sources/arrays.txt",
7724
  * "bDeferRender": true
@@ -7738,7 +8095,7 @@
7738
  * @dtopt Options
7739
  *
7740
  * @example
7741
- * $(document).ready(function() {
7742
  * $('#example').dataTable( {
7743
  * "sScrollY": "200px",
7744
  * "bPaginate": false
@@ -7761,7 +8118,7 @@
7761
  * specified (this allow matching across multiple columns). Note that if you
7762
  * wish to use filtering in DataTables this must remain 'true' - to remove the
7763
  * default filtering input box and retain filtering abilities, please use
7764
- * @ref{sDom}.
7765
  * @type boolean
7766
  * @default true
7767
  * @dtopt Features
@@ -7877,7 +8234,7 @@
7877
  * @dtopt Options
7878
  *
7879
  * @example
7880
- * $(document).ready(function() {
7881
  * initTable();
7882
  * tableActions();
7883
  * } );
@@ -7909,7 +8266,7 @@
7909
  * @dtopt Options
7910
  *
7911
  * @example
7912
- * $(document).ready(function() {
7913
  * $('#example').dataTable( {
7914
  * "bScrollAutoCss": false,
7915
  * "sScrollY": "200px"
@@ -7931,7 +8288,7 @@
7931
  * @dtopt Options
7932
  *
7933
  * @example
7934
- * $(document).ready(function() {
7935
  * $('#example').dataTable( {
7936
  * "sScrollY": "200",
7937
  * "bScrollCollapse": true
@@ -7953,7 +8310,7 @@
7953
  * @dtopt Features
7954
  *
7955
  * @example
7956
- * $(document).ready(function() {
7957
  * $('#example').dataTable( {
7958
  * "bScrollInfinite": true,
7959
  * "bScrollCollapse": true,
@@ -8010,7 +8367,7 @@
8010
  * @dtopt Options
8011
  *
8012
  * @example
8013
- * $(document).ready(function() {
8014
  * $('#example').dataTable( {
8015
  * "bSortCellsTop": true
8016
  * } );
@@ -8097,7 +8454,7 @@
8097
  * @dtopt Callbacks
8098
  *
8099
  * @example
8100
- * $(document).ready(function() {
8101
  * $('#example').dataTable( {
8102
  * "fnCreatedRow": function( nRow, aData, iDataIndex ) {
8103
  * // Bold the grade for all 'A' grade browsers
@@ -8122,7 +8479,7 @@
8122
  * @example
8123
  * $(document).ready( function() {
8124
  * $('#example').dataTable( {
8125
- * "fnDrawCallback": function() {
8126
  * alert( 'DataTables has redrawn the table' );
8127
  * }
8128
  * } );
@@ -8170,7 +8527,7 @@
8170
  * @dtopt Callbacks
8171
  *
8172
  * @example
8173
- * $(document).ready(function() {
8174
  * $('#example').dataTable( {
8175
  * "fnFormatNumber": function ( iIn ) {
8176
  * if ( iIn &lt; 1000 ) {
@@ -8329,7 +8686,7 @@
8329
  * @dtopt Callbacks
8330
  *
8331
  * @example
8332
- * $(document).ready(function() {
8333
  * $('#example').dataTable( {
8334
  * "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
8335
  * // Bold the grade for all 'A' grade browsers
@@ -8362,13 +8719,13 @@
8362
  *
8363
  * @example
8364
  * // POST data to server
8365
- * $(document).ready(function() {
8366
  * $('#example').dataTable( {
8367
  * "bProcessing": true,
8368
  * "bServerSide": true,
8369
  * "sAjaxSource": "xhr.php",
8370
- * "fnServerData": function ( sSource, aoData, fnCallback ) {
8371
- * $.ajax( {
8372
  * "dataType": 'json',
8373
  * "type": "POST",
8374
  * "url": sSource,
@@ -8384,7 +8741,11 @@
8384
  "url": sUrl,
8385
  "data": aoData,
8386
  "success": function (json) {
8387
- $(oSettings.oInstance).trigger('xhr', oSettings);
 
 
 
 
8388
  fnCallback( json );
8389
  },
8390
  "dataType": "json",
@@ -8392,8 +8753,8 @@
8392
  "type": oSettings.sServerMethod,
8393
  "error": function (xhr, error, thrown) {
8394
  if ( error == "parsererror" ) {
8395
- alert( "DataTables warning: JSON data from server could not be parsed. "+
8396
- "This is caused by a JSON formatting error." );
8397
  }
8398
  }
8399
  } );
@@ -8418,7 +8779,7 @@
8418
  * @dtopt Server-side
8419
  *
8420
  * @example
8421
- * $(document).ready(function() {
8422
  * $('#example').dataTable( {
8423
  * "bProcessing": true,
8424
  * "bServerSide": true,
@@ -8443,10 +8804,10 @@
8443
  * @dtopt Callbacks
8444
  *
8445
  * @example
8446
- * $(document).ready(function() {
8447
  * $('#example').dataTable( {
8448
  * "bStateSave": true,
8449
- * "fnStateSave": function (oSettings, oData) {
8450
  * var o;
8451
  *
8452
  * // Send an Ajax request to the server to get the data. Note that
@@ -8493,21 +8854,23 @@
8493
  *
8494
  * @example
8495
  * // Remove a saved filter, so filtering is never loaded
8496
- * $(document).ready(function() {
8497
  * $('#example').dataTable( {
8498
  * "bStateSave": true,
8499
  * "fnStateLoadParams": function (oSettings, oData) {
8500
- * oData.oFilter.sSearch = "";
 
8501
  * } );
8502
  * } );
8503
  *
8504
  * @example
8505
  * // Disallow state loading by returning false
8506
- * $(document).ready(function() {
8507
  * $('#example').dataTable( {
8508
  * "bStateSave": true,
8509
  * "fnStateLoadParams": function (oSettings, oData) {
8510
  * return false;
 
8511
  * } );
8512
  * } );
8513
  */
@@ -8524,11 +8887,12 @@
8524
  *
8525
  * @example
8526
  * // Show an alert with the filtering value that was saved
8527
- * $(document).ready(function() {
8528
  * $('#example').dataTable( {
8529
  * "bStateSave": true,
8530
  * "fnStateLoaded": function (oSettings, oData) {
8531
- * alert( 'Saved filter was: '+oData.oFilter.sSearch );
 
8532
  * } );
8533
  * } );
8534
  */
@@ -8546,7 +8910,7 @@
8546
  * @dtopt Callbacks
8547
  *
8548
  * @example
8549
- * $(document).ready(function() {
8550
  * $('#example').dataTable( {
8551
  * "bStateSave": true,
8552
  * "fnStateSave": function (oSettings, oData) {
@@ -8586,11 +8950,12 @@
8586
  *
8587
  * @example
8588
  * // Remove a saved filter, so filtering is never saved
8589
- * $(document).ready(function() {
8590
  * $('#example').dataTable( {
8591
  * "bStateSave": true,
8592
- * "fnStateLoadParams": function (oSettings, oData) {
8593
- * oData.oFilter.sSearch = "";
 
8594
  * } );
8595
  * } );
8596
  */
@@ -8607,7 +8972,7 @@
8607
  * @example
8608
  * $(document).ready( function() {
8609
  * $('#example').dataTable( {
8610
- * "iCookieDuration": 60*60*24 // 1 day
8611
  * } );
8612
  * } )
8613
  */
@@ -8620,19 +8985,38 @@
8620
  * will be applied to it), thus saving on an XHR at load time. iDeferLoading
8621
  * is used to indicate that deferred loading is required, but it is also used
8622
  * to tell DataTables how many records there are in the full table (allowing
8623
- * the information element and pagination to be displayed correctly).
8624
- * @type int
 
 
 
 
 
8625
  * @default null
8626
  * @dtopt Options
8627
  *
8628
  * @example
8629
- * $(document).ready(function() {
 
8630
  * $('#example').dataTable( {
8631
  * "bServerSide": true,
8632
  * "sAjaxSource": "scripts/server_processing.php",
8633
  * "iDeferLoading": 57
8634
  * } );
8635
  * } );
 
 
 
 
 
 
 
 
 
 
 
 
 
8636
  */
8637
  "iDeferLoading": null,
8638
 
@@ -8684,7 +9068,7 @@
8684
  * @dtopt Options
8685
  *
8686
  * @example
8687
- * $(document).ready(function() {
8688
  * $('#example').dataTable( {
8689
  * "bScrollInfinite": true,
8690
  * "bScrollCollapse": true,
@@ -8708,7 +9092,7 @@
8708
  * @dtopt Options
8709
  *
8710
  * @example
8711
- * $(document).ready(function() {
8712
  * $('#example').dataTable( {
8713
  * "iTabIndex": 1
8714
  * } );
@@ -8740,7 +9124,7 @@
8740
  * @dtopt Language
8741
  *
8742
  * @example
8743
- * $(document).ready(function() {
8744
  * $('#example').dataTable( {
8745
  * "oLanguage": {
8746
  * "oAria": {
@@ -8761,7 +9145,7 @@
8761
  * @dtopt Language
8762
  *
8763
  * @example
8764
- * $(document).ready(function() {
8765
  * $('#example').dataTable( {
8766
  * "oLanguage": {
8767
  * "oAria": {
@@ -8788,7 +9172,7 @@
8788
  * @dtopt Language
8789
  *
8790
  * @example
8791
- * $(document).ready(function() {
8792
  * $('#example').dataTable( {
8793
  * "oLanguage": {
8794
  * "oPaginate": {
@@ -8809,7 +9193,7 @@
8809
  * @dtopt Language
8810
  *
8811
  * @example
8812
- * $(document).ready(function() {
8813
  * $('#example').dataTable( {
8814
  * "oLanguage": {
8815
  * "oPaginate": {
@@ -8823,14 +9207,14 @@
8823
 
8824
 
8825
  /**
8826
- * Text to use when using the 'full_numbers' type of pagination for the
8827
- * button to take the user to the next page.
8828
  * @type string
8829
  * @default Next
8830
  * @dtopt Language
8831
  *
8832
  * @example
8833
- * $(document).ready(function() {
8834
  * $('#example').dataTable( {
8835
  * "oLanguage": {
8836
  * "oPaginate": {
@@ -8844,14 +9228,14 @@
8844
 
8845
 
8846
  /**
8847
- * Text to use when using the 'full_numbers' type of pagination for the
8848
- * button to take the user to the previous page.
8849
  * @type string
8850
  * @default Previous
8851
  * @dtopt Language
8852
  *
8853
  * @example
8854
- * $(document).ready(function() {
8855
  * $('#example').dataTable( {
8856
  * "oLanguage": {
8857
  * "oPaginate": {
@@ -8874,7 +9258,7 @@
8874
  * @dtopt Language
8875
  *
8876
  * @example
8877
- * $(document).ready(function() {
8878
  * $('#example').dataTable( {
8879
  * "oLanguage": {
8880
  * "sEmptyTable": "No data available in table"
@@ -8895,7 +9279,7 @@
8895
  * @dtopt Language
8896
  *
8897
  * @example
8898
- * $(document).ready(function() {
8899
  * $('#example').dataTable( {
8900
  * "oLanguage": {
8901
  * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
@@ -8914,7 +9298,7 @@
8914
  * @dtopt Language
8915
  *
8916
  * @example
8917
- * $(document).ready(function() {
8918
  * $('#example').dataTable( {
8919
  * "oLanguage": {
8920
  * "sInfoEmpty": "No entries to show"
@@ -8934,7 +9318,7 @@
8934
  * @dtopt Language
8935
  *
8936
  * @example
8937
- * $(document).ready(function() {
8938
  * $('#example').dataTable( {
8939
  * "oLanguage": {
8940
  * "sInfoFiltered": " - filtering from _MAX_ records"
@@ -8955,7 +9339,7 @@
8955
  * @dtopt Language
8956
  *
8957
  * @example
8958
- * $(document).ready(function() {
8959
  * $('#example').dataTable( {
8960
  * "oLanguage": {
8961
  * "sInfoPostFix": "All records shown are derived from real information."
@@ -8976,7 +9360,7 @@
8976
  * @dtopt Language
8977
  *
8978
  * @example
8979
- * $(document).ready(function() {
8980
  * $('#example').dataTable( {
8981
  * "oLanguage": {
8982
  * "sInfoThousands": "'"
@@ -8998,7 +9382,7 @@
8998
  *
8999
  * @example
9000
  * // Language change only
9001
- * $(document).ready(function() {
9002
  * $('#example').dataTable( {
9003
  * "oLanguage": {
9004
  * "sLengthMenu": "Display _MENU_ records"
@@ -9008,7 +9392,7 @@
9008
  *
9009
  * @example
9010
  * // Language and options change
9011
- * $(document).ready(function() {
9012
  * $('#example').dataTable( {
9013
  * "oLanguage": {
9014
  * "sLengthMenu": 'Display <select>'+
@@ -9056,7 +9440,7 @@
9056
  * @dtopt Language
9057
  *
9058
  * @example
9059
- * $(document).ready(function() {
9060
  * $('#example').dataTable( {
9061
  * "oLanguage": {
9062
  * "sProcessing": "DataTables is currently busy"
@@ -9079,7 +9463,7 @@
9079
  *
9080
  * @example
9081
  * // Input text box will be appended at the end automatically
9082
- * $(document).ready(function() {
9083
  * $('#example').dataTable( {
9084
  * "oLanguage": {
9085
  * "sSearch": "Filter records:"
@@ -9089,7 +9473,7 @@
9089
  *
9090
  * @example
9091
  * // Specify where the filter should appear
9092
- * $(document).ready(function() {
9093
  * $('#example').dataTable( {
9094
  * "oLanguage": {
9095
  * "sSearch": "Apply filter _INPUT_ to table"
@@ -9112,7 +9496,7 @@
9112
  * @dtopt Language
9113
  *
9114
  * @example
9115
- * $(document).ready(function() {
9116
  * $('#example').dataTable( {
9117
  * "oLanguage": {
9118
  * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
@@ -9132,7 +9516,7 @@
9132
  * @dtopt Language
9133
  *
9134
  * @example
9135
- * $(document).ready(function() {
9136
  * $('#example').dataTable( {
9137
  * "oLanguage": {
9138
  * "sZeroRecords": "No records to display"
@@ -9178,7 +9562,7 @@
9178
  *
9179
  * @example
9180
  * // Get data from { "data": [...] }
9181
- * $(document).ready(function() {
9182
  * var oTable = $('#example').dataTable( {
9183
  * "sAjaxSource": "sources/data.txt",
9184
  * "sAjaxDataProp": "data"
@@ -9187,7 +9571,7 @@
9187
  *
9188
  * @example
9189
  * // Get data from { "data": { "inner": [...] } }
9190
- * $(document).ready(function() {
9191
  * var oTable = $('#example').dataTable( {
9192
  * "sAjaxSource": "sources/data.txt",
9193
  * "sAjaxDataProp": "data.inner"
@@ -9225,7 +9609,7 @@
9225
  * @dtopt Options
9226
  *
9227
  * @example
9228
- * $(document).ready(function() {
9229
  * $('#example').dataTable( {
9230
  * "sCookiePrefix": "my_datatable_",
9231
  * } );
@@ -9277,9 +9661,9 @@
9277
  * @dtopt Options
9278
  *
9279
  * @example
9280
- * $(document).ready(function() {
9281
  * $('#example').dataTable( {
9282
- * "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&lgt;'
9283
  * } );
9284
  * } );
9285
  */
@@ -9308,14 +9692,14 @@
9308
  * Enable horizontal scrolling. When a table is too wide to fit into a certain
9309
  * layout, or you have a large number of columns in the table, you can enable
9310
  * x-scrolling to show the table in a viewport, which can be scrolled. This
9311
- * property can by any CSS unit, or a number (in which case it will be treated
9312
  * as a pixel measurement).
9313
  * @type string
9314
  * @default <i>blank string - i.e. disabled</i>
9315
  * @dtopt Features
9316
  *
9317
  * @example
9318
- * $(document).ready(function() {
9319
  * $('#example').dataTable( {
9320
  * "sScrollX": "100%",
9321
  * "bScrollCollapse": true
@@ -9337,7 +9721,7 @@
9337
  * @dtopt Options
9338
  *
9339
  * @example
9340
- * $(document).ready(function() {
9341
  * $('#example').dataTable( {
9342
  * "sScrollX": "100%",
9343
  * "sScrollXInner": "110%"
@@ -9349,17 +9733,17 @@
9349
 
9350
  /**
9351
  * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
9352
- * to the given height, an enable scrolling for any data which overflows the
9353
  * current viewport. This can be used as an alternative to paging to display
9354
  * a lot of data in a small area (although paging and scrolling can both be
9355
- * enabled at the same time). This property can by any CSS unit, or a number
9356
  * (in which case it will be treated as a pixel measurement).
9357
  * @type string
9358
  * @default <i>blank string - i.e. disabled</i>
9359
  * @dtopt Features
9360
  *
9361
  * @example
9362
- * $(document).ready(function() {
9363
  * $('#example').dataTable( {
9364
  * "sScrollY": "200px",
9365
  * "bPaginate": false
@@ -9378,7 +9762,7 @@
9378
  * @dtopt Server-side
9379
  *
9380
  * @example
9381
- * $(document).ready(function() {
9382
  * $('#example').dataTable( {
9383
  * "bServerSide": true,
9384
  * "sAjaxSource": "scripts/post.php",
@@ -9406,7 +9790,7 @@
9406
  *
9407
  * @example
9408
  * // Using aoColumnDefs
9409
- * $(document).ready(function() {
9410
  * $('#example').dataTable( {
9411
  * "aoColumnDefs": [
9412
  * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
@@ -9418,7 +9802,7 @@
9418
  *
9419
  * @example
9420
  * // Using aoColumns
9421
- * $(document).ready(function() {
9422
  * $('#example').dataTable( {
9423
  * "aoColumns": [
9424
  * { "aDataSort": [ 0, 1 ] },
@@ -9443,7 +9827,7 @@
9443
  *
9444
  * @example
9445
  * // Using aoColumnDefs
9446
- * $(document).ready(function() {
9447
  * $('#example').dataTable( {
9448
  * "aoColumnDefs": [
9449
  * { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
@@ -9455,7 +9839,7 @@
9455
  *
9456
  * @example
9457
  * // Using aoColumns
9458
- * $(document).ready(function() {
9459
  * $('#example').dataTable( {
9460
  * "aoColumns": [
9461
  * null,
@@ -9478,7 +9862,7 @@
9478
  *
9479
  * @example
9480
  * // Using aoColumnDefs
9481
- * $(document).ready(function() {
9482
  * $('#example').dataTable( {
9483
  * "aoColumnDefs": [
9484
  * { "bSearchable": false, "aTargets": [ 0 ] }
@@ -9487,7 +9871,7 @@
9487
  *
9488
  * @example
9489
  * // Using aoColumns
9490
- * $(document).ready(function() {
9491
  * $('#example').dataTable( {
9492
  * "aoColumns": [
9493
  * { "bSearchable": false },
@@ -9509,7 +9893,7 @@
9509
  *
9510
  * @example
9511
  * // Using aoColumnDefs
9512
- * $(document).ready(function() {
9513
  * $('#example').dataTable( {
9514
  * "aoColumnDefs": [
9515
  * { "bSortable": false, "aTargets": [ 0 ] }
@@ -9518,7 +9902,7 @@
9518
  *
9519
  * @example
9520
  * // Using aoColumns
9521
- * $(document).ready(function() {
9522
  * $('#example').dataTable( {
9523
  * "aoColumns": [
9524
  * { "bSortable": false },
@@ -9533,51 +9917,18 @@
9533
 
9534
 
9535
  /**
9536
- * When using fnRender() for a column, you may wish to use the original data
9537
- * (before rendering) for sorting and filtering (the default is to used the
9538
- * rendered data that the user can see). This may be useful for dates etc.
 
9539
  *
9540
- * *NOTE* It is it is advisable now to use mDataProp as a function and make
9541
- * use of the 'type' that it gives, allowing (potentially) different data to
9542
- * be used for sorting, filtering, display and type detection.
9543
  * @type boolean
9544
  * @default true
9545
  * @dtopt Columns
9546
- *
9547
- * @example
9548
- * // Using aoColumnDefs
9549
- * $(document).ready(function() {
9550
- * $('#example').dataTable( {
9551
- * "aoColumnDefs": [
9552
- * {
9553
- * "fnRender": function ( oObj ) {
9554
- * return oObj.aData[0] +' '+ oObj.aData[3];
9555
- * },
9556
- * "bUseRendered": false,
9557
- * "aTargets": [ 0 ]
9558
- * }
9559
- * ]
9560
- * } );
9561
- * } );
9562
- *
9563
- * @example
9564
- * // Using aoColumns
9565
- * $(document).ready(function() {
9566
- * $('#example').dataTable( {
9567
- * "aoColumns": [
9568
- * {
9569
- * "fnRender": function ( oObj ) {
9570
- * return oObj.aData[0] +' '+ oObj.aData[3];
9571
- * },
9572
- * "bUseRendered": false
9573
- * },
9574
- * null,
9575
- * null,
9576
- * null,
9577
- * null
9578
- * ]
9579
- * } );
9580
- * } );
9581
  */
9582
  "bUseRendered": true,
9583
 
@@ -9590,7 +9941,7 @@
9590
  *
9591
  * @example
9592
  * // Using aoColumnDefs
9593
- * $(document).ready(function() {
9594
  * $('#example').dataTable( {
9595
  * "aoColumnDefs": [
9596
  * { "bVisible": false, "aTargets": [ 0 ] }
@@ -9599,7 +9950,7 @@
9599
  *
9600
  * @example
9601
  * // Using aoColumns
9602
- * $(document).ready(function() {
9603
  * $('#example').dataTable( {
9604
  * "aoColumns": [
9605
  * { "bVisible": false },
@@ -9615,9 +9966,9 @@
9615
 
9616
  /**
9617
  * Developer definable function that is called whenever a cell is created (Ajax source,
9618
- * etc) or processed for input (DOM source). This can be used as a compliment to fnRender
9619
  * allowing you to modify the DOM element (add background colour for example) when the
9620
- * element is available (since it is not when fnRender is called).
9621
  * @type function
9622
  * @param {element} nTd The TD node that has been created
9623
  * @param {*} sData The Data for the cell
@@ -9627,7 +9978,7 @@
9627
  * @dtopt Columns
9628
  *
9629
  * @example
9630
- * $(document).ready(function() {
9631
  * $('#example').dataTable( {
9632
  * "aoColumnDefs": [ {
9633
  * "aTargets": [3],
@@ -9644,8 +9995,12 @@
9644
 
9645
 
9646
  /**
9647
- * Custom display function that will be called for the display of each cell in
9648
- * this column.
 
 
 
 
9649
  * @type function
9650
  * @param {object} o Object with the following parameters:
9651
  * @param {int} o.iDataRow The row in aoData
@@ -9656,37 +10011,7 @@
9656
  * @param {*} val The current cell value
9657
  * @returns {string} The string you which to use in the display
9658
  * @dtopt Columns
9659
- *
9660
- * @example
9661
- * // Using aoColumnDefs
9662
- * $(document).ready(function() {
9663
- * $('#example').dataTable( {
9664
- * "aoColumnDefs": [
9665
- * {
9666
- * "fnRender": function ( o, val ) {
9667
- * return o.aData[0] +' '+ o.aData[3];
9668
- * },
9669
- * "aTargets": [ 0 ]
9670
- * }
9671
- * ]
9672
- * } );
9673
- * } );
9674
- *
9675
- * @example
9676
- * // Using aoColumns
9677
- * $(document).ready(function() {
9678
- * $('#example').dataTable( {
9679
- * "aoColumns": [
9680
- * { "fnRender": function ( o, val ) {
9681
- * return o.aData[0] +' '+ o.aData[3];
9682
- * } },
9683
- * null,
9684
- * null,
9685
- * null,
9686
- * null
9687
- * ]
9688
- * } );
9689
- * } );
9690
  */
9691
  "fnRender": null,
9692
 
@@ -9701,7 +10026,7 @@
9701
  *
9702
  * @example
9703
  * // Using aoColumnDefs
9704
- * $(document).ready(function() {
9705
  * $('#example').dataTable( {
9706
  * "aoColumnDefs": [
9707
  * { "iDataSort": 1, "aTargets": [ 0 ] }
@@ -9711,7 +10036,7 @@
9711
  *
9712
  * @example
9713
  * // Using aoColumns
9714
- * $(document).ready(function() {
9715
  * $('#example').dataTable( {
9716
  * "aoColumns": [
9717
  * { "iDataSort": 1 },
@@ -9726,61 +10051,76 @@
9726
  "iDataSort": -1,
9727
 
9728
 
 
 
 
 
 
 
 
 
 
9729
  /**
9730
  * This property can be used to read data from any JSON data source property,
9731
- * including deeply nested objects / properties. mDataProp can be given in a
9732
  * number of different ways which effect its behaviour:
9733
  * <ul>
9734
  * <li>integer - treated as an array index for the data source. This is the
9735
  * default that DataTables uses (incrementally increased for each column).</li>
9736
  * <li>string - read an object property from the data source. Note that you can
9737
- * use Javascript dotted notation to read deep properties/arrays from the
9738
  * data source.</li>
9739
- * <li>null - the sDafaultContent option will use used for the cell (empty
9740
- * string by default. This can be useful on generated columns such as
9741
- * edit / delete action columns.</li>
 
9742
  * <li>function - the function given will be executed whenever DataTables
9743
  * needs to set or get the data for a cell in the column. The function
9744
  * takes three parameters:
9745
  * <ul>
9746
  * <li>{array|object} The data source for the row</li>
9747
  * <li>{string} The type call data requested - this will be 'set' when
9748
- * setting data or 'filter', 'display', 'type' or 'sort' when gathering
9749
- * data.</li>
 
9750
  * <li>{*} Data to set when the second parameter is 'set'.</li>
9751
  * </ul>
9752
  * The return value from the function is not required when 'set' is the type
9753
  * of call, but otherwise the return is what will be used for the data
9754
  * requested.</li>
9755
  * </ul>
 
 
 
 
 
9756
  * @type string|int|function|null
9757
  * @default null <i>Use automatically calculated column index</i>
9758
  * @dtopt Columns
9759
  *
9760
  * @example
9761
  * // Read table data from objects
9762
- * $(document).ready(function() {
9763
  * var oTable = $('#example').dataTable( {
9764
  * "sAjaxSource": "sources/deep.txt",
9765
  * "aoColumns": [
9766
- * { "mDataProp": "engine" },
9767
- * { "mDataProp": "browser" },
9768
- * { "mDataProp": "platform.inner" },
9769
- * { "mDataProp": "platform.details.0" },
9770
- * { "mDataProp": "platform.details.1" }
9771
  * ]
9772
  * } );
9773
  * } );
9774
  *
9775
  * @example
9776
- * // Using mDataProp as a function to provide different information for
9777
  * // sorting, filtering and display. In this case, currency (price)
9778
- * $(document).ready(function() {
9779
  * var oTable = $('#example').dataTable( {
9780
- * "aoColumnDefs": [
9781
- * {
9782
  * "aTargets": [ 0 ],
9783
- * "mDataProp": function ( source, type, val ) {
9784
  * if (type === 'set') {
9785
  * source.price = val;
9786
  * // Store the computed dislay and filter values for efficiency
@@ -9794,14 +10134,105 @@
9794
  * else if (type === 'filter') {
9795
  * return source.price_filter;
9796
  * }
9797
- * // 'sort' and 'type' both just use the integer
9798
  * return source.price;
9799
  * }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9800
  * ]
9801
  * } );
9802
  * } );
9803
  */
9804
- "mDataProp": null,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9805
 
9806
 
9807
  /**
@@ -9812,7 +10243,7 @@
9812
  *
9813
  * @example
9814
  * // Using aoColumnDefs
9815
- * $(document).ready(function() {
9816
  * $('#example').dataTable( {
9817
  * "aoColumnDefs": [
9818
  * { "sClass": "my_class", "aTargets": [ 0 ] }
@@ -9822,7 +10253,7 @@
9822
  *
9823
  * @example
9824
  * // Using aoColumns
9825
- * $(document).ready(function() {
9826
  * $('#example').dataTable( {
9827
  * "aoColumns": [
9828
  * { "sClass": "my_class" },
@@ -9853,7 +10284,7 @@
9853
  *
9854
  * @example
9855
  * // Using aoColumns
9856
- * $(document).ready(function() {
9857
  * $('#example').dataTable( {
9858
  * "aoColumns": [
9859
  * null,
@@ -9871,7 +10302,7 @@
9871
 
9872
  /**
9873
  * Allows a default value to be given for a column's data, and will be used
9874
- * whenever a null data source is encountered (this can be because mDataProp
9875
  * is set to null, or because the data source itself is null).
9876
  * @type string
9877
  * @default null
@@ -9879,11 +10310,11 @@
9879
  *
9880
  * @example
9881
  * // Using aoColumnDefs
9882
- * $(document).ready(function() {
9883
  * $('#example').dataTable( {
9884
  * "aoColumnDefs": [
9885
  * {
9886
- * "mDataProp": null,
9887
  * "sDefaultContent": "Edit",
9888
  * "aTargets": [ -1 ]
9889
  * }
@@ -9893,14 +10324,14 @@
9893
  *
9894
  * @example
9895
  * // Using aoColumns
9896
- * $(document).ready(function() {
9897
  * $('#example').dataTable( {
9898
  * "aoColumns": [
9899
  * null,
9900
  * null,
9901
  * null,
9902
  * {
9903
- * "mDataProp": null,
9904
  * "sDefaultContent": "Edit"
9905
  * }
9906
  * ]
@@ -9923,7 +10354,7 @@
9923
  *
9924
  * @example
9925
  * // Using aoColumnDefs
9926
- * $(document).ready(function() {
9927
  * $('#example').dataTable( {
9928
  * "aoColumnDefs": [
9929
  * { "sName": "engine", "aTargets": [ 0 ] },
@@ -9937,7 +10368,7 @@
9937
  *
9938
  * @example
9939
  * // Using aoColumns
9940
- * $(document).ready(function() {
9941
  * $('#example').dataTable( {
9942
  * "aoColumns": [
9943
  * { "sName": "engine" },
@@ -9954,7 +10385,7 @@
9954
 
9955
  /**
9956
  * Defines a data source type for the sorting which can be used to read
9957
- * realtime information from the table (updating the internally cached
9958
  * version) prior to sorting. This allows sorting to occur on user editable
9959
  * elements such as form inputs.
9960
  * @type string
@@ -9963,7 +10394,7 @@
9963
  *
9964
  * @example
9965
  * // Using aoColumnDefs
9966
- * $(document).ready(function() {
9967
  * $('#example').dataTable( {
9968
  * "aoColumnDefs": [
9969
  * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
@@ -9976,7 +10407,7 @@
9976
  *
9977
  * @example
9978
  * // Using aoColumns
9979
- * $(document).ready(function() {
9980
  * $('#example').dataTable( {
9981
  * "aoColumns": [
9982
  * null,
@@ -10001,7 +10432,7 @@
10001
  *
10002
  * @example
10003
  * // Using aoColumnDefs
10004
- * $(document).ready(function() {
10005
  * $('#example').dataTable( {
10006
  * "aoColumnDefs": [
10007
  * { "sTitle": "My column title", "aTargets": [ 0 ] }
@@ -10011,7 +10442,7 @@
10011
  *
10012
  * @example
10013
  * // Using aoColumns
10014
- * $(document).ready(function() {
10015
  * $('#example').dataTable( {
10016
  * "aoColumns": [
10017
  * { "sTitle": "My column title" },
@@ -10040,7 +10471,7 @@
10040
  *
10041
  * @example
10042
  * // Using aoColumnDefs
10043
- * $(document).ready(function() {
10044
  * $('#example').dataTable( {
10045
  * "aoColumnDefs": [
10046
  * { "sType": "html", "aTargets": [ 0 ] }
@@ -10050,7 +10481,7 @@
10050
  *
10051
  * @example
10052
  * // Using aoColumns
10053
- * $(document).ready(function() {
10054
  * $('#example').dataTable( {
10055
  * "aoColumns": [
10056
  * { "sType": "html" },
@@ -10067,7 +10498,7 @@
10067
 
10068
  /**
10069
  * Defining the width of the column, this parameter may take any CSS value
10070
- * (3em, 20px etc). DataTables applys 'smart' widths to columns which have not
10071
  * been given a specific width through this interface ensuring that the table
10072
  * remains readable.
10073
  * @type string
@@ -10076,7 +10507,7 @@
10076
  *
10077
  * @example
10078
  * // Using aoColumnDefs
10079
- * $(document).ready(function() {
10080
  * $('#example').dataTable( {
10081
  * "aoColumnDefs": [
10082
  * { "sWidth": "20%", "aTargets": [ 0 ] }
@@ -10086,7 +10517,7 @@
10086
  *
10087
  * @example
10088
  * // Using aoColumns
10089
- * $(document).ready(function() {
10090
  * $('#example').dataTable( {
10091
  * "aoColumns": [
10092
  * { "sWidth": "20%" },
@@ -10326,11 +10757,25 @@
10326
  * Information callback function. See
10327
  * {@link DataTable.defaults.fnInfoCallback}
10328
  * @type function
10329
- * @default
10330
  */
10331
  "fnInfoCallback": null
10332
  },
10333
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10334
  /**
10335
  * Array referencing the nodes which are used for the features. The
10336
  * parameters of this object match what is allowed by sDom - i.e.
@@ -10957,7 +11402,17 @@
10957
  * tabindex attribute value that is added to DataTables control elements, allowing
10958
  * keyboard navigation of the table and its controls.
10959
  */
10960
- "iTabIndex": 0
 
 
 
 
 
 
 
 
 
 
10961
  };
10962
 
10963
  /**
@@ -11031,7 +11486,9 @@
11031
  "sScrollFootInner": "dataTables_scrollFootInner",
11032
 
11033
  /* Misc */
11034
- "sFooterTH": ""
 
 
11035
  } );
11036
 
11037
 
@@ -11075,10 +11532,11 @@
11075
  "sScrollFoot": "dataTables_scrollFoot ui-state-default",
11076
 
11077
  /* Misc */
11078
- "sFooterTH": "ui-state-default"
 
 
11079
  } );
11080
 
11081
-
11082
  /*
11083
  * Variable: oPagination
11084
  * Purpose:
@@ -11153,17 +11611,22 @@
11153
 
11154
  var oClasses = oSettings.oClasses;
11155
  var an = oSettings.aanFeatures.p;
 
11156
 
11157
  /* Loop over each instance of the pager */
11158
  for ( var i=0, iLen=an.length ; i<iLen ; i++ )
11159
  {
11160
- if ( an[i].childNodes.length !== 0 )
 
11161
  {
11162
- an[i].childNodes[0].className = ( oSettings._iDisplayStart === 0 ) ?
11163
- oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
11164
-
11165
- an[i].childNodes[1].className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
11166
- oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
 
 
 
11167
  }
11168
  }
11169
  }
@@ -11252,7 +11715,7 @@
11252
  var sList = "";
11253
  var iStartButton, iEndButton, i, iLen;
11254
  var oClasses = oSettings.oClasses;
11255
- var anButtons, anStatic, nPaginateList;
11256
  var an = oSettings.aanFeatures.p;
11257
  var fnBind = function (j) {
11258
  oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
@@ -11264,7 +11727,13 @@
11264
  };
11265
 
11266
  /* Pages calculation */
11267
- if (iPages < iPageCount)
 
 
 
 
 
 
11268
  {
11269
  iStartButton = 1;
11270
  iEndButton = iPages;
@@ -11284,6 +11753,7 @@
11284
  iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
11285
  iEndButton = iStartButton + iPageCount - 1;
11286
  }
 
11287
 
11288
  /* Build the dynamic list */
11289
  for ( i=iStartButton ; i<=iEndButton ; i++ )
@@ -11296,18 +11766,19 @@
11296
  /* Loop over each instance of the pager */
11297
  for ( i=0, iLen=an.length ; i<iLen ; i++ )
11298
  {
11299
- if ( an[i].childNodes.length === 0 )
 
11300
  {
11301
  continue;
11302
  }
11303
 
11304
- /* Build up the dynamic list forst - html and listeners */
11305
- $('span:eq(0)', an[i])
11306
  .html( sList )
11307
  .children('a').each( fnBind );
11308
 
11309
- /* Update the premanent botton's classes */
11310
- anButtons = an[i].getElementsByTagName('a');
11311
  anStatic = [
11312
  anButtons[0], anButtons[1],
11313
  anButtons[anButtons.length-2], anButtons[anButtons.length-1]
@@ -11335,7 +11806,9 @@
11335
  */
11336
  "string-pre": function ( a )
11337
  {
11338
- if ( typeof a != 'string' ) { a = ''; }
 
 
11339
  return a.toLowerCase();
11340
  },
11341
 
@@ -11608,5 +12081,19 @@
11608
  * @event
11609
  * @param {event} e jQuery event object
11610
  * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
 
 
 
 
 
 
 
 
 
 
 
11611
  */
11612
- }(jQuery, window, document, undefined));
 
 
 
1
  /**
2
  * @summary DataTables
3
  * @description Paginate, search and sort HTML tables
4
+ * @version 1.9.4
5
  * @file jquery.dataTables.js
6
  * @author Allan Jardine (www.sprymedia.co.uk)
7
  * @contact www.sprymedia.co.uk/contact
21
  */
22
 
23
  /*jslint evil: true, undef: true, browser: true */
24
+ /*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
25
 
26
+ (/** @lends <global> */function( window, document, undefined ) {
27
+
28
+ (function( factory ) {
29
+ "use strict";
30
+
31
+ // Define as an AMD module if possible
32
+ if ( typeof define === 'function' && define.amd )
33
+ {
34
+ define( ['jquery'], factory );
35
+ }
36
+ /* Define using browser globals otherwise
37
+ * Prevent multiple instantiations if the script is loaded twice
38
+ */
39
+ else if ( jQuery && !jQuery.fn.dataTable )
40
+ {
41
+ factory( jQuery );
42
+ }
43
+ }
44
+ (/** @lends <global> */function( $ ) {
45
+ "use strict";
46
  /**
47
  * DataTables is a plug-in for the jQuery Javascript library. It is a
48
  * highly flexible tool, based upon the foundations of progressive
95
  "nTh": nTh ? nTh : document.createElement('th'),
96
  "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
97
  "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
98
+ "mData": oDefaults.mData ? oDefaults.oDefaults : iCol
99
  } );
100
  oSettings.aoColumns.push( oCol );
101
 
134
  * Apply options for a column
135
  * @param {object} oSettings dataTables settings object
136
  * @param {int} iCol column index to consider
137
+ * @param {object} oOptions object with sType, bVisible and bSearchable etc
138
  * @memberof DataTable#oApi
139
  */
140
  function _fnColumnOptions( oSettings, iCol, oOptions )
144
  /* User specified column options */
145
  if ( oOptions !== undefined && oOptions !== null )
146
  {
147
+ /* Backwards compatibility for mDataProp */
148
+ if ( oOptions.mDataProp && !oOptions.mData )
149
+ {
150
+ oOptions.mData = oOptions.mDataProp;
151
+ }
152
+
153
  if ( oOptions.sType !== undefined )
154
  {
155
  oCol.sType = oOptions.sType;
170
  }
171
 
172
  /* Cache the data get and set functions for speed */
173
+ var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
174
+ var mData = _fnGetObjectDataFn( oCol.mData );
175
+
176
+ oCol.fnGetData = function (oData, sSpecific) {
177
+ var innerData = mData( oData, sSpecific );
178
+
179
+ if ( oCol.mRender && (sSpecific && sSpecific !== '') )
180
+ {
181
+ return mRender( innerData, sSpecific, oData );
182
+ }
183
+ return innerData;
184
+ };
185
+ oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
186
 
187
  /* Feature sorting overrides column specific when off */
188
  if ( !oSettings.oFeatures.bSort )
197
  oCol.sSortingClass = oSettings.oClasses.sSortableNone;
198
  oCol.sSortingClassJUI = "";
199
  }
200
+ else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
 
201
  {
202
+ oCol.sSortingClass = oSettings.oClasses.sSortable;
203
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
204
  }
205
  else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
206
  {
223
  */
224
  function _fnAdjustColumnSizing ( oSettings )
225
  {
226
+ /* Not interested in doing column width calculation if auto-width is disabled */
227
  if ( oSettings.oFeatures.bAutoWidth === false )
228
  {
229
  return false;
247
  */
248
  function _fnVisibleToColumnIndex( oSettings, iMatch )
249
  {
250
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
251
+
252
+ return typeof aiVis[iMatch] === 'number' ?
253
+ aiVis[iMatch] :
254
+ null;
 
 
 
 
 
 
 
 
 
 
 
255
  }
256
 
257
 
265
  */
266
  function _fnColumnIndexToVisible( oSettings, iMatch )
267
  {
268
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
269
+ var iPos = $.inArray( iMatch, aiVis );
270
+
271
+ return iPos !== -1 ? iPos : null;
 
 
 
 
 
 
 
 
 
 
 
272
  }
273
 
274
 
275
  /**
276
  * Get the number of visible columns
277
+ * @param {object} oSettings dataTables settings object
278
  * @returns {int} i the number of visible columns
 
279
  * @memberof DataTable#oApi
280
  */
281
+ function _fnVisbleColumns( oSettings )
282
  {
283
+ return _fnGetColumns( oSettings, 'bVisible' ).length;
284
+ }
285
+
286
+
287
+ /**
288
+ * Get an array of column indexes that match a given property
289
+ * @param {object} oSettings dataTables settings object
290
+ * @param {string} sParam Parameter in aoColumns to look for - typically
291
+ * bVisible or bSearchable
292
+ * @returns {array} Array of indexes with matched properties
293
+ * @memberof DataTable#oApi
294
+ */
295
+ function _fnGetColumns( oSettings, sParam )
296
+ {
297
+ var a = [];
298
+
299
+ $.map( oSettings.aoColumns, function(val, i) {
300
+ if ( val[sParam] ) {
301
+ a.push( i );
302
  }
303
+ } );
304
+
305
+ return a;
306
  }
307
 
308
 
450
  }
451
  }
452
 
 
 
453
  /**
454
  * Add a data array to the table, creating DOM node etc. This is the parallel to
455
  * _fnGatherData, but for adding rows from a Javascript source, rather than a
470
 
471
  /* Create the object for storing information about this new row */
472
  var iRow = oSettings.aoData.length;
473
+ var oData = $.extend( true, {}, DataTable.models.oRow );
474
+ oData._aData = aDataIn;
 
475
  oSettings.aoData.push( oData );
476
 
477
  /* Create the cells */
480
  {
481
  oCol = oSettings.aoColumns[i];
482
 
483
+ /* Use rendered data for filtering / sorting */
484
+ if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
485
  {
486
  _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
487
  }
488
+ else
489
+ {
490
+ _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
491
+ }
492
 
493
  /* See if we should auto-detect the column type */
494
  if ( oCol._bAutoType && oCol.sType != 'string' )
514
  /* Add to the display array */
515
  oSettings.aiDisplayMaster.push( iRow );
516
 
517
+ /* Create the DOM information */
518
  if ( !oSettings.oFeatures.bDeferRender )
519
  {
520
  _fnCreateTr( oSettings, iRow );
532
  function _fnGatherData( oSettings )
533
  {
534
  var iLoop, i, iLen, j, jLen, jInner,
535
+ nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
536
  iRow, iRows, iColumn, iColumns, sNodeName,
537
  oCol, oData;
538
 
543
  */
544
  if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
545
  {
546
+ nTr = oSettings.nTBody.firstChild;
547
+ while ( nTr )
548
  {
549
+ if ( nTr.nodeName.toUpperCase() == "TR" )
550
  {
551
  iThisIndex = oSettings.aoData.length;
552
+ nTr._DT_RowIndex = iThisIndex;
553
  oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
554
+ "nTr": nTr
555
  } ) );
556
+
557
  oSettings.aiDisplayMaster.push( iThisIndex );
558
+ nTd = nTr.firstChild;
559
  jInner = 0;
560
+ while ( nTd )
 
561
  {
562
+ sNodeName = nTd.nodeName.toUpperCase();
563
  if ( sNodeName == "TD" || sNodeName == "TH" )
564
  {
565
+ _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
566
  jInner++;
567
  }
568
+ nTd = nTd.nextSibling;
569
  }
570
  }
571
+ nTr = nTr.nextSibling;
572
  }
573
  }
574
 
580
  nTds = [];
581
  for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
582
  {
583
+ nTd = nTrs[i].firstChild;
584
+ while ( nTd )
585
  {
 
586
  sNodeName = nTd.nodeName.toUpperCase();
587
  if ( sNodeName == "TD" || sNodeName == "TH" )
588
  {
589
  nTds.push( nTd );
590
  }
591
+ nTd = nTd.nextSibling;
592
  }
593
  }
594
 
638
  }
639
  }
640
 
641
+ if ( oCol.mRender )
642
+ {
643
+ // mRender has been defined, so we need to get the value and set it
644
+ nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
645
+ }
646
+ else if ( oCol.mData !== iColumn )
647
  {
648
+ // If mData is not the same as the column number, then we need to
649
+ // get the dev set value. If it is the column, no point in wasting
650
+ // time setting the value that is already there!
651
  nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
652
  }
653
 
658
  nCell.innerHTML = sRendered;
659
  if ( oCol.bUseRendered )
660
  {
661
+ /* Use the rendered data for filtering / sorting */
662
  _fnSetCellData( oSettings, iRow, iColumn, sRendered );
663
  }
664
  }
669
  nCell.className += ' '+oCol.sClass;
670
  }
671
 
672
+ /* Column visibility */
673
  if ( !bVisible )
674
  {
675
  oData._anHidden[iColumn] = nCell;
743
  * @param {object} oSettings dataTables settings object
744
  * @param {int} iRow aoData row id
745
  * @param {string} sSpecific data get type ('type' 'filter' 'sort')
746
+ * @param {array} aiColumns Array of column indexes to get data from
747
  * @returns {array} Data array
748
  * @memberof DataTable#oApi
749
  */
750
+ function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
751
  {
752
  var out = [];
753
+ for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
754
  {
755
+ out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
756
  }
757
  return out;
758
  }
777
  {
778
  if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
779
  {
780
+ _fnLog( oSettings, 0, "Requested unknown parameter "+
781
+ (typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
782
+ " from the data source for row "+iRow );
783
  oSettings.iDrawError = oSettings.iDraw;
784
  }
785
  return oCol.sDefaultContent;
821
  }
822
 
823
 
824
+ // Private variable that is used to match array syntax in the data property object
825
+ var __reArray = /\[.*?\]$/;
826
+
827
  /**
828
  * Return a function that can be used to get data from a source object, taking
829
  * into account the ability to use nested objects as a source
842
  }
843
  else if ( typeof mSource === 'function' )
844
  {
845
+ return function (data, type, extra) {
846
+ return mSource( data, type, extra );
847
  };
848
  }
849
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
850
  {
851
  /* If there is a . in the source string then the data source is in a
852
  * nested object so we loop over the data for each level to get the next
853
+ * level down. On each loop we test for undefined, and if found immediately
854
  * return. This allows entire objects to be missing and sDefaultContent to
855
  * be used if defined, rather than throwing an error
856
  */
857
+ var fetchData = function (data, type, src) {
858
+ var a = src.split('.');
859
+ var arrayNotation, out, innerSrc;
860
+
861
+ if ( src !== "" )
862
  {
863
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
 
864
  {
865
+ // Check if we are dealing with an array notation request
866
+ arrayNotation = a[i].match(__reArray);
867
+
868
+ if ( arrayNotation ) {
869
+ a[i] = a[i].replace(__reArray, '');
870
+
871
+ // Condition allows simply [] to be passed in
872
+ if ( a[i] !== "" ) {
873
+ data = data[ a[i] ];
874
+ }
875
+ out = [];
876
+
877
+ // Get the remainder of the nested object to get
878
+ a.splice( 0, i+1 );
879
+ innerSrc = a.join('.');
880
+
881
+ // Traverse each entry in the array getting the properties requested
882
+ for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
883
+ out.push( fetchData( data[j], type, innerSrc ) );
884
+ }
885
+
886
+ // If a string is given in between the array notation indicators, that
887
+ // is used to join the strings together, otherwise an array is returned
888
+ var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
889
+ data = (join==="") ? out : out.join(join);
890
+
891
+ // The inner call to fetchData has already traversed through the remainder
892
+ // of the source requested, so we exit from the loop
893
+ break;
894
+ }
895
+
896
+ if ( data === null || data[ a[i] ] === undefined )
897
+ {
898
+ return undefined;
899
+ }
900
+ data = data[ a[i] ];
901
  }
902
  }
903
+
904
  return data;
905
  };
906
+
907
+ return function (data, type) {
908
+ return fetchData( data, type, mSource );
909
+ };
910
  }
911
  else
912
  {
938
  mSource( data, 'set', val );
939
  };
940
  }
941
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
942
  {
943
+ /* Like the get, we need to get data from a nested object */
944
+ var setData = function (data, val, src) {
945
+ var a = src.split('.'), b;
946
+ var arrayNotation, o, innerSrc;
947
+
948
  for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
949
  {
950
+ // Check if we are dealing with an array notation request
951
+ arrayNotation = a[i].match(__reArray);
952
+
953
+ if ( arrayNotation )
954
+ {
955
+ a[i] = a[i].replace(__reArray, '');
956
+ data[ a[i] ] = [];
957
+
958
+ // Get the remainder of the nested object to set so we can recurse
959
+ b = a.slice();
960
+ b.splice( 0, i+1 );
961
+ innerSrc = b.join('.');
962
+
963
+ // Traverse each entry in the array setting the properties requested
964
+ for ( var j=0, jLen=val.length ; j<jLen ; j++ )
965
+ {
966
+ o = {};
967
+ setData( o, val[j], innerSrc );
968
+ data[ a[i] ].push( o );
969
+ }
970
+
971
+ // The inner call to setData has already traversed through the remainder
972
+ // of the source and has set the data, thus we can exit here
973
+ return;
974
+ }
975
+
976
+ // If the nested object doesn't currently exist - since we are
977
+ // trying to set the value - create it
978
+ if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
979
+ {
980
+ data[ a[i] ] = {};
981
+ }
982
  data = data[ a[i] ];
983
  }
984
+
985
+ // If array notation is used, we just want to strip it and use the property name
986
+ // and assign the value. If it isn't used, then we get the result we want anyway
987
+ data[ a[a.length-1].replace(__reArray, '') ] = val;
988
+ };
989
+
990
+ return function (data, val) {
991
+ return setData( data, val, mSource );
992
  };
993
  }
994
  else
1081
  "iDataColumn": iCol,
1082
  "oSettings": oSettings,
1083
  "aData": oSettings.aoData[iRow]._aData,
1084
+ "mDataProp": oCol.mData
1085
  }, _fnGetCellData(oSettings, iRow, iCol, 'display') );
1086
  }
 
 
1087
  /**
1088
  * Create a new TR element (and it's TD children) for a row
1089
  * @param {object} oSettings dataTables settings object
1112
 
1113
  if ( oData._aData.DT_RowClass )
1114
  {
1115
+ oData.nTr.className = oData._aData.DT_RowClass;
1116
  }
1117
 
1118
  /* Process each column */
1119
  for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1120
  {
1121
  var oCol = oSettings.aoColumns[i];
1122
+ nTd = document.createElement( oCol.sCellType );
1123
 
1124
  /* Render if needed - if bUseRendered is true then we already have the rendered
1125
  * value in the data source - so can just use that
1126
  */
1127
+ nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
1128
  _fnRender( oSettings, iRow, i ) :
1129
  _fnGetCellData( oSettings, iRow, i, 'display' );
1130
 
1165
  function _fnBuildHead( oSettings )
1166
  {
1167
  var i, nTh, iLen, j, jLen;
1168
+ var iThs = $('th, td', oSettings.nTHead).length;
1169
  var iCorrector = 0;
1170
  var jqChildren;
1171
 
1385
  */
1386
  function _fnDraw( oSettings )
1387
  {
 
 
 
 
 
 
1388
  /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
1389
  var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
1390
  if ( $.inArray( false, aPreDraw ) !== -1 )
1391
  {
1392
+ _fnProcessingDisplay( oSettings, false );
1393
  return;
1394
  }
1395
 
1396
+ var i, iLen, n;
1397
+ var anRows = [];
1398
+ var iRowCount = 0;
1399
+ var iStripes = oSettings.asStripeClasses.length;
1400
+ var iOpenRows = oSettings.aoOpenRows.length;
1401
+
1402
  oSettings.bDrawing = true;
1403
 
1404
  /* Check and see if we have an initial draw position from state saving */
1464
  }
1465
  }
1466
 
1467
+ /* Row callback functions - might want to manipulate the row */
1468
  _fnCallbackFire( oSettings, 'aoRowCallback', null,
1469
  [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
1470
 
1495
  anRows[ 0 ].className = oSettings.asStripeClasses[0];
1496
  }
1497
 
1498
+ var oLang = oSettings.oLanguage;
1499
+ var sZero = oLang.sZeroRecords;
1500
  if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
1501
  {
1502
+ sZero = oLang.sLoadingRecords;
1503
  }
1504
+ else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
1505
  {
1506
+ sZero = oLang.sEmptyTable;
1507
  }
1508
 
1509
  var nTd = document.createElement( 'td' );
1510
  nTd.setAttribute( 'valign', "top" );
1511
  nTd.colSpan = _fnVisbleColumns( oSettings );
1512
  nTd.className = oSettings.oClasses.sRowEmpty;
1513
+ nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
1514
 
1515
  anRows[ iRowCount ].appendChild( nTd );
1516
  }
1657
  /* Replace jQuery UI constants */
1658
  if ( sAttr == "H" )
1659
  {
1660
+ sAttr = oSettings.oClasses.sJUIHeader;
1661
  }
1662
  else if ( sAttr == "F" )
1663
  {
1664
+ sAttr = oSettings.oClasses.sJUIFooter;
1665
  }
1666
 
1667
  /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
1776
  function _fnDetectHeader ( aLayout, nThead )
1777
  {
1778
  var nTrs = $(nThead).children('tr');
1779
+ var nTr, nCell;
1780
+ var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
1781
+ var bUnique;
1782
  var fnShiftCol = function ( a, i, j ) {
1783
+ var k = a[i];
1784
+ while ( k[j] ) {
1785
  j++;
1786
  }
1787
  return j;
1798
  /* Calculate a layout array */
1799
  for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
1800
  {
1801
+ nTr = nTrs[i];
1802
+ iColumn = 0;
1803
 
1804
  /* For every cell in the row... */
1805
+ nCell = nTr.firstChild;
1806
+ while ( nCell ) {
 
 
1807
  if ( nCell.nodeName.toUpperCase() == "TD" ||
1808
  nCell.nodeName.toUpperCase() == "TH" )
1809
  {
1810
  /* Get the col and rowspan attributes from the DOM and sanitise them */
1811
+ iColspan = nCell.getAttribute('colspan') * 1;
1812
+ iRowspan = nCell.getAttribute('rowspan') * 1;
1813
  iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
1814
  iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
1815
 
1818
  */
1819
  iColShifted = fnShiftCol( aLayout, i, iColumn );
1820
 
1821
+ /* Cache calculation for unique columns */
1822
+ bUnique = iColspan === 1 ? true : false;
1823
+
1824
  /* If there is col / rowspan, copy the information into the layout grid */
1825
  for ( l=0 ; l<iColspan ; l++ )
1826
  {
1828
  {
1829
  aLayout[i+k][iColShifted+l] = {
1830
  "cell": nCell,
1831
+ "unique": bUnique
1832
  };
1833
+ aLayout[i+k].nTr = nTr;
1834
  }
1835
  }
1836
  }
1837
+ nCell = nCell.nextSibling;
1838
  }
1839
  }
1840
  }
1845
  * @param {object} oSettings dataTables settings object
1846
  * @param {node} nHeader automatically detect the layout from this node - optional
1847
  * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
1848
+ * @returns array {node} aReturn list of unique th's
1849
  * @memberof DataTable#oApi
1850
  */
1851
  function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
1916
  function _fnAjaxParameters( oSettings )
1917
  {
1918
  var iColumns = oSettings.aoColumns.length;
1919
+ var aoData = [], mDataProp, aaSort, aDataSort;
1920
+ var i, j;
1921
 
1922
  aoData.push( { "name": "sEcho", "value": oSettings.iDraw } );
1923
  aoData.push( { "name": "iColumns", "value": iColumns } );
1928
 
1929
  for ( i=0 ; i<iColumns ; i++ )
1930
  {
1931
+ mDataProp = oSettings.aoColumns[i].mData;
1932
  aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
1933
  }
1934
 
1948
  /* Sorting */
1949
  if ( oSettings.oFeatures.bSort !== false )
1950
  {
1951
+ var iCounter = 0;
1952
+
1953
+ aaSort = ( oSettings.aaSortingFixed !== null ) ?
1954
+ oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
1955
+ oSettings.aaSorting.slice();
 
 
 
1956
 
1957
+ for ( i=0 ; i<aaSort.length ; i++ )
1958
  {
1959
+ aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
1960
+
1961
+ for ( j=0 ; j<aDataSort.length ; j++ )
1962
+ {
1963
+ aoData.push( { "name": "iSortCol_"+iCounter, "value": aDataSort[j] } );
1964
+ aoData.push( { "name": "sSortDir_"+iCounter, "value": aaSort[i][1] } );
1965
+ iCounter++;
1966
+ }
1967
  }
1968
+ aoData.push( { "name": "iSortingCols", "value": iCounter } );
1969
 
1970
  for ( i=0 ; i<iColumns ; i++ )
1971
  {
1978
 
1979
 
1980
  /**
1981
+ * Add Ajax parameters from plug-ins
1982
  * @param {object} oSettings dataTables settings object
1983
  * @param array {objects} aoData name/value pairs to send to the server
1984
  * @memberof DataTable#oApi
2005
  if ( json.sEcho !== undefined )
2006
  {
2007
  /* Protect against old returns over-writing a new one. Possible when you get
2008
+ * very fast interaction, and later queries are completed much faster
2009
  */
2010
  if ( json.sEcho*1 < oSettings.iDraw )
2011
  {
2086
  nFilter.id = oSettings.sTableId+'_filter';
2087
  }
2088
 
2089
+ var jqFilter = $('input[type="text"]', nFilter);
2090
+
2091
+ // Store a reference to the input element, so other input elements could be
2092
+ // added to the filter wrapper if needed (submit button for example)
2093
+ nFilter._DT_Input = jqFilter[0];
2094
+
2095
  jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
2096
  jqFilter.bind( 'keyup.DT', function(e) {
2097
  /* Update all other filter input elements for the new display */
2098
  var n = oSettings.aanFeatures.f;
2099
+ var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
2100
+
2101
  for ( var i=0, iLen=n.length ; i<iLen ; i++ )
2102
  {
2103
  if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
2104
  {
2105
+ $(n[i]._DT_Input).val( val );
2106
  }
2107
  }
2108
 
2109
  /* Now do the filter */
2110
+ if ( val != oPreviousSearch.sSearch )
2111
  {
2112
  _fnFilterComplete( oSettings, {
2113
+ "sSearch": val,
2114
  "bRegex": oPreviousSearch.bRegex,
2115
  "bSmart": oPreviousSearch.bSmart ,
2116
  "bCaseInsensitive": oPreviousSearch.bCaseInsensitive
2196
  function _fnFilterCustom( oSettings )
2197
  {
2198
  var afnFilters = DataTable.ext.afnFiltering;
2199
+ var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
2200
+
2201
  for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
2202
  {
2203
  var iCorrector = 0;
2204
  for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
2205
  {
2206
  var iDisIndex = oSettings.aiDisplay[j-iCorrector];
2207
+ var bTest = afnFilters[i](
2208
+ oSettings,
2209
+ _fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
2210
+ iDisIndex
2211
+ );
2212
 
2213
  /* Check if we should use this row based on the filtering function */
2214
+ if ( !bTest )
2215
  {
2216
  oSettings.aiDisplay.splice( j-iCorrector, 1 );
2217
  iCorrector++;
2350
  if ( !oSettings.oFeatures.bServerSide )
2351
  {
2352
  /* Clear out the old data */
2353
+ oSettings.asDataSearch = [];
2354
+
2355
+ var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
2356
+ var aiIndex = (iMaster===1) ?
2357
+ oSettings.aiDisplayMaster :
2358
+ oSettings.aiDisplay;
2359
 
2360
+ for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
2361
  {
2362
+ oSettings.asDataSearch[i] = _fnBuildSearchRow(
2363
+ oSettings,
2364
+ _fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
2365
+ );
2366
  }
2367
  }
2368
  }
2376
  */
2377
  function _fnBuildSearchRow( oSettings, aData )
2378
  {
2379
+ var sSearch = aData.join(' ');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2380
 
2381
  /* If it looks like there is an HTML entity in the string, attempt to decode it */
2382
  if ( sSearch.indexOf('&') !== -1 )
2383
  {
2384
+ sSearch = $('<div>').html(sSearch).text();
 
 
 
 
2385
  }
2386
 
2387
+ // Strip newline characters
2388
+ return sSearch.replace( /[\n\r]/g, " " );
2389
  }
2390
 
2391
  /**
2393
  * @param {string} sSearch string to search for
2394
  * @param {bool} bRegex treat as a regular expression or not
2395
  * @param {bool} bSmart perform smart filtering or not
2396
+ * @param {bool} bCaseInsensitive Do case insensitive matching or not
2397
  * @returns {RegExp} constructed object
2398
  * @memberof DataTable#oApi
2399
  */
2431
  {
2432
  return DataTable.ext.ofnSearch[sType]( sData );
2433
  }
2434
+ else if ( sData === null )
2435
+ {
2436
+ return '';
2437
+ }
2438
  else if ( sType == "html" )
2439
  {
2440
  return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
2443
  {
2444
  return sData.replace(/[\r\n]/g," ");
2445
  }
 
 
 
 
2446
  return sData;
2447
  }
2448
 
2449
 
2450
  /**
2451
+ * scape a string such that it can be used in a regular expression
2452
  * @param {string} sVal string to escape
2453
  * @returns {string} escaped string
2454
  * @memberof DataTable#oApi
2455
  */
2456
  function _fnEscapeRegex ( sVal )
2457
  {
2458
+ var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
2459
  var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
2460
  return sVal.replace(reReplace, '\\$1');
2461
  }
2462
 
2463
 
 
2464
  /**
2465
  * Generate the node required for the info display
2466
  * @param {object} oSettings dataTables settings object
2504
  }
2505
 
2506
  var
2507
+ oLang = oSettings.oLanguage,
2508
+ iStart = oSettings._iDisplayStart+1,
2509
+ iEnd = oSettings.fnDisplayEnd(),
2510
+ iMax = oSettings.fnRecordsTotal(),
2511
+ iTotal = oSettings.fnRecordsDisplay(),
2512
  sOut;
2513
 
2514
+ if ( iTotal === 0 )
 
 
 
 
 
 
 
 
 
2515
  {
2516
  /* Empty record set */
2517
+ sOut = oLang.sInfoEmpty;
2518
  }
2519
+ else {
 
 
 
 
 
 
 
 
2520
  /* Normal record set */
2521
+ sOut = oLang.sInfo;
 
 
 
 
2522
  }
2523
+
2524
+ if ( iTotal != iMax )
2525
  {
2526
  /* Record set after filtering */
2527
+ sOut += ' ' + oLang.sInfoFiltered;
 
 
 
 
 
 
2528
  }
2529
+
2530
+ // Convert the macros
2531
+ sOut += oLang.sInfoPostFix;
2532
+ sOut = _fnInfoMacros( oSettings, sOut );
2533
 
2534
+ if ( oLang.fnInfoCallback !== null )
2535
  {
2536
+ sOut = oLang.fnInfoCallback.call( oSettings.oInstance,
2537
  oSettings, iStart, iEnd, iMax, iTotal, sOut );
2538
  }
2539
 
2545
  }
2546
 
2547
 
2548
+ function _fnInfoMacros ( oSettings, str )
2549
+ {
2550
+ var
2551
+ iStart = oSettings._iDisplayStart+1,
2552
+ sStart = oSettings.fnFormatNumber( iStart ),
2553
+ iEnd = oSettings.fnDisplayEnd(),
2554
+ sEnd = oSettings.fnFormatNumber( iEnd ),
2555
+ iTotal = oSettings.fnRecordsDisplay(),
2556
+ sTotal = oSettings.fnFormatNumber( iTotal ),
2557
+ iMax = oSettings.fnRecordsTotal(),
2558
+ sMax = oSettings.fnFormatNumber( iMax );
2559
+
2560
+ // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
2561
+ // internally
2562
+ if ( oSettings.oScroll.bInfinite )
2563
+ {
2564
+ sStart = oSettings.fnFormatNumber( 1 );
2565
+ }
2566
+
2567
+ return str.
2568
+ replace(/_START_/g, sStart).
2569
+ replace(/_END_/g, sEnd).
2570
+ replace(/_TOTAL_/g, sTotal).
2571
+ replace(/_MAX_/g, sMax);
2572
+ }
2573
+
2574
+
2575
 
2576
  /**
2577
  * Draw the table for the first time, adding all required features
2705
  */
2706
  function _fnLanguageCompat( oLanguage )
2707
  {
2708
+ var oDefaults = DataTable.defaults.oLanguage;
2709
+
2710
  /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
2711
  * sZeroRecords - assuming that is given.
2712
  */
2713
+ if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
2714
+ oDefaults.sEmptyTable === "No data available in table" )
2715
  {
2716
  _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
2717
  }
2718
 
2719
  /* Likewise with loading records */
2720
+ if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
2721
+ oDefaults.sLoadingRecords === "Loading..." )
2722
  {
2723
  _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
2724
  }
2819
 
2820
 
2821
  /**
2822
+ * Recalculate the end point based on the start point
2823
  * @param {object} oSettings dataTables settings object
2824
  * @memberof DataTable#oApi
2825
  */
2923
  oSettings._iDisplayStart - oSettings._iDisplayLength :
2924
  0;
2925
 
2926
+ /* Correct for under-run */
2927
  if ( oSettings._iDisplayStart < 0 )
2928
  {
2929
  oSettings._iDisplayStart = 0;
3009
  $(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
3010
  }
3011
 
 
 
3012
  /**
3013
  * Add any control elements for the table - specifically scrolling
3014
  * @param {object} oSettings dataTables settings object
3085
  nScrollHead.style.border = "0";
3086
  nScrollHead.style.width = "100%";
3087
  nScrollFoot.style.border = "0";
3088
+ nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
3089
+ oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
3090
 
3091
  /* Modify attributes to respect the clones */
3092
  nScrollHeadTable.removeAttribute('id');
3098
  nScrollFootTable.style.marginLeft = "0";
3099
  }
3100
 
3101
+ /* Move caption elements from the body to the header, footer or leave where it is
3102
+ * depending on the configuration. Note that the DTD says there can be only one caption */
3103
+ var nCaption = $(oSettings.nTable).children('caption');
3104
+ if ( nCaption.length > 0 )
3105
  {
3106
+ nCaption = nCaption[0];
3107
+ if ( nCaption._captionSide === "top" )
3108
+ {
3109
+ nScrollHeadTable.appendChild( nCaption );
3110
+ }
3111
+ else if ( nCaption._captionSide === "bottom" && nTfoot )
3112
+ {
3113
+ nScrollFootTable.appendChild( nCaption );
3114
+ }
3115
  }
3116
 
3117
  /*
3118
  * Sizing
3119
  */
3120
+ /* When x-scrolling add the width and a scroller to move the header with the body */
3121
  if ( oSettings.oScroll.sX !== "" )
3122
  {
3123
  nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
3199
  nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
3200
  nScrollBody = o.nTable.parentNode,
3201
  i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
3202
+ nTheadSize, nTfootSize,
3203
+ iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
3204
  nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
3205
  nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
3206
+ ie67 = o.oBrowser.bScrollOversize,
3207
+ zeroOut = function(nSizer) {
3208
+ oStyle = nSizer.style;
3209
+ oStyle.paddingTop = "0";
3210
+ oStyle.paddingBottom = "0";
3211
+ oStyle.borderTopWidth = "0";
3212
+ oStyle.borderBottomWidth = "0";
3213
+ oStyle.height = 0;
3214
+ };
3215
 
3216
  /*
3217
  * 1. Re-create the table inside the scrolling div
3218
  */
3219
 
3220
  /* Remove the old minimised thead and tfoot elements in the inner table */
3221
+ $(o.nTable).children('thead, tfoot').remove();
3222
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3223
  /* Clone the current header and footer elements and then place it into the inner table */
3224
+ nTheadSize = $(o.nTHead).clone()[0];
3225
  o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
3226
+ anHeadToSize = o.nTHead.getElementsByTagName('tr');
3227
+ anHeadSizers = nTheadSize.getElementsByTagName('tr');
3228
 
3229
  if ( o.nTFoot !== null )
3230
  {
3231
+ nTfootSize = $(o.nTFoot).clone()[0];
3232
  o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
3233
+ anFootToSize = o.nTFoot.getElementsByTagName('tr');
3234
+ anFootSizers = nTfootSize.getElementsByTagName('tr');
3235
  }
3236
 
3237
  /*
3240
 
3241
  /* Remove old sizing and apply the calculated column widths
3242
  * Get the unique column headers in the newly created (cloned) header. We want to apply the
3243
+ * calculated sizes to this header
3244
  */
3245
  if ( o.oScroll.sX === "" )
3246
  {
3259
  {
3260
  _fnApplyToChildren( function(n) {
3261
  n.style.width = "";
3262
+ }, anFootSizers );
3263
+ }
3264
+
3265
+ // If scroll collapse is enabled, when we put the headers back into the body for sizing, we
3266
+ // will end up forcing the scrollbar to appear, making our measurements wrong for when we
3267
+ // then hide it (end of this function), so add the header height to the body scroller.
3268
+ if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
3269
+ {
3270
+ nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
3271
  }
3272
 
3273
  /* Size the table as a whole */
3284
  if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight ||
3285
  $(nScrollBody).css('overflow-y') == "scroll") )
3286
  {
3287
+ o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
3288
  }
3289
  }
3290
  else
3321
  /* We want the hidden header to have zero height, so remove padding and borders. Then
3322
  * set the width based on the real headers
3323
  */
 
 
3324
 
3325
+ // Apply all styles in one pass. Invalidates layout only once because we don't read any
3326
+ // DOM properties.
3327
+ _fnApplyToChildren( zeroOut, anHeadSizers );
3328
+
3329
+ // Read all widths in next pass. Forces layout only once because we do not change
3330
+ // any DOM properties.
3331
+ _fnApplyToChildren( function(nSizer) {
3332
+ aApplied.push( _fnStringToCss( $(nSizer).width() ) );
3333
+ }, anHeadSizers );
3334
+
3335
+ // Apply all widths in final pass. Invalidates layout only once because we do not
3336
+ // read any DOM properties.
3337
+ _fnApplyToChildren( function(nToSize, i) {
3338
+ nToSize.style.width = aApplied[i];
3339
+ }, anHeadToSize );
3340
+
3341
  $(anHeadSizers).height(0);
3342
 
3343
+ /* Same again with the footer if we have one */
3344
  if ( o.nTFoot !== null )
3345
  {
3346
+ _fnApplyToChildren( zeroOut, anFootSizers );
3347
+
3348
+ _fnApplyToChildren( function(nSizer) {
3349
+ aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
3350
+ }, anFootSizers );
3351
+
3352
+ _fnApplyToChildren( function(nToSize, i) {
3353
+ nToSize.style.width = aAppliedFooter[i];
3354
+ }, anFootToSize );
3355
+
 
 
 
 
 
 
3356
  $(anFootSizers).height(0);
3357
  }
3358
 
3363
  /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
3364
  * to what they currently are
3365
  */
3366
+ _fnApplyToChildren( function(nSizer, i) {
3367
  nSizer.innerHTML = "";
3368
+ nSizer.style.width = aApplied[i];
3369
  }, anHeadSizers );
3370
 
3371
  if ( o.nTFoot !== null )
3372
  {
3373
+ _fnApplyToChildren( function(nSizer, i) {
3374
  nSizer.innerHTML = "";
3375
+ nSizer.style.width = aAppliedFooter[i];
3376
  }, anFootSizers );
3377
  }
3378
 
3395
 
3396
  /* Apply the calculated minimum width to the table wrappers */
3397
  nScrollBody.style.width = _fnStringToCss( iCorrection );
3398
+ o.nScrollHead.style.width = _fnStringToCss( iCorrection );
3399
 
3400
  if ( o.nTFoot !== null )
3401
  {
3402
+ o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
3403
  }
3404
 
3405
  /* And give the user a warning that we've stopped the table getting too small */
3418
  else
3419
  {
3420
  nScrollBody.style.width = _fnStringToCss( '100%' );
3421
+ o.nScrollHead.style.width = _fnStringToCss( '100%' );
3422
 
3423
  if ( o.nTFoot !== null )
3424
  {
3425
+ o.nScrollFoot.style.width = _fnStringToCss( '100%' );
3426
  }
3427
  }
3428
 
3450
  o.oScroll.iBarWidth : 0;
3451
  if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
3452
  {
3453
+ nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
3454
  }
3455
  }
3456
 
3458
  var iOuterWidth = $(o.nTable).outerWidth();
3459
  nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
3460
  nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
3461
+
3462
+ // Figure out if there are scrollbar present - if so then we need a the header and footer to
3463
+ // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
3464
+ var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
3465
+ nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
3466
 
3467
  if ( o.nTFoot !== null )
3468
  {
3469
+ nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
3470
+ nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
3471
+ nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
3472
  }
3473
+
3474
+ /* Adjust the position of the header in case we loose the y-scrollbar */
3475
+ $(nScrollBody).scroll();
3476
 
3477
  /* If sorting or filtering has occurred, jump the scrolling back to the top */
3478
  if ( o.bSorted || o.bFiltered )
3492
  */
3493
  function _fnApplyToChildren( fn, an1, an2 )
3494
  {
3495
+ var index=0, i=0, iLen=an1.length;
3496
+ var nNode1, nNode2;
3497
+
3498
+ while ( i < iLen )
3499
  {
3500
+ nNode1 = an1[i].firstChild;
3501
+ nNode2 = an2 ? an2[i].firstChild : null;
3502
+ while ( nNode1 )
3503
  {
3504
+ if ( nNode1.nodeType === 1 )
3505
  {
3506
  if ( an2 )
3507
  {
3508
+ fn( nNode1, nNode2, index );
3509
  }
3510
  else
3511
  {
3512
+ fn( nNode1, index );
3513
  }
3514
+ index++;
3515
  }
3516
+ nNode1 = nNode1.nextSibling;
3517
+ nNode2 = an2 ? nNode2.nextSibling : null;
3518
  }
3519
+ i++;
3520
  }
3521
  }
3522
 
 
 
3523
  /**
3524
  * Convert a CSS unit width to pixels (e.g. 2em)
3525
  * @param {string} sWidth width to be converted
3536
 
3537
  if ( !nParent )
3538
  {
3539
+ nParent = document.body;
3540
  }
3541
 
3542
  var iWidth;
3566
  var i, iIndex, iCorrector, iWidth;
3567
  var oHeaders = $('th', oSettings.nTHead);
3568
  var widthAttr = oSettings.nTable.getAttribute('width');
3569
+ var nWrapper = oSettings.nTable.parentNode;
3570
 
3571
  /* Convert any user input sizes into pixel sizes */
3572
  for ( i=0 ; i<iColums ; i++ )
3578
  if ( oSettings.aoColumns[i].sWidth !== null )
3579
  {
3580
  iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig,
3581
+ nWrapper );
3582
  if ( iTmpWidth !== null )
3583
  {
3584
  oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
3678
  }
3679
 
3680
  /* Build the table and 'display' it */
 
3681
  nWrapper.appendChild( nCalcTmp );
3682
 
3683
  /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
3804
  * Get the widest node
3805
  * @param {object} oSettings dataTables settings object
3806
  * @param {int} iCol column of interest
3807
+ * @returns {node} widest table node
3808
  * @memberof DataTable#oApi
3809
  */
3810
  function _fnGetWidestNode( oSettings, iCol )
3829
  * Get the maximum strlen for each data column
3830
  * @param {object} oSettings dataTables settings object
3831
  * @param {int} iCol column of interest
3832
+ * @returns {string} max string length for each column
3833
  * @memberof DataTable#oApi
3834
  */
3835
  function _fnGetMaxLenString( oSettings, iCol )
3923
  return (w1 - w2);
3924
  }
3925
 
 
 
3926
  /**
3927
  * Change the order of the table
3928
  * @param {object} oSettings dataTables settings object
3945
  if ( !oSettings.oFeatures.bServerSide &&
3946
  (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
3947
  {
3948
+ aaSort = ( oSettings.aaSortingFixed !== null ) ?
3949
+ oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
3950
+ oSettings.aaSorting.slice();
 
 
 
 
 
3951
 
3952
+ /* If there is a sorting data type, and a function belonging to it, then we need to
3953
  * get the data from the developer's function and apply it for this column
3954
  */
3955
  for ( i=0 ; i<aaSort.length ; i++ )
3959
  sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
3960
  if ( DataTable.ext.afnSortData[sDataType] )
3961
  {
3962
+ var aData = DataTable.ext.afnSortData[sDataType].call(
3963
+ oSettings.oInstance, oSettings, iColumn, iVisColumn
3964
+ );
3965
+ if ( aData.length === aoData.length )
3966
+ {
3967
+ for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
3968
+ {
3969
+ _fnSetCellData( oSettings, j, iColumn, aData[j] );
3970
+ }
3971
+ }
3972
+ else
3973
  {
3974
+ _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
3975
  }
3976
  }
3977
  }
4059
 
4060
  for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
4061
  {
4062
+ var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
4063
  nTh = aoColumns[i].nTh;
4064
  nTh.removeAttribute('aria-sort');
4065
  nTh.removeAttribute('aria-label');
4073
 
4074
  var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ?
4075
  aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
4076
+ nTh.setAttribute('aria-label', sTitle+
4077
  (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
4078
  }
4079
  else
4080
  {
4081
+ nTh.setAttribute('aria-label', sTitle+
4082
  (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
4083
  }
4084
  }
4085
  else
4086
  {
4087
+ nTh.setAttribute('aria-label', sTitle);
4088
  }
4089
  }
4090
 
4131
  * twice - once for when bProcessing is enabled, and another time for when it is
4132
  * disabled, as we need to perform slightly different actions.
4133
  * Basically the issue here is that the Javascript engine in modern browsers don't
4134
+ * appear to allow the rendering engine to update the display while it is still executing
4135
  * it's thread (well - it does but only after long intervals). This means that the
4136
  * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
4137
  * I force an execution break by using setTimeout - but this breaks the expected
4138
  * thread continuation for the end-developer's point of view (their code would execute
4139
+ * too early), so we only do it when we absolutely have to.
4140
  */
4141
  var fnInnerSorting = function () {
4142
  var iColumn, iNextSort;
4143
 
4144
+ /* If the shift key is pressed then we are multiple column sorting */
4145
  if ( e.shiftKey )
4146
  {
4147
  /* Are we already doing some kind of sort on this column? */
4314
  * Apply the required classes to the table body
4315
  * Note that this is given as a feature switch since it can significantly slow down a sort
4316
  * on large data sets (adding and removing of classes is always slow at the best of times..)
4317
+ * Further to this, note that this code is admittedly fairly ugly. It could be made a lot
4318
+ * simpler using jQuery selectors and add/removeClass, but that is significantly slower
4319
  * (on the order of 5 times slower) - hence the direct DOM manipulation here.
4320
+ * Note that for deferred drawing we do use jQuery - the reason being that taking the first
4321
  * row found to see if the whole column needs processed can miss classes since the first
4322
  * column might be new.
4323
  */
4326
  if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
4327
  {
4328
  var nTds = _fnGetTdNodes( oSettings );
4329
+
4330
+ /* Determine what the sorting class for each column should be */
4331
+ var iClass, iTargetCol;
4332
+ var asClasses = [];
4333
+ for (i = 0; i < iColumns; i++)
4334
  {
4335
+ asClasses.push("");
4336
  }
4337
+ for (i = 0, iClass = 1; i < aaSort.length; i++)
4338
  {
4339
+ iTargetCol = parseInt( aaSort[i][0], 10 );
4340
+ asClasses[iTargetCol] = sClass + iClass;
4341
+
4342
+ if ( iClass < 3 )
4343
  {
4344
+ iClass++;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4345
  }
4346
  }
4347
 
4348
+ /* Make changes to the classes for each cell as needed */
4349
+ var reClass = new RegExp(sClass + "[123]");
4350
+ var sTmpClass, sCurrentClass, sNewClass;
4351
+ for ( i=0, iLen=nTds.length; i<iLen; i++ )
4352
  {
4353
+ /* Determine which column we're looking at */
4354
+ iTargetCol = i % iColumns;
4355
+
4356
+ /* What is the full list of classes now */
4357
+ sCurrentClass = nTds[i].className;
4358
+ /* What sorting class should be applied? */
4359
+ sNewClass = asClasses[iTargetCol];
4360
+ /* What would the new full list be if we did a replacement? */
4361
+ sTmpClass = sCurrentClass.replace(reClass, sNewClass);
4362
+
4363
+ if ( sTmpClass != sCurrentClass )
4364
  {
4365
+ /* We changed something */
4366
+ nTds[i].className = $.trim( sTmpClass );
4367
  }
4368
+ else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
 
4369
  {
4370
+ /* We need to add a class */
4371
+ nTds[i].className = sCurrentClass + " " + sNewClass;
4372
  }
4373
  }
4374
  }
4456
  $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
4457
 
4458
  /* Column visibility state
4459
+ * Pass back visibility settings to the init handler, but to do not here override
4460
  * the init object that the user might have passed in
4461
  */
4462
  oInit.saved_aoColumns = [];
4508
  }
4509
 
4510
  /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
4511
+ * belonging to DataTables.
4512
  */
4513
+ var
4514
+ aCookies =document.cookie.split(';'),
4515
+ iNewCookieLen = sFullCookie.split(';')[0].length,
4516
+ aOldCookies = [];
4517
 
4518
+ if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
4519
  {
 
4520
  for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
4521
  {
4522
  if ( aCookies[i].indexOf( sBaseName ) != -1 )
4523
  {
4524
  /* It's a DataTables cookie, so eval it and check the time stamp */
4525
  var aSplitCookie = aCookies[i].split('=');
4526
+ try {
4527
+ oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
4528
+
4529
+ if ( oData && oData.iCreate )
4530
+ {
4531
+ aOldCookies.push( {
4532
+ "name": aSplitCookie[0],
4533
+ "time": oData.iCreate
4534
+ } );
4535
+ }
4536
  }
4537
+ catch( e ) {}
4538
  }
4539
  }
4540
+
4541
+ // Make sure we delete the oldest ones first
4542
+ aOldCookies.sort( function (a, b) {
4543
+ return b.time - a.time;
4544
+ } );
4545
+
4546
+ // Eliminate as many old DataTables cookies as we need to
4547
+ while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
4548
+ if ( aOldCookies.length === 0 ) {
4549
+ // Deleted all DT cookies and still not enough space. Can't state save
4550
+ return;
4551
+ }
4552
+
4553
+ var old = aOldCookies.pop();
4554
+ document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
4555
  aParts.join('/') + "/";
4556
  }
4557
  }
4591
  }
4592
 
4593
 
 
4594
  /**
4595
  * Return the settings object for a particular table
4596
  * @param {node} nTable table we are using as a dataTable
4644
  {
4645
  var anReturn = [];
4646
  var iCorrector;
4647
+ var anTds, nTd;
4648
  var iRow, iRows=oSettings.aoData.length,
4649
  iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
4650
 
4662
  {
4663
  /* get the TD child nodes - taking into account text etc nodes */
4664
  anTds = [];
4665
+ nTd = oData.nTr.firstChild;
4666
+ while ( nTd )
4667
  {
4668
+ sNodeName = nTd.nodeName.toLowerCase();
4669
  if ( sNodeName == 'td' || sNodeName == 'th' )
4670
  {
4671
+ anTds.push( nTd );
4672
  }
4673
+ nTd = nTd.nextSibling;
4674
  }
4675
 
4676
  iCorrector = 0;
4714
  }
4715
  else
4716
  {
4717
+ throw new Error(sAlert);
4718
  }
4719
  return;
4720
  }
4721
+ else if ( window.console && console.log )
4722
  {
4723
  console.log( sAlert );
4724
  }
4759
  */
4760
  function _fnExtend( oOut, oExtender )
4761
  {
4762
+ var val;
4763
+
4764
+ for ( var prop in oExtender )
4765
  {
4766
+ if ( oExtender.hasOwnProperty(prop) )
4767
  {
4768
+ val = oExtender[prop];
4769
+
4770
+ if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
4771
  {
4772
+ $.extend( true, oOut[prop], val );
4773
  }
4774
  else
4775
  {
4776
+ oOut[prop] = val;
4777
  }
4778
  }
4779
  }
4784
 
4785
  /**
4786
  * Bind an event handers to allow a click or return key to activate the callback.
4787
+ * This is good for accessibility since a return on the keyboard will have the
4788
  * same effect as a click, if the element has focus.
4789
  * @param {element} n Element to bind the action to
4790
  * @param {object} oData Data object to pass to the triggered function
4791
+ * @param {function} fn Callback function for when the event is triggered
4792
  * @memberof DataTable#oApi
4793
  */
4794
  function _fnBindAction( n, oData, fn )
4795
  {
4796
  $(n)
4797
  .bind( 'click.DT', oData, function (e) {
 
4798
  n.blur(); // Remove focus outline for mouse users
4799
+ fn(e);
4800
  } )
4801
  .bind( 'keypress.DT', oData, function (e){
4802
  if ( e.which === 13 ) {
4813
  * Register a callback function. Easily allows a callback function to be added to
4814
  * an array store of callback functions that can then all be called together.
4815
  * @param {object} oSettings dataTables settings object
4816
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
4817
  * @param {function} fn Function to be called back
4818
+ * @param {string} sName Identifying name for the callback (i.e. a label)
4819
  * @memberof DataTable#oApi
4820
  */
4821
  function _fnCallbackReg( oSettings, sStore, fn, sName )
4835
  * array store is done backwards! Further note that you do not want to fire off triggers
4836
  * in time sensitive applications (for example cell creation) as its slow.
4837
  * @param {object} oSettings dataTables settings object
4838
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
4839
  * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
4840
  * is fired
4841
+ * @param {array} aArgs Array of arguments to pass to the callback function / trigger
4842
  * @memberof DataTable#oApi
4843
  */
4844
  function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
4863
  /**
4864
  * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
4865
  * library, then we use that as it is fast, safe and accurate. If the function isn't
4866
+ * available then we need to built it ourselves - the inspiration for this function comes
4867
  * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
4868
  * not perfect and absolutely should not be used as a replacement to json2.js - but it does
4869
  * do what we need, without requiring a dependency for DataTables.
4911
  return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
4912
  };
4913
 
 
4914
 
4915
+ /**
4916
+ * From some browsers (specifically IE6/7) we need special handling to work around browser
4917
+ * bugs - this function is used to detect when these workarounds are needed.
4918
+ * @param {object} oSettings dataTables settings object
4919
+ * @memberof DataTable#oApi
4920
+ */
4921
+ function _fnBrowserDetect( oSettings )
4922
+ {
4923
+ /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the
4924
+ * width of the scrollbar, while other browsers ensure the inner element is contained
4925
+ * without forcing scrolling
4926
+ */
4927
+ var n = $(
4928
+ '<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden">'+
4929
+ '<div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;">'+
4930
+ '<div id="DT_BrowserTest" style="width:100%; height:10px;"></div>'+
4931
+ '</div>'+
4932
+ '</div>')[0];
4933
+
4934
+ document.body.appendChild( n );
4935
+ oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;
4936
+ document.body.removeChild( n );
4937
+ }
4938
 
4939
+
4940
  /**
4941
  * Perform a jQuery selector action on the table's TR elements (from the tbody) and
4942
  * return the resulting jQuery object.
4974
  */
4975
  this.$ = function ( sSelector, oOpts )
4976
  {
4977
+ var i, iLen, a = [], tr;
4978
  var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
4979
+ var aoData = oSettings.aoData;
4980
+ var aiDisplay = oSettings.aiDisplay;
4981
+ var aiDisplayMaster = oSettings.aiDisplayMaster;
4982
 
4983
  if ( !oOpts )
4984
  {
4997
  {
4998
  for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
4999
  {
5000
+ tr = aoData[ aiDisplay[i] ].nTr;
5001
+ if ( tr )
5002
+ {
5003
+ a.push( tr );
5004
+ }
5005
  }
5006
  }
5007
  else if ( oOpts.order == "current" && oOpts.filter == "none" )
5008
  {
5009
+ for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )
5010
  {
5011
+ tr = aoData[ aiDisplayMaster[i] ].nTr;
5012
+ if ( tr )
5013
+ {
5014
+ a.push( tr );
5015
+ }
5016
  }
5017
  }
5018
  else if ( oOpts.order == "current" && oOpts.filter == "applied" )
5019
  {
5020
+ for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )
5021
  {
5022
+ tr = aoData[ aiDisplay[i] ].nTr;
5023
+ if ( tr )
5024
+ {
5025
+ a.push( tr );
5026
+ }
5027
  }
5028
  }
5029
  else if ( oOpts.order == "original" && oOpts.filter == "none" )
5030
  {
5031
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5032
  {
5033
+ tr = aoData[ i ].nTr ;
5034
+ if ( tr )
5035
+ {
5036
+ a.push( tr );
5037
+ }
5038
  }
5039
  }
5040
  else if ( oOpts.order == "original" && oOpts.filter == "applied" )
5041
  {
5042
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5043
  {
5044
+ tr = aoData[ i ].nTr;
5045
+ if ( $.inArray( i, aiDisplay ) !== -1 && tr )
5046
  {
5047
+ a.push( tr );
5048
  }
5049
  }
5050
  }
5068
  /**
5069
  * Almost identical to $ in operation, but in this case returns the data for the matched
5070
  * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
5071
+ * rather than any descendants, so the data can be obtained for the row/cell. If matching
5072
  * rows are found, the data returned is the original data array/object that was used to
5073
  * create the row (or a generated array if from a DOM source).
5074
  *
5075
+ * This method is often useful in-combination with $ where both functions are given the
5076
  * same parameters and the array indexes will match identically.
5077
  * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
5078
  * @param {object} [oOpts] Optional parameters for modifying the rows to be included
5136
  * <ul>
5137
  * <li>1D array of data - add a single row with the data provided</li>
5138
  * <li>2D array of arrays - add multiple rows in a single call</li>
5139
+ * <li>object - data object when using <i>mData</i></li>
5140
+ * <li>array of objects - multiple data objects when using <i>mData</i></li>
5141
  * </ul>
5142
  * @param {bool} [bRedraw=true] redraw the table or not
5143
  * @returns {array} An array of integers, representing the list of indexes in
5371
  fnCallBack.call( this, oSettings, oData );
5372
  }
5373
 
5374
+ /* Check for an 'overflow' they case for displaying the table */
5375
+ if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() )
5376
  {
5377
  oSettings._iDisplayStart -= oSettings._iDisplayLength;
5378
  if ( oSettings._iDisplayStart < 0 )
5411
  var nBody = oSettings.nTBody;
5412
  var i, iLen;
5413
 
5414
+ bRemove = (bRemove===undefined) ? false : bRemove;
5415
 
5416
  /* Flag to note that the table is currently being destroyed - no action should be taken */
5417
  oSettings.bDestroying = true;
5418
 
5419
+ /* Fire off the destroy callbacks for plug-ins etc */
5420
+ _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] );
5421
+
5422
+ /* If the table is not being removed, restore the hidden columns */
5423
+ if ( !bRemove )
 
 
5424
  {
5425
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
5426
  {
5427
+ if ( oSettings.aoColumns[i].bVisible === false )
5428
+ {
5429
+ this.fnSetColumnVis( i, true );
5430
+ }
5431
  }
5432
  }
5433
 
5503
  oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
5504
  }
5505
 
5506
+ /* If the were originally stripe classes - then we add them back here. Note
5507
+ * this is not fool proof (for example if not all rows had stripe classes - but
5508
  * it's a good effort without getting carried away
5509
  */
5510
+ iLen = oSettings.asDestroyStripes.length;
5511
+ if (iLen)
5512
+ {
5513
+ var anRows = $(nBody).children('tr');
5514
+ for ( i=0 ; i<iLen ; i++ )
5515
+ {
5516
+ anRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );
5517
+ }
5518
+ }
5519
 
5520
  /* Remove the settings object from the settings array */
5521
  for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
5528
 
5529
  /* End it all */
5530
  oSettings = null;
5531
+ oInit = null;
5532
  };
5533
 
5534
 
5548
  this.fnDraw = function( bComplete )
5549
  {
5550
  var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5551
+ if ( bComplete === false )
5552
  {
5553
  _fnCalculateEnd( oSettings );
5554
  _fnDraw( oSettings );
5622
  var n = oSettings.aanFeatures.f;
5623
  for ( var i=0, iLen=n.length ; i<iLen ; i++ )
5624
  {
5625
+ // IE9 throws an 'unknown error' if document.activeElement is used
5626
+ // inside an iframe or frame...
5627
+ try {
5628
+ if ( n[i]._DT_Input != document.activeElement )
5629
+ {
5630
+ $(n[i]._DT_Input).val( sInput );
5631
+ }
5632
+ }
5633
+ catch ( e ) {
5634
+ $(n[i]._DT_Input).val( sInput );
5635
+ }
5636
  }
5637
  }
5638
  }
5752
  * and column index including hidden columns
5753
  * @param {node} nNode this can either be a TR, TD or TH in the table's body
5754
  * @returns {int} If nNode is given as a TR, then a single index is returned, or
5755
+ * if given as a cell, an array of [row index, column index (visible),
5756
+ * column index (all)] is given.
5757
  * @dtopt API
5758
  *
5759
  * @example
5955
  var i, iLen;
5956
  var aoColumns = oSettings.aoColumns;
5957
  var aoData = oSettings.aoData;
5958
+ var nTd, bAppend, iBefore;
5959
 
5960
  /* No point in doing anything if we are requesting what is already true */
5961
  if ( aoColumns[iCol].bVisible == bShow )
6075
 
6076
 
6077
  /**
6078
+ * Sort the table by a particular column
6079
  * @param {int} iCol the data index to sort on. Note that this will not match the
6080
  * 'display index' if you have hidden data entries
6081
  * @dtopt API
6127
  * @param {node|int} mRow TR element you want to update or the aoData index
6128
  * @param {int} [iColumn] The column to update (not used of mData is an array or object)
6129
  * @param {bool} [bRedraw=true] Redraw the table or not
6130
+ * @param {bool} [bAction=true] Perform pre-draw actions or not
6131
  * @returns {int} 0 on success, 1 on error
6132
  * @dtopt API
6133
  *
6141
  this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
6142
  {
6143
  var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6144
+ var i, iLen, sDisplay;
6145
  var iRow = (typeof mRow === 'object') ?
6146
  _fnNodeToDataIndex(oSettings, mRow) : mRow;
6147
 
6148
+ if ( $.isArray(mData) && iColumn === undefined )
6149
  {
6150
  /* Array update - update the whole row */
6151
  oSettings.aoData[iRow]._aData = mData.slice();
6152
 
6153
  /* Flag to the function that we are recursing */
 
6154
  for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
6155
  {
6156
  this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
6157
  }
 
6158
  }
6159
+ else if ( $.isPlainObject(mData) && iColumn === undefined )
6160
  {
6161
  /* Object update - update the whole row - assume the developer gets the object right */
6162
  oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
6163
 
 
6164
  for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
6165
  {
6166
  this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
6167
  }
 
6168
  }
6169
  else
6170
  {
6193
  * will rebuild the search array - however, the redraw might be disabled by the user)
6194
  */
6195
  var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
6196
+ oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(
6197
+ oSettings,
6198
+ _fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )
6199
+ );
6200
 
6201
  /* Perform pre-draw actions */
6202
  if ( bAction === undefined || bAction )
6234
 
6235
  /*
6236
  * This is really a good bit rubbish this method of exposing the internal methods
6237
+ * publicly... - To be fixed in 2.0 using methods on the prototype
6238
  */
6239
 
6240
 
6345
  "_fnCallbackFire": _fnCallbackFire,
6346
  "_fnJsonString": _fnJsonString,
6347
  "_fnRender": _fnRender,
6348
+ "_fnNodeToColumnIndex": _fnNodeToColumnIndex,
6349
+ "_fnInfoMacros": _fnInfoMacros,
6350
+ "_fnBrowserDetect": _fnBrowserDetect,
6351
+ "_fnGetColumns": _fnGetColumns
6352
  };
6353
 
6354
  $.extend( DataTable.ext.oApi, this.oApi );
6363
 
6364
 
6365
  var _that = this;
6366
+ this.each(function() {
 
6367
  var i=0, iLen, j, jLen, k, kLen;
6368
  var sId = this.getAttribute( 'id' );
6369
  var bInitHandedOff = false;
6415
  }
6416
 
6417
  /* Ensure the table has an ID - required for accessibility */
6418
+ if ( sId === null || sId === "" )
6419
  {
6420
  sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
6421
  this.id = sId;
6468
  _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
6469
  _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
6470
  _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
 
6471
  _fnMap( oSettings, oInit, "asStripeClasses" );
6472
+ _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
6473
  _fnMap( oSettings, oInit, "fnServerData" );
6474
  _fnMap( oSettings, oInit, "fnFormatNumber" );
6475
  _fnMap( oSettings, oInit, "sServerMethod" );
6562
  if ( oInit.iDeferLoading !== null )
6563
  {
6564
  oSettings.bDeferLoading = true;
6565
+ var tmp = $.isArray( oInit.iDeferLoading );
6566
+ oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
6567
+ oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
6568
  }
6569
 
6570
  if ( oInit.aaData !== null )
6596
  /*
6597
  * Stripes
6598
  */
6599
+ if ( oInit.asStripeClasses === null )
 
 
 
 
6600
  {
6601
+ oSettings.asStripeClasses =[
6602
+ oSettings.oClasses.sStripeOdd,
6603
+ oSettings.oClasses.sStripeEven
6604
+ ];
 
6605
  }
6606
+
6607
+ /* Remove row stripe classes if they are already on the table row */
6608
+ iLen=oSettings.asStripeClasses.length;
6609
+ oSettings.asDestroyStripes = [];
6610
+ if (iLen)
6611
  {
6612
+ var bStripeRemove = false;
6613
+ var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');
6614
+ for ( i=0 ; i<iLen ; i++ )
 
 
 
 
 
 
 
 
6615
  {
6616
+ if ( anRows.hasClass( oSettings.asStripeClasses[i] ) )
6617
+ {
6618
+ bStripeRemove = true;
6619
+
6620
+ /* Store the classes which we are about to remove so they can be re-added on destroy */
6621
+ oSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );
6622
+ }
6623
  }
6624
+
6625
+ if ( bStripeRemove )
6626
  {
6627
+ anRows.removeClass( oSettings.asStripeClasses.join(' ') );
6628
  }
 
 
6629
  }
6630
 
 
6631
  /*
6632
  * Columns
6633
  * See if we should load columns automatically or use defined ones
6722
  * Final init
6723
  * Cache the header, body and footer as required, creating them if needed
6724
  */
6725
+
6726
+ /* Browser support detection */
6727
+ _fnBrowserDetect( oSettings );
6728
+
6729
+ // Work around for Webkit bug 83867 - store the caption-side before removing from doc
6730
+ var captions = $(this).children('caption').each( function () {
6731
+ this._captionSide = $(this).css('caption-side');
6732
+ } );
6733
+
6734
  var thead = $(this).children('thead');
6735
  if ( thead.length === 0 )
6736
  {
6751
  oSettings.nTBody.setAttribute( "aria-relevant", "all" );
6752
 
6753
  var tfoot = $(this).children('tfoot');
6754
+ if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
6755
+ {
6756
+ // If we are a scrolling table, and no footer has been given, then we need to create
6757
+ // a tfoot element for the caption element to be appended to
6758
+ tfoot = [ document.createElement( 'tfoot' ) ];
6759
+ this.appendChild( tfoot[0] );
6760
+ }
6761
+
6762
  if ( tfoot.length > 0 )
6763
  {
6764
  oSettings.nTFoot = tfoot[0];
6793
  _fnInitialise( oSettings );
6794
  }
6795
  } );
6796
+ _that = null;
6797
+ return this;
6798
+ };
6799
+
6800
+
6801
+
6802
+ /**
6803
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
6804
+ * to ensure compatibility.
6805
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
6806
+ * formats "X" and "X.Y" are also acceptable.
6807
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
6808
+ * version, or false if this version of DataTales is not suitable
6809
+ * @static
6810
+ * @dtopt API-Static
6811
+ *
6812
+ * @example
6813
+ * alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) );
6814
+ */
6815
+ DataTable.fnVersionCheck = function( sVersion )
6816
+ {
6817
+ /* This is cheap, but effective */
6818
+ var fnZPad = function (Zpad, count)
6819
+ {
6820
+ while(Zpad.length < count) {
6821
+ Zpad += '0';
6822
+ }
6823
+ return Zpad;
6824
+ };
6825
+ var aThis = DataTable.ext.sVersion.split('.');
6826
+ var aThat = sVersion.split('.');
6827
+ var sThis = '', sThat = '';
6828
+
6829
+ for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
6830
+ {
6831
+ sThis += fnZPad( aThis[i], 3 );
6832
+ sThat += fnZPad( aThat[i], 3 );
6833
+ }
6834
+
6835
+ return parseInt(sThis, 10) >= parseInt(sThat, 10);
6836
+ };
6837
+
6838
+
6839
+ /**
6840
+ * Check if a TABLE node is a DataTable table already or not.
6841
+ * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other
6842
+ * node types can be passed in, but will always return false).
6843
+ * @returns {boolean} true the table given is a DataTable, or false otherwise
6844
+ * @static
6845
+ * @dtopt API-Static
6846
+ *
6847
+ * @example
6848
+ * var ex = document.getElementById('example');
6849
+ * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {
6850
+ * $(ex).dataTable();
6851
+ * }
6852
+ */
6853
+ DataTable.fnIsDataTable = function ( nTable )
6854
+ {
6855
+ var o = DataTable.settings;
6856
+
6857
+ for ( var i=0 ; i<o.length ; i++ )
6858
+ {
6859
+ if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )
6860
+ {
6861
+ return true;
6862
+ }
6863
+ }
6864
+
6865
+ return false;
6866
+ };
6867
+
6868
+
6869
+ /**
6870
+ * Get all DataTable tables that have been initialised - optionally you can select to
6871
+ * get only currently visible tables.
6872
+ * @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or
6873
+ * visible tables only.
6874
+ * @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables
6875
+ * @static
6876
+ * @dtopt API-Static
6877
+ *
6878
+ * @example
6879
+ * var table = $.fn.dataTable.fnTables(true);
6880
+ * if ( table.length > 0 ) {
6881
+ * $(table).dataTable().fnAdjustColumnSizing();
6882
+ * }
6883
+ */
6884
+ DataTable.fnTables = function ( bVisible )
6885
+ {
6886
+ var out = [];
6887
+
6888
+ jQuery.each( DataTable.settings, function (i, o) {
6889
+ if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )
6890
+ {
6891
+ out.push( o.nTable );
6892
+ }
6893
+ } );
6894
+
6895
+ return out;
6896
  };
6897
+
6898
 
6899
  /**
6900
  * Version string for plug-ins to check compatibility. Allowed format is
6904
  * @type string
6905
  * @default Version number
6906
  */
6907
+ DataTable.version = "1.9.4";
6908
 
6909
  /**
6910
  * Private data store, containing all of the settings objects that are created for the
7020
  * </il>
7021
  * </ul>
7022
  *
7023
+ * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
7024
+ * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
7025
  * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
7026
  * prepare the data as required for the different types. As such, this method is deprecated.
7027
  * @type array
7152
  * alert( oTable.fnVersionCheck( '1.9.0' ) );
7153
  * } );
7154
  */
7155
+ "fnVersionCheck": DataTable.fnVersionCheck,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7156
 
7157
 
7158
  /**
7186
  * </il>
7187
  * </ul>
7188
  *
7189
+ * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
7190
+ * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
7191
  * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
7192
  * prepare the data as required for the different types. As such, this method is deprecated.
7193
  * @type object
7514
  /**
7515
  * Data object from the original data source for the row. This is either
7516
  * an array if using the traditional form of DataTables, or an object if
7517
+ * using mData options. The exact type will depend on the passed in
7518
  * data from the data source, or will be an array if using DOM a data
7519
  * source.
7520
  * @type array|object
7608
  "bSortable": null,
7609
 
7610
  /**
7611
+ * <code>Deprecated</code> When using fnRender, you have two options for what
7612
+ * to do with the data, and this property serves as the switch. Firstly, you
7613
+ * can have the sorting and filtering use the rendered value (true - default),
7614
+ * or you can have the sorting and filtering us the original value (false).
7615
+ *
7616
+ * Please note that this option has now been deprecated and will be removed
7617
+ * in the next version of DataTables. Please use mRender / mData rather than
7618
+ * fnRender.
7619
  * @type boolean
7620
  * @deprecated
7621
  */
7638
 
7639
  /**
7640
  * Developer definable function that is called whenever a cell is created (Ajax source,
7641
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
7642
  * allowing you to modify the DOM element (add background colour for example) when the
7643
+ * element is available.
7644
  * @type function
7645
  * @param {element} nTd The TD node that has been created
7646
  * @param {*} sData The Data for the cell
7653
  /**
7654
  * Function to get data from a cell in a column. You should <b>never</b>
7655
  * access data directly through _aData internally in DataTables - always use
7656
+ * the method attached to this property. It allows mData to function as
7657
  * required. This function is automatically assigned by the column
7658
  * initialisation method
7659
  * @type function
7667
  "fnGetData": null,
7668
 
7669
  /**
7670
+ * <code>Deprecated</code> Custom display function that will be called for the
7671
+ * display of each cell in this column.
7672
+ *
7673
+ * Please note that this option has now been deprecated and will be removed
7674
+ * in the next version of DataTables. Please use mRender / mData rather than
7675
+ * fnRender.
7676
  * @type function
7677
  * @param {object} o Object with the following parameters:
7678
  * @param {int} o.iDataRow The row in aoData
7679
  * @param {int} o.iDataColumn The column in question
7680
+ * @param {array} o.aData The data for the row in question
7681
  * @param {object} o.oSettings The settings object for this DataTables instance
7682
  * @returns {string} The string you which to use in the display
7683
  * @default null
7684
+ * @deprecated
7685
  */
7686
  "fnRender": null,
7687
 
7688
  /**
7689
  * Function to set data for a cell in the column. You should <b>never</b>
7690
  * set the data directly to _aData internally in DataTables - always use
7691
+ * this method. It allows mData to function as required. This function
7692
  * is automatically assigned by the column initialisation method
7693
  * @type function
7694
  * @param {array|object} oData The data array/object for the array
7705
  * @type function|int|string|null
7706
  * @default null
7707
  */
7708
+ "mData": null,
7709
+
7710
+ /**
7711
+ * Partner property to mData which is used (only when defined) to get
7712
+ * the data - i.e. it is basically the same as mData, but without the
7713
+ * 'set' option, and also the data fed to it is the result from mData.
7714
+ * This is the rendering method to match the data method of mData.
7715
+ * @type function|int|string|null
7716
+ * @default null
7717
+ */
7718
+ "mRender": null,
7719
 
7720
  /**
7721
  * Unique header TH/TD element for this column - this is what the sorting
7756
 
7757
  /**
7758
  * Allows a default value to be given for a column's data, and will be used
7759
+ * whenever a null data source is encountered (this can be because mData
7760
  * is set to null, or because the data source itself is null).
7761
  * @type string
7762
  * @default null
7857
  * } );
7858
  *
7859
  * @example
7860
+ * // Using an array of objects as a data source (mData)
7861
  * $(document).ready( function () {
7862
  * $('#example').dataTable( {
7863
  * "aaData": [
7877
  * }
7878
  * ],
7879
  * "aoColumns": [
7880
+ * { "sTitle": "Engine", "mData": "engine" },
7881
+ * { "sTitle": "Browser", "mData": "browser" },
7882
+ * { "sTitle": "Platform", "mData": "platform" },
7883
+ * { "sTitle": "Version", "mData": "version" },
7884
+ * { "sTitle": "Grade", "mData": "grade" }
7885
  * ]
7886
  * } );
7887
  * } );
7950
  * @dtopt Option
7951
  *
7952
  * @example
7953
+ * $(document).ready( function() {
7954
  * $('#example').dataTable( {
7955
  * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
7956
  * } );
7960
  * // Setting the default display length as well as length menu
7961
  * // This is likely to be wanted if you remove the '10' option which
7962
  * // is the iDisplayLength default.
7963
+ * $(document).ready( function() {
7964
  * $('#example').dataTable( {
7965
  * "iDisplayLength": 25,
7966
  * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
8032
  * array may be of any length, and DataTables will apply each class
8033
  * sequentially, looping when required.
8034
  * @type array
8035
+ * @default null <i>Will take the values determined by the oClasses.sStripe*
8036
+ * options</i>
8037
  * @dtopt Option
8038
  *
8039
  * @example
8043
  * } );
8044
  * } )
8045
  */
8046
+ "asStripeClasses": null,
8047
 
8048
 
8049
  /**
8075
  * @dtopt Features
8076
  *
8077
  * @example
8078
+ * $(document).ready( function() {
8079
  * var oTable = $('#example').dataTable( {
8080
  * "sAjaxSource": "sources/arrays.txt",
8081
  * "bDeferRender": true
8095
  * @dtopt Options
8096
  *
8097
  * @example
8098
+ * $(document).ready( function() {
8099
  * $('#example').dataTable( {
8100
  * "sScrollY": "200px",
8101
  * "bPaginate": false
8118
  * specified (this allow matching across multiple columns). Note that if you
8119
  * wish to use filtering in DataTables this must remain 'true' - to remove the
8120
  * default filtering input box and retain filtering abilities, please use
8121
+ * {@link DataTable.defaults.sDom}.
8122
  * @type boolean
8123
  * @default true
8124
  * @dtopt Features
8234
  * @dtopt Options
8235
  *
8236
  * @example
8237
+ * $(document).ready( function() {
8238
  * initTable();
8239
  * tableActions();
8240
  * } );
8266
  * @dtopt Options
8267
  *
8268
  * @example
8269
+ * $(document).ready( function() {
8270
  * $('#example').dataTable( {
8271
  * "bScrollAutoCss": false,
8272
  * "sScrollY": "200px"
8288
  * @dtopt Options
8289
  *
8290
  * @example
8291
+ * $(document).ready( function() {
8292
  * $('#example').dataTable( {
8293
  * "sScrollY": "200",
8294
  * "bScrollCollapse": true
8310
  * @dtopt Features
8311
  *
8312
  * @example
8313
+ * $(document).ready( function() {
8314
  * $('#example').dataTable( {
8315
  * "bScrollInfinite": true,
8316
  * "bScrollCollapse": true,
8367
  * @dtopt Options
8368
  *
8369
  * @example
8370
+ * $(document).ready( function() {
8371
  * $('#example').dataTable( {
8372
  * "bSortCellsTop": true
8373
  * } );
8454
  * @dtopt Callbacks
8455
  *
8456
  * @example
8457
+ * $(document).ready( function() {
8458
  * $('#example').dataTable( {
8459
  * "fnCreatedRow": function( nRow, aData, iDataIndex ) {
8460
  * // Bold the grade for all 'A' grade browsers
8479
  * @example
8480
  * $(document).ready( function() {
8481
  * $('#example').dataTable( {
8482
+ * "fnDrawCallback": function( oSettings ) {
8483
  * alert( 'DataTables has redrawn the table' );
8484
  * }
8485
  * } );
8527
  * @dtopt Callbacks
8528
  *
8529
  * @example
8530
+ * $(document).ready( function() {
8531
  * $('#example').dataTable( {
8532
  * "fnFormatNumber": function ( iIn ) {
8533
  * if ( iIn &lt; 1000 ) {
8686
  * @dtopt Callbacks
8687
  *
8688
  * @example
8689
+ * $(document).ready( function() {
8690
  * $('#example').dataTable( {
8691
  * "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
8692
  * // Bold the grade for all 'A' grade browsers
8719
  *
8720
  * @example
8721
  * // POST data to server
8722
+ * $(document).ready( function() {
8723
  * $('#example').dataTable( {
8724
  * "bProcessing": true,
8725
  * "bServerSide": true,
8726
  * "sAjaxSource": "xhr.php",
8727
+ * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
8728
+ * oSettings.jqXHR = $.ajax( {
8729
  * "dataType": 'json',
8730
  * "type": "POST",
8731
  * "url": sSource,
8741
  "url": sUrl,
8742
  "data": aoData,
8743
  "success": function (json) {
8744
+ if ( json.sError ) {
8745
+ oSettings.oApi._fnLog( oSettings, 0, json.sError );
8746
+ }
8747
+
8748
+ $(oSettings.oInstance).trigger('xhr', [oSettings, json]);
8749
  fnCallback( json );
8750
  },
8751
  "dataType": "json",
8753
  "type": oSettings.sServerMethod,
8754
  "error": function (xhr, error, thrown) {
8755
  if ( error == "parsererror" ) {
8756
+ oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
8757
+ "server could not be parsed. This is caused by a JSON formatting error." );
8758
  }
8759
  }
8760
  } );
8779
  * @dtopt Server-side
8780
  *
8781
  * @example
8782
+ * $(document).ready( function() {
8783
  * $('#example').dataTable( {
8784
  * "bProcessing": true,
8785
  * "bServerSide": true,
8804
  * @dtopt Callbacks
8805
  *
8806
  * @example
8807
+ * $(document).ready( function() {
8808
  * $('#example').dataTable( {
8809
  * "bStateSave": true,
8810
+ * "fnStateLoad": function (oSettings) {
8811
  * var o;
8812
  *
8813
  * // Send an Ajax request to the server to get the data. Note that
8854
  *
8855
  * @example
8856
  * // Remove a saved filter, so filtering is never loaded
8857
+ * $(document).ready( function() {
8858
  * $('#example').dataTable( {
8859
  * "bStateSave": true,
8860
  * "fnStateLoadParams": function (oSettings, oData) {
8861
+ * oData.oSearch.sSearch = "";
8862
+ * }
8863
  * } );
8864
  * } );
8865
  *
8866
  * @example
8867
  * // Disallow state loading by returning false
8868
+ * $(document).ready( function() {
8869
  * $('#example').dataTable( {
8870
  * "bStateSave": true,
8871
  * "fnStateLoadParams": function (oSettings, oData) {
8872
  * return false;
8873
+ * }
8874
  * } );
8875
  * } );
8876
  */
8887
  *
8888
  * @example
8889
  * // Show an alert with the filtering value that was saved
8890
+ * $(document).ready( function() {
8891
  * $('#example').dataTable( {
8892
  * "bStateSave": true,
8893
  * "fnStateLoaded": function (oSettings, oData) {
8894
+ * alert( 'Saved filter was: '+oData.oSearch.sSearch );
8895
+ * }
8896
  * } );
8897
  * } );
8898
  */
8910
  * @dtopt Callbacks
8911
  *
8912
  * @example
8913
+ * $(document).ready( function() {
8914
  * $('#example').dataTable( {
8915
  * "bStateSave": true,
8916
  * "fnStateSave": function (oSettings, oData) {
8950
  *
8951
  * @example
8952
  * // Remove a saved filter, so filtering is never saved
8953
+ * $(document).ready( function() {
8954
  * $('#example').dataTable( {
8955
  * "bStateSave": true,
8956
+ * "fnStateSaveParams": function (oSettings, oData) {
8957
+ * oData.oSearch.sSearch = "";
8958
+ * }
8959
  * } );
8960
  * } );
8961
  */
8972
  * @example
8973
  * $(document).ready( function() {
8974
  * $('#example').dataTable( {
8975
+ * "iCookieDuration": 60*60*24; // 1 day
8976
  * } );
8977
  * } )
8978
  */
8985
  * will be applied to it), thus saving on an XHR at load time. iDeferLoading
8986
  * is used to indicate that deferred loading is required, but it is also used
8987
  * to tell DataTables how many records there are in the full table (allowing
8988
+ * the information element and pagination to be displayed correctly). In the case
8989
+ * where a filtering is applied to the table on initial load, this can be
8990
+ * indicated by giving the parameter as an array, where the first element is
8991
+ * the number of records available after filtering and the second element is the
8992
+ * number of records without filtering (allowing the table information element
8993
+ * to be shown correctly).
8994
+ * @type int | array
8995
  * @default null
8996
  * @dtopt Options
8997
  *
8998
  * @example
8999
+ * // 57 records available in the table, no filtering applied
9000
+ * $(document).ready( function() {
9001
  * $('#example').dataTable( {
9002
  * "bServerSide": true,
9003
  * "sAjaxSource": "scripts/server_processing.php",
9004
  * "iDeferLoading": 57
9005
  * } );
9006
  * } );
9007
+ *
9008
+ * @example
9009
+ * // 57 records after filtering, 100 without filtering (an initial filter applied)
9010
+ * $(document).ready( function() {
9011
+ * $('#example').dataTable( {
9012
+ * "bServerSide": true,
9013
+ * "sAjaxSource": "scripts/server_processing.php",
9014
+ * "iDeferLoading": [ 57, 100 ],
9015
+ * "oSearch": {
9016
+ * "sSearch": "my_filter"
9017
+ * }
9018
+ * } );
9019
+ * } );
9020
  */
9021
  "iDeferLoading": null,
9022
 
9068
  * @dtopt Options
9069
  *
9070
  * @example
9071
+ * $(document).ready( function() {
9072
  * $('#example').dataTable( {
9073
  * "bScrollInfinite": true,
9074
  * "bScrollCollapse": true,
9092
  * @dtopt Options
9093
  *
9094
  * @example
9095
+ * $(document).ready( function() {
9096
  * $('#example').dataTable( {
9097
  * "iTabIndex": 1
9098
  * } );
9124
  * @dtopt Language
9125
  *
9126
  * @example
9127
+ * $(document).ready( function() {
9128
  * $('#example').dataTable( {
9129
  * "oLanguage": {
9130
  * "oAria": {
9145
  * @dtopt Language
9146
  *
9147
  * @example
9148
+ * $(document).ready( function() {
9149
  * $('#example').dataTable( {
9150
  * "oLanguage": {
9151
  * "oAria": {
9172
  * @dtopt Language
9173
  *
9174
  * @example
9175
+ * $(document).ready( function() {
9176
  * $('#example').dataTable( {
9177
  * "oLanguage": {
9178
  * "oPaginate": {
9193
  * @dtopt Language
9194
  *
9195
  * @example
9196
+ * $(document).ready( function() {
9197
  * $('#example').dataTable( {
9198
  * "oLanguage": {
9199
  * "oPaginate": {
9207
 
9208
 
9209
  /**
9210
+ * Text to use for the 'next' pagination button (to take the user to the
9211
+ * next page).
9212
  * @type string
9213
  * @default Next
9214
  * @dtopt Language
9215
  *
9216
  * @example
9217
+ * $(document).ready( function() {
9218
  * $('#example').dataTable( {
9219
  * "oLanguage": {
9220
  * "oPaginate": {
9228
 
9229
 
9230
  /**
9231
+ * Text to use for the 'previous' pagination button (to take the user to
9232
+ * the previous page).
9233
  * @type string
9234
  * @default Previous
9235
  * @dtopt Language
9236
  *
9237
  * @example
9238
+ * $(document).ready( function() {
9239
  * $('#example').dataTable( {
9240
  * "oLanguage": {
9241
  * "oPaginate": {
9258
  * @dtopt Language
9259
  *
9260
  * @example
9261
+ * $(document).ready( function() {
9262
  * $('#example').dataTable( {
9263
  * "oLanguage": {
9264
  * "sEmptyTable": "No data available in table"
9279
  * @dtopt Language
9280
  *
9281
  * @example
9282
+ * $(document).ready( function() {
9283
  * $('#example').dataTable( {
9284
  * "oLanguage": {
9285
  * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
9298
  * @dtopt Language
9299
  *
9300
  * @example
9301
+ * $(document).ready( function() {
9302
  * $('#example').dataTable( {
9303
  * "oLanguage": {
9304
  * "sInfoEmpty": "No entries to show"
9318
  * @dtopt Language
9319
  *
9320
  * @example
9321
+ * $(document).ready( function() {
9322
  * $('#example').dataTable( {
9323
  * "oLanguage": {
9324
  * "sInfoFiltered": " - filtering from _MAX_ records"
9339
  * @dtopt Language
9340
  *
9341
  * @example
9342
+ * $(document).ready( function() {
9343
  * $('#example').dataTable( {
9344
  * "oLanguage": {
9345
  * "sInfoPostFix": "All records shown are derived from real information."
9360
  * @dtopt Language
9361
  *
9362
  * @example
9363
+ * $(document).ready( function() {
9364
  * $('#example').dataTable( {
9365
  * "oLanguage": {
9366
  * "sInfoThousands": "'"
9382
  *
9383
  * @example
9384
  * // Language change only
9385
+ * $(document).ready( function() {
9386
  * $('#example').dataTable( {
9387
  * "oLanguage": {
9388
  * "sLengthMenu": "Display _MENU_ records"
9392
  *
9393
  * @example
9394
  * // Language and options change
9395
+ * $(document).ready( function() {
9396
  * $('#example').dataTable( {
9397
  * "oLanguage": {
9398
  * "sLengthMenu": 'Display <select>'+
9440
  * @dtopt Language
9441
  *
9442
  * @example
9443
+ * $(document).ready( function() {
9444
  * $('#example').dataTable( {
9445
  * "oLanguage": {
9446
  * "sProcessing": "DataTables is currently busy"
9463
  *
9464
  * @example
9465
  * // Input text box will be appended at the end automatically
9466
+ * $(document).ready( function() {
9467
  * $('#example').dataTable( {
9468
  * "oLanguage": {
9469
  * "sSearch": "Filter records:"
9473
  *
9474
  * @example
9475
  * // Specify where the filter should appear
9476
+ * $(document).ready( function() {
9477
  * $('#example').dataTable( {
9478
  * "oLanguage": {
9479
  * "sSearch": "Apply filter _INPUT_ to table"
9496
  * @dtopt Language
9497
  *
9498
  * @example
9499
+ * $(document).ready( function() {
9500
  * $('#example').dataTable( {
9501
  * "oLanguage": {
9502
  * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
9516
  * @dtopt Language
9517
  *
9518
  * @example
9519
+ * $(document).ready( function() {
9520
  * $('#example').dataTable( {
9521
  * "oLanguage": {
9522
  * "sZeroRecords": "No records to display"
9562
  *
9563
  * @example
9564
  * // Get data from { "data": [...] }
9565
+ * $(document).ready( function() {
9566
  * var oTable = $('#example').dataTable( {
9567
  * "sAjaxSource": "sources/data.txt",
9568
  * "sAjaxDataProp": "data"
9571
  *
9572
  * @example
9573
  * // Get data from { "data": { "inner": [...] } }
9574
+ * $(document).ready( function() {
9575
  * var oTable = $('#example').dataTable( {
9576
  * "sAjaxSource": "sources/data.txt",
9577
  * "sAjaxDataProp": "data.inner"
9609
  * @dtopt Options
9610
  *
9611
  * @example
9612
+ * $(document).ready( function() {
9613
  * $('#example').dataTable( {
9614
  * "sCookiePrefix": "my_datatable_",
9615
  * } );
9661
  * @dtopt Options
9662
  *
9663
  * @example
9664
+ * $(document).ready( function() {
9665
  * $('#example').dataTable( {
9666
+ * "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
9667
  * } );
9668
  * } );
9669
  */
9692
  * Enable horizontal scrolling. When a table is too wide to fit into a certain
9693
  * layout, or you have a large number of columns in the table, you can enable
9694
  * x-scrolling to show the table in a viewport, which can be scrolled. This
9695
+ * property can be any CSS unit, or a number (in which case it will be treated
9696
  * as a pixel measurement).
9697
  * @type string
9698
  * @default <i>blank string - i.e. disabled</i>
9699
  * @dtopt Features
9700
  *
9701
  * @example
9702
+ * $(document).ready( function() {
9703
  * $('#example').dataTable( {
9704
  * "sScrollX": "100%",
9705
  * "bScrollCollapse": true
9721
  * @dtopt Options
9722
  *
9723
  * @example
9724
+ * $(document).ready( function() {
9725
  * $('#example').dataTable( {
9726
  * "sScrollX": "100%",
9727
  * "sScrollXInner": "110%"
9733
 
9734
  /**
9735
  * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
9736
+ * to the given height, and enable scrolling for any data which overflows the
9737
  * current viewport. This can be used as an alternative to paging to display
9738
  * a lot of data in a small area (although paging and scrolling can both be
9739
+ * enabled at the same time). This property can be any CSS unit, or a number
9740
  * (in which case it will be treated as a pixel measurement).
9741
  * @type string
9742
  * @default <i>blank string - i.e. disabled</i>
9743
  * @dtopt Features
9744
  *
9745
  * @example
9746
+ * $(document).ready( function() {
9747
  * $('#example').dataTable( {
9748
  * "sScrollY": "200px",
9749
  * "bPaginate": false
9762
  * @dtopt Server-side
9763
  *
9764
  * @example
9765
+ * $(document).ready( function() {
9766
  * $('#example').dataTable( {
9767
  * "bServerSide": true,
9768
  * "sAjaxSource": "scripts/post.php",
9790
  *
9791
  * @example
9792
  * // Using aoColumnDefs
9793
+ * $(document).ready( function() {
9794
  * $('#example').dataTable( {
9795
  * "aoColumnDefs": [
9796
  * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
9802
  *
9803
  * @example
9804
  * // Using aoColumns
9805
+ * $(document).ready( function() {
9806
  * $('#example').dataTable( {
9807
  * "aoColumns": [
9808
  * { "aDataSort": [ 0, 1 ] },
9827
  *
9828
  * @example
9829
  * // Using aoColumnDefs
9830
+ * $(document).ready( function() {
9831
  * $('#example').dataTable( {
9832
  * "aoColumnDefs": [
9833
  * { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
9839
  *
9840
  * @example
9841
  * // Using aoColumns
9842
+ * $(document).ready( function() {
9843
  * $('#example').dataTable( {
9844
  * "aoColumns": [
9845
  * null,
9862
  *
9863
  * @example
9864
  * // Using aoColumnDefs
9865
+ * $(document).ready( function() {
9866
  * $('#example').dataTable( {
9867
  * "aoColumnDefs": [
9868
  * { "bSearchable": false, "aTargets": [ 0 ] }
9871
  *
9872
  * @example
9873
  * // Using aoColumns
9874
+ * $(document).ready( function() {
9875
  * $('#example').dataTable( {
9876
  * "aoColumns": [
9877
  * { "bSearchable": false },
9893
  *
9894
  * @example
9895
  * // Using aoColumnDefs
9896
+ * $(document).ready( function() {
9897
  * $('#example').dataTable( {
9898
  * "aoColumnDefs": [
9899
  * { "bSortable": false, "aTargets": [ 0 ] }
9902
  *
9903
  * @example
9904
  * // Using aoColumns
9905
+ * $(document).ready( function() {
9906
  * $('#example').dataTable( {
9907
  * "aoColumns": [
9908
  * { "bSortable": false },
9917
 
9918
 
9919
  /**
9920
+ * <code>Deprecated</code> When using fnRender() for a column, you may wish
9921
+ * to use the original data (before rendering) for sorting and filtering
9922
+ * (the default is to used the rendered data that the user can see). This
9923
+ * may be useful for dates etc.
9924
  *
9925
+ * Please note that this option has now been deprecated and will be removed
9926
+ * in the next version of DataTables. Please use mRender / mData rather than
9927
+ * fnRender.
9928
  * @type boolean
9929
  * @default true
9930
  * @dtopt Columns
9931
+ * @deprecated
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9932
  */
9933
  "bUseRendered": true,
9934
 
9941
  *
9942
  * @example
9943
  * // Using aoColumnDefs
9944
+ * $(document).ready( function() {
9945
  * $('#example').dataTable( {
9946
  * "aoColumnDefs": [
9947
  * { "bVisible": false, "aTargets": [ 0 ] }
9950
  *
9951
  * @example
9952
  * // Using aoColumns
9953
+ * $(document).ready( function() {
9954
  * $('#example').dataTable( {
9955
  * "aoColumns": [
9956
  * { "bVisible": false },
9966
 
9967
  /**
9968
  * Developer definable function that is called whenever a cell is created (Ajax source,
9969
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
9970
  * allowing you to modify the DOM element (add background colour for example) when the
9971
+ * element is available.
9972
  * @type function
9973
  * @param {element} nTd The TD node that has been created
9974
  * @param {*} sData The Data for the cell
9978
  * @dtopt Columns
9979
  *
9980
  * @example
9981
+ * $(document).ready( function() {
9982
  * $('#example').dataTable( {
9983
  * "aoColumnDefs": [ {
9984
  * "aTargets": [3],
9995
 
9996
 
9997
  /**
9998
+ * <code>Deprecated</code> Custom display function that will be called for the
9999
+ * display of each cell in this column.
10000
+ *
10001
+ * Please note that this option has now been deprecated and will be removed
10002
+ * in the next version of DataTables. Please use mRender / mData rather than
10003
+ * fnRender.
10004
  * @type function
10005
  * @param {object} o Object with the following parameters:
10006
  * @param {int} o.iDataRow The row in aoData
10011
  * @param {*} val The current cell value
10012
  * @returns {string} The string you which to use in the display
10013
  * @dtopt Columns
10014
+ * @deprecated
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10015
  */
10016
  "fnRender": null,
10017
 
10026
  *
10027
  * @example
10028
  * // Using aoColumnDefs
10029
+ * $(document).ready( function() {
10030
  * $('#example').dataTable( {
10031
  * "aoColumnDefs": [
10032
  * { "iDataSort": 1, "aTargets": [ 0 ] }
10036
  *
10037
  * @example
10038
  * // Using aoColumns
10039
+ * $(document).ready( function() {
10040
  * $('#example').dataTable( {
10041
  * "aoColumns": [
10042
  * { "iDataSort": 1 },
10051
  "iDataSort": -1,
10052
 
10053
 
10054
+ /**
10055
+ * This parameter has been replaced by mData in DataTables to ensure naming
10056
+ * consistency. mDataProp can still be used, as there is backwards compatibility
10057
+ * in DataTables for this option, but it is strongly recommended that you use
10058
+ * mData in preference to mDataProp.
10059
+ * @name DataTable.defaults.columns.mDataProp
10060
+ */
10061
+
10062
+
10063
  /**
10064
  * This property can be used to read data from any JSON data source property,
10065
+ * including deeply nested objects / properties. mData can be given in a
10066
  * number of different ways which effect its behaviour:
10067
  * <ul>
10068
  * <li>integer - treated as an array index for the data source. This is the
10069
  * default that DataTables uses (incrementally increased for each column).</li>
10070
  * <li>string - read an object property from the data source. Note that you can
10071
+ * use Javascript dotted notation to read deep properties / arrays from the
10072
  * data source.</li>
10073
+ * <li>null - the sDefaultContent option will be used for the cell (null
10074
+ * by default, so you will need to specify the default content you want -
10075
+ * typically an empty string). This can be useful on generated columns such
10076
+ * as edit / delete action columns.</li>
10077
  * <li>function - the function given will be executed whenever DataTables
10078
  * needs to set or get the data for a cell in the column. The function
10079
  * takes three parameters:
10080
  * <ul>
10081
  * <li>{array|object} The data source for the row</li>
10082
  * <li>{string} The type call data requested - this will be 'set' when
10083
+ * setting data or 'filter', 'display', 'type', 'sort' or undefined when
10084
+ * gathering data. Note that when <i>undefined</i> is given for the type
10085
+ * DataTables expects to get the raw data for the object back</li>
10086
  * <li>{*} Data to set when the second parameter is 'set'.</li>
10087
  * </ul>
10088
  * The return value from the function is not required when 'set' is the type
10089
  * of call, but otherwise the return is what will be used for the data
10090
  * requested.</li>
10091
  * </ul>
10092
+ *
10093
+ * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change
10094
+ * reflects the flexibility of this property and is consistent with the naming of
10095
+ * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as
10096
+ * it automatically maps the old name to the new if required.
10097
  * @type string|int|function|null
10098
  * @default null <i>Use automatically calculated column index</i>
10099
  * @dtopt Columns
10100
  *
10101
  * @example
10102
  * // Read table data from objects
10103
+ * $(document).ready( function() {
10104
  * var oTable = $('#example').dataTable( {
10105
  * "sAjaxSource": "sources/deep.txt",
10106
  * "aoColumns": [
10107
+ * { "mData": "engine" },
10108
+ * { "mData": "browser" },
10109
+ * { "mData": "platform.inner" },
10110
+ * { "mData": "platform.details.0" },
10111
+ * { "mData": "platform.details.1" }
10112
  * ]
10113
  * } );
10114
  * } );
10115
  *
10116
  * @example
10117
+ * // Using mData as a function to provide different information for
10118
  * // sorting, filtering and display. In this case, currency (price)
10119
+ * $(document).ready( function() {
10120
  * var oTable = $('#example').dataTable( {
10121
+ * "aoColumnDefs": [ {
 
10122
  * "aTargets": [ 0 ],
10123
+ * "mData": function ( source, type, val ) {
10124
  * if (type === 'set') {
10125
  * source.price = val;
10126
  * // Store the computed dislay and filter values for efficiency
10134
  * else if (type === 'filter') {
10135
  * return source.price_filter;
10136
  * }
10137
+ * // 'sort', 'type' and undefined all just use the integer
10138
  * return source.price;
10139
  * }
10140
+ * } ]
10141
+ * } );
10142
+ * } );
10143
+ */
10144
+ "mData": null,
10145
+
10146
+
10147
+ /**
10148
+ * This property is the rendering partner to mData and it is suggested that
10149
+ * when you want to manipulate data for display (including filtering, sorting etc)
10150
+ * but not altering the underlying data for the table, use this property. mData
10151
+ * can actually do everything this property can and more, but this parameter is
10152
+ * easier to use since there is no 'set' option. Like mData is can be given
10153
+ * in a number of different ways to effect its behaviour, with the addition of
10154
+ * supporting array syntax for easy outputting of arrays (including arrays of
10155
+ * objects):
10156
+ * <ul>
10157
+ * <li>integer - treated as an array index for the data source. This is the
10158
+ * default that DataTables uses (incrementally increased for each column).</li>
10159
+ * <li>string - read an object property from the data source. Note that you can
10160
+ * use Javascript dotted notation to read deep properties / arrays from the
10161
+ * data source and also array brackets to indicate that the data reader should
10162
+ * loop over the data source array. When characters are given between the array
10163
+ * brackets, these characters are used to join the data source array together.
10164
+ * For example: "accounts[, ].name" would result in a comma separated list with
10165
+ * the 'name' value from the 'accounts' array of objects.</li>
10166
+ * <li>function - the function given will be executed whenever DataTables
10167
+ * needs to set or get the data for a cell in the column. The function
10168
+ * takes three parameters:
10169
+ * <ul>
10170
+ * <li>{array|object} The data source for the row (based on mData)</li>
10171
+ * <li>{string} The type call data requested - this will be 'filter', 'display',
10172
+ * 'type' or 'sort'.</li>
10173
+ * <li>{array|object} The full data source for the row (not based on mData)</li>
10174
+ * </ul>
10175
+ * The return value from the function is what will be used for the data
10176
+ * requested.</li>
10177
+ * </ul>
10178
+ * @type string|int|function|null
10179
+ * @default null <i>Use mData</i>
10180
+ * @dtopt Columns
10181
+ *
10182
+ * @example
10183
+ * // Create a comma separated list from an array of objects
10184
+ * $(document).ready( function() {
10185
+ * var oTable = $('#example').dataTable( {
10186
+ * "sAjaxSource": "sources/deep.txt",
10187
+ * "aoColumns": [
10188
+ * { "mData": "engine" },
10189
+ * { "mData": "browser" },
10190
+ * {
10191
+ * "mData": "platform",
10192
+ * "mRender": "[, ].name"
10193
+ * }
10194
+ * ]
10195
+ * } );
10196
+ * } );
10197
+ *
10198
+ * @example
10199
+ * // Use as a function to create a link from the data source
10200
+ * $(document).ready( function() {
10201
+ * var oTable = $('#example').dataTable( {
10202
+ * "aoColumnDefs": [
10203
+ * {
10204
+ * "aTargets": [ 0 ],
10205
+ * "mData": "download_link",
10206
+ * "mRender": function ( data, type, full ) {
10207
+ * return '<a href="'+data+'">Download</a>';
10208
+ * }
10209
  * ]
10210
  * } );
10211
  * } );
10212
  */
10213
+ "mRender": null,
10214
+
10215
+
10216
+ /**
10217
+ * Change the cell type created for the column - either TD cells or TH cells. This
10218
+ * can be useful as TH cells have semantic meaning in the table body, allowing them
10219
+ * to act as a header for a row (you may wish to add scope='row' to the TH elements).
10220
+ * @type string
10221
+ * @default td
10222
+ * @dtopt Columns
10223
+ *
10224
+ * @example
10225
+ * // Make the first column use TH cells
10226
+ * $(document).ready( function() {
10227
+ * var oTable = $('#example').dataTable( {
10228
+ * "aoColumnDefs": [ {
10229
+ * "aTargets": [ 0 ],
10230
+ * "sCellType": "th"
10231
+ * } ]
10232
+ * } );
10233
+ * } );
10234
+ */
10235
+ "sCellType": "td",
10236
 
10237
 
10238
  /**
10243
  *
10244
  * @example
10245
  * // Using aoColumnDefs
10246
+ * $(document).ready( function() {
10247
  * $('#example').dataTable( {
10248
  * "aoColumnDefs": [
10249
  * { "sClass": "my_class", "aTargets": [ 0 ] }
10253
  *
10254
  * @example
10255
  * // Using aoColumns
10256
+ * $(document).ready( function() {
10257
  * $('#example').dataTable( {
10258
  * "aoColumns": [
10259
  * { "sClass": "my_class" },
10284
  *
10285
  * @example
10286
  * // Using aoColumns
10287
+ * $(document).ready( function() {
10288
  * $('#example').dataTable( {
10289
  * "aoColumns": [
10290
  * null,
10302
 
10303
  /**
10304
  * Allows a default value to be given for a column's data, and will be used
10305
+ * whenever a null data source is encountered (this can be because mData
10306
  * is set to null, or because the data source itself is null).
10307
  * @type string
10308
  * @default null
10310
  *
10311
  * @example
10312
  * // Using aoColumnDefs
10313
+ * $(document).ready( function() {
10314
  * $('#example').dataTable( {
10315
  * "aoColumnDefs": [
10316
  * {
10317
+ * "mData": null,
10318
  * "sDefaultContent": "Edit",
10319
  * "aTargets": [ -1 ]
10320
  * }
10324
  *
10325
  * @example
10326
  * // Using aoColumns
10327
+ * $(document).ready( function() {
10328
  * $('#example').dataTable( {
10329
  * "aoColumns": [
10330
  * null,
10331
  * null,
10332
  * null,
10333
  * {
10334
+ * "mData": null,
10335
  * "sDefaultContent": "Edit"
10336
  * }
10337
  * ]
10354
  *
10355
  * @example
10356
  * // Using aoColumnDefs
10357
+ * $(document).ready( function() {
10358
  * $('#example').dataTable( {
10359
  * "aoColumnDefs": [
10360
  * { "sName": "engine", "aTargets": [ 0 ] },
10368
  *
10369
  * @example
10370
  * // Using aoColumns
10371
+ * $(document).ready( function() {
10372
  * $('#example').dataTable( {
10373
  * "aoColumns": [
10374
  * { "sName": "engine" },
10385
 
10386
  /**
10387
  * Defines a data source type for the sorting which can be used to read
10388
+ * real-time information from the table (updating the internally cached
10389
  * version) prior to sorting. This allows sorting to occur on user editable
10390
  * elements such as form inputs.
10391
  * @type string
10394
  *
10395
  * @example
10396
  * // Using aoColumnDefs
10397
+ * $(document).ready( function() {
10398
  * $('#example').dataTable( {
10399
  * "aoColumnDefs": [
10400
  * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
10407
  *
10408
  * @example
10409
  * // Using aoColumns
10410
+ * $(document).ready( function() {
10411
  * $('#example').dataTable( {
10412
  * "aoColumns": [
10413
  * null,
10432
  *
10433
  * @example
10434
  * // Using aoColumnDefs
10435
+ * $(document).ready( function() {
10436
  * $('#example').dataTable( {
10437
  * "aoColumnDefs": [
10438
  * { "sTitle": "My column title", "aTargets": [ 0 ] }
10442
  *
10443
  * @example
10444
  * // Using aoColumns
10445
+ * $(document).ready( function() {
10446
  * $('#example').dataTable( {
10447
  * "aoColumns": [
10448
  * { "sTitle": "My column title" },
10471
  *
10472
  * @example
10473
  * // Using aoColumnDefs
10474
+ * $(document).ready( function() {
10475
  * $('#example').dataTable( {
10476
  * "aoColumnDefs": [
10477
  * { "sType": "html", "aTargets": [ 0 ] }
10481
  *
10482
  * @example
10483
  * // Using aoColumns
10484
+ * $(document).ready( function() {
10485
  * $('#example').dataTable( {
10486
  * "aoColumns": [
10487
  * { "sType": "html" },
10498
 
10499
  /**
10500
  * Defining the width of the column, this parameter may take any CSS value
10501
+ * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not
10502
  * been given a specific width through this interface ensuring that the table
10503
  * remains readable.
10504
  * @type string
10507
  *
10508
  * @example
10509
  * // Using aoColumnDefs
10510
+ * $(document).ready( function() {
10511
  * $('#example').dataTable( {
10512
  * "aoColumnDefs": [
10513
  * { "sWidth": "20%", "aTargets": [ 0 ] }
10517
  *
10518
  * @example
10519
  * // Using aoColumns
10520
+ * $(document).ready( function() {
10521
  * $('#example').dataTable( {
10522
  * "aoColumns": [
10523
  * { "sWidth": "20%" },
10757
  * Information callback function. See
10758
  * {@link DataTable.defaults.fnInfoCallback}
10759
  * @type function
10760
+ * @default null
10761
  */
10762
  "fnInfoCallback": null
10763
  },
10764
 
10765
+ /**
10766
+ * Browser support parameters
10767
+ * @namespace
10768
+ */
10769
+ "oBrowser": {
10770
+ /**
10771
+ * Indicate if the browser incorrectly calculates width:100% inside a
10772
+ * scrolling element (IE6/7)
10773
+ * @type boolean
10774
+ * @default false
10775
+ */
10776
+ "bScrollOversize": false
10777
+ },
10778
+
10779
  /**
10780
  * Array referencing the nodes which are used for the features. The
10781
  * parameters of this object match what is allowed by sDom - i.e.
11402
  * tabindex attribute value that is added to DataTables control elements, allowing
11403
  * keyboard navigation of the table and its controls.
11404
  */
11405
+ "iTabIndex": 0,
11406
+
11407
+ /**
11408
+ * DIV container for the footer scrolling table if scrolling
11409
+ */
11410
+ "nScrollHead": null,
11411
+
11412
+ /**
11413
+ * DIV container for the footer scrolling table if scrolling
11414
+ */
11415
+ "nScrollFoot": null
11416
  };
11417
 
11418
  /**
11486
  "sScrollFootInner": "dataTables_scrollFootInner",
11487
 
11488
  /* Misc */
11489
+ "sFooterTH": "",
11490
+ "sJUIHeader": "",
11491
+ "sJUIFooter": ""
11492
  } );
11493
 
11494
 
11532
  "sScrollFoot": "dataTables_scrollFoot ui-state-default",
11533
 
11534
  /* Misc */
11535
+ "sFooterTH": "ui-state-default",
11536
+ "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",
11537
+ "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"
11538
  } );
11539
 
 
11540
  /*
11541
  * Variable: oPagination
11542
  * Purpose:
11611
 
11612
  var oClasses = oSettings.oClasses;
11613
  var an = oSettings.aanFeatures.p;
11614
+ var nNode;
11615
 
11616
  /* Loop over each instance of the pager */
11617
  for ( var i=0, iLen=an.length ; i<iLen ; i++ )
11618
  {
11619
+ nNode = an[i].firstChild;
11620
+ if ( nNode )
11621
  {
11622
+ /* Previous page */
11623
+ nNode.className = ( oSettings._iDisplayStart === 0 ) ?
11624
+ oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
11625
+
11626
+ /* Next page */
11627
+ nNode = nNode.nextSibling;
11628
+ nNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
11629
+ oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
11630
  }
11631
  }
11632
  }
11715
  var sList = "";
11716
  var iStartButton, iEndButton, i, iLen;
11717
  var oClasses = oSettings.oClasses;
11718
+ var anButtons, anStatic, nPaginateList, nNode;
11719
  var an = oSettings.aanFeatures.p;
11720
  var fnBind = function (j) {
11721
  oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
11727
  };
11728
 
11729
  /* Pages calculation */
11730
+ if ( oSettings._iDisplayLength === -1 )
11731
+ {
11732
+ iStartButton = 1;
11733
+ iEndButton = 1;
11734
+ iCurrentPage = 1;
11735
+ }
11736
+ else if (iPages < iPageCount)
11737
  {
11738
  iStartButton = 1;
11739
  iEndButton = iPages;
11753
  iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
11754
  iEndButton = iStartButton + iPageCount - 1;
11755
  }
11756
+
11757
 
11758
  /* Build the dynamic list */
11759
  for ( i=iStartButton ; i<=iEndButton ; i++ )
11766
  /* Loop over each instance of the pager */
11767
  for ( i=0, iLen=an.length ; i<iLen ; i++ )
11768
  {
11769
+ nNode = an[i];
11770
+ if ( !nNode.hasChildNodes() )
11771
  {
11772
  continue;
11773
  }
11774
 
11775
+ /* Build up the dynamic list first - html and listeners */
11776
+ $('span:eq(0)', nNode)
11777
  .html( sList )
11778
  .children('a').each( fnBind );
11779
 
11780
+ /* Update the permanent button's classes */
11781
+ anButtons = nNode.getElementsByTagName('a');
11782
  anStatic = [
11783
  anButtons[0], anButtons[1],
11784
  anButtons[anButtons.length-2], anButtons[anButtons.length-1]
11806
  */
11807
  "string-pre": function ( a )
11808
  {
11809
+ if ( typeof a != 'string' ) {
11810
+ a = (a !== null && a.toString) ? a.toString() : '';
11811
+ }
11812
  return a.toLowerCase();
11813
  },
11814
 
12081
  * @event
12082
  * @param {event} e jQuery event object
12083
  * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12084
+ * @param {object} json JSON returned from the server
12085
+ */
12086
+
12087
+ /**
12088
+ * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing
12089
+ * the bDestroy:true parameter in the initialisation object. This can be used to remove
12090
+ * bound events, added DOM nodes, etc.
12091
+ * @name DataTable#destroy
12092
+ * @event
12093
+ * @param {event} e jQuery event object
12094
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12095
  */
12096
+ }));
12097
+
12098
+ }(window, document));
12099
+
languages/js/dataTables.cs_CZ.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Provádím...",
3
+ "sLengthMenu": "Zobraz záznamů _MENU_",
4
+ "sZeroRecords": "Žádné záznamy nebyly nalezeny",
5
+ "sInfo": "Zobrazuji _START_ až _END_ z celkem _TOTAL_ záznamů",
6
+ "sInfoEmpty": "Zobrazuji 0 až 0 z 0 záznamů",
7
+ "sInfoFiltered": "(filtrováno z celkem _MAX_ záznamů)",
8
+ "sInfoPostFix": "",
9
+ "sSearch": "Filtr:",
10
+ "sUrl": "",
11
+ "oPaginate": {
12
+ "sFirst": "První",
13
+ "sPrevious": "Předchozí",
14
+ "sNext": "Další",
15
+ "sLast": "Poslední"
16
+ }
17
+ }
languages/js/dataTables.de_DE.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Bitte warten...",
3
+ "sLengthMenu": "_MENU_ Einträge anzeigen",
4
+ "sZeroRecords": "Keine Einträge vorhanden.",
5
+ "sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen",
6
+ "sInfoEmpty": "0 bis 0 von 0 Einträgen",
7
+ "sInfoFiltered": "(gefiltert von _MAX_ Einträgen)",
8
+ "sInfoPostFix": "",
9
+ "sSearch": "Suchen",
10
+ "sUrl": "",
11
+ "oPaginate": {
12
+ "sFirst": "Erster",
13
+ "sPrevious": "Zurück",
14
+ "sNext": "Nächster",
15
+ "sLast": "Letzter"
16
+ }
17
+ }
languages/js/dataTables.en_GB.txt ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sEmptyTable": "No data available in table",
3
+ "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
4
+ "sInfoEmpty": "Showing 0 to 0 of 0 entries",
5
+ "sInfoFiltered": "(filtered from _MAX_ total entries)",
6
+ "sInfoPostFix": "",
7
+ "sInfoThousands": ",",
8
+ "sLengthMenu": "Show _MENU_ entries",
9
+ "sLoadingRecords": "Loading...",
10
+ "sProcessing": "Processing...",
11
+ "sSearch": "Search:",
12
+ "sZeroRecords": "No matching records found",
13
+ "oPaginate": {
14
+ "sFirst": "First",
15
+ "sLast": "Last",
16
+ "sNext": "Next",
17
+ "sPrevious": "Previous"
18
+ },
19
+ "oAria": {
20
+ "sSortAscending": ": activate to sort column ascending",
21
+ "sSortDescending": ": activate to sort column descending"
22
+ }
23
+ }
languages/js/dataTables.es_ES.txt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Procesando...",
3
+ "sLengthMenu": "Mostrar _MENU_ registros",
4
+ "sZeroRecords": "No se encontraron resultados",
5
+ "sEmptyTable": "Ningún dato disponible en esta tabla",
6
+ "sInfo": "Mostrando registros del _START_ al _END_ de un total de _TOTAL_ registros",
7
+ "sInfoEmpty": "Mostrando registros del 0 al 0 de un total de 0 registros",
8
+ "sInfoFiltered": "(filtrado de un total de _MAX_ registros)",
9
+ "sInfoPostFix": "",
10
+ "sSearch": "Buscar:",
11
+ "sUrl": "",
12
+ "sInfoThousands": ",",
13
+ "sLoadingRecords": "Cargando...",
14
+ "oPaginate": {
15
+ "sFirst": "Primero",
16
+ "sLast": "Último",
17
+ "sNext": "Siguiente",
18
+ "sPrevious": "Anterior"
19
+ },
20
+ "fnInfoCallback": null,
21
+ "oAria": {
22
+ "sSortAscending": ": Activar para ordernar la columna de manera ascendente",
23
+ "sSortDescending": ": Activar para ordernar la columna de manera descendente"
24
+ }
25
+ }
languages/js/dataTables.fr_FR.txt ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Traitement en cours...",
3
+ "sSearch": "Rechercher&nbsp;:",
4
+ "sLengthMenu": "Afficher _MENU_ &eacute;l&eacute;ments",
5
+ "sInfo": "Affichage de l'&eacute;lement _START_ &agrave; _END_ sur _TOTAL_ &eacute;l&eacute;ments",
6
+ "sInfoEmpty": "Affichage de l'&eacute;lement 0 &agrave; 0 sur 0 &eacute;l&eacute;ments",
7
+ "sInfoFiltered": "(filtr&eacute; de _MAX_ &eacute;l&eacute;ments au total)",
8
+ "sInfoPostFix": "",
9
+ "sLoadingRecords": "Chargement en cours...",
10
+ "sZeroRecords": "Aucun &eacute;l&eacute;ment &agrave; afficher",
11
+ "sEmptyTable": "Aucune donnée disponible dans le tableau",
12
+ "oPaginate": {
13
+ "sFirst": "Premier",
14
+ "sPrevious": "Pr&eacute;c&eacute;dent",
15
+ "sNext": "Suivant",
16
+ "sLast": "Dernier"
17
+ },
18
+ "oAria": {
19
+ "sSortAscending": ": activer pour trier la colonne par ordre croissant",
20
+ "sSortDescending": ": activer pour trier la colonne par ordre décroissant"
21
+ }
22
+ }
languages/js/dataTables.nl_NL.txt ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Bezig...",
3
+ "sLengthMenu": "_MENU_ resultaten weergeven",
4
+ "sZeroRecords": "Geen resultaten gevonden",
5
+ "sInfo": "_START_ tot _END_ van _TOTAL_ resultaten",
6
+ "sInfoEmpty": "Geen resultaten om weer te geven",
7
+ "sInfoFiltered": " (gefilterd uit _MAX_ resultaten)",
8
+ "sInfoPostFix": "",
9
+ "sSearch": "Zoeken:",
10
+ "sEmptyTable": "Geen resultaten aanwezig in de tabel",
11
+ "sInfoThousands": ".",
12
+ "sLoadingRecords": "Een moment geduld aub - bezig met laden...",
13
+ "oPaginate": {
14
+ "sFirst": "Eerste",
15
+ "sLast": "Laatste",
16
+ "sNext": "Volgende",
17
+ "sPrevious": "Vorige"
18
+ }
19
+ }
languages/js/dataTables.ru_RU.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Подождите...",
3
+ "sLengthMenu": "Показать _MENU_ записей",
4
+ "sZeroRecords": "Записи отсутствуют.",
5
+ "sInfo": "Записи с _START_ до _END_ из _TOTAL_ записей",
6
+ "sInfoEmpty": "Записи с 0 до 0 из 0 записей",
7
+ "sInfoFiltered": "(отфильтровано из _MAX_ записей)",
8
+ "sInfoPostFix": "",
9
+ "sSearch": "Поиск:",
10
+ "sUrl": "",
11
+ "oPaginate": {
12
+ "sFirst": "Первая",
13
+ "sPrevious": "Предыдущая",
14
+ "sNext": "Следующая",
15
+ "sLast": "Последняя"
16
+ }
17
+ }
languages/js/dataTables.sk_SK.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sProcessing": "Pracujem...",
3
+ "sLengthMenu": "Zobraz _MENU_ záznamov",
4
+ "sZeroRecords": "Neboli nájdené žiadne záznamy",
5
+ "sInfo": "Záznamy _START_ až _END_ z celkovo _TOTAL_",
6
+ "sInfoEmpty": "Záznamy 0 až 0 z celkovo 0",
7
+ "sInfoFiltered": "(filtrované z celkovo _MAX_ záznamov)",
8
+ "sInfoPostFix": "",
9
+ "sSearch": "Hľadaj:",
10
+ "sUrl": "",
11
+ "oPaginate": {
12
+ "sFirst": "Prvá",
13
+ "sPrevious": "Predchádzajúca",
14
+ "sNext": "Ďalšia",
15
+ "sLast": "Posledná"
16
+ }
17
+ }
languages/wp-google-maps-cs_CZ.mo ADDED
Binary file
languages/wp-google-maps-cs_CZ.po ADDED
@@ -0,0 +1,1100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: WP Google Maps v5.02\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: \n"
6
+ "PO-Revision-Date: 2013-02-06 21:12:45+0000\n"
7
+ "Last-Translator: riha <riha@webovareseni.cz>\n"
8
+ "Language-Team: \n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "Plural-Forms: nplurals=3; plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;\n"
13
+ "X-Poedit-Language: Czech\n"
14
+ "X-Poedit-Country: CZECH REPUBLIC\n"
15
+ "X-Poedit-SourceCharset: utf-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;\n"
17
+ "X-Poedit-Basepath: ../\n"
18
+ "X-Poedit-Bookmarks: \n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+ "X-Textdomain-Support: yes"
21
+
22
+ #: wpGoogleMaps.php:1071
23
+ #: wpGoogleMaps.php:1120
24
+ #@ wp-google-maps
25
+ msgid "Your settings have been saved."
26
+ msgstr "Vaše nastavení bylo uloženo"
27
+
28
+ #: wpGoogleMaps.php:1099
29
+ #@ wp-google-maps
30
+ msgid "Your marker location has been saved."
31
+ msgstr "Vaše lokace značky byla uložena"
32
+
33
+ #: wpGoogleMaps.php:1137
34
+ #@ wp-google-maps
35
+ msgid "Maps"
36
+ msgstr "Mapy"
37
+
38
+ #: wpGoogleMaps.php:1139
39
+ #@ wp-google-maps
40
+ msgid "Advanced"
41
+ msgstr "Rozšířené"
42
+
43
+ #: wpGoogleMaps.php:1141
44
+ #@ wp-google-maps
45
+ msgid "Settings"
46
+ msgstr "Nastavení"
47
+
48
+ #: wpGoogleMaps.php:1166
49
+ #@ wp-google-maps
50
+ msgid "There was a problem deleting the map."
51
+ msgstr "Při mazání mapy došlo k problému"
52
+
53
+ #: wpGoogleMaps.php:1170
54
+ #@ wp-google-maps
55
+ msgid "Delete your map"
56
+ msgstr "Smazat mapu"
57
+
58
+ #: wpGoogleMaps.php:1170
59
+ #@ wp-google-maps
60
+ msgid "Are you sure you want to delete the map"
61
+ msgstr "Opravdu si přejete smazat tuto mapu"
62
+
63
+ #: wp-google-maps-pro.php:407
64
+ #: wp-google-maps-pro.php:427
65
+ #: wp-google-maps-pro.php:434
66
+ #: wp-google-maps-pro.php:520
67
+ #: wpGoogleMaps.php:1170
68
+ #@ wp-google-maps
69
+ msgid "Yes"
70
+ msgstr "Ano"
71
+
72
+ #: wp-google-maps-pro.php:408
73
+ #: wp-google-maps-pro.php:413
74
+ #: wp-google-maps-pro.php:428
75
+ #: wp-google-maps-pro.php:435
76
+ #: wp-google-maps-pro.php:519
77
+ #: wpGoogleMaps.php:1170
78
+ #@ wp-google-maps
79
+ msgid "No"
80
+ msgstr "Ne"
81
+
82
+ #: wp-google-maps-pro.php:2033
83
+ #: wpGoogleMaps.php:1224
84
+ #@ wp-google-maps
85
+ msgid "WP Google Map Settings"
86
+ msgstr "WP Google Map nastavení"
87
+
88
+ #: wp-google-maps-pro.php:2096
89
+ #: wpGoogleMaps.php:1251
90
+ #: wpGoogleMaps.php:1401
91
+ #@ wp-google-maps
92
+ msgid "Map Settings"
93
+ msgstr "Nastavení mapy"
94
+
95
+ #: wp-google-maps-pro.php:2099
96
+ #: wpGoogleMaps.php:1254
97
+ #@ wp-google-maps
98
+ msgid "General Map Settings"
99
+ msgstr "Obecné nastavení map"
100
+
101
+ #: wp-google-maps-pro.php:2101
102
+ #: wpGoogleMaps.php:1256
103
+ #@ wp-google-maps
104
+ msgid "Disable StreetView"
105
+ msgstr "Zakázat StreetView"
106
+
107
+ #: wp-google-maps-pro.php:2102
108
+ #: wpGoogleMaps.php:1257
109
+ #@ wp-google-maps
110
+ msgid "Disable Zoom Controls"
111
+ msgstr "Zakázat Zoom posuvník"
112
+
113
+ #: wp-google-maps-pro.php:2103
114
+ #: wpGoogleMaps.php:1258
115
+ #@ wp-google-maps
116
+ msgid "Disable Pan Controls"
117
+ msgstr "Zakázat Ovládací panel posuvníku"
118
+
119
+ #: wp-google-maps-pro.php:2104
120
+ #: wpGoogleMaps.php:1259
121
+ #@ wp-google-maps
122
+ msgid "Disable Map Type Controls"
123
+ msgstr "Zakázat Výběr typu mapy"
124
+
125
+ #: wp-google-maps-pro.php:2058
126
+ #: wpGoogleMaps.php:1267
127
+ #@ wp-google-maps
128
+ msgid "Save Settings"
129
+ msgstr "Uložit nastavení"
130
+
131
+ #: wpGoogleMaps.php:1289
132
+ #: wpGoogleMaps.php:1293
133
+ #@ wp-google-maps
134
+ msgid "Your Maps"
135
+ msgstr "Vaše mapy"
136
+
137
+ #: wpGoogleMaps.php:1289
138
+ #@ wp-google-maps
139
+ msgid "Add New"
140
+ msgstr "Vytvořit novou"
141
+
142
+ #: wpGoogleMaps.php:1294
143
+ #@ wp-google-maps
144
+ msgid "Pro Version"
145
+ msgstr "Pro verze"
146
+
147
+ #: wpGoogleMaps.php:1294
148
+ #@ wp-google-maps
149
+ msgid "Create unlimited maps"
150
+ msgstr "Vytvořte neomezené množství map"
151
+
152
+ #: wpGoogleMaps.php:1294
153
+ #@ wp-google-maps
154
+ msgid "with the"
155
+ msgstr "s"
156
+
157
+ #: wpGoogleMaps.php:1294
158
+ #@ wp-google-maps
159
+ msgid "of WP Google Maps for only"
160
+ msgstr "WP Google Maps pouze pro"
161
+
162
+ #: wpGoogleMaps.php:1325
163
+ #: wpGoogleMaps.php:1614
164
+ #: wpGoogleMaps.php:1714
165
+ #@ wp-google-maps
166
+ msgid "ID"
167
+ msgstr "ID"
168
+
169
+ #: wp-google-maps-pro.php:477
170
+ #: wpGoogleMaps.php:1326
171
+ #: wpGoogleMaps.php:1516
172
+ #: wpGoogleMaps.php:1716
173
+ #: wpGoogleMaps.php:1735
174
+ #@ wp-google-maps
175
+ msgid "Title"
176
+ msgstr "Město / obec"
177
+
178
+ #: wp-google-maps-pro.php:348
179
+ #: wpGoogleMaps.php:1327
180
+ #: wpGoogleMaps.php:1441
181
+ #@ wp-google-maps
182
+ msgid "Width"
183
+ msgstr "Šířka"
184
+
185
+ #: wp-google-maps-pro.php:355
186
+ #: wpGoogleMaps.php:1328
187
+ #: wpGoogleMaps.php:1452
188
+ #@ wp-google-maps
189
+ msgid "Height"
190
+ msgstr "Výška"
191
+
192
+ #: wpGoogleMaps.php:1329
193
+ #@ wp-google-maps
194
+ msgid "Type"
195
+ msgstr "Typ"
196
+
197
+ #: wp-google-maps-pro.php:378
198
+ #: wpGoogleMaps.php:1335
199
+ #: wpGoogleMaps.php:1469
200
+ #@ wp-google-maps
201
+ msgid "Roadmap"
202
+ msgstr "Roadmap"
203
+
204
+ #: wp-google-maps-pro.php:379
205
+ #: wpGoogleMaps.php:1336
206
+ #: wpGoogleMaps.php:1470
207
+ #@ wp-google-maps
208
+ msgid "Satellite"
209
+ msgstr "Satellite"
210
+
211
+ #: wp-google-maps-pro.php:380
212
+ #: wpGoogleMaps.php:1337
213
+ #: wpGoogleMaps.php:1471
214
+ #@ wp-google-maps
215
+ msgid "Hybrid"
216
+ msgstr "Hybrid"
217
+
218
+ #: wp-google-maps-pro.php:381
219
+ #: wpGoogleMaps.php:1338
220
+ #: wpGoogleMaps.php:1472
221
+ #@ wp-google-maps
222
+ msgid "Terrain"
223
+ msgstr "Terrain"
224
+
225
+ #: wpGoogleMaps.php:1340
226
+ #@ wp-google-maps
227
+ msgid "Trash"
228
+ msgstr "Smazat"
229
+
230
+ #: wpGoogleMaps.php:1344
231
+ #: wpGoogleMaps.php:1771
232
+ #@ wp-google-maps
233
+ msgid "Edit"
234
+ msgstr "Upravit"
235
+
236
+ #: wpGoogleMaps.php:1390
237
+ #@ wp-google-maps
238
+ msgid "Add custom icons, titles, descriptions, pictures and links to your markers with the"
239
+ msgstr "Přidejte vlastní ikony, názvy, popisy, obrázky a odkazy k vašim značkám s verzí"
240
+
241
+ #: wpGoogleMaps.php:1390
242
+ #: wpGoogleMaps.php:1391
243
+ #: wpGoogleMaps.php:1464
244
+ #: wpGoogleMaps.php:1489
245
+ #: wpGoogleMaps.php:1495
246
+ #: wpGoogleMaps.php:1580
247
+ #@ wp-google-maps
248
+ msgid "Pro Edition"
249
+ msgstr "Pro Edition"
250
+
251
+ #: wpGoogleMaps.php:1390
252
+ #@ wp-google-maps
253
+ msgid "of this plugin for just"
254
+ msgstr "tohoto pluginu pouze za"
255
+
256
+ #: wpGoogleMaps.php:1391
257
+ #@ wp-google-maps
258
+ msgid "Purchase the Pro Edition"
259
+ msgstr "zakoupit Pro Edition"
260
+
261
+ #: wpGoogleMaps.php:1391
262
+ #@ wp-google-maps
263
+ msgid "of WP Google Maps and save your markers to a CSV file!"
264
+ msgstr "z WP Google Maps a uložte si vaše značky v CSV souboru!"
265
+
266
+ #: wp-google-maps-pro.php:338
267
+ #: wpGoogleMaps.php:1433
268
+ #@ wp-google-maps
269
+ msgid "Short code"
270
+ msgstr "Shortcode"
271
+
272
+ #: wp-google-maps-pro.php:339
273
+ #: wpGoogleMaps.php:1434
274
+ #@ wp-google-maps
275
+ msgid "copy this into your post or page to display the map"
276
+ msgstr "zkopírujte toto do Vašeho příspěvku nebo stránky k zobrazení mapy"
277
+
278
+ #: wp-google-maps-pro.php:342
279
+ #: wpGoogleMaps.php:1437
280
+ #@ wp-google-maps
281
+ msgid "Map Name"
282
+ msgstr "Název mapy"
283
+
284
+ #: wp-google-maps-pro.php:371
285
+ #: wpGoogleMaps.php:1463
286
+ #@ wp-google-maps
287
+ msgid "Default Marker Image"
288
+ msgstr "Výchozí obrázek značky"
289
+
290
+ #: wp-google-maps-pro.php:372
291
+ #: wp-google-maps-pro.php:501
292
+ #: wp-google-maps-pro.php:505
293
+ #: wpGoogleMaps.php:1464
294
+ #: wpGoogleMaps.php:1537
295
+ #: wpGoogleMaps.php:1541
296
+ #@ wp-google-maps
297
+ msgid "Upload Image"
298
+ msgstr "Nahrát obrázek"
299
+
300
+ #: wpGoogleMaps.php:1464
301
+ #: wpGoogleMaps.php:1489
302
+ #: wpGoogleMaps.php:1495
303
+ #@ wp-google-maps
304
+ msgid "available in the"
305
+ msgstr "přístupné pouze v"
306
+
307
+ #: wpGoogleMaps.php:1464
308
+ #: wpGoogleMaps.php:1489
309
+ #: wpGoogleMaps.php:1495
310
+ #@ wp-google-maps
311
+ msgid "only"
312
+ msgstr " "
313
+
314
+ #: wp-google-maps-pro.php:376
315
+ #: wpGoogleMaps.php:1467
316
+ #@ wp-google-maps
317
+ msgid "Map type"
318
+ msgstr "Typ mapy"
319
+
320
+ #: wp-google-maps-pro.php:394
321
+ #: wpGoogleMaps.php:1477
322
+ #@ wp-google-maps
323
+ msgid "Map Alignment"
324
+ msgstr "Zarovnání mapy"
325
+
326
+ #: wp-google-maps-pro.php:396
327
+ #: wpGoogleMaps.php:1479
328
+ #@ wp-google-maps
329
+ msgid "Left"
330
+ msgstr "Vlevo"
331
+
332
+ #: wp-google-maps-pro.php:397
333
+ #: wpGoogleMaps.php:1480
334
+ #@ wp-google-maps
335
+ msgid "Center"
336
+ msgstr "Střed"
337
+
338
+ #: wp-google-maps-pro.php:398
339
+ #: wpGoogleMaps.php:1481
340
+ #@ wp-google-maps
341
+ msgid "Right"
342
+ msgstr "Vpravo"
343
+
344
+ #: wp-google-maps-pro.php:399
345
+ #: wp-google-maps-pro.php:510
346
+ #: wpGoogleMaps.php:1482
347
+ #: wpGoogleMaps.php:1546
348
+ #@ wp-google-maps
349
+ msgid "None"
350
+ msgstr "Žádné"
351
+
352
+ #: wp-google-maps-pro.php:445
353
+ #: wpGoogleMaps.php:1487
354
+ #@ wp-google-maps
355
+ msgid "KML/GeoRSS URL"
356
+ msgstr "KML/GeoRSS URL"
357
+
358
+ #: wpGoogleMaps.php:1493
359
+ #@ wp-google-maps
360
+ msgid "Fusion Table ID"
361
+ msgstr "Fusion Table ID"
362
+
363
+ #: wp-google-maps-pro.php:458
364
+ #: wpGoogleMaps.php:1502
365
+ #@ wp-google-maps
366
+ msgid "Remember to save your map!"
367
+ msgstr "Nezapomeňte mapu uložit!"
368
+
369
+ #: wp-google-maps-pro.php:463
370
+ #: wpGoogleMaps.php:1504
371
+ #@ wp-google-maps
372
+ msgid "Save Map"
373
+ msgstr "Uložit mapu"
374
+
375
+ #: wp-google-maps-pro.php:465
376
+ #: wpGoogleMaps.php:1506
377
+ #@ wp-google-maps
378
+ msgid "Tip: Use your mouse to change the layout of your map. When you have positioned the map to your desired location, press \"Save Map\" to keep your settings."
379
+ msgstr "Tip: Použijte myš pro změnu vzhledu Vaší mapy. Když posunete mapu do Vaší požadované lokace, klikněte na \"Uložit mapu\" k uložení nastavení."
380
+
381
+ #: wp-google-maps-pro.php:472
382
+ #: wpGoogleMaps.php:1511
383
+ #@ wp-google-maps
384
+ msgid "Add a marker"
385
+ msgstr "Přidat značku"
386
+
387
+ #: wp-google-maps-pro.php:482
388
+ #: wpGoogleMaps.php:1521
389
+ #@ wp-google-maps
390
+ msgid "Address/GPS"
391
+ msgstr "Adresa / GPS"
392
+
393
+ #: wp-google-maps-pro.php:498
394
+ #: wpGoogleMaps.php:1534
395
+ #: wpGoogleMaps.php:1720
396
+ #: wpGoogleMaps.php:1739
397
+ #@ wp-google-maps
398
+ msgid "Description"
399
+ msgstr "Detailní informace"
400
+
401
+ #: wp-google-maps-pro.php:500
402
+ #: wpGoogleMaps.php:1536
403
+ #@ wp-google-maps
404
+ msgid "Pic URL"
405
+ msgstr "URL obrázku"
406
+
407
+ #: wp-google-maps-pro.php:502
408
+ #: wpGoogleMaps.php:1538
409
+ #@ wp-google-maps
410
+ msgid "Link URL"
411
+ msgstr "URL odkazu"
412
+
413
+ #: wp-google-maps-pro.php:504
414
+ #: wpGoogleMaps.php:1540
415
+ #@ wp-google-maps
416
+ msgid "Custom Marker"
417
+ msgstr "Vlastní značka"
418
+
419
+ #: wp-google-maps-pro.php:507
420
+ #: wpGoogleMaps.php:1543
421
+ #@ wp-google-maps
422
+ msgid "Animation"
423
+ msgstr "Animace"
424
+
425
+ #: wp-google-maps-pro.php:526
426
+ #: wpGoogleMaps.php:1553
427
+ #@ wp-google-maps
428
+ msgid "Add Marker"
429
+ msgstr "Přidat značku"
430
+
431
+ #: wp-google-maps-pro.php:526
432
+ #: wpGoogleMaps.php:1553
433
+ #@ wp-google-maps
434
+ msgid "Adding"
435
+ msgstr "Přidávání"
436
+
437
+ #: wp-google-maps-pro.php:527
438
+ #: wpGoogleMaps.php:1554
439
+ #@ wp-google-maps
440
+ msgid "Save Marker"
441
+ msgstr "Uložit značku"
442
+
443
+ #: wp-google-maps-pro.php:527
444
+ #: wpGoogleMaps.php:1554
445
+ #@ wp-google-maps
446
+ msgid "Saving"
447
+ msgstr "Ukládání"
448
+
449
+ #: wp-google-maps-pro.php:535
450
+ #: wpGoogleMaps.php:1562
451
+ #@ wp-google-maps
452
+ msgid "Your Markers"
453
+ msgstr "Vaše značky"
454
+
455
+ #: wpGoogleMaps.php:1571
456
+ #@ wp-google-maps
457
+ msgid "Add detailed information to your markers!"
458
+ msgstr "Přidejte detilní informace k Vašim značkám!"
459
+
460
+ #: wpGoogleMaps.php:1571
461
+ #: wpGoogleMaps.php:1575
462
+ #: wpGoogleMaps.php:1579
463
+ #@ wp-google-maps
464
+ msgid "Add custom markers to your map!"
465
+ msgstr "Přidejte do mapy vlastní značky"
466
+
467
+ #: wpGoogleMaps.php:1572
468
+ #@ wp-google-maps
469
+ msgid "Add detailed information to your markers for only"
470
+ msgstr "Přidejte detailní informace"
471
+
472
+ #: wpGoogleMaps.php:1572
473
+ #: wpGoogleMaps.php:1580
474
+ #@ wp-google-maps
475
+ msgid "Click"
476
+ msgstr "Klikněte"
477
+
478
+ #: wpGoogleMaps.php:1572
479
+ #: wpGoogleMaps.php:1580
480
+ #@ wp-google-maps
481
+ msgid "here"
482
+ msgstr "zde"
483
+
484
+ #: wpGoogleMaps.php:1576
485
+ #@ wp-google-maps
486
+ msgid "Add different marker icons, or your own icons to make your map really stand out!"
487
+ msgstr "Přidejte různé ikony značek, nebo své vlastní ikony, aby Vaše mapa vynikla!"
488
+
489
+ #: wpGoogleMaps.php:1580
490
+ #@ wp-google-maps
491
+ msgid "Allow your visitors to get directions to your markers!"
492
+ msgstr "Povolte návštěvníkům získat směry k Vašim značkám!"
493
+
494
+ #: wp-google-maps-pro.php:550
495
+ #: wpGoogleMaps.php:1586
496
+ #@ wp-google-maps
497
+ msgid "WP Google Maps encourages you to make use of the amazing icons created by Nicolas Mollet's Maps Icons Collection"
498
+ msgstr "WP Google Maps Vám nabízí k využití úžasné ikony vytvořené v kolekci mapových značek Nicollase Molleta"
499
+
500
+ #: wp-google-maps-pro.php:550
501
+ #: wpGoogleMaps.php:1586
502
+ #@ wp-google-maps
503
+ msgid "and to credit him when doing so."
504
+ msgstr "a odměnit jej, když tak učiníte"
505
+
506
+ #: wpGoogleMaps.php:1614
507
+ #@ wp-google-maps
508
+ msgid "Edit Marker Location"
509
+ msgstr "Upravit lokaci značky"
510
+
511
+ #: wpGoogleMaps.php:1623
512
+ #@ wp-google-maps
513
+ msgid "Marker Latitude"
514
+ msgstr "Délka značky"
515
+
516
+ #: wpGoogleMaps.php:1627
517
+ #@ wp-google-maps
518
+ msgid "Marker Longitude"
519
+ msgstr "Šířka značky"
520
+
521
+ #: wpGoogleMaps.php:1632
522
+ #@ wp-google-maps
523
+ msgid "Save Marker Location"
524
+ msgstr "Uložit lokaci značky"
525
+
526
+ #: wpGoogleMaps.php:1633
527
+ #@ wp-google-maps
528
+ msgid "Tip: Use your mouse to change the location of the marker. Simply click and drag it to your desired location."
529
+ msgstr "Tip: použijte myš prozměnu lokace značky. Prostě klikněte a přesuňte ji na požadovanou lokaci"
530
+
531
+ #: wpGoogleMaps.php:1699
532
+ #@ wp-google-maps
533
+ msgid "There are too many markers to make use of the live edit function. The maximum amount for this functionality is 2000 markers. Anything more than that number would crash your browser. In order to edit your markers, you would need to download the table in CSV format, edit it and re-upload it."
534
+ msgstr "Pro použití funkce rychlé editace je zde příliš mnoho značek. nejvyšší množství pro tuto funkci je 2000 značek. Jakkoliv více může způsobit pád Vašeho prohlížeče. Pro editaci značek musíte stáhnout tabulku ve formě CSV formátu, ten upravit a uploadnout jej zpět."
535
+
536
+ #: wpGoogleMaps.php:1715
537
+ #@ wp-google-maps
538
+ msgid "Icon"
539
+ msgstr "Ikona"
540
+
541
+ #: wpGoogleMaps.php:1717
542
+ #: wpGoogleMaps.php:1736
543
+ #@ wp-google-maps
544
+ msgid "Address"
545
+ msgstr "Adresa"
546
+
547
+ #: wpGoogleMaps.php:1721
548
+ #@ wp-google-maps
549
+ msgid "Image"
550
+ msgstr "Obrázek"
551
+
552
+ #: wpGoogleMaps.php:1722
553
+ #@ wp-google-maps
554
+ msgid "Link"
555
+ msgstr "Odkaz"
556
+
557
+ #: wpGoogleMaps.php:1723
558
+ #@ wp-google-maps
559
+ msgid "Action"
560
+ msgstr "Akce"
561
+
562
+ #: wpGoogleMaps.php:1757
563
+ #@ wp-google-maps
564
+ msgid "View this link"
565
+ msgstr "Prohlédnout tento odkaz"
566
+
567
+ #: wpGoogleMaps.php:1771
568
+ #: wpGoogleMaps.php:1772
569
+ #@ wp-google-maps
570
+ msgid "Edit this marker"
571
+ msgstr "Upravit tuto značku"
572
+
573
+ #: wpGoogleMaps.php:1772
574
+ #@ wp-google-maps
575
+ msgid "Edit Location"
576
+ msgstr "Upravit lokaci"
577
+
578
+ #: wpGoogleMaps.php:1773
579
+ #@ wp-google-maps
580
+ msgid "Delete this marker"
581
+ msgstr "Smazat tuto značku"
582
+
583
+ #: wpGoogleMaps.php:1773
584
+ #@ wp-google-maps
585
+ msgid "Delete"
586
+ msgstr "Smazat"
587
+
588
+ #: wpGoogleMaps.php:1910
589
+ #@ wp-google-maps
590
+ msgid "this page"
591
+ msgstr "tuto stránku"
592
+
593
+ #: wpGoogleMaps.php:1912
594
+ #@ wp-google-maps
595
+ msgid "for help on how to do it."
596
+ msgstr "pro nápovědu, jak na to."
597
+
598
+ #: wp-google-maps-pro.php:276
599
+ #@ wp-google-maps
600
+ msgid "including Pro &amp; Gold add-ons"
601
+ msgstr "obsahuje Pro &amp; Gold add-ony"
602
+
603
+ #: wp-google-maps-pro.php:276
604
+ #@ wp-google-maps
605
+ msgid "including Pro add-on"
606
+ msgstr "obsahuje Pro add-on"
607
+
608
+ #: wp-google-maps-pro.php:295
609
+ #@ wp-google-maps
610
+ msgid "Download this as a CSV file"
611
+ msgstr "Stáhnout toto jako CSV soubor"
612
+
613
+ #: wp-google-maps-pro.php:295
614
+ #@ wp-google-maps
615
+ msgid "Download this data as a CSV file"
616
+ msgstr "Stáhnout data jako CSV soubor"
617
+
618
+ #: wp-google-maps-pro.php:303
619
+ #@ wp-google-maps
620
+ msgid "Create your Map"
621
+ msgstr "Vytvořte si mapu"
622
+
623
+ #: wp-google-maps-pro.php:346
624
+ #@ wp-google-maps
625
+ msgid "Map Dimensions"
626
+ msgstr "Rozměry mapy"
627
+
628
+ #: wp-google-maps-pro.php:366
629
+ #@ wp-google-maps
630
+ msgid "Show advanced options"
631
+ msgstr "Zobrazit rozšířená nastavení"
632
+
633
+ #: wp-google-maps-pro.php:367
634
+ #@ wp-google-maps
635
+ msgid "Hide advanced options"
636
+ msgstr "Skrýt rozšířená nastavení"
637
+
638
+ #: wp-google-maps-pro.php:372
639
+ #@ wp-google-maps
640
+ msgid "Get great map markers <a href='http://mapicons.nicolasmollet.com/' target='_BLANK' title='Great Google Map Markers'>here</a>"
641
+ msgstr "Získejte skvělé značky z <a href='http://mapicons.nicolasmollet.com/' target='_BLANK' title='Great Google Map Markers'>Great Google Map Markers</a>"
642
+
643
+ #: wp-google-maps-pro.php:386
644
+ #@ wp-google-maps
645
+ msgid "List all Markers"
646
+ msgstr "Zobrazit všechny značky"
647
+
648
+ #: wp-google-maps-pro.php:388
649
+ #@ wp-google-maps
650
+ msgid "List all markers below the map"
651
+ msgstr "Zobrazit všechny značky pod mapou"
652
+
653
+ #: wp-google-maps-pro.php:389
654
+ #@ wp-google-maps
655
+ msgid "Select this for the advanced listing functionality"
656
+ msgstr "Vyberte pro rozšířené funkce seznamu"
657
+
658
+ #: wp-google-maps-pro.php:405
659
+ #@ wp-google-maps
660
+ msgid "Enable Directions?"
661
+ msgstr "Povolit trasy"
662
+
663
+ #: wp-google-maps-pro.php:411
664
+ #@ wp-google-maps
665
+ msgid "Directions Box Open by Default?"
666
+ msgstr "Rámeček tras otevřený jako výchozí?"
667
+
668
+ #: wp-google-maps-pro.php:414
669
+ #@ wp-google-maps
670
+ msgid "Yes, on the left"
671
+ msgstr "Ano, vlevo"
672
+
673
+ #: wp-google-maps-pro.php:415
674
+ #@ wp-google-maps
675
+ msgid "Yes, on the right"
676
+ msgstr "Ano, vpravo"
677
+
678
+ #: wp-google-maps-pro.php:416
679
+ #@ wp-google-maps
680
+ msgid "Yes, above"
681
+ msgstr "Ano, nahoře"
682
+
683
+ #: wp-google-maps-pro.php:417
684
+ #@ wp-google-maps
685
+ msgid "Yes, below"
686
+ msgstr "Ano, dole"
687
+
688
+ #: wp-google-maps-pro.php:420
689
+ #@ wp-google-maps
690
+ msgid "Directions Box Width"
691
+ msgstr "Šířka rámečku tras"
692
+
693
+ #: wp-google-maps-pro.php:425
694
+ #@ wp-google-maps
695
+ msgid "Enable Bicycle Layer?"
696
+ msgstr "Povolit trasu cyklistiky?"
697
+
698
+ #: wp-google-maps-pro.php:432
699
+ #@ wp-google-maps
700
+ msgid "Enable Traffic Layer?"
701
+ msgstr "Povolit vrstvu dopravy?"
702
+
703
+ #: wp-google-maps-pro.php:447
704
+ #@ wp-google-maps
705
+ msgid "The KML/GeoRSS layer will over-ride most of your map settings"
706
+ msgstr "Vrstva KML / GeoRSS překryje většinu nastavení ve Vaší mapě"
707
+
708
+ #: wp-google-maps-pro.php:451
709
+ #@ wp-google-maps
710
+ msgid "Fusion table ID"
711
+ msgstr "Fusion table ID"
712
+
713
+ #: wp-google-maps-pro.php:453
714
+ #@ wp-google-maps
715
+ msgid "Read data directly from your Fusion Table. For more information, see <a href='http://googlemapsmania.blogspot.com/2010/05/fusion-tables-google-maps-api.html'>http://googlemapsmania.blogspot.com/2010/05/fusion-tables-google-maps-api.html</a>"
716
+ msgstr "Číst data přímo z Fusion table. Pro více informace jděte na <a href='http://googlemapsmania.blogspot.com/2010/05/fusion-tables-google-maps-api.html'>http://googlemapsmania.blogspot.com/2010/05/fusion-tables-google-maps-api.html</a>"
717
+
718
+ #: wp-google-maps-pro.php:501
719
+ #@ wp-google-maps
720
+ msgid "Or paste image URL"
721
+ msgstr "nebo vložte URL adresu obrázku"
722
+
723
+ #: wp-google-maps-pro.php:503
724
+ #@ wp-google-maps
725
+ msgid "Format: http://www.domain.com"
726
+ msgstr "Formát http://www.doména.cz"
727
+
728
+ #: wp-google-maps-pro.php:505
729
+ #@ wp-google-maps
730
+ msgid "ignore if you want to use the default marker"
731
+ msgstr "Ignorujte, pokud si přejete použít výchozí značku"
732
+
733
+ #: wp-google-maps-pro.php:511
734
+ #@ wp-google-maps
735
+ msgid "Bounce"
736
+ msgstr "Odskočit"
737
+
738
+ #: wp-google-maps-pro.php:512
739
+ #@ wp-google-maps
740
+ msgid "Drop"
741
+ msgstr "Spadnout"
742
+
743
+ #: wp-google-maps-pro.php:516
744
+ #@ wp-google-maps
745
+ msgid "InfoWindow open by default"
746
+ msgstr "InfoWindows otevřené jako výchozí"
747
+
748
+ #: wp-google-maps-pro.php:757
749
+ #@ wp-google-maps
750
+ msgid "Get Directions"
751
+ msgstr "Získat trasy"
752
+
753
+ #: wp-google-maps-pro.php:761
754
+ #@ wp-google-maps
755
+ msgid "For"
756
+ msgstr "Pro"
757
+
758
+ #: wp-google-maps-pro.php:763
759
+ #@ wp-google-maps
760
+ msgid "Driving"
761
+ msgstr "Autodoprava"
762
+
763
+ #: wp-google-maps-pro.php:764
764
+ #@ wp-google-maps
765
+ msgid "Walking"
766
+ msgstr "Turistika"
767
+
768
+ #: wp-google-maps-pro.php:765
769
+ #@ wp-google-maps
770
+ msgid "Bicycling"
771
+ msgstr "Cyklistika"
772
+
773
+ #: wp-google-maps-pro.php:768
774
+ #@ wp-google-maps
775
+ msgid "show options"
776
+ msgstr "zobrazit nastavení"
777
+
778
+ #: wp-google-maps-pro.php:769
779
+ #@ wp-google-maps
780
+ msgid "hide options"
781
+ msgstr "skrýt nastavení"
782
+
783
+ #: wp-google-maps-pro.php:771
784
+ #@ wp-google-maps
785
+ msgid "Avoid Tolls"
786
+ msgstr "Vyhýbat se mýtům"
787
+
788
+ #: wp-google-maps-pro.php:772
789
+ #@ wp-google-maps
790
+ msgid "Avoid Highways"
791
+ msgstr "Vyhýbat se dálnicím"
792
+
793
+ #: wp-google-maps-pro.php:777
794
+ #@ wp-google-maps
795
+ msgid "From"
796
+ msgstr "Z"
797
+
798
+ #: wp-google-maps-pro.php:778
799
+ #@ wp-google-maps
800
+ msgid "To"
801
+ msgstr "Do"
802
+
803
+ #: wp-google-maps-pro.php:783
804
+ #@ wp-google-maps
805
+ msgid "Go"
806
+ msgstr "Start"
807
+
808
+ #: wp-google-maps-pro.php:804
809
+ #: wp-google-maps-pro.php:820
810
+ #@ wp-google-maps
811
+ msgid "Fetching directions..."
812
+ msgstr "Nahrávám trasy..."
813
+
814
+ #: wp-google-maps-pro.php:805
815
+ #: wp-google-maps-pro.php:821
816
+ #@ wp-google-maps
817
+ msgid "Reset directions"
818
+ msgstr "Vymazat trasy"
819
+
820
+ #: wp-google-maps-pro.php:1151
821
+ #: wp-google-maps-pro.php:1847
822
+ #@ wp-google-maps
823
+ msgid "More details"
824
+ msgstr "Více detailů"
825
+
826
+ #: wp-google-maps-pro.php:1209
827
+ #@ wp-google-maps
828
+ msgid "Get directions"
829
+ msgstr "Získat trasy"
830
+
831
+ #: wp-google-maps-pro.php:1302
832
+ #@ wp-google-maps
833
+ msgid "Please fill out both the 'from' and 'to' fields"
834
+ msgstr "Prosím vyplňte obě pole 'Z' a 'Do'"
835
+
836
+ #: wp-google-maps-pro.php:1633
837
+ #: wp-google-maps-pro.php:1714
838
+ #@ wp-google-maps
839
+ msgid "Geocode was not successful for the following reason"
840
+ msgstr "Geocode nebylo úspěšné z následujícího důvodu"
841
+
842
+ #: wp-google-maps-pro.php:1941
843
+ #@ wp-google-maps
844
+ msgid "Header 1 should be 'id', not"
845
+ msgstr "Hlavička 1 by měla být 'id', nikoliv"
846
+
847
+ #: wp-google-maps-pro.php:1942
848
+ #@ wp-google-maps
849
+ msgid "Header 2 should be 'map_id', not"
850
+ msgstr "Hlavička 2 by měla být 'map_id', nikoliv"
851
+
852
+ #: wp-google-maps-pro.php:1943
853
+ #@ wp-google-maps
854
+ msgid "Header 3 should be 'address', not"
855
+ msgstr "Hlavička 3 by měla být 'address', nikoliv"
856
+
857
+ #: wp-google-maps-pro.php:1944
858
+ #@ wp-google-maps
859
+ msgid "Header 4 should be 'desc', not"
860
+ msgstr "Hlavička 4 by měla být 'desc', nikoliv"
861
+
862
+ #: wp-google-maps-pro.php:1956
863
+ #@ wp-google-maps
864
+ msgid "CSV import failed"
865
+ msgstr "CSV import selhal"
866
+
867
+ #: wp-google-maps-pro.php:1987
868
+ #@ wp-google-maps
869
+ msgid "Your CSV file has been successfully imported"
870
+ msgstr "Váš CSV soubor byl úspěšně importován"
871
+
872
+ #: wp-google-maps-pro.php:2009
873
+ #@ wp-google-maps
874
+ msgid "Download ALL marker data to a CSV file"
875
+ msgstr "Stáhnout VŠECHNA data značek do CSV souboru "
876
+
877
+ #: wp-google-maps-pro.php:2012
878
+ #@ wp-google-maps
879
+ msgid "Advanced Options"
880
+ msgstr "Rozšířená nastavení"
881
+
882
+ #: wp-google-maps-pro.php:2015
883
+ #@ wp-google-maps
884
+ msgid "OR"
885
+ msgstr "NEBO"
886
+
887
+ #: wp-google-maps-pro.php:2016
888
+ #@ wp-google-maps
889
+ msgid "Upload CSV File"
890
+ msgstr "Nahrát CSV soubor"
891
+
892
+ #: wp-google-maps-pro.php:2018
893
+ #@ wp-google-maps
894
+ msgid "Replace existing data with data in file"
895
+ msgstr "Nahradit existující záznamy daty v souboru"
896
+
897
+ #: wp-google-maps-pro.php:2019
898
+ #@ wp-google-maps
899
+ msgid "Upload File"
900
+ msgstr "Nahrát soubor"
901
+
902
+ #: wp-google-maps-pro.php:2042
903
+ #@ wp-google-maps
904
+ msgid "Please update your BASIC version of this plugin for all of these settings to work."
905
+ msgstr "Prosím aktualizujte ZÁKLADNÍ verzi tohoto pluginu pro správnou funkci všech nastavení"
906
+
907
+ #: wp-google-maps-pro.php:2105
908
+ #@ wp-google-maps
909
+ msgid "Disable Mouse Wheel Zoom"
910
+ msgstr "Zakázat Zoom kolečkem myši"
911
+
912
+ #: wp-google-maps-pro.php:2134
913
+ #@ wp-google-maps
914
+ msgid "InfoWindow Settings"
915
+ msgstr "Nastavení InfoWindow"
916
+
917
+ #: wp-google-maps-pro.php:2137
918
+ #@ wp-google-maps
919
+ msgid "Default Image Width"
920
+ msgstr "Výchozí délka obrázku"
921
+
922
+ #: wp-google-maps-pro.php:2141
923
+ #@ wp-google-maps
924
+ msgid "Default Image Height"
925
+ msgstr "Výchozí výška obrázku"
926
+
927
+ #: wp-google-maps-pro.php:2145
928
+ #@ wp-google-maps
929
+ msgid "Image Thumbnails"
930
+ msgstr "Náhledy obrázků"
931
+
932
+ #: wp-google-maps-pro.php:2147
933
+ #@ wp-google-maps
934
+ msgid "Do not use TimThumb"
935
+ msgstr "Nepoužívat TimThumb"
936
+
937
+ #: wp-google-maps-pro.php:2148
938
+ #@ wp-google-maps
939
+ msgid "(Tick this if you are having problems viewing your thumbnail images)"
940
+ msgstr "(Vyberte, pokud máte problém se zobrázkováním náhledových obrázků)"
941
+
942
+ #: wp-google-maps-pro.php:2152
943
+ #@ wp-google-maps
944
+ msgid "Max InfoWindow Width"
945
+ msgstr "Maximální šířka InfoWindow"
946
+
947
+ #: wp-google-maps-pro.php:2153
948
+ #@ wp-google-maps
949
+ msgid "(Minimum: 200px)"
950
+ msgstr "(Minimum je 200px)"
951
+
952
+ #: wp-google-maps-pro.php:2156
953
+ #@ wp-google-maps
954
+ msgid "Other settings"
955
+ msgstr "Další nastavení"
956
+
957
+ #: wp-google-maps-pro.php:2158
958
+ #@ wp-google-maps
959
+ msgid "Open links in a new window"
960
+ msgstr "Otvírat odkazy v novém okně"
961
+
962
+ #: wp-google-maps-pro.php:2159
963
+ #@ wp-google-maps
964
+ msgid "(Tick this if you want to open your links in a new window)"
965
+ msgstr "(Vyberte, pokud chcete otevírat odkazy v novém okně)"
966
+
967
+ #: wp-google-maps-pro.php:2160
968
+ #@ wp-google-maps
969
+ msgid "Hide the address field"
970
+ msgstr "Skrýt pole adresy"
971
+
972
+ #: wp-google-maps-pro.php:2175
973
+ #@ wp-google-maps
974
+ msgid "Please <a href=\"plugins.php\">update</a> your WP Google Maps (basic) version to 5.01 or newer in order to make use of the new functionality"
975
+ msgstr "Prosím <a href=\"plugins.php\">aktualizujte</a> vaši verzi WP Google Maps (basic) version na 5.01 nebo novější pro využití všech novějších funkcí"
976
+
977
+ #: wp-google-maps-pro.php:2176
978
+ #@ wp-google-maps
979
+ msgid "Your version:"
980
+ msgstr "Vaše verze:"
981
+
982
+ #: wpGoogleMaps.php:1139
983
+ #@ wp-google-maps
984
+ msgid "WP Google Maps - Advanced Options"
985
+ msgstr "WP Gogle Maps - Rozšířená nastavení"
986
+
987
+ #: wpGoogleMaps.php:1141
988
+ #@ wp-google-maps
989
+ msgid "WP Google Maps - Settings"
990
+ msgstr "WP Google Maps - nastavení"
991
+
992
+ #: wp-google-maps-pro.php:372
993
+ #@ wp-google-maps
994
+ msgid "Reset to default"
995
+ msgstr "Resetovat na výchozí"
996
+
997
+ #: wp-google-maps-pro.php:372
998
+ #@ wp-google-maps
999
+ msgid "-reset-"
1000
+ msgstr "-smazat-"
1001
+
1002
+ #: wp-google-maps-pro.php:487
1003
+ #: wp-google-maps-pro.php:1199
1004
+ #: wp-google-maps-pro.php:1892
1005
+ #: wpGoogleMaps.php:1526
1006
+ #: wpGoogleMaps.php:1719
1007
+ #@ wp-google-maps
1008
+ msgid "Price"
1009
+ msgstr "Cena"
1010
+
1011
+ #: wpGoogleMaps.php:1718
1012
+ #: wpGoogleMaps.php:1738
1013
+ #@ wp-google-maps
1014
+ msgid "Ending"
1015
+ msgstr "Koncovka"
1016
+
1017
+ #: wp-google-maps-pro.php:488
1018
+ #: wp-google-maps-pro.php:1201
1019
+ #: wp-google-maps-pro.php:1894
1020
+ #@ wp-google-maps
1021
+ msgid "CZK/kg"
1022
+ msgstr "Kč / kg"
1023
+
1024
+ #: wp-google-maps-pro.php:1203
1025
+ #: wp-google-maps-pro.php:1896
1026
+ #@ wp-google-maps
1027
+ msgid "Ending type"
1028
+ msgstr "Typ koncovky"
1029
+
1030
+ #: wpGoogleMaps.php:1737
1031
+ #@ wp-google-maps
1032
+ msgid "Price*"
1033
+ msgstr "Kč/kg"
1034
+
1035
+ #: wp-google-maps-pro.php:1945
1036
+ #@ wp-google-maps
1037
+ msgid "Header 5 should be 'price', not"
1038
+ msgstr "Hlavička 5 by měla být 'price', nikoliv"
1039
+
1040
+ #: wp-google-maps-pro.php:1946
1041
+ #@ wp-google-maps
1042
+ msgid "Header 6 should be 'pic', not"
1043
+ msgstr "Hlavička 6 by měla být 'pic', nikoliv"
1044
+
1045
+ #: wp-google-maps-pro.php:1947
1046
+ #@ wp-google-maps
1047
+ msgid "Header 7 should be 'ending', not"
1048
+ msgstr "Hlavička 7 by měla být 'ending', nikoliv"
1049
+
1050
+ #: wp-google-maps-pro.php:1948
1051
+ #@ wp-google-maps
1052
+ msgid "Header 8 should be 'link', not"
1053
+ msgstr "Hlavička 8 by měla být 'link', nikoliv"
1054
+
1055
+ #: wp-google-maps-pro.php:1949
1056
+ #@ wp-google-maps
1057
+ msgid "Header 9 should be 'icon', not"
1058
+ msgstr "Hlavička 9 by měla být 'icon', nikoliv"
1059
+
1060
+ #: wp-google-maps-pro.php:1950
1061
+ #@ wp-google-maps
1062
+ msgid "Header 10 should be 'lat', not"
1063
+ msgstr "Hlavička 10 by měla být 'lat', nikoliv"
1064
+
1065
+ #: wp-google-maps-pro.php:1951
1066
+ #@ wp-google-maps
1067
+ msgid "Header 11 should be 'lng', not"
1068
+ msgstr "Hlavička 11 by měla být 'lng', nikoliv"
1069
+
1070
+ #: wp-google-maps-pro.php:1952
1071
+ #@ wp-google-maps
1072
+ msgid "Header 12 should be 'anim', not"
1073
+ msgstr "Hlavička 12 by měla být 'anim', nikoliv"
1074
+
1075
+ #: wp-google-maps-pro.php:1953
1076
+ #@ wp-google-maps
1077
+ msgid "Header 13 should be 'title', not"
1078
+ msgstr "Hlavička 12 by měla být 'title', nikoliv"
1079
+
1080
+ #: wp-google-maps-pro.php:1954
1081
+ #@ wp-google-maps
1082
+ msgid "Header 14 should be 'infoopen', not"
1083
+ msgstr "Hlavička 14 by měla být 'infoopen', nikoliv"
1084
+
1085
+ #: wp-google-maps-pro.php:491
1086
+ #: wpGoogleMaps.php:1530
1087
+ #@ wp-google-maps
1088
+ msgid "CNG termination"
1089
+ msgstr "Koncovka"
1090
+
1091
+ #: wpGoogleMaps.php:1906
1092
+ #@ wp-google-maps
1093
+ msgid "The plugin directory does not have 'write' permissions. Please enable 'write' permissions (755) for"
1094
+ msgstr "Adresář pluginu nemá oprávění k zápisu. Prosím nastavte oprávnění k zápisu (755) pro"
1095
+
1096
+ #: wpGoogleMaps.php:1908
1097
+ #@ wp-google-maps
1098
+ msgid "in order for this plugin to work! Please see"
1099
+ msgstr "pro správnou funkci pluginu! Více info najdete na"
1100
+
readme.txt CHANGED
@@ -69,6 +69,9 @@ Once installed and activated, a link should appear in your left navigation panel
69
 
70
  == Upgrade Notice ==
71
 
 
 
 
72
  = 4.14 =
73
  We have updated our Timthumb.php file to the latest version (2.8.5 to 2.8.10) in compliance with new WordPress regulations.
74
 
@@ -78,6 +81,15 @@ Previous versions may cause your blog to slow down. Upgrading to 4.5 will get ri
78
 
79
  == Changelog ==
80
 
 
 
 
 
 
 
 
 
 
81
  = 5.04 =
82
  * Fixed multiple bugs (big thanks to Alexander Gieg)
83
  * Fixed a firefox styling bug when using percentage width/height and set map alignment to 'none'
@@ -85,11 +97,11 @@ Previous versions may cause your blog to slow down. Upgrading to 4.5 will get ri
85
  * Added support for jQuery1.9+
86
 
87
  = 5.03 =
88
- * The google map now auto centres onto the address of the marker you have added
89
  * Fixed some bugs
90
 
91
  = 5.02 =
92
- * Fixed a firefox styling bug that caused the Directions box to load on the right of the map instead of below.
93
  * Added support code for the new WP Google Maps Visitor Generated Markers plugin
94
  * Added the option for a more advanced way to list your markers below your maps
95
  * Added responsive size functionality
69
 
70
  == Upgrade Notice ==
71
 
72
+ = 5.05 =
73
+ This is a must for users on IIS. Older WP Google Maps versions will not be compatible.
74
+
75
  = 4.14 =
76
  We have updated our Timthumb.php file to the latest version (2.8.5 to 2.8.10) in compliance with new WordPress regulations.
77
 
81
 
82
  == Changelog ==
83
 
84
+ = 5.05 =
85
+ * Czech localization added thanks to Pavel Riha
86
+ * Extended localization added to the jQuery.dataTables thanks to Pavel Riha
87
+ * Added troubleshooting support for various common problems
88
+ * Fixed a bug that was stopping the plugin from working on IIS servers
89
+ * Marker list now shows the default marker if set
90
+ * A lot of bugs fixed!
91
+
92
+
93
  = 5.04 =
94
  * Fixed multiple bugs (big thanks to Alexander Gieg)
95
  * Fixed a firefox styling bug when using percentage width/height and set map alignment to 'none'
97
  * Added support for jQuery1.9+
98
 
99
  = 5.03 =
100
+ * The Google map now auto centres onto the address of the marker you have added
101
  * Fixed some bugs
102
 
103
  = 5.02 =
104
+ * Fixed a Firefox styling bug that caused the Directions box to load on the right of the map instead of below.
105
  * Added support code for the new WP Google Maps Visitor Generated Markers plugin
106
  * Added the option for a more advanced way to list your markers below your maps
107
  * Added responsive size functionality
wpGoogleMaps.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP Google Maps
4
  Plugin URI: http://www.wpgmaps.com
5
  Description: The easiest to use Google Maps plugin! Create custom Google Maps with high quality markers containing locations, descriptions, images and links. Add your customized map to your WordPress posts and/or pages quickly and easily with the supplied shortcode. No fuss.
6
- Version: 5.04
7
  Author: WP Google Maps
8
  Author URI: http://www.wpgmaps.com
9
  */
@@ -28,8 +28,8 @@ $wpgmza_p = false;
28
  $wpgmza_g = false;
29
  $wpgmza_tblname = $wpdb->prefix . "wpgmza";
30
  $wpgmza_tblname_maps = $wpdb->prefix . "wpgmza_maps";
31
- $wpgmza_version = "5.04";
32
- $wpgmza_p_version = "5.04";
33
  $wpgmza_t = "basic";
34
 
35
  add_action('admin_head', 'wpgmaps_head');
@@ -62,7 +62,7 @@ function wpgmaps_activate() {
62
  $res_maps = $wpdb->get_results("SELECT * FROM $table_name_maps");
63
  $wpdb->show_errors();
64
  if (!$res_maps) { $rows_affected = $wpdb->insert( $table_name_maps, array(
65
- "map_title" => "Your first map",
66
  "map_start_lat" => "51.5081290",
67
  "map_start_lng" => "-0.1280050",
68
  "map_width" => "600",
@@ -78,6 +78,8 @@ function wpgmaps_activate() {
78
  "styling_json" => "",
79
  "active" => "0",
80
  "type" => "1",
 
 
81
  "bicycle" => "2",
82
  "traffic" => "2",
83
  "dbox" => "1",
@@ -90,7 +92,7 @@ function wpgmaps_activate() {
90
  } else {
91
  $rows_affected = $wpdb->insert( $table_name_maps, array( "map_start_lat" => "".$wpgmza_data['map_start_lat']."",
92
  "map_start_lng" => "".$wpgmza_data['map_start_lng']."",
93
- "map_title" => "Your Map",
94
  "map_width" => "".$wpgmza_data['map_width']."",
95
  "map_height" => "".$wpgmza_data['map_height']."",
96
  "map_width_type" => "".$wpgmza_data['map_width_type']."",
@@ -103,6 +105,8 @@ function wpgmaps_activate() {
103
  "styling_enabled" => "0",
104
  "styling_json" => "",
105
  "active" => "0",
 
 
106
  "directions_enabled" => "".$wpgmza_data['directions_enabled']."",
107
  "bicycle" => "".$wpgmza_data['bicycle']."",
108
  "traffic" => "".$wpgmza_data['traffic']."",
@@ -119,7 +123,7 @@ function wpgmaps_activate() {
119
  }
120
  // load first marker as an example marker
121
  $results = $wpdb->get_results("SELECT * FROM $table_name WHERE `map_id` = '1'");
122
- if (!$results) { $rows_affected = $wpdb->insert( $table_name, array( 'map_id' => '1', 'address' => 'London', 'lat' => '51.5081290', 'lng' => '-0.1280050' ) ); }
123
 
124
 
125
 
@@ -333,11 +337,19 @@ function wpgmaps_admin_javascript_basic() {
333
  var gmapsJsHost = (("https:" == document.location.protocol) ? "https://" : "http://");
334
  document.write(unescape("%3Cscript src='" + gmapsJsHost + "maps.google.com/maps/api/js?sensor=false' type='text/javascript'%3E%3C/script%3E"));
335
  </script>
336
- <link rel='stylesheet' id='wpgooglemaps-css' href='<?php echo wpgmaps_get_plugin_url(); ?>/css/wpgmza_style.css' type='text/css' media='all' />
 
337
  <link rel="stylesheet" type="text/css" media="all" href="<?php echo wpgmaps_get_plugin_url(); ?>/css/data_table.css" />
338
  <script type="text/javascript" src="<?php echo wpgmaps_get_plugin_url(); ?>/js/jquery.dataTables.js"></script>
339
  <script type="text/javascript" >
340
- jQuery(function() {
 
 
 
 
 
 
 
341
 
342
 
343
  jQuery(document).ready(function(){
@@ -641,13 +653,20 @@ function wpgmaps_user_javascript_basic() {
641
  </script>
642
  <script type="text/javascript" >
643
 
644
-
 
 
 
 
 
645
  jQuery(function() {
646
 
647
 
648
  jQuery(document).ready(function(){
649
 
650
 
 
 
651
  jQuery("#wpgmza_map").css({
652
  height:'<?php echo $wpgmza_height; ?><?php echo $wpgmza_height_type; ?>',
653
  width:'<?php echo $wpgmza_width; ?><?php echo $wpgmza_width_type; ?>'
@@ -789,7 +808,7 @@ function wpgmaps_update_xml_file($mapid = false) {
789
  {
790
  $id = $result->id;
791
  $address = stripslashes($result->address);
792
- $description = stripslashes($result->desc);
793
  $pic = $result->pic;
794
  if (!$pic) { $pic = ""; }
795
  $icon = $result->icon;
@@ -876,7 +895,8 @@ function wpgmaps_action_callback_basic() {
876
  if ($check == 1) {
877
 
878
  if ($_POST['action'] == "add_marker") {
879
- $rows_affected = $wpdb->insert( $table_name, array( 'map_id' => $_POST['map_id'], 'address' => $_POST['address'], 'lat' => $_POST['lat'], 'lng' => $_POST['lng'] ) );
 
880
  wpgmaps_update_xml_file($_POST['map_id']);
881
  echo wpgmza_return_marker_list($_POST['map_id']);
882
  }
@@ -1164,6 +1184,7 @@ function wpgmaps_menu_layout() {
1164
  wpgmza_map_page();
1165
 
1166
  } else {
 
1167
 
1168
 
1169
  if ($_GET['action'] == "trash" && isset($_GET['map_id'])) {
@@ -1294,19 +1315,24 @@ function wpgmaps_menu_advanced_layout() {
1294
 
1295
  function wpgmza_map_page() {
1296
  wpgmaps_debugger("map_page_start");
 
 
1297
 
 
 
1298
  if (function_exists('wpgmza_register_pro_version')) {
1299
- echo"<div class=\"wrap\"><div id=\"icon-edit\" class=\"icon32 icon32-posts-post\"><br></div><h2>".__("Your Maps","wp-google-maps")." <a href=\"admin.php?page=wp-google-maps-menu&action=new\" class=\"add-new-h2\">".__("Add New","wp-google-maps")."</a></h2>";
1300
  wpgmaps_check_versions();
1301
  wpgmaps_list_maps();
1302
  } else {
1303
- echo"<div class=\"wrap\"><div id=\"icon-edit\" class=\"icon32 icon32-posts-post\"><br></div><h2>".__("Your Maps","wp-google-maps")."</h2>";
1304
- echo"<p><i><a href='http://www.wpgmaps.com/purchase-professional-version/?utm_source=plugin&utm_medium=link&utm_campaign=mappage_1' title='".__("Pro Version")."'>".__("Create unlimited maps","wp-google-maps")."</a> ".__("with the","wp-google-maps")." <a href='http://www.wpgmaps.com/purchase-professional-version/?utm_source=plugin&utm_medium=link&utm_campaign=mappage_2' title='Pro Version'>".__("Pro Version","wp-google-maps")."</a> ".__("of WP Google Maps for only","wp-google-maps")." <strong>$14.99!</strong></i></p>";
1305
  wpgmaps_list_maps();
1306
 
1307
 
1308
  }
1309
  echo "</div>";
 
1310
  wpgmaps_debugger("map_page_end");
1311
 
1312
  }
@@ -1368,7 +1394,7 @@ function wpgmaps_check_versions() {
1368
 
1369
  $prov = get_option("WPGMZA_PRO");
1370
  $wpgmza_pro_version = $prov['version'];
1371
- if (floatval($wpgmza_pro_version) < 3 || $wpgmza_pro_version == null) {
1372
  wpgmaps_upgrade_notice();
1373
  }
1374
 
@@ -1741,9 +1767,11 @@ function wpgmza_return_marker_list($map_id,$admin = true,$width = "100%") {
1741
  ";
1742
  }
1743
 
1744
-
1745
- $wpgmza_data = get_option('WPGMZA');
1746
- if ($wpgmza_data['map_default_marker']) { $default_icon = "<img src='".$wpgmza_data['map_default_marker']."' />"; } else { $default_icon = "<img src='".wpgmaps_get_plugin_url()."/images/marker.png' />"; }
 
 
1747
 
1748
  foreach ( $results as $result ) {
1749
  $img = $result->pic;
@@ -1751,7 +1779,7 @@ function wpgmza_return_marker_list($map_id,$admin = true,$width = "100%") {
1751
  $icon = $result->icon;
1752
 
1753
  if (!$img) { $pic = ""; } else { $pic = "<img src=\"".$result->pic."\" width=\"40\" />"; }
1754
- if (!$icon) { $icon = $default_icon; } else { $icon = "<img src='".$result->icon."' />"; }
1755
  if (!$link) { $linktd = ""; } else { $linktd = "<a href=\"".$result->link."\" target=\"_BLANK\" title=\"".__("View this link","wp-google-maps")."\">&gt;&gt;</a>"; }
1756
  if ($admin) {
1757
  $wpgmza_tmp .= "
@@ -1760,7 +1788,7 @@ function wpgmza_return_marker_list($map_id,$admin = true,$width = "100%") {
1760
  <td height=\"40\">".$icon."<input type=\"hidden\" id=\"wpgmza_hid_marker_icon_".$result->id."\" value=\"".$result->icon."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_anim_".$result->id."\" value=\"".$result->anim."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_infoopen_".$result->id."\" value=\"".$result->infoopen."\" /></td>
1761
  <td>".$result->title."<input type=\"hidden\" id=\"wpgmza_hid_marker_title_".$result->id."\" value=\"".$result->title."\" /></td>
1762
  <td>".$result->address."<input type=\"hidden\" id=\"wpgmza_hid_marker_address_".$result->id."\" value=\"".$result->address."\" /></td>
1763
- <td>".$result->desc."<input type=\"hidden\" id=\"wpgmza_hid_marker_desc_".$result->id."\" value=\"".$result->desc."\" /></td>
1764
  <td>$pic<input type=\"hidden\" id=\"wpgmza_hid_marker_pic_".$result->id."\" value=\"".$result->pic."\" /></td>
1765
  <td>$linktd<input type=\"hidden\" id=\"wpgmza_hid_marker_link_".$result->id."\" value=\"".$result->link."\" /></td>
1766
  <td width='170' align='center'>
@@ -1775,7 +1803,7 @@ function wpgmza_return_marker_list($map_id,$admin = true,$width = "100%") {
1775
  <td height=\"40\">".$icon."<input type=\"hidden\" id=\"wpgmza_hid_marker_icon_".$result->id."\" value=\"".$result->icon."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_anim_".$result->id."\" value=\"".$result->anim."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_infoopen_".$result->id."\" value=\"".$result->infoopen."\" /></td>
1776
  <td>".$result->title."<input type=\"hidden\" id=\"wpgmza_hid_marker_title_".$result->id."\" value=\"".$result->title."\" /></td>
1777
  <td>".$result->address."<input type=\"hidden\" id=\"wpgmza_hid_marker_address_".$result->id."\" value=\"".$result->address."\" /></td>
1778
- <td>".$result->desc."<input type=\"hidden\" id=\"wpgmza_hid_marker_desc_".$result->id."\" value=\"".$result->desc."\" /></td>
1779
  </tr>";
1780
  }
1781
  }
@@ -1875,19 +1903,6 @@ function wpgmaps_check_shortcode() {
1875
  }
1876
  wpgmaps_debugger("check_for_sc_end");
1877
  }
1878
- function wpgmza_cURL_response($action) {
1879
- if (function_exists('curl_version')) {
1880
- global $wpgmza_version;
1881
- global $wpgmza_t;
1882
- $request_url = "http://www.wpgmaps.com/api/rec.php?action=$action&dom=".$_SERVER['HTTP_HOST']."&ver=".$wpgmza_version.$wpgmza_t;
1883
- $ch = curl_init();
1884
- curl_setopt($ch, CURLOPT_URL, $request_url);
1885
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
1886
- $output = curl_exec($ch);
1887
- curl_close($ch);
1888
- }
1889
-
1890
- }
1891
 
1892
  function wpgmaps_check_permissions() {
1893
  $filename = dirname( __FILE__ ).'/wpgmaps.tmp';
@@ -1937,6 +1952,10 @@ function wpgmaps_update_db_check() {
1937
 
1938
  add_action('plugins_loaded', 'wpgmaps_update_db_check');
1939
 
 
 
 
 
1940
  function wpgmaps_handle_db() {
1941
  wpgmaps_debugger("handle_db_start");
1942
 
@@ -1945,12 +1964,31 @@ function wpgmaps_handle_db() {
1945
 
1946
  $table_name = $wpdb->prefix . "wpgmza";
1947
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1948
  $sql = "
1949
  CREATE TABLE `".$table_name."` (
1950
  `id` int(11) NOT NULL AUTO_INCREMENT,
1951
  `map_id` int(11) NOT NULL,
1952
  `address` varchar(700) NOT NULL,
1953
- `desc` mediumtext NOT NULL,
1954
  `pic` varchar(700) NOT NULL,
1955
  `link` varchar(700) NOT NULL,
1956
  `icon` varchar(700) NOT NULL,
@@ -1966,9 +2004,6 @@ function wpgmaps_handle_db() {
1966
  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
1967
  dbDelta($sql);
1968
 
1969
- $sql2 = "alter table `".$table_name."` modify `desc` MEDIUMTEXT ;";
1970
- $wpdb->query($sql2);
1971
-
1972
 
1973
  $table_name = $wpdb->prefix . "wpgmza_maps";
1974
  $sql = "
@@ -2051,10 +2086,10 @@ function wpgmaps_upgrade_notice() {
2051
 
2052
  <p>We have recently added new functionality to the Pro version of this plugin. You are currently using the latest
2053
  Basic version which needs the latest Pro version for all functionality to work. Your current Pro version is
2054
- $wpgmza_pro_version - The latest Pro version is 4.01<br /></p>
2055
 
2056
- <p>You should have already received an email with the download link for the latest version, if not please
2057
- <a href='http://www.wpgmaps.com/contact-us/'>contact us</a><br /><br /></p>
2058
  <small>
2059
  <p><strong>Installation Instructions:</strong><br />
2060
  <ul>
@@ -2063,7 +2098,7 @@ function wpgmaps_upgrade_notice() {
2063
  </ul>
2064
  </p>
2065
  </small>
2066
- <p>If you experience into any bugs, please let me know so that I can get it sorted out ASAP</p>
2067
 
2068
  <p>Kind regards,<br /><a href='http://www.wpgmaps.com/'>WP Google Maps</a></p>
2069
  </big></big>
3
  Plugin Name: WP Google Maps
4
  Plugin URI: http://www.wpgmaps.com
5
  Description: The easiest to use Google Maps plugin! Create custom Google Maps with high quality markers containing locations, descriptions, images and links. Add your customized map to your WordPress posts and/or pages quickly and easily with the supplied shortcode. No fuss.
6
+ Version: 5.05
7
  Author: WP Google Maps
8
  Author URI: http://www.wpgmaps.com
9
  */
28
  $wpgmza_g = false;
29
  $wpgmza_tblname = $wpdb->prefix . "wpgmza";
30
  $wpgmza_tblname_maps = $wpdb->prefix . "wpgmza_maps";
31
+ $wpgmza_version = "5.05";
32
+ $wpgmza_p_version = "5.05";
33
  $wpgmza_t = "basic";
34
 
35
  add_action('admin_head', 'wpgmaps_head');
62
  $res_maps = $wpdb->get_results("SELECT * FROM $table_name_maps");
63
  $wpdb->show_errors();
64
  if (!$res_maps) { $rows_affected = $wpdb->insert( $table_name_maps, array(
65
+ "map_title" => "My first map",
66
  "map_start_lat" => "51.5081290",
67
  "map_start_lng" => "-0.1280050",
68
  "map_width" => "600",
78
  "styling_json" => "",
79
  "active" => "0",
80
  "type" => "1",
81
+ "kml" => "",
82
+ "fusion" => "",
83
  "bicycle" => "2",
84
  "traffic" => "2",
85
  "dbox" => "1",
92
  } else {
93
  $rows_affected = $wpdb->insert( $table_name_maps, array( "map_start_lat" => "".$wpgmza_data['map_start_lat']."",
94
  "map_start_lng" => "".$wpgmza_data['map_start_lng']."",
95
+ "map_title" => "My Map",
96
  "map_width" => "".$wpgmza_data['map_width']."",
97
  "map_height" => "".$wpgmza_data['map_height']."",
98
  "map_width_type" => "".$wpgmza_data['map_width_type']."",
105
  "styling_enabled" => "0",
106
  "styling_json" => "",
107
  "active" => "0",
108
+ "kml" => "",
109
+ "fusion" => "",
110
  "directions_enabled" => "".$wpgmza_data['directions_enabled']."",
111
  "bicycle" => "".$wpgmza_data['bicycle']."",
112
  "traffic" => "".$wpgmza_data['traffic']."",
123
  }
124
  // load first marker as an example marker
125
  $results = $wpdb->get_results("SELECT * FROM $table_name WHERE `map_id` = '1'");
126
+ if (!$results) { $rows_affected = $wpdb->insert( $table_name, array( 'map_id' => '1', 'address' => 'London', 'lat' => '51.5081290', 'lng' => '-0.1280050', 'pic' => '', 'link' => '', 'icon' => '', 'anim' => '', 'title' => '', 'infoopen' => '', 'description' => '') ); }
127
 
128
 
129
 
337
  var gmapsJsHost = (("https:" == document.location.protocol) ? "https://" : "http://");
338
  document.write(unescape("%3Cscript src='" + gmapsJsHost + "maps.google.com/maps/api/js?sensor=false' type='text/javascript'%3E%3C/script%3E"));
339
  </script>
340
+
341
+ <link rel='stylesheet' id='wpgooglemaps-css' href='<?php echo wpgmaps_get_plugin_url(); ?>/css/wpgmza_style.css' type='text/css' media='all' />
342
  <link rel="stylesheet" type="text/css" media="all" href="<?php echo wpgmaps_get_plugin_url(); ?>/css/data_table.css" />
343
  <script type="text/javascript" src="<?php echo wpgmaps_get_plugin_url(); ?>/js/jquery.dataTables.js"></script>
344
  <script type="text/javascript" >
345
+
346
+ if ('undefined' == typeof window.jQuery) {
347
+ alert("jQuery is not installed. WP Google Maps requires jQuery in order to function properly. Please ensure you have jQuery installed.")
348
+ } else {
349
+ // all good.. continue...
350
+ }
351
+
352
+ jQuery(function() {
353
 
354
 
355
  jQuery(document).ready(function(){
653
  </script>
654
  <script type="text/javascript" >
655
 
656
+ if ('undefined' == typeof window.jQuery) {
657
+ document.getElementById('wpgmza_map').innerHTML = 'Error: In order for WP Google Maps to work, jQuery must be installed. A check was done and jQuery was not present. Please see the <a href="http://www.wpgmaps.com/documentation/troubleshooting/jquery-troubleshooting/" title="WP Google Maps - jQuery Troubleshooting">jQuery troubleshooting section of our site</a> for more information.';
658
+ } else {
659
+ // all good.. continue...
660
+ }
661
+
662
  jQuery(function() {
663
 
664
 
665
  jQuery(document).ready(function(){
666
 
667
 
668
+
669
+
670
  jQuery("#wpgmza_map").css({
671
  height:'<?php echo $wpgmza_height; ?><?php echo $wpgmza_height_type; ?>',
672
  width:'<?php echo $wpgmza_width; ?><?php echo $wpgmza_width_type; ?>'
808
  {
809
  $id = $result->id;
810
  $address = stripslashes($result->address);
811
+ $description = stripslashes($result->description);
812
  $pic = $result->pic;
813
  if (!$pic) { $pic = ""; }
814
  $icon = $result->icon;
895
  if ($check == 1) {
896
 
897
  if ($_POST['action'] == "add_marker") {
898
+ $rows_affected = $wpdb->insert( $table_name, array( 'map_id' => $_POST['map_id'], 'address' => $_POST['address'], 'lat' => $_POST['lat'], 'lng' => $_POST['lng'], 'infoopen' => '', 'description' => '', 'title' => '', 'anim' => '', 'link' => '', 'icon' => '', 'pic' => '' ) );
899
+ //exit( var_dump( $wpdb->last_query ) );
900
  wpgmaps_update_xml_file($_POST['map_id']);
901
  echo wpgmza_return_marker_list($_POST['map_id']);
902
  }
1184
  wpgmza_map_page();
1185
 
1186
  } else {
1187
+ echo"<br /><div style='float:right; display:block; width:250px; height:36px; padding:6px; text-align:center; background-color: #EEE; border: 1px solid #E6DB55; margin-right:17px;'><strong>".__("Experiencing problems with the plugin?","wp-google-maps")."</strong><br /><a href='http://www.wpgmaps.com/documentation/troubleshooting/' title='WP Google Maps Troubleshooting Section' target='_BLANK'>".__("See the troubleshooting manual.","wp-google-maps")."</a></div>";
1188
 
1189
 
1190
  if ($_GET['action'] == "trash" && isset($_GET['map_id'])) {
1315
 
1316
  function wpgmza_map_page() {
1317
  wpgmaps_debugger("map_page_start");
1318
+
1319
+
1320
 
1321
+
1322
+
1323
  if (function_exists('wpgmza_register_pro_version')) {
1324
+ echo"<div class=\"wrap\"><div id=\"icon-edit\" class=\"icon32 icon32-posts-post\"><br></div><h2>".__("My Maps","wp-google-maps")." <a href=\"admin.php?page=wp-google-maps-menu&action=new\" class=\"add-new-h2\">".__("Add New","wp-google-maps")."</a></h2>";
1325
  wpgmaps_check_versions();
1326
  wpgmaps_list_maps();
1327
  } else {
1328
+ echo"<div class=\"wrap\"><div id=\"icon-edit\" class=\"icon32 icon32-posts-post\"><br></div><h2>".__("My Maps","wp-google-maps")."</h2>";
1329
+ echo"<p><i><a href='http://www.wpgmaps.com/purchase-professional-version/?utm_source=plugin&utm_medium=link&utm_campaign=mappage_1' title='".__("Pro Version","wp-google-maps")."'>".__("Create unlimited maps","wp-google-maps")."</a> ".__("with the","wp-google-maps")." <a href='http://www.wpgmaps.com/purchase-professional-version/?utm_source=plugin&utm_medium=link&utm_campaign=mappage_2' title='Pro Version'>".__("Pro Version","wp-google-maps")."</a> ".__("of WP Google Maps for only","wp-google-maps")." <strong>$14.99!</strong></i></p>";
1330
  wpgmaps_list_maps();
1331
 
1332
 
1333
  }
1334
  echo "</div>";
1335
+ echo"<br /><div style='float:right;'><a href='http://www.wpgmaps.com/documentation/troubleshooting/' title='WP Google Maps Troubleshooting Section'>".__("Problems with the plugin? See the troubleshooting manual.","wp-google-maps")."</a></div>";
1336
  wpgmaps_debugger("map_page_end");
1337
 
1338
  }
1394
 
1395
  $prov = get_option("WPGMZA_PRO");
1396
  $wpgmza_pro_version = $prov['version'];
1397
+ if (floatval($wpgmza_pro_version) < 4.06 || $wpgmza_pro_version == null) {
1398
  wpgmaps_upgrade_notice();
1399
  }
1400
 
1767
  ";
1768
  }
1769
 
1770
+ $res = wpgmza_get_map_data($map_id);
1771
+ $default_marker = "<img src='".$res->default_marker."' />";
1772
+
1773
+ //$wpgmza_data = get_option('WPGMZA');
1774
+ //if ($wpgmza_data['map_default_marker']) { $default_icon = "<img src='".$wpgmza_data['map_default_marker']."' />"; } else { $default_icon = "<img src='".wpgmaps_get_plugin_url()."/images/marker.png' />"; }
1775
 
1776
  foreach ( $results as $result ) {
1777
  $img = $result->pic;
1779
  $icon = $result->icon;
1780
 
1781
  if (!$img) { $pic = ""; } else { $pic = "<img src=\"".$result->pic."\" width=\"40\" />"; }
1782
+ if (!$icon) { $icon = $default_marker; } else { $icon = "<img src='".$result->icon."' />"; }
1783
  if (!$link) { $linktd = ""; } else { $linktd = "<a href=\"".$result->link."\" target=\"_BLANK\" title=\"".__("View this link","wp-google-maps")."\">&gt;&gt;</a>"; }
1784
  if ($admin) {
1785
  $wpgmza_tmp .= "
1788
  <td height=\"40\">".$icon."<input type=\"hidden\" id=\"wpgmza_hid_marker_icon_".$result->id."\" value=\"".$result->icon."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_anim_".$result->id."\" value=\"".$result->anim."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_infoopen_".$result->id."\" value=\"".$result->infoopen."\" /></td>
1789
  <td>".$result->title."<input type=\"hidden\" id=\"wpgmza_hid_marker_title_".$result->id."\" value=\"".$result->title."\" /></td>
1790
  <td>".$result->address."<input type=\"hidden\" id=\"wpgmza_hid_marker_address_".$result->id."\" value=\"".$result->address."\" /></td>
1791
+ <td>".$result->description."<input type=\"hidden\" id=\"wpgmza_hid_marker_desc_".$result->id."\" value=\"".$result->description."\" /></td>
1792
  <td>$pic<input type=\"hidden\" id=\"wpgmza_hid_marker_pic_".$result->id."\" value=\"".$result->pic."\" /></td>
1793
  <td>$linktd<input type=\"hidden\" id=\"wpgmza_hid_marker_link_".$result->id."\" value=\"".$result->link."\" /></td>
1794
  <td width='170' align='center'>
1803
  <td height=\"40\">".$icon."<input type=\"hidden\" id=\"wpgmza_hid_marker_icon_".$result->id."\" value=\"".$result->icon."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_anim_".$result->id."\" value=\"".$result->anim."\" /><input type=\"hidden\" id=\"wpgmza_hid_marker_infoopen_".$result->id."\" value=\"".$result->infoopen."\" /></td>
1804
  <td>".$result->title."<input type=\"hidden\" id=\"wpgmza_hid_marker_title_".$result->id."\" value=\"".$result->title."\" /></td>
1805
  <td>".$result->address."<input type=\"hidden\" id=\"wpgmza_hid_marker_address_".$result->id."\" value=\"".$result->address."\" /></td>
1806
+ <td>".$result->description."<input type=\"hidden\" id=\"wpgmza_hid_marker_desc_".$result->id."\" value=\"".$result->description."\" /></td>
1807
  </tr>";
1808
  }
1809
  }
1903
  }
1904
  wpgmaps_debugger("check_for_sc_end");
1905
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
1906
 
1907
  function wpgmaps_check_permissions() {
1908
  $filename = dirname( __FILE__ ).'/wpgmaps.tmp';
1952
 
1953
  add_action('plugins_loaded', 'wpgmaps_update_db_check');
1954
 
1955
+
1956
+
1957
+
1958
+
1959
  function wpgmaps_handle_db() {
1960
  wpgmaps_debugger("handle_db_start");
1961
 
1964
 
1965
  $table_name = $wpdb->prefix . "wpgmza";
1966
 
1967
+
1968
+
1969
+ // check for previous versions containing 'desc' instead of 'description'
1970
+ global $wpgmza_tblname;
1971
+ $results = $wpdb->get_results("DESC $wpgmza_tblname");
1972
+ foreach ($results as $row ) {
1973
+ if ($row->Field == "desc") {
1974
+ $founded++;
1975
+ }
1976
+ }
1977
+ if ($founded>0) {
1978
+ $wpdb->query(
1979
+ "
1980
+ ALTER TABLE $wpgmza_tblname CHANGE `desc` `description` MEDIUMTEXT
1981
+ "
1982
+ );
1983
+ }
1984
+ // end check
1985
+
1986
  $sql = "
1987
  CREATE TABLE `".$table_name."` (
1988
  `id` int(11) NOT NULL AUTO_INCREMENT,
1989
  `map_id` int(11) NOT NULL,
1990
  `address` varchar(700) NOT NULL,
1991
+ `description` mediumtext NOT NULL,
1992
  `pic` varchar(700) NOT NULL,
1993
  `link` varchar(700) NOT NULL,
1994
  `icon` varchar(700) NOT NULL,
2004
  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
2005
  dbDelta($sql);
2006
 
 
 
 
2007
 
2008
  $table_name = $wpdb->prefix . "wpgmza_maps";
2009
  $sql = "
2086
 
2087
  <p>We have recently added new functionality to the Pro version of this plugin. You are currently using the latest
2088
  Basic version which needs the latest Pro version for all functionality to work. Your current Pro version is
2089
+ $wpgmza_pro_version - The latest Pro version is 4.06<br /></p>
2090
 
2091
+ <p>To download your latest copy of the Pro version, please use this form and your download link will be emailed to your immediately.
2092
+ <a href='http://www.wpgmaps.com/get-updated-version/'>Get your latest version by clicking here.</a><br /><br /></p>
2093
  <small>
2094
  <p><strong>Installation Instructions:</strong><br />
2095
  <ul>
2098
  </ul>
2099
  </p>
2100
  </small>
2101
+ <p>If you experience any bugs, please let me know so that I can get it sorted out ASAP.</p>
2102
 
2103
  <p>Kind regards,<br /><a href='http://www.wpgmaps.com/'>WP Google Maps</a></p>
2104
  </big></big>