Project

General

Profile

1
// TableSort 8.20
2
// J?rgen Berkemeier, 16. 11. 2015
3
// www.j-berkemeier.de
4

    
5
( function() {
6

    
7
    "use strict";
8

    
9
    var JB_Table = function(tab) {
10

    
11
        var up = String.fromCharCode(9650);
12
        var down = String.fromCharCode(9660);
13
        // var up = String.fromCharCode(8593);
14
        // var down = String.fromCharCode(8595);
15
        // var up = String.fromCharCode(11014);
16
        // var down = String.fromCharCode(11015);
17
        var no = String.fromCharCode(160,160,160,160); // Idee: 9674 ???
18
        var dieses = this;
19
        var defsort = 0;
20
        var startsort_u = -1,startsort_d = -1;
21
        var first = true;
22
        var ssort;
23
        var tbdy = tab.getElementsByTagName("tbody")[0];
24
        var tz = tbdy.rows;
25
        var nzeilen = tz.length;
26
        if (nzeilen==0) return;
27
        var nspalten = tz[0].cells.length;
28
        var Titel = tab.getElementsByTagName("thead")[0].getElementsByTagName("tr")[0].getElementsByTagName("th");
29
//console.info(Titel);
30
        var Arr = new Array(nzeilen);
31
        var ct = 0;
32
        var sdir = new Array(nspalten);
33
        var stype = new Array(nspalten);
34
        var sortable = new Array(nspalten);
35
        for(var i=0;i<nspalten;i++) {
36
            stype[i] = "n";
37
            sdir[i] = "u";
38
            sortable[i] = false;
39
        }
40

    
41
        var initTableHead = function(t,nr) {
42
            t.style.cursor = "pointer";
43
            t.onclick = function() { dieses.sort(nr); };
44
            sortsymbol.init(t,no);
45
//            t.title = 'Die Tabelle nach "'+elementText(t)+'" sortieren.';
46
//            t.title = '';
47
            if(t.className.indexOf("vorsortiert-")>-1) {
48
                sortsymbol.set(t,down);
49
                ssort = nr;
50
            }
51
            else if(t.className.indexOf("vorsortiert")>-1) {
52
                sortsymbol.set(t,up);
53
                ssort = nr;
54
            }
55
            if(t.className.indexOf("sortiere-")>-1) startsort_d=nr;
56
            else if(t.className.indexOf("sortiere")>-1) startsort_u=nr;
57
            sortable[nr] = true;
58
        } // initTableHead
59

    
60
        var sortsymbol = {
61
            init: function(t,s) {
62
                var sp = t.getElementsByTagName("span");
63
                for(var i=0;i<sp.length;i++) {
64
                    if(!sp[i].hasChildNodes()) {
65
                        t.sym = sp[i].appendChild(document.createTextNode(s));
66
                        break;
67
                    }
68
                }
69
                if(typeof(t.sym)=="undefined") t.sym = t.appendChild(document.createTextNode(s));
70
            },
71
            set: function(t,s) {
72
                t.sym.data = s;
73
            },
74
            get: function(t) {
75
                return t.sym.data;
76
            }
77
        } // sortsymbol
78

    
79
        var VglFkt_s = function(a,b) {
80
            var as = a[ssort], bs = b[ssort];
81
            var ret=(as>bs)?1:(as<bs)?-1:0;
82
            if(!ret && ssort!=defsort) {
83
                if (stype[defsort]=="s") { as = a[defsort]; bs = b[defsort]; ret = (as>bs)?1:(as<bs)?-1:0; }
84
                else ret = parseFloat(a[defsort])-parseFloat(b[defsort])
85
            }
86
            return ret;
87
        } // VglFkt_s
88

    
89
        var VglFkt_n = function(a,b) {
90
            var ret = parseFloat(a[ssort])-parseFloat(b[ssort]);
91
            if(!ret && ssort!=defsort) {
92
                if (stype[defsort]=="s") { var as = a[defsort],bs = b[defsort]; ret = (as>bs)?1:(as<bs)?-1:0; }
93
                else ret = parseFloat(a[defsort])-parseFloat(b[defsort]);
94
            }
95
            return ret;
96
        } // VglFkt_n
97

    
98
        var convert = function(val,s) {
99
            var dmy;
100
            var trmdat = function() {
101
                if(dmy[0]<10) dmy[0] = "0" + dmy[0];
102
                if(dmy[1]<10) dmy[1] = "0" + dmy[1];
103
                if(dmy[2]<10) dmy[2] = "200" + dmy[2];
104
                else if(dmy[2]<20) dmy[2] = "20" + dmy[2];
105
                else if(dmy[2]<99) dmy[2] = "19" + dmy[2];
106
                else if(dmy[2]>9999) dmy[2] = "9999";
107
            }
108
            if(val.length==0) val = "0";
109
            if(!isNaN(val) && val.search(/[0-9]/)!=-1) return val;
110
            var n = val.replace(",",".");
111
            if(!isNaN(n) && n.search(/[0-9]/)!=-1) return n;
112
            n = n.replace(/\s|&nbsp;|&#160;|\u00A0/g,"");
113
            if(!isNaN(n) && n.search(/[0-9]/)!=-1) return n;
114
            if(!val.search(/^\s*\d+\s*\.\s*\d+\s*\.\s*\d+\s+\d+:\d\d\:\d\d\s*$/)) {
115
                var dp = val.search(":");
116
                dmy = val.substring(0,dp-2).split(".");
117
                dmy[3] = val.substring(dp-2,dp);
118
                dmy[4] = val.substring(dp+1,dp+3);
119
                dmy[5] = val.substring(dp+4,dp+6);
120
                for(var i=0;i<6;i++) dmy[i] = parseInt(dmy[i],10);
121
                trmdat();
122
                for(var i=3;i<6;i++) if(dmy[i]<10) dmy[i] = "0" + dmy[i];
123
                return (""+dmy[2]+dmy[1]+dmy[0]+"."+dmy[3]+dmy[4]+dmy[5]).replace(/ /g,"");
124
            }
125
            if(!val.search(/^\s*\d+\s*\.\s*\d+\s*\.\s*\d+\s+\d+:\d\d\s*$/)) {
126
                var dp = val.search(":");
127
                dmy = val.substring(0,dp-2).split(".");
128
                dmy[3] = val.substring(dp-2,dp);
129
                dmy[4] = val.substring(dp+1,dp+3);
130
                for(var i=0;i<5;i++) dmy[i] = parseInt(dmy[i],10);
131
                trmdat();
132
                for(var i=3;i<5;i++) if(dmy[i]<10) dmy[i] = "0"+dmy[i];
133
                return (""+dmy[2]+dmy[1]+dmy[0]+"."+dmy[3]+dmy[4]).replace(/ /g,"");
134
            }
135
            if(!val.search(/^\s*\d+:\d\d\:\d\d\s*$/)) {
136
                dmy = val.split(":");
137
                for(var i=0;i<3;i++) dmy[i] = parseInt(dmy[i],10);
138
                for(var i=0;i<3;i++) if(dmy[i]<10) dmy[i] = "0"+dmy[i];
139
                return (""+dmy[0]+dmy[1]+"."+dmy[2]).replace(/ /g,"");
140
            }
141
            if(!val.search(/^\s*\d+:\d\d\s*$/)) {
142
                dmy = val.split(":");
143
                for(var i=0;i<2;i++) dmy[i] = parseInt(dmy[i],10);
144
                for(var i=0;i<2;i++) if(dmy[i]<10) dmy[i] = "0"+dmy[i];
145
                return (""+dmy[0]+dmy[1]).replace(/ /g,"");
146
            }
147
            if(!val.search(/^\s*\d+\s*\.\s*\d+\s*\.\s*\d+/)) {
148
                dmy = val.split(".");
149
                for(var i=0;i<3;i++) dmy[i] = parseInt(dmy[i],10);
150
                trmdat();
151
                return (""+dmy[2]+dmy[1]+dmy[0]).replace(/ /g,"");
152
            }
153
            stype[s] = "s";
154
            return val.toLowerCase().replace(/\u00e4/g,"ae").replace(/\u00f6/g,"oe").replace(/\u00fc/g,"ue").replace(/\u00df/g,"ss");
155
        } // convert
156

    
157
        var elementText;
158
        if(document.body.textContent)
159
            elementText = function(elem) {
160
                return elem.textContent;
161
            }
162
        else
163
            elementText = function(elem) {
164
                var eT = function(ele) {
165
                    var uele = ele.firstChild;
166
                    while(uele) {
167
                        if(uele.hasChildNodes()) eT(uele);
168
                        if(uele.nodeType == 1) {
169
                            // if(child.tagName=='INPUT'||child.tagName=='BUTTON')txt+=child.value; //Idee
170
                            Text += " ";
171
                        }
172
                        else if(uele.nodeType == 3) Text += uele.data;
173
                        uele = uele.nextSibling;
174
                    }
175
                }
176
                var Text = "";
177
                eT(elem);
178
                return Text.replace(/\s+/g," ");
179
            } // elementText
180

    
181
        this.sort = function(sp) {
182
            if(sp<0 || sp>=nspalten) return;
183
            if(!sortable[sp]) return;
184
            if (first) {
185
                for(var z=0;z<nzeilen;z++) {
186
                    var zelle = tz[z].getElementsByTagName("td"); // cells;
187
                    Arr[z] = new Array(nspalten+1);
188
                    Arr[z][nspalten] = tz[z];
189
                    for(var s=0;s<nspalten;s++) {
190
                        if (zelle[s].getAttribute("data-sort_key"))
191
                            var zi = convert(zelle[s].getAttribute("data-sort_key"),s);
192
                        else if (zelle[s].getAttribute("sort_key"))
193
                            var zi = convert(zelle[s].getAttribute("sort_key"),s);
194
                        else
195
                            var zi = convert(elementText(zelle[s]),s);
196
                        Arr[z][s] = zi ;
197
                        // zelle[s].innerHTML += "<br>"+zi; // zum Debuggen
198
                    }
199
                }
200
                first = false;
201
            }
202
            if(sp==ssort) {
203
                Arr.reverse() ;
204
                if ( sortsymbol.get(Titel[ssort])==down )
205
                    sortsymbol.set(Titel[ssort],up);
206
                else
207
                    sortsymbol.set(Titel[ssort],down);
208
            }
209
            else {
210
                if ( ssort>=0 && ssort<nspalten ) sortsymbol.set(Titel[ssort],no);
211
                    ssort = sp;
212
                if(stype[ssort]=="s") Arr.sort(VglFkt_s);
213
                else                  Arr.sort(VglFkt_n);
214
                if(sdir[ssort]=="u") {
215
                    sortsymbol.set(Titel[ssort],up);
216
                }
217
                else {
218
                    Arr.reverse() ;
219
                    sortsymbol.set(Titel[ssort],down);
220
                }
221
            }
222
            for(var z=0;z<nzeilen;z++)
223
                tbdy.appendChild(Arr[z][nspalten]);
224
            if(typeof(JB_aftersort)=="function") JB_aftersort(tab,tbdy,tz,nzeilen,nspalten,ssort);
225
        } // sort
226

    
227
//        if(!tab.title.length) tab.title="Ein Klick auf die Spalten\u00fcberschrift sortiert die Tabelle.";
228
//console.info(tab);
229
        if(!tab.title.length) tab.title="";
230
        for(var i=Titel.length-1;i>-1;i--) {
231
            var t=Titel[i];
232
            if(t.className.indexOf("sortier")>-1) {
233
                ct++;
234
                initTableHead(t,i);
235
                defsort = i ;
236
                if(t.className.indexOf("sortierbar-")>-1) sdir[i] = "d";
237
            }
238
    }
239
        if(ct==0) {
240
//console.info(Titel);
241
            for(var i=0;i<Titel.length;i++)
242
                initTableHead(Titel[i],i);
243
            defsort = 0;
244
        }
245
        if(startsort_u>=0) this.sort(startsort_u);
246
        if(startsort_d>=0) { this.sort(startsort_d); this.sort(startsort_d); }
247
        if(typeof(JB_aftersortinit)=="function") JB_aftersortinit(tab,tbdy,tz,nzeilen,nspalten,-1);
248

    
249
    } // JB_Table
250

    
251
    var JB_initTableSort = function() {
252
        if (!document.querySelectorAll) return;
253
        var Sort_Table = document.querySelectorAll("table.sortierbar");
254
        var JB_Tables = [];
255
        for(var i=0;i<Sort_Table.length;i++){ JB_Tables[i] = new JB_Table(Sort_Table[i]);}
256
//console.info(JB_Tables);
257

    
258
        var pars = decodeURI(window.location.search.substring(1));
259
        if(pars.length) { // jbts=((0,1),(10,0),(3,3),(2,2))   tnr,snr
260
            pars = pars.replace(/\s/g,"");
261
            pars = pars.match(/jbts=\(?(\(\d+,\d+\),?){1,}\)?/gi);
262
            if(pars) {
263
                pars = pars[0].substr(pars[0].search("=")+1);
264
                pars = pars.replace(/\(\(/g,"(").replace(/\)\)/g,")").replace(/\)\(/g,")|(").replace(/\),\(/g,")|(");
265
                pars = pars.split("|");
266
                for(var i=0;i<pars.length;i++) {
267
                    var p = pars[i].substring(1,pars[i].length-1).split(",");
268
                    if(p[0]>-1&&p[0]<JB_Tables.length) JB_Tables[p[0]].sort(p[1]);
269
                }
270
            }
271
        }
272
    } // initTableSort
273

    
274
    if(window.addEventListener) window.addEventListener("DOMContentLoaded",JB_initTableSort,false);
275
    else if(window.attachEvent) window.attachEvent("onload",JB_initTableSort);
276

    
277
})();
(1-1/3)