/*
 *
 * TableSorter - Client-side table sorting with ease!
 *
 * Copyright (c) 2006 Christian Bach (http://motherrussia.polyester.se)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * jQueryDate: 
 * jQueryAuthor: Christian jQuery
 *
 */
(function($){$.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,stripeRowsOnStartUp:false,columnParser:false,rowHighlightClass:false,useCache:true,debug:false,textExtraction:'simple',textExtractionCustom:false,textExtractionType:false,bind:true,addHeaderLink:false,lockedSortDir:false,enableResize:false,dateFormat:'mm/dd/yyyy'};return this.each(function(){$.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 COLUMN_ROW_LENGTH;var ROW_LAST_HIGHLIGHT_OBJ=false;var COLUMN_LAST_INDEX=-1;var COLUMN_LAST_DIR=defaults.sortDir;var oTable=this;if(defaults.stripeRowsOnStartUp&&defaults.stripingRowClass){$.tableSorter.utils.stripeRows(defaults,oTable);}
$(this).bind("resort",doSorting);$(this).bind("flushCache",function(event){COLUMN_CACHE=[];});$(this).bind("updateColumnData",buildColumnDataIndex);var tableRowLength=(oTable.tBodies[0]&&oTable.tBodies[0].rows.length-1)||0;buildColumnDataIndex();buildColumnHeaders();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(oDataSampleRow&&!$.tableSorter.utils.isHeaderDisabled(defaults,oCell,defaults.disableHeader,i)){var oCellValue=$.tableSorter.utils.getElementText(defaults,oDataSampleRow.cells[i],'columns',i);if(typeof(defaults.sortColumn)=="string"){if(defaults.sortColumn.toLowerCase()==$.tableSorter.utils.getElementText(defaults,oCell,'header',i).toLowerCase()){defaults.sortColumn=i;}}
COLUMN_SORTER_CACHE[i]=$.tableSorter.analyzer.analyseString(defaults,oCellValue);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]=$.tableSorter.analyzer.getById(a[j][1]);continue;}}}
if(defaults.headerClass){$(oCell).addClass(defaults.headerClass);}
if(defaults.addHeaderLink){$(oCell).wrapInner({element:'<a href="#">',name:'a',className:'sorter'});$(".sorter",oCell).click(function(e){sortOnColumn($(this).parent(),((defaults.lockedSortDir)?defaults.lockedSortDir:$(this).parent()[0].count++)%2,$(this).parent()[0].index);return false;});}else{$(oCell).click(function(e){sortOnColumn($(this),((defaults.lockedSortDir)?defaults.lockedSortDir:$(this)[0].count++)%2,$(this)[0].index);return false;});}
oCell.index=i;oCell.count=defaults.sortDir;}}
if(defaults.enableResize){addColGroup(oFirstTableRow);}
if(defaults.sortColumn!=null){$(oFirstTableRow.cells[defaults.sortColumn]).trigger("click");}
if(defaults.rowHighlightClass){$("> tbody:first/tr",oTable).click(function(){if(ROW_LAST_HIGHLIGHT_OBJ){ROW_LAST_HIGHLIGHT_OBJ.removeClass(defaults.rowHighlightClass);}
ROW_LAST_HIGHLIGHT_OBJ=$(this).addClass(defaults.rowHighlightClass);});}}
function buildColumnDataIndex(){COLUMN_DATA=[];COLUMN_CACHE=[];COLUMN_ROW_LENGTH=(oTable.tBodies[0]&&oTable.tBodies[0].rows.length)||0;var l=COLUMN_ROW_LENGTH;for(var i=0;i<l;i++){COLUMN_DATA.push(oTable.tBodies[0].rows[i]);}}
function addColGroup(columnsHeader){var oSampleTableRow=oTable.rows[1];for(var i=0;i<COLUMN_HEADER_LENGTH;i++){if(oSampleTableRow&&oSampleTableRow.cells[i])
$(columnsHeader.cells[i]).css("width",oSampleTableRow.cells[i].clientWidth+"px");}}
function sortOnColumn(oCell,dir,index){if(tableRowLength>defaults.minRowsForWaitingMsg){$(oTable).trigger("sortStart");}
COLUMN_INDEX=index;COLUMN_CELL=oCell;COLUMN_DIR=dir;$("th",oTable).removeClass(defaults.sortClassAsc).removeClass(defaults.sortClassDesc);$(COLUMN_CELL).addClass((dir%2?defaults.sortClassAsc:defaults.sortClassDesc));if(defaults.highlightClass){if(COLUMN_LAST_INDEX!=COLUMN_INDEX&&COLUMN_LAST_INDEX>-1){$("> 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($.tableSorter.cache.exist(COLUMN_CACHE,COLUMN_INDEX)&&defaults.useCache){var cache=$.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=$.tableSorter.data.flatten(defaults,COLUMN_DATA,COLUMN_SORTER_CACHE,COLUMN_INDEX);flatData.sort(COLUMN_SORTER_CACHE[COLUMN_INDEX].sorter);if(COLUMN_LAST_DIR!=COLUMN_DIR){flatData.reverse();}
columns=$.tableSorter.data.rebuild(COLUMN_DATA,flatData,COLUMN_INDEX,COLUMN_LAST_INDEX);$.tableSorter.cache.add(COLUMN_CACHE,COLUMN_INDEX,COLUMN_DIR,columns);flatData=null;}
$.tableSorter.utils.appendToTable(defaults,oTable,columns,defaults,COLUMN_INDEX,COLUMN_LAST_INDEX);columns=null;if(tableRowLength>defaults.minRowsForWaitingMsg){$(oTable).trigger("sortStop",[COLUMN_INDEX]);}
COLUMN_LAST_INDEX=COLUMN_INDEX;}}});};$.fn.sortStart=function(fn){return this.bind("sortStart",fn);};$.fn.sortReload=function(fn){return this.bind("sortStart",fn);};$.fn.sortStop=function(fn){return this.bind("sortStop",fn);};$.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}},clear:function(cache){cache=[];}},data:{flatten:function(defaults,columnData,columnCache,columnIndex){var flatData=[];var l=columnData.length;for(var i=0;i<l;i++){flatData.push([i,columnCache[columnIndex].format($.tableSorter.utils.getElementText(defaults,columnData[i].cells[columnIndex],'columns',columnIndex),defaults)]);}
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);},add_to_front:function(analyzer){this.analyzers.unshift(analyzer);},analyseString:function(defaults,s){var found=false;var analyzer=$.tableSorter.parsers.generic;var list=this.analyzers;$.each(list,function(i){if(!found){if(list[i].is(s)){found=true;analyzer=list[i];}}});return analyzer;},getById:function(s){var list=this.analyzers;var analyzer=$.tableSorter.parsers.generic;$.each(list,function(i){if(list[i].id==s){analyzer=list[i];}});return analyzer;}},utils:{getElementText:function(defaults,o,type,index){if(!o)return"";var elementText="";if(type=='header'){elementText=$(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(typeof(defaults.textExtractionType)=="object"){var d=defaults.textExtractionType;$.each(d,function(i){var val=o[d[i]];if(val&&val.length>0){elementText=val;}});}else{if(o.childNodes[0]&&o.childNodes[0].hasChildNodes()){elementText=o.childNodes[0].innerHTML;}else{elementText=o.innerHTML;}}}else if(defaults.textExtraction=='complex'){elementText=$(o).text();}}}
return elementText;},appendToTable:function(defaults,o,c,index,lastIndex){var l=c.length;$("> tbody:first",o).empty().append(c);if(defaults.stripingRowClass){$("> tbody:first/tr",o).removeClass(defaults.stripingRowClass[0]).removeClass(defaults.stripingRowClass[1]);$.tableSorter.utils.stripeRows(defaults,o);}
if(defaults.highlightClass){$("> tbody:first/tr",o).find("> td:eq("+index+")").addClass(defaults.highlightClass).end();}
c=null;},stripeRows:function(defaults,o){$("> tbody:first/tr:visible:even",o).addClass(defaults.stripingRowClass[0]);$("> tbody:first/tr:visible:odd",o).addClass(defaults.stripingRowClass[1]);},isHeaderDisabled:function(defaults,o,arg,index){if(typeof(arg)=="number"){return(arg==index)?true:false;}else if(typeof(arg)=="string"){return(arg.toLowerCase()==$.tableSorter.utils.getElementText(defaults,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=$.tableSorter.utils.isHeaderDisabled(defaults,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];}}};$.tableSorter.parsers.generic={id:'generic',is:function(s){return true;},format:function(s){return s.toLowerCase();},sorter:$.tableSorter.sorters.generic};$.tableSorter.parsers.currency={id:'currency',is:function(s){return s.match(new RegExp(/^[£$?.]/g));},format:function(s){return parseFloat(s.replace(new RegExp(/[^0-9.]/g),''));},sorter:$.tableSorter.sorters.numeric};$.tableSorter.parsers.integer={id:'integer',is:function(s){return s.match(new RegExp(/^\d+$/));},format:function(s){return parseFloat(s);},sorter:$.tableSorter.sorters.numeric};$.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(/,/),''));},sorter:$.tableSorter.sorters.numeric};$.tableSorter.parsers.ipAddress={id:'ipAddress',is:function(s){return s.match(/^\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);},sorter:$.tableSorter.sorters.numeric};$.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):\/\//),'');},sorter:$.tableSorter.sorters.generic};$.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());},sorter:$.tableSorter.sorters.numeric};$.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());},sorter:$.tableSorter.sorters.numeric};$.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,defaults){s=s.replace(new RegExp(/-/g),'/');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());},sorter:$.tableSorter.sorters.numeric};$.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());},sorter:$.tableSorter.sorters.numeric};$.tableSorter.analyzer.add($.tableSorter.parsers.currency);$.tableSorter.analyzer.add($.tableSorter.parsers.integer);$.tableSorter.analyzer.add($.tableSorter.parsers.isoDate);$.tableSorter.analyzer.add($.tableSorter.parsers.shortDate);$.tableSorter.analyzer.add($.tableSorter.parsers.usLongDate);$.tableSorter.analyzer.add($.tableSorter.parsers.ipAddress);$.tableSorter.analyzer.add($.tableSorter.parsers.url);$.tableSorter.analyzer.add($.tableSorter.parsers.time);$.tableSorter.analyzer.add($.tableSorter.parsers.floating);})(jQuery);
