jquery-tablesorter 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +48 -31
- data/Rakefile +56 -1
- data/lib/jquery-tablesorter/version.rb +1 -1
- data/vendor/assets/images/jquery-tablesorter/addons/{icons → pager/icons}/first.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/addons/{icons → pager/icons}/last.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/addons/pager/icons/loading.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/addons/{icons → pager/icons}/next.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/addons/{icons → pager/icons}/prev.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/black-asc.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/black-desc.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/black-unsorted.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/dropbox-asc1.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/dropbox-asc2.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/dropbox-desc1.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/dropbox-desc2.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/green-asc.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/green-desc.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/green-header.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/green-unsorted.png +0 -0
- data/vendor/assets/images/jquery-tablesorter/ice-asc.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/ice-desc.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/ice-unsorted.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/white-asc.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/white-desc.gif +0 -0
- data/vendor/assets/images/jquery-tablesorter/white-unsorted.gif +0 -0
- data/vendor/assets/javascripts/jquery-tablesorter.js +3 -1
- data/vendor/assets/javascripts/jquery-tablesorter/addons/{jquery.tablesorter.pager.js → pager/jquery.tablesorter.pager.js} +507 -419
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.metadata.js +53 -85
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +465 -314
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.min.js +6 -0
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +618 -267
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.min.js +12 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/addons/{jquery.tablesorter.pager.css → pager/jquery.tablesorter.pager.css} +15 -14
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.black-ice.css +161 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.blue.css +196 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap.css +118 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.dark.css +162 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.default.css +164 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.dropbox.css +175 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.green.css +174 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.grey.css +217 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.ice.css +164 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.jui.css +128 -0
- metadata +44 -14
- data/lib/tasks/jquery-tablesorter_tasks.rake +0 -39
- data/vendor/assets/images/jquery-tablesorter/addons/icons/loading.gif +0 -0
- data/vendor/assets/stylesheets/jquery-tablesorter/blue.css +0 -3
- data/vendor/assets/stylesheets/jquery-tablesorter/blue/style.css +0 -128
- data/vendor/assets/stylesheets/jquery-tablesorter/ui.css +0 -4
- data/vendor/assets/stylesheets/jquery-tablesorter/ui/style.css +0 -67
@@ -0,0 +1,6 @@
|
|
1
|
+
/*!
|
2
|
+
* TableSorter 2.4.6 - Client-side table sorting with ease!
|
3
|
+
* Minified using UglifyJS (http://jscompress.com/)
|
4
|
+
* Copyright (c) 2007 Christian Bach
|
5
|
+
*/
|
6
|
+
!function($){"use strict";$.extend({tablesorter:new function(){function log(a){if(typeof console!=="undefined"&&typeof console.log!=="undefined"){console.log(a)}else{alert(a)}}function benchmark(a,b){log(a+" ("+((new Date).getTime()-b.getTime())+"ms)")}function getElementText(a,b,c){if(!b){return""}var d=a.config,e=d.textExtraction,f="";if(e==="simple"){if(d.supportsTextContent){f=b.textContent}else{f=$(b).text()}}else{if(typeof e==="function"){f=e(b,a,c)}else if(typeof e==="object"&&e.hasOwnProperty(c)){f=e[c](b,a,c)}else{f=d.supportsTextContent?b.textContent:$(b).text()}}return $.trim(f)}function detectParserForColumn(a,b,c,d){var e,f=ts.parsers.length,g=false,h="",i=true;while(h===""&&i){c++;if(b[c]){g=b[c].cells[d];h=getElementText(a,g,d);if(a.config.debug){log("Checking if value was empty on row "+c+", column: "+d+": "+h)}}else{i=false}}for(e=1;e<f;e++){if(ts.parsers[e].is(h,a,g)){return ts.parsers[e]}}return ts.parsers[0]}function buildParserCache(a,b){var c=a.config,d=$(a.tBodies).filter(":not(."+c.cssInfoBlock+")"),e,f,g,h,i,j,k,l="";if(d.length===0){return}e=d[0].rows;if(e[0]){f=[];g=e[0].cells.length;for(h=0;h<g;h++){i=b.filter(':not([colspan])[data-column="'+h+'"]:last,[colspan="1"][data-column="'+h+'"]:last');j=c.headers[h];k=ts.getParserById(ts.getData(i,j,"sorter"));c.empties[h]=ts.getData(i,j,"empty")||c.emptyTo||(c.emptyToBottom?"bottom":"top");c.strings[h]=ts.getData(i,j,"string")||c.stringTo||"max";if(!k){k=detectParserForColumn(a,e,-1,h)}if(c.debug){l+="column:"+h+"; parser:"+k.id+"; string:"+c.strings[h]+"; empty: "+c.empties[h]+"\n"}f.push(k)}}if(c.debug){log(l)}return f}function buildCache(a){var b=a.tBodies,c=a.config,d,e,f=c.parsers,g,h,i,j,k,l,m;c.cache={};if(c.debug){m=new Date}if(c.showProcessing){ts.isProcessing(a,true)}for(j=0;j<b.length;j++){c.cache[j]={row:[],normalized:[]};if(!$(b[j]).hasClass(c.cssInfoBlock)){d=b[j]&&b[j].rows.length||0;e=b[j].rows[0]&&b[j].rows[0].cells.length||0;for(h=0;h<d;++h){k=$(b[j].rows[h]);l=[];if(k.hasClass(c.cssChildRow)){c.cache[j].row[c.cache[j].row.length-1]=c.cache[j].row[c.cache[j].row.length-1].add(k);continue}c.cache[j].row.push(k);for(i=0;i<e;++i){g=getElementText(a,k[0].cells[i],i);l.push(f[i].format(g,a,k[0].cells[i],i))}l.push(c.cache[j].normalized.length);c.cache[j].normalized.push(l)}}}if(c.showProcessing){ts.isProcessing(a)}if(c.debug){benchmark("Building cache for "+d+" rows",m)}}function appendToTable(a,b){var c=a.config,d=a.tBodies,e=[],f=c.cache,g,h,i,j,k,l,m,n,o,p,q,r;if(c.debug){r=new Date}for(o=0;o<d.length;o++){k=$(d[o]);if(!k.hasClass(c.cssInfoBlock)){l=ts.processTbody(a,k,true);g=f[o].row;h=f[o].normalized;i=h.length;j=i?h[0].length-1:0;for(m=0;m<i;m++){q=h[m][j];e.push(g[q]);if(!c.appender||!c.removeRows){p=g[q].length;for(n=0;n<p;n++){l.append(g[q][n])}}}ts.processTbody(a,l,false)}}if(c.appender){c.appender(a,e)}if(c.debug){benchmark("Rebuilt table",r)}if(!b){ts.applyWidget(a)}$(a).trigger("sortEnd",a)}function computeThIndexes(a){var b=[],c={},d=$(a).find("thead:eq(0) tr, tfoot tr"),e,f,g,h,i,j,k,l,m,n,o,p;for(e=0;e<d.length;e++){j=d[e].cells;for(f=0;f<j.length;f++){i=j[f];k=i.parentNode.rowIndex;l=k+"-"+i.cellIndex;m=i.rowSpan||1;n=i.colSpan||1;if(typeof b[k]==="undefined"){b[k]=[]}for(g=0;g<b[k].length+1;g++){if(typeof b[k][g]==="undefined"){o=g;break}}c[l]=o;$(i).attr({"data-column":o});for(g=k;g<k+m;g++){if(typeof b[g]==="undefined"){b[g]=[]}p=b[g];for(h=o;h<o+n;h++){p[h]="x"}}}}return c}function formatSortingOrder(a){return/^d/i.test(a)||a===1}function buildHeaders(a){var b=computeThIndexes(a),c,d,e,f,g,h,i=a.config;i.headerList=[];if(i.debug){g=new Date}h=$(a).find(i.selectorHeaders).each(function(a){d=$(this);c=i.headers[a];e=i.cssIcon?'<i class="'+i.cssIcon+'"></i>':"";this.innerHTML='<div class="tablesorter-header-inner">'+this.innerHTML+e+"</div>";if(i.onRenderHeader){i.onRenderHeader.apply(d,[a])}this.column=b[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(ts.getData(d,c,"sortInitialOrder")||i.sortInitialOrder)?[1,0,2]:[0,1,2];this.count=-1;if(ts.getData(d,c,"sorter")==="false"){this.sortDisabled=true;d.addClass("sorter-false")}else{d.removeClass("sorter-false")}this.lockedOrder=false;f=ts.getData(d,c,"lockedOrder")||false;if(typeof f!=="undefined"&&f!==false){this.order=this.lockedOrder=formatSortingOrder(f)?[1,1,1]:[0,0,0]}d.addClass(this.sortDisabled?"sorter-false":i.cssHeader);i.headerList[a]=this;d.parent().addClass(i.cssHeaderRow)});if(a.config.debug){benchmark("Built headers:",g);log(h)}return h}function setHeadersCss(a,b){var c,d,e,f,g=a.config,h=g.sortList,i=[g.cssDesc,g.cssAsc],j=$(a).find("tfoot tr").children().removeClass(i.join(" "));b.removeClass(i.join(" "));f=h.length;for(d=0;d<f;d++){if(h[d][1]!==2){c=b.not(".sorter-false").filter('[data-column="'+h[d][0]+'"]'+(f===1?":last":""));if(c.length){for(e=0;e<c.length;e++){if(!c[e].sortDisabled){c.eq(e).addClass(i[h[d][1]]);if(j.length){j.filter('[data-column="'+h[d][0]+'"]').eq(e).addClass(i[h[d][1]])}}}}}}}function fixColumnWidth(a){if(a.config.widthFixed&&$(a).find("colgroup").length===0){var b=$("<colgroup>"),c=$(a).width();$("tr:first td",a.tBodies[0]).each(function(){b.append($("<col>").css("width",parseInt($(this).width()/c*1e3,10)/10+"%"))});$(a).prepend(b)}}function updateHeaderSortCount(a,b){var c,d,e=a.config,f=e.headerList.length,g=b||e.sortList;e.sortList=[];$.each(g,function(a,b){c=[parseInt(b[0],10),parseInt(b[1],10)];d=e.headerList[c[0]];if(d){e.sortList.push(c);d.count=c[1]%(e.sortReset?3:2)}})}function getCachedSortType(a,b){return a&&a[b]?a[b].type||"":""}function multisort(table){var dynamicExp,sortWrapper,col,mx=0,dir=0,tc=table.config,sortList=tc.sortList,l=sortList.length,bl=table.tBodies.length,sortTime,i,j,k,c,cache,lc,s,e,order,orgOrderCol;if(tc.debug){sortTime=new Date}for(k=0;k<bl;k++){dynamicExp="sortWrapper = function(a,b) {";cache=tc.cache[k];lc=cache.normalized.length;for(i=0;i<l;i++){c=sortList[i][0];order=sortList[i][1];s=/n/i.test(getCachedSortType(tc.parsers,c))?"Numeric":"Text";s+=order===0?"":"Desc";e="e"+i;if(/Numeric/.test(s)&&tc.strings[c]){for(j=0;j<lc;j++){col=Math.abs(parseFloat(cache.normalized[j][c]));mx=Math.max(mx,isNaN(col)?0:col)}if(typeof tc.string[tc.strings[c]]==="boolean"){dir=(order===0?1:-1)*(tc.string[tc.strings[c]]?-1:1)}else{dir=tc.strings[c]?tc.string[tc.strings[c]]||0:0}}dynamicExp+="var "+e+" = $.tablesorter.sort"+s+"(table,a["+c+"],b["+c+"],"+c+","+mx+","+dir+"); ";dynamicExp+="if ("+e+") { return "+e+"; } ";dynamicExp+="else { "}orgOrderCol=cache.normalized&&cache.normalized[0]?cache.normalized[0].length-1:0;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(i=0;i<l;i++){dynamicExp+="}; "}dynamicExp+="return 0; ";dynamicExp+="}; ";cache.normalized.sort(eval(dynamicExp))}if(tc.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time",sortTime)}}function resortComplete(a,b){a.trigger("updateComplete");if(typeof b==="function"){b(a[0])}}function checkResort(a,b,c){if(b!==false){a.trigger("sorton",[a[0].config.sortList,function(){resortComplete(a,c)}])}else{resortComplete(a,c)}}var ts=this;ts.version="2.4.5";ts.parsers=[];ts.widgets=[];ts.defaults={theme:"default",widthFixed:false,showProcessing:false,cancelSelection:true,dateFormat:"mmddyyyy",sortMultiSortKey:"shiftKey",usNumberFormat:true,delayInit:false,headers:{},ignoreCase:true,sortForce:null,sortList:[],sortAppend:null,sortInitialOrder:"asc",sortLocaleCompare:false,sortReset:false,sortRestart:false,emptyTo:"bottom",stringTo:"max",textExtraction:"simple",textSorter:null,widgets:[],widgetOptions:{zebra:["even","odd"]},initWidgets:true,initialized:null,onRenderHeader:null,tableClass:"tablesorter",cssAsc:"tablesorter-headerSortUp",cssChildRow:"tablesorter-childRow",cssDesc:"tablesorter-headerSortDown",cssHeader:"tablesorter-header",cssHeaderRow:"tablesorter-headerRow",cssIcon:"tablesorter-icon",cssInfoBlock:"tablesorter-infoOnly",cssProcessing:"tablesorter-processing",selectorHeaders:"> thead th, > thead td",selectorSort:"th, td",selectorRemove:".remove-me",debug:false,headerList:[],empties:{},strings:{},parsers:[]};ts.benchmark=benchmark;ts.construct=function(a){return this.each(function(){if(!this.tHead||this.tBodies.length===0||this.hasInitialized===true){return}var b,c,d=$(this),e,f,g,h="",i,j,k,l,m=$.metadata;this.hasInitialized=false;this.config={};e=$.extend(true,this.config,ts.defaults,a);$.data(this,"tablesorter",e);if(e.debug){$.data(this,"startoveralltimer",new Date)}e.supportsTextContent=$("<span>x</span>")[0].textContent==="x";e.supportsDataObject=parseFloat($.fn.jquery)>=1.4;e.string={max:1,min:-1,"max+":1,"max-":-1,zero:0,none:0,"null":0,top:true,bottom:false};if(!/tablesorter\-/.test(d.attr("class"))){h=e.theme!==""?" tablesorter-"+e.theme:""}d.addClass(e.tableClass+h);b=buildHeaders(this);e.parsers=buildParserCache(this,b);if(!e.delayInit){buildCache(this)}b.find("*").andSelf().filter(e.selectorSort).unbind("mousedown.tablesorter mouseup.tablesorter").bind("mousedown.tablesorter mouseup.tablesorter",function(a,c){var m=this.tagName.match("TH|TD")?$(this):$(this).parents("th, td").filter(":last"),n=m[0];if((a.which||a.button)!==1){return false}if(a.type==="mousedown"){l=(new Date).getTime();return a.target.tagName==="INPUT"?"":!e.cancelSelection}if(c!==true&&(new Date).getTime()-l>250){return false}if(e.delayInit&&!e.cache){buildCache(d[0])}if(!n.sortDisabled){d.trigger("sortStart",d[0]);h=!a[e.sortMultiSortKey];n.count=(n.count+1)%(e.sortReset?3:2);if(e.sortRestart){f=n;b.each(function(){if(this!==f&&(h||!$(this).is("."+e.cssDesc+",."+e.cssAsc))){this.count=-1}})}f=n.column;if(h){e.sortList=[];if(e.sortForce!==null){i=e.sortForce;for(g=0;g<i.length;g++){if(i[g][0]!==f){e.sortList.push(i[g])}}}k=n.order[n.count];if(k<2){e.sortList.push([f,k]);if(n.colSpan>1){for(g=1;g<n.colSpan;g++){e.sortList.push([f+g,k])}}}}else{if(e.sortAppend&&e.sortList.length>1){if(ts.isValueInArray(e.sortAppend[0][0],e.sortList)){e.sortList.pop()}}if(ts.isValueInArray(f,e.sortList)){for(g=0;g<e.sortList.length;g++){j=e.sortList[g];k=e.headerList[j[0]];if(j[0]===f){j[1]=k.order[k.count];if(j[1]===2){e.sortList.splice(g,1);k.count=-1}}}}else{k=n.order[n.count];if(k<2){e.sortList.push([f,k]);if(n.colSpan>1){for(g=1;g<n.colSpan;g++){e.sortList.push([f+g,k])}}}}}if(e.sortAppend!==null){i=e.sortAppend;for(g=0;g<i.length;g++){if(i[g][0]!==f){e.sortList.push(i[g])}}}d.trigger("sortBegin",d[0]);setTimeout(function(){setHeadersCss(d[0],b);multisort(d[0]);appendToTable(d[0])},1)}});if(e.cancelSelection){b.each(function(){this.onselectstart=function(){return false}})}d.unbind("update updateCell addRows sorton appendCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave").bind("update",function(a,c,f){$(e.selectorRemove,this).remove();e.parsers=buildParserCache(this,b);buildCache(this);checkResort(d,c,f)}).bind("updateCell",function(a,b,c,f){var g,h,i,j=this,k=$(this).find("tbody"),l=k.index($(b).parents("tbody").filter(":last")),m=$(b).parents("tr").filter(":last");if(k.length&&l>=0){h=k.eq(l).find("tr").index(m);i=b.cellIndex;g=j.config.cache[l].normalized[h].length-1;j.config.cache[l].row[j.config.cache[l].normalized[h][g]]=m;j.config.cache[l].normalized[h][i]=e.parsers[i].format(getElementText(j,b,i),j,b,i);checkResort(d,c,f)}}).bind("addRows",function(a,b,c,f){var h,i=b.filter("tr").length,j=[],k=b[0].cells.length,l=this,m=$(this).find("tbody").index(b.closest("tbody"));for(h=0;h<i;h++){for(g=0;g<k;g++){j[g]=e.parsers[g].format(getElementText(l,b[h].cells[g],g),l,b[h].cells[g],g)}j.push(e.cache[m].row.length);e.cache[m].row.push([b[h]]);e.cache[m].normalized.push(j);j=[]}checkResort(d,c,f)}).bind("sorton",function(a,c,d,e){$(this).trigger("sortStart",this);updateHeaderSortCount(this,c);setHeadersCss(this,b);multisort(this);appendToTable(this,e);if(typeof d==="function"){d(this)}}).bind("appendCache",function(a,b,c){appendToTable(this,c);if(typeof b==="function"){b(this)}}).bind("applyWidgetId",function(a,b){ts.getWidgetById(b).format(this,e,e.widgetOptions)}).bind("applyWidgets",function(a,b){ts.applyWidget(this,b)}).bind("refreshWidgets",function(a,b,c){ts.refreshWidgets(this,b,c)}).bind("destroy",function(a,b,c){ts.destroy(this,b,c)});if(e.supportsDataObject&&typeof d.data().sortlist!=="undefined"){e.sortList=d.data().sortlist}else if(m&&d.metadata()&&d.metadata().sortlist){e.sortList=d.metadata().sortlist}ts.applyWidget(this,true);if(e.sortList.length>0){d.trigger("sorton",[e.sortList,{},!e.initWidgets])}else if(e.initWidgets){ts.applyWidget(this)}fixColumnWidth(this);if(e.showProcessing){d.unbind("sortBegin sortEnd").bind("sortBegin sortEnd",function(a){ts.isProcessing(d[0],a.type==="sortBegin")})}this.hasInitialized=true;if(e.debug){ts.benchmark("Overall initialization time",$.data(this,"startoveralltimer"))}d.trigger("tablesorter-initialized",this);if(typeof e.initialized==="function"){e.initialized(this)}})};ts.isProcessing=function(a,b,c){var d=a.config,e=c||$(a).find("."+d.cssHeader);if(b){if(d.sortList.length>0){e=e.filter(function(){return this.sortDisabled?false:ts.isValueInArray(parseFloat($(this).attr("data-column")),d.sortList)})}e.addClass(d.cssProcessing)}else{e.removeClass(d.cssProcessing)}};ts.processTbody=function(a,b,c){var d,e;if(c){b.before('<span class="tablesorter-savemyplace"/>');e=$.fn.detach?b.detach():b.remove();return e}e=$(a).find("span.tablesorter-savemyplace");b.insertAfter(e);e.remove()};ts.clearTableBody=function(a){$(a.tBodies).filter(":not(."+a.config.cssInfoBlock+")").empty()};ts.destroy=function(a,b,c){var d=$(a),e=a.config,f=d.find("thead:first");a.hasInitialized=false;f.find("tr:not(."+e.cssHeaderRow+")").remove();f.find(".tablesorter-resizer").remove();ts.refreshWidgets(a,true,true);d.removeData("tablesorter").unbind("update updateCell addRows sorton appendCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave").find("."+e.cssHeader).unbind("click mousedown mousemove mouseup").removeClass(e.cssHeader+" "+e.cssAsc+" "+e.cssDesc).find(".tablesorter-header-inner").each(function(){if(e.cssIcon!==""){$(this).find("."+e.cssIcon).remove()}$(this).replaceWith($(this).contents())});if(b!==false){d.removeClass(e.tableClass)}if(typeof c==="function"){c(a)}};ts.regex=[/(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,/^0x[0-9a-f]+$/i];ts.sortText=function(a,b,c,d){if(b===c){return 0}var e=a.config,f=e.string[e.empties[d]||e.emptyTo],g=ts.regex,h,i,j,k,l,m,n,o;if(b===""&&f!==0){return typeof f==="boolean"?f?-1:1:-f||-1}if(c===""&&f!==0){return typeof f==="boolean"?f?1:-1:f||1}if(typeof e.textSorter==="function"){return e.textSorter(b,c,a,d)}h=b.replace(g[0],"\\0$1\\0").replace(/\\0$/,"").replace(/^\\0/,"").split("\\0");j=c.replace(g[0],"\\0$1\\0").replace(/\\0$/,"").replace(/^\\0/,"").split("\\0");i=parseInt(b.match(g[2]),16)||h.length!==1&&b.match(g[1])&&Date.parse(b);k=parseInt(c.match(g[2]),16)||i&&c.match(g[1])&&Date.parse(c)||null;if(k){if(i<k){return-1}if(i>k){return 1}}o=Math.max(h.length,j.length);for(n=0;n<o;n++){l=isNaN(h[n])?h[n]||0:parseFloat(h[n])||0;m=isNaN(j[n])?j[n]||0:parseFloat(j[n])||0;if(isNaN(l)!==isNaN(m)){return isNaN(l)?1:-1}if(typeof l!==typeof m){l+="";m+=""}if(l<m){return-1}if(l>m){return 1}}return 0};ts.sortTextDesc=function(a,b,c,d){if(b===c){return 0}var e=a.config,f=e.string[e.empties[d]||e.emptyTo];if(b===""&&f!==0){return typeof f==="boolean"?f?-1:1:f||1}if(c===""&&f!==0){return typeof f==="boolean"?f?1:-1:-f||-1}if(typeof e.textSorter==="function"){return e.textSorter(c,b,a,d)}return ts.sortText(a,c,b)};ts.getTextValue=function(a,b,c){if(b){var d,e=a.length,f=b+c;for(d=0;d<e;d++){f+=a.charCodeAt(d)}return c*f}return 0};ts.sortNumeric=function(a,b,c,d,e,f){if(b===c){return 0}var g=a.config,h=g.string[g.empties[d]||g.emptyTo];if(b===""&&h!==0){return typeof h==="boolean"?h?-1:1:-h||-1}if(c===""&&h!==0){return typeof h==="boolean"?h?1:-1:h||1}if(isNaN(b)){b=ts.getTextValue(b,e,f)}if(isNaN(c)){c=ts.getTextValue(c,e,f)}return b-c};ts.sortNumericDesc=function(a,b,c,d,e,f){if(b===c){return 0}var g=a.config,h=g.string[g.empties[d]||g.emptyTo];if(b===""&&h!==0){return typeof h==="boolean"?h?-1:1:h||1}if(c===""&&h!==0){return typeof h==="boolean"?h?1:-1:-h||-1}if(isNaN(b)){b=ts.getTextValue(b,e,f)}if(isNaN(c)){c=ts.getTextValue(c,e,f)}return c-b};ts.characterEquivalents={a:"\u00e1\u00e0\u00e2\u00e3\u00e4",A:"\u00c1\u00c0\u00c2\u00c3\u00c4",c:"\u00e7",C:"\u00c7",e:"\u00e9\u00e8\u00ea\u00eb",E:"\u00c9\u00c8\u00ca\u00cb",i:"\u00ed\u00ec\u0130\u00ee\u00ef",I:"\u00cd\u00cc\u0130\u00ce\u00cf",o:"\u00f3\u00f2\u00f4\u00f5\u00f6",O:"\u00d3\u00d2\u00d4\u00d5\u00d6",S:"\u00df",u:"\u00fa\u00f9\u00fb\u00fc",U:"\u00da\u00d9\u00db\u00dc"};;ts.replaceAccents=function(a){var b,c="[",d=ts.characterEquivalents;if(!ts.characterRegex){ts.characterRegexArray={};for(b in d){if(typeof b==="string"){c+=d[b];ts.characterRegexArray[b]=new RegExp("["+d[b]+"]","g")}}ts.characterRegex=new RegExp(c+"]")}if(ts.characterRegex.test(a)){for(b in d){if(typeof b==="string"){a=a.replace(ts.characterRegexArray[b],b)}}}return a};ts.isValueInArray=function(a,b){var c,d=b.length;for(c=0;c<d;c++){if(b[c][0]===a){return true}}return false};ts.addParser=function(a){var b,c=ts.parsers.length,d=true;for(b=0;b<c;b++){if(ts.parsers[b].id.toLowerCase()===a.id.toLowerCase()){d=false}}if(d){ts.parsers.push(a)}};ts.getParserById=function(a){var b,c=ts.parsers.length;for(b=0;b<c;b++){if(ts.parsers[b].id.toLowerCase()===a.toString().toLowerCase()){return ts.parsers[b]}}return false};ts.addWidget=function(a){ts.widgets.push(a)};ts.getWidgetById=function(a){var b,c,d=ts.widgets.length;for(b=0;b<d;b++){c=ts.widgets[b];if(c&&c.hasOwnProperty("id")&&c.id.toLowerCase()===a.toLowerCase()){return c}}};ts.applyWidget=function(a,b){var c=a.config,d=c.widgetOptions,e=c.widgets.sort().reverse(),f,g,h,i=e.length;g=$.inArray("zebra",c.widgets);if(g>=0){c.widgets.splice(g,1);c.widgets.push("zebra")}if(c.debug){f=new Date}for(g=0;g<i;g++){h=ts.getWidgetById(e[g]);if(h){if(b===true&&h.hasOwnProperty("init")){h.init(a,h,c,d)}else if(!b&&h.hasOwnProperty("format")){h.format(a,c,d)}}}if(c.debug){benchmark("Completed "+(b===true?"initializing":"applying")+" widgets",f)}};ts.refreshWidgets=function(a,b,c){var d,e=a.config,f=e.widgets,g=ts.widgets,h=g.length;for(d=0;d<h;d++){if(g[d]&&g[d].id&&(b||$.inArray(g[d].id,f)<0)){if(e.debug){log("removing "+g[d].id)}if(g[d].hasOwnProperty("remove")){g[d].remove(a,e,e.widgetOptions)}}}if(c!==true){ts.applyWidget(a,b)}};ts.getData=function(a,b,c){var d="",e=$(a),f,g;if(!e.length){return""}f=$.metadata?e.metadata():false;g=" "+(e.attr("class")||"");if(typeof e.data(c)!=="undefined"||typeof e.data(c.toLowerCase())!=="undefined"){d+=e.data(c)||e.data(c.toLowerCase())}else if(f&&typeof f[c]!=="undefined"){d+=f[c]}else if(b&&typeof b[c]!=="undefined"){d+=b[c]}else if(g!==" "&&g.match(" "+c+"-")){d=g.match(new RegExp(" "+c+"-(\\w+)"))[1]||""}return $.trim(d)};ts.formatFloat=function(a,b){if(typeof a!=="string"||a===""){return a}if(b.config.usNumberFormat!==false){a=a.replace(/,/g,"")}else{a=a.replace(/[\s|\.]/g,"").replace(/,/g,".")}if(/^\s*\([.\d]+\)/.test(a)){a=a.replace(/^\s*\(/,"-").replace(/\)/,"")}var c=parseFloat(a);return isNaN(c)?$.trim(a):c};ts.isDigit=function(a){return isNaN(a)?/^[\-+(]?\d+[)]?$/.test(a.toString().replace(/[,.'\s]/g,"")):true}}});var ts=$.tablesorter;$.fn.extend({tablesorter:ts.construct});ts.addParser({id:"text",is:function(a,b,c){return true},format:function(a,b,c,d){var e=b.config;a=$.trim(e.ignoreCase?a.toLocaleLowerCase():a);return e.sortLocaleCompare?ts.replaceAccents(a):a},type:"text"});ts.addParser({id:"currency",is:function(a){return/^\(?[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+/.test(a)},format:function(a,b){return ts.formatFloat(a.replace(/[^\w,. \-()]/g,""),b)},type:"numeric"});ts.addParser({id:"ipAddress",is:function(a){return/^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/.test(a)},format:function(a,b){var c,d=a.split("."),e="",f=d.length;for(c=0;c<f;c++){e+=("00"+d[c]).slice(-3)}return ts.formatFloat(e,b)},type:"numeric"});ts.addParser({id:"url",is:function(a){return/^(https?|ftp|file):\/\//.test(a)},format:function(a){return $.trim(a.replace(/(https?|ftp|file):\/\//,""))},type:"text"});ts.addParser({id:"isoDate",is:function(a){return/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(a)},format:function(a,b){return ts.formatFloat(a!==""?(new Date(a.replace(/-/g,"/"))).getTime()||"":"",b)},type:"numeric"});ts.addParser({id:"percent",is:function(a){return/\d%\)?$/.test(a)},format:function(a,b){return ts.formatFloat(a.replace(/%/g,""),b)},type:"numeric"});ts.addParser({id:"usLongDate",is:function(a){return/^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4}|'?\d{2})\s+(([0-2]?\d:[0-5]\d)|([0-1]?\d:[0-5]\d\s?([AP]M)))$/i.test(a)},format:function(a,b){return ts.formatFloat((new Date(a.replace(/(\S)([AP]M)$/i,"$1 $2"))).getTime()||"",b)},type:"numeric"});ts.addParser({id:"shortDate",is:function(a){return/^(\d{2}|\d{4})[\/\-\,\.\s+]\d{2}[\/\-\.\,\s+](\d{2}|\d{4})$/.test(a)},format:function(a,b,c,d){var e=b.config,f=e.headerList[d],g=f.shortDateFormat;if(typeof g==="undefined"){g=f.shortDateFormat=ts.getData(f,e.headers[d],"dateFormat")||e.dateFormat}a=a.replace(/\s+/g," ").replace(/[\-|\.|\,]/g,"/");if(g==="mmddyyyy"){a=a.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,"$3/$1/$2")}else if(g==="ddmmyyyy"){a=a.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,"$3/$2/$1")}else if(g==="yyyymmdd"){a=a.replace(/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/,"$1/$2/$3")}return ts.formatFloat((new Date(a)).getTime()||"",b)},type:"numeric"});ts.addParser({id:"time",is:function(a){return/^(([0-2]?\d:[0-5]\d)|([0-1]?\d:[0-5]\d\s?([AP]M)))$/i.test(a)},format:function(a,b){return ts.formatFloat((new Date("2000/01/01 "+a.replace(/(\S)([AP]M)$/i,"$1 $2"))).getTime()||"",b)},type:"numeric"});ts.addParser({id:"digit",is:function(a){return ts.isDigit(a)},format:function(a,b){return ts.formatFloat(a.replace(/[^\w,. \-()]/g,""),b)},type:"numeric"});ts.addParser({id:"metadata",is:function(a){return false},format:function(a,b,c){var d=b.config,e=!d.parserMetadataName?"sortValue":d.parserMetadataName;return $(c).metadata()[e]},type:"numeric"});ts.addWidget({id:"zebra",format:function(a,b,c){var d,e,f,g,h,i,j,k,l=new RegExp(b.cssChildRow,"i"),m=$(a).children("tbody:not(."+b.cssInfoBlock+")");if(b.debug){i=new Date}for(j=0;j<m.length;j++){d=$(m[j]);k=d.children("tr").length;if(k>1){g=0;e=d.children("tr:visible");e.each(function(){f=$(this);if(!l.test(this.className)){g++}h=g%2===0;f.removeClass(c.zebra[h?1:0]).addClass(c.zebra[h?0:1])})}}if(b.debug){ts.benchmark("Applying Zebra widget",i)}},remove:function(a,b,c){var d,e,f=$(a).children("tbody:not(."+b.cssInfoBlock+")"),g=(b.widgetOptions.zebra||["even","odd"]).join(" ");for(d=0;d<f.length;d++){e=$.tablesorter.processTbody(a,$(f[d]),true);e.children().removeClass(g);$.tablesorter.processTbody(a,e,false)}}})}(jQuery)
|
@@ -1,14 +1,47 @@
|
|
1
|
-
/*! tableSorter 2.
|
1
|
+
/*! tableSorter 2.4+ widgets - updated 10/17/2012
|
2
2
|
*
|
3
|
-
* jQuery UI Theme
|
4
3
|
* Column Styles
|
5
4
|
* Column Filters
|
6
|
-
* Sticky Header
|
7
5
|
* Column Resizing
|
6
|
+
* Sticky Header
|
7
|
+
* UI Theme (generalized)
|
8
8
|
* Save Sort
|
9
|
-
*
|
9
|
+
* ["zebra", "uitheme", "stickyHeaders", "filter", "columns"]
|
10
10
|
*/
|
11
|
+
/*jshint browser:true, jquery:true, unused:false, loopfunc:true */
|
12
|
+
/*global jQuery: false, localStorage: false, navigator: false */
|
11
13
|
;(function($){
|
14
|
+
"use strict";
|
15
|
+
$.tablesorter = $.tablesorter || {};
|
16
|
+
|
17
|
+
$.tablesorter.themes = {
|
18
|
+
"bootstrap" : {
|
19
|
+
table : 'table table-bordered table-striped',
|
20
|
+
header : 'bootstrap-header', // give the header a gradient background
|
21
|
+
icons : '', // add "icon-white" to make them white; this icon class is added to the <i> in the header
|
22
|
+
sortNone : 'bootstrap-icon-unsorted',
|
23
|
+
sortAsc : 'icon-chevron-up',
|
24
|
+
sortDesc : 'icon-chevron-down',
|
25
|
+
active : '', // applied when column is sorted
|
26
|
+
hover : '', // use custom css here - bootstrap class may not override it
|
27
|
+
filterRow: '', // filter row class
|
28
|
+
even : '', // even row zebra striping
|
29
|
+
odd : '' // odd row zebra striping
|
30
|
+
},
|
31
|
+
"jui" : {
|
32
|
+
table : 'ui-widget ui-widget-content ui-corner-all', // table classes
|
33
|
+
header : 'ui-widget-header ui-corner-all ui-state-default', // header classes
|
34
|
+
icons : 'ui-icon', // icon class added to the <i> in the header
|
35
|
+
sortNone : 'ui-icon-carat-2-n-s',
|
36
|
+
sortAsc : 'ui-icon-carat-1-n',
|
37
|
+
sortDesc : 'ui-icon-carat-1-s',
|
38
|
+
active : 'ui-state-active', // applied when column is sorted
|
39
|
+
hover : 'ui-state-hover', // hover class
|
40
|
+
filterRow: '',
|
41
|
+
even : 'ui-widget-content', // even row zebra striping
|
42
|
+
odd : 'ui-state-default' // odd row zebra striping
|
43
|
+
}
|
44
|
+
};
|
12
45
|
|
13
46
|
// *** Store data in local storage, with a cookie fallback ***
|
14
47
|
/* IE7 needs JSON library for JSON.stringify - (http://caniuse.com/#search=json)
|
@@ -35,8 +68,8 @@ $.tablesorter.storage = function(table, key, val){
|
|
35
68
|
url = window.location.pathname;
|
36
69
|
try { ls = !!(localStorage.getItem); } catch(e) {}
|
37
70
|
// *** get val ***
|
38
|
-
if ($.parseJSON)
|
39
|
-
if (ls)
|
71
|
+
if ($.parseJSON){
|
72
|
+
if (ls){
|
40
73
|
v = $.parseJSON(localStorage[key]) || {};
|
41
74
|
} else {
|
42
75
|
k = document.cookie.split(/[;\s|=]/); // cookie
|
@@ -44,12 +77,12 @@ $.tablesorter.storage = function(table, key, val){
|
|
44
77
|
v = (d !== 0) ? $.parseJSON(k[d]) || {} : {};
|
45
78
|
}
|
46
79
|
}
|
47
|
-
if (val && JSON && JSON.hasOwnProperty('stringify'))
|
80
|
+
if (val && JSON && JSON.hasOwnProperty('stringify')){
|
48
81
|
// add unique identifiers = url pathname > table ID/index on page > data
|
49
|
-
if (v[url] && v[url][id])
|
82
|
+
if (v[url] && v[url][id]){
|
50
83
|
v[url][id] = val;
|
51
84
|
} else {
|
52
|
-
if (v[url])
|
85
|
+
if (v[url]){
|
53
86
|
v[url][id] = val;
|
54
87
|
} else {
|
55
88
|
v[url] = {};
|
@@ -57,11 +90,11 @@ $.tablesorter.storage = function(table, key, val){
|
|
57
90
|
}
|
58
91
|
}
|
59
92
|
// *** set val ***
|
60
|
-
if (ls)
|
93
|
+
if (ls){
|
61
94
|
localStorage[key] = JSON.stringify(v);
|
62
95
|
} else {
|
63
96
|
d = new Date();
|
64
|
-
d.setTime(d.getTime()+(31536e+6)); // 365 days
|
97
|
+
d.setTime(d.getTime() + (31536e+6)); // 365 days
|
65
98
|
document.cookie = key + '=' + (JSON.stringify(v)).replace(/\"/g,'\"') + '; expires=' + d.toGMTString() + '; path=/';
|
66
99
|
}
|
67
100
|
} else {
|
@@ -69,92 +102,128 @@ $.tablesorter.storage = function(table, key, val){
|
|
69
102
|
}
|
70
103
|
};
|
71
104
|
|
72
|
-
// Widget:
|
105
|
+
// Widget: General UI theme
|
73
106
|
// "uitheme" option in "widgetOptions"
|
74
107
|
// **************************
|
75
108
|
$.tablesorter.addWidget({
|
76
109
|
id: "uitheme",
|
77
|
-
format: function(table)
|
78
|
-
var time, klass,
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
(wo && wo.
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
}
|
89
|
-
if (!$
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
.
|
96
|
-
.
|
110
|
+
format: function(table){
|
111
|
+
var time, klass, $el, $tar, t,
|
112
|
+
$t = $(table),
|
113
|
+
c = table.config,
|
114
|
+
wo = c.widgetOptions,
|
115
|
+
theme = typeof wo.uitheme === 'object' ? 'jui' : wo.uitheme || 'jui', // default uitheme is 'jui'
|
116
|
+
// use Object.prototype.toString.call().test('Array') instead of $.isArray to make this widget compatible with jQuery v1.2.6
|
117
|
+
o = (typeof wo.uitheme === 'object' && !Object.prototype.toString.call(wo.uitheme).test('Array')) ? wo.uitheme : $.tablesorter.themes[ $.tablesorter.themes.hasOwnProperty(theme) ? theme : 'jui'],
|
118
|
+
$h = $(c.headerList),
|
119
|
+
sh = 'tr.' + (wo.stickyHeaders || 'tablesorter-stickyHeader'),
|
120
|
+
rmv = o.sortNone + ' ' + o.sortDesc + ' ' + o.sortAsc;
|
121
|
+
if (c.debug) { time = new Date(); }
|
122
|
+
if (!$t.hasClass('tablesorter-' + theme) || c.theme === theme || !table.hasInitialized){
|
123
|
+
// update zebra stripes
|
124
|
+
if (o.even !== '') { wo.zebra[0] += ' ' + o.even; }
|
125
|
+
if (o.odd !== '') { wo.zebra[1] += ' ' + o.odd; }
|
126
|
+
// add table/footer class names
|
127
|
+
$t
|
128
|
+
// remove other selected themes; use widgetOptions.theme_remove
|
129
|
+
.removeClass( c.theme === '' ? '' : 'tablesorter-' + c.theme )
|
130
|
+
.addClass('tablesorter-' + theme + ' ' + o.table); // add theme widget class name
|
131
|
+
c.theme = ''; // clear out theme option so it doesn't interfere
|
132
|
+
// update header classes
|
133
|
+
$h
|
134
|
+
.addClass(o.header)
|
135
|
+
.filter(':not(.sorter-false)')
|
97
136
|
.hover(function(){
|
98
|
-
$(this).addClass(
|
137
|
+
$(this).addClass(o.hover);
|
99
138
|
}, function(){
|
100
|
-
$(this).removeClass(
|
139
|
+
$(this).removeClass(o.hover);
|
101
140
|
});
|
102
|
-
|
141
|
+
if (!$h.find('.tablesorter-wrapper').length) {
|
142
|
+
// Firefox needs this inner div to position the resizer correctly
|
143
|
+
$h.wrapInner('<div class="tablesorter-wrapper" style="position:relative;height:100%;width:100%"></div>');
|
144
|
+
}
|
145
|
+
if (c.cssIcon){
|
146
|
+
// if c.cssIcon is '', then no <i> is added to the header
|
147
|
+
$h.find('.' + c.cssIcon).addClass(o.icons);
|
148
|
+
}
|
149
|
+
if ($t.hasClass('hasFilters')){
|
150
|
+
$h.find('.tablesorter-filter-row').addClass(o.filterRow);
|
151
|
+
}
|
103
152
|
}
|
104
|
-
$.each(
|
105
|
-
$
|
106
|
-
|
153
|
+
$.each($h, function(i){
|
154
|
+
$el = $(this);
|
155
|
+
$tar = (c.cssIcon) ? $el.find('.' + c.cssIcon) : $el;
|
156
|
+
if (this.sortDisabled){
|
107
157
|
// no sort arrows for disabled columns!
|
108
|
-
$
|
158
|
+
$el.removeClass(rmv);
|
159
|
+
$tar.removeClass(rmv + ' tablesorter-icon ' + o.icons);
|
109
160
|
} else {
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
161
|
+
t = ($t.hasClass('hasStickyHeaders')) ? $t.find(sh).find('th').eq(i).add($el) : $el;
|
162
|
+
klass = ($el.hasClass(c.cssAsc)) ? o.sortDesc : ($el.hasClass(c.cssDesc)) ? o.sortAsc : $el.hasClass(c.cssHeader) ? o.sortNone : '';
|
163
|
+
$el[klass === o.sortNone ? 'removeClass' : 'addClass'](o.active);
|
164
|
+
$tar.removeClass(rmv).addClass(klass);
|
114
165
|
}
|
115
166
|
});
|
116
|
-
if (c.debug)
|
117
|
-
$.tablesorter.benchmark("Applying
|
167
|
+
if (c.debug){
|
168
|
+
$.tablesorter.benchmark("Applying " + theme + " theme", time);
|
118
169
|
}
|
170
|
+
},
|
171
|
+
remove: function(table, c, wo){
|
172
|
+
var $t = $(table),
|
173
|
+
theme = typeof wo.uitheme === 'object' ? 'jui' : wo.uitheme || 'jui',
|
174
|
+
o = typeof wo.uitheme === 'object' ? wo.uitheme : $.tablesorter.themes[ $.tablesorter.themes.hasOwnProperty(theme) ? theme : 'jui'],
|
175
|
+
$h = $t.children('thead').children(),
|
176
|
+
rmv = o.sortNone + ' ' + o.sortDesc + ' ' + o.sortAsc;
|
177
|
+
$t
|
178
|
+
.removeClass('tablesorter-' + theme + ' ' + o.table)
|
179
|
+
.find(c.cssHeader).removeClass(o.header);
|
180
|
+
$h
|
181
|
+
.unbind('mouseenter mouseleave') // remove hover
|
182
|
+
.removeClass(o.hover + ' ' + rmv + ' ' + o.active)
|
183
|
+
.find('.tablesorter-filter-row').removeClass(o.filterRow);
|
184
|
+
$h.find('.tablesorter-icon').removeClass(o.icons);
|
119
185
|
}
|
120
186
|
});
|
121
187
|
|
122
188
|
// Widget: Column styles
|
123
|
-
// "columns"
|
189
|
+
// "columns", "columns_thead" (true) and
|
190
|
+
// "columns_tfoot" (true) options in "widgetOptions"
|
124
191
|
// **************************
|
125
192
|
$.tablesorter.addWidget({
|
126
193
|
id: "columns",
|
127
|
-
format: function(table)
|
194
|
+
format: function(table){
|
128
195
|
var $tb, $tr, $td, $t, time, last, rmv, i, k, l,
|
196
|
+
$tbl = $(table),
|
129
197
|
c = table.config,
|
130
|
-
|
198
|
+
wo = c.widgetOptions,
|
199
|
+
b = $tbl.children('tbody:not(.' + c.cssInfoBlock + ')'),
|
131
200
|
list = c.sortList,
|
132
201
|
len = list.length,
|
133
202
|
css = [ "primary", "secondary", "tertiary" ]; // default options
|
134
203
|
// keep backwards compatibility, for now
|
135
204
|
css = (c.widgetColumns && c.widgetColumns.hasOwnProperty('css')) ? c.widgetColumns.css || css :
|
136
|
-
(
|
205
|
+
(wo && wo.hasOwnProperty('columns')) ? wo.columns || css : css;
|
137
206
|
last = css.length-1;
|
138
207
|
rmv = css.join(' ');
|
139
|
-
if (c.debug)
|
208
|
+
if (c.debug){
|
140
209
|
time = new Date();
|
141
210
|
}
|
142
211
|
// check if there is a sort (on initialization there may not be one)
|
143
|
-
for (k = 0; k < b.length; k++ )
|
144
|
-
$tb = $(b[k]);
|
145
|
-
$tr = $tb.
|
212
|
+
for (k = 0; k < b.length; k++ ){
|
213
|
+
$tb = $.tablesorter.processTbody(table, $(b[k]), true); // detach tbody
|
214
|
+
$tr = $tb.children('tr');
|
146
215
|
l = $tr.length;
|
147
216
|
// loop through the visible rows
|
148
217
|
$tr.each(function(){
|
149
218
|
$t = $(this);
|
150
|
-
if (this.style.display !== 'none')
|
219
|
+
if (this.style.display !== 'none'){
|
151
220
|
// remove all columns class names
|
152
221
|
$td = $t.children().removeClass(rmv);
|
153
222
|
// add appropriate column class names
|
154
|
-
if (list && list[0])
|
223
|
+
if (list && list[0]){
|
155
224
|
// primary sort column class
|
156
225
|
$td.eq(list[0][0]).addClass(css[0]);
|
157
|
-
if (len > 1)
|
226
|
+
if (len > 1){
|
158
227
|
for (i = 1; i < len; i++){
|
159
228
|
// secondary, tertiary, etc sort column classes
|
160
229
|
$td.eq(list[i][0]).addClass( css[i] || css[last] );
|
@@ -163,24 +232,65 @@ $.tablesorter.addWidget({
|
|
163
232
|
}
|
164
233
|
}
|
165
234
|
});
|
166
|
-
$tb
|
235
|
+
$.tablesorter.processTbody(table, $tb, false);
|
236
|
+
}
|
237
|
+
// add classes to thead and tfoot
|
238
|
+
$tr = wo.columns_thead !== false ? 'thead tr' : '';
|
239
|
+
if (wo.columns_tfoot !== false) {
|
240
|
+
$tr += ($tr === '' ? '' : ',') + 'tfoot tr';
|
241
|
+
}
|
242
|
+
if ($tr.length) {
|
243
|
+
$t = $tbl.find($tr).children().removeClass(rmv);
|
244
|
+
if (list && list[0]){
|
245
|
+
// primary sort column class
|
246
|
+
$t.filter('[data-column="' + list[0][0] + '"]').addClass(css[0]);
|
247
|
+
if (len > 1){
|
248
|
+
for (i = 1; i < len; i++){
|
249
|
+
// secondary, tertiary, etc sort column classes
|
250
|
+
$t.filter('[data-column="' + list[i][0] + '"]').addClass(css[i] || css[last]);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
}
|
167
254
|
}
|
168
|
-
if (c.debug)
|
255
|
+
if (c.debug){
|
169
256
|
$.tablesorter.benchmark("Applying Columns widget", time);
|
170
257
|
}
|
258
|
+
},
|
259
|
+
remove: function(table, c, wo){
|
260
|
+
var k, $tb,
|
261
|
+
b = $(table).children('tbody:not(.' + c.cssInfoBlock + ')'),
|
262
|
+
rmv = (c.widgetOptions.columns || [ "primary", "secondary", "tertiary" ]).join(' ');
|
263
|
+
for (k = 0; k < b.length; k++ ){
|
264
|
+
$tb = $.tablesorter.processTbody(table, $(b[k]), true); // remove tbody
|
265
|
+
$tb.children('tr').each(function(){
|
266
|
+
$(this).children().removeClass(rmv);
|
267
|
+
});
|
268
|
+
$.tablesorter.processTbody(table, $tb, false); // restore tbody
|
269
|
+
}
|
171
270
|
}
|
172
271
|
});
|
173
272
|
|
174
|
-
|
175
|
-
|
176
|
-
//
|
177
|
-
//
|
273
|
+
/* Widget: filter
|
274
|
+
widgetOptions:
|
275
|
+
filter_childRows : false // if true, filter includes child row content in the search
|
276
|
+
filter_columnFilters : true // if true, a filter will be added to the top of each table column
|
277
|
+
filter_cssFilter : 'tablesorter-filter' // css class name added to the filter row & each input in the row
|
278
|
+
filter_functions : null // add custom filter functions using this option
|
279
|
+
filter_hideFilters : false // collapse filter row when mouse leaves the area
|
280
|
+
filter_ignoreCase : true // if true, make all searches case-insensitive
|
281
|
+
filter_reset : null // jQuery selector string of an element used to reset the filters
|
282
|
+
filter_searchDelay : 300 // typing delay in milliseconds before starting a search
|
283
|
+
filter_startsWith : false // if true, filter start from the beginning of the cell contents
|
284
|
+
filter_useParsedData : false // filter all data using parsed content
|
285
|
+
**************************/
|
178
286
|
$.tablesorter.addWidget({
|
179
287
|
id: "filter",
|
180
|
-
format: function(table)
|
181
|
-
if (table.config.parsers && !$(table).hasClass('hasFilters'))
|
182
|
-
var i, j, k, l,
|
183
|
-
|
288
|
+
format: function(table){
|
289
|
+
if (table.config.parsers && !$(table).hasClass('hasFilters')){
|
290
|
+
var i, j, k, l, val, ff, x, xi, st, sel, str,
|
291
|
+
ft, ft2, $th, rg, s, t, dis, col,
|
292
|
+
last = '', // save last filter search
|
293
|
+
ts = $.tablesorter,
|
184
294
|
c = table.config,
|
185
295
|
$ths = $(c.headerList),
|
186
296
|
wo = c.widgetOptions,
|
@@ -188,27 +298,68 @@ $.tablesorter.addWidget({
|
|
188
298
|
$t = $(table).addClass('hasFilters'),
|
189
299
|
b = $t.children('tbody:not(.' + c.cssInfoBlock + ')'),
|
190
300
|
cols = c.parsers.length,
|
191
|
-
|
192
|
-
|
193
|
-
|
301
|
+
reg = [ // regex used in filter "check" functions
|
302
|
+
/^\/((?:\\\/|[^\/])+)\/([mig]{0,3})?$/, // 0 = regex to test for regex
|
303
|
+
new RegExp(c.cssChildRow), // 1 = child row
|
304
|
+
/undefined|number/, // 2 = check type
|
305
|
+
/(^[\"|\'|=])|([\"|\'|=]$)/, // 3 = exact match
|
306
|
+
/[\"\'=]/g, // 4 = replace exact match flags
|
307
|
+
/[^\w,. \-()]/g, // 5 = replace non-digits (from digit & currency parser)
|
308
|
+
/[<>=]/g // 6 = replace operators
|
309
|
+
],
|
310
|
+
parsed = $ths.map(function(i){
|
311
|
+
return (ts.getData) ? ts.getData($ths.filter('[data-column="' + i + '"]:last'), c.headers[i], 'filter') === 'parsed' : $(this).hasClass('filter-parsed');
|
312
|
+
}).get(),
|
194
313
|
time, timer,
|
195
|
-
|
314
|
+
|
315
|
+
// dig fer gold
|
316
|
+
checkFilters = function(filter){
|
317
|
+
var arry = $.isArray(filter),
|
318
|
+
$inpts = $t.find('thead').eq(0).children('tr').find('select.' + css + ', input.' + css),
|
319
|
+
v = (arry) ? filter : $inpts.map(function(){
|
320
|
+
return $(this).val() || '';
|
321
|
+
}).get(),
|
322
|
+
cv = (v || []).join(''); // combined filter values
|
323
|
+
// add filter array back into inputs
|
324
|
+
if (arry) {
|
325
|
+
$inpts.each(function(i,el){
|
326
|
+
$(el).val(filter[i] || '');
|
327
|
+
});
|
328
|
+
}
|
329
|
+
if (wo.filter_hideFilters === true){
|
330
|
+
// show/hide filter row as needed
|
331
|
+
$t.find('.tablesorter-filter-row').trigger( cv === '' ? 'mouseleave' : 'mouseenter' );
|
332
|
+
}
|
333
|
+
// return if the last search is the same; but filter === false when updating the search
|
334
|
+
// see example-widget-filter.html filter toggle buttons
|
335
|
+
if (last === cv && filter !== false) { return; }
|
336
|
+
$t.trigger('filterStart', [v]);
|
337
|
+
if (c.showProcessing) {
|
338
|
+
// give it time for the processing icon to kick in
|
339
|
+
setTimeout(function(){
|
340
|
+
findRows(filter, v, cv);
|
341
|
+
return false;
|
342
|
+
}, 30);
|
343
|
+
} else {
|
344
|
+
findRows(filter, v, cv);
|
345
|
+
return false;
|
346
|
+
}
|
347
|
+
},
|
348
|
+
findRows = function(filter, v, cv){
|
349
|
+
var $tb, $tr, $td, cr, r, l, ff, time, arry;
|
196
350
|
if (c.debug) { time = new Date(); }
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
for (k = 0; k < b.length; k++ ) {
|
202
|
-
$tb = $(b[k]);
|
203
|
-
$tr = $tb.addClass('tablesorter-hidden').children('tr');
|
351
|
+
|
352
|
+
for (k = 0; k < b.length; k++ ){
|
353
|
+
$tb = $.tablesorter.processTbody(table, $(b[k]), true);
|
354
|
+
$tr = $tb.children('tr');
|
204
355
|
l = $tr.length;
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
356
|
+
if (cv === ''){
|
357
|
+
$tr.show().removeClass('filtered');
|
358
|
+
} else {
|
359
|
+
// loop through the rows
|
360
|
+
for (j = 0; j < l; j++){
|
210
361
|
// skip child rows
|
211
|
-
if (
|
362
|
+
if (reg[1].test($tr[j].className)) { continue; }
|
212
363
|
r = true;
|
213
364
|
cr = $tr.eq(j).nextUntil('tr:not(.' + c.cssChildRow + ')');
|
214
365
|
// so, if "table.config.widgetOptions.filter_childRows" is true and there is
|
@@ -218,19 +369,25 @@ $.tablesorter.addWidget({
|
|
218
369
|
typeof wo.filter_childRows !== 'undefined' ? wo.filter_childRows : true)) ? cr.text() : '';
|
219
370
|
t = wo.filter_ignoreCase ? t.toLocaleLowerCase() : t;
|
220
371
|
$td = $tr.eq(j).children('td');
|
221
|
-
for (i = 0; i < cols; i++)
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
372
|
+
for (i = 0; i < cols; i++){
|
373
|
+
// ignore if filter is empty or disabled
|
374
|
+
if (v[i]){
|
375
|
+
// check if column data should be from the cell or from parsed data
|
376
|
+
if (wo.filter_useParsedData || parsed[i]){
|
377
|
+
x = c.cache[k].normalized[j][i];
|
378
|
+
} else {
|
379
|
+
// using older or original tablesorter
|
380
|
+
x = $.trim($td.eq(i).text());
|
381
|
+
}
|
382
|
+
xi = !reg[2].test(typeof x) && wo.filter_ignoreCase ? x.toLocaleLowerCase() : x;
|
226
383
|
ff = r; // if r is true, show that row
|
227
384
|
// val = case insensitive, v[i] = case sensitive
|
228
385
|
val = wo.filter_ignoreCase ? v[i].toLocaleLowerCase() : v[i];
|
229
|
-
if (wo.filter_functions && wo.filter_functions[i])
|
230
|
-
if (wo.filter_functions[i] === true)
|
386
|
+
if (wo.filter_functions && wo.filter_functions[i]){
|
387
|
+
if (wo.filter_functions[i] === true){
|
231
388
|
// default selector; no "filter-select" class
|
232
|
-
ff =
|
233
|
-
} else if (typeof wo.filter_functions[i] === 'function')
|
389
|
+
ff = ($ths.filter('[data-column="' + i + '"]:last').hasClass('filter-match')) ? xi.search(val) >= 0 : v[i] === x;
|
390
|
+
} else if (typeof wo.filter_functions[i] === 'function'){
|
234
391
|
// filter callback( exact cell content, parser normalized content, filter input value, column index )
|
235
392
|
ff = wo.filter_functions[i](x, c.cache[k].normalized[j][i], v[i], i);
|
236
393
|
} else if (typeof wo.filter_functions[i][v[i]] === 'function'){
|
@@ -238,18 +395,30 @@ $.tablesorter.addWidget({
|
|
238
395
|
ff = wo.filter_functions[i][v[i]](x, c.cache[k].normalized[j][i], v[i], i);
|
239
396
|
}
|
240
397
|
// Look for regex
|
241
|
-
} else if (
|
242
|
-
|
398
|
+
} else if (reg[0].test(val)){
|
399
|
+
rg = reg[0].exec(val);
|
243
400
|
try {
|
244
|
-
ff = new RegExp(
|
245
|
-
} catch (err)
|
401
|
+
ff = new RegExp(rg[1], rg[2]).test(xi);
|
402
|
+
} catch (err){
|
246
403
|
ff = false;
|
247
404
|
}
|
248
|
-
// Look for quotes to get an exact match
|
249
|
-
} else if (
|
405
|
+
// Look for quotes or equals to get an exact match
|
406
|
+
} else if (reg[3].test(val) && xi === val.replace(reg[4], '')){
|
250
407
|
ff = true;
|
408
|
+
// Look for a not match
|
409
|
+
} else if (/^\!/.test(val)){
|
410
|
+
val = val.replace('!','');
|
411
|
+
s = xi.search($.trim(val));
|
412
|
+
ff = val === '' ? true : !(wo.filter_startsWith ? s === 0 : s >= 0);
|
413
|
+
// Look for operators >, >=, < or <=
|
414
|
+
} else if (/^[<>]=?/.test(val)){
|
415
|
+
// xi may be numeric - see issue #149
|
416
|
+
rg = isNaN(xi) ? $.tablesorter.formatFloat(xi.replace(reg[5], ''), table) : $.tablesorter.formatFloat(xi, table);
|
417
|
+
s = $.tablesorter.formatFloat(val.replace(reg[5], '').replace(reg[6],''), table);
|
418
|
+
if (/>/.test(val)) { ff = />=/.test(val) ? rg >= s : rg > s; }
|
419
|
+
if (/</.test(val)) { ff = /<=/.test(val) ? rg <= s : rg < s; }
|
251
420
|
// Look for wild card: ? = single, or * = multiple
|
252
|
-
} else if (/[\?|\*]/.test(val))
|
421
|
+
} else if (/[\?|\*]/.test(val)){
|
253
422
|
ff = new RegExp( val.replace(/\?/g, '\\S{1}').replace(/\*/g, '\\S*') ).test(xi);
|
254
423
|
// Look for match, and add child row data for matching
|
255
424
|
} else {
|
@@ -260,167 +429,316 @@ $.tablesorter.addWidget({
|
|
260
429
|
}
|
261
430
|
}
|
262
431
|
$tr[j].style.display = (r ? '' : 'none');
|
432
|
+
$tr.eq(j)[r ? 'removeClass' : 'addClass']('filtered');
|
263
433
|
if (cr.length) { cr[r ? 'show' : 'hide'](); }
|
264
434
|
}
|
265
435
|
}
|
266
|
-
$tb
|
436
|
+
$.tablesorter.processTbody(table, $tb, false);
|
267
437
|
}
|
268
|
-
|
269
|
-
|
438
|
+
|
439
|
+
last = cv; // save last search
|
440
|
+
if (c.debug){
|
441
|
+
ts.benchmark("Completed filter widget search", time);
|
270
442
|
}
|
271
443
|
$t.trigger('applyWidgets'); // make sure zebra widget is applied
|
444
|
+
$t.trigger('filterEnd');
|
272
445
|
},
|
273
446
|
buildSelect = function(i, updating){
|
274
447
|
var o, arry = [];
|
275
448
|
i = parseInt(i, 10);
|
276
449
|
o = '<option value="">' + ($ths.filter('[data-column="' + i + '"]:last').attr('data-placeholder') || '') + '</option>';
|
277
|
-
for (k = 0; k < b.length; k++ )
|
450
|
+
for (k = 0; k < b.length; k++ ){
|
278
451
|
l = c.cache[k].row.length;
|
279
452
|
// loop through the rows
|
280
|
-
for (j = 0; j < l; j++)
|
453
|
+
for (j = 0; j < l; j++){
|
281
454
|
// get non-normalized cell content
|
282
|
-
|
283
|
-
|
284
|
-
|
455
|
+
if (wo.filter_useParsedData){
|
456
|
+
arry.push( '' + c.cache[k].normalized[j][i] );
|
457
|
+
} else {
|
458
|
+
t = c.cache[k].row[j][0].cells[i];
|
459
|
+
if (t){
|
460
|
+
arry.push( $.trim(c.supportsTextContent ? t.textContent : $(t).text()) );
|
461
|
+
}
|
285
462
|
}
|
286
463
|
}
|
287
464
|
}
|
465
|
+
|
288
466
|
// get unique elements and sort the list
|
289
|
-
|
467
|
+
// if $.tablesorter.sortText exists (not in the original tablesorter),
|
468
|
+
// then natural sort the list otherwise use a basic sort
|
469
|
+
arry = $.grep(arry, function(v, k){
|
470
|
+
return $.inArray(v ,arry) === k;
|
471
|
+
});
|
472
|
+
arry = (ts.sortText) ? arry.sort(function(a,b){ return ts.sortText(table, a, b, i); }) : arry.sort(true);
|
473
|
+
|
290
474
|
// build option list
|
291
|
-
for (k = 0; k < arry.length; k++)
|
475
|
+
for (k = 0; k < arry.length; k++){
|
292
476
|
o += '<option value="' + arry[k] + '">' + arry[k] + '</option>';
|
293
477
|
}
|
294
478
|
$t.find('thead').find('select.' + css + '[data-column="' + i + '"]')[ updating ? 'html' : 'append' ](o);
|
295
479
|
},
|
296
480
|
buildDefault = function(updating){
|
297
481
|
// build default select dropdown
|
298
|
-
for (i = 0; i < cols; i++)
|
482
|
+
for (i = 0; i < cols; i++){
|
299
483
|
t = $ths.filter('[data-column="' + i + '"]:last');
|
300
484
|
// look for the filter-select class, but don't build it twice.
|
301
485
|
if (t.hasClass('filter-select') && !t.hasClass('filter-false') && !(wo.filter_functions && wo.filter_functions[i] === true)){
|
486
|
+
if (!wo.filter_functions) { wo.filter_functions = {}; }
|
487
|
+
wo.filter_functions[i] = true; // make sure this select gets processed by filter_functions
|
302
488
|
buildSelect(i, updating);
|
303
489
|
}
|
304
490
|
}
|
305
491
|
};
|
306
|
-
|
492
|
+
|
493
|
+
if (c.debug){
|
307
494
|
time = new Date();
|
308
495
|
}
|
309
496
|
wo.filter_ignoreCase = wo.filter_ignoreCase !== false; // set default filter_ignoreCase to true
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
//
|
325
|
-
|
497
|
+
wo.filter_useParsedData = wo.filter_useParsedData === true; // default is false
|
498
|
+
// don't build filter row if columnFilters is false or all columns are set to "filter-false" - issue #156
|
499
|
+
if (wo.filter_columnFilters !== false && $ths.filter('.filter-false').length !== $ths.length){
|
500
|
+
t = '<tr class="tablesorter-filter-row">'; // build filter row
|
501
|
+
for (i = 0; i < cols; i++){
|
502
|
+
dis = false;
|
503
|
+
$th = $ths.filter('[data-column="' + i + '"]:last'); // assuming last cell of a column is the main column
|
504
|
+
sel = (wo.filter_functions && wo.filter_functions[i] && typeof wo.filter_functions[i] !== 'function') || $th.hasClass('filter-select');
|
505
|
+
t += '<td>';
|
506
|
+
if (sel){
|
507
|
+
t += '<select data-column="' + i + '" class="' + css;
|
508
|
+
} else {
|
509
|
+
t += '<input type="search" placeholder="' + ($th.attr('data-placeholder') || "") + '" data-column="' + i + '" class="' + css;
|
510
|
+
}
|
511
|
+
// use header option - headers: { 1: { filter: false } } OR add class="filter-false"
|
512
|
+
if (ts.getData){
|
513
|
+
dis = ts.getData($th[0], c.headers[i], 'filter') === 'false';
|
514
|
+
// get data from jQuery data, metadata, headers option or header class name
|
515
|
+
t += dis ? ' disabled" disabled' : '"';
|
516
|
+
} else {
|
517
|
+
dis = (c.headers[i] && c.headers[i].hasOwnProperty('filter') && c.headers[i].filter === false) || $th.hasClass('filter-false');
|
518
|
+
// only class names and header options - keep this for compatibility with tablesorter v2.0.5
|
519
|
+
t += (dis) ? ' disabled" disabled' : '"';
|
520
|
+
}
|
521
|
+
t += (sel ? '></select>' : '>') + '</td>';
|
326
522
|
}
|
327
|
-
|
523
|
+
$t.find('thead').eq(0).append(t += '</tr>');
|
328
524
|
}
|
329
525
|
$t
|
330
|
-
.
|
331
|
-
|
332
|
-
|
526
|
+
// add .tsfilter namespace to all BUT search
|
527
|
+
.bind('addRows updateCell update appendCache search'.split(' ').join('.tsfilter '), function(e, filter){
|
528
|
+
if (e.type !== 'search'){
|
529
|
+
buildDefault(true);
|
530
|
+
}
|
531
|
+
checkFilters(e.type === 'search' ? filter : '');
|
532
|
+
return false;
|
333
533
|
})
|
334
|
-
.find('
|
335
|
-
.find('input.' + css).bind('keyup search', function(e, delay){
|
534
|
+
.find('input.' + css).bind('keyup search', function(e, filter){
|
336
535
|
// ignore arrow and meta keys; allow backspace
|
337
536
|
if ((e.which < 32 && e.which !== 8) || (e.which >= 37 && e.which <=40)) { return; }
|
338
537
|
// skip delay
|
339
|
-
if (
|
340
|
-
|
341
|
-
return;
|
538
|
+
if (typeof filter !== 'undefined'){
|
539
|
+
checkFilters(filter);
|
540
|
+
return false;
|
342
541
|
}
|
343
542
|
// delay filtering
|
344
543
|
clearTimeout(timer);
|
345
544
|
timer = setTimeout(function(){
|
346
|
-
|
545
|
+
checkFilters();
|
347
546
|
}, wo.filter_searchDelay || 300);
|
348
547
|
});
|
349
|
-
|
548
|
+
|
549
|
+
// reset button/link
|
550
|
+
if (wo.filter_reset && $(wo.filter_reset).length){
|
551
|
+
$(wo.filter_reset).bind('click', function(){
|
552
|
+
$t.find('.' + css).val('');
|
553
|
+
checkFilters();
|
554
|
+
return false;
|
555
|
+
});
|
556
|
+
}
|
557
|
+
if (wo.filter_functions){
|
350
558
|
// i = column # (string)
|
351
|
-
for (
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
559
|
+
for (col in wo.filter_functions){
|
560
|
+
if (wo.filter_functions.hasOwnProperty(col) && typeof col === 'string'){
|
561
|
+
t = $ths.filter('[data-column="' + col + '"]:last');
|
562
|
+
ff = '';
|
563
|
+
if (wo.filter_functions[col] === true && !t.hasClass('filter-false')){
|
564
|
+
buildSelect(col);
|
565
|
+
} else if (typeof col === 'string' && !t.hasClass('filter-false')){
|
566
|
+
// add custom drop down list
|
567
|
+
for (str in wo.filter_functions[col]){
|
568
|
+
if (typeof str === 'string'){
|
569
|
+
ff += ff === '' ? '<option value="">' + (t.attr('data-placeholder') || '') + '</option>' : '';
|
570
|
+
ff += '<option value="' + str + '">' + str + '</option>';
|
571
|
+
}
|
362
572
|
}
|
573
|
+
$t.find('thead').find('select.' + css + '[data-column="' + col + '"]').append(ff);
|
363
574
|
}
|
364
|
-
$t.find('thead').find('select.' + css + '[data-column="' + i + '"]').append(fr);
|
365
575
|
}
|
366
576
|
}
|
367
577
|
}
|
368
578
|
buildDefault();
|
369
579
|
|
370
|
-
$t.find('select.' + css).bind('change', function(){
|
371
|
-
|
580
|
+
$t.find('select.' + css).bind('change search', function(){
|
581
|
+
checkFilters();
|
372
582
|
});
|
373
583
|
|
374
|
-
if (
|
375
|
-
|
584
|
+
if (wo.filter_hideFilters === true){
|
585
|
+
$t
|
586
|
+
.find('.tablesorter-filter-row')
|
587
|
+
.addClass('hideme')
|
588
|
+
.bind('mouseenter mouseleave', function(e){
|
589
|
+
// save event object - http://bugs.jquery.com/ticket/12140
|
590
|
+
var all, evt = e;
|
591
|
+
ft = $(this);
|
592
|
+
clearTimeout(st);
|
593
|
+
st = setTimeout(function(){
|
594
|
+
if (/enter|over/.test(evt.type)){
|
595
|
+
ft.removeClass('hideme');
|
596
|
+
} else {
|
597
|
+
// don't hide if input has focus
|
598
|
+
// $(':focus') needs jQuery 1.6+
|
599
|
+
if ($(document.activeElement).closest('tr')[0] !== ft[0]){
|
600
|
+
// get all filter values
|
601
|
+
all = $t.find('.' + (wo.filter_cssFilter || 'tablesorter-filter')).map(function(){
|
602
|
+
return $(this).val() || '';
|
603
|
+
}).get().join('');
|
604
|
+
// don't hide row if any filter has a value
|
605
|
+
if (all === ''){
|
606
|
+
ft.addClass('hideme');
|
607
|
+
}
|
608
|
+
}
|
609
|
+
}
|
610
|
+
}, 200);
|
611
|
+
})
|
612
|
+
.find('input, select').bind('focus blur', function(e){
|
613
|
+
ft2 = $(this).closest('tr');
|
614
|
+
clearTimeout(st);
|
615
|
+
st = setTimeout(function(){
|
616
|
+
// don't hide row if any filter has a value
|
617
|
+
if ($t.find('.' + (wo.filter_cssFilter || 'tablesorter-filter')).map(function(){ return $(this).val() || ''; }).get().join('') === ''){
|
618
|
+
ft2[ e.type === 'focus' ? 'removeClass' : 'addClass']('hideme');
|
619
|
+
}
|
620
|
+
}, 200);
|
621
|
+
});
|
622
|
+
}
|
623
|
+
|
624
|
+
// show processing icon
|
625
|
+
if (c.showProcessing) {
|
626
|
+
$t.bind('filterStart filterEnd', function(e, v) {
|
627
|
+
var fc = (v) ? $t.find('.' + c.cssHeader).filter('[data-column]').filter(function(){
|
628
|
+
return v[$(this).data('column')] !== '';
|
629
|
+
}) : '';
|
630
|
+
ts.isProcessing($t[0], e.type === 'filterStart', v ? fc : '');
|
631
|
+
});
|
632
|
+
}
|
633
|
+
|
634
|
+
if (c.debug){
|
635
|
+
ts.benchmark("Applying Filter widget", time);
|
376
636
|
}
|
637
|
+
// filter widget initialized
|
638
|
+
$t.trigger('filterInit');
|
377
639
|
}
|
640
|
+
},
|
641
|
+
remove: function(table, c, wo){
|
642
|
+
var k, $tb,
|
643
|
+
$t = $(table),
|
644
|
+
b = $t.children('tbody:not(.' + c.cssInfoBlock + ')');
|
645
|
+
$t
|
646
|
+
.removeClass('hasFilters')
|
647
|
+
// add .tsfilter namespace to all BUT search
|
648
|
+
.unbind('addRows updateCell update appendCache search'.split(' ').join('.tsfilter'))
|
649
|
+
.find('.tablesorter-filter-row').remove();
|
650
|
+
for (k = 0; k < b.length; k++ ){
|
651
|
+
$tb = $.tablesorter.processTbody(table, $(b[k]), true); // remove tbody
|
652
|
+
$tb.children().removeClass('filtered').show();
|
653
|
+
$.tablesorter.processTbody(table, $tb, false); // restore tbody
|
654
|
+
}
|
655
|
+
if (wo.filterreset) { $(wo.filter_reset).unbind('click'); }
|
378
656
|
}
|
379
657
|
});
|
380
658
|
|
381
659
|
// Widget: Sticky headers
|
382
660
|
// based on this awesome article:
|
383
|
-
// http://css-tricks.com/13465-persistent-headers/
|
661
|
+
// http://css-tricks.com/13465-persistent-headers/
|
662
|
+
// and https://github.com/jmosbech/StickyTableHeaders by Jonas Mosbech
|
384
663
|
// **************************
|
385
664
|
$.tablesorter.addWidget({
|
386
665
|
id: "stickyHeaders",
|
387
|
-
format: function(table)
|
666
|
+
format: function(table){
|
388
667
|
if ($(table).hasClass('hasStickyHeaders')) { return; }
|
389
668
|
var $table = $(table).addClass('hasStickyHeaders'),
|
390
|
-
|
669
|
+
c = table.config,
|
670
|
+
wo = c.widgetOptions,
|
391
671
|
win = $(window),
|
392
|
-
header = $(table).children('thead'),
|
672
|
+
header = $(table).children('thead:first'), //.add( $(table).find('caption') ),
|
393
673
|
hdrCells = header.children('tr:not(.sticky-false)').children(),
|
394
674
|
css = wo.stickyHeaders || 'tablesorter-stickyHeader',
|
395
675
|
innr = '.tablesorter-header-inner',
|
396
676
|
firstCell = hdrCells.eq(0),
|
397
677
|
tfoot = $table.find('tfoot'),
|
398
|
-
|
399
|
-
|
678
|
+
// clone the entire thead - seems to work in IE8+
|
679
|
+
stkyHdr = header.clone()
|
400
680
|
.addClass(css)
|
401
681
|
.css({
|
402
682
|
width : header.outerWidth(true),
|
403
683
|
position : 'fixed',
|
404
|
-
left : firstCell.offset().left,
|
405
684
|
margin : 0,
|
406
685
|
top : 0,
|
407
686
|
visibility : 'hidden',
|
408
|
-
zIndex :
|
687
|
+
zIndex : 1
|
409
688
|
}),
|
410
|
-
stkyCells =
|
411
|
-
laststate = ''
|
689
|
+
stkyCells = stkyHdr.find('tr').children(),
|
690
|
+
laststate = '',
|
691
|
+
spacing = 0,
|
692
|
+
resizeHdr = function(){
|
693
|
+
var bwsr = navigator.userAgent;
|
694
|
+
spacing = 0;
|
695
|
+
// yes, I dislike browser sniffing, but it really is needed here :(
|
696
|
+
// webkit automatically compensates for border spacing
|
697
|
+
if ($table.css('border-collapse') !== 'collapse' && !/webkit/i.test(bwsr)) {
|
698
|
+
// IE needs to be adjusted by the padding; Firefox & Opera use the border-spacing
|
699
|
+
// update border-spacing here because of demos that switch themes
|
700
|
+
spacing = /msie/i.test(bwsr) ? parseInt(header.css('padding-left'), 10) : parseInt($table.css('border-spacing'), 10);
|
701
|
+
}
|
702
|
+
stkyHdr.css({
|
703
|
+
left : header.offset().left - win.scrollLeft() - spacing,
|
704
|
+
width: header.outerWidth()
|
705
|
+
});
|
706
|
+
stkyCells
|
707
|
+
.each(function(i){
|
708
|
+
var $h = hdrCells.eq(i);
|
709
|
+
$(this).css({
|
710
|
+
width: $h.width(),
|
711
|
+
height: $h.height()
|
712
|
+
});
|
713
|
+
})
|
714
|
+
.find(innr).each(function(i){
|
715
|
+
var hi = hdrCells.eq(i).find(innr),
|
716
|
+
w = hi.width(); // - ( parseInt(hi.css('padding-left'), 10) + parseInt(hi.css('padding-right'), 10) );
|
717
|
+
$(this).width(w);
|
718
|
+
});
|
719
|
+
};
|
720
|
+
// remove rows you don't want to be sticky
|
721
|
+
stkyHdr.find('tr.sticky-false').remove();
|
722
|
+
// remove resizable block
|
723
|
+
stkyCells.find('.tablesorter-resizer').remove();
|
412
724
|
// update sticky header class names to match real header after sorting
|
413
|
-
$table
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
725
|
+
$table
|
726
|
+
.bind('sortEnd.tsSticky', function(){
|
727
|
+
hdrCells.each(function(i){
|
728
|
+
var t = stkyCells.eq(i);
|
729
|
+
t.attr('class', $(this).attr('class'));
|
730
|
+
if (c.cssIcon){
|
731
|
+
t
|
732
|
+
.find('.' + c.cssIcon)
|
733
|
+
.attr('class', $(this).find('.' + c.cssIcon).attr('class'));
|
734
|
+
}
|
418
735
|
});
|
419
|
-
})
|
420
|
-
|
736
|
+
})
|
737
|
+
.bind('pagerComplete.tsSticky', function(){
|
738
|
+
resizeHdr();
|
421
739
|
});
|
422
740
|
// set sticky header cell width and link clicks to real header
|
423
|
-
hdrCells.each(function(i){
|
741
|
+
hdrCells.find('*').andSelf().filter(c.selectorSort).each(function(i){
|
424
742
|
var t = $(this);
|
425
743
|
stkyCells.eq(i)
|
426
744
|
// clicking on sticky will trigger sort
|
@@ -431,41 +749,40 @@ $.tablesorter.addWidget({
|
|
431
749
|
.bind('mousedown', function(){
|
432
750
|
this.onselectstart = function(){ return false; };
|
433
751
|
return false;
|
434
|
-
})
|
435
|
-
// set cell widths
|
436
|
-
.find(innr).width( t.find(innr).width() );
|
752
|
+
});
|
437
753
|
});
|
438
|
-
header.
|
754
|
+
header.after( stkyHdr );
|
439
755
|
// make it sticky!
|
440
756
|
win
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
// trigger resize to make sure the column widths match
|
452
|
-
win.resize();
|
453
|
-
laststate = vis;
|
454
|
-
}
|
455
|
-
})
|
456
|
-
.resize(function(){
|
457
|
-
var ht = 0;
|
458
|
-
sticky.css({
|
459
|
-
left : firstCell.offset().left - win.scrollLeft(),
|
460
|
-
width: header.outerWidth()
|
461
|
-
}).each(function(i){
|
462
|
-
$(this).css('top', ht);
|
463
|
-
ht += header.find('tr').eq(i).outerHeight();
|
464
|
-
});
|
465
|
-
stkyCells.find(innr).each(function(i){
|
466
|
-
$(this).width( hdrCells.eq(i).find(innr).width() );
|
467
|
-
});
|
757
|
+
.bind('scroll.tsSticky', function(){
|
758
|
+
var offset = firstCell.offset(),
|
759
|
+
sTop = win.scrollTop(),
|
760
|
+
tableHt = $table.height() - (firstCell.height() + (tfoot.height() || 0)),
|
761
|
+
vis = (sTop > offset.top) && (sTop < offset.top + tableHt) ? 'visible' : 'hidden';
|
762
|
+
stkyHdr
|
763
|
+
.css({
|
764
|
+
// adjust when scrolling horizontally - fixes issue #143
|
765
|
+
left : header.offset().left - win.scrollLeft() - spacing,
|
766
|
+
visibility : vis
|
468
767
|
});
|
768
|
+
if (vis !== laststate){
|
769
|
+
// make sure the column widths match
|
770
|
+
resizeHdr();
|
771
|
+
laststate = vis;
|
772
|
+
}
|
773
|
+
})
|
774
|
+
.bind('resize.tsSticky', function(){
|
775
|
+
resizeHdr();
|
776
|
+
});
|
777
|
+
},
|
778
|
+
remove: function(table, c, wo){
|
779
|
+
var $t = $(table),
|
780
|
+
css = wo.stickyHeaders || 'tablesorter-stickyHeader';
|
781
|
+
$t
|
782
|
+
.removeClass('hasStickyHeaders')
|
783
|
+
.unbind('sortEnd.tsSticky pagerComplete.tsSticky')
|
784
|
+
.find('.' + css).remove();
|
785
|
+
$(window).unbind('scroll.tsSticky resize.tsSticky');
|
469
786
|
}
|
470
787
|
});
|
471
788
|
|
@@ -475,85 +792,128 @@ $.tablesorter.addWidget({
|
|
475
792
|
// **************************
|
476
793
|
$.tablesorter.addWidget({
|
477
794
|
id: "resizable",
|
478
|
-
format: function(table)
|
795
|
+
format: function(table){
|
479
796
|
if ($(table).hasClass('hasResizable')) { return; }
|
480
797
|
$(table).addClass('hasResizable');
|
481
|
-
var j, s, c
|
482
|
-
$
|
798
|
+
var t, j, s, $c, $cols,
|
799
|
+
$tbl = $(table),
|
800
|
+
c = table.config,
|
801
|
+
wo = c.widgetOptions,
|
483
802
|
position = 0,
|
484
803
|
$target = null,
|
485
|
-
$
|
804
|
+
$next = null,
|
486
805
|
stopResize = function(){
|
487
806
|
position = 0;
|
488
|
-
$target = $
|
807
|
+
$target = $next = null;
|
489
808
|
$(window).trigger('resize'); // will update stickyHeaders, just in case
|
490
809
|
};
|
491
|
-
s = ($.tablesorter.storage) ? $.tablesorter.storage(table, 'tablesorter-resizable') :
|
810
|
+
s = ($.tablesorter.storage && wo.resizable !== false) ? $.tablesorter.storage(table, 'tablesorter-resizable') : {};
|
492
811
|
// process only if table ID or url match
|
493
|
-
if (s)
|
494
|
-
for (j in s)
|
495
|
-
if (!isNaN(j) && j < c.headerList.length)
|
812
|
+
if (s){
|
813
|
+
for (j in s){
|
814
|
+
if (!isNaN(j) && j < c.headerList.length){
|
496
815
|
$(c.headerList[j]).width(s[j]); // set saved resizable widths
|
497
816
|
}
|
498
817
|
}
|
499
818
|
}
|
819
|
+
$tbl.children('thead:first').find('tr').each(function(){
|
820
|
+
$c = $(this).children();
|
821
|
+
if (!$(this).find('.tablesorter-wrapper').length) {
|
822
|
+
// Firefox needs this inner div to position the resizer correctly
|
823
|
+
$c.wrapInner('<div class="tablesorter-wrapper" style="position:relative;height:100%;width:100%"></div>');
|
824
|
+
}
|
825
|
+
$c = $c.slice(0,-1); // don't include the last column of the row
|
826
|
+
$cols = $cols ? $cols.add($c) : $c;
|
827
|
+
});
|
500
828
|
$cols
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
829
|
+
.each(function(){
|
830
|
+
t = $(this);
|
831
|
+
j = parseInt(t.css('padding-right'), 10) + 8; // 8 is 1/2 of the 16px wide resizer
|
832
|
+
t
|
833
|
+
.find('.tablesorter-wrapper')
|
834
|
+
.append('<div class="tablesorter-resizer" style="cursor:w-resize;position:absolute;height:100%;width:16px;right:-' + j + 'px;top:0;z-index:1;"></div>');
|
835
|
+
})
|
836
|
+
.bind('mousemove.tsresize', function(e){
|
837
|
+
// ignore mousemove if no mousedown
|
838
|
+
if (position === 0 || !$target) { return; }
|
839
|
+
// resize columns
|
840
|
+
var w = e.pageX - position;
|
841
|
+
$target.width( $target.width() + w );
|
842
|
+
$next.width( $next.width() - w );
|
843
|
+
position = e.pageX;
|
844
|
+
})
|
845
|
+
.bind('mouseup.tsresize', function(){
|
846
|
+
if ($.tablesorter.storage && $target){
|
847
|
+
s[$target.index()] = $target.width();
|
848
|
+
s[$next.index()] = $next.width();
|
849
|
+
if (wo.resizable !== false){
|
519
850
|
$.tablesorter.storage(table, 'tablesorter-resizable', s);
|
520
851
|
}
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
852
|
+
}
|
853
|
+
stopResize();
|
854
|
+
})
|
855
|
+
.find('.tablesorter-resizer')
|
856
|
+
.bind('mousedown', function(e){
|
857
|
+
// save header cell and mouse position; closest() not supported by jQuery v1.2.6
|
858
|
+
$target = $(e.target).parents('th:last');
|
859
|
+
$next = $target.next();
|
860
|
+
position = e.pageX;
|
861
|
+
});
|
862
|
+
$tbl.find('thead:first')
|
863
|
+
.bind('mouseup.tsresize mouseleave.tsresize', function(e){
|
533
864
|
stopResize();
|
865
|
+
})
|
866
|
+
// right click to reset columns to default widths
|
867
|
+
.bind('contextmenu.tsresize', function(){
|
868
|
+
$.tablesorter.resizableReset(table);
|
869
|
+
// $.isEmptyObject() needs jQuery 1.4+
|
870
|
+
var rtn = $.isEmptyObject ? $.isEmptyObject(s) : s === {}; // allow right click if already reset
|
871
|
+
s = {};
|
872
|
+
return rtn;
|
534
873
|
});
|
874
|
+
},
|
875
|
+
remove: function(table, c, wo){
|
876
|
+
$(table)
|
877
|
+
.removeClass('hasResizable')
|
878
|
+
.find('thead')
|
879
|
+
.unbind('mouseup.tsresize mouseleave.tsresize contextmenu.tsresize')
|
880
|
+
.find('tr').children()
|
881
|
+
.unbind('mousemove.tsresize mouseup.tsresize')
|
882
|
+
.find('.tablesorter-wrapper').each(function(){
|
883
|
+
$(this).find('.tablesorter-resizer').remove();
|
884
|
+
$(this).replaceWith( $(this).contents() );
|
885
|
+
});
|
886
|
+
$.tablesorter.resizableReset(table);
|
535
887
|
}
|
536
888
|
});
|
889
|
+
$.tablesorter.resizableReset = function(table){
|
890
|
+
$(table.config.headerList).width('auto');
|
891
|
+
$.tablesorter.storage(table, 'tablesorter-resizable', {});
|
892
|
+
};
|
537
893
|
|
538
894
|
// Save table sort widget
|
539
895
|
// this widget saves the last sort only if the
|
896
|
+
// saveSort widget option is true AND the
|
540
897
|
// $.tablesorter.storage function is included
|
541
898
|
// **************************
|
542
899
|
$.tablesorter.addWidget({
|
543
900
|
id: 'saveSort',
|
544
|
-
init: function(table,
|
901
|
+
init: function(table, thisWidget){
|
545
902
|
// run widget format before all other widgets are applied to the table
|
546
903
|
thisWidget.format(table, true);
|
547
904
|
},
|
548
|
-
format: function(table, init)
|
549
|
-
var sl, time, c = table.config,
|
550
|
-
|
905
|
+
format: function(table, init){
|
906
|
+
var sl, time, c = table.config,
|
907
|
+
wo = c.widgetOptions,
|
908
|
+
ss = wo.saveSort !== false, // make saveSort active/inactive; default to true
|
909
|
+
sortList = { "sortList" : c.sortList };
|
910
|
+
if (c.debug){
|
551
911
|
time = new Date();
|
552
912
|
}
|
553
|
-
if ($(table).hasClass('hasSaveSort'))
|
554
|
-
if (table.hasInitialized && $.tablesorter.storage)
|
913
|
+
if ($(table).hasClass('hasSaveSort')){
|
914
|
+
if (ss && table.hasInitialized && $.tablesorter.storage){
|
555
915
|
$.tablesorter.storage( table, 'tablesorter-savesort', sortList );
|
556
|
-
if (c.debug)
|
916
|
+
if (c.debug){
|
557
917
|
$.tablesorter.benchmark('saveSort widget: Saving last sort: ' + c.sortList, time);
|
558
918
|
}
|
559
919
|
}
|
@@ -562,36 +922,27 @@ $.tablesorter.addWidget({
|
|
562
922
|
$(table).addClass('hasSaveSort');
|
563
923
|
sortList = '';
|
564
924
|
// get data
|
565
|
-
if ($.tablesorter.storage)
|
925
|
+
if ($.tablesorter.storage){
|
566
926
|
sl = $.tablesorter.storage( table, 'tablesorter-savesort' );
|
567
927
|
sortList = (sl && sl.hasOwnProperty('sortList') && $.isArray(sl.sortList)) ? sl.sortList : '';
|
568
|
-
if (c.debug)
|
569
|
-
$.tablesorter.benchmark('saveSort: Last sort loaded: ' + sortList, time);
|
928
|
+
if (c.debug){
|
929
|
+
$.tablesorter.benchmark('saveSort: Last sort loaded: "' + sortList + '"', time);
|
570
930
|
}
|
571
931
|
}
|
572
932
|
// init is true when widget init is run, this will run this widget before all other widgets have initialized
|
573
933
|
// this method allows using this widget in the original tablesorter plugin; but then it will run all widgets twice.
|
574
|
-
if (init && sortList && sortList.length > 0)
|
934
|
+
if (init && sortList && sortList.length > 0){
|
575
935
|
c.sortList = sortList;
|
576
|
-
} else if (table.hasInitialized && sortList && sortList.length > 0)
|
936
|
+
} else if (table.hasInitialized && sortList && sortList.length > 0){
|
577
937
|
// update sort change
|
578
938
|
$(table).trigger('sorton', [sortList]);
|
579
939
|
}
|
580
940
|
}
|
941
|
+
},
|
942
|
+
remove: function(table, c, wo){
|
943
|
+
// clear storage
|
944
|
+
$.tablesorter.storage( table, 'tablesorter-savesort', '' );
|
581
945
|
}
|
582
946
|
});
|
583
947
|
|
584
948
|
})(jQuery);
|
585
|
-
|
586
|
-
// return an array with unique values https://gist.github.com/461516
|
587
|
-
Array.prototype.getUnique = function(s){
|
588
|
-
var c, a = [], o = {}, i, j = 0, l = this.length;
|
589
|
-
for(i=0; i < l; ++i) {
|
590
|
-
c = this[i];
|
591
|
-
if (!o[c]) {
|
592
|
-
o[c] = {};
|
593
|
-
a[j++] = c;
|
594
|
-
}
|
595
|
-
}
|
596
|
-
return (s) ? a.sort() : a;
|
597
|
-
};
|