config/js/xxscript.js   F
last analyzed

Complexity

Total Complexity 121
Complexity/F 5.04

Size

Lines of Code 206
Function Count 24

Duplication

Duplicated Lines 206
Ratio 100 %

Importance

Changes 0
Metric Value
cc 0
eloc 159
nc 0
dl 206
loc 206
rs 2
c 0
b 0
f 0
wmc 121
mnd 6
bc 93
fnc 24
bpm 3.875
cpm 5.0416
noi 20

23 Functions

Rating   Name   Duplication   Size   Complexity  
C sorter.page 10 10 11
A sorter.showall 3 3 1
A sorter.sethover 9 9 3
A xxscript.js ➔ sorter 1 1 2
A xxscript.js ➔ T$$ 1 1 1
C sorter.search 21 21 10
A sorter.hover 3 3 2
A xxscript.js ➔ T$ 1 1 1
A sorter.set 3 3 1
B sorter.alt 12 12 8
A sorter.goto 3 3 3
B TINY.table.constructor 201 201 1
F sorter.calc 40 40 21
F sorter.sort 13 13 14
A sorter.reset 10 10 4
A sorter.newrow 5 5 2
C sorter.init 28 28 10
C sorter.size 17 17 9
A Array.exists 3 3 3
A sorter.move 3 3 4
B xxscript.js ➔ cp 8 8 7
A Number.currency 5 5 1
A xxscript.js ➔ decimals 1 1 1

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like config/js/xxscript.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1 View Code Duplication
var TINY={};
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2
3
function T$(i){return document.getElementById(i)}
4
function T$$(e,p){return p.getElementsByTagName(e)}
5
6
TINY.table=function(){
7
	function sorter(n,t,p){this.n=n; this.id=t; this.p=p; if(this.p.init){this.init()}}
8
	sorter.prototype.init=function(){
9
		this.set(); var t=this.t, i=d=0; t.h=T$$('tr',t)[0];
0 ignored issues
show
Bug introduced by
The variable d seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.d.
Loading history...
10
		t.l=t.r.length; t.w=t.r[0].cells.length; t.a=[]; t.c=[]; this.p.is=this.p.size;
11
		if(this.p.colddid){
12
			d=T$(this.p.colddid);
13
			var o=document.createElement('option'); o.value=-1; o.innerHTML='All Colomns'; d.appendChild(o)
14
		}
15
		for(i;i<t.w;i++){
16
			var c=t.h.cells[i]; t.c[i]={};
17
			if(c.className!='nosort'){
18
				c.className=this.p.headclass; c.onclick=new Function(this.n+'.sort('+i+')');
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
19
				c.onmousedown=function(){return false};
20
			}
21
			if(this.p.columns){
22
				var l=this.p.columns.length, x=0;
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable x here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
23
				for(x;x<l;x++){
24
					if(this.p.columns[x].index==i){
25
						var g=this.p.columns[x];
26
						t.c[i].format=g.format==null?1:g.format; t.c[i].decimals=g.decimals==null?2:g.decimals
27
					}
28
				}
29
			}
30
			if(d){
31
				var o=document.createElement('option'); o.value=i; o.innerHTML=T$$('h3',c)[0].innerHTML; d.appendChild(o)
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable o already seems to be declared on line 13. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
32
			}
33
		}
34
		this.reset()
35
	};
36
	sorter.prototype.reset=function(){
37
		var t=this.t; t.t=t.l;
38
		for(var i=0;i<t.l;i++){t.a[i]={}; t.a[i].s=1}
39
		if(this.p.sortcolumn!=undefined){
40
			this.sort(this.p.sortcolumn,1,this.p.is)
41
		}else{
42
			if(this.p.paginate){this.size()} this.alt(); this.sethover()
43
		}
44
		this.calc()
45
	};
46
	sorter.prototype.sort=function(x,f,z){
47
		var t=this.t; t.y=x; var x=t.h.cells[t.y], i=0, n=document.createElement('tbody');
48
		for(i;i<t.l;i++){
49
			t.a[i].o=i; var v=t.r[i].cells[t.y]; t.r[i].style.display='';
50
			while(v.hasChildNodes()){v=v.firstChild}
51
			t.a[i].v=v.nodeValue?v.nodeValue:''
52
		}
53
		for(i=0;i<t.w;i++){var c=t.h.cells[i]; if(c.className!='nosort'){c.className=this.p.headclass}}
54
		if(t.p==t.y&&!f){t.a.reverse(); x.className=t.d?this.p.ascclass:this.p.descclass; t.d=t.d?0:1}
55
		else{t.p=t.y; f&&this.p.sortdir==-1?t.a.sort(cp).reverse():t.a.sort(cp); t.d=0; x.className=this.p.ascclass}
56
		for(i=0;i<t.l;i++){var r=t.r[t.a[i].o].cloneNode(true); n.appendChild(r)}
57
		t.replaceChild(n,t.b); this.set(); this.alt(); if(this.p.paginate){this.size(z)} this.sethover()
58
	};
59
	sorter.prototype.sethover=function(){
60
		if(this.p.hoverid){
61
			for(var i=0;i<this.t.l;i++){
62
				var r=this.t.r[i];
63
				r.setAttribute('onmouseover',this.n+'.hover('+i+',1)');
64
				r.setAttribute('onmouseout',this.n+'.hover('+i+',0)')
65
			}
66
		}
67
	};
68
	sorter.prototype.calc=function(){
69
		if(this.p.sum||this.p.avg){
70
			var t=this.t, i=x=0, f,r;
0 ignored issues
show
Bug introduced by
The variable x seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.x.
Loading history...
71
			if(!T$$('tfoot',t)[0]){
72
				f=document.createElement('tfoot'); t.appendChild(f)
73
			}else{
74
				f=T$$('tfoot',t)[0]; while(f.hasChildNodes()){f.removeChild(f.firstChild)}
75
			}
76
			if(this.p.sum){
77
				r=this.newrow(f);
78
				for(i;i<t.w;i++){
79
					var j=r.cells[i];
0 ignored issues
show
Unused Code introduced by
The assignment to variable j seems to be never used. Consider removing it.
Loading history...
80
					if(this.p.sum.exists(i)){
81
						var s=0, m=t.c[i].format||'';
82
						for(x=0;x<this.t.l;x++){
83
							if(t.a[x].s){s+=parseFloat(t.r[x].cells[i].innerHTML.replace(/(\$|\,)/g,''))}
84
						}
85
						s=decimals(s,t.c[i].decimals?t.c[i].decimals:2);
86
						s=isNaN(s)?'n/a':m=='$'?s=s.currency(t.c[i].decimals):s+m;
0 ignored issues
show
Unused Code introduced by
The assignment to variable s seems to be never used. Consider removing it.
Loading history...
87
						r.cells[i].innerHTML=s
88
					}else{r.cells[i].innerHTML='&nbsp;'}
89
				}
90
			}
91
			if(this.p.avg){
92
				r=this.newrow(f);
93
				for(i=0;i<t.w;i++){
94
					var j=r.cells[i];
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable j already seems to be declared on line 79. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
95
					if(this.p.avg.exists(i)){
96
						var s=c=0, m=t.c[i].format||'';
0 ignored issues
show
Bug introduced by
The variable c seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.c.
Loading history...
Comprehensibility Naming Best Practice introduced by
The variable s already seems to be declared on line 81. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
Comprehensibility Naming Best Practice introduced by
The variable m already seems to be declared on line 81. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
97
						for(x=0;x<this.t.l;x++){
98
							if(t.a[x].s){s+=parseFloat(t.r[x].cells[i].innerHTML.replace(/(\$|\,)/g,'')); c++}
99
						}
100
						s=decimals(s/c,t.c[i].decimals?t.c[i].decimals:2);
101
						s=isNaN(s)?'n/a':m=='$'?s=s.currency(t.c[i].decimals):s+m;
102
						j.innerHTML=s
103
					}else{j.innerHTML='&nbsp;'}
104
				}
105
			}
106
		}
107
	};
108
	sorter.prototype.newrow=function(p){
109
		var r=document.createElement('tr'), i=0; p.appendChild(r);
110
		for(i;i<this.t.w;i++){r.appendChild(document.createElement('td'))}
111
		return r
112
	};
113
	sorter.prototype.alt=function(){
114
		var t=this.t, i=x=0;
0 ignored issues
show
Bug introduced by
The variable x seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.x.
Loading history...
115
		for(i;i<t.l;i++){
116
			var r=t.r[i];
117
			if(t.a[i].s){
118
				r.className=x%2==0?this.p.evenclass:this.p.oddclass; var cells=T$$('td',r);
119
				for(var z=0;z<t.w;z++){cells[z].className=t.y==z?x%2==0?this.p.evenselclass:this.p.oddselclass:''}
120
				x++
121
			}
122
			if(!t.a[i].s){r.style.display='none'}
123
		}
124
	};
125
	sorter.prototype.page=function(s){
126
		var t=this.t, i=x=0, l=s+parseInt(this.p.size);
0 ignored issues
show
Bug introduced by
The variable x seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.x.
Loading history...
127
		if(this.p.totalrecid){T$(this.p.totalrecid).innerHTML=t.t}
128
		if(this.p.currentid){T$(this.p.currentid).innerHTML=this.g}
129
		if(this.p.startingrecid){
130
			var b=((this.g-1)*this.p.size)+1, m=b+(this.p.size-1); m=m<t.l?m:t.t; m=m<t.t?m:t.t;
131
			T$(this.p.startingrecid).innerHTML=t.t==0?0:b;; T$(this.p.endingrecid).innerHTML=m
132
		}
133
		for(i;i<t.l;i++){var r=t.r[i]; if(t.a[i].s){r.style.display=x>=s&&x<l?'':'none'; x++}else{r.style.display='none'}}
134
	};
135
	sorter.prototype.move=function(d,m){
136
		this.goto(d==1?(m?this.d:this.g+1):(m?1:this.g-1))
137
	};
138
	sorter.prototype.goto=function(s){
139
		if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size)}
140
	};
141
	sorter.prototype.size=function(s){
142
		var t=this.t;
143
		if(s){this.p.size=s}
144
		this.g=1; this.d=Math.ceil(this.t.t/this.p.size);
145
		if(this.p.navid){T$(this.p.navid).style.display=this.d<2?'none':'block'}
146
		this.page(0);
147
		if(this.p.totalid){T$(this.p.totalid).innerHTML=t.t==0?1:this.d}
148
		if(this.p.pageddid){
149
			var d=T$(this.p.pageddid), l=this.d+1;
0 ignored issues
show
Unused Code introduced by
The variable l seems to be never used. Consider removing it.
Loading history...
150
			d.setAttribute('onchange',this.n+'.goto(this.value)');
151
			while(d.hasChildNodes()){d.removeChild(d.firstChild)}
152
			for(var i=1;i<=this.d;i++){
153
				var o=document.createElement('option');
154
				o.value=i; o.innerHTML=i; d.appendChild(o)
155
			}
156
		}
157
	};
158
	sorter.prototype.showall=function(){
159
		this.size(this.t.t)
160
	};
161
	sorter.prototype.search=function(f){
162
		var i=x=n=0, k=-1, q=T$(f).value.toLowerCase();
0 ignored issues
show
Bug introduced by
The variable n seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.n.
Loading history...
Bug introduced by
The variable x seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.x.
Loading history...
163
		if(this.p.colddid){k=T$(this.p.colddid).value}
164
		var s=(k==-1)?0:k, e=(k==-1)?this.t.w:parseInt(s)+1;
165
		for(i;i<this.t.l;i++){
166
			var r=this.t.r[i], v;
167
			if(q==''){
168
				v=1
169
			}else{
170
				for(x=s;x<e;x++){
171
					var b=r.cells[x].innerHTML.toLowerCase();
172
					if(b.indexOf(q)==-1){v=0}else{v=1; break}
173
				}
174
			}
175
			if(v){n++}
176
			this.t.a[i].s=v
0 ignored issues
show
Bug introduced by
The variable v seems to not be initialized for all possible execution paths.
Loading history...
177
		}
178
		this.t.t=n;
179
		if(this.p.paginate){this.size()}
180
		this.calc(); this.alt()
181
	};
182
	sorter.prototype.hover=function(i,d){
183
		this.t.r[i].id=d?this.p.hoverid:''
184
	};
185
	sorter.prototype.set=function(){
186
		var t=T$(this.id); t.b=T$$('tbody',t)[0]; t.r=t.b.rows; this.t=t
187
	};
188
	Array.prototype.exists=function(v){
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Array. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
189
		for(var i=0;i<this.length;i++){if(this[i]==v){return 1}} return 0
190
	};
191
	Number.prototype.currency=function(c){
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Number. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
192
		var n=this, d=n.toFixed(c).split('.');
193
		d[0]=d[0].split('').reverse().join('').replace(/(\d{3})(?=\d)/g,'$1,').split('').reverse().join('');
194
		return '$'+d.join('.')
195
	};
196
	function decimals(n,d){return Math.round(n*Math.pow(10,d))/Math.pow(10,d)};
197
	function cp(f,c){
198
		var g,h; f=g=f.v.toLowerCase(); c=h=c.v.toLowerCase();
199
		var i=parseFloat(f.replace(/(\$|\,)/g,'')), n=parseFloat(c.replace(/(\$|\,)/g,''));
200
		if(!isNaN(i)&&!isNaN(n)){g=i,h=n}
0 ignored issues
show
Comprehensibility introduced by
Usage of the sequence operator is discouraged, since it may lead to obfuscated code.

The sequence or comma operator allows the inclusion of multiple expressions where only is permitted. The result of the sequence is the value of the last expression.

This operator is most often used in for statements.

Used in another places it can make code hard to read, especially when people do not realize it even exists as a seperate operator.

This check looks for usage of the sequence operator in locations where it is not necessary and could be replaced by a series of expressions or statements.

var a,b,c;

a = 1, b = 1,  c= 3;

could just as well be written as:

var a,b,c;

a = 1;
b = 1;
c = 3;

To learn more about the sequence operator, please refer to the MDN.

Loading history...
201
		i=Date.parse(f); n=Date.parse(c);
202
		if(!isNaN(i)&&!isNaN(n)){g=i; h=n}
203
		return g>h?1:(g<h?-1:0)
204
	};
205
	return{sorter:sorter}
206
}();