diff --git a/README.md b/README.md
index 91b02ca9..9e0fef0c 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,140 @@ tablesorter can successfully parse and sort many types of data including linked
View the [complete listing here](https://github.com/Mottie/tablesorter/wiki/Change).
+#### Version 2.15.0 (1/25/2014)
+
+* Core
+ * Add accessibility attributes to tablesorter (aria).
+ * Make header's `bindEvent` function public to allow easier binding to cloned table headers.
+ * Add an unsorted header class name option `cssNone` (empty string by default) and now all unsorted headers will have a class name of `tablesorter-headerUnSorted` applied; updated destroy method to remove header unsorted class name.
+ * Ensure only "updateRow" is triggered within the pager plugin to prevent issues with Proptype.js, see [issue #217](https://github.com/Mottie/tablesorter/issues/217).
+ * Clean up all public API functions to accept `table` as either a DOM element or a jQuery table object.
+ * The log will now display console errors and/or warnings based on those key words.
+ * Consolidated all default class names used by the plugin within `$.tablesorter.css` - these are class names that are not set by the options.
+
+* Docs
+ * Organize the examples section to make it easier to find the desired sort demo.
+ * Add associated tablesorter option (with link) with the appropriate examples.
+ * Add a "Custom parsers" section instead of lumping it in with the widgets.
+ * Add a "Work-in-progress" section for some beta demos.
+ * Add indicators to show which widgets are contained within the `jquery.tablesorter.widgets.js` file.
+ * Add an "API" section which gives details on how to use tablesorters available public variables & functions in both the core and widgets.
+ * Colorize the left border of code blocks to differentiate HTML, CSS and javascript.
+ * Update & consolidate jQuery UI accordion code.
+ * Miscellaneous demo fixes.
+
+* Parsers
+ * The "shortDate" parser now works properly with header colspans. Fixes [issue #474](https://github.com/Mottie/tablesorter/issues/474).
+ * The "currency" parser will now properly detect currencies which include a plus or minus sign.
+ * The "checkbox" parser (contained in the `parser-input-select.js` file) will now toggle a class name of `checked-#` (`#` is the column index) on the row.
+ * A new `parsed` parameter has been added to the parser code block.
+ * This parameter is set with a boolean value (i.e. `true` or `false`), to signal the filter widget to only search through parsed data when `true`.
+ * All parsers within the "parser-input-select.js" file now include a `parsed:true` parameter.
+ * The [parsers](http://mottie.github.io/tablesorter/docs/example-parsers.html) and [parsers-advanced](http://mottie.github.io/tablesorter/docs/example-parsers-advanced.html) demos have been updated to reflect this addition.
+
+* css Sticky headers widget:
+ * Add `cssStickyHeaders_zIndex` option. Fixes [issue #466](https://github.com/Mottie/tablesorter/issues/466).
+ * Browser will now scroll to table top after filtering. Fixes [issue #482](https://github.com/Mottie/tablesorter/issues/482).
+
+* Column selector widget (new!)
+ * This widget can make a table responsive. It uses similar parameters as those used by jQuery mobile to set priorities for hiding columns (uses "data-priority" attribute).
+ * The column priorities range from 1 to 6, with 1 having the highest priority. As the browser window shrinks, lower priority (higher numbers) columns will be hidden first until all numbered priority columns are hidden.
+ * Any named data-priority, other than the numbers 1 - 6, (e.g. "critical" or "persistent") will be treated as a column which *will not be included* in the column selector.
+ * With the addition of some basic selector markup and css, this widget will also allow selecting (hiding or showing) table columns.
+ * Popups can also be targetted for addition of these selectors; [the demo](http://mottie.github.io/tablesorter/docs/example-widget-column-selector.html) includes a Bootstrap popover sample.
+ * Css selectors are used to hide/show columns for optimal speed and therefore will not work in IE8 and older browsers.
+ * jQuery version 1.7+ and tablesorter verison 2.8+ are needed for this widget to work properly.
+ * Check out the [demo](http://mottie.github.io/tablesorter/docs/example-widget-column-selector.html) with more details on how to setup this widget!
+
+* Editable widget
+ * Refresh other widgets after a cell has been edited. Fixes [issue #487](https://github.com/Mottie/tablesorter/issues/487).
+
+* Filter widget:
+ * Make operator match higher priority than exact matching. Fixes [issue #465](https://github.com/Mottie/tablesorter/issues/465).
+ * Fix " OR " is now matched case insensitive.
+ * The `filter_cssFilter` option can now contain an array of class names to be applied to each filter input; added in addition to the "tablesorter-filter" class name.
+ * Start filter values are now preserved. Fixes [issue #452](https://github.com/Mottie/tablesorter/issues/452).
+ * Filter formatter demo: Update jQuery UI & stylesheet - fixes UI spinner.
+ * Fix child rows always visible when filtering.
+ * Update beta demo - [select2 external table filters demo](http://mottie.github.io/tablesorter/beta-testing/example-external-filters-using-select2.html), thanks to [mohitmayank](https://github.com/mohitmayank); see [pull request #469](https://github.com/Mottie/tablesorter/pull/469).
+ * Add `filter_hideEmpty` option
+ * Set this option to false to always show the filter row.
+ * By default, the filter row is completely hidden when no rows exist within the tbody (previous behavior)
+ * Fixes [issue #450](https://github.com/Mottie/tablesorter/issues/450)
+ * Rewrite filter match any column code
+ * Removed `filter_anyMatch` option - sorry about not deprecating this first!
+ * Added a `filter_external` option which is set to a jQuery selector string of inputs, outside of the table, to be used for searching table content.
+ * External inputs must have a `data-column="x"` attribute where `"x"` is the associated column to filter; `"x"` can also be set as `"any"` to match any column.
+ * All filters, internal and external, now automatically update and be used with the `$.tablesorter.getFilters` and `$.tablesorter.setFilters` functions.
+ * Please refer to the documentation for the [`filter_external` option](http://mottie.github.io/tablesorter/docs/index.html#widget-filter-external) for more details.
+ * Also check out the updated [filter widget external option](http://mottie.github.io/tablesorter/docs/example-widget-filter-any-match.html) and [filter widget external inputs](http://mottie.github.io/tablesorter/docs/example-widget-filter-external-inputs.html) demos.
+ * This fixes issues [#114](https://github.com/Mottie/tablesorter/issues/114), [#370](https://github.com/Mottie/tablesorter/issues/370), [#471](https://github.com/Mottie/tablesorter/issues/471) and [#490](https://github.com/Mottie/tablesorter/issues/490).
+ * Parsers with a `parsed: true` flag will now automatically force the filter widget to only search through parsed data instead of actual table cell data
+ * This is needed specifically for parsers of input, textarea and select elements.
+ * All parsers within the "parser-input-select.js" file have been updated with this parameter.
+ * This flag is essentially does the same thing as adding a class name of `filter-parsed` to the column header, or `filter: "parsed"` setting to the [`headers` option](http://mottie.github.io/tablesorter/docs/#headers).
+
+* Filter Formatter (Filter widget extension):
+ * These updated filter widget functions are not completely backward compatible with older versions of the filter widget. Please update both!
+ * Added `compare` & `selected` options:
+ * These options allow the adding of a comparison operator selector to the cell (e.g. `>`, `>=`, `<`, `<=`, etc).
+ * If any `cellText` is included, it is now wrapped in a label with a class name of "compare-select-label" and "compare-select-label#" (where "#" is the column index).
+ * The selector has a class name of "compare-select" and "compare-select#" (where "#" is the column index)
+ * Whichever type of input that is added to the cell is then wrapped in a div with class "compare-select-wrapper" and "compare-select-wrapper#" (where "#" is the column index).
+ * These class names allow styling of an individual filter to keep elements in line, or however you wish to style it.
+ * Filter reset now sets these filters to their default values, not an empty string.
+ * Updated to now properly restore saved filters.
+ * Added `endOfDay` option for jQuery UI Datepicker.
+ * When `true` search dates will include all times from the date chosen when a comparison is made of dates "less than" the set date.
+ * Example 1: if a table entry has a date of "Jan 14, 2014 11:23 AM" and the filter search is set to `<= 1/14/2014`, the table entry will be included in the search; the default set time would otherwise be "1/14/2014 00:00:00" and not include the entry from "11:23 AM". So, the `endOfDay` option sets the time to "23:59:59".
+ * Example 2: if searching for one specific date, this option will now search for all times within that day. For example, searching for `=1/20/2014`, and the results will include dates from 1/20/2014 00:00:00 to 1/20/2014 23:59:59.
+ * When comparing dates greater than the set date, the time will be set to midnight; so this option will not be applied.
+ * Example 3: in two date inputs, the `endOfDay` time is only applied to the "to" input; search for `1/20/2014 - 1/20/2014`
+ * This option is available in both the comparison (one input) and range (two inputs; "to" date input only) date pickers.
+ * Fixes [issue #325](https://github.com/Mottie/tablesorter/issues/325) and [issue #430](https://github.com/Mottie/tablesorter/issues/430).
+
+* Group widget:
+ * Attempt to fix ajax issue. See [issue #437](https://github.com/Mottie/tablesorter/issues/437).
+ * Combining group widget with pager should now work properly. Fixes [isse #437](https://github.com/Mottie/tablesorter/issues/437).
+ * The widget will now find the correct header cell when multiple thead rows are present.
+
+* Pager (plugin & widget):
+ * Fixed pager issues with empty tables
+ * When existing rows are removed from the table, the pager display will no properly update to show zero total rows.
+ * When starting from an empty table and content is added, all widgets are refreshed
+ * When updating the table via an update method, the filter search will now be applied properly.
+ * Fixes issues [#426](https://github.com/Mottie/tablesorter/issues/426) & [#455](https://github.com/Mottie/tablesorter/issues/455)
+ * Correct page calculation. Fixes [issue #468](https://github.com/Mottie/tablesorter/issues/468).
+ * Added custom storage keys. Thanks to [eire1130](https://github.com/eire1130); see [pull request #480](https://github.com/Mottie/tablesorter/pull/480) & [issue #481](https://github.com/Mottie/tablesorter/issues/481).
+ * Added a public show error function `$.tablesorter.showError( table, message );`
+ * Pass this function the table DOM element or jQuery object in `table`
+ * The message can either be a string with a message ("table refuses to cooperate")
+ * or, the message can be an HTML string of an entire table row (`'
yeah, instead of showing your data... I am taking a nap
'`)
+ * If the message is blank, all error rows are removed
+ * Fulfills [issue #486](https://github.com/Mottie/tablesorter/issues/486)
+ * Please note that this function was added to both the pager widget & pager plugin; In the next major release, this function will be separate from both, and can be included in the build.
+ * All theme files included a minor update with this change.
+ * Added accessibility attributes to the pager.
+ * Fix jsHint warnings.
+
+* Resizable widget
+ * Fix reported js error.
+ * The resizable reset function `$.tablesorter.resizableReset(table);` now accepts jQuery objects.
+
+* Sticky headers widget
+ * Select boxes work again within sticky headers. Fixes [issue #473](https://github.com/Mottie/tablesorter/issues/473).
+ * Browser will scroll to table top after filtering.
+ * This only occurs if the sticky header is active and after a filter is applied.
+ * Fixes [issue #482](https://github.com/Mottie/tablesorter/issues/482).
+ * Use core's new `bindEvents` public function to bind events to cloned sticky header.
+ * Fix sticky header alignment within `attachTo` elements.
+
+* Miscellaneous
+ * Update all Bootstrap demos to use the latest version (v3.0.3). Thanks [themilkman](https://github.com/themilkman)!
+ * Update all demo pages that use jQuery UI accordion with the newest version. Also added a clickable anchor to each accordion header.
+ * Consolidate default class names within `$.tablesorter.css` for the filter, resizer and stickyHeaders widgets.
+ * Renamed component.json to bower.json
+
#### Version 2.14.5 (12/16/2013)
* Pager
@@ -119,93 +253,3 @@ View the [complete listing here](https://github.com/Mottie/tablesorter/wiki/Chan
* Grouping widget
* Invalid group class now fails silently.
* Fixes [issue #438](https://github.com/Mottie/tablesorter/issues/438).
-
-#### Version 2.14.1 (11/22/2013)
-
-* Filter widget
- * External inputs bound using the filter `bindSearch` function now clear on the "filterReset" event.
- * Replace `Array.indexOf()` due to IE8.
-* Pager (plugin & widget)
- * Replace `Array.indexOf()` due to IE8. Fixes [issue #388](https://github.com/Mottie/tablesorter/issues/388).
-* Themes
- * Non-sortables headers now show the default cursor
- * Fix Dropbox theme to work properly within the sticky header demo
- * Fix Ice theme to include a top border in the sticky header demo
- * Tweaked sticky header widget to better align columns in Firefox & adjust caption to hide border edges.
- * See the [sticky header demo](http://mottie.github.io/tablesorter/docs/example-widget-sticky-header.html) to see these changes.
- * Fixes [#407](https://github.com/Mottie/tablesorter/issues/407).
-* Documentation
- * Update FAQ page to include information on the zebra widget not always working.
- * Update demos to use Bootstrap 3.0.2.
- * Add search instructions to the wiki documentation pages.
- * Add link to FAQ & search instructions on the main documenation page.
-* Add associated core version number to pager addon & widget, main widget file and filter formatter file.
-
-#### Version 2.14.0 (11/19/2013)
-
-**Core**
-* Changed sorting algorithms:
- * Due to problems with sorting multiple columns improperly sorting algorithms again include code to sort empty cells.
- * Internal sorting again has separate ascending and descending functions; but the previous `$.tablesorter.sortNatural` (ascending only), `$.tablesorter.sortNumeric` (ascending only) and `$.tablesorter.sortText` (ascending only) functions are still available.
- * Custom text & numeric sort functions, added via `textSorter` and `numberSorter` options now require you to return the sort in the correct direction.
- * Custom sort functions no longer have empty cells automatically handled for you.
- * Fixes [issue #419](https://github.com/Mottie/tablesorter/issues/419).
-* Added `sortStable` option which when `true` will sort exactly equal items by placing them in their original unsorted order (or, perform a [stable sort](http://en.wikipedia.org/wiki/Stable_sort#Stability)).
-* Removed double icon class names.
-* Added `tabIndex` option
- * When `true`, a tabindex is added to the headers for keyboard accessibility; this was previously always applied
- * When `false`, table headers will not be included when tabbing through the page
- * Fulfills [issue #415](https://github.com/Mottie/tablesorter/issues/415).
-
-**Filter widget**
-* Setting a filter to build a select no longer causes an error. Fixes [issue #421](https://github.com/Mottie/tablesorter/issues/421).
-* Added `filter_saveFilters` option
- * When `true`, this option saves the current filters using the storage utility (local storage with cookie fallback).
- * This option is set to `false` by default.
- * See [issue #388](https://github.com/Mottie/tablesorter/issues/388).
-* Allow multiple external filter inputs
- * The `$.tablesorter.filter.bindSearch( $table, $external )` function now allows binding searches using the built-in functioning.
- * The bind search function will unbind any previously bound `keyup` and `search` event listeners on the `$external` elements.
- * External inputs must not have a `tablesorter-filter` class to distinguish them from internal filters.
- * If not using the `filter_anyMatch` option, external filters can be set to target specific columns by including a `data-column` attribute.
- * See the new [filter external inputs demo](http://mottie.github.io/tablesorter/docs/example-widget-filter-external-inputs.html).
-* Filter reset button clicks will again trigger a `filterReset` event. Fixes [issue #423](https://github.com/Mottie/tablesorter/issues/423).
-
-**Grouping widget**
-* Merged in fix for grouping widget + filter widget + child row widget.
- * Updated demo with multi-child column styling.
- * Thanks [Xamamule](https://github.com/Xamamule) in [pull #414](https://github.com/Mottie/tablesorter/pull/414)!
- * This also fixes [issue #422](https://github.com/Mottie/tablesorter/issues/422).
-* Renamed variables & cleanup
-* Added `group_dateString` function to format the date string for `group-date` header class name.
-
-**Zebra widget**
-* Now skips removable rows added by other widgets, more specifically, it skips rows with a `remove-me` class name (set by the `selectorRemove` option).
-
-**Docs updates**
-* Added a side menu with search to the main document page.
- * The main documentation page now uses Bootstrap for some styles.
- * Search includes a count with clear search, previous result and next result buttons.
- * Search options included to find letters or whole words only, and choose if the search is case sensitive, or not.
- * The advantage of this search over the browser's built-in search (Ctrl-F) is that this search will find text within the hidden content
- * Indexing of the search results may not always be in order, i.e. "10/10" may not always be the lowest result on the page due to nested elements.
- * Sorry, IE7 and older users, the search works but but is really slow. And the side menu styling leaves much to be desired (using Bootstrap).
-* jQuery UI theme selector updates. See [issue #407](https://github.com/Mottie/tablesorter/issues/407).
-* Updated typos & css in various demos
-* Added Utility options section for options used by parsers, storage utility and pager ajax data.
-* Added removed options section.
- * This applies to pager options available in the original version of tablesorter which are no longer supported.
- * Fixes [issue #416](https://github.com/Mottie/tablesorter/issues/416).
-* Added `kbd` styling for better visualization of keyboard keys.
-
-**Other**
-* Renamed variables within the [pager custom control demo](http://mottie.github.io/tablesorter/beta-testing/example-pager-custom-controls.html) (still in beta)
-* Renamed variables within default widgets file
- * Utilities: storage, addHeaderResizeEvent,, resizableReset
- * Widgets: columns, resizable, stickyHeaders, uitheme, saveSort
-* Updated parser-date-two-digit-year.js to allow changing the date range
- * Set a different date range by adding a value to `table.config.dateRange`.
- * Instructions added to main documents under utility options
-* Storage utility (`$.tablesorter.storage`) now accepts a jQuery object as well as a DOM object of the table
- * `$.tablesorter.storage( $('#mytable'), 'myvariable', 'YAY' );`, or
- * `$.tablesorter.storage( $('#mytable')[0], 'myvariable', 'YAY' );`
diff --git a/addons/pager/jquery.tablesorter.pager.js b/addons/pager/jquery.tablesorter.pager.js
index 7750973c..20ca3ecb 100644
--- a/addons/pager/jquery.tablesorter.pager.js
+++ b/addons/pager/jquery.tablesorter.pager.js
@@ -1,6 +1,6 @@
/*!
* tablesorter pager plugin
- * updated 1/21/2014 (v2.15.0)
+ * updated 2/19/2014 (v2.15.0)
*/
/*jshint browser:true, jquery:true, unused:false */
;(function($) {
@@ -240,7 +240,7 @@
// process data
if ( typeof(p.ajaxProcessing) === "function" ) {
// ajaxProcessing result: [ total, rows, headers ]
- var i, j, hsh, $f, $sh, t, th, d, l, $err, rr_count,
+ var i, j, hsh, $f, $sh, t, th, d, l, rr_count,
c = table.config,
$t = c.$table,
tds = '',
diff --git a/addons/pager/jquery.tablesorter.pager.min.js b/addons/pager/jquery.tablesorter.pager.min.js
index 8fb41413..b7f2f240 100644
--- a/addons/pager/jquery.tablesorter.pager.min.js
+++ b/addons/pager/jquery.tablesorter.pager.min.js
@@ -1 +1,2 @@
-!function(e){"use strict";var t=e.tablesorter;e.extend({tablesorterPager:new function(){this.defaults={container:null,ajaxUrl:null,customAjaxUrl:function(e,t){return t},ajaxObject:{dataType:"json"},processAjaxOnInit:!0,ajaxProcessing:function(){return[0,[],null]},output:"{startRow} to {endRow} of {totalRows} rows",updateArrows:!0,page:0,size:10,savePages:!0,storageKey:"tablesorter-pager",fixedHeight:!1,countChildRows:!1,removeRows:!1,cssFirst:".first",cssPrev:".prev",cssNext:".next",cssLast:".last",cssGoto:".gotoPage",cssPageDisplay:".pagedisplay",cssPageSize:".pagesize",cssErrorRow:"tablesorter-errorRow",cssDisabled:"disabled",totalRows:0,totalPages:0,filteredRows:0,filteredPages:0,ajaxCounter:0,currentFilters:[],startRow:0,endRow:0,$size:null,last:{}};var a=this,s=function(e,t){var a="addClass",s="removeClass",i=e.cssDisabled,r=!!t,o=Math.min(e.totalPages,e.filteredPages);e.updateArrows&&(e.$container.find(e.cssFirst+","+e.cssPrev)[r||0===e.page?a:s](i),e.$container.find(e.cssNext+","+e.cssLast)[r||e.page===o-1||0===e.totalPages?a:s](i))},i=function(e,a,i){var r,o,n,g,l=e.config,d=l.$table.hasClass("hasFilters")&&!a.ajaxUrl,c=(l.widgetOptions&&l.widgetOptions.filter_filteredRow||"filtered")+","+l.selectorRemove+(a.countChildRows?"":",."+l.cssChildRow),p=a.size||10;if(a.totalPages=Math.ceil(a.totalRows/p),a.filteredRows=d?l.$tbodies.eq(0).children("tr").not("."+c).length:a.totalRows,a.filteredPages=d?Math.ceil(a.filteredRows/p)||1:a.totalPages,Math.min(a.totalPages,a.filteredPages)>=0&&(c=a.size*a.page>a.filteredRows,a.startRow=c?1:0===a.filteredRows?0:a.size*a.page+1,a.page=c?0:a.page,a.endRow=Math.min(a.filteredRows,a.totalRows,a.size*(a.page+1)),g=a.$container.find(a.cssPageDisplay),n=(a.ajaxData&&a.ajaxData.output?a.ajaxData.output||a.output:a.output).replace(/\{page([\-+]\d+)?\}/gi,function(e,t){return a.totalPages?a.page+(t?parseInt(t,10):1):0}).replace(/\{\w+(\s*:\s*\w+)?\}/gi,function(e){var t=e.replace(/[{}\s]/g,""),s=t.split(":"),i=a.ajaxData,r=/(rows?|pages?)$/i.test(t)?0:"";return s.length>1&&i&&i[s[0]]?i[s[0]][s[1]]:a[t]||(i?i[t]:r)||r}),g.length&&(g["INPUT"===g[0].tagName?"val":"html"](n),a.$goto.length))){for(c="",o=Math.min(a.totalPages,a.filteredPages),r=1;o>=r;r++)c+="";a.$goto.html(c).val(a.page+1)}s(a),a.initialized&&i!==!1&&(l.$table.trigger("pagerComplete",a),a.savePages&&t.storage&&t.storage(e,a.storageKey,{page:a.page,size:a.size}))},r=function(t,a){var s,i,r=t.config,o=r.$tbodies.eq(0);a.fixedHeight&&(o.find("tr.pagerSavedHeightSpacer").remove(),i=e.data(t,"pagerSavedHeight"),i&&(s=i-o.height(),s>5&&e.data(t,"pagerLastSize")===a.size&&o.children("tr:visible").length')))},o=function(t,a){var s=t.config.$tbodies.eq(0);s.find("tr.pagerSavedHeightSpacer").remove(),e.data(t,"pagerSavedHeight",s.height()),r(t,a),e.data(t,"pagerLastSize",a.size)},n=function(e,t){if(!t.ajaxUrl){var a,s=e.config,i=s.$tbodies.eq(0).children(),r=i.length,o=t.page*t.size,n=o+t.size,g=s.widgetOptions&&s.widgetOptions.filter_filteredRow||"filtered",l=0;for(a=0;r>a;a++)i[a].className.match(g)||(i[a].style.display=l>=o&&n>l?"":"none",l+=i[a].className.match(s.cssChildRow+"|"+s.selectorRemove.slice(1))&&!t.countChildRows?0:1)}},g=function(t,a){a.size=parseInt(a.$size.val(),10)||a.size,e.data(t,"pagerLastSize",a.size),s(a),a.removeRows||(n(t,a),e(t).bind("sortEnd.pager filterEnd.pager",function(){n(t,a)}))},l=function(a,s,o,n,g){if("function"==typeof o.ajaxProcessing){var l,d,c,p,f,u,h,b,z,w,P,j=s.config,v=j.$table,x="",R=o.ajaxProcessing(a,s)||[0,[]],m=v.find("thead th").length;if(v.find("thead tr."+o.cssErrorRow).remove(),g)j.debug&&t.log("Ajax Error",n,g),w=e('
'+(0===n.status?"Not connected, verify Network":404===n.status?"Requested page not found [404]":500===n.status?"Internal Server Error [500]":"parsererror"===g?"Requested JSON parse failed":"timeout"===g?"Time out error":"abort"===g?"Ajax Request aborted":"Uncaught error: "+n.statusText+" ["+n.status+"]")+"