
jQuery.fn.tableSorter=function(o){var defaults={sortDir:0,sortColumn:null,sortClassAsc:'ascending',sortClassDesc:'descending',headerClass:null,stripingRowClass:false,highlightClass:false,rowLimit:0,minRowsForWaitingMsg:0,disableHeader:-1,stripRowsOnStartUp:false,columnParser:false,rowHighlightClass:true,useCache:true,debug:false,textExtraction:'simple',features:{},styles:{},textExtractionCustom:false,bind:false,addHeaderLink:false,dateFormat:'mm/dd/yyyy'};return this.each(function(){jQuery.extend(defaults,o);var COLUMN_DATA=[];var COLUMN_CACHE=[];var COLUMN_INDEX;var COLUMN_SORTER_CACHE=[];var COLUMN_CELL;var COLUMN_DIR;var COLUMN_HEADER_LENGTH;var ROW_LAST_HIGHLIGHT_OBJ=false;var COLUMN_LAST_INDEX=-1;var COLUMN_LAST_DIR=defaults.sortDir;var oTable=this;if(defaults.stripRowsOnStartUp&&defaults.stripingRowClass){jQuery.tableSorter.utils.stripRows(oTable,defaults);}
if(defaults.bind){jQuery(this).bind(defaults.bind,doSorting);}
var tableRowLength=oTable.tBodies[0].rows.length-1;buildColumnDataIndex();function buildColumnHeaders(){var oFirstTableRow=oTable.rows[0];var oDataSampleRow=oTable.rows[1];COLUMN_HEADER_LENGTH=oFirstTableRow.cells.length;for(var i=0;i<COLUMN_HEADER_LENGTH;i++){var oCell=oFirstTableRow.cells[i];if(!jQuery.tableSorter.utils.isHeaderDisabled(oCell,defaults.disableHeader,i)){jQuery.tableSorter.utils.setParams(defaults);var oCellValue=jQuery.tableSorter.utils.getElementText(oDataSampleRow.cells[i],'columns',i);if(typeof(defaults.sortColumn)=="string"){if(defaults.sortColumn.toLowerCase()==jQuery.tableSorter.utils.getElementText(oCell,'header',i).toLowerCase()){defaults.sortColumn=i;}}
COLUMN_SORTER_CACHE[i]=jQuery.tableSorter.analyzer.analyseString(oCellValue,defaults);if(defaults.columnParser){var a=defaults.columnParser;var l=a.length;for(var j=0;j<l;j++){if(i==a[j][0]){COLUMN_SORTER_CACHE[i]=jQuery.tableSorter.analyzer.getById(a[j][1]);continue;}}}
if(defaults.headerClass){jQuery(oCell).addClass(defaults.headerClass);}
if(defaults.addHeaderLink){jQuery(oCell).wrapInner({element:'<a href="#">',name:'a',className:'sorter'});jQuery(".sorter",oCell).click(function(e){sortOnColumn(jQuery(this).parent(),(jQuery(this).parent()[0].count++)%2,jQuery(this).parent()[0].index);return false;});}else{jQuery(oCell).click(function(e){sortOnColumn(jQuery(this),(jQuery(this)[0].count++)%2,jQuery(this)[0].index);return false;});}
oCell.index=i;oCell.count=defaults.sortDir;}}
addColGroup(oFirstTableRow);if(defaults.sortColumn!=null){jQuery(oFirstTableRow.cells[defaults.sortColumn]).trigger("click");}
if(defaults.rowHighlightClass){jQuery("> tbody:first/tr",oTable).click(function(){if(ROW_LAST_HIGHLIGHT_OBJ){ROW_LAST_HIGHLIGHT_OBJ.removeClass(defaults.rowHighlightClass);}
ROW_LAST_HIGHLIGHT_OBJ=jQuery(this).addClass(defaults.rowHighlightClass);});}}
function buildColumnDataIndex(){var l=oTable.tBodies[0].rows.length;for(var i=0;i<l;i++){COLUMN_DATA.push(oTable.tBodies[0].rows[i]);}
buildColumnHeaders();}
function addColGroup(columnsHeader){var oSampleTableRow=oTable.rows[1];for(var i=0;i<COLUMN_HEADER_LENGTH;i++){if(oSampleTableRow.cells[i])
jQuery(columnsHeader.cells[i]).css("width",oSampleTableRow.cells[i].clientWidth+"px");}}
function filterColumn(oCell,index){COLUMN_INDEX=index;var flatData=jQuery.tableSorter.data.flatten(COLUMN_DATA,COLUMN_SORTER_CACHE,index);var l=flatData.length;var p=COLUMN_SORTER_CACHE[COLUMN_INDEX];var f=jQuery.tableSorter.filter[p.filter];var o=jQuery("#filter");o.show().empty();flatData.sort(p.sorter);f.render(o,flatData[0][1],flatData[l-1][1]);o.append('<div><input type="reset" value="clear"/><input type="submit" value="apply"/></div>');jQuery('input[@type="submit"]',o).click(function(){var min=jQuery('input[@name="min"]',o).val();var max=jQuery('input[@name="max"]',o).val();jQuery.tableSorter.filter.applyFilter(min,max);});jQuery('input[@type="reset"]',o).click(function(){jQuery.tableSorter.filter.resetFilter();o.hide();});var d={oTable:oTable,defaults:defaults,f:f,data:flatData,type:p.filter,columnData:COLUMN_DATA,index:COLUMN_INDEX,lastIndex:COLUMN_LAST_INDEX}
jQuery.tableSorter.filter.setData(d);}
function sortOnColumn(oCell,dir,index){if(tableRowLength>defaults.minRowsForWaitingMsg){jQuery.event.trigger("sortStart");}
COLUMN_INDEX=index;COLUMN_CELL=oCell;COLUMN_DIR=dir;jQuery("th."+defaults.sortClassAsc,oTable).removeClass(defaults.sortClassAsc);jQuery("th."+defaults.sortClassDesc,oTable).removeClass(defaults.sortClassDesc);jQuery(COLUMN_CELL).addClass((dir%2?defaults.sortClassAsc:defaults.sortClassDesc));if(defaults.highlightClass){if(COLUMN_LAST_INDEX!=COLUMN_INDEX&&COLUMN_LAST_INDEX>-1){jQuery("> tbody:first/tr",o).find("> td:eq("+COLUMN_LAST_INDEX+")").removeClass(defaults.highlightClass).end();}}
setTimeout(doSorting,0);}
function doSorting(){if(COLUMN_INDEX>=0){var columns;if(jQuery.tableSorter.cache.exist(COLUMN_CACHE,COLUMN_INDEX)&&defaults.useCache){var cache=jQuery.tableSorter.cache.get(COLUMN_CACHE,COLUMN_INDEX);if(cache.dir==COLUMN_DIR){columns=cache.data;cache.dir=COLUMN_DIR;}else{columns=cache.data.reverse();cache.dir=COLUMN_DIR;}}else{var flatData=jQuery.tableSorter.data.flatten(COLUMN_DATA,COLUMN_SORTER_CACHE,COLUMN_INDEX);flatData.sort(COLUMN_SORTER_CACHE[COLUMN_INDEX].sorter);if(COLUMN_LAST_DIR!=COLUMN_DIR){flatData.reverse();}
columns=jQuery.tableSorter.data.rebuild(COLUMN_DATA,flatData,COLUMN_INDEX,COLUMN_LAST_INDEX);jQuery.tableSorter.cache.add(COLUMN_CACHE,COLUMN_INDEX,COLUMN_DIR,columns);flatData=null;}
jQuery.tableSorter.utils.appendToTable(oTable,columns,defaults,COLUMN_INDEX,COLUMN_LAST_INDEX);columns=null;if(tableRowLength>defaults.minRowsForWaitingMsg){jQuery.event.trigger("sortStop",[COLUMN_INDEX]);}
COLUMN_LAST_INDEX=COLUMN_INDEX;}}});};jQuery.fn.sortStart=function(fn){return this.bind("sortStart",fn);};jQuery.fn.sortReload=function(fn){return this.bind("sortStart",fn);};jQuery.fn.sortStop=function(fn){return this.bind("sortStop",fn);};jQuery.tableSorter={params:{},cache:{add:function(cache,index,dir,data){var oCache={};oCache.dir=dir;oCache.data=data;cache[index]=oCache;},get:function(cache,index){return cache[index];},exist:function(cache,index){var oCache=cache[index];if(!oCache){return false}else{return true}}},data:{flatten:function(columnData,columnCache,columnIndex){var flatData=[];var l=columnData.length;for(var i=0;i<l;i++){flatData.push([i,columnCache[columnIndex].format(jQuery.tableSorter.utils.getElementText(columnData[i].cells[columnIndex],'columns',columnIndex))]);}
return flatData;},rebuild:function(columnData,flatData,columnIndex,columnLastIndex){var l=flatData.length;var sortedData=[];for(var i=0;i<l;i++){sortedData.push(columnData[flatData[i][0]]);}
return sortedData;}},sorters:{},parsers:{},analyzer:{analyzers:[],add:function(analyzer){this.analyzers.push(analyzer);},analyseString:function(s,params){jQuery.tableSorter.utils.setParams(params);var l=this.analyzers.length;var foundAnalyzer=false;for(var i=0;i<l;i++){var analyzer=this.analyzers[i];if(analyzer.is(s)){foundAnalyzer=true;return analyzer;continue;}}
if(!foundAnalyzer){return jQuery.tableSorter.parsers.generic;}},getById:function(s){var l=this.analyzers.length;for(var i=0;i<l;i++){var analyzer=this.analyzers[i];if(analyzer.id==s){return analyzer;continue;}}}},utils:{setParams:function(o){jQuery.tableSorter.params=o;},getParams:function(){return jQuery.tableSorter.params;},getElementText:function(o,type,index){if(!o)return"";var defaults=jQuery.tableSorter.utils.getParams();var elementText="";if(type=='header'){elementText=jQuery(o).text();}else if(type=='columns'){if(defaults.textExtractionCustom&&typeof(defaults.textExtractionCustom[index])=="function"){elementText=defaults.textExtractionCustom[index](o);}else{if(defaults.textExtraction=='simple'){if(o.childNodes[0]&&o.childNodes[0].hasChildNodes()){elementText=o.childNodes[0].innerHTML;}else{elementText=o.innerHTML;}}else if(defaults.textExtraction=='complex'){elementText=jQuery(o).text();}}}
return elementText;},appendToTable:function(o,c,defaults,index,lastIndex){var l=c.length;jQuery("> tbody:first",o).empty().append(c);if(defaults.stripingRowClass){jQuery("> tbody:first/tr",o).removeClass(defaults.stripingRowClass[0]).removeClass(defaults.stripingRowClass[1]);jQuery.tableSorter.utils.stripRows(o,defaults);}
if(defaults.highlightClass){jQuery("> tbody:first/tr",o).find("> td:eq("+index+")").addClass(defaults.highlightClass).end();}
c=null;},stripRows:function(o,defaults){jQuery("> tbody:first/tr:visible:even",o).addClass(defaults.stripingRowClass[0]);jQuery("> tbody:first/tr:visible:odd",o).addClass(defaults.stripingRowClass[1]);},isHeaderDisabled:function(o,arg,index){if(typeof(arg)=="number"){return(arg==index)?true:false;}else if(typeof(arg)=="string"){return(arg.toLowerCase()==jQuery.tableSorter.utils.getElementText(o,'header',index).toLowerCase())?true:false;}else if(arg.parentNode){return(o==arg)?true:false}else if(typeof(arg)=="object"){var l=arg.length;if(!this.lastFound){this.lastFound=-1;}
for(var i=0;i<l;i++){var val=jQuery.tableSorter.utils.isHeaderDisabled(o,arg[i],index);if(this.lastFound!=i&&val){this.lastFound=i;return val;}}}else{return false}}},sorters:{generic:function(a,b){return((a[1]<b[1])?-1:((a[1]>b[1])?1:0));},numeric:function(a,b){return a[1]-b[1];}}};jQuery.fn.wrapInner=function(o){return this.each(function(){var jQ=jQuery(this);var c=jQ.html();jQ.empty().append(o.element).find(o.name).html(c).addClass(o.className).end();});};jQuery.tableSorter.parsers.generic={id:'generic',is:function(s){return true;},format:function(s){return s.toLowerCase();},filter:'text',sorter:jQuery.tableSorter.sorters.generic};jQuery.tableSorter.parsers.currency={id:'currency',is:function(s){return s.match(new RegExp(/^[£$]/));},format:function(s){return parseFloat(s.replace(new RegExp(/[^0-9.]/g),''));},filter:'numeric',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.integer={id:'integer',is:function(s){return s.match(new RegExp(/^\b\d+\d\bjQuery/));},format:function(s){return parseInt(s);},filter:'numeric',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.floating={id:'floating',is:function(s){return s.match(new RegExp(/(\+|-)?[0-9]+\.[0-9]+((E|e)(\+|-)?[0-9]+)?/));},format:function(s){return parseFloat(s.replace(new RegExp(/,/),''));},filter:'numeric',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.ipAddress={id:'ipAddress',is:function(s){return s.match(new RegExp(/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/));},format:function(s){var a=s.split('.');var r='';for(var i=0,item;item=a[i];i++){if(item.length==2){r+='0'+item;}else{r+=item;}}
return parseFloat(r);},filter:'numeric',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.url={id:'url',is:function(s){return s.match(new RegExp(/(https?|ftp|file):\/\//));},format:function(s){return s.replace(new RegExp(/(https?|ftp|file):\/\//),'');},filter:'text',sorter:jQuery.tableSorter.sorters.generic};jQuery.tableSorter.parsers.isoDate={id:'isoDate',is:function(s){return s.match(new RegExp(/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/));},format:function(s){return parseFloat(new Date(s.replace(new RegExp(/-/g),'/')).getTime());},filter:'date',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.usLongDate={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 parseFloat((new Date(s)).getTime());},filter:'date',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.shortDate={id:'shortDate',is:function(s){return s.match(new RegExp(/\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}/));},format:function(s){s=s.replace(new RegExp(/-/g),'/');var defaults=jQuery.tableSorter.utils.getParams();if(defaults.dateFormat=="mm/dd/yyyy"||defaults.dateFormat=="mm-dd-yyyy"){s=s.replace(new RegExp(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{4})/),'$3/$1/$2');}else if(defaults.dateFormat=="dd/mm/yyyy"||defaults.dateFormat=="dd-mm-yyyy"){s=s.replace(new RegExp(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{4})/),'$3/$2/$1');}
return parseFloat((new Date(s)).getTime());},filter:'date',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.time={id:'time',is:function(s){return s.toUpperCase().match(new RegExp(/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return parseFloat((new Date("2000/01/01 "+s)).getTime());},filter:'date',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.parsers.checkbox={id:'input',is:function(s){return s.toLowerCase().match(/<input[^>]*checkbox[^>]*/i);;},format:function(s){var integer=0;if(s.toLowerCase().match(/<input[^>]*checked*/i)){integer=1;}
return integer;},filter:'checkbox',sorter:jQuery.tableSorter.sorters.numeric};jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.currency);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.integer);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.floating);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.isoDate);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.shortDate);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.usLongDate);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.ipAddress);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.url);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.time);jQuery.tableSorter.analyzer.add(jQuery.tableSorter.parsers.checkbox);