datatable_lite.js - jscancer - Javascript crap (relatively small)
(HTM) git clone git://git.codemadness.org/jscancer
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
datatable_lite.js (3986B)
---
1 var datatable_parse_date = Date.parse,
2 datatable_parse_float = parseFloat,
3 datatable_parse_int = parseInt,
4 datatable_parse_string = String;
5
6 function datatable_sort_default(x, y) {
7 return x > y ? 1 : (x == y ? 0 : -1);
8 }
9
10 function datatable_init(el) {
11 var thead = el.tHead;
12 var ths = thead.children[0].children,
13 cols = [];
14 for (var i = 0; i < ths.length; i++)
15 cols.push({
16 parsefn: window["datatable_parse_" + (ths[i].getAttribute("data-parse") || "string")],
17 sortfn: window["datatable_sort_" + (ths[i].getAttribute("data-sort") || "default")],
18 sortable: ["1", "true"].indexOf(ths[i].getAttribute("data-sortable") || "true") != -1
19 });
20 var d = {
21 table: el,
22 thead: thead,
23 ths: ths,
24 tbody: el.tBodies[0],
25 cols: cols,
26 sort: [] // sort options: [colidx, order (ASC = 0, DESC = 1)].
27 };
28 d.data = datatable_data_parse(d);
29
30 d.display = function(data) {
31 var tbody = document.createElement("tbody");
32 for (var i = 0; i < data.length; i++)
33 tbody.appendChild(data[i].tr);
34 d.table.replaceChild(tbody, d.tbody);
35 tbody.style.display = data.length ? "table-row-group" : "none";
36 d.tbody = tbody;
37 };
38
39 // setup click event handlers for sorting.
40 for (var i = 0; i < d.ths.length; i++)
41 d.cols[i].sortable && d.ths[i].addEventListener("click", function(idx) {
42 return function(e) {
43 // shift-click for multi-select modifier.
44 datatable_sort_column_toggle(d, idx, e.shiftKey);
45 d.data = datatable_sort(d, d.data);
46 d.display(d.data);
47 };
48 }(i), false);
49 return d;
50 }
51
52 function datatable_sort_column_get(d, idx) {
53 for (var i = 0; i < d.sort.length; i++)
54 if (d.sort[i][0] == idx)
55 return i;
56 return -1;
57 }
58
59 function datatable_sort_column_set(d, idx, order, multi) {
60 var c = datatable_sort_column_get(d, idx);
61 if (multi)
62 if (c != -1)
63 d.sort[c][1] = order;
64 else
65 d.sort.push([ idx, order ]);
66 else
67 d.sort = [ [idx, order] ];
68
69 for (var i = 0; i < d.ths.length; i++) {
70 var c = " " + d.ths[i].className + " ";
71 d.ths[i].className = c.replace(/ sort-(asc|desc) /g, " ").replace(/\s+/g, " ").trim();
72 }
73 for (var i = 0; i < d.sort.length; i++)
74 d.ths[d.sort[i][0]].className += " sort-" + (d.sort[i][1] ? "desc" : "asc");
75 }
76
77 // toggle sort or use default order: ASC.
78 function datatable_sort_column_toggle(d, idx, multi) {
79 var c = datatable_sort_column_get(d, idx);
80 datatable_sort_column_set(d, idx, c == -1 || d.sort[c][1] ? 0 : 1, multi);
81 }
82
83 function datatable_data_parse(d) {
84 var data = [], trs = d.tbody.children;
85 // NOTE: assumes each tr has only "<td>" childnodes.
86 for (var i = 0; i < trs.length; i++) {
87 var values = [];
88 for (var j = 0, trc = trs[i].children; j < trc.length; j++) {
89 var td = trc[j], v = td.getAttribute("data-value");
90 // prefer data-value attribute, else use cell contents.
91 if (typeof(v) != "undefined" && v !== null)
92 values.push(d.cols[j].parsefn(v));
93 else
94 values.push(d.cols[j].parsefn(td.textContent || td.innerText));
95 }
96 data.push({
97 tr: trs[i],
98 values: values
99 });
100 }
101 return data;
102 }
103
104 function datatable_sort(d, data) {
105 // setup sort functions once (in order for multi-select).
106 var sortfns = d.sort.map(function(s) {
107 return (function(c, o, fn) {
108 if (o)
109 return function(xvals, yvals) {
110 return -fn(xvals[c], yvals[c]);
111 };
112 else
113 return function(xvals, yvals) {
114 return fn(xvals[c], yvals[c]);
115 };
116 })(s[0], s[1], d.cols[s[0]].sortfn);
117 });
118 return data.sort(function(x, y) {
119 for (var i = 0, r; i < sortfns.length; i++)
120 if ((r = sortfns[i](x.values, y.values)) != 0)
121 return r;
122 return r;
123 });
124 }
125
126 function datatable_autoload() {
127 // convert to Array (not changed in-place, mandatory).
128 var ds = [], dl = [], els = document.getElementsByClassName && document.getElementsByClassName("datatable") || [];
129 for (var i = 0; i < els.length; i++)
130 dl.push(els[i]);
131 for (var i = 0, d; i < dl.length; i++) {
132 if ((d = datatable_init(dl[i])) === null)
133 continue;
134 ds.push(d);
135 }
136 return ds;
137 }