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 }