MediaWiki:SortTableFilter.js

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
var Sort=(function(){var sort={};sort.alphanumeric=function(a,b){return(a==b)?0:(a<b)?-1:1;};sort['default']=sort.alphanumeric;sort.numeric_converter=function(separator){return function(val){if(typeof(val)=="string"){val=parseFloat(val.replace(/^[^\d\.]*([\d., ]+).*/g,"$1").replace(new RegExp("[^\\\d"+separator+"]","g"),'').replace(/,/,'.'))||0;}
return val||0;};};sort.numeric=function(a,b){return sort.numeric.convert(a)-sort.numeric.convert(b);};sort.numeric.convert=sort.numeric_converter(".");sort.numeric_comma=function(a,b){return sort.numeric_comma.convert(a)-sort.numeric_comma.convert(b);};sort.numeric_comma.convert=sort.numeric_converter(",");sort.ignorecase=function(a,b){return sort.alphanumeric(sort.ignorecase.convert(a),sort.ignorecase.convert(b));};sort.ignorecase.convert=function(val){if(val==null){return"";}
return(""+val).toLowerCase();};sort.currency=sort.numeric;sort.currency_comma=sort.numeric_comma;sort.date=function(a,b){return sort.numeric(sort.date.convert(a),sort.date.convert(b));};sort.date.fixYear=function(yr){yr=+yr;if(yr<50){yr+=2000;}
else if(yr<100){yr+=1900;}
return yr;};sort.date.formats=[{re:/(\d{2,4})-(\d{1,2})-(\d{1,2})/,f:function(x){return(new Date(sort.date.fixYear(x[1]),+x[2],+x[3])).getTime();}},{re:/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/,f:function(x){return(new Date(sort.date.fixYear(x[3]),+x[1],+x[2])).getTime();}},{re:/(.*\d{4}.*\d+:\d+\d+.*)/,f:function(x){var d=new Date(x[1]);if(d){return d.getTime();}}}];sort.date.convert=function(val){var m,v,f=sort.date.formats;for(var i=0,L=f.length;i<L;i++){if(m=val.match(f[i].re)){v=f[i].f(m);if(typeof(v)!="undefined"){return v;}}}
return 9999999999999;};return sort;})();var Table=(function(){function def(o){return(typeof o!="undefined");};function hasClass(o,name){return new RegExp("(^|\\s)"+name+"(\\s|$)").test(o.className);};function addClass(o,name){var c=o.className||"";if(def(c)&&!hasClass(o,name)){o.className+=(c?" ":"")+name;}};function removeClass(o,name){var c=o.className||"";o.className=c.replace(new RegExp("(^|\\s)"+name+"(\\s|$)"),"$1");};function classValue(o,prefix){var c=o.className;if(c.match(new RegExp("(^|\\s)"+prefix+"([^ ]+)"))){return RegExp.$2;}
return null;};function isHidden(o){if(window.getComputedStyle){var cs=window.getComputedStyle;return(isHidden=function(o){return'none'==cs(o,null).getPropertyValue('display');})(o);}
else if(window.currentStyle){return(isHidden=function(o){return'none'==o.currentStyle['display'];})(o);}
return(isHidden=function(o){return'none'==o.style['display'];})(o);};function getParent(o,a,b){if(o!=null&&o.nodeName){if(o.nodeName==a||(b&&o.nodeName==b)){return o;}
while(o=o.parentNode){if(o.nodeName&&(o.nodeName==a||(b&&o.nodeName==b))){return o;}}}
return null;};function copy(o1,o2){for(var i=2;i<arguments.length;i++){var a=arguments[i];if(def(o1[a])){o2[a]=o1[a];}}}
var table={AutoStripeClassName:"table-autostripe",StripeClassNamePrefix:"table-stripeclass:",AutoSortClassName:"table-autosort",AutoSortColumnPrefix:"table-autosort:",AutoSortTitle:$j.resource('SortTableFilter_AutoSortTitle'),SortedAscendingClassName:"table-sorted-asc",SortedDescendingClassName:"table-sorted-desc",SortableClassName:"table-sortable",SortableColumnPrefix:"table-sortable:",NoSortClassName:"table-nosort",AutoFilterClassName:"table-autofilter",FilteredClassName:"table-filtered",FilterableClassName:"table-filterable",FilteredRowcountPrefix:"table-filtered-rowcount:",RowcountPrefix:"table-rowcount:",FilterAllLabel:$j.resource('SortTableFilter_FilterAllLabel'),AutoPageSizePrefix:"table-autopage:",AutoPageJumpPrefix:"table-page:",PageNumberPrefix:"table-page-number:",PageCountPrefix:"table-page-count:"};table.tabledata={};table.uniqueId=1;table.resolve=function(o,args){if(o!=null&&o.nodeName&&o.nodeName!="TABLE"){o=getParent(o,"TABLE");}
if(o==null){return null;}
if(!o.id){var id=null;do{var id="TABLE_"+(table.uniqueId++);}
while(document.getElementById(id)!=null);o.id=id;}
this.tabledata[o.id]=this.tabledata[o.id]||{};if(args){copy(args,this.tabledata[o.id],"stripeclass","ignorehiddenrows","useinnertext","sorttype","col","desc","page","pagesize");}
return o;};table.processTableCells=function(t,type,func,arg){t=this.resolve(t);if(t==null){return;}
if(type!="TFOOT"){this.processCells(t.tHead,func,arg);}
if(type!="THEAD"){this.processCells(t.tFoot,func,arg);}};table.processCells=function(section,func,arg){if(section!=null){if(section.rows&&section.rows.length&&section.rows.length>0){var rows=section.rows;for(var j=0,L2=rows.length;j<L2;j++){var row=rows[j];if(row.cells&&row.cells.length&&row.cells.length>0){var cells=row.cells;for(var k=0,L3=cells.length;k<L3;k++){var cellsK=cells[k];func.call(this,cellsK,arg);}}}}}};table.getCellIndex=function(td){var tr=td.parentNode;var cells=tr.cells;if(cells&&cells.length){if(cells.length>1&&cells[cells.length-1].cellIndex>0){(this.getCellIndex=function(td){return td.cellIndex;})(td);}
for(var i=0,L=cells.length;i<L;i++){if(tr.cells[i]==td){return i;}}}
return 0;};table.nodeValue={'INPUT':function(node){if(def(node.value)&&node.type&&((node.type!="checkbox"&&node.type!="radio")||node.checked)){return node.value;}
return"";},'SELECT':function(node){if(node.selectedIndex>=0&&node.options){return node.options[node.selectedIndex].text;}
return"";},'IMG':function(node){return node.name||"";}};table.getCellValue=function(td,useInnerText){if(useInnerText&&def(td.innerText)){return td.innerText;}
if(!td.childNodes){return"";}
var childNodes=td.childNodes;var ret="";for(var i=0,L=childNodes.length;i<L;i++){var node=childNodes[i];var type=node.nodeType;if(type==1){var nname=node.nodeName;if(this.nodeValue[nname]){ret+=this.nodeValue[nname](node);}
else{ret+=this.getCellValue(node);}}
else if(type==3){if(def(node.innerText)){ret+=node.innerText;}
else if(def(node.nodeValue)){ret+=node.nodeValue;}}}
return ret;};table.tableHeaderIndexes={};table.getActualCellIndex=function(tableCellObj){if(!def(tableCellObj.cellIndex)){return null;}
var tableObj=getParent(tableCellObj,"TABLE");var cellCoordinates=tableCellObj.parentNode.rowIndex+"-"+this.getCellIndex(tableCellObj);if(def(this.tableHeaderIndexes[tableObj.id])){return this.tableHeaderIndexes[tableObj.id][cellCoordinates];}
var matrix=[];this.tableHeaderIndexes[tableObj.id]={};var thead=getParent(tableCellObj,"THEAD");var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+this.getCellIndex(c);var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1;var firstAvailCol;if(!def(matrix[rowIndex])){matrix[rowIndex]=[];}
var m=matrix[rowIndex];for(var k=0;k<m.length+1;k++){if(!def(m[k])){firstAvailCol=k;break;}}
this.tableHeaderIndexes[tableObj.id][cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(!def(matrix[k])){matrix[k]=[];}
var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}
return this.tableHeaderIndexes[tableObj.id][cellCoordinates];};table.sort=function(o,args){var t,tdata,sortconvert=null;if(typeof(args)=="function"){args={sorttype:args};}
args=args||{};if(!def(args.col)){args.col=this.getActualCellIndex(o)||0;}
args.sorttype=args.sorttype||Sort['default'];t=this.resolve(o,args);tdata=this.tabledata[t.id];if(def(tdata.lastcol)&&tdata.lastcol==tdata.col&&def(tdata.lastdesc)){tdata.desc=!tdata.lastdesc;}
else{tdata.desc=!!args.desc;}
tdata.lastcol=tdata.col;tdata.lastdesc=!!tdata.desc;var sorttype=tdata.sorttype;if(typeof(sorttype.convert)=="function"){sortconvert=tdata.sorttype.convert;sorttype=Sort.alphanumeric;}
this.processTableCells(t,"THEAD",function(cell){if(hasClass(cell,this.SortableClassName)){removeClass(cell,this.SortedAscendingClassName);removeClass(cell,this.SortedDescendingClassName);if(tdata.col==table.getActualCellIndex(cell)&&(classValue(cell,table.SortableClassName))){addClass(cell,tdata.desc?this.SortedAscendingClassName:this.SortedDescendingClassName);}}});var bodies=t.tBodies;if(bodies==null||bodies.length==0){return;}
var newSortFunc=(tdata.desc)?function(a,b){return sorttype(b[0],a[0]);}:function(a,b){return sorttype(a[0],b[0]);};var useinnertext=!!tdata.useinnertext;var col=tdata.col;for(var i=0,L=bodies.length;i<L;i++){var tb=bodies[i],tbrows=tb.rows,rows=[];if(!hasClass(tb,table.NoSortClassName)){var cRow,cRowIndex=0;if(cRow=tbrows[cRowIndex]){do{if(rowCells=cRow.cells){var cellValue=(col<rowCells.length)?this.getCellValue(rowCells[col],useinnertext):null;if(sortconvert)cellValue=sortconvert(cellValue);rows[cRowIndex]=[cellValue,tbrows[cRowIndex]];}}while(cRow=tbrows[++cRowIndex])}
rows.sort(newSortFunc);cRowIndex=0;var displayedCount=0;var f=[removeClass,addClass];if(cRow=rows[cRowIndex]){do{tb.appendChild(cRow[1]);}while(cRow=rows[++cRowIndex])}}}
if(tdata.pagesize){this.page(t);}
else{if(tdata.stripeclass){this.stripe(t,tdata.stripeclass,!!tdata.ignorehiddenrows);}}};table.filter=function(o,filters,args){var cell;args=args||{};var t=this.resolve(o,args);var tdata=this.tabledata[t.id];if(!filters){tdata.filters=null;}
else{if(filters.nodeName=="SELECT"&&filters.type=="select-one"&&filters.selectedIndex>-1){filters={'filter':filters.options[filters.selectedIndex].value};}
if(filters.nodeName=="INPUT"&&filters.type=="text"){filters={'filter':"/^"+filters.value+"/"};}
if(typeof(filters)=="object"&&!filters.length){filters=[filters];}
for(var i=0,L=filters.length;i<L;i++){var filter=filters[i];if(typeof(filter.filter)=="string"){if(filter.filter.match(/^\/(.*)\/$/)){filter.filter=new RegExp(RegExp.$1);filter.filter.regex=true;}
else if(filter.filter.match(/^function\s*\(([^\)]*)\)\s*\{(.*)}\s*$/)){filter.filter=Function(RegExp.$1,RegExp.$2);}}
if(filter&&!def(filter.col)&&(cell=getParent(o,"TD","TH"))){filter.col=this.getCellIndex(cell);}
if((!filter||!filter.filter)&&tdata.filters){delete tdata.filters[filter.col];}
else{tdata.filters=tdata.filters||{};tdata.filters[filter.col]=filter.filter;}}
for(var j in tdata.filters){var keep=true;}
if(!keep){tdata.filters=null;}}
return table.scrape(o);};table.page=function(t,page,args){args=args||{};if(def(page)){args.page=page;}
return table.scrape(t,args);};table.pageJump=function(t,count,args){t=this.resolve(t,args);return this.page(t,(table.tabledata[t.id].page||0)+count,args);};table.pageNext=function(t,args){return this.pageJump(t,1,args);};table.pagePrevious=function(t,args){return this.pageJump(t,-1,args);};table.scrape=function(o,args){var col,cell,filterList,filterReset=false,filter;var page,pagesize,pagestart,pageend;var unfilteredrows=[],unfilteredrowcount=0,totalrows=0;var t,tdata,row,hideRow;args=args||{};t=this.resolve(o,args);tdata=this.tabledata[t.id];var page=tdata.page;if(def(page)){if(page<0){tdata.page=page=0;}
pagesize=tdata.pagesize||25;pagestart=page*pagesize+1;pageend=pagestart+pagesize-1;}
var bodies=t.tBodies;if(bodies==null||bodies.length==0){return;}
for(var i=0,L=bodies.length;i<L;i++){var tb=bodies[i];for(var j=0,L2=tb.rows.length;j<L2;j++){row=tb.rows[j];hideRow=false;if(tdata.filters&&row.cells){var cells=row.cells;var cellsLength=cells.length;for(col in tdata.filters){if(!hideRow){filter=tdata.filters[col];if(filter&&col<cellsLength){var val=this.getCellValue(cells[col]);if(filter.regex&&val.search){hideRow=(val.search(filter)<0);}
else if(typeof(filter)=="function"){hideRow=!filter(val,cells[col]);}
else{hideRow=(val!=filter);}}}}}
totalrows++;if(!hideRow){unfilteredrowcount++;if(def(page)){unfilteredrows.push(row);if(unfilteredrowcount<pagestart||unfilteredrowcount>pageend){hideRow=true;}}}
row.style.display=hideRow?"none":"";}}
if(def(page)){if(pagestart>=unfilteredrowcount){pagestart=unfilteredrowcount-(unfilteredrowcount%pagesize);tdata.page=page=pagestart/pagesize;for(var i=pagestart,L=unfilteredrows.length;i<L;i++){unfilteredrows[i].style.display="";}}}
this.processTableCells(t,"THEAD",function(c){((tdata.filters&&def(tdata.filters[table.getCellIndex(c)])&&hasClass(c,table.FilterableClassName))?addClass:removeClass)(c,table.FilteredClassName);});if(tdata.stripeclass){this.stripe(t);}
var pagecount=Math.floor(unfilteredrowcount/pagesize)+1;if(def(page)){if(tdata.container_number){tdata.container_number.innerHTML=page+1;}
if(tdata.container_count){tdata.container_count.innerHTML=pagecount;}}
if(tdata.container_filtered_count){tdata.container_filtered_count.innerHTML=unfilteredrowcount;}
if(tdata.container_all_count){tdata.container_all_count.innerHTML=totalrows;}
return{'data':tdata,'unfilteredcount':unfilteredrowcount,'total':totalrows,'pagecount':pagecount,'page':page,'pagesize':pagesize};};table.stripe=function(t,className,args){args=args||{};args.stripeclass=className;t=this.resolve(t,args);var tdata=this.tabledata[t.id];var bodies=t.tBodies;if(bodies==null||bodies.length==0){return;}
className=tdata.stripeclass;var f=[removeClass,addClass];for(var i=0,L=bodies.length;i<L;i++){var tb=bodies[i],tbrows=tb.rows,cRowIndex=0,cRow,displayedCount=0;if(cRow=tbrows[cRowIndex]){if(tdata.ignoreHiddenRows){do{f[displayedCount++%2](cRow,className);}while(cRow=tbrows[++cRowIndex])}
else{do{if(!isHidden(cRow)){f[displayedCount++%2](cRow,className);}}while(cRow=tbrows[++cRowIndex])}}}};table.getUniqueColValues=function(t,col){var values={},bodies=this.resolve(t).tBodies;for(var i=0,L=bodies.length;i<L;i++){var tbody=bodies[i];for(var r=0,L2=tbody.rows.length;r<L2;r++){values[this.getCellValue(tbody.rows[r].cells[col])]=true;}}
var valArray=[];for(var val in values){valArray.push(val);}
return valArray.sort();};table.auto=function(args){var cells=[],tables=document.getElementsByTagName("TABLE");var val,tdata;if(tables!=null){for(var i=0,L=tables.length;i<L;i++){var t=table.resolve(tables[i]);tdata=table.tabledata[t.id];if(val=classValue(t,table.StripeClassNamePrefix)){tdata.stripeclass=val;}
if(hasClass(t,table.AutoFilterClassName)){table.autofilter(t);}
if(val=classValue(t,table.AutoPageSizePrefix)){table.autopage(t,{'pagesize':+val});}
if((val=classValue(t,table.AutoSortColumnPrefix))||(hasClass(t,table.AutoSortClassName))){table.autosort(t,{'col':(val==null)?null:+val});}
if(tdata.stripeclass&&hasClass(t,table.AutoStripeClassName)){table.stripe(t);}}}};table.autosort=function(t,args){t=this.resolve(t,args);var tdata=this.tabledata[t.id];this.processTableCells(t,"THEAD",function(c){var type=classValue(c,table.SortableColumnPrefix);if(type!=null){type=type||"default";c.title=c.title||table.AutoSortTitle;addClass(c,table.SortableClassName);c.onclick=Function("","Table.sort(this,{'sorttype':Sort['"+type+"']})");if(args.col!=null){if(args.col==table.getActualCellIndex(c)){tdata.sorttype=Sort['"+type+"'];}}}});if(args.col!=null){table.sort(t,args);}};table.autopage=function(t,args){t=this.resolve(t,args);var tdata=this.tabledata[t.id];if(tdata.pagesize){this.processTableCells(t,"THEAD,TFOOT",function(c){var type=classValue(c,table.AutoPageJumpPrefix);if(type=="next"){type=1;}
else if(type=="previous"){type=-1;}
if(type!=null){c.onclick=Function("","Table.pageJump(this,"+type+")");}});if(val=classValue(t,table.PageNumberPrefix)){tdata.container_number=document.getElementById(val);}
if(val=classValue(t,table.PageCountPrefix)){tdata.container_count=document.getElementById(val);}
return table.page(t,0,args);}};table.cancelBubble=function(e){e=e||window.event;if(typeof(e.stopPropagation)=="function"){e.stopPropagation();}
if(def(e.cancelBubble)){e.cancelBubble=true;}};table.autofilter=function(t,args){args=args||{};t=this.resolve(t,args);var tdata=this.tabledata[t.id],val;table.processTableCells(t,"THEAD",function(cell){if(hasClass(cell,table.FilterableClassName)){var cellIndex=table.getCellIndex(cell);var colValues=table.getUniqueColValues(t,cellIndex);if(colValues.length>0){if(typeof(args.insert)=="function"){func.insert(cell,colValues);}
else{var sel='<select onchange="Table.filter(this,this)" onclick="Table.cancelBubble(event)" class="'+table.AutoFilterClassName+'"><option value="">'+table.FilterAllLabel+'</option>';for(var i=0;i<colValues.length;i++){sel+='<option value="'+colValues[i]+'">'+colValues[i]+'</option>';}
sel+='</select>';if(cell.innerHTML.replace(/([\n\s]*(<\!\-\-)((?:(?!<\!\-\-).)+)(\-\->)[\n\s]*)|([\s\n]*)/,'').length>0){cell.innerHTML+="<br>"+sel;}
else{cell.innerHTML+=sel;}}}}});if(val=classValue(t,table.FilteredRowcountPrefix)){tdata.container_filtered_count=document.getElementById(val);}
if(val=classValue(t,table.RowcountPrefix)){tdata.container_all_count=document.getElementById(val);}};if(typeof(jQuery)!="undefined"){jQuery(table.auto);}
else if(window.addEventListener){window.addEventListener("load",table.auto,false);}
else if(window.attachEvent){window.attachEvent("onload",table.auto);}
return table;})();