aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/js
diff options
context:
space:
mode:
authorPeter Wu2014-07-25 23:28:21 +0200
committerPim van den Berg2014-08-02 12:29:32 +0200
commitb6be82b8edefa452e72ed53391971e53d9dccf83 (patch)
tree01a33ac72f6ef7e6e5c607238bc5e4dd3a8751fe /js
parentsupport php versions without json support and show a warning message (diff)
downloadapt-panopticon_cgp-b6be82b8edefa452e72ed53391971e53d9dccf83.zip
apt-panopticon_cgp-b6be82b8edefa452e72ed53391971e53d9dccf83.tar.gz
apt-panopticon_cgp-b6be82b8edefa452e72ed53391971e53d9dccf83.tar.bz2
apt-panopticon_cgp-b6be82b8edefa452e72ed53391971e53d9dccf83.tar.xz
jsrrdgraph: Fixed jshint warnings/errors
Many fall in the category missing semicolon, but there are legitimate bugs (like throwing an error with an undefined variable, using isInfinite instead of !isFinite or fabs instead of Math.abs). At some places, I moved the variable declarations to avoid duplicate definition warnings. Redundant breaks have been removed (after return / throw). Global variables were implicitly defined in RrdDataFile (which caught my attention) and Base64, these have been made local. Also fixed some whitespace errors. Yay, the consistency. Not all (style) issues are fixed.
Diffstat (limited to 'js')
-rw-r--r--js/RrdCmdLine.js26
-rw-r--r--js/RrdDataFile.js21
-rw-r--r--js/RrdGfxCanvas.js13
-rw-r--r--js/RrdGfxPdf.js8
-rw-r--r--js/RrdGfxSvg.js2
-rw-r--r--js/RrdGraph.js65
-rw-r--r--js/RrdJson.js103
-rw-r--r--js/RrdRpn.js4
-rw-r--r--js/RrdTime.js42
-rw-r--r--js/base64.js5
-rw-r--r--js/rrdFile.js2
-rw-r--r--js/sprintf.js35
-rw-r--r--js/strftime.js77
13 files changed, 185 insertions, 218 deletions
diff --git a/js/RrdCmdLine.js b/js/RrdCmdLine.js
index ceec693..a2be92e 100644
--- a/js/RrdCmdLine.js
+++ b/js/RrdCmdLine.js
@@ -184,6 +184,8 @@ RrdCmdLine.prototype = {
184 }, 184 },
185 set_option: function(option, value) 185 set_option: function(option, value)
186 { 186 {
187 var args = value.split(':');
188 var index = value.indexOf(':');
187 switch(option) { 189 switch(option) {
188 case 'base': 190 case 'base':
189 case 'b': 191 case 'b':
@@ -193,12 +195,12 @@ RrdCmdLine.prototype = {
193 break; 195 break;
194 case 'color': 196 case 'color':
195 case 'c': 197 case 'c':
196 var index = value.indexOf('#'); 198 index = value.indexOf('#');
197 if (index === -1) 199 if (index === -1)
198 throw "invalid color def format"; 200 throw "invalid color def format";
199 var name = value.substr(0,index); 201 var name = value.substr(0,index);
200 if (!this.graph.GRC[name]) 202 if (!this.graph.GRC[name])
201 throw "invalid color name '"+name+"'" 203 throw "invalid color name '" + name + "'";
202 this.graph.GRC[name] = value.substr(index); // FIXME check color 204 this.graph.GRC[name] = value.substr(index); // FIXME check color
203 break; 205 break;
204 case 'end': 206 case 'end':
@@ -212,7 +214,7 @@ RrdCmdLine.prototype = {
212 break; 214 break;
213 case 'graph-render-mode': 215 case 'graph-render-mode':
214 case 'G': 216 case 'G':
215 // im->graph_antialias 217 // im->graph_antialias
216 break; 218 break;
217 case 'height': 219 case 'height':
218 case 'h': 220 case 'h':
@@ -225,7 +227,7 @@ RrdCmdLine.prototype = {
225 break; 227 break;
226 case 'lower-limit': 228 case 'lower-limit':
227 case 'l': 229 case 'l':
228 this.graph.setminval = parseFloat(value) 230 this.graph.setminval = parseFloat(value);
229 break; 231 break;
230 case 'zoom': 232 case 'zoom':
231 case 'm': 233 case 'm':
@@ -235,11 +237,10 @@ RrdCmdLine.prototype = {
235 break; 237 break;
236 case 'font': 238 case 'font':
237 case 'n': 239 case 'n':
238 var args = value.split(':');
239 if (args.length !== 3) 240 if (args.length !== 3)
240 throw "invalid text property format"; 241 throw "invalid text property format";
241 if (!this.graph.TEXT[args[0]]) 242 if (!this.graph.TEXT[args[0]])
242 throw "invalid fonttag '"+args[0]+"'" 243 throw "invalid font tag '" + args[0] + "'";
243 if (args[1] > 0) 244 if (args[1] > 0)
244 this.graph.TEXT[args[0]].size = args[1]; 245 this.graph.TEXT[args[0]].size = args[1];
245 if (args[2]) 246 if (args[2])
@@ -292,7 +293,6 @@ RrdCmdLine.prototype = {
292 if (value === 'none') { 293 if (value === 'none') {
293 this.graph.draw_x_grid = false; 294 this.graph.draw_x_grid = false;
294 } else { 295 } else {
295 var args = value.split(':');
296 if (args.length !== 8) 296 if (args.length !== 8)
297 throw "invalid x-grid format"; 297 throw "invalid x-grid format";
298 this.graph.xlab_user.gridtm = this.graph.tmt_conv(args[0]); 298 this.graph.xlab_user.gridtm = this.graph.tmt_conv(args[0]);
@@ -318,7 +318,6 @@ RrdCmdLine.prototype = {
318 if (value === 'none') { 318 if (value === 'none') {
319 this.graph.draw_y_grid = false; 319 this.graph.draw_y_grid = false;
320 } else { 320 } else {
321 var index = value.indexOf(':');
322 if (index === -1) 321 if (index === -1)
323 throw "invalid y-grid format"; 322 throw "invalid y-grid format";
324 this.graph.ygridstep = parseFloat(value.substr(0,index)); 323 this.graph.ygridstep = parseFloat(value.substr(0,index));
@@ -338,7 +337,6 @@ RrdCmdLine.prototype = {
338 throw "invalid argument for --units: "+value; 337 throw "invalid argument for --units: "+value;
339 break; 338 break;
340 case 'right-axis': 339 case 'right-axis':
341 var index = value.indexOf(':');
342 if (index === -1) 340 if (index === -1)
343 throw "invalid right-axis format expected scale:shift"; 341 throw "invalid right-axis format expected scale:shift";
344 this.graph.second_axis_scale = parseFloat(value.substr(0,index)); 342 this.graph.second_axis_scale = parseFloat(value.substr(0,index));
@@ -378,7 +376,6 @@ RrdCmdLine.prototype = {
378 this.graph.draw_3d_border = parseInt(value, 10); 376 this.graph.draw_3d_border = parseInt(value, 10);
379 break; 377 break;
380 case 'grid-dash': 378 case 'grid-dash':
381 var index = value.indexOf(':');
382 if (index === -1) 379 if (index === -1)
383 throw "expected grid-dash format float:float"; 380 throw "expected grid-dash format float:float";
384 this.graph.grid_dash_on = parseFloat(value.substr(0,index)); 381 this.graph.grid_dash_on = parseFloat(value.substr(0,index));
@@ -399,20 +396,17 @@ RrdCmdLine.prototype = {
399 var rrdfile = vnames[1]; 396 var rrdfile = vnames[1];
400 var name = args[n++]; 397 var name = args[n++];
401 var cf = args[n++]; 398 var cf = args[n++];
402 var step = undefined; 399 var step, reduce, start, end;
403 var reduce = undefined;
404 var start = undefined;
405 var end = undefined;
406 if (args.length > n) { 400 if (args.length > n) {
407 for (var j = n, xlen = args.length ; j < xlen ; j++) { 401 for (var j = n, xlen = args.length ; j < xlen ; j++) {
408 var opts = args[j].split("="); 402 var opts = args[j].split("=");
409 if (opts[0] === "step") step = opts[1]; 403 if (opts[0] === "step") step = opts[1];
410 if (opts[0] === "reduce") reduce = opts[1] 404 if (opts[0] === "reduce") reduce = opts[1];
411 if (opts[0] === "start") start = opts[1]; 405 if (opts[0] === "start") start = opts[1];
412 if (opts[0] === "end") end = opts[1]; 406 if (opts[0] === "end") end = opts[1];
413 } 407 }
414 } 408 }
415 this.graph.gdes_add_def(vname, rrdfile, name, cf, step, start, end, reduce) 409 this.graph.gdes_add_def(vname, rrdfile, name, cf, step, start, end, reduce);
416 }, 410 },
417 // CDEF:vname=RPN expression 411 // CDEF:vname=RPN expression
418 parse_cdef: function (line) 412 parse_cdef: function (line)
diff --git a/js/RrdDataFile.js b/js/RrdDataFile.js
index 4ebb220..2c0e846 100644
--- a/js/RrdDataFile.js
+++ b/js/RrdDataFile.js
@@ -42,21 +42,23 @@ RrdDataFile.prototype = {
42 var cal_start, cal_end; 42 var cal_start, cal_end;
43 var best_full_rra = 0, best_part_rra = 0, chosen_rra = 0; 43 var best_full_rra = 0, best_part_rra = 0, chosen_rra = 0;
44 var best_full_step_diff = 0, best_part_step_diff = 0, tmp_step_diff = 0, tmp_match = 0, best_match = 0; 44 var best_full_step_diff = 0, best_part_step_diff = 0, tmp_step_diff = 0, tmp_match = 0, best_match = 0;
45 var full_match, rra_base; 45 var full_match;
46 var first_full = 1; 46 var first_full = 1;
47 var first_part = 1; 47 var first_part = 1;
48 var data_ptr; 48 var data_ptr;
49 var rows; 49 var rows;
50 var rra;
51 var i, ii;
50 52
51 var cf_idx = gdp.cf; 53 var cf_idx = gdp.cf;
52 var ds_cnt = rrd.getNrDSs(); 54 var ds_cnt = rrd.getNrDSs();
53 var rra_cnt = rrd.getNrRRAs(); 55 var rra_cnt = rrd.getNrRRAs();
54 56
55 for (var i = 0; i < ds_cnt; i++) 57 for (i = 0; i < ds_cnt; i++)
56 gdp.ds_namv[i] = rrd.rrd_header.getDSbyIdx(i).getName(); 58 gdp.ds_namv[i] = rrd.rrd_header.getDSbyIdx(i).getName();
57 59
58 for (var i = 0; i < rra_cnt; i++) { 60 for (i = 0; i < rra_cnt; i++) {
59 var rra = rrd.getRRAInfo(i); 61 rra = rrd.getRRAInfo(i);
60 if (RrdGraphDesc.cf_conv(rra.getCFName()) === cf_idx) { 62 if (RrdGraphDesc.cf_conv(rra.getCFName()) === cf_idx) {
61 cal_end = (rrd.getLastUpdate() - (rrd.getLastUpdate() % (rra.getPdpPerRow() * rra.pdp_step))); 63 cal_end = (rrd.getLastUpdate() - (rrd.getLastUpdate() % (rra.getPdpPerRow() * rra.pdp_step)));
62 cal_start = (cal_end - (rra.getPdpPerRow() * rra.row_cnt * rra.pdp_step)); 64 cal_start = (cal_end - (rra.getPdpPerRow() * rra.row_cnt * rra.pdp_step));
@@ -87,7 +89,7 @@ RrdDataFile.prototype = {
87 else throw "the RRD does not contain an RRA matching the chosen CF"; 89 else throw "the RRD does not contain an RRA matching the chosen CF";
88 90
89 var rra_info = rrd.getRRAInfo(chosen_rra); 91 var rra_info = rrd.getRRAInfo(chosen_rra);
90 var rra = rrd.getRRA(chosen_rra); 92 rra = rrd.getRRA(chosen_rra);
91 93
92 ft_step = rrd.rrd_header.pdp_step * rra_info.getPdpPerRow(); 94 ft_step = rrd.rrd_header.pdp_step * rra_info.getPdpPerRow();
93 gdp.start -= (gdp.start % ft_step); 95 gdp.start -= (gdp.start % ft_step);
@@ -107,13 +109,13 @@ RrdDataFile.prototype = {
107 109
108 for (i = start_offset; i < rra.row_cnt - end_offset; i++) { 110 for (i = start_offset; i < rra.row_cnt - end_offset; i++) {
109 if (i < 0) { 111 if (i < 0) {
110 for (var ii = 0; ii < ds_cnt; ii++) 112 for (ii = 0; ii < ds_cnt; ii++)
111 gdp.data[data_ptr++] = Number.NaN; 113 gdp.data[data_ptr++] = Number.NaN;
112 } else if (i >= rra.row_cnt) { 114 } else if (i >= rra.row_cnt) {
113 for (var ii = 0; ii < ds_cnt; ii++) 115 for (ii = 0; ii < ds_cnt; ii++)
114 gdp.data[data_ptr++] = Number.NaN; 116 gdp.data[data_ptr++] = Number.NaN;
115 } else { 117 } else {
116 for (var ii = 0; ii < ds_cnt; ii++) 118 for(ii = 0; ii < ds_cnt; ii++)
117 gdp.data[data_ptr++] = rra.getEl(i, ii); 119 gdp.data[data_ptr++] = rra.getEl(i, ii);
118 } 120 }
119 } 121 }
@@ -153,8 +155,7 @@ RrdDataFile.prototype = {
153 }, 155 },
154 fetch_async: function(gdp, ft_step, callback, callback_arg) 156 fetch_async: function(gdp, ft_step, callback, callback_arg)
155 { 157 {
156 var rrd; 158 if (gdp.rrd === null) return -1;
157 if (gdp.rrd == null) return -1;
158 159
159 if (gdp.rrd in this.rrdfiles) { 160 if (gdp.rrd in this.rrdfiles) {
160 callback(callback_arg, this.build(gdp, ft_step, this.rrdfiles[gdp.rrd])); 161 callback(callback_arg, this.build(gdp, ft_step, this.rrdfiles[gdp.rrd]));
diff --git a/js/RrdGfxCanvas.js b/js/RrdGfxCanvas.js
index 070b806..0d1784e 100644
--- a/js/RrdGfxCanvas.js
+++ b/js/RrdGfxCanvas.js
@@ -57,7 +57,7 @@ RrdGfxCanvas.prototype.line = function (X0, Y0, X1, Y1, width, color)
57 } 57 }
58 this.ctx.save(); 58 this.ctx.save();
59 this.ctx.lineWidth = width; 59 this.ctx.lineWidth = width;
60 this.ctx.strokeStyle = color 60 this.ctx.strokeStyle = color;
61 this.ctx.beginPath(); 61 this.ctx.beginPath();
62 this.ctx.moveTo(X0, Y0); 62 this.ctx.moveTo(X0, Y0);
63 this.ctx.lineTo(X1, Y1); 63 this.ctx.lineTo(X1, Y1);
@@ -67,6 +67,7 @@ RrdGfxCanvas.prototype.line = function (X0, Y0, X1, Y1, width, color)
67 67
68RrdGfxCanvas.prototype.dashed_line = function (X0, Y0, X1, Y1, width, color, dash_on, dash_off) 68RrdGfxCanvas.prototype.dashed_line = function (X0, Y0, X1, Y1, width, color, dash_on, dash_off)
69{ 69{
70 var swap, n;
70 X0 = Math.round(X0); 71 X0 = Math.round(X0);
71 Y0 = Math.round(Y0); 72 Y0 = Math.round(Y0);
72 X1 = Math.round(X1); 73 X1 = Math.round(X1);
@@ -81,12 +82,12 @@ RrdGfxCanvas.prototype.dashed_line = function (X0, Y0, X1, Y1, width, color, das
81 Y0 += 0.5; 82 Y0 += 0.5;
82 Y1 += 0.5; 83 Y1 += 0.5;
83 if (X0 > X1) { 84 if (X0 > X1) {
84 var swap = X0; 85 swap = X0;
85 X0 = X1; 86 X0 = X1;
86 X1 = swap; 87 X1 = swap;
87 } 88 }
88 this.ctx.moveTo(X0, Y0); 89 this.ctx.moveTo(X0, Y0);
89 var n=0; 90 n = 0;
90 while(X0<=X1) { 91 while(X0<=X1) {
91 if (n%2 === 1) { 92 if (n%2 === 1) {
92 X0 += dash_on; 93 X0 += dash_on;
@@ -101,12 +102,12 @@ RrdGfxCanvas.prototype.dashed_line = function (X0, Y0, X1, Y1, width, color, das
101 X0 += 0.5; 102 X0 += 0.5;
102 X1 += 0.5; 103 X1 += 0.5;
103 if (Y0 > Y1) { 104 if (Y0 > Y1) {
104 var swap = Y0; 105 swap = Y0;
105 Y0 = Y1; 106 Y0 = Y1;
106 Y1 = swap; 107 Y1 = swap;
107 } 108 }
108 this.ctx.moveTo(X0, Y0); 109 this.ctx.moveTo(X0, Y0);
109 var n=0; 110 n = 0;
110 while(Y0<=Y1) { 111 while(Y0<=Y1) {
111 if (n%2 === 1) { 112 if (n%2 === 1) {
112 Y0 += dash_on; 113 Y0 += dash_on;
@@ -201,7 +202,7 @@ RrdGfxCanvas.prototype.lineTo = function (x,y)
201{ 202{
202 x = Math.round(x)+0.5; 203 x = Math.round(x)+0.5;
203 y = Math.round(y)+0.5; 204 y = Math.round(y)+0.5;
204 this.ctx.lineTo(x, y) 205 this.ctx.lineTo(x, y);
205}; 206};
206 207
207RrdGfxCanvas.prototype.text = function (x, y, color, font, tabwidth, angle, h_align, v_align, text) 208RrdGfxCanvas.prototype.text = function (x, y, color, font, tabwidth, angle, h_align, v_align, text)
diff --git a/js/RrdGfxPdf.js b/js/RrdGfxPdf.js
index 9203020..230d441 100644
--- a/js/RrdGfxPdf.js
+++ b/js/RrdGfxPdf.js
@@ -267,7 +267,7 @@ RrdGfxPdf.prototype.moveTo = function (x,y)
267 267
268RrdGfxPdf.prototype.lineTo = function (x,y) 268RrdGfxPdf.prototype.lineTo = function (x,y)
269{ 269{
270 this._lineTo(x, y) 270 this._lineTo(x, y);
271}; 271};
272 272
273RrdGfxPdf.prototype.text = function (x, y, color, font, tabwidth, angle, h_align, v_align, text) 273RrdGfxPdf.prototype.text = function (x, y, color, font, tabwidth, angle, h_align, v_align, text)
@@ -319,7 +319,7 @@ RrdGfxPdf.prototype.text = function (x, y, color, font, tabwidth, angle, h_align
319 } 319 }
320 320
321 x = x*this.k; 321 x = x*this.k;
322 y = (this.h-y)*this.k 322 y = (this.h-y)*this.k;
323 323
324 var tm = []; 324 var tm = [];
325 tm[0] = Math.cos(angle*Math.PI/180.0); 325 tm[0] = Math.cos(angle*Math.PI/180.0);
@@ -834,7 +834,7 @@ RrdGfxPdf.prototype._putstream = function(s)
834 this._out('stream'); 834 this._out('stream');
835 this._out(s); 835 this._out(s);
836 this._out('endstream'); 836 this._out('endstream');
837}, 837};
838 838
839RrdGfxPdf.prototype._out = function(s) 839RrdGfxPdf.prototype._out = function(s)
840{ 840{
@@ -964,7 +964,7 @@ RrdGfxPdf.prototype._putcatalog = function()
964 this._out('/OpenAction [3 0 R /FitH null]'); 964 this._out('/OpenAction [3 0 R /FitH null]');
965 else if(this.ZoomMode=='real') 965 else if(this.ZoomMode=='real')
966 this._out('/OpenAction [3 0 R /XYZ null null 1]'); 966 this._out('/OpenAction [3 0 R /XYZ null null 1]');
967 else if(!(typeof this.ZoomMode === 'string')) 967 else if(typeof this.ZoomMode !== 'string')
968 this._out('/OpenAction [3 0 R /XYZ null null '+sprintf('%.2F',this.ZoomMode/100)+']'); 968 this._out('/OpenAction [3 0 R /XYZ null null '+sprintf('%.2F',this.ZoomMode/100)+']');
969 969
970 if(this.LayoutMode=='single') 970 if(this.LayoutMode=='single')
diff --git a/js/RrdGfxSvg.js b/js/RrdGfxSvg.js
index 2bdc1b9..ffc0071 100644
--- a/js/RrdGfxSvg.js
+++ b/js/RrdGfxSvg.js
@@ -25,7 +25,7 @@
25 * @constructor 25 * @constructor
26 */ 26 */
27var RrdGfxSvg = function(svgId) { 27var RrdGfxSvg = function(svgId) {
28 this.svg = document.getElementById(svgId) 28 this.svg = document.getElementById(svgId);
29 this.svgns = "http://www.w3.org/2000/svg"; 29 this.svgns = "http://www.w3.org/2000/svg";
30 this.xmlns = "http://www.w3.org/XML/1998/namespace"; 30 this.xmlns = "http://www.w3.org/XML/1998/namespace";
31 this.path = null; 31 this.path = null;
diff --git a/js/RrdGraph.js b/js/RrdGraph.js
index 55a131d..7171a9c 100644
--- a/js/RrdGraph.js
+++ b/js/RrdGraph.js
@@ -88,7 +88,7 @@ var RrdGraphDesc = function (graph)
88 88
89 /** ** **/ 89 /** ** **/
90 var args = []; // FIXME other way ¿? 90 var args = []; // FIXME other way ¿?
91 var type = arguments[1] 91 var type = arguments[1];
92 args[0] = arguments[0]; 92 args[0] = arguments[0];
93 for(var i = 2; i < arguments.length; i++) args[i-1] = arguments[i]; 93 for(var i = 2; i < arguments.length; i++) args[i-1] = arguments[i];
94 94
@@ -707,7 +707,7 @@ var RrdGraph = function (gfx, data)
707{ 707{
708 this.gfx = gfx; /* graphics object */ 708 this.gfx = gfx; /* graphics object */
709 this.data = data; /* fetch data object */ 709 this.data = data; /* fetch data object */
710 this.data_need_fetch = [] /* List of data that need to be fetched */ 710 this.data_need_fetch = []; /* List of data that need to be fetched */
711 711
712 this.minval = Number.NaN; /* extreme values in the data */ 712 this.minval = Number.NaN; /* extreme values in the data */
713 this.maxval = Number.NaN; 713 this.maxval = Number.NaN;
@@ -1197,13 +1197,13 @@ RrdGraph.prototype.print_calc = function()
1197 case RrdGraphDesc.GF_HRULE: 1197 case RrdGraphDesc.GF_HRULE:
1198 if (isNaN(this.gdes[i].yrule)) { /* we must set this here or the legend printer can not decide to print the legend */ 1198 if (isNaN(this.gdes[i].yrule)) { /* we must set this here or the legend printer can not decide to print the legend */
1199 this.gdes[i].yrule = this.gdes[vidx].vf.val; 1199 this.gdes[i].yrule = this.gdes[vidx].vf.val;
1200 }; 1200 }
1201 graphelement = 1; 1201 graphelement = 1;
1202 break; 1202 break;
1203 case RrdGraphDesc.GF_VRULE: 1203 case RrdGraphDesc.GF_VRULE:
1204 if (this.gdes[i].xrule === 0) { /* again ... the legend printer needs it */ 1204 if (this.gdes[i].xrule === 0) { /* again ... the legend printer needs it */
1205 this.gdes[i].xrule = this.gdes[vidx].vf.when; 1205 this.gdes[i].xrule = this.gdes[vidx].vf.when;
1206 }; 1206 }
1207 graphelement = 1; 1207 graphelement = 1;
1208 break; 1208 break;
1209 case RrdGraphDesc.GF_COMMENT: 1209 case RrdGraphDesc.GF_COMMENT:
@@ -1216,7 +1216,6 @@ RrdGraph.prototype.print_calc = function()
1216 break; 1216 break;
1217 case RrdGraphDesc.GF_STACK: 1217 case RrdGraphDesc.GF_STACK:
1218 throw new RrdGraphError("STACK should already be turned into LINE or AREA here"); 1218 throw new RrdGraphError("STACK should already be turned into LINE or AREA here");
1219 break;
1220 } 1219 }
1221 } 1220 }
1222 return graphelement; 1221 return graphelement;
@@ -1287,7 +1286,7 @@ RrdGraph.prototype.reduce_data = function(gdes, cur_step)
1287 newval = gdes.data[srcptr + i*gdes.ds_cnt + col]; 1286 newval = gdes.data[srcptr + i*gdes.ds_cnt + col];
1288 break; 1287 break;
1289 } 1288 }
1290 } 1289 }
1291 } 1290 }
1292 1291
1293 if (validval === 0) { 1292 if (validval === 0) {
@@ -1316,8 +1315,8 @@ RrdGraph.prototype.reduce_data = function(gdes, cur_step)
1316 row_cnt -= reduce_factor; 1315 row_cnt -= reduce_factor;
1317 } 1316 }
1318 if (end_offset) { 1317 if (end_offset) {
1319 for (col = 0; col < gdes.ds_cnt; col++) 1318 for (col = 0; col < gdes.ds_cnt; col++)
1320 gdes.data[dstptr++] = Number.NaN; 1319 gdes.data[dstptr++] = Number.NaN;
1321 } 1320 }
1322}; 1321};
1323 1322
@@ -1396,7 +1395,7 @@ RrdGraph.prototype.data_fetch_async = function ()
1396 } 1395 }
1397 } 1396 }
1398 this.data_need_fetch.push(0); 1397 this.data_need_fetch.push(0);
1399 } 1398 }
1400 1399
1401 for (var i = 0, gdes_c = this.gdes.length; i < gdes_c; i++) { 1400 for (var i = 0, gdes_c = this.gdes.length; i < gdes_c; i++) {
1402 if (this.data_need_fetch[i] == 0) { 1401 if (this.data_need_fetch[i] == 0) {
@@ -1619,7 +1618,6 @@ RrdGraph.prototype.data_proc = function()
1619 break; 1618 break;
1620 case RrdGraphDesc.GF_STACK: 1619 case RrdGraphDesc.GF_STACK:
1621 throw new RrdGraphError("STACK should already be turned into LINE or AREA here"); 1620 throw new RrdGraphError("STACK should already be turned into LINE or AREA here");
1622 break;
1623 default: 1621 default:
1624 break; 1622 break;
1625 } 1623 }
@@ -1699,7 +1697,7 @@ RrdGraph.prototype.leg_place = function (calc_width)
1699 } 1697 }
1700 1698
1701 if (this.gdes[i].legend != null) { 1699 if (this.gdes[i].legend != null) {
1702 this.gdes[i].legend = this.gdes[i].legend.replace(/\\t/gi, "\t") /* turn \\t into tab */ 1700 this.gdes[i].legend = this.gdes[i].legend.replace(/\\t/gi, "\t"); /* turn \\t into tab */
1703 leg_cc = this.gdes[i].legend.length; 1701 leg_cc = this.gdes[i].legend.length;
1704 } else { 1702 } else {
1705 leg_cc = 0; 1703 leg_cc = 0;
@@ -1863,7 +1861,7 @@ RrdGraph.prototype.horizontal_log_grid = function ()
1863 [ 1.0, 2.0, 4.0, 6.0, 8.0, 10., 0.0, 0.0, 0.0, 0.0 ], 1861 [ 1.0, 2.0, 4.0, 6.0, 8.0, 10., 0.0, 0.0, 0.0, 0.0 ],
1864 [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10. ], 1862 [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10. ],
1865 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] /* last line */ 1863 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] /* last line */
1866 ]; 1864 ];
1867 var i, j, val_exp, min_exp; 1865 var i, j, val_exp, min_exp;
1868 var nex; /* number of decades in data */ 1866 var nex; /* number of decades in data */
1869 var logscale; /* scale in logarithmic space */ 1867 var logscale; /* scale in logarithmic space */
@@ -1885,7 +1883,7 @@ RrdGraph.prototype.horizontal_log_grid = function ()
1885 /* major spacing for less dynamic data */ 1883 /* major spacing for less dynamic data */
1886 do { 1884 do {
1887 mid++; 1885 mid++;
1888 for (i = 0; yloglab[mid][i + 1] < 10.0; i++) {}; 1886 for (i = 0; yloglab[mid][i + 1] < 10.0; i++) ;
1889 mspac = logscale * Math.log(10.0 / yloglab[mid][i])/Math.LN10; 1887 mspac = logscale * Math.log(10.0 / yloglab[mid][i])/Math.LN10;
1890 } while (mspac > 1.56 * this.TEXT.LEGEND.size && yloglab[mid][0] > 0); // FIXME 2->1.56 ?? 1888 } while (mspac > 1.56 * this.TEXT.LEGEND.size && yloglab[mid][0] > 0); // FIXME 2->1.56 ??
1891 if (mid) mid--; 1889 if (mid) mid--;
@@ -1966,7 +1964,7 @@ RrdGraph.prototype.horizontal_log_grid = function ()
1966 if (mid < 4 && exfrac === 1) { /* minor grid */ 1964 if (mid < 4 && exfrac === 1) { /* minor grid */
1967 if (flab === 0) { /* find first and last minor line behind current major line * i is the first line and j tha last */ 1965 if (flab === 0) { /* find first and last minor line behind current major line * i is the first line and j tha last */
1968 min_exp = val_exp - 1; 1966 min_exp = val_exp - 1;
1969 for (i = 1; yloglab[mid][i] < 10.0; i++) {}; 1967 for (i = 1; yloglab[mid][i] < 10.0; i++) ;
1970 i = yloglab[mid][i - 1] + 1; 1968 i = yloglab[mid][i - 1] + 1;
1971 j = 10; 1969 j = 10;
1972 } else { 1970 } else {
@@ -2002,7 +2000,7 @@ RrdGraph.prototype.horizontal_log_grid = function ()
2002 if (mid < 4 && exfrac === 1) { /* draw minor lines after highest major line */ 2000 if (mid < 4 && exfrac === 1) { /* draw minor lines after highest major line */
2003 if (flab === 0) { /* find first and last minor line below current major line * i is the first line and j tha last */ 2001 if (flab === 0) { /* find first and last minor line below current major line * i is the first line and j tha last */
2004 min_exp = val_exp - 1; 2002 min_exp = val_exp - 1;
2005 for (i = 1; yloglab[mid][i] < 10.0; i++) {}; 2003 for (i = 1; yloglab[mid][i] < 10.0; i++) ;
2006 i = yloglab[mid][i - 1] + 1; 2004 i = yloglab[mid][i - 1] + 1;
2007 j = 10; 2005 j = 10;
2008 } else { 2006 } else {
@@ -2386,20 +2384,20 @@ RrdGraph.prototype.grid_paint = function()
2386 this.GRC.FONT, this.TEXT.TITLE, this.tabwidth, 0.0, RrdGraph.GFX_H_CENTER, RrdGraph.GFX_V_TOP, this.title); 2384 this.GRC.FONT, this.TEXT.TITLE, this.tabwidth, 0.0, RrdGraph.GFX_H_CENTER, RrdGraph.GFX_V_TOP, this.title);
2387 /* rrdtool 'logo' */ 2385 /* rrdtool 'logo' */
2388 if (!this.no_rrdtool_tag){ 2386 if (!this.no_rrdtool_tag){
2389 var color = this.parse_color(this.GRC.FONT); 2387 var color = this.parse_color(this.GRC.FONT);
2390 color[3] = 0.3; 2388 color[3] = 0.3;
2391 var water_color = this.color2rgba(color); 2389 var water_color = this.color2rgba(color);
2392 var xpos = this.legendposition === RrdGraph.LEGEND_POS_EAST ? this.xOriginLegendY : this.ximg - 4; 2390 var xpos = this.legendposition === RrdGraph.LEGEND_POS_EAST ? this.xOriginLegendY : this.ximg - 4;
2393 this.gfx.text(xpos, 5, water_color, this.TEXT.WATERMARK, this.tabwidth, 2391 this.gfx.text(xpos, 5, water_color, this.TEXT.WATERMARK, this.tabwidth,
2394 -90, RrdGraph.GFX_H_LEFT, RrdGraph.GFX_V_TOP, "RRDTOOL / TOBI OETIKER"); 2392 -90, RrdGraph.GFX_H_LEFT, RrdGraph.GFX_V_TOP, "RRDTOOL / TOBI OETIKER");
2395 } 2393 }
2396 /* graph watermark */ 2394 /* graph watermark */
2397 if (this.watermark) { 2395 if (this.watermark) {
2398 var color = this.parse_color(this.GRC.FONT) 2396 var color = this.parse_color(this.GRC.FONT);
2399 color[3] = 0.3; 2397 color[3] = 0.3;
2400 var water_color = this.color2rgba(color); 2398 var water_color = this.color2rgba(color);
2401 this.gfx.text(this.ximg / 2, this.yimg - 6, water_color, this.TEXT.WATERMARK , this.tabwidth, 0, 2399 this.gfx.text(this.ximg / 2, this.yimg - 6, water_color, this.TEXT.WATERMARK , this.tabwidth, 0,
2402 RrdGraph.GFX_H_CENTER, RrdGraph.GFX_V_BOTTOM, this.watermark); 2400 RrdGraph.GFX_H_CENTER, RrdGraph.GFX_V_BOTTOM, this.watermark);
2403 } 2401 }
2404 /* graph labels */ 2402 /* graph labels */
2405 if (!(this.no_legend) && !(this.only_graph)) { 2403 if (!(this.no_legend) && !(this.only_graph)) {
@@ -2664,11 +2662,11 @@ RrdGraph.prototype.graph_paint_init = function()
2664// this.gdes[i].end_orig = this.end; 2662// this.gdes[i].end_orig = this.end;
2665 } 2663 }
2666 2664
2667} 2665};
2668 2666
2669RrdGraph.prototype.graph_paint_draw = function() 2667RrdGraph.prototype.graph_paint_draw = function()
2670{ 2668{
2671 var areazero = 0.0 2669 var areazero = 0.0;
2672 var lastgdes = null; 2670 var lastgdes = null;
2673 2671
2674 if (this.data_calc() === -1) 2672 if (this.data_calc() === -1)
@@ -2773,7 +2771,7 @@ RrdGraph.prototype.graph_paint_draw = function()
2773 this.gfx.moveTo(x, y); 2771 this.gfx.moveTo(x, y);
2774 x = ii + this.xorigin; 2772 x = ii + this.xorigin;
2775 y = last_y; 2773 y = last_y;
2776 this.gfx.lineTo(x, y) 2774 this.gfx.lineTo(x, y);
2777 } else { 2775 } else {
2778 var x = ii - 1 + this.xorigin; 2776 var x = ii - 1 + this.xorigin;
2779 var y = this.ytr(this.gdes[i].p_data[ii - 1]); 2777 var y = this.ytr(this.gdes[i].p_data[ii - 1]);
@@ -2886,7 +2884,6 @@ RrdGraph.prototype.graph_paint_draw = function()
2886 break; 2884 break;
2887 case RrdGraphDesc.GF_STACK: 2885 case RrdGraphDesc.GF_STACK:
2888 throw new RrdGraphError("STACK should already be turned into LINE or AREA here"); 2886 throw new RrdGraphError("STACK should already be turned into LINE or AREA here");
2889 break;
2890 } 2887 }
2891 } 2888 }
2892//cairo_reset_clip(this.cr); 2889//cairo_reset_clip(this.cr);
@@ -2920,16 +2917,16 @@ RrdGraph.prototype.graph_paint_draw = function()
2920 2917
2921RrdGraph.prototype.graph_paint = function () 2918RrdGraph.prototype.graph_paint = function ()
2922{ 2919{
2923 this.graph_paint_init() 2920 this.graph_paint_init();
2924 if (this.data_fetch() === -1) 2921 if (this.data_fetch() === -1)
2925 return -1; 2922 return -1;
2926 return this.graph_paint_draw() 2923 return this.graph_paint_draw();
2927}; 2924};
2928 2925
2929RrdGraph.prototype.graph_paint_async = function () 2926RrdGraph.prototype.graph_paint_async = function ()
2930{ 2927{
2931 this.graph_paint_init() 2928 this.graph_paint_init();
2932 this.data_fetch_async() 2929 this.data_fetch_async();
2933}; 2930};
2934 2931
2935RrdGraph.prototype.find_var = function(key) 2932RrdGraph.prototype.find_var = function(key)
diff --git a/js/RrdJson.js b/js/RrdJson.js
index fcbf76b..4ddcbc2 100644
--- a/js/RrdJson.js
+++ b/js/RrdJson.js
@@ -26,11 +26,11 @@
26 */ 26 */
27var RrdJson = function() { 27var RrdJson = function() {
28 if (arguments.length == 1) { 28 if (arguments.length == 1) {
29 this.init1.apply(this, arguments); 29 this.init1.apply(this, arguments);
30 } else if (arguments.length == 2) { 30 } else if (arguments.length == 2) {
31 this.init2.apply(this, arguments); 31 this.init2.apply(this, arguments);
32 } else if (arguments.length == 3) { 32 } else if (arguments.length == 3) {
33 this.init3.apply(this, arguments); 33 this.init3.apply(this, arguments);
34 } 34 }
35}; 35};
36 36
@@ -40,12 +40,12 @@ RrdJson.prototype = {
40 40
41 init1: function (rrdgraph) 41 init1: function (rrdgraph)
42 { 42 {
43 this.graph = rrdgraph 43 this.graph = rrdgraph;
44 }, 44 },
45 init2: function (rrdgraph, jsonstr) 45 init2: function (rrdgraph, jsonstr)
46 { 46 {
47 this.json = JSON.parse(jsonstr); 47 this.json = JSON.parse(jsonstr);
48 this.graph = rrdgraph 48 this.graph = rrdgraph;
49 }, 49 },
50 init3: function (gfx, fetch, jsonstr) 50 init3: function (gfx, fetch, jsonstr)
51 { 51 {
@@ -69,7 +69,7 @@ RrdJson.prototype = {
69 if (color in this.graph.GRC) { 69 if (color in this.graph.GRC) {
70 this.graph.GRC[color] = this.json.color[color]; 70 this.graph.GRC[color] = this.json.color[color];
71 } else { 71 } else {
72 throw "invalid color name '"+name+"'"; 72 throw "invalid color '" + color + "'";
73 } 73 }
74 } 74 }
75 break; 75 break;
@@ -191,16 +191,21 @@ RrdJson.prototype = {
191 this.graph.second_axis_format = this.json.right_axis_format; 191 this.graph.second_axis_format = this.json.right_axis_format;
192 break; 192 break;
193 case 'legend_position': 193 case 'legend_position':
194 if (this.json.legend_position === "north") { 194 switch (this.json.legend_position) {
195 this.graph.legendposition = this.graph.LEGEND_POS.NORTH; 195 case "north":
196 } else if (this.json.legend_position === "west") { 196 this.graph.legendposition = this.graph.LEGEND_POS.NORTH;
197 this.graph.legendposition = this.graph.LEGEND_POS.WEST; 197 break;
198 } else if (this.json.legend_position === "south") { 198 case "west":
199 this.graph.legendposition = this.graph.LEGEND_POS.SOUTH; 199 this.graph.legendposition = this.graph.LEGEND_POS.WEST;
200 } else if (this.json.legend_position === "east") { 200 break;
201 this.graph.legendposition = this.graph.LEGEND_POS.EAST; 201 case "south":
202 } else { 202 this.graph.legendposition = this.graph.LEGEND_POS.SOUTH;
203 throw "unknown legend-position '"+value+"'"; 203 break;
204 case "east":
205 this.graph.legendposition = this.graph.LEGEND_POS.EAST;
206 break;
207 default:
208 throw "unknown legend-position '" + this.json.legend_position + "'";
204 } 209 }
205 break; 210 break;
206 case 'legend_direction': 211 case 'legend_direction':
@@ -209,7 +214,7 @@ RrdJson.prototype = {
209 } else if (this.json.legend_direction === "bottomup") { 214 } else if (this.json.legend_direction === "bottomup") {
210 this.graph.legenddirection = this.graph.LEGEND_DIR.BOTTOM_UP; 215 this.graph.legenddirection = this.graph.LEGEND_DIR.BOTTOM_UP;
211 } else { 216 } else {
212 throw "unknown legend-position '"+value+"'"; 217 throw "unknown legend-direction'" + this.json.legend_direction + "'";
213 } 218 }
214 break; 219 break;
215 case 'border': 220 case 'border':
@@ -272,21 +277,21 @@ RrdJson.prototype = {
272 switch (gdes[i].align) { 277 switch (gdes[i].align) {
273 case 'left': 278 case 'left':
274 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_LEFT); 279 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_LEFT);
275 break 280 break;
276 case 'right': 281 case 'right':
277 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_RIGHT); 282 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_RIGHT);
278 break 283 break;
279 case 'justified': 284 case 'justified':
280 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_JUSTIFIED); 285 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_JUSTIFIED);
281 break 286 break;
282 case 'center': 287 case 'center':
283 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_CENTER); 288 this.graph.gdes_add_textalign(RrdGraphDesc.TXA_CENTER);
284 break 289 break;
285 } 290 }
286 break; 291 break;
287// DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>] 292// DEF:<vname>=<rrdfile>:<ds-name>:<CF>[:step=<step>][:start=<time>][:end=<time>][:reduce=<CF>]
288 case 'DEF': 293 case 'DEF':
289 this.graph.gdes_add_def(gdes[i].vname, gdes[i].rrdfile, gdes[i].name, gdes[i].cf, gdes[i].step, gdes[i].start, gdes[i].end, gdes[i].reduce) 294 this.graph.gdes_add_def(gdes[i].vname, gdes[i].rrdfile, gdes[i].name, gdes[i].cf, gdes[i].step, gdes[i].start, gdes[i].end, gdes[i].reduce);
290 break; 295 break;
291// CDEF:vname=RPN expression 296// CDEF:vname=RPN expression
292 case 'CDEF': 297 case 'CDEF':
@@ -311,7 +316,7 @@ RrdJson.prototype = {
311 316
312 if (this.graph.alt_autoscale != false || full) 317 if (this.graph.alt_autoscale != false || full)
313 this.json.alt_autoscale = this.graph.alt_autoscale; 318 this.json.alt_autoscale = this.graph.alt_autoscale;
314 319
315 if (this.graph.base != 1000 || full) 320 if (this.graph.base != 1000 || full)
316 this.json.base = this.graph.base; 321 this.json.base = this.graph.base;
317 322
@@ -338,7 +343,7 @@ RrdJson.prototype = {
338 if (this.graph.GRC.FRAME != 'rgba(0, 0, 0, 1.0)' || full) 343 if (this.graph.GRC.FRAME != 'rgba(0, 0, 0, 1.0)' || full)
339 this.json.color.FRAME = this.graph.GRC.FRAME; 344 this.json.color.FRAME = this.graph.GRC.FRAME;
340 345
341 if (Object.keys(this.json.color) == 0) delete this.json.color; 346 if (!Object.keys(this.json.color).length) delete this.json.color;
342 347
343 if (this.graph.full_size_mode != false || full) 348 if (this.graph.full_size_mode != false || full)
344 this.json.full_size_mode = this.graph.full_size_mode; 349 this.json.full_size_mode = this.graph.full_size_mode;
@@ -351,10 +356,10 @@ RrdJson.prototype = {
351 356
352 if (this.graph.force_rules_legend != false || full) 357 if (this.graph.force_rules_legend != false || full)
353 this.json.force_rules_legend = this.graph.force_rules_legend; 358 this.json.force_rules_legend = this.graph.force_rules_legend;
354 359
355 if (this.graph.no_legend != false || full) 360 if (this.graph.no_legend != false || full)
356 this.json.no_legend = this.graph.no_legend; 361 this.json.no_legend = this.graph.no_legend;
357 362
358 this.json.width = this.graph.xsize; 363 this.json.width = this.graph.xsize;
359 this.json.height = this.graph.ysize; 364 this.json.height = this.graph.ysize;
360 365
@@ -363,10 +368,10 @@ RrdJson.prototype = {
363 368
364 if (this.graph.alt_autoscale_min != false || full) 369 if (this.graph.alt_autoscale_min != false || full)
365 this.json.alt_autoscale_min = this.graph.alt_autoscale_min; 370 this.json.alt_autoscale_min = this.graph.alt_autoscale_min;
366 371
367 if (this.graph.only_graph != false || full) 372 if (this.graph.only_graph != false || full)
368 this.json.only_graph = this.graph.only_graph; 373 this.json.only_graph = this.graph.only_graph;
369 374
370 if (this.graph.unitslength != 6 || full) 375 if (this.graph.unitslength != 6 || full)
371 this.json.units_length = this.graph.unitslength; 376 this.json.units_length = this.graph.unitslength;
372 377
@@ -381,7 +386,7 @@ RrdJson.prototype = {
381 386
382 if (this.graph.gridfit != true || full) 387 if (this.graph.gridfit != true || full)
383 this.json.no_gridfit = this.graph.gridfit; 388 this.json.no_gridfit = this.graph.gridfit;
384 389
385 this.json.font = {}; 390 this.json.font = {};
386 if (this.graph.TEXT.DEFAULT.size != 11 || this.graph.TEXT.LEGEND.font != this.graph.DEFAULT_FONT || full) 391 if (this.graph.TEXT.DEFAULT.size != 11 || this.graph.TEXT.LEGEND.font != this.graph.DEFAULT_FONT || full)
387 this.json.font.DEFAULT = { size: this.graph.TEXT.DEFAULT.size, font: this.graph.TEXT.DEFAULT.font}; 392 this.json.font.DEFAULT = { size: this.graph.TEXT.DEFAULT.size, font: this.graph.TEXT.DEFAULT.font};
@@ -396,31 +401,31 @@ RrdJson.prototype = {
396 if (this.graph.TEXT.WATERMARK.size != 8 || this.graph.TEXT.WATERMARK.font != this.graph.DEFAULT_FONT || full) 401 if (this.graph.TEXT.WATERMARK.size != 8 || this.graph.TEXT.WATERMARK.font != this.graph.DEFAULT_FONT || full)
397 this.json.font.WATERMARK = { size: this.graph.TEXT.WATERMARK.size, font: this.graph.TEXT.WATERMARK.font}; 402 this.json.font.WATERMARK = { size: this.graph.TEXT.WATERMARK.size, font: this.graph.TEXT.WATERMARK.font};
398 403
399 if (Object.keys(this.json.font) == 0) delete this.json.font; 404 if (!Object.keys(this.json.font).length) delete this.json.font;
400 405
401 if (this.graph.logarithmic != false || full) 406 if (this.graph.logarithmic != false || full)
402 this.json.logarithmic = this.graph.logarithmic; 407 this.json.logarithmic = this.graph.logarithmic;
403 408
404 if (this.graph.rigid != false || full) 409 if (this.graph.rigid != false || full)
405 this.json.rigid = this.graph.rigid; 410 this.json.rigid = this.graph.rigid;
406 411
407// this.json.step = this.graph.step; // FIXME 412// this.json.step = this.graph.step; // FIXME
408 413
409 if (this.graph.tabwidth != 40 || full) 414 if (this.graph.tabwidth != 40 || full)
410 this.json.tabwidth = this.graph.tabwidth; 415 this.json.tabwidth = this.graph.tabwidth;
411 416
412 if (this.graph.title != '' || full) 417 if (this.graph.title != '' || full)
413 this.json.title = this.graph.title; 418 this.json.title = this.graph.title;
414 419
415 if (!isNaN(this.graph.setmaxval) || full) 420 if (!isNaN(this.graph.setmaxval) || full)
416 this.json.upper_limit = this.graph.setmaxval; 421 this.json.upper_limit = this.graph.setmaxval;
417 422
418 if (this.graph.ylegend != null || full) 423 if (this.graph.ylegend != null || full)
419 this.json.vertical_label = this.graph.ylegend; 424 this.json.vertical_label = this.graph.ylegend;
420 425
421 if (this.graph.watermark != null || full) 426 if (this.graph.watermark != null || full)
422 this.json.watermark = this.graph.watermark; 427 this.json.watermark = this.graph.watermark;
423 428
424 if (this.graph.unitsexponent != 9999 || full) 429 if (this.graph.unitsexponent != 9999 || full)
425 this.json.units_exponent = this.graph.unitsexponent; 430 this.json.units_exponent = this.graph.unitsexponent;
426 431
@@ -432,10 +437,10 @@ RrdJson.prototype = {
432// this.json.y_grid = // FIXME 437// this.json.y_grid = // FIXME
433 438
434// this.json.lazy = this.graph.lazy; 439// this.json.lazy = this.graph.lazy;
435 440
436 if (this.graph.force_units_si != false || full) 441 if (this.graph.force_units_si != false || full)
437 this.json.units = 'si'; // FIXME 442 this.json.units = 'si'; // FIXME
438 443
439 if (this.graph.no_rrdtool_tag != false || full) 444 if (this.graph.no_rrdtool_tag != false || full)
440 this.json.disable_rrdtool_tag = this.graph.no_rrdtool_tag; 445 this.json.disable_rrdtool_tag = this.graph.no_rrdtool_tag;
441 446
@@ -451,13 +456,13 @@ RrdJson.prototype = {
451 456
452 if (this.graph.draw_3d_border != 2 || full) 457 if (this.graph.draw_3d_border != 2 || full)
453 this.json.border = this.graph.draw_3d_border; 458 this.json.border = this.graph.draw_3d_border;
454 459
455 if (this.graph.grid_dash_on != 1 || this.graph.grid_dash_off != 1 || full) 460 if (this.graph.grid_dash_on != 1 || this.graph.grid_dash_off != 1 || full)
456 this.json.grid_dash = [this.graph.grid_dash_on, this.graph.grid_dash_off] 461 this.json.grid_dash = [this.graph.grid_dash_on, this.graph.grid_dash_off];
457 462
458 if (this.graph.dynamic_labels != false || full) 463 if (this.graph.dynamic_labels != false || full)
459 this.json.dynamic_labels = this.graph.dynamic_labels; 464 this.json.dynamic_labels = this.graph.dynamic_labels;
460 465
461 this.json.gdes = []; 466 this.json.gdes = [];
462 for (var i = 0, gdes_c = this.graph.gdes.length; i < gdes_c; i++) { 467 for (var i = 0, gdes_c = this.graph.gdes.length; i < gdes_c; i++) {
463 switch (this.graph.gdes[i].gf) { 468 switch (this.graph.gdes[i].gf) {
@@ -465,7 +470,7 @@ RrdJson.prototype = {
465 case RrdGraphDesc.GF_GPRINT: 470 case RrdGraphDesc.GF_GPRINT:
466 this.json.gdes.push({ 471 this.json.gdes.push({
467 type: 'GPRINT', 472 type: 'GPRINT',
468 vname: this.graph.gdes[i].vname, 473 vname: this.graph.gdes[i].vname,
469 cf: RrdGraphDesc.cf2str(this.graph.gdes[i].cf), 474 cf: RrdGraphDesc.cf2str(this.graph.gdes[i].cf),
470 format: this.graph.gdes[i].format, 475 format: this.graph.gdes[i].format,
471 strftm: (this.graph.gdes[i].strftm === false ? undefined : this.graph.gdes[i].strftm) }); 476 strftm: (this.graph.gdes[i].strftm === false ? undefined : this.graph.gdes[i].strftm) });
@@ -526,16 +531,16 @@ RrdJson.prototype = {
526 switch (this.graph.gdes[i].txtalign) { 531 switch (this.graph.gdes[i].txtalign) {
527 case RrdGraphDesc.TXA_LEFT: 532 case RrdGraphDesc.TXA_LEFT:
528 align = 'left'; 533 align = 'left';
529 break 534 break;
530 case RrdGraphDesc.TXA_RIGHT: 535 case RrdGraphDesc.TXA_RIGHT:
531 align = 'right'; 536 align = 'right';
532 break 537 break;
533 case RrdGraphDesc.TXA_JUSTIFIED: 538 case RrdGraphDesc.TXA_JUSTIFIED:
534 align = 'justified'; 539 align = 'justified';
535 break 540 break;
536 case RrdGraphDesc.TXA_CENTER: 541 case RrdGraphDesc.TXA_CENTER:
537 align = 'center'; 542 align = 'center';
538 break 543 break;
539 } 544 }
540 545
541 this.json.gdes.push({ 546 this.json.gdes.push({
@@ -559,7 +564,7 @@ RrdJson.prototype = {
559 // reduce: RrdGraphDesc.cf2str(this.graph.gdes[i].cf_reduce) 564 // reduce: RrdGraphDesc.cf2str(this.graph.gdes[i].cf_reduce)
560 reduce: undefined 565 reduce: undefined
561 }); 566 });
562 567
563 break; 568 break;
564// CDEF:vname=RPN expression 569// CDEF:vname=RPN expression
565 case RrdGraphDesc.GF_CDEF: 570 case RrdGraphDesc.GF_CDEF:
diff --git a/js/RrdRpn.js b/js/RrdRpn.js
index cbb5e8f..5ca8daf 100644
--- a/js/RrdRpn.js
+++ b/js/RrdRpn.js
@@ -478,7 +478,7 @@ RrdRpn.prototype.calc = function (data_idx, output, output_idx)
478 break; 478 break;
479 case RrdRpn.OP_ISINF: 479 case RrdRpn.OP_ISINF:
480 if(stptr < 0) throw new RrdRpnError(); 480 if(stptr < 0) throw new RrdRpnError();
481 this.rpnstack[stptr] = isInfinite(this.rpnstack[stptr]) ? 1.0 : 0.0; 481 this.rpnstack[stptr] = !isFinite(this.rpnstack[stptr]) ? 1.0 : 0.0;
482 break; 482 break;
483 case RrdRpn.OP_SQRT: 483 case RrdRpn.OP_SQRT:
484 if(stptr < 0) throw new RrdRpnError(); 484 if(stptr < 0) throw new RrdRpnError();
@@ -603,7 +603,7 @@ RrdRpn.prototype.calc = function (data_idx, output, output_idx)
603 break; 603 break;
604 case RrdRpn.OP_ABS: 604 case RrdRpn.OP_ABS:
605 if(stptr < 0) throw new RrdRpnError(); 605 if(stptr < 0) throw new RrdRpnError();
606 this.rpnstack[stptr] = fabs(this.rpnstack[stptr]); 606 this.rpnstack[stptr] = Math.abs(this.rpnstack[stptr]);
607 break; 607 break;
608 case RrdRpn.OP_END: 608 case RrdRpn.OP_END:
609 break; 609 break;
diff --git a/js/RrdTime.js b/js/RrdTime.js
index 95ea0ae..c1de1fc 100644
--- a/js/RrdTime.js
+++ b/js/RrdTime.js
@@ -25,12 +25,12 @@
25 * RrdTimeError 25 * RrdTimeError
26 * @constructor 26 * @constructor
27 */ 27 */
28var RrdTimeError = function (message) 28var RrdTimeError = function (message)
29{ 29{
30 this.prototype = Error.prototype; 30 this.prototype = Error.prototype;
31 this.name = "RrdTimeError"; 31 this.name = "RrdTimeError";
32 this.message = (message) ? message : "Error"; 32 this.message = (message) ? message : "Error";
33}; 33};
34 34
35/** 35/**
36 * RrdTime 36 * RrdTime
@@ -40,7 +40,7 @@ var RrdTime = function(tspec) /* parser */
40{ 40{
41 var date = new Date(); 41 var date = new Date();
42 var hr = 0; 42 var hr = 0;
43 43
44 this.tspec = tspec; 44 this.tspec = tspec;
45 45
46 this.tokens = (tspec+'').match(/[0-9]+|[A-Za-z]+|[:.+-\/]/g); 46 this.tokens = (tspec+'').match(/[0-9]+|[A-Za-z]+|[:.+-\/]/g);
@@ -70,18 +70,20 @@ var RrdTime = function(tspec) /* parser */
70 break; /* jump to OFFSET-SPEC part */ 70 break; /* jump to OFFSET-SPEC part */
71 case RrdTime.EPOCH: 71 case RrdTime.EPOCH:
72 this.type = RrdTime.RELATIVE_TO_EPOCH; 72 this.type = RrdTime.RELATIVE_TO_EPOCH;
73 /* falls through */
73 case RrdTime.START: 74 case RrdTime.START:
74 case RrdTime.END: 75 case RrdTime.END:
75 if (this.tokid === RrdTime.EPOCH) 76 if (this.tokid === RrdTime.EPOCH)
76 this.type = RrdTime.RELATIVE_TO_START_TIME; 77 this.type = RrdTime.RELATIVE_TO_START_TIME;
77 else 78 else
78 this.type = RrdTime.RELATIVE_TO_END_TIME; 79 this.type = RrdTime.RELATIVE_TO_END_TIME;
79 this.tm_sec = 0; 80 this.tm_sec = 0;
80 this.tm_min = 0; 81 this.tm_min = 0;
81 this.tm_hour = 0; 82 this.tm_hour = 0;
82 this.tm_mday = 0; 83 this.tm_mday = 0;
83 this.tm_mon = 0; 84 this.tm_mon = 0;
84 this.tm_year = 0; 85 this.tm_year = 0;
86 /* falls through */
85 case RrdTime.NOW: 87 case RrdTime.NOW:
86 var time_reference = this.tokid; 88 var time_reference = this.tokid;
87 this.gettok(); 89 this.gettok();
@@ -126,8 +128,10 @@ var RrdTime = function(tspec) /* parser */
126 break; 128 break;
127 case RrdTime.TEATIME: 129 case RrdTime.TEATIME:
128 hr += 4; 130 hr += 4;
131 /* falls through */
129 case RrdTime.NOON: 132 case RrdTime.NOON:
130 hr += 12; 133 hr += 12;
134 /* falls through */
131 case RrdTime.MIDNIGHT: 135 case RrdTime.MIDNIGHT:
132 this.tm_hour = hr; 136 this.tm_hour = hr;
133 this.tm_min = 0; 137 this.tm_min = 0;
@@ -137,7 +141,6 @@ var RrdTime = function(tspec) /* parser */
137 break; 141 break;
138 default: 142 default:
139 throw new RrdTimeError("unparsable time: "+this.token+" "+this.sct); 143 throw new RrdTimeError("unparsable time: "+this.token+" "+this.sct);
140 break;
141 } /* ugly case statement */ 144 } /* ugly case statement */
142 145
143 /* 146 /*
@@ -303,7 +306,7 @@ RrdTime.RELATIVE_TO_START_TIME = 1;
303RrdTime.RELATIVE_TO_END_TIME = 2; 306RrdTime.RELATIVE_TO_END_TIME = 2;
304RrdTime.RELATIVE_TO_EPOCH = 3; 307RrdTime.RELATIVE_TO_EPOCH = 3;
305 308
306RrdTime.prototype.gettok = function () 309RrdTime.prototype.gettok = function ()
307{ 310{
308 if (this.tokidx >= this.toklen) { 311 if (this.tokidx >= this.toklen) {
309 this.tokid = RrdTime.EOF; 312 this.tokid = RrdTime.EOF;
@@ -332,7 +335,7 @@ RrdTime.prototype.gettok = function ()
332 return this.tokid; 335 return this.tokid;
333}; 336};
334 337
335RrdTime.prototype.plus_minus = function (doop) 338RrdTime.prototype.plus_minus = function (doop)
336{ 339{
337 var op = RrdTime.PLUS; 340 var op = RrdTime.PLUS;
338 var prev_multiplier = -1; 341 var prev_multiplier = -1;
@@ -377,6 +380,7 @@ RrdTime.prototype.plus_minus = function (doop)
377 return; 380 return;
378 case RrdTime.WEEKS: 381 case RrdTime.WEEKS:
379 delta *= 7; 382 delta *= 7;
383 /* falls through */
380 case RrdTime.DAYS: 384 case RrdTime.DAYS:
381 this.tm_mday += ( op == RrdTime.PLUS) ? delta : -delta; 385 this.tm_mday += ( op == RrdTime.PLUS) ? delta : -delta;
382 return; 386 return;
@@ -446,12 +450,12 @@ RrdTime.prototype.tod = function() /* tod() computes the time of day (TIME-OF-DA
446 this.tm_min = minute; 450 this.tm_min = minute;
447 this.tm_sec = 0; 451 this.tm_sec = 0;
448 if (this.tm_hour == 24) { 452 if (this.tm_hour == 24) {
449 this.tm_hour = 0; 453 this.tm_hour = 0;
450 this.tm_mday++; 454 this.tm_mday++;
451 } 455 }
452}; 456};
453 457
454RrdTime.prototype.assign_date = function(mday, mon, year) 458RrdTime.prototype.assign_date = function(mday, mon, year)
455{ 459{
456 if (year > 138) { 460 if (year > 138) {
457 if (year > 1970) { 461 if (year > 1970) {
@@ -472,14 +476,14 @@ RrdTime.prototype.assign_date = function(mday, mon, year)
472 this.tm_year = year; 476 this.tm_year = year;
473}; 477};
474 478
475RrdTime.prototype.day = function () 479RrdTime.prototype.day = function ()
476{ 480{
477 var mday = 0, wday, mon, year = this.tm_year; 481 var mday = 0, wday, mon, year = this.tm_year;
478 var tlen;
479 482
480 switch (this.tokid) { 483 switch (this.tokid) {
481 case RrdTime.YESTERDAY: 484 case RrdTime.YESTERDAY:
482 this.tm_mday--; 485 this.tm_mday--;
486 /* falls through */
483 case RrdTime.TODAY: 487 case RrdTime.TODAY:
484 this.gettok(); 488 this.gettok();
485 break; 489 break;
@@ -565,7 +569,7 @@ RrdTime.prototype.day = function ()
565 } 569 }
566}; 570};
567 571
568RrdTime.prototype.localtime = function (tm) 572RrdTime.prototype.localtime = function (tm)
569{ 573{
570 var date = new Date(tm*1000); 574 var date = new Date(tm*1000);
571 this.tm_sec = date.getSeconds(); 575 this.tm_sec = date.getSeconds();
@@ -577,13 +581,13 @@ RrdTime.prototype.localtime = function (tm)
577 this.tm_wday = date.getDay(); 581 this.tm_wday = date.getDay();
578}; 582};
579 583
580RrdTime.prototype.mktime = function() 584RrdTime.prototype.mktime = function()
581{ 585{
582 var date = new Date(this.tm_year+1900, this.tm_mon, this.tm_mday, this.tm_hour, this.tm_min, this.tm_sec); 586 var date = new Date(this.tm_year+1900, this.tm_mon, this.tm_mday, this.tm_hour, this.tm_min, this.tm_sec);
583 return Math.round(date.getTime()/1000.0); 587 return Math.round(date.getTime()/1000.0);
584}; 588};
585 589
586RrdTime.proc_start_end = function(start_t, end_t) 590RrdTime.proc_start_end = function(start_t, end_t)
587{ 591{
588 var start, end; 592 var start, end;
589 593
diff --git a/js/base64.js b/js/base64.js
index 7d9536a..4cd5c96 100644
--- a/js/base64.js
+++ b/js/base64.js
@@ -113,7 +113,8 @@ var Base64 = {
113 _utf8_decode : function (utftext) { 113 _utf8_decode : function (utftext) {
114 var string = ""; 114 var string = "";
115 var i = 0; 115 var i = 0;
116 var c = c1 = c2 = 0; 116 var c, c1, c2, c3;
117 c = c1 = c2 = 0;
117 118
118 while ( i < utftext.length ) { 119 while ( i < utftext.length ) {
119 120
@@ -140,4 +141,4 @@ var Base64 = {
140 return string; 141 return string;
141 } 142 }
142 143
143} 144};
diff --git a/js/rrdFile.js b/js/rrdFile.js
index eabebc7..3385df5 100644
--- a/js/rrdFile.js
+++ b/js/rrdFile.js
@@ -431,7 +431,7 @@ function RRDFile(bf,file_options) {
431 } 431 }
432 432
433 this.getRRA = function(idx) { 433 this.getRRA = function(idx) {
434 rra_info=this.rrd_header.getRRAInfo(idx); 434 var rra_info = this.rrd_header.getRRAInfo(idx);
435 return new RRDRRA(rrd_data, 435 return new RRDRRA(rrd_data,
436 this.rrd_header.rra_ptr_idx+idx*this.rrd_header.rra_ptr_el_size, 436 this.rrd_header.rra_ptr_idx+idx*this.rrd_header.rra_ptr_el_size,
437 rra_info, 437 rra_info,
diff --git a/js/sprintf.js b/js/sprintf.js
index 4d61fa2..244fe2a 100644
--- a/js/sprintf.js
+++ b/js/sprintf.js
@@ -19,60 +19,55 @@
19"use strict"; 19"use strict";
20 20
21function sprintf() 21function sprintf()
22{ 22{
23 var argc = 0; 23 var argc = 0;
24 var args = arguments; 24 var args = arguments;
25 var fmt = args[argc++]; 25 var fmt = args[argc++];
26 26
27 function lpad (str, padString, length) 27 function lpad (str, padString, length)
28 { 28 {
29 while (str.length < length) 29 while (str.length < length)
30 str = padString + str; 30 str = padString + str;
31 return str; 31 return str;
32 }; 32 }
33 33
34 function format (match, width, dot, precision, length, conversion) 34 function format (match, width, dot, precision, length, conversion)
35 { 35 {
36 if (match === '%%') return '%'; 36 if (match === '%%') return '%';
37 37
38 var value = args[argc++]; 38 var value = args[argc++];
39 var prefix; 39 var prefix;
40 40
41 if (width === undefined) 41 if (width === undefined)
42 width = 0; 42 width = 0;
43 else 43 else
44 width = +width; 44 width = +width;
45 45
46 if (precision === undefined) 46 if (precision === undefined)
47 precision = conversion == 'd' ? 0 : 6; 47 precision = conversion == 'd' ? 0 : 6;
48 else 48 else
49 precision = +precision; 49 precision = +precision;
50 50
51 switch (conversion) { 51 switch (conversion) {
52 case 's': 52 case 's':
53 case 'c': 53 case 'c':
54 return value; 54 return value;
55 break;
56 case 'd': 55 case 'd':
57 return parseInt(value, 10); 56 return parseInt(value, 10);
58 break;
59 case 'e': 57 case 'e':
60 prefix = value < 0 ? '-' : ''; 58 prefix = value < 0 ? '-' : '';
61 return lpad(prefix+Math.abs(value).toExponential(precision),' ',width); 59 return lpad(prefix+Math.abs(value).toExponential(precision),' ',width);
62 break;
63 case 'F': 60 case 'F':
64 case 'f': 61 case 'f':
65 prefix = value < 0 ? '-' : ''; 62 prefix = value < 0 ? '-' : '';
66 return lpad(prefix+Math.abs(value).toFixed(precision),' ',width); 63 return lpad(prefix+Math.abs(value).toFixed(precision),' ',width);
67 break;
68 case 'g': 64 case 'g':
69 prefix = value < 0 ? '-' : ''; 65 prefix = value < 0 ? '-' : '';
70 return lpad(prefix+Math.abs(value).toPrecision(precision),' ',width); 66 return lpad(prefix+Math.abs(value).toPrecision(precision),' ',width);
71 break;
72 default: 67 default:
73 return match; 68 return match;
74 } 69 }
75 70
76 }; 71 }
77 return fmt.replace(/%(\d+)?(\.(\d+))?(l?)([%scdfFeg])/g,format); 72 return fmt.replace(/%(\d+)?(\.(\d+))?(l?)([%scdfFeg])/g,format);
78}; 73}
diff --git a/js/strftime.js b/js/strftime.js
index 0933c27..b3698c8 100644
--- a/js/strftime.js
+++ b/js/strftime.js
@@ -27,80 +27,57 @@ function strftime (fmt, time)
27 var months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]; 27 var months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];
28 var fmonths = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; 28 var fmonths = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
29 29
30 function pad2 (number) 30 function pad2 (number)
31 { 31 {
32 return (number < 10 ? '0' : '') + number 32 return (number < 10 ? '0' : '') + number;
33 }; 33 }
34 34
35 function pad3(number) 35 function pad3(number)
36 { 36 {
37 return (number < 10 ? '00' : number < 100 ? '0' : '') + number 37 return (number < 10 ? '00' : number < 100 ? '0' : '') + number;
38 }; 38 }
39 39
40 function lpad (str, padString, length) 40 function format(match, opt)
41 {
42 while (str.length < length)
43 str = padString + str;
44 return str;
45 };
46
47 function format(match, opt)
48 { 41 {
49 if (match === '%%') return '%'; 42 if (match === '%%') return '%';
50 43
51 switch (opt) { 44 switch (opt) {
52 case 'a': 45 case 'a':
53 return days[d.getDay()]; 46 return days[d.getDay()];
54 break;
55 case 'A': 47 case 'A':
56 return fdays[d.getDay()]; 48 return fdays[d.getDay()];
57 break;
58 case 'b': 49 case 'b':
59 return months[d.getMonth()]; 50 return months[d.getMonth()];
60 break;
61 case 'B': 51 case 'B':
62 return fmonths[d.getMonth()]; 52 return fmonths[d.getMonth()];
63 break;
64 case 'c': 53 case 'c':
65 return d.toLocaleString(); 54 return d.toLocaleString();
66 break;
67 case 'd': 55 case 'd':
68 return pad2(d.getDate()); 56 return pad2(d.getDate());
69 break;
70 case 'H': 57 case 'H':
71 return pad2(d.getHours()); 58 return pad2(d.getHours());
72 break; 59 case 'I':
73 case 'I':
74 var hours = d.getHours()%12; 60 var hours = d.getHours()%12;
75 return pad2(hours === 0 ? 12 : hours); 61 return pad2(hours === 0 ? 12 : hours);
76 break;
77 case 'j': 62 case 'j':
78 var d01 = new Date (d.getFullYear(), 0, 1); 63 var d01 = new Date (d.getFullYear(), 0, 1);
79 return pad3(Math.ceil((d.getTime()-d01.getTime())/86400000)+1); 64 return pad3(Math.ceil((d.getTime()-d01.getTime())/86400000)+1);
80 break; 65 case 'm':
81 case 'm':
82 return pad2(d.getMonth()); 66 return pad2(d.getMonth());
83 break;
84 case 'M': 67 case 'M':
85 return pad2(d.getMinutes()); 68 return pad2(d.getMinutes());
86 break;
87 case 'p': 69 case 'p':
88 return d.getHours() >= 12 ? 'PM' : 'AM'; 70 return d.getHours() >= 12 ? 'PM' : 'AM';
89 break;
90 case 's': 71 case 's':
91 return pad2(d.getSeconds()); 72 return pad2(d.getSeconds());
92 break;
93 case 'S': 73 case 'S':
94 return d.getTime()/1000; 74 return d.getTime()/1000;
95 break;
96 case 'u': 75 case 'u':
97 return d.getDay() === 0 ? 7 : d.getDay(); 76 return d.getDay() === 0 ? 7 : d.getDay();
98 break; 77 case 'U':
99 case 'U':
100 var d01 = new Date(d.getFullYear(),0,1); 78 var d01 = new Date(d.getFullYear(),0,1);
101 return pad2(Math.round((Math.ceil((d.getTime()-d01.getTime())/86400000)+1 + 6 - d.getDay())/7)); 79 return pad2(Math.round((Math.ceil((d.getTime()-d01.getTime())/86400000)+1 + 6 - d.getDay())/7));
102 break; 80 case 'V':
103 case 'V':
104 var d01 = new Date(d.getFullYear(), 0, 1); 81 var d01 = new Date(d.getFullYear(), 0, 1);
105 var w = Math.round((Math.ceil((d.getTime()-d01.getTime())/86400000)+1 + 7 - (d.getDay() === 0 ? 7 : d.getDay()))/7); 82 var w = Math.round((Math.ceil((d.getTime()-d01.getTime())/86400000)+1 + 7 - (d.getDay() === 0 ? 7 : d.getDay()))/7);
106 var d31 = new Date(d.getFullYear(), 11, 31); 83 var d31 = new Date(d.getFullYear(), 11, 31);
@@ -115,32 +92,24 @@ function strftime (fmt, time)
115 if (w === 53 && d31.getDay() < 4) w = 1; 92 if (w === 53 && d31.getDay() < 4) w = 1;
116 } 93 }
117 return pad2(w); 94 return pad2(w);
118 break;
119 case 'w': 95 case 'w':
120 return d.getDay(); 96 return d.getDay();
121 break; 97 case 'W':
122 case 'W': 98 var d01 = new Date(d.getFullYear(),0,1);
123 var d01 = new Date(d.getFullYear(),0,1);
124 return pad2(Math.round((Math.ceil((d.getTime()-d01.getTime())/86400000)+1 + 7 - (d.getDay() === 0 ? 7 : d.getDay()))/7)); 99 return pad2(Math.round((Math.ceil((d.getTime()-d01.getTime())/86400000)+1 + 7 - (d.getDay() === 0 ? 7 : d.getDay()))/7));
125 break;
126 case 'x': 100 case 'x':
127 return pad2(d.getDate())+'/'+pad2(d.getMonth())+'/'+d.getFullYear() 101 return pad2(d.getDate())+'/'+pad2(d.getMonth())+'/'+d.getFullYear();
128 break;
129 case 'X': 102 case 'X':
130 return pad2(d.getHours())+':'+pad2(d.getMinutes())+':'+pad2(d.getSeconds()); 103 return pad2(d.getHours())+':'+pad2(d.getMinutes())+':'+pad2(d.getSeconds());
131 break; 104 case 'y':
132 case 'y':
133 return pad2(d.getFullYear()%100); 105 return pad2(d.getFullYear()%100);
134 break;
135 case 'Y': 106 case 'Y':
136 return d.getFullYear(); 107 return d.getFullYear();
137 break;
138 case 'Z': 108 case 'Z':
139 return d.toString().replace(/^.*\(([^)]+)\)$/, '$1'); 109 return d.toString().replace(/^.*\(([^)]+)\)$/, '$1');
140 break;
141 default: 110 default:
142 return match; 111 return match;
143 } 112 }
144 }; 113 }
145 return fmt.replace(/%([aAbBcdHIjmMpsSUVwWxXyYZ%])/g, format); 114 return fmt.replace(/%([aAbBcdHIjmMpsSUVwWxXyYZ%])/g, format);
146}; 115}