Passed
Push — master ( ddb241...e54f60 )
by Plamen
01:23
created

TableHelper.LoadData.SetVisability   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 12
c 1
b 0
f 0
nc 3
nop 2
dl 0
loc 14
rs 9.8
1
var TableHelper = {
2
    BuildRequest: {
3
        Sort: function (rq, strDesc){
4
            function sortBySpan(span, i){
5
                var order = span.innerHTML;
6
                if(order.length === 1){
7
                    rq.colNo = i;
8
                    rq.colOrd = order === strDesc ? "desc" : "asc";
9
                }
10
                return rq.colNo === i;
11
            }
12
13
            var thTags = document.getElementById(rq.tableId)
14
                    .getElementsByTagName("thead")[0]
15
                    .getElementsByTagName("th");
16
            var length = thTags.length;
17
            for(var i = 0; i < length; i++){
18
                var link = thTags[i].getElementsByTagName("a")[0];
19
                if(link){
20
                    var span = link.getElementsByTagName("span")[0];
21
                    if(span && sortBySpan(span, i)){
22
                        break;
23
                    }
24
                }
25
            }
26
        },
27
    Filter: function (rq){
28
            function getFilterFieldsByTableID(tableID){
29
                var fields = {filterBy: null, filter: null};
30
                var filterDiv = getFilterDivByTableIDOrNull(tableID);
31
                if(filterDiv !== null){
32
                    setFilterBy(fields, filterDiv);
33
                    setFilterValue(fields, filterDiv);
34
                }
35
                return fields;
36
            }
37
            function getFilterDivByTableIDOrNull(tableID){
38
                var res = null;
39
                if(document.getElementById(tableID).parentNode.getElementsByTagName("div").length > 0){
40
                    for(var i = 0; i < document.getElementById(tableID).parentNode.getElementsByTagName("div").length; i++){
41
                        if(document.getElementById(tableID).parentNode.getElementsByTagName("div")[i].getAttribute("class") === "filter"){
42
                            return document.getElementById(tableID).parentNode.getElementsByTagName("div")[i];
43
                        }
44
                    }
45
46
                }
47
                return res;
48
            }
49
            function setFilterBy(fields, filterDiv){
50
                var slctObj = filterDiv.getElementsByTagName("select")[0];
51
                if(slctObj && slctObj.options[slctObj.selectedIndex].value !== "all"){
52
                    fields.filterBy = slctObj.options[slctObj.selectedIndex].value;
53
                }
54
            }
55
            function setFilterValue(fields, filterDiv){
56
                var textObj = filterDiv.getElementsByTagName("input")[0];
57
                if(textObj && textObj.value && textObj.value.length !== 0){
58
                    fields.filter = encodeURIComponent(textObj.value.trim());
59
                }
60
            }
61
62
            var r = getFilterFieldsByTableID(rq.tableId);
63
            if(r.filter !== null){
64
                rq.filter = r.filter;
65
            }
66
            if(r.filterBy !== null){
67
                rq.filterBy = r.filterBy;
68
            }
69
        }
70
    },
71
    ColumnHover: function(tableContainer, index){
72
        var rows = document.getElementById(tableContainer).rows;
73
        var upto = rows.length - 1;
74
        if(typeof index === "undefined"){
75
            ColumnHoverRelease(rows, upto);
76
        } else {
77
            for(var i = 0; i < upto; i++){
78
                rows[i].cells[index].setAttribute("lang", "col-hover");
79
            }
80
        }
81
        function ColumnHoverRelease(rows, upto){
82
            for(var i = 0; i < upto; i++){
83
                for(var j = 0; j < rows[i].cells.length; j++){
84
                    if(rows[i].cells[j].lang){
85
                        rows[i].cells[j].removeAttribute("lang");
86
                    }
87
                }
88
            }
89
        };
90
    },
91
    Init: {
92
        SetColumnsHoverEffect: function (tContainer, tableId){
93
            var tHcells = tContainer.rows[0].cells;
94
            for(var i = 0; i < tHcells.length; i++){
95
                if(tHcells[i].firstChild.tagName === "A"){
96
                    tHcells[i].firstChild.setAttribute("onmouseover", "table.ColumnHover('" + tableId + "'," + i + ");");
97
                    tHcells[i].firstChild.setAttribute("onmouseout", "table.ColumnHover('" + tableId + "');");
98
                }
99
            }
100
        }
101
    },
102
    GoPage: {
103
        GetNo: function(lnk, tableId){
104
            //check & serve pagination jump links
105
            var jumpDir = lnk.innerHTML.trim().substr(0, 1);
106
            if(jumpDir === "+" || jumpDir === "-"){
107
                var current = document.getElementById(tableId)
108
                                .querySelector("tfoot .paging .a").innerHTML;
109
                var jump = lnk.innerHTML.replace("K", "000").replace("M", "000000000");
110
                var jumpPage = (parseInt(current) + parseInt(jump));
111
                lnk.parentNode.setAttribute("data-page", jumpPage);
112
                lnk.style.transform = "none";
113
            }
114
            return lnk.parentNode.hasAttribute("data-page") ?
115
                    lnk.parentNode.getAttribute("data-page") :
116
                    lnk.innerHTML;
117
        }
118
    },
119
    LoadData: {
120
        SetVisability: function(tableContainer, flag){
121
            var tbl = document.getElementById(tableContainer);
122
            if(flag === true){
123
                tbl.style.filter = "none";
124
                tbl.style.opacity = "1";
125
                tbl.style.cursor = "auto";
126
            }else if(flag === false){
127
                tbl.style.filter = "blur(1px)";
128
                tbl.style.opacity = "0.8";
129
                tbl.style.cursor = "wait";
130
            }else{
131
                console.error("table error in the flag value");
132
            }
133
        }
134
    },
135
    
136
    IePrior: function(v){
137
        var rv = false;
138
        if(window.navigator.appName === 'Microsoft Internet Explorer'){
139
            var ua = window.navigator.userAgent;
140
            var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
141
            if(re.exec(ua) !== null){
142
                rv = parseFloat(RegExp.$1);
143
            }
144
            rv = rv < v ? true : false;
145
        }
146
        return rv;
147
    },
148
    GetParent: function(obj, objType){
149
        while(obj && obj.tagName !== objType.toUpperCase()){
150
            obj = obj.parentNode;
151
        }
152
        return obj;
153
    },
154
    ProcessPaginationLinks: function(tfoot){
155
        var pLinks = tfoot.querySelectorAll(".paging a");
156
        if(pLinks.length > 0){
157
            for(var j = 0; j < pLinks.length; j++){
158
                pLinks[j].setAttribute("href", "javascript:void(0);");
159
                pLinks[j].setAttribute("onclick", "return table.GoPage(this);");
160
            }
161
        }
162
    },
163
    RequestToUrl: function(rq){
164
        var url = location.pathname + ".json" + location.search;
165
        if(typeof rq === "object"){
166
            var getUrlVarName = {
167
                colNo: "col", colOrd: "ord", filter: "filter",
168
                filterBy: "filter-by", pageNo: "pg", exportType: "export",
169
                tableId: "table-id"
170
            };
171
            var flagFirst = location.search.length < 1 ? true : false;
172
            for(var r in rq){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
173
                var clue = flagFirst === true ? "?" : "&";
174
                url += clue + getUrlVarName[r] + "=" + rq[r];
175
                flagFirst = false;
176
            }
177
        }
178
        return url;
179
    }
180
};
181
182
var TableHelperFilterGetTableId = function(field){
183
    if(field.tagName.toLowerCase() !== "select"){
184
        return field.getAttribute("data-table-id");
185
    }
186
    var f = field.parentNode.parentNode.getElementsByTagName("input")[0];
187
    return '' === f.value ? null : f.getAttribute("data-table-id");
188
};
189
var TableHelperDraw_Section = function(tableContainer, dt, tSection){
190
    var section = tSection === "tfoot" ? "tfoot" : "tbody";
191
    var tSec = document.getElementById(tableContainer)
192
                .getElementsByTagName(section)[0];
193
    TableHelperDraw_SectionClear(tSec, TableHelper.IePrior(9));
194
    for(var i = 0; i < dt.length; i++){
195
        var row = dt[i];
196
        var tRow = document.createElement("tr");
197
        TableHelperDraw_SectionRow(row, tRow);
198
        tSec.appendChild(tRow);
199
        if(section === "tfoot"){
200
            TableHelper.ProcessPaginationLinks(tSec);
201
        }
202
    }
203
};
204
var TableHelperDraw_SectionClear = function(tSection, iePrior9){
205
    if(iePrior9){
206
        if(tSection.firstChild){
207
            while(tSection.firstChild){
208
                tSection.removeChild(tSection.firstChild);
209
            }
210
        }
211
    }else{
212
        tSection.innerHTML = "";
213
    }
214
};
215
var TableHelperDraw_SectionRow = function(row, tRow){
216
    for(var cell in row){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
217
        var tCell = document.createElement("td");
218
        if(typeof row[cell] === "string" || typeof row[cell] === "number"){
219
            tCell.innerHTML = row[cell];
220
        }else if(typeof row[cell] === "object"){
221
            TableHelperDraw_SectionRowCellFromObject(row, cell, tCell);
222
        }
223
        tRow.appendChild(tCell);
224
    }
225
};
226
var TableHelperDraw_SectionRowCellFromObject = function(row, cell, tCell){
227
    for(var attr in row[cell]){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
228
        if(typeof row[cell][attr] === "string"){
229
            tCell.innerHTML = row[cell][attr];
230
        }else if(typeof row[cell][attr] === "object"){
231
            for(var v in row[cell][attr]){
1 ignored issue
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
232
                tCell.setAttribute(v, row[cell][attr][v]);
233
            }
234
        }
235
    }
236
};
237
238
//https://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript
239
var TableSingleton = (function(){
240
    // Instance stores a reference to the Singleton
241
    var instance;
242
    function initInstance(){
243
        // Singleton
244
        // Private methods and variables
245
        var tail = null;
246
        function Init(tableId){
247
            var tContainer = document.getElementById(tableId);
248
            if(!TableHelper.IePrior(9)){
249
                TableHelper.Init.SetColumnsHoverEffect(tContainer, tableId);
250
            }
251
            var tfoot = tContainer.getElementsByTagName("tfoot")[0];
252
            TableHelper.ProcessPaginationLinks(tfoot);
253
        }
254
        function BuildRequest(rq, crntTableId, strDesc){
255
            rq.tableId = crntTableId;
256
            TableHelper.BuildRequest.Sort(rq, strDesc);
257
            TableHelper.BuildRequest.Filter(rq);
258
        };
259
        function LoadData(tableContainer, rq){
260
            if(tail!==null){ tail.abort();}
261
            TableHelper.LoadData.SetVisability(tableContainer, false);
262
            var xmlhttp = window.XMLHttpRequest ? 
263
                            new XMLHttpRequest() : /* code for IE7+, Firefox, Chrome, Opera, Safari */
264
                            new window.ActiveXObject("Microsoft.XMLHTTP");/*code for IE6, IE5 */
265
            xmlhttp.onreadystatechange = function(){
266
                if(xmlhttp.readyState === 4 && xmlhttp.status === 200){
267
                    Draw(tableContainer, JSON.parse(xmlhttp.responseText));
268
                    TableHelper.LoadData.SetVisability(tableContainer, true);
269
                    instance.LoadEndCalback(tableContainer);
270
                }
271
            };
272
            xmlhttp.open("GET", RequestToUrl(rq), true);
273
            xmlhttp.send();
274
            tail = xmlhttp; //put at tail to can abort later any previous
275
        }
276
        function Draw(tableContainer, d){
277
            TableHelperDraw_Section(tableContainer, d.body);
278
            TableHelperDraw_Section(tableContainer, d.footer, "tfoot");
279
            if(instance.rq !== null){
280
                var hover = document.getElementById(instance.rq.tableId)
281
                            .getElementsByTagName("th")[instance.rq.colNo].lang;
282
                if(hover){
283
                    instance.ColumnHover(tableContainer, instance.rq.colNo);
284
                }
285
            }
286
        }
287
288
        var FilterGetTableId = TableHelperFilterGetTableId;
289
        var GoPageGetNo = TableHelper.GoPage.GetNo;
290
        var getParent = TableHelper.GetParent;
291
        var RequestToUrl = TableHelper.RequestToUrl;
292
293
        return {
294
            rq: null,
295
            strAsc: String.fromCharCode(9650), //&#9650;
296
            strDesc: String.fromCharCode(9660),//&#9660; 
297
            ReloadData: function(tableId){
298
                var request = {};
299
                BuildRequest(request, tableId, this.strDesc);
300
                LoadData(tableId, request);
301
            },
302
            Filter: function(field){
303
                var crntTableId = FilterGetTableId(field);
304
                if(crntTableId !== null){
305
                    var request = {};
306
                    var exRq = this.rq;
307
                    BuildRequest(request, crntTableId, this.strDesc);
308
                    if(exRq === null ||
309
                        request.filter !== exRq.filter ||
310
                        request.filterBy !== exRq.filterBy
311
                    ){
312
                        LoadData(crntTableId, request);
313
                    }
314
                }
315
            },
316
            GoPage: function(lnk){
317
                var request = {};
318
                var crntTableId = getParent(lnk, "table").getAttribute("id");
319
                BuildRequest(request, crntTableId, this.strDesc);
320
                request.pageNo = GoPageGetNo(lnk, crntTableId);
321
                LoadData(crntTableId, request);
322
                return false;
323
            },
324
            Export: function(lnk, eType){
325
                var request = {};
326
                var crntTableId = getParent(lnk, "table").getAttribute("id");
327
                BuildRequest(request, crntTableId, this.strDesc);
328
                request.exportType = ["CSV", "Excel"].indexOf(eType) >= 0 ?
329
                                        eType : 
330
                                        "csv";
331
                window.open(RequestToUrl(request));
332
                return false;
333
            },
334
            Sort: function(colNo, lnk){
335
                var request = {};
336
                var crntTableId = getParent(lnk, "table").getAttribute("id");
337
                BuildRequest(request, crntTableId, this.strDesc);
338
                if(Math.round(colNo) === request.colNo){
339
                    request.colOrd = (request.colOrd === "asc" ? "desc" : "asc");
340
                }else{
341
                    request.colNo = Math.round(colNo);
342
                    request.colOrd = "asc";
343
                }
344
                LoadData(crntTableId, request);
345
                /* Clear and add new sort arrow */
346
                var headSpans = getParent(lnk, "thead").getElementsByTagName("span");
347
                var length = headSpans.length;
348
                for(var i = 0; i < length; i++){
349
                    headSpans[i].innerHTML = "";
350
                }
351
                lnk.getElementsByTagName("span")[0].innerHTML = (request.colOrd === "desc" ? this.strDesc : this.strAsc);
352
            },
353
            ColumnHover: TableHelper.ColumnHover, //function(tableContainer, index)
354
            LoadEndCalback: function(){},/*Allows override: function(tableId){if(tableId){...}}*/
355
            init: Init
356
        };
357
    }
358
    return {
359
        //Get the Singleton instance if one exists, or create one if it doesn't
360
        getInstance: function(){
361
            if(!instance){
362
                instance = initInstance();
363
            }
364
            return instance;
365
        }
366
    };
367
})();
368
var table = TableSingleton.getInstance();
369