datatable_lite.js - jscancer - Javascript crap (relatively small) | |
git clone git://git.codemadness.org/jscancer | |
Log | |
Files | |
Refs | |
README | |
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].… | |
17 sortfn: window["datatable_sort_" + (ths[i].g… | |
18 sortable: ["1", "true"].indexOf(ths[i].getAttr… | |
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… | |
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" : … | |
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",… | |
42 return function(e) { | |
43 // shift-click for multi-select modifier. | |
44 datatable_sort_column_toggle(d, idx, e.s… | |
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, " "… | |
72 } | |
73 for (var i = 0; i < d.sort.length; i++) | |
74 d.ths[d.sort[i][0]].className += " sort-" + (d.sort[i][1… | |
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 : … | |
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 co… | |
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.textCon… | |
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 && d… | |
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 } |