(imported comment written by MattBoyd)
adiponio,
I
think
this will do what you want it to:
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=
"http://www.w3.org/1999/xhtml" xml:lang=
"en-us"> <!-- Displays a sortable list of relays that have not reported to BigFix in the last 1.5 hours. Created by Matthew Boyd (mdboyd@gmail.com) on 3/16/2010. http:
//iboyd.net --> <head> <style type=
"text/css"> table.tablesorter
{ font-family:arial; background-color: #CDCDCD; margin:10px 0pt 15px; font-size: 12pt; width: 100%; text-align: left;
} table.tablesorter thead tr th, table.tablesorter tfoot tr th
{ background-color: #e6EEEE; border: 1px solid #FFF; font-size: 14pt; padding: 4px; text-align:left;
} table.tablesorter thead tr .header
{ background-repeat: no-repeat; background-position: center right; cursor: pointer;
} table.tablesorter tbody td
{ color: #3D3D3D; padding: 4px; background-color: #FFF; vertical-align: top;
} table.tablesorter tbody tr.odd td
{ background-color:#F0F0F6;
} table.tablesorter thead tr .headerSortUp
{ background-image: url(asc.gif);
} table.tablesorter thead tr .headerSortDown
{ background-image: url(desc.gif);
} table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp
{ background-color: #8dbdd8;
} </style> <script src=
"http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.min.js" type=
"text/javascript"></script> <script type=
"text/javascript" language=
"javascript"> (function($)
{$.extend(
{tablesorter:
new function()
{var parsers=[],widgets=[];this.defaults=
{cssHeader:
"header",cssAsc:
"headerSortUp",cssDesc:
"headerSortDown",sortInitialOrder:
"asc",sortMultiSortKey:
"shiftKey",sortForce:null,sortAppend:null,textExtraction:
"simple",parsers:
{
},widgets:[],widgetZebra:
{css:[
"even",
"odd"]
},headers:
{
},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:
"us",decimal:
'.',debug:
false
};function benchmark(s,d)
{log(s+
","+(
new Date().getTime()-d.getTime())+
"ms");
}this.benchmark=benchmark;function log(s)
{
if(typeof console!=
"undefined"&&typeof console.debug!=
"undefined")
{console.log(s);
}
else
{alert(s);
}
}function buildParserCache(table,$headers)
{
if(table.config.debug)
{var parsersDebug=
"";
}var rows=table.tBodies[0].rows;
if(table.tBodies[0].rows[0])
{var list=[],cells=rows[0].cells,l=cells.length;
for(var i=0;i<l;i++)
{var p=
false;
if($.metadata&&($($headers+).metadata()&&$($headers+).metadata().sorter))
{p=getParserById($($headers+).metadata().sorter);
}
else
if((table.config.headers+&&table.config.headers+.sorter))
{p=getParserById(table.config.headers+.sorter);
}
if(!p)
{p=detectParserForColumn(table,cells+);
}
if(table.config.debug)
{parsersDebug+=
"column:"+i+
" parser:"+p.id+
"\n";
}list.push(p);
}
}
if(table.config.debug)
{log(parsersDebug);
}
return list;
};function detectParserForColumn(table,node)
{var l=parsers.length;
for(var i=1;i<l;i++)
{
if(parsers+.is($.trim(getElementText(table.config,node)),table,node))
{
return parsers+;
}
}
return parsers[0];
}function getParserById(name)
{var l=parsers.length;
for(var i=0;i<l;i++)
{
if(parsers+.id.toLowerCase()==name.toLowerCase())
{
return parsers+;
}
}
return
false;
}function buildCache(table)
{
if(table.config.debug)
{var cacheTime=
new Date();
}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache=
{row:[],normalized:[]
};
for(var i=0;i<totalRows;++i)
{var c=table.tBodies[0].rows+,cols=[];cache.row.push($(c));
for(var j=0;j<totalCells;++j)
{cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j]));
}cols.push(i);cache.normalized.push(cols);cols=
null;
};
if(table.config.debug)
{benchmark(
"Building cache for "+totalRows+
" rows:",cacheTime);
}
return cache;
};function getElementText(config,node)
{
if(!node)return
"";var t=
"";
if(config.textExtraction==
"simple")
{
if(node.childNodes[0]&&node.childNodes[0].hasChildNodes())
{t=node.childNodes[0].innerHTML;
}
else
{t=node.innerHTML;
}
}
else
{
if(typeof(config.textExtraction)==
"function")
{t=config.textExtraction(node);
}
else
{t=$(node).text();
}
}
return t;
}function appendToTable(table,cache)
{
if(table.config.debug)
{var appendTime=
new Date()
}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];
for(var i=0;i<totalRows;i++)
{rows.push(r[n+[checkCell]]);
if(!table.config.appender)
{var o=r[n+[checkCell]];var l=o.length;
for(var j=0;j<l;j++)
{tableBody[0].appendChild(o[j]);
}
}
}
if(table.config.appender)
{table.config.appender(table,rows);
}rows=
null;
if(table.config.debug)
{benchmark(
"Rebuilt table:",appendTime);
}applyWidget(table);setTimeout(function()
{$(table).trigger(
"sortEnd");
},0);
};function buildHeaders(table)
{
if(table.config.debug)
{var time=
new Date();
}var meta=($.metadata)?
true:false,tableHeadersRows=[];
for(var i=0;i<table.tHead.rows.length;i++)
{tableHeadersRows+=0;
};$tableHeaders=$(
"thead th",table);$tableHeaders.each(function(index)
{this.count=0;this.column=index;this.order=formatSortingOrder(table.config.sortInitialOrder);
if(checkHeaderMetadata(
this)||checkHeaderOptions(table,index))this.sortDisabled=
true;
if(!this.sortDisabled)
{$(
this).addClass(table.config.cssHeader);
}table.config.headerList[index]=
this;
});
if(table.config.debug)
{benchmark(
"Built headers:",time);log($tableHeaders);
}
return $tableHeaders;
};function checkCellColSpan(table,rows,row)
{var arr=[],r=table.tHead.rows,c=r[row].cells;
for(var i=0;i<c.length;i++)
{var cell=c+;
if(cell.colSpan>1)
{arr=arr.concat(checkCellColSpan(table,headerArr,row++));
}
else
{
if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1]))
{arr.push(cell);
}
}
}
return arr;
};function checkHeaderMetadata(cell)
{
if(($.metadata)&&($(cell).metadata().sorter===
false))
{
return
true;
};
return
false;
}function checkHeaderOptions(table,i)
{
if((table.config.headers+)&&(table.config.headers+.sorter===
false))
{
return
true;
};
return
false;
}function applyWidget(table)
{var c=table.config.widgets;var l=c.length;
for(var i=0;i<l;i++)
{getWidgetById(c+).format(table);
}
}function getWidgetById(name)
{var l=widgets.length;
for(var i=0;i<l;i++)
{
if(widgets+.id.toLowerCase()==name.toLowerCase())
{
return widgets+;
}
}
};function formatSortingOrder(v)
{
if(typeof(v)!=
"Number")
{i=(v.toLowerCase()==
"desc")?1:0;
}
else
{i=(v==(0||1))?v:0;
}
return i;
}function isValueInArray(v,a)
{var l=a.length;
for(var i=0;i<l;i++)
{
if(a+[0]==v)
{
return
true;
}
}
return
false;
}function setHeadersCss(table,$headers,list,css)
{$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset)
{
if(!this.sortDisabled)
{h[this.column]=$(
this);
}
});var l=list.length;
for(var i=0;i<l;i++)
{h[list+[0]].addClass(css[list+[1]]);
}
}function fixColumnWidth(table,$headers)
{var c=table.config;
if(c.widthFixed)
{var colgroup=$(
'<colgroup>');$(
"tr:first td",table.tBodies[0]).each(function()
{colgroup.append($(
'<col>').css(
'width',$(
this).width()));
});$(table).prepend(colgroup);
};
}function updateHeaderSortCount(table,sortList)
{var c=table.config,l=sortList.length;
for(var i=0;i<l;i++)
{var s=sortList+,o=c.headerList[s[0]];o.count=s[1];o.count++;
}
}function multisort(table,sortList,cache)
{
if(table.config.debug)
{var sortTime=
new Date();
}var dynamicExp=
"var sortWrapper = function(a,b) {",l=sortList.length;
for(var i=0;i<l;i++)
{var c=sortList+[0];var order=sortList+[1];var s=(getCachedSortType(table.config.parsers,c)==
"text")?((order==0)?
"sortText":
"sortTextDesc"):((order==0)?
"sortNumeric":
"sortNumericDesc");var e=
"e"+i;dynamicExp+=
"var "+e+
" = "+s+
"(a["+c+
"],b["+c+
"]); ";dynamicExp+=
"if("+e+
") { return "+e+
"; } ";dynamicExp+=
"else { ";
}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+=
"return a["+orgOrderCol+
"]-b["+orgOrderCol+
"];";
for(var i=0;i<l;i++)
{dynamicExp+=
"}; ";
}dynamicExp+=
"return 0; ";dynamicExp+=
"}; ";eval(dynamicExp);cache.normalized.sort(sortWrapper);
if(table.config.debug)
{benchmark(
"Sorting on "+sortList.toString()+
" and dir "+order+
" time:",sortTime);
}
return cache;
};function sortText(a,b)
{
return((a<b)?-1:((a>b)?1:0));
};function sortTextDesc(a,b)
{
return((b<a)?-1:((b>a)?1:0));
};function sortNumeric(a,b)
{
return a-b;
};function sortNumericDesc(a,b)
{
return b-a;
};function getCachedSortType(parsers,i)
{
return parsers+.type;
};this.construct=function(settings)
{
return this.each(function()
{
if(!this.tHead||!this.tBodies)
return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config=
{
};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(
this);$headers=buildHeaders(
this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(
this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(
this);$headers.click(function(e)
{$this.trigger(
"sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;
if(!this.sortDisabled&&totalRows>0)
{var $cell=$(
this);var i=this.column;this.order=this.count++%2;
if(!e[config.sortMultiSortKey])
{config.sortList=[];
if(config.sortForce!=
null)
{var a=config.sortForce;
for(var j=0;j<a.length;j++)
{
if(a[j][0]!=i)
{config.sortList.push(a[j]);
}
}
}config.sortList.push([i,this.order]);
}
else
{
if(isValueInArray(i,config.sortList))
{
for(var j=0;j<config.sortList.length;j++)
{var s=config.sortList[j],o=config.headerList[s[0]];
if(s[0]==i)
{o.count=s[1];o.count++;s[1]=o.count%2;
}
}
}
else
{config.sortList.push([i,this.order]);
}
};setTimeout(function()
{setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));
},1);
return
false;
}
}).mousedown(function()
{
if(config.cancelSelection)
{this.onselectstart=function()
{
return
false
};
return
false;
}
});$this.bind(
"update",function()
{this.config.parsers=buildParserCache(this,$headers);cache=buildCache(
this);
}).bind(
"sorton",function(e,list)
{$(
this).trigger(
"sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));
}).bind(
"appendCache",function()
{appendToTable(this,cache);
}).bind(
"applyWidgetId",function(e,id)
{getWidgetById(id).format(
this);
}).bind(
"applyWidgets",function()
{applyWidget(
this);
});
if($.metadata&&($(
this).metadata()&&$(
this).metadata().sortlist))
{config.sortList=$(
this).metadata().sortlist;
}
if(config.sortList.length>0)
{$this.trigger(
"sorton",[config.sortList]);
}applyWidget(
this);
});
};this.addParser=function(parser)
{var l=parsers.length,a=
true;
for(var i=0;i<l;i++)
{
if(parsers+.id.toLowerCase()==parser.id.toLowerCase())
{a=
false;
}
}
if(a)
{parsers.push(parser);
};
};this.addWidget=function(widget)
{widgets.push(widget);
};this.formatFloat=function(s)
{var i=parseFloat(s);
return(isNaN(i))?0:i;
};this.formatInt=function(s)
{var i=parseInt(s);
return(isNaN(i))?0:i;
};this.isDigit=function(s,config)
{var DECIMAL=
'\\'+config.decimal;var exp='/(^[+]?0(
'+DECIMAL+'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)
'+DECIMAL+'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*
'+DECIMAL+'0+$)/
';return RegExp(exp).test($.trim(s));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a+;if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'
'));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]
{2
}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
},format:function(s)
{
return $.tablesorter.formatFloat(
new Date(s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"shortDate",is:function(s)
{return/\d
{1,2
}[\/\-]\d
{1,2
}[\/\-]\d
{2,4
}/.test(s);
},format:function(s,table)
{var c=table.config;s=s.replace(/\-/g,
"/");
if(c.dateFormat==
"us")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{4
})/,
"$3/$1/$2");
}
else
if(c.dateFormat==
"uk")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{4
})/,
"$3/$2/$1");
}
else
if(c.dateFormat==
"dd/mm/yy"||c.dateFormat==
"dd-mm-yy")
{s=s.replace(/(\d
{1,2
})[\/\-](\d
{1,2
})[\/\-](\d
{2
})/,
"$1/$2/$3");
}
return $.tablesorter.formatFloat(
new Date(s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"time",is:function(s)
{return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
},format:function(s)
{
return $.tablesorter.formatFloat(
new Date(
"2000/01/01 "+s).getTime());
},type:
"numeric"
});ts.addParser(
{id:
"metadata",is:function(s)
{
return
false;
},format:function(s,table,cell)
{var c=table.config,p=(!c.parserMetadataName)?
'sortValue':c.parserMetadataName;
return $(cell).metadata()[p];
},type:
"numeric"
});ts.addWidget(
{id:
"zebra",format:function(table)
{
if(table.config.debug)
{var time=
new Date();
}$(
"tr:visible",table.tBodies[0]).filter(
':even').removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]).end().filter(
':odd').removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);
if(table.config.debug)
{$.tablesorter.benchmark(
"Applying Zebra widget",time);
}
}
});
})(jQuery); </script> <script type=
"text/javascript"> (function($)
{ $.extend(
{ tablesorterPager:
new function()
{ function updatePageDisplay(c)
{ var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);
} function setPageSize(table,size)
{ var c = table.config; c.size = size; c.totalPages = Math.ceil(c.totalRows / c.size); c.pagerPositionSet =
false; moveToPage(table); fixPosition(table);
} function fixPosition(table)
{ var c = table.config;
if(!c.pagerPositionSet && c.positionFixed)
{ var c = table.config, o = $(table);
if(o.offset)
{ c.container.css(
{ top: o.offset().top + o.height() +
'px', position:
'absolute'
});
} c.pagerPositionSet =
true;
}
} function moveToFirstPage(table)
{ var c = table.config; c.page = 0; moveToPage(table);
} function moveToLastPage(table)
{ var c = table.config; c.page = (c.totalPages-1); moveToPage(table);
} function moveToNextPage(table)
{ var c = table.config; c.page++;
if(c.page >= (c.totalPages-1))
{ c.page = (c.totalPages-1);
} moveToPage(table);
} function moveToPrevPage(table)
{ var c = table.config; c.page--;
if(c.page <= 0)
{ c.page = 0;
} moveToPage(table);
} function moveToPage(table)
{ var c = table.config;
if(c.page < 0 || c.page > (c.totalPages-1))
{ c.page = 0;
} renderTable(table,c.rowsCopy);
} function renderTable(table,rows)
{ var c = table.config; var l = rows.length; var s = (c.page * c.size); var e = (s + c.size);
if(e > rows.length )
{ e = rows.length;
} var tableBody = $(table.tBodies[0]);
// clear the table body $.tablesorter.clearTableBody(table);
for(var i = s; i < e; i++)
{
//tableBody.append(rows+); var o = rows+; var l = o.length;
for(var j=0; j < l; j++)
{ tableBody[0].appendChild(o[j]);
}
} fixPosition(table,tableBody); $(table).trigger(
"applyWidgets");
if( c.page >= c.totalPages )
{ moveToLastPage(table);
} updatePageDisplay(c);
} this.appender = function(table,rows)
{ var c = table.config; c.rowsCopy = rows; c.totalRows = rows.length; c.totalPages = Math.ceil(c.totalRows / c.size); renderTable(table,rows);
}; this.defaults =
{ size: 10, offset: 0, page: 0, totalRows: 0, totalPages: 0, container: null, cssNext:
'.next', cssPrev:
'.prev', cssFirst:
'.first', cssLast:
'.last', cssPageDisplay:
'.pagedisplay', cssPageSize:
'.pagesize', seperator:
"/", positionFixed: true, appender: this.appender
}; this.construct = function(settings)
{
return this.each(function()
{ config = $.extend(this.config, $.tablesorterPager.defaults, settings); var table = this, pager = config.container; $(
this).trigger(
"appendCache"); config.size = parseInt($(
".pagesize",pager).val()); $(config.cssFirst,pager).click(function()
{ moveToFirstPage(table);
return
false;
}); $(config.cssNext,pager).click(function()
{ moveToNextPage(table);
return
false;
}); $(config.cssPrev,pager).click(function()
{ moveToPrevPage(table);
return
false;
}); $(config.cssLast,pager).click(function()
{ moveToLastPage(table);
return
false;
}); $(config.cssPageSize,pager).change(function()
{ setPageSize(table,parseInt($(
this).val()));
return
false;
});
});
};
}
});
// extend plugin scope $.fn.extend(
{ tablesorterPager: $.tablesorterPager.construct
});
})(jQuery); </script> <script type=
"text/javascript" > $(document).ready(function()
{ $(
"#myTable").tablesorter(
{widgets: [
'zebra']
});
} ); </script> </head> <body> <table id=
"myTable" class=
"tablesorter"> <thead> <tr> <th>Computer ID</th> <th>Name</th> <th>Location by IP</th> <th>Last Report Time</th> <th>Time Since Last Report</th> </tr> </thead> <tbody> <?Relevance concatenation of trs of (concatenation of tds of item 0 of it & concatenation of tds of item 1 of it & concatenation of tds of item 2 of it & concatenation of tds of item 3 of it & concatenation of tds of item 4 of it) of (id of it as string, names of it, (
if exists results (it, bes properties
"Location By IP Range") then values of results (it, bes properties
"Location By IP Range") as string
else
""), last report time of it as string, (now - last report time of it) as string) of (bes computers whose ( (now - last report time of it) > (
"01:30:00" as time interval) and (relay server flag of it =
true))) ?> </tbody> </table> </body> </html>
I tried to simplify the relevance a bit so that it’s easier to understand. I hope that helps.