source: extensions/nbc_ThemeChanger/include/jquery.tablesorter.js @ 8804

Last change on this file since 8804 was 6642, checked in by datajulien, 14 years ago

theme changer :
Correction du bug sur la suppression du thème présent sur une association active.
Utilisation unique des id des thèmes.
Mise en place jquery et tableSorter pour la gestion des tris.

File size: 22.8 KB
Line 
1/*
2 *
3 * TableSorter 2.0 - Client-side table sorting with ease!
4 * Version 2.0.3
5 * @requires jQuery v1.2.3
6 *
7 * Copyright (c) 2007 Christian Bach
8 * Examples and docs at: http://tablesorter.com
9 * Dual licensed under the MIT and GPL licenses:
10 * http://www.opensource.org/licenses/mit-license.php
11 * http://www.gnu.org/licenses/gpl.html
12 *
13 */
14/**
15 *
16 * @description Create a sortable table with multi-column sorting capabilitys
17 *
18 * @example $('table').tablesorter();
19 * @desc Create a simple tablesorter interface.
20 *
21 * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] });
22 * @desc Create a tablesorter interface and sort on the first and secound column in ascending order.
23 *
24 * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } });
25 * @desc Create a tablesorter interface and disableing the first and secound column headers.
26 *
27 * @example $('table').tablesorter({ 0: {sorter:"integer"}, 1: {sorter:"currency"} });
28 * @desc Create a tablesorter interface and set a column parser for the first and secound column.
29 *
30 *
31 * @param Object settings An object literal containing key/value pairs to provide optional settings.
32 *
33 * @option String cssHeader (optional)                  A string of the class name to be appended to sortable tr elements in the thead of the table.
34 *                                                                                              Default value: "header"
35 *
36 * @option String cssAsc (optional)                     A string of the class name to be appended to sortable tr elements in the thead on a ascending sort.
37 *                                                                                              Default value: "headerSortUp"
38 *
39 * @option String cssDesc (optional)                    A string of the class name to be appended to sortable tr elements in the thead on a descending sort.
40 *                                                                                              Default value: "headerSortDown"
41 *
42 * @option String sortInitialOrder (optional)   A string of the inital sorting order can be asc or desc.
43 *                                                                                              Default value: "asc"
44 *
45 * @option String sortMultisortKey (optional)   A string of the multi-column sort key.
46 *                                                                                              Default value: "shiftKey"
47 *
48 * @option String textExtraction (optional)     A string of the text-extraction method to use.
49 *                                                                                              For complex html structures inside td cell set this option to "complex",
50 *                                                                                              on large tables the complex option can be slow.
51 *                                                                                              Default value: "simple"
52 *
53 * @option Object headers (optional)                    An array containing the forces sorting rules.
54 *                                                                                              This option let's you specify a default sorting rule.
55 *                                                                                              Default value: null
56 *
57 * @option Array sortList (optional)                    An array containing the forces sorting rules.
58 *                                                                                              This option let's you specify a default sorting rule.
59 *                                                                                              Default value: null
60 *
61 * @option Array sortForce (optional)                   An array containing forced sorting rules.
62 *                                                                                              This option let's you specify a default sorting rule, which is prepended to user-selected rules.
63 *                                                                                              Default value: null
64 * 
65  * @option Array sortAppend (optional)                         An array containing forced sorting rules.
66 *                                                                                              This option let's you specify a default sorting rule, which is appended to user-selected rules.
67 *                                                                                              Default value: null
68 *
69 * @option Boolean widthFixed (optional)                Boolean flag indicating if tablesorter should apply fixed widths to the table columns.
70 *                                                                                              This is usefull when using the pager companion plugin.
71 *                                                                                              This options requires the dimension jquery plugin.
72 *                                                                                              Default value: false
73 *
74 * @option Boolean cancelSelection (optional)   Boolean flag indicating if tablesorter should cancel selection of the table headers text.
75 *                                                                                              Default value: true
76 *
77 * @option Boolean debug (optional)                     Boolean flag indicating if tablesorter should display debuging information usefull for development.
78 *
79 * @type jQuery
80 *
81 * @name tablesorter
82 *
83 * @cat Plugins/Tablesorter
84 *
85 * @author Christian Bach/christian.bach@polyester.se
86 */
87
88(function($) {
89        $.extend({
90                tablesorter: new function() {
91                       
92                        var parsers = [], widgets = [];
93                       
94                        this.defaults = {
95                                cssHeader: "header",
96                                cssAsc: "headerSortUp",
97                                cssDesc: "headerSortDown",
98                                sortInitialOrder: "asc",
99                                sortMultiSortKey: "shiftKey",
100                                sortForce: null,
101                                sortAppend: null,
102                                textExtraction: "simple",
103                                parsers: {}, 
104                                widgets: [],           
105                                widgetZebra: {css: ["even","odd"]},
106                                headers: {},
107                                widthFixed: false,
108                                cancelSelection: true,
109                                sortList: [],
110                                headerList: [],
111                                dateFormat: "us",
112                                decimal: '.',
113                                debug: false
114                        };
115                       
116                        /* debuging utils */
117                        function benchmark(s,d) {
118                                log(s + "," + (new Date().getTime() - d.getTime()) + "ms");
119                        }
120                       
121                        this.benchmark = benchmark;
122                       
123                        function log(s) {
124                                if (typeof console != "undefined" && typeof console.debug != "undefined") {
125                                        console.log(s);
126                                } else {
127                                        alert(s);
128                                }
129                        }
130                                               
131                        /* parsers utils */
132                        function buildParserCache(table,$headers) {
133                               
134                                if(table.config.debug) { var parsersDebug = ""; }
135                               
136                                var rows = table.tBodies[0].rows;
137                               
138                                if(table.tBodies[0].rows[0]) {
139
140                                        var list = [], cells = rows[0].cells, l = cells.length;
141                                       
142                                        for (var i=0;i < l; i++) {
143                                                var p = false;
144                                               
145                                                if($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)  ) {
146                                               
147                                                        p = getParserById($($headers[i]).metadata().sorter);   
148                                               
149                                                } else if((table.config.headers[i] && table.config.headers[i].sorter)) {
150       
151                                                        p = getParserById(table.config.headers[i].sorter);
152                                                }
153                                                if(!p) {
154                                                        p = detectParserForColumn(table,cells[i]);
155                                                }
156       
157                                                if(table.config.debug) { parsersDebug += "column:" + i + " parser:" +p.id + "\n"; }
158       
159                                                list.push(p);
160                                        }
161                                }
162                               
163                                if(table.config.debug) { log(parsersDebug); }
164
165                                return list;
166                        };
167                       
168                        function detectParserForColumn(table,node) {
169                                var l = parsers.length;
170                                for(var i=1; i < l; i++) {
171                                        if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)) {
172                                                return parsers[i];
173                                        }
174                                }
175                                // 0 is always the generic parser (text)
176                                return parsers[0];
177                        }
178                       
179                        function getParserById(name) {
180                                var l = parsers.length;
181                                for(var i=0; i < l; i++) {
182                                        if(parsers[i].id.toLowerCase() == name.toLowerCase()) { 
183                                                return parsers[i];
184                                        }
185                                }
186                                return false;
187                        }
188                       
189                        /* utils */
190                        function buildCache(table) {
191                               
192                                if(table.config.debug) { var cacheTime = new Date(); }
193                               
194                               
195                                var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0,
196                                        totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0,
197                                        parsers = table.config.parsers, 
198                                        cache = {row: [], normalized: []};
199                               
200                                        for (var i=0;i < totalRows; ++i) {
201                                       
202                                                /** Add the table data to main data array */
203                                                var c = table.tBodies[0].rows[i], cols = [];
204                                       
205                                                cache.row.push($(c));
206                                               
207                                                for(var j=0; j < totalCells; ++j) {
208                                                        cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j])); 
209                                                }
210                                                                                               
211                                                cols.push(i); // add position for rowCache
212                                                cache.normalized.push(cols);
213                                                cols = null;
214                                        };
215                               
216                                if(table.config.debug) { benchmark("Building cache for " + totalRows + " rows:", cacheTime); }
217                               
218                                return cache;
219                        };
220                       
221                        function getElementText(config,node) {
222                               
223                                if(!node) return "";
224                                                               
225                                var t = "";
226                               
227                                if(config.textExtraction == "simple") {
228                                        if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
229                                                t = node.childNodes[0].innerHTML;
230                                        } else {
231                                                t = node.innerHTML;
232                                        }
233                                } else {
234                                        if(typeof(config.textExtraction) == "function") {
235                                                t = config.textExtraction(node);
236                                        } else { 
237                                                t = $(node).text();
238                                        }       
239                                }
240                                return t;
241                        }
242                       
243                        function appendToTable(table,cache) {
244                               
245                                if(table.config.debug) {var appendTime = new Date()}
246                               
247                                var c = cache, 
248                                        r = c.row, 
249                                        n= c.normalized, 
250                                        totalRows = n.length, 
251                                        checkCell = (n[0].length-1), 
252                                        tableBody = $(table.tBodies[0]),
253                                        rows = [];
254                               
255                                for (var i=0;i < totalRows; i++) {
256                                        rows.push(r[n[i][checkCell]]); 
257                                        if(!table.config.appender) {
258                                               
259                                                var o = r[n[i][checkCell]];
260                                                var l = o.length;
261                                                for(var j=0; j < l; j++) {
262                                                       
263                                                        tableBody[0].appendChild(o[j]);
264                                               
265                                                }
266                                               
267                                                //tableBody.append(r[n[i][checkCell]]);
268                                        }
269                                }       
270                               
271                                if(table.config.appender) {
272                               
273                                        table.config.appender(table,rows);     
274                                }
275                               
276                                rows = null;
277                               
278                                if(table.config.debug) { benchmark("Rebuilt table:", appendTime); }
279                                                               
280                                //apply table widgets
281                                applyWidget(table);
282                               
283                                // trigger sortend
284                                setTimeout(function() {
285                                        $(table).trigger("sortEnd");   
286                                },0);
287                               
288                        };
289                       
290                        function buildHeaders(table) {
291                               
292                                if(table.config.debug) { var time = new Date(); }
293                               
294                                var meta = ($.metadata) ? true : false, tableHeadersRows = [];
295                       
296                                for(var i = 0; i < table.tHead.rows.length; i++) { tableHeadersRows[i]=0; };
297                               
298                                $tableHeaders = $("thead th",table);
299               
300                                $tableHeaders.each(function(index) {
301                                                       
302                                        this.count = 0;
303                                        this.column = index;
304                                        this.order = formatSortingOrder(table.config.sortInitialOrder);
305                                       
306                                        if(checkHeaderMetadata(this) || checkHeaderOptions(table,index)) this.sortDisabled = true;
307                                       
308                                        if(!this.sortDisabled) {
309                                                $(this).addClass(table.config.cssHeader);
310                                        }
311                                       
312                                        // add cell to headerList
313                                        table.config.headerList[index]= this;
314                                });
315                               
316                                if(table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); }
317                               
318                                return $tableHeaders;
319                               
320                        };
321                                               
322                        function checkCellColSpan(table, rows, row) {
323                var arr = [], r = table.tHead.rows, c = r[row].cells;
324                               
325                                for(var i=0; i < c.length; i++) {
326                                        var cell = c[i];
327                                       
328                                        if ( cell.colSpan > 1) { 
329                                                arr = arr.concat(checkCellColSpan(table, headerArr,row++));
330                                        } else  {
331                                                if(table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row+1])) {
332                                                        arr.push(cell);
333                                                }
334                                                //headerArr[row] = (i+row);
335                                        }
336                                }
337                                return arr;
338                        };
339                       
340                        function checkHeaderMetadata(cell) {
341                                if(($.metadata) && ($(cell).metadata().sorter === false)) { return true; };
342                                return false;
343                        }
344                       
345                        function checkHeaderOptions(table,i) { 
346                                if((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; };
347                                return false;
348                        }
349                       
350                        function applyWidget(table) {
351                                var c = table.config.widgets;
352                                var l = c.length;
353                                for(var i=0; i < l; i++) {
354                                       
355                                        getWidgetById(c[i]).format(table);
356                                }
357                               
358                        }
359                       
360                        function getWidgetById(name) {
361                                var l = widgets.length;
362                                for(var i=0; i < l; i++) {
363                                        if(widgets[i].id.toLowerCase() == name.toLowerCase() ) {
364                                                return widgets[i]; 
365                                        }
366                                }
367                        };
368                       
369                        function formatSortingOrder(v) {
370                               
371                                if(typeof(v) != "Number") {
372                                        i = (v.toLowerCase() == "desc") ? 1 : 0;
373                                } else {
374                                        i = (v == (0 || 1)) ? v : 0;
375                                }
376                                return i;
377                        }
378                       
379                        function isValueInArray(v, a) {
380                                var l = a.length;
381                                for(var i=0; i < l; i++) {
382                                        if(a[i][0] == v) {
383                                                return true;   
384                                        }
385                                }
386                                return false;
387                        }
388                               
389                        function setHeadersCss(table,$headers, list, css) {
390                                // remove all header information
391                                $headers.removeClass(css[0]).removeClass(css[1]);
392                               
393                                var h = [];
394                                $headers.each(function(offset) {
395                                                if(!this.sortDisabled) {
396                                                        h[this.column] = $(this);                                       
397                                                }
398                                });
399                               
400                                var l = list.length; 
401                                for(var i=0; i < l; i++) {
402                                        h[list[i][0]].addClass(css[list[i][1]]);
403                                }
404                        }
405                       
406                        function fixColumnWidth(table,$headers) {
407                                var c = table.config;
408                                if(c.widthFixed) {
409                                        var colgroup = $('<colgroup>');
410                                        $("tr:first td",table.tBodies[0]).each(function() {
411                                                colgroup.append($('<col>').css('width',$(this).width()));
412                                        });
413                                        $(table).prepend(colgroup);
414                                };
415                        }
416                       
417                        function updateHeaderSortCount(table,sortList) {
418                                var c = table.config, l = sortList.length;
419                                for(var i=0; i < l; i++) {
420                                        var s = sortList[i], o = c.headerList[s[0]];
421                                        o.count = s[1];
422                                        o.count++;
423                                }
424                        }
425                       
426                        /* sorting methods */
427                        function multisort(table,sortList,cache) {
428                               
429                                if(table.config.debug) { var sortTime = new Date(); }
430                               
431                                var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length;
432                                       
433                                for(var i=0; i < l; i++) {
434                                       
435                                        var c = sortList[i][0];
436                                        var order = sortList[i][1];
437                                        var s = (getCachedSortType(table.config.parsers,c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc");
438                                       
439                                        var e = "e" + i;
440                                       
441                                        dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); ";
442                                        dynamicExp += "if(" + e + ") { return " + e + "; } ";
443                                        dynamicExp += "else { ";
444                                }
445                               
446                                // if value is the same keep orignal order     
447                                var orgOrderCol = cache.normalized[0].length - 1;
448                                dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];";
449                                               
450                                for(var i=0; i < l; i++) {
451                                        dynamicExp += "}; ";
452                                }
453                               
454                                dynamicExp += "return 0; ";     
455                                dynamicExp += "}; ";   
456                               
457                                eval(dynamicExp);
458                               
459                                cache.normalized.sort(sortWrapper);
460                               
461                                if(table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); }
462                               
463                                return cache;
464                        };
465                       
466                        function sortText(a,b) {
467                                return ((a < b) ? -1 : ((a > b) ? 1 : 0));
468                        };
469                       
470                        function sortTextDesc(a,b) {
471                                return ((b < a) ? -1 : ((b > a) ? 1 : 0));
472                        };     
473                       
474                        function sortNumeric(a,b) {
475                                return a-b;
476                        };
477                       
478                        function sortNumericDesc(a,b) {
479                                return b-a;
480                        };
481                       
482                        function getCachedSortType(parsers,i) {
483                                return parsers[i].type;
484                        };
485                       
486                        /* public methods */
487                        this.construct = function(settings) {
488
489                                return this.each(function() {
490                                       
491                                        if(!this.tHead || !this.tBodies) return;
492                                       
493                                        var $this, $document,$headers, cache, config, shiftDown = 0, sortOrder;
494                                       
495                                        this.config = {};
496                                       
497                                        config = $.extend(this.config, $.tablesorter.defaults, settings);
498                                       
499                                        // store common expression for speed                                   
500                                        $this = $(this);
501                                       
502                                        // build headers
503                                        $headers = buildHeaders(this);
504                                       
505                                        // try to auto detect column type, and store in tables config
506                                        this.config.parsers = buildParserCache(this,$headers);
507                                       
508                                       
509                                        // build the cache for the tbody cells
510                                        cache = buildCache(this);
511                                       
512                                        // get the css class names, could be done else where.
513                                        var sortCSS = [config.cssDesc,config.cssAsc];
514                                       
515                                        // fixate columns if the users supplies the fixedWidth option
516                                        fixColumnWidth(this);
517                                       
518                                        // apply event handling to headers
519                                        // this is to big, perhaps break it out?
520                                        $headers.click(function(e) {
521                                               
522                                                $this.trigger("sortStart");
523                                               
524                                                var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;
525                                               
526                                                if(!this.sortDisabled && totalRows > 0) {
527                                                       
528                                                       
529                                                        // store exp, for speed
530                                                        var $cell = $(this);
531       
532                                                        // get current column index
533                                                        var i = this.column;
534                                                       
535                                                        // get current column sort order
536                                                        this.order = this.count++ % 2;
537                                                       
538                                                        // user only whants to sort on one column
539                                                        if(!e[config.sortMultiSortKey]) {
540                                                               
541                                                                // flush the sort list
542                                                                config.sortList = [];
543                                                               
544                                                                if(config.sortForce != null) {
545                                                                        var a = config.sortForce; 
546                                                                        for(var j=0; j < a.length; j++) {
547                                                                                if(a[j][0] != i) {
548                                                                                        config.sortList.push(a[j]);
549                                                                                }
550                                                                        }
551                                                                }
552                                                               
553                                                                // add column to sort list
554                                                                config.sortList.push([i,this.order]);
555                                                       
556                                                        // multi column sorting
557                                                        } else {
558                                                                // the user has clicked on an all ready sortet column.
559                                                                if(isValueInArray(i,config.sortList)) { 
560                                                                       
561                                                                        // revers the sorting direction for all tables.
562                                                                        for(var j=0; j < config.sortList.length; j++) {
563                                                                                var s = config.sortList[j], o = config.headerList[s[0]];
564                                                                                if(s[0] == i) {
565                                                                                        o.count = s[1];
566                                                                                        o.count++;
567                                                                                        s[1] = o.count % 2;
568                                                                                }
569                                                                        }       
570                                                                } else {
571                                                                        // add column to sort list array
572                                                                        config.sortList.push([i,this.order]);
573                                                                }
574                                                        };
575                                                        setTimeout(function() {
576                                                                //set css for headers
577                                                                setHeadersCss($this[0],$headers,config.sortList,sortCSS);
578                                                                appendToTable($this[0],multisort($this[0],config.sortList,cache));
579                                                        },1);
580                                                        // stop normal event by returning false
581                                                        return false;
582                                                }
583                                        // cancel selection     
584                                        }).mousedown(function() {
585                                                if(config.cancelSelection) {
586                                                        this.onselectstart = function() {return false};
587                                                        return false;
588                                                }
589                                        });
590                                       
591                                        // apply easy methods that trigger binded events
592                                        $this.bind("update",function() {
593                                               
594                                                // rebuild parsers.
595                                                this.config.parsers = buildParserCache(this,$headers);
596                                               
597                                                // rebuild the cache map
598                                                cache = buildCache(this);
599                                               
600                                        }).bind("sorton",function(e,list) {
601                                               
602                                                $(this).trigger("sortStart");
603                                               
604                                                config.sortList = list;
605                                               
606                                                // update and store the sortlist
607                                                var sortList = config.sortList;
608                                               
609                                                // update header count index
610                                                updateHeaderSortCount(this,sortList);
611                                               
612                                                //set css for headers
613                                                setHeadersCss(this,$headers,sortList,sortCSS);
614                                               
615                                               
616                                                // sort the table and append it to the dom
617                                                appendToTable(this,multisort(this,sortList,cache));
618
619                                        }).bind("appendCache",function() {
620                                               
621                                                appendToTable(this,cache);
622                                       
623                                        }).bind("applyWidgetId",function(e,id) {
624                                               
625                                                getWidgetById(id).format(this);
626                                               
627                                        }).bind("applyWidgets",function() {
628                                                // apply widgets
629                                                applyWidget(this);
630                                        });
631                                       
632                                        if($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {
633                                                config.sortList = $(this).metadata().sortlist;
634                                        }
635                                        // if user has supplied a sort list to constructor.
636                                        if(config.sortList.length > 0) {
637                                                $this.trigger("sorton",[config.sortList]);     
638                                        }
639                                       
640                                        // apply widgets
641                                        applyWidget(this);
642                                });
643                        };
644                       
645                        this.addParser = function(parser) {
646                                var l = parsers.length, a = true;
647                                for(var i=0; i < l; i++) {
648                                        if(parsers[i].id.toLowerCase() == parser.id.toLowerCase()) {
649                                                a = false;
650                                        }
651                                }
652                                if(a) { parsers.push(parser); };
653                        };
654                       
655                        this.addWidget = function(widget) {
656                                widgets.push(widget);
657                        };
658                       
659                        this.formatFloat = function(s) {
660                                var i = parseFloat(s);
661                                return (isNaN(i)) ? 0 : i;
662                        };
663                        this.formatInt = function(s) {
664                                var i = parseInt(s);
665                                return (isNaN(i)) ? 0 : i;
666                        };
667                       
668                        this.isDigit = function(s,config) {
669                                var DECIMAL = '\\' + config.decimal;
670                                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+$)/';
671                                return RegExp(exp).test($.trim(s));
672                        };
673                       
674                        this.clearTableBody = function(table) {
675                                if($.browser.msie) {
676                                        function empty() {
677                                                while ( this.firstChild ) this.removeChild( this.firstChild );
678                                        }
679                                        empty.apply(table.tBodies[0]);
680                                } else {
681                                        table.tBodies[0].innerHTML = "";
682                                }
683                        };
684                }
685        });
686       
687        // extend plugin scope
688        $.fn.extend({
689        tablesorter: $.tablesorter.construct
690        });
691       
692        var ts = $.tablesorter;
693       
694        // add default parsers
695        ts.addParser({
696                id: "text",
697                is: function(s) {
698                        return true;
699                },
700                format: function(s) {
701                        return $.trim(s.toLowerCase());
702                },
703                type: "text"
704        });
705       
706        ts.addParser({
707                id: "digit",
708                is: function(s,table) {
709                        var c = table.config;
710                        return $.tablesorter.isDigit(s,c);
711                },
712                format: function(s) {
713                        return $.tablesorter.formatFloat(s);
714                },
715                type: "numeric"
716        });
717       
718        ts.addParser({
719                id: "currency",
720                is: function(s) {
721                        return /^[£$€?.]/.test(s);
722                },
723                format: function(s) {
724                        return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),""));
725                },
726                type: "numeric"
727        });
728       
729        ts.addParser({
730                id: "ipAddress",
731                is: function(s) {
732                        return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);
733                },
734                format: function(s) {
735                        var a = s.split("."), r = "", l = a.length;
736                        for(var i = 0; i < l; i++) {
737                                var item = a[i];
738                                if(item.length == 2) {
739                                        r += "0" + item;
740                                } else {
741                                        r += item;
742                                }
743                        }
744                        return $.tablesorter.formatFloat(r);
745                },
746                type: "numeric"
747        });
748       
749        ts.addParser({
750                id: "url",
751                is: function(s) {
752                        return /^(https?|ftp|file):\/\/$/.test(s);
753                },
754                format: function(s) {
755                        return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));
756                },
757                type: "text"
758        });
759       
760        ts.addParser({
761                id: "isoDate",
762                is: function(s) {
763                        return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);
764                },
765                format: function(s) {
766                        return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),"/")).getTime() : "0");
767                },
768                type: "numeric"
769        });
770               
771        ts.addParser({
772                id: "percent",
773                is: function(s) { 
774                        return /\%$/.test($.trim(s));
775                },
776                format: function(s) {
777                        return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));
778                },
779                type: "numeric"
780        });
781
782        ts.addParser({
783                id: "usLongDate",
784                is: function(s) {
785                        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)))$/));
786                },
787                format: function(s) {
788                        return $.tablesorter.formatFloat(new Date(s).getTime());
789                },
790                type: "numeric"
791        });
792
793        ts.addParser({
794                id: "shortDate",
795                is: function(s) {
796                        return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
797                },
798                format: function(s,table) {
799                        var c = table.config;
800                        s = s.replace(/\-/g,"/");
801                        if(c.dateFormat == "us") {
802                                // reformat the string in ISO format
803                                s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
804                        } else if(c.dateFormat == "uk") {
805                                //reformat the string in ISO format
806                                s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
807                        } else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {
808                                s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");     
809                        }
810                        return $.tablesorter.formatFloat(new Date(s).getTime());
811                },
812                type: "numeric"
813        });
814
815        ts.addParser({
816            id: "time",
817            is: function(s) {
818                return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
819            },
820            format: function(s) {
821                return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime());
822            },
823          type: "numeric"
824        });
825       
826       
827        ts.addParser({
828            id: "metadata",
829            is: function(s) {
830                return false;
831            },
832            format: function(s,table,cell) {
833                        var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;
834                return $(cell).metadata()[p];
835            },
836          type: "numeric"
837        });
838       
839        // add default widgets
840        ts.addWidget({
841                id: "zebra",
842                format: function(table) {
843                        if(table.config.debug) { var time = new Date(); }
844                        $("tr:visible",table.tBodies[0])
845                .filter(':even')
846                .removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0])
847                .end().filter(':odd')
848                .removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]);
849                        if(table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); }
850                }
851        });     
852})(jQuery);
Note: See TracBrowser for help on using the repository browser.