annotate lightbox/js/stupidtable.js @ 8:adc01e560eae

Uploaded
author rlegendre
date Mon, 20 Oct 2014 11:34:11 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
1 // Stupid jQuery table plugin.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
2
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
3 // Call on a table
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
4 // sortFns: Sort functions for your datatypes.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
5 (function($) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
6
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
7 $.fn.stupidtable = function(sortFns) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
8 return this.each(function() {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
9 var $table = $(this);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
10 sortFns = sortFns || {};
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
11
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
12 // ==================================================== //
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
13 // Utility functions //
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
14 // ==================================================== //
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
15
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
16 // Merge sort functions with some default sort functions.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
17 sortFns = $.extend({}, $.fn.stupidtable.default_sort_fns, sortFns);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
18
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
19 // Return the resulting indexes of a sort so we can apply
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
20 // this result elsewhere. This returns an array of index numbers.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
21 // return[0] = x means "arr's 0th element is now at x"
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
22 var sort_map = function(arr, sort_function) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
23 var map = [];
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
24 var index = 0;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
25 var sorted = arr.slice(0).sort(sort_function);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
26 for (var i=0; i<arr.length; i++) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
27 index = $.inArray(arr[i], sorted);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
28
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
29 // If this index is already in the map, look for the next index.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
30 // This handles the case of duplicate entries.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
31 while ($.inArray(index, map) != -1) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
32 index++;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
33 }
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
34 map.push(index);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
35 }
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
36
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
37 return map;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
38 };
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
39
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
40 // Apply a sort map to the array.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
41 var apply_sort_map = function(arr, map) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
42 var clone = arr.slice(0),
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
43 newIndex = 0;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
44 for (var i=0; i<map.length; i++) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
45 newIndex = map[i];
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
46 clone[newIndex] = arr[i];
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
47 }
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
48 return clone;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
49 };
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
50
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
51 // ==================================================== //
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
52 // Begin execution! //
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
53 // ==================================================== //
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
54
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
55 // Do sorting when THs are clicked
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
56 $table.on("click", "th", function() {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
57 var trs = $table.children("tbody").children("tr");
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
58 var $this = $(this);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
59 var th_index = 0;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
60 var dir = $.fn.stupidtable.dir;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
61
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
62 $table.find("th").slice(0, $this.index()).each(function() {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
63 var cols = $(this).attr("colspan") || 1;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
64 th_index += parseInt(cols,10);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
65 });
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
66
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
67 // Determine (and/or reverse) sorting direction, default `asc`
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
68 var sort_dir = $this.data("sort-default") || dir.ASC;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
69 if ($this.data("sort-dir"))
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
70 sort_dir = $this.data("sort-dir") === dir.ASC ? dir.DESC : dir.ASC;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
71
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
72 // Choose appropriate sorting function.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
73 var type = $this.data("sort") || null;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
74
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
75 // Prevent sorting if no type defined
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
76 if (type === null) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
77 return;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
78 }
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
79
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
80 // Trigger `beforetablesort` event that calling scripts can hook into;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
81 // pass parameters for sorted column index and sorting direction
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
82 $table.trigger("beforetablesort", {column: th_index, direction: sort_dir});
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
83 // More reliable method of forcing a redraw
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
84 $table.css("display");
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
85
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
86 // Run sorting asynchronously on a timout to force browser redraw after
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
87 // `beforetablesort` callback. Also avoids locking up the browser too much.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
88 setTimeout(function() {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
89 // Gather the elements for this column
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
90 var column = [];
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
91 var sortMethod = sortFns[type];
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
92
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
93 // Push either the value of the `data-order-by` attribute if specified
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
94 // or just the text() value in this column to column[] for comparison.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
95 trs.each(function(index,tr) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
96 var $e = $(tr).children().eq(th_index);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
97 var sort_val = $e.data("sort-value");
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
98 var order_by = typeof(sort_val) !== "undefined" ? sort_val : $e.text();
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
99 column.push(order_by);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
100 });
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
101
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
102 // Create the sort map. This column having a sort-dir implies it was
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
103 // the last column sorted. As long as no data-sort-desc is specified,
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
104 // we're free to just reverse the column.
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
105 var theMap;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
106 if (sort_dir == dir.ASC)
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
107 theMap = sort_map(column, sortMethod);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
108 else
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
109 theMap = sort_map(column, function(a, b) { return -sortMethod(a, b); });
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
110
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
111 // Reset siblings
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
112 $table.find("th").data("sort-dir", null).removeClass("sorting-desc sorting-asc");
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
113 $this.data("sort-dir", sort_dir).addClass("sorting-"+sort_dir);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
114
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
115 var sortedTRs = $(apply_sort_map(trs, theMap));
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
116 $table.children("tbody").remove();
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
117 $table.append("<tbody />").append(sortedTRs);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
118
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
119 // Trigger `aftertablesort` event. Similar to `beforetablesort`
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
120 $table.trigger("aftertablesort", {column: th_index, direction: sort_dir});
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
121 // More reliable method of forcing a redraw
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
122 $table.css("display");
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
123 }, 10);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
124 });
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
125 });
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
126 };
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
127
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
128 // Enum containing sorting directions
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
129 $.fn.stupidtable.dir = {ASC: "asc", DESC: "desc"};
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
130
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
131 $.fn.stupidtable.default_sort_fns = {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
132 "int": function(a, b) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
133 return parseInt(a, 10) - parseInt(b, 10);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
134 },
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
135 "float": function(a, b) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
136 return parseFloat(a) - parseFloat(b);
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
137 },
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
138 "string": function(a, b) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
139 if (a < b) return -1;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
140 if (a > b) return +1;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
141 return 0;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
142 },
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
143 "string-ins": function(a, b) {
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
144 a = a.toLowerCase();
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
145 b = b.toLowerCase();
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
146 if (a < b) return -1;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
147 if (a > b) return +1;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
148 return 0;
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
149 }
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
150 };
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
151
adc01e560eae Uploaded
rlegendre
parents:
diff changeset
152 })(jQuery);