Subversion Repositories wimsdev

Rev

Rev 16844 | Rev 16847 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
15111 schaersvoo 1
#include "canvasdraw.h"
2
/*
3
collection of javascript utilities (with no configurable parameters)
4
*/
5
void add_javascript_function(){
16643 schaersvoo 6
#ifdef KATEX_INSTALLED
16642 schaersvoo 7
char *mathjax="centered(xml_div,obj);";
8
#else
9
char *mathjax="setTimeout(function(){centered(xml_div,obj)},100);";
10
#endif
15111 schaersvoo 11
int i;
12
int type;
13
for(i = 0 ; i < MAX_JS_FUNCTIONS; i++){
14
/*
15
fprintf(stdout,"checking js_function[%d] = %d<br />",i,js_function[i]);
16
*/
17
 if( js_function[i] == 1){
18
    switch(i){
19
 
15690 schaersvoo 20
case JS_ARROWHEAD:
21
/* draw an arrowhead on object ; arrowhead on (x:y) from direction (x0:y0) */
22
fprintf(js_include_file,"\n/* draw an arrowhead on object ; arrowhead on (x:y) from direction (x0:y0) */\
23
function draw_arrowhead(x,y,x0,y0,ctx){\
24
var angle = Math.atan2(x - x0,y - y0) + Math.PI;\
25
var pie = Math.PI/6;\
26
ctx.save();\
27
ctx.fillStyle=ctx.strokeStyle;\
28
ctx.beginPath();\
29
ctx.moveTo(x,y);\
30
ctx.moveTo(x - (arrow_head * Math.sin(angle - pie)),y - (arrow_head * Math.cos(angle - pie)));\
31
ctx.lineTo(x,y);\
32
ctx.lineTo(x - (arrow_head * Math.sin(angle + pie)),y - (arrow_head * Math.cos(angle + pie)));\
33
ctx.closePath();\
34
ctx.stroke();\
35
ctx.fill();\
36
ctx.restore();\
37
};");
38
break;
15111 schaersvoo 39
case JS_LOAD_IMAGE:
40
fprintf(js_include_file,"\n/* get_image_from_url */\
41
var image_cnt = 0;\
42
if( typeof(image_patterns) !== 'object'){var image_patterns = [];};\
43
var get_image_from_url = function(url){\
44
 var idx = Math.ceil(1000*(Math.random()));\
45
 var canvas = create_canvas%d(idx,xsize,ysize);\
46
 canvas.style.visibility = 'hidden';\
47
 var ctx = canvas.getContext(\"2d\");\
48
 var img = new Image();\
49
 img.src = url;\
50
 img.onload = function(){\
51
  var pat = ctx.createPattern(img,\"repeat\");\
52
  image_patterns.push(pat);\
53
 };\
54
};",canvas_root_id);
55
break;
56
 
57
case JS_SAFE_EVAL:
58
/* to avoid easy js-code injection...but is it a real problem ? */
59
fprintf(js_include_file," \n/* add safe eval function */function safe_eval(exp){\
60
 exp = exp.replace(/pi/g,'3.14159');\
61
 if(exp.indexOf('^') != -1){\
62
  exp = exp.replace(/[a-zA-Z]/g,' ');\
63
  exp = exp.replace(/\\*10\\^-/g,'e-');\
64
  exp = exp.replace(/\\*10\\^/g,'e+');\
65
  exp = exp.replace(/10\\^-/g,'1e-');exp = exp.replace(/10\\^/g,'1e+');\
66
  exp = eval(exp);\
67
  if(isNaN(exp)){alert(\"invalid input\\ntry just a real number \\ne.g. no calculations...\");return null;}\
68
  return exp;\
69
 };\
70
 var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\\[\\]\"'!&<>^\\\\?:])/ig;\
71
 var valid = true;\
72
 exp = exp.replace(reg,function($0){\
73
  if(Math.hasOwnProperty($0)){\
74
   return \"Math.\"+$0;\
16844 bpr 75
  } else {\
15111 schaersvoo 76
   valid = false;\
77
  }\
78
 }\
79
 );\
80
 if( !valid ){\
81
  alert(\"hmmm \"+exp+\" ?\"); exp = null;\
16844 bpr 82
 } else {\
15111 schaersvoo 83
  try{ exp = eval(exp); } catch(e){alert(\"Invalid arithmetic expression\"); exp = null;};\
84
 };\
85
 return exp;\
86
};");
87
break;
88
 
89
case JS_RAWMATH:
90
fprintf(js_include_file,"\n/* add_rawmath() */\
91
function rawmath(i){\
92
 i=i.toLowerCase();\
93
 i=i.replace(/\\ /g,\"\");i=i.replace(/\\*\\*/g,\"^\");\
94
 if(i.indexOf(\"e+\")!=-1){i=i.replace(\"e+\",\"*10^\");};\
95
 if(i.indexOf(\"e-\")!=-1){i=i.replace(\"e-\",\"*10^-\");};\
96
 i=i.replace(/\\*\\*/g,\"*\");\
97
 if(i.charAt(0)==\"*\"){i=i.substring(1,i.length);};\
98
 var fun=[\"asin\",\"acos\",\"atan\",\"sin\",\"cos\",\"tan\",\"log\",\"ln\",\"pi\",\"e\",\"x\",\"y\"];\
99
 var cons=[\"pi\",\"e\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"];\
100
 var cntl = 0;var cntr = 0;\
101
 var len = i.length;\
102
 for( var p = 0;p < len; p++){\
103
  if(i.charAt(p) == '('){cntl++;}\
104
  if(i.charAt(p) == ')'){cntr++;}\
105
 };\
106
 if(cntl != cntr){alert(\"unmatched parenthesis !!\");return null;};\
107
 for(var p = 0; p < 12 ; p++){\
108
  for(var d = 0; d < 12 ; d++){\
109
   while(i.indexOf(cons[d]+\"\"+fun[p])!=-1){\
110
    i = i.replace(cons[d]+\"\"+fun[p],cons[d]+\"*\"+fun[p]);\
111
   };\
112
   while(i.indexOf(fun[p]+\"\"+cons[d])!=-1){\
113
    i = i.replace(fun[p]+\"\"+cons[d],fun[p]+\"*\"+cons[d]);\
114
   };\
115
  };\
116
 };\
117
 if(i.indexOf(\"(\")!=-1){\
118
  for(var p = 0;p < 12; p++){\
119
   if(i.indexOf(cons[p]+\"(\")!=-1){\
120
    i = i.replace(cons[p]+\"(\",cons[p]+\"*(\");\
121
   };\
122
   if(i.indexOf(\")\"+cons[p])!=-1){\
123
    i = i.replace(\")\"+cons[p],\")*\"+cons[p]);\
124
   };\
125
  };\
126
  i = i.replace(/\\)\\(/g,\")*(\");\
127
 };\
128
 return i;\
129
};");
130
break;
131
 
132
case JS_PLOT:
133
fprintf(js_include_file,"\n/* jsplot() */\
134
var x_anim_points;var y_anim_points;var animation_steps;var animation_funs;\
135
function jsplot(canvas_type,funs,linewidth,color,opacity,use_dashed,dashtype0,dashtype1,trange,plotsteps,use_parametric,use_animate,origin){\
136
 var obj = create_canvas%d(canvas_type,xsize,ysize);\
137
 var ctx = obj.getContext(\"2d\");\
138
 ctx.clearRect(0,0,xsize,ysize);\
139
 animation_funs = funs.length;\
140
 function eval_jsmath(x,func){return parseFloat(eval(func));};\
141
 if(origin == 0 ){\
142
  if( typeof(multilinewidth) !== 'undefined' && multilinewidth != null ){ linewidth = multilinewidth;};\
143
  if( typeof(multistrokecolors) !== 'undefined' && multistrokecolors != null ){ color = multistrokecolors;};\
144
  if( typeof(multistrokeopacity) !== 'undefined' && multistrokeopacity != null ){ opacity = multistrokeopacity;};\
145
  if( typeof(multidash) !== 'undefined' && multidash != null ){use_dashed = multidash;};\
146
 };\
147
 x_anim_points = [];y_anim_points = [];var idx=0;\
148
 if( use_parametric == 1){\
149
  for(var i = 0 ; i < animation_funs; i=i+2){\
15351 bpr 150
   funs[i] = funs[i].replace(/t/g,'x');\
151
   funs[i+1] = funs[i+1].replace(/t/g,'x');\
152
   funs[i] = funs[i].replace(/xan/g,'tan');\
153
   funs[i+1] = funs[i+1].replace(/xan/g,'tan');\
15111 schaersvoo 154
   var fun_x = to_js_math(funs[i]);\
155
   var fun_y = to_js_math(funs[i+1]);\
156
   if(fun_x == null || fun_y == null){alert(\"Syntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi)) \");return;};\
157
   try{ parseFloat( eval_jsmath( px2x(0),fun_x ) );}catch(e){alert(\"\\nSyntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi))\");return;};\
158
   ctx.lineWidth = linewidth[i] || linewidth;\
159
   ctx.strokeStyle='rgba('+color[i] || color +','+opacity[i] || opacity +')';\
160
   if(use_dashed[i] == \"1\" || use_dashed == \"1\"){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash =[dashtype0,dashtype1];}};\
161
   var y1;var x1;var y2;var x2;\
162
   ctx.beginPath();\
163
   var tmin = trange[0];var tmax = trange[1];\
164
   var step = parseFloat((tmax - tmin)/plotsteps);\
165
   for(var p = tmin ; p < tmax; p = p+step ){\
166
    x1 = x2px(parseFloat(eval_jsmath(p,fun_x)));\
167
    y1 = y2px(parseFloat(eval_jsmath(p,fun_y)));\
168
    x2 = x2px(parseFloat(eval_jsmath(p+step,fun_x)));\
169
    y2 = y2px(parseFloat(eval_jsmath(p+step,fun_y)));\
170
    x_anim_points[idx] = x1;y_anim_points[idx] = y1;idx++;\
171
     ctx.moveTo(x1,y1);\
172
     ctx.lineTo(x2,y2);\
173
     ctx.moveTo(x1,y1);\
174
     ctx.lineTo(x2,y2);\
175
   };\
176
   ctx.closePath();\
177
   ctx.stroke();\
178
  };\
179
  animation_funs = 0.5*animation_funs;\
180
 }else{\
181
  for(var i = 0 ; i < animation_funs; i++){\
182
   var fun = to_js_math(funs[i]);\
183
   if(fun == null){alert(\"Syntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi)) \");return;};\
184
   try{ parseFloat( eval_jsmath( px2x(0),fun ) );}catch(e){alert(\"\\nSyntax Error...\\nAttention : try use very precise notation !\\nlike :\\n6*(0.25)^(1.23)\\n1/(sin(5*x))\\n(3*x+4)/(x^(2*pi))\");return;};\
185
   if(use_dashed[i] == \"1\" || use_dashed == \"1\"){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash =[dashtype0,dashtype1];}};\
186
   ctx.lineWidth = linewidth[i] || linewidth;\
187
   ctx.strokeStyle='rgba('+color[i] || color +','+opacity[i] || opacity +')';\
188
   var y1;var x1;var y2;var x2;\
189
   ctx.beginPath();\
190
   for(var p = 0 ; p<xsize;p++){\
191
    x1 = px2x(p);\
192
    y1 = y2px(parseFloat(eval_jsmath(x1,fun)));\
193
    x2 = px2x(p+1);\
194
    y2 = y2px(parseFloat(eval_jsmath(x2,fun)));\
195
    x_anim_points[idx] = p;y_anim_points[idx] = y1;idx++;\
196
    if(Math.abs(y2-y1) < ysize ){\
197
     ctx.moveTo(p,y1);\
198
     ctx.lineTo(p+1,y2);\
199
    };\
200
   };\
201
   ctx.closePath();\
202
   ctx.stroke();\
203
  };\
204
 };\
205
 if( use_animate == 1 ){animation_steps = idx;animate_this();}\
206
};",canvas_root_id);
207
break;
208
 
209
case JS_MATH:
210
fprintf(js_include_file,"\n/* to_js_math() */\
211
function to_js_math(math_fun){\
212
 if(math_fun == null){return;};\
213
 var infun=[\"sqrt\",\"^\",\"asin\",\"acos\",\"atan\",\"log\",\"pi\",\"abs\",\"sin\",\"cos\",\"tan\",\"e\"];\
214
 var outfun=[\"Math.sqrt\",\"Math.pow\",\"Math.asin\",\"Math.acos\",\"Math.atan\",\"Math.log\",\"(3.14159265358979)\",\"Math.abs\",\"Math.sin\",\"Math.cos\",\"Math.tan\",\"(2.718281828459045)\"];\
215
 var len = infun.length;var in_fun;var In_Fun;var out_fun;var w_cnt;\
216
 for(var p=0 ; p < len ; p++){\
217
  in_fun = infun[p];In_Fun = in_fun.toUpperCase();out_fun = outfun[p];w_cnt=0;\
218
  if(math_fun.indexOf(in_fun) != -1){\
219
   if(in_fun == \"^\"){\
220
    var tab = [];var small_trick = \"___small_trick___\";\
221
    while (math_fun.indexOf(\"(\") != -1){\
222
     math_fun = math_fun.replace(/(\\([^\\(\\)]*\\))/g, function(m, t){tab.push(t);return (small_trick + (tab.length - 1));});\
223
     w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
224
    };\
225
    tab.push(math_fun);w_cnt = 0;math_fun = small_trick + (tab.length - 1);\
226
    while (math_fun.indexOf(small_trick) != -1){\
227
     math_fun = math_fun.replace(new RegExp(small_trick + \"(\\\\d+)\", \"g\"), function(m, d){return tab[d].replace(/(\\w*)\\^(\\w*)/g, out_fun+\"($1,$2)\");});\
228
     w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
229
    };\
16844 bpr 230
   } else {\
15111 schaersvoo 231
    while( math_fun.indexOf(in_fun) != -1 ){\
232
     math_fun = math_fun.replace(in_fun,out_fun);\
233
     math_fun = math_fun.replace(in_fun,In_Fun);\
234
     w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
235
    };\
236
   };\
237
  };\
238
 };\
239
 for(var p=0 ; p < len ; p++){\
240
  in_fun = infun[p];In_Fun = in_fun.toUpperCase();w_cnt = 0;\
241
  if(math_fun.indexOf(In_Fun) != -1 ){\
242
   while(math_fun.indexOf(In_Fun) != -1){\
243
    math_fun = math_fun.replace(In_Fun,in_fun);\
244
    w_cnt++;if(w_cnt>1000){alert(\"hmmm \"+math_fun+\" ?\\nUse command plot for more complex math functions...\");return null;};\
245
   };\
246
  };\
247
 };\
248
 return math_fun;\
249
};");
250
break;
251
 
252
case INTERACTIVE:
16845 bpr 253
 fprintf(js_include_file,"\n/* add mouse support */\
254
var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0));\
255
var getMouse = function(e, element){\
256
   var mx,my;var offsetX = 0,offsetY = 0;\
257
   while( ( element = element.offsetParent) ){\
258
     offsetX += element.offsetLeft;offsetY += element.offsetTop;\
259
   };\
260
   /*console.log('===');*/\
261
   if(isTouch){\
262
      mx = e.pageX - offsetX; my = e.pageY - offsetY;\
263
   }else{\
264
      mx = e.clientX - offsetX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft:document.body.scrollLeft);\
265
      my = e.clientY - offsetY + (document.documentElement.scrollTop ? document.documentElement.scrollTop:document.body.scrollTop);\
266
   };\
267
   /* test if canvas_div is inside a scrollable */\
268
   const scroll_parent = canvas_div.closest('.wims_scrollable');\
269
   if (scroll_parent){\
270
      mx = mx + scroll_parent.scrollLeft;\
271
      my = my + scroll_parent.scrollTop;\
272
   }\
273
   /* If canvas had been resized,, we have to convert these coordinates to original grid*/\
274
   /*console.log('mx before=' + mx);\
275
   console.log('xsize='+xsize);\
276
   console.log('canvas_div.offsetHeight='+canvas_div.offsetWidth);*/\
277
   mx = (mx * xsize / canvas_div.offsetWidth);\
278
   /*console.log('mx after='+mx);*/\
279
   my = (my * ysize / canvas_div.offsetHeight);\
280
   return {x: mx, y: my};\
281
};");
15111 schaersvoo 282
break;
283
case USERDRAW_AND_ZOOM:
284
fprintf(js_include_file,"\n/* add zoom support for multidraw */\
285
function recalculate_userdraw(xmin0,ymin0,xmax0,ymax0){\
286
 function x_zoom(px){\
287
  var x = parseFloat(px*(xmax0 - xmin0)/xsize + xmin0);\
288
  return parseFloat(x*xsize/(xmax - xmin) - xsize*xmin/(xmax - xmin));\
289
 };\
290
 function y_zoom(py){\
291
  var y = parseFloat(ymax0 - py*(ymax0 - ymin0)/ysize);\
292
  return parseFloat(-1*y*ysize/(ymax - ymin) + ymax*ysize/(ymax - ymin));\
293
 };\
294
 function r_zoom(r){\
295
  return r*(xmin0/xmin);\
296
 };\
297
 var len = userdraw_x.length;\
298
 var x;var y;var r;\
299
 for(var p=0;p<len;p++){\
300
  x = userdraw_x[p];\
301
  y = userdraw_y[p];\
302
  userdraw_x[p] = x_zoom(x);\
303
  userdraw_y[p] = y_zoom(y);\
304
  if( userdraw_radius[p] ){\
305
   r = userdraw_radius[p];\
306
   userdraw_radius[p] = r_zoom(r);\
307
  };\
308
 };\
309
};");
310
break;
311
 
312
case DRAG_AND_ZOOM:
313
fprintf(js_include_file,"\n/* add zoom support for drag&drop */\
314
function recalculate_dragdrop(xmin0,ymin0,xmax0,ymax0){\
315
 function x_zoom(px){\
316
  var x = parseFloat(px*(xmax0 - xmin0)/xsize + xmin0);\
317
  return parseFloat(x*xsize/(xmax - xmin) - xsize*xmin/(xmax - xmin));\
318
 };\
319
 function y_zoom(py){\
320
  var y = parseFloat(ymax0 - py*(ymax0 - ymin0)/ysize);\
321
  return parseFloat(-1*y*ysize/(ymax - ymin) + ymax*ysize/(ymax - ymin));\
322
 };\
323
 var len = dragstuff.shapes.length;\
324
 var shape;var L;var x;var y;\
325
 for(var p=0;p<len;p++){\
326
  shape = dragstuff.shapes[p];\
327
  L = shape.x.length;\
328
  for(var i=0;i<L;i++){\
329
   x = shape.x[i];\
330
   y = shape.y[i];\
331
   dragstuff.shapes[p].x[i] = x_zoom(x);\
332
   dragstuff.shapes[p].y[i] = y_zoom(y);\
333
  };\
334
 };\
335
};");
336
break;
337
 
338
case JSPLOT_AND_ZOOM:
339
fprintf(js_include_file,"\n/* add zoom support for jscurves */\
340
function redraw_jsplot(){for(var p=0; p <= all_jsplots;p++){try{var fun = eval('js_plot'+p);fun();}catch(e){};};};");
341
break;
342
 
343
case JS_ZOOM:
344
fprintf(js_include_file,"\n/* add zoom support */\
345
var x_min_start = xmin;var x_max_start = xmax;var y_min_start = ymin;var y_max_start = ymax;\
346
var zoomcanvas = create_canvas%d(%d,xsize,ysize);\
347
function redraw_canvas%d(key){\
348
 var xmin0 = xmin;var xmax0 = xmax;var ymin0 = ymin;var ymax0 = ymax;\
349
 switch(key){\
350
  case 0: xmin++;ymin++;xmax--;ymax--;break;\
351
  case 1: xmin--;ymin--;xmax++;ymax++;break;\
352
  case 2: xmin--;xmax--;break;\
353
  case 3: xmin++;xmax++;break;\
354
  case 4: ymin--;ymax--;break;\
355
  case 5: ymax++;ymin++;break;\
356
  case 6: xmin = x_min_start;xmax=x_max_start;ymin=y_min_start;ymax=y_max_start;break;\
357
  default: break;\
358
 };\
359
 if(xmin >= xmax){xmin = x_min_start;xmax = x_max_start;};\
360
 if(ymin >= ymax){ymax = y_max_start;ymin = y_min_start;};\
361
 if( typeof(recalculate_multidraw) === 'function'){recalculate_multidraw(xmin0,xmax0,ymin0,ymax0);redraw_userdraw();}\
362
 if( typeof(recalculate_userdraw) === 'function'){recalculate_userdraw(xmin0,ymin0,xmax0,ymax0);redraw_userdraw();}\
363
 if( typeof(redraw_grid) === 'function'){redraw_grid();};\
364
 if( typeof(redraw_jsplot) === 'function'){redraw_jsplot();};\
365
 if( typeof(recalculate_dragdrop) === 'function'){recalculate_dragdrop(xmin0,ymin0,xmax0,ymax0);dragstuff.valid = false;dragstuff.draw();};\
366
 return;\
367
};\
368
canvas_div.addEventListener(\"mousedown\",check_zoom_or_pan,false);\
369
canvas_div.addEventListener(\"wheel\",wheel_zoom,false);\
370
canvas_div.addEventListener(\"touchstart\",function(e){ e.preventDefault();check_zoom_or_pan(e.changedTouches[0]);},false);\
371
function wheel_zoom(evt){\
372
 evt.preventDefault();\
373
 var key = 1;\
374
 if(evt.deltaY > 0 ){key = 0};\
375
 redraw_canvas%d(key);\
376
 return;\
377
};\
378
function check_zoom_or_pan(evt){\
379
 var mouse = getMouse(evt,zoomcanvas);\
380
 var my = mouse.y;\
381
 if(my < ysize - 30){ return; };\
382
 var mx = mouse.x;\
383
 var key = -1;\
384
 for(var p = 15 ; p < 106 ; p = p+15){\
385
  key++;\
386
  if(mx > xsize - p){\
387
   redraw_canvas%d(key);\
388
   return;\
389
  };\
390
 };\
391
 return;\
392
};",canvas_root_id,ZOOM_CANVAS,canvas_root_id,canvas_root_id,canvas_root_id);
393
break;
394
 
395
case DRAW_FILL_PATTERN:
396
fprintf(js_include_file,"\n /* add fill pattern */ \
397
function create_Pattern(x0,y0,type,color){document.body.style.cursor = 'wait';var idx = Math.ceil(1000*(Math.random()));var canvas = create_canvas%d(idx,xsize,ysize);canvas.style.visibility = 'hidden';var ctx = canvas.getContext(\"2d\");var x;var y;var dx = 6;var dy = 6;ctx.lineWidth = 1;ctx.strokeStyle = color;ctx.fillStyle = color;var pat;\
398
 switch(type){\
399
  case 2: for( x = 0 ; x < xsize ; x = x + dx ){ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,ysize);ctx.closePath();ctx.stroke();};for( y = 0 ; y < ysize; y = y + dy ){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(xsize,y);ctx.closePath();ctx.stroke();}; pat = ctx.createPattern(canvas,\"no-repeat\");break;\
400
  case 3: y = ysize;ctx.beginPath();for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(x,0);ctx.lineTo(xsize,y);y = y - dy;};y = 0;for( x = xsize ; x > 0 ; x = x - dx){ctx.moveTo(x,ysize);ctx.lineTo(0,y); y = y + dy;};ctx.closePath();ctx.stroke(); pat = ctx.createPattern(canvas,\"no-repeat\");break;\
401
  case 4: y = ysize;ctx.beginPath();for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(x,0); ctx.lineTo(xsize,y); y = y - dy;};y = 0;for( x = xsize ; x > 0 ; x = x - dx){ctx.moveTo(x,ysize);ctx.lineTo(0,y);y = y + dy;};y = 0;for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(x,0); ctx.lineTo(0,y); y = y + dy;};y = 0;for( x = 0 ; x < xsize ; x = x + dx ){ctx.moveTo(xsize,y);ctx.lineTo(x,ysize);y = y + dy;};ctx.closePath(); ctx.stroke(); pat = ctx.createPattern(canvas,\"no-repeat\");break;\
402
  case 5: for( x = 0 ; x < xsize ; x = x + dx ){for( y = 0 ; y < ysize ; y = y + dy ){ctx.beginPath();ctx.arc(x,y,1,0,2*Math.PI,false);ctx.closePath();ctx.fill();};}; pat = ctx.createPattern(canvas,\"no-repeat\");break;\
403
  case 6: alert('wait for image '+(image_cnt+1)+'...');pat = image_patterns[image_cnt];image_cnt++;break;\
404
  default: break;\
405
 };\
406
 document.body.style.cursor = 'default';return pat;\
407
};",canvas_root_id);
408
break;
409
 
410
case JS_TRANSFORM_MOUSE:
411
/* identify mouse coordinates on transformed objects using command affine */
412
fprintf(js_include_file,"\n/* translate mouse */\
413
function transform_mouse(mx,my,obj){\
414
if( typeof(obj.affine_matrix) === 'undefined' ){console.log('translate_mouse() affine_matrix undefined');{x:mx,y:my};};\
415
var m = obj.affine_matrix;\
416
var d = 1/(m[0]*m[3]-m[1]*m[2]);\
417
var im = [ m[3]*d, -m[1]*d,-m[2]*d,m[0]*d,d*(m[2]*m[5]-m[3]*m[4]),d*(m[1]*m[4]-m[0]*m[5]) ];\
418
return { x:mx*im[0]+my*im[2]+im[4], y:mx*im[1]+my*im[3]+im[5] };};");
419
break;
420
 
421
case JS_ROTATE_MOUSE:
422
/*
423
identify mouse coordinates on rotated STRING (no 14) objects used for command rotate :
424
faster than transform matrix
425
*/
426
fprintf(js_include_file,"\n/* rotate mouse */\
427
function rotate_mouse(mx,my,obj){\
428
 if( typeof(obj.angle) === 'undefined' ){console.log('rotate_mouse() angle undefined');return {x:mx,y:my};};\
429
 var cos = Math.cos(obj.angle);\
430
 var sin = Math.sin(obj.angle);\
431
 var xc = obj.rotation_center[0];\
432
 var yc = obj.rotation_center[1];\
433
 var x_r = parseInt((cos * (mx - xc)) + (sin * (my - yc)) + xc);\
434
 var y_r = parseInt((cos * (my - yc)) - (sin * (mx - xc)) + yc);\
435
 return {x:x_r,y:y_r};};");
436
break;
437
 
438
case JS_FIND_ANGLE:
439
 fprintf(js_include_file,"\n/* function find_angle() */ function find_angle(xc,yc,x1,y1){var dx = x1 - xc;var dy = yc - y1;return Math.atan2(dx,dy);};");
440
break;
441
 
442
case DRAG_EXTERNAL_IMAGE:
443
/*
444
the external_canvas is already created: it needs to be FIRST in order to do some drawing onto it
445
reply is object{} and identical to reply from dragstuff library for drag&drop&click
446
reply[object_cnt] = {type:onclick,x:x0,y:y0,r:radius,angle:angle,clicked:0|1};
447
 
448
 
449
   img[6]= parseInt(img[6] - img[16]);\
450
   img[7]= parseInt(img[7] - img[17]);\
451
   else{\
452
    img[6]= parseInt(img[6] + img[16]);\
453
    img[7]= parseInt(img[7] + img[17]);\
454
  };\
455
 
456
*/
457
fprintf(js_include_file,"\n/* drag external images */\
458
var external_ctx = external_canvas.getContext(\"2d\");\
459
var external_canvas_rect = external_canvas.getBoundingClientRect();\
460
canvas_div.addEventListener(\"mousedown\",setxy,false);\
461
canvas_div.addEventListener(\"mouseup\",dragstop,false);\
462
canvas_div.addEventListener(\"mousemove\",dragxy,false);\
463
canvas_div.addEventListener(\"touchstart\",function(e){ e.preventDefault();setxy(e.changedTouches[0]);},false);\
464
canvas_div.addEventListener(\"touchend\"  ,function(e){ e.preventDefault();dragstop(e.changedTouches[0]);},false);\
465
canvas_div.addEventListener(\"touchmove\" ,function(e){ e.preventDefault();dragxy(e.changedTouches[0]);},false);\
466
var selected_image = null;\
467
if( typeof(ext_drag_images) !== 'object' ){var ext_drag_images = new Array();};\
468
if( typeof(ext_image_cnt) == 'undefined'){var ext_image_cnt = 0;};\
469
function drag_external_image(URL,sx,sy,swidth,sheight,x0,y0,width,height,onclick,object_cnt,use_offset,use_snap,resize){\
470
 var image = new Image();\
471
 image.src = URL;\
472
 slidergroup[object_cnt] = null;\
473
 image.onload = function(){\
474
  if( sx < 1 ){ sx = 0; };\
475
  if( sy < 1 ){ sy = 0; };\
476
  if( swidth < 1 ){swidth = image.width;};\
477
  if( sheight < 1 ){sheight = image.height;};\
478
  if( width < 1 ){width = image.width;};\
479
  if( height < 1 ){height = image.height;};\
480
  if( resize == 1 ){\
481
   if( swidth > image.width ){ swidth = image.width; };\
482
   if( sheight > image.height){ sheight = image.height;};\
483
   if( width > image.width ){ width = image.width; };\
484
   if( height > image.height){ height = image.height;};\
485
  };\
486
  var img = new Array(18);\
487
  img[0] = onclick;img[1] = image;img[2] = sx;img[3] = sy;img[4] = swidth;img[5] = sheight;\
488
  img[8] = width;img[9] = height;img[10] = object_cnt;img[11] = use_snap;\
489
  img[6] = x0;img[7] = y0;\
490
  img[12] = ext_image_cnt;\
491
  img[13] = img[6];img[14] = img[7];img[15] = 0;img[16] = 0;img[17] = 0;\
492
  if(use_offset == 4 ){\
493
   img[16] = 0.5*img[8];\
494
   img[17] = 0.5*img[9];\
495
   img[6]= parseInt(img[6] - img[16]);\
496
   img[7]= parseInt(img[7] - img[17]);\
497
  };\
498
  external_ctx.drawImage(img[1],img[2],img[3],img[4],img[5],img[6],img[7],img[8],img[9]);\
499
  dragdrop_reply[img[10]] = {object_cnt:object_cnt,type:img[0],x:x0,y:y0,r:0,angle:0,clicked:img[15]};\
500
  ext_drag_images[ext_image_cnt] = img;\
501
  ext_image_cnt++;\
502
 };\
503
};\
504
function dragstop(evt){\
505
 if(selected_image != null){\
506
  var s_img = ext_drag_images[selected_image];\
507
  dragdrop_reply[s_img[10]] = {type:s_img[0],x:s_img[6]+s_img[16],y:s_img[7]+s_img[17],r:s_img[8],angle:s_img[15],clicked:s_img[15]};\
508
  console.log(dragdrop_reply[s_img[12]]);\
509
 };\
510
 selected_image = null;return;\
511
};\
512
function dragxy(evt){\
513
 if( selected_image != null ){\
514
  var s_img = ext_drag_images[selected_image];\
515
  var mouse = getMouse(evt,external_canvas);\
516
  var xy = multisnap_check(mouse.x,mouse.y,s_img[11]);\
517
  xy[0] = parseInt(xy[0] - 0.5*s_img[8]);\
518
  xy[1] = parseInt(xy[1] - 0.5*s_img[9]);\
519
  s_img[6] = xy[0];s_img[7] = xy[1];\
520
  ext_drag_images[selected_image] = s_img;\
521
  external_ctx.clearRect(0,0,xsize,ysize);\
522
  for(var i = 0; i < ext_image_cnt ; i++){\
523
   var img = ext_drag_images[i];\
524
   external_ctx.drawImage(img[1],img[2],img[3],img[4],img[5],img[6],img[7],img[8],img[9]);\
525
  };\
526
 };\
527
};\
528
function setxy(evt){\
529
 if( ! selected_image ){\
530
  console.log(selected_image);\
531
  var mouse = getMouse(evt,external_canvas);\
532
  var xm = mouse.x;\
533
  var ym = mouse.y;\
534
  var img;var xmarge;var ymarge;\
535
  for(var p = 0 ; p < ext_image_cnt ; p++){\
536
   if( ext_drag_images[p] ){\
537
    img = ext_drag_images[p];\
538
    if( img[0] != 0 ){\
539
     xmarge = 0.5*img[8];ymarge = 0.5*img[9];\
540
     if( xm > img[6] - xmarge && xm < img[6] + img[8]){\
541
      if( ym > img[7] - ymarge && ym < img[7] + img[9]){\
542
       if( img[0] == 1){\
543
        if( dragdrop_reply[img[10]].clicked == 1 ){\
544
         dragdrop_reply[img[10]].clicked = 0;external_ctx.strokeStyle = '#ffffff';\
545
        }\
546
        else\
547
        {\
548
         dragdrop_reply[img[10]].clicked = 1;external_ctx.strokeStyle = '#00ff00';\
549
        };\
550
        external_ctx.lineWidth = 2;\
551
        external_ctx.beginPath();\
552
        external_ctx.rect(img[6]-2,img[7]-2,img[8]+2,img[9]+2);\
553
        external_ctx.closePath();\
554
        external_ctx.stroke();\
555
        return;\
556
       }\
557
       else\
558
       {\
559
        img[6] = xm;\
560
        img[7] = ym;\
561
        selected_image = p;\
562
        dragxy(evt);\
563
        ext_drag_images[p] = img;\
564
       };\
565
      };\
566
     };\
567
    };\
568
   };\
569
  };\
16844 bpr 570
 } else {\
15111 schaersvoo 571
  selected_image = null;\
572
 };\
573
};");
574
break;
575
 
576
case DRAW_EXTERNAL_IMAGE:
577
/*
578
the external_canvas is already created: it needs to be FIRST in order to do some drawing onto it
579
only drag_xy !
580
snaptogrid | xsnaptogrid | ysnaptogrid works
581
14/5/2019
582
on heavy styled wims (unice.fr etc problems with mouse?
583
now uniform method of retreiving mouse coordinates getMouse()
584
*/
585
fprintf(js_include_file,"\n/* draw external images */\
586
function draw_external_image(URL,sx,sy,swidth,sheight,x0,y0,width,height,use_offset,resize){\
587
 var external_ctx = image_copy_canvas.getContext(\"2d\");\n\
588
 var image = new Image();\
589
 image.src = URL;\
590
 image.onload = function(){\
591
  if( sx < 1 ){ sx = 0; };\
592
  if( sy < 1 ){ sy = 0; };\
593
  if( swidth < 1 ){swidth = image.width;};\
594
  if( sheight < 1 ){sheight = image.height;};\
595
  if( width < 1 ){width = image.width;};\
596
  if( height < 1 ){height = image.height;};\
597
  if( resize == 1 ){\
598
   if( swidth > image.width ){ swidth = image.width; };\
599
   if( sheight > image.height){ sheight = image.height;};\
600
   if( width > image.width ){ width = image.width; };\
601
   if( height > image.height){ height = image.height;};\
602
  };\
603
  var img = new Array(9);\
604
  img[0] = image;img[1] = sx;img[2] = sy;img[3] = swidth;img[4] = sheight;img[5] = x0;img[6] = y0;\
605
  if(use_offset == 4 ){img[5] = parseInt(img[5] - 0.5*width);img[6] = parseInt(img[6] - 0.5*height);};\
606
  img[7] = width;img[8] = height;\
607
  external_ctx.drawImage(img[0],img[1],img[2],img[3],img[4],img[5],img[6],img[7],img[8]);\
608
 };\
609
};");
610
break;
611
 
612
case DRAW_BEZIER:
613
fprintf(js_include_file,"\n/* draw bezier curve */\
614
if( typeof(all_fill_patterns) != 'object' ){ var all_fill_patterns = []; };\
615
function draw_bezier(canvas_type,linewidth,xy_points,fill_color,fill_opacity,stroke_color,stroke_opacity,use_filled,use_dashed,dashtype0,dashtype1,use_rotate,angle){\
616
 var obj;\
617
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
618
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 619
 } else {\
15111 schaersvoo 620
  obj = create_canvas%d(canvas_type,xsize,ysize);\
621
 };\
622
 var ctx = obj.getContext(\"2d\");\
623
 ctx.save();\
624
 ctx.strokeStyle=\"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
625
 ctx.lineWidth = linewidth;\
626
 if(use_rotate == 1 ){ctx.rotate(angle*Math.PI/180);};\
627
 if(use_dashed == 1){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash = [dashtype0,dashtype1];};};\
628
 ctx.beginPath();\
629
 ctx.moveTo(x2px(xy_points[0]),y2px(xy_points[1]));\
630
 ctx.bezierCurveTo(x2px(xy_points[2]),y2px(xy_points[3]),x2px(xy_points[4]),y2px(xy_points[5]),x2px(xy_points[6]),y2px(xy_points[7]));\
631
 var color = \"rgba(\"+fill_color+\",\"+fill_opacity+\")\";\
632
 if(use_filled > 1 ){ if(! all_fill_patterns[use_filled] ){ var pat = create_Pattern(0,0,use_filled,color); all_fill_patterns[use_filled] = pat;};ctx.fillStyle = all_fill_patterns[use_filled]; } else { ctx.fillStyle = color;};\
633
 ctx.stroke();\
634
 ctx.restore();\
635
};",canvas_root_id,canvas_root_id,canvas_root_id);
636
break;
637
 
638
case DRAW_GRIDFILL:/* not used for userdraw */
639
fprintf(js_include_file,"\n/* draw gridfill */\
640
var grid_fill_pattern;\
641
function draw_gridfill(canvas_type,x0,y0,dx,dy,linewidth,color,opacity,xsize,ysize,use_userdraw){\
642
 if( dx == 0 || dy == 0 ){alert(\"increment is zero !!! \");return;};\
643
 var fc = %d+canvas_type;\
644
 var obj = create_canvas%d(fc,xsize,ysize);\
645
 var ctx = obj.getContext('2d');\
646
 var x,y;\
647
 ctx.fillStyle='rgba(255,255,255,0.01)';\
648
 ctx.rect(0,0,xsize,ysize);\
649
 ctx.fill();\
650
 ctx.lineWidth = linewidth;\
651
 ctx.strokeStyle=\"rgba(\"+color+\",0.01)\";\
652
 for( x = 0 ; x <= xsize ; x = x + dx ){\
653
  ctx.beginPath();\
654
  ctx.moveTo(x,0);\
655
  ctx.lineTo(x,ysize);\
656
  ctx.closePath();\
657
  ctx.stroke();\
658
 };\
659
 for( y = 0 ; y <= ysize; y = y + dy ){\
660
  ctx.beginPath();\
661
  ctx.moveTo(0,y);\
662
  ctx.lineTo(xsize,y);\
663
  ctx.closePath();\
664
  ctx.stroke();\
665
 };\
666
 if( use_userdraw ){\
667
  grid_fill_pattern = ctx;\
16844 bpr 668
 } else {\
15111 schaersvoo 669
  setTimeout(function(){ filltoborder( x0,y0,color,color,canvas_type,true,ctx); },500);};return;\
670
};",canvas_root_id,canvas_root_id);
671
break;
672
 
673
case DRAW_IMAGEFILL:/* not  used for userdraw */
674
fprintf(js_include_file,"\n/* draw imagefill */\
675
function draw_imagefill(canvas_type,x0,y0,URL,xsize,ysize,use_userdraw,use_scaling){\
676
 var fc = %d+canvas_type;\
677
 var obj = create_canvas%d(fc,xsize,ysize);\
678
 var ctx = obj.getContext('2d');\
679
 var img = new Image();\
680
 img.src = URL;\
681
 obj.style.visibility = 'hidden';\
682
 img.onload = function(){\
683
  if( use_scaling == 1 ){\
684
   ctx.drawImage(img,x0,y0,xsize,ysize);\
685
  }else{\
686
   var w0 = img.width;var h0 = img.height;var w;var h;\
687
   for( w = x0; w < xsize ; w = w + w0 ){\
688
    for( h = y0; h < ysize; h = h + h0){\
689
      ctx.drawImage(img,w,h,w0,h0);\
690
    };\
691
   };\
692
  };\
693
  if( use_userdraw ){\
694
   image_pattern = ctx;\
16844 bpr 695
  } else {\
15111 schaersvoo 696
   setTimeout(function(){ filltoborder( x0,y0,'red','red',canvas_type,true,ctx); },500);\
697
  };\
698
 };\
699
};",canvas_root_id,canvas_root_id);
700
break;
701
 
702
case DRAW_DOTFILL:/* not  used for userdraw */
703
fprintf(js_include_file,"\n/* draw dotfill */\
704
var dot_fill_pattern;\
705
function draw_dotfill(canvas_type,x0,y0,dx,dy,radius,color,opacity,xsize,ysize,use_userdraw){\
706
if( dx == 0 || dy == 0 ){alert(\"increment is zero !!! \");return;};\
707
var fc = %d+canvas_type;\
708
 var obj = create_canvas%d(fc,xsize,ysize);\
709
 var ctx = obj.getContext('2d');\
710
 var x,y;\
711
 ctx.fillStyle='rgba(255,255,255,0.01)';\
712
 ctx.rect(0,0,xsize,ysize);\
713
 ctx.fill();\
714
 ctx.fillStyle=\"rgba(\"+color+\",0.01)\";\
715
 ctx.strokeStyle=\"rgba(\"+color+\",0.01)\";\
716
 for( x = 0 ; x < xsize ; x = x + dx ){\
717
  for( y = 0 ; y < ysize ; y = y + dy ){\
718
   ctx.beginPath();\
719
   ctx.arc(x,y,radius,0,2*Math.PI,false);\
720
   ctx.closePath();\
721
   ctx.fill();\
722
  };\
723
 };\
724
 if( use_userdraw ){\
725
  dot_fill_pattern = ctx;\
16844 bpr 726
 } else {\
15111 schaersvoo 727
 setTimeout(function(){ filltoborder( x0,y0,color,color,canvas_type,true,ctx); },500);\
728
 };\
729
return;\
730
};",canvas_root_id,canvas_root_id);
731
break;
732
 
16714 schaersvoo 733
case DRAW_SUBSUP:/* Uses 'script-size for numbers and for sub & sup strings */
16722 schaersvoo 734
/* use_offset
735
 0=none;
736
 1=yoffset
737
 2=xoffset
738
 3=xyoffset
739
 4=centered
740
*/
16700 schaersvoo 741
fprintf(js_include_file,"\n/* draw sub sup imitation in canvas */\
16722 schaersvoo 742
function draw_subsup(ctx,x,y,txt,use_offset){\
16712 schaersvoo 743
 var C;var c;var len = txt.length;var baseline = 'middle';var space = 0;ctx.save();var subsup=0;\
16722 schaersvoo 744
 var m = 0.4*(ctx.measureText(txt).width);\
745
 var h = ctx.measureText('M').width;\
746
 switch(use_offset){\
747
  case 0:break;\
748
  case 1:y=y-h;;break;\
749
  case 2:x=x+h;break;\
750
  case 3:x=x+h;y=y-h;;break;\
751
  case 4:x=x-m;break;\
752
  default:break;\
753
 };\
16845 bpr 754
 var S = parseInt(ctx.font) || 10;var s = 0.8*(parseInt(ctx.font)) || 8;\
755
 ctx.font = S+'px Helvetica';ctx.textBaseline = baseline;\
16705 schaersvoo 756
 for( c = 0 ; c < len ;c++){\
16700 schaersvoo 757
  C = txt.charAt(c);space = 0;\
16845 bpr 758
  if(C == '_'){ctx.font = s+'px Helvetica';subsup = 1;c++;space = 3;baseline='top';C = txt.charAt(c);}\
16714 schaersvoo 759
  else\
16845 bpr 760
  if(C == '^'){ctx.font = s+'px Helvetica';subsup = 1;c++;space = 3;baseline='bottom';C = txt.charAt(c);}\
16714 schaersvoo 761
  else\
16845 bpr 762
  if(C == ' '){ctx.font = S+'px Helvetica';if(subsup == 1){space = 0.6*s - (ctx.measureText('M').width);subsup = 0;};baseline = 'middle';}\
16714 schaersvoo 763
  else\
764
  if(C >= '0' && C <= '9'){ctx.font = s+'px Helvetica';}\
16845 bpr 765
  else{ctx.font = S+'px Helvetica';};\
16712 schaersvoo 766
  ctx.textBaseline = baseline;ctx.fillText(C,x,y);x = space + x + ctx.measureText(C).width;\
16700 schaersvoo 767
 };\
16705 schaersvoo 768
 ctx.stroke();\
16700 schaersvoo 769
 ctx.restore();\
770
 return;\
771
};");
772
break;
773
 
15111 schaersvoo 774
case DRAW_TEXTFILL:/* not  used for userdraw */
775
fprintf(js_include_file,"\n/* draw textfill */\
776
var text_fill_pattern;\
777
function draw_textfill(canvas_type,x0,y0,color,fontfamily,xsize,ysize,txt,use_userdraw){\
778
var fc = %d+canvas_type;\
779
var obj = create_canvas%d(fc,xsize,ysize);\
780
var ctx = obj.getContext('2d');\
781
ctx.font = fontfamily;\
782
var dx = 2+(ctx.measureText(txt)).width;\
783
var dy = 2+(ctx.measureText('MI')).width;\
784
ctx.fillStyle='rgba(255,255,255,0.01)';\
785
ctx.rect(0,0,xsize,ysize);\
786
ctx.fill();\
787
ctx.fillStyle=\"rgba(\"+color+\",0.01)\";\
788
ctx.strokeStyle=\"rgba(\"+color+\",0.01)\";\
789
for(var x = 0 ; x <= xsize ; x = x + dx ){\
790
 for(var y = 0 ; y <= ysize ; y = y + dy ){\
791
  ctx.fillText(txt, x, y);\
792
 };\
793
};\
794
if( use_userdraw ){\
795
 text_fill_pattern = ctx;\
796
}\
797
else\
798
{\
799
 setTimeout(function(){ filltoborder( x0,y0,color,color,canvas_type,true,ctx); },500);\
800
};\
801
return;};",canvas_root_id,canvas_root_id);
802
break;
803
 
804
case DRAW_DIAMONDFILL:/* not used for userdraw */
805
fprintf(js_include_file,"\n/* draw hatch fill */\
806
var diamond_fill_pattern;\
807
function draw_diamondfill(canvas_type,x0,y0,dx,dy,linewidth,color,stroke_opacity,xsize,ysize,use_userdraw){\
808
if( dx == 0 || dy == 0 ){alert(\"increment is zero !!! \");return;};\
809
var fc = %d+canvas_type;\
810
var obj = create_canvas%d(fc,xsize,ysize);\
811
var ctx = obj.getContext('2d');\
812
var x;\
813
var y;\
814
ctx.lineWidth = linewidth;\
815
ctx.fillStyle='rgba(255,255,255,0.01)';\
816
ctx.rect(0,0,xsize,ysize);\
817
ctx.fill();\
818
ctx.strokeStyle=\"rgba(\"+color+\",0.01)\";\
819
y = ysize;\
820
ctx.beginPath();\
821
for( x = 0 ; x <= xsize ; x = x + dx ){\
822
  ctx.moveTo(x,0);\
823
  ctx.lineTo(xsize,y);\
824
  y = y - dy;\
825
};\
826
y=0;\
827
for( x = xsize ; x >= 0 ; x = x - dx){\
828
 ctx.moveTo(x,ysize);\
829
 ctx.lineTo(0,y);\
830
 y = y + dy;\
831
};\
832
y = 0;\
833
for( x = 0 ; x <= xsize ; x = x + dx ){\
834
 ctx.moveTo(x,0);\
835
 ctx.lineTo(0,y);\
836
 y = y + dy;\
837
};\
838
y = 0;\
839
for( x = 0 ; x <= xsize ; x = x + dx ){\
840
 ctx.moveTo(xsize,y);\
841
 ctx.lineTo(x,ysize);\
842
 y = y + dy;\
843
};\
844
ctx.closePath();\
845
ctx.stroke();\
846
if( use_userdraw ){\
847
 diamond_fill_pattern = ctx;\
848
}\
849
else\
850
{\
851
 setTimeout(function(){ filltoborder( x0,y0,color,color,canvas_type,true,ctx); },500);\
852
};\
853
return;\
854
}",canvas_root_id,canvas_root_id);
855
break;
856
 
857
case DRAW_HATCHFILL:/* not used for userdraw */
858
fprintf(js_include_file,"\n/* draw hatch fill */\
859
var hatch_fill_pattern;\
860
function draw_hatchfill(canvas_type,x0,y0,dx,dy,linewidth,color,stroke_opacity,xsize,ysize,use_userdraw){\
861
if( dx == 0 || dy == 0 ){alert(\"increment is zero !!! \");return;};\
862
var fc = %d+canvas_type;\
863
var obj = create_canvas%d(fc,xsize,ysize);\
864
var ctx = obj.getContext('2d');\
865
var x,y;\
866
ctx.fillStyle='rgba(255,255,255,0.01)';\
867
ctx.rect(0,0,xsize,ysize);\
868
ctx.fill();\
869
ctx.strokeStyle=\"rgba(\"+color+\",0.01)\";\
870
ctx.lineWidth = linewidth;\
871
y = ysize;\
872
ctx.beginPath();\
873
for( x = 0 ; x <= xsize ; x = x + dx ){\
874
 ctx.moveTo(x,0);\
875
 ctx.lineTo(xsize,y);\
876
 y = y - dy;\
877
};\
878
y = 0;\
879
for( x = xsize ; x >= dx ; x = x - dx){\
880
 ctx.moveTo(x,ysize);\
881
 ctx.lineTo(0,y);\
882
 y = y + dy;\
883
};\
884
ctx.closePath();\
885
ctx.stroke();\
886
if( use_userdraw ){\
887
 hatch_fill_pattern = ctx;\
888
}\
889
else\
890
{\
891
 setTimeout(function(){ filltoborder( x0,y0,color,color,canvas_type,true,ctx); },500);\
892
};\
893
return;};",canvas_root_id,canvas_root_id);
894
break;
895
 
896
case DRAW_LINES:/*  used for js-tracing */
897
fprintf(js_include_file,"\n/* draw lines */\
898
function calc_line(x1,x2,y1,y2){\
899
 var marge = 2;\
900
 if(x1 < x2+marge && x1>x2-marge){\
901
  return [x1,0,x1,ysize];\
902
 };\
903
 if(y1 < y2+marge && y1>y2-marge){\
904
  return [0,y1,xsize,y1];\
905
 };\
906
 var Y1 = y1 - (x1)*(y2 - y1)/(x2 - x1);\
907
 var Y2 = y1 + (xsize - x1)*(y2 - y1)/(x2 - x1);\
908
 return [0,Y1,xsize,Y2];\
909
};\
910
var draw_lines = function(ctx,x_points,y_points,line_width,stroke_color,stroke_opacity,use_dashed,dashtype0,dashtype1,use_rotate,angle){\
911
 ctx.save();\
912
 var line = new Array(4);\
913
 if(use_rotate == 1 ){ctx.rotate(angle*Math.PI/180);}\
914
 ctx.lineWidth = line_width;\
915
 ctx.strokeStyle=\"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
916
 if(use_dashed == 1){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash = [dashtype0,dashtype1];};};\
917
 for(var p = 0 ; p < x_points.length ; p = p+2 ){\
918
  line = calc_line(x_points[p],x_points[p+1],y_points[p],y_points[p+1]);\
919
  ctx.beginPath();\
920
  ctx.moveTo(line[0],line[1]);\
921
  ctx.lineTo(line[2],line[3]);\
922
  ctx.closePath();\
923
  ctx.stroke();\
924
  }\
925
  ctx.restore();\
926
  return;\
927
 };");
928
break;
929
 
930
case DRAW_CROSSHAIRS:/*  used for tracing */
931
fprintf(js_include_file,"\n/* draw crosshairs  */\
932
var draw_crosshairs = function(ctx,x_points,y_points,line_width,crosshair_size,stroke_color,stroke_opacity,use_rotate,angle){\
933
 ctx.save();\
934
 if(use_rotate == 1 ){ctx.rotate(angle*Math.PI/180);}\
935
 ctx.lineWidth = line_width;\
936
 ctx.strokeStyle=\"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
937
 var x1,x2,y1,y2;\
938
 for(var p = 0 ; p < x_points.length ; p++ ){\
939
  x1 = x_points[p] - crosshair_size;\
940
  x2 = x_points[p] + crosshair_size;\
941
  y1 = y_points[p] - crosshair_size;\
942
  y2 = y_points[p] + crosshair_size;\
943
  ctx.beginPath();\
944
  ctx.moveTo(x1,y1);\
945
  ctx.lineTo(x2,y2);\
946
  ctx.closePath();\
947
  ctx.stroke();\
948
  ctx.beginPath();\
949
  ctx.moveTo(x2,y1);\
950
  ctx.lineTo(x1,y2);\
951
  ctx.closePath();\
952
  ctx.stroke();\
953
 }\
954
 ctx.restore();\
955
  return;\
956
};");
957
break;
958
 
959
case DRAW_VIDEO:/* not  used for userdraw */
960
fprintf(js_include_file,"\n/* draw video */\
961
var draw_video = function(canvas_root_id,x,y,w,h,URL){\
962
 var canvas_div = document.getElementById(\"canvas_div\"+canvas_root_id);\
963
 var video_div = document.createElement(\"div\");\
964
 canvas_div.appendChild(video_div);\
965
 video_div.style.position = \"absolute\";\
966
 video_div.style.left = x+\"px\";\
967
 video_div.style.top = y+\"px\";\
968
 video_div.style.width = w+\"px\";\
969
 video_div.style.height = h+\"px\";\
970
 var video = document.createElement(\"video\");\
971
 video_div.appendChild(video);\
972
 video.style.width = w+\"px\";\
973
 video.style.height = h+\"px\";\
974
 video.autobuffer = true;\
975
 video.controls = true;video.autoplay = false;\
976
 var src = document.createElement(\"source\");\
977
 src.type = \"video/mp4\";\
978
 src.src = URL;\
979
 video.appendChild(src);\
980
 video.load();\
981
 return;\
982
};");
983
break;
984
 
985
case DRAW_AUDIO:/* not used for userdraw */
986
fprintf(js_include_file,"\n/* draw audio */\
987
var draw_audio = function(canvas_root_id,x,y,w,h,loop,visible,URL1,URL2){\
988
 var canvas_div = document.getElementById(\"canvas_div\"+canvas_root_id);\
989
 var audio_div = document.createElement(\"div\");\
990
 canvas_div.appendChild(audio_div);\
991
 audio_div.style.position = \"absolute\";\
992
 audio_div.style.left = x+\"px\";\
993
 audio_div.style.top = y+\"px\";\
994
 audio_div.style.width = w+\"px\";\
995
 audio_div.style.height = h+\"px\";\
996
 var audio = document.createElement(\"audio\");\
997
 audio_div.appendChild(audio);\
998
 audio.setAttribute(\"style\",\"width:\"+w+\"px;height:\"+h+\"px\");\
999
 audio.autobuffer = true;\
1000
 if(visible == 1 ){ audio.controls = true;audio.autoplay = false;}else{ audio.controls = false;audio.autoplay = true;};\
1001
 if(loop == 1 ){ audio.loop = true;}else{ audio.loop = false;};\
1002
 var src1 = document.createElement(\"source\");\
1003
 src1.type = \"audio/ogg\";\
1004
 src1.src = URL1;\
1005
 audio.appendChild(src1);\
1006
 var src2 = document.createElement(\"source\");\
1007
 src2.type = \"audio/mpeg\";\
1008
 src2.src = URL2;\
1009
 audio.appendChild(src2);\
1010
 audio.load();\
1011
 return;\
1012
};");
1013
break;
1014
 
1015
case DRAW_HTTP:/* not  used for userdraw */
1016
fprintf(js_include_file,"\n/* draw http */\
1017
var draw_http = function(canvas_root_id,x,y,w,h,URL){\
1018
 var canvas_div = document.getElementById(\"canvas_div\"+canvas_root_id);\
1019
 var http_div = document.createElement(\"div\");\
1020
 var iframe = document.createElement(\"iframe\");\
1021
 canvas_div.appendChild(http_div);\
1022
 http_div.appendChild(iframe);\
1023
 iframe.src = URL;\
1024
 iframe.setAttribute(\"width\",w);\
1025
 iframe.setAttribute(\"height\",h);\
1026
 return;\
1027
};");
1028
break;
1029
 
1030
case DRAW_XML:
1031
/*
1032
!! function draw_xml(object)
1033
!! produced by : DRAW_XML
1034
!! used by commands: katex,latex,mathml,html,obabel
1035
!! uses js-functions: calculate_size(xml_div),rad2deg(rad)
1036
!! user interaction: drag,onclick,slider
1037
!! reply function: read_dragdrop()
1038
 
1039
onclick=0; no interaction
1040
onclick=1: click
1041
onclick=2: drag ==> always centered (use_offset=4)
1042
onclick=3: slider + click on object
1043
onclick=4: slider (always active , keyword 'active' in slider params)
1044
onclick=5: slider + dragdrop
1045
xy:  drag_type = 0;
1046
x:   drag_type = 1;
1047
y:   drag_type = 2;
1048
 
1049
obj.type: mathml,katex,html,svg,image(bitmap) (attention: for centering image needs to be measured after loading page !!)
1050
*/
1051
 
1052
fprintf(js_include_file,"\n/* draw xml */\
1053
function centered(xml_div,obj){\
1054
 var ww = 0.5*(parseFloat(window.getComputedStyle(xml_div).width));\
1055
 var hh = 0.5*(parseFloat(window.getComputedStyle(xml_div).height));\
1056
 obj.offset = [ ww , hh ];\
16845 bpr 1057
 /*xml_div.style.left = obj.x[0] - obj.offset[0] +'px';\
1058
 xml_div.style.top  = obj.y[0] - obj.offset[1] +'px';*/\
1059
 xml_div.style.left = (obj.x[0] - obj.offset[0])/xsize*100 +'%%';\
1060
 xml_div.style.top  = (obj.y[0] - obj.offset[1])/ysize*100 +'%%';\
15111 schaersvoo 1061
};\
1062
function rad2deg(rad){return rad*180/(Math.PI);};\
1063
if( typeof(slidergroup) !== 'object' ){ var slidergroup = [];};\
1064
function draw_xml(obj){\
1065
 var mouse;var xy = [obj.x[0],obj.y[0]];\
1066
 var xml_div;\
1067
 dragdrop_reply[obj.object_cnt] = {object_cnt:obj.object_cnt,type:obj.onclick,x:obj.x,y:obj.y,r:0,angle:obj.angle,clicked:0};\
1068
 if( obj.once ){\
1069
  xml_div = document.createElement('DIV');\
1070
  canvas_div.appendChild(xml_div);\
1071
  if( obj.type == 'katex' ){ obj.mathml = LoadKaTeX('html',obj.mathml);};\
1072
  xml_div.id = 'xml_div'+obj.id;\
1073
  xml_div.innerHTML = obj.mathml;\
16845 bpr 1074
  xml_div.classList.add('canvasdraw_xml');\
15111 schaersvoo 1075
  xml_div.style.color = \"rgba(\"+obj.stroke_color+\",\"+obj.stroke_opacity+\")\";\
1076
  xml_div.style.font = obj.fontfamily;\
1077
  if( ! obj.rotation_center){obj.rotation_center = [obj.x[0],obj.y[0]];}else{obj.rotation_center=[x2px(obj.rotation_center[0]) ,y2px(obj.rotation_center[1]) ];};\
16642 schaersvoo 1078
  if( obj.use_center == 1 ){if( obj.type == 'image' ){xml_div.addEventListener('load',function(e){centered(xml_div,obj);},true);}else{%s};};\
16844 bpr 1079
 } else {\
15111 schaersvoo 1080
  xml_div = document.getElementById('xml_div'+obj.id );\
1081
 };\
16845 bpr 1082
 if( typeof(xml_div) === 'undefined' ){console.log('[canvasutil] xml_div undefined'); return;};\
1083
 /*xml_div.style.left = parseInt(obj.x[0] - obj.offset[0]) +'px';\
1084
 xml_div.style.top  = parseInt(obj.y[0] - obj.offset[1]) +'px';*/\
1085
 xml_div.style.left = parseInt((obj.x[0] - obj.offset[0])/xsize*100) +'%%';\
1086
 xml_div.style.top  = parseInt((obj.y[0] - obj.offset[1])/ysize*100) +'%%';\
15111 schaersvoo 1087
 var back_color = 'rgba('+obj.fill_color+','+obj.fill_opacity+')';\
1088
 var no_color = 'rgba(255,255,255,0)';var dragging = false;\
1089
 if( obj.use_affine != 0 || obj.angle != 0 ){\
1090
  xml_div.style.transform = 'matrix('+obj.transform[0]+','+obj.transform[1]+','+obj.transform[2]+','+obj.transform[3]+','+obj.transform[4]+','+obj.transform[5]+') rotate('+rad2deg(obj.angle)+'deg)';\
1091
 };\
1092
 if( obj.once ){\
1093
  obj.once = false;\
1094
  switch(obj.onclick){\
1095
   case 2:\
1096
    if(isTouch){\
1097
     canvas_div.addEventListener('touchmove' ,function(evt){ evt.preventDefault();if(!dragging){return;};mouse = getMouse(evt.changedTouches[0],xml_div);xy = multisnap_check( mouse.x,mouse.y,obj.use_snap);xml_div.style.left = xy[0] - obj.offset[0] - obj.transform[4] + 'px';xml_div.style.top = xy[1] - obj.offset[1] - obj.transform[5] + 'px';},false);\
1098
     canvas_div.addEventListener('touchend'  ,function(evt){ evt.preventDefault();dragging = false;xml_div.style.backgroundColor = no_color;dragdrop_reply[obj.object_cnt] = {object_cnt:obj.object_cnt,type:obj.onclick,x:xy[0],y:xy[1],r:0,angle:obj.angle,clicked:0};obj.x[0] = xy[0];obj.y[0] = xy[1];},false);\
1099
     xml_div.addEventListener('touchstart',function(evt){evt.preventDefault();if(dragging){dragging = false;xml_div.style.backgroundColor = no_color;}else{dragging = true;xml_div.style.backgroundColor = back_color;};},false);\
1100
     xml_div.addEventListener('touchend'  ,function(evt){ evt.preventDefault();dragging = false;xml_div.style.backgroundColor = no_color;dragdrop_reply[obj.object_cnt] = {object_cnt:obj.object_cnt,type:obj.onclick,x:xy[0],y:xy[1],r:0,angle:obj.angle,clicked:0};obj.x[0] = xy[0];obj.y[0] = xy[1];},false);\
16844 bpr 1101
    } else {\
15111 schaersvoo 1102
     canvas_div.addEventListener('mousemove',function(evt){if(!dragging){return;};mouse = getMouse(evt,xml_div);xy = multisnap_check( mouse.x,mouse.y,obj.use_snap);xml_div.style.left = xy[0] - obj.offset[0] - obj.transform[4] + 'px';xml_div.style.top = xy[1] - obj.offset[1] - obj.transform[5] + 'px';},false);\
1103
     canvas_div.addEventListener('mouseup',function(evt){dragging = false;xml_div.style.backgroundColor = no_color;dragdrop_reply[obj.object_cnt] = {object_cnt:obj.object_cnt,type:obj.onclick,x:xy[0],y:xy[1],r:0,angle:obj.angle,clicked:0};obj.x[0] = xy[0];obj.y[0] = xy[1];},false);\
1104
     xml_div.addEventListener('mousedown', function(evt){if(dragging){dragging = false;xml_div.style.backgroundColor = no_color;}else{dragging = true;xml_div.style.backgroundColor = back_color;};},false);\
1105
    };\
1106
    break;\
1107
   case 1:\
16844 bpr 1108
    if(isTouch){\
15111 schaersvoo 1109
     xml_div.addEventListener('touchstart', function(e){ e.preventDefault();if(dragdrop_reply[obj.object_cnt].clicked == 0){ dragdrop_reply[obj.object_cnt].clicked = 1;xml_div.style.backgroundColor = back_color;}else{dragdrop_reply[obj.object_cnt].clicked = 0;xml_div.style.backgroundColor = no_color;};} ,false);\
16844 bpr 1110
    } else {\
15111 schaersvoo 1111
     xml_div.addEventListener('mousedown'  , function(evt){if(dragdrop_reply[obj.object_cnt].clicked == 0){ dragdrop_reply[obj.object_cnt].clicked = 1;xml_div.style.backgroundColor = back_color;}else{dragdrop_reply[obj.object_cnt].clicked = 0;xml_div.style.backgroundColor = no_color;};} ,false);\
1112
    };\
1113
    break;\
1114
   case 3:\
16844 bpr 1115
    if(isTouch){\
15111 schaersvoo 1116
     xml_div.addEventListener('touchstart',function(evt){ if(slidergroup[obj.object_cnt] == null ){ slidergroup[obj.object_cnt] = obj;xml_div.style.backgroundColor = back_color;}else{ slidergroup[obj.object_cnt] = null;xml_div.style.backgroundColor = no_color;};} ,false);\
16844 bpr 1117
    } else {\
15111 schaersvoo 1118
     xml_div.addEventListener('mousedown' ,function(evt){ if(slidergroup[obj.object_cnt] == null ){ slidergroup[obj.object_cnt] = obj;xml_div.style.backgroundColor = back_color;}else{ slidergroup[obj.object_cnt] = null;xml_div.style.backgroundColor = no_color;};} ,false);\
1119
    };\
1120
    break;\
1121
   case 4:slidergroup[obj.object_cnt] = obj;break;\
1122
   case 5:slidergroup[obj.object_cnt] = obj;\
1123
    canvas_div.addEventListener('mousemove',function(evt){if(!dragging){return;};mouse = getMouse(evt,xml_div);xy = multisnap_check( mouse.x,mouse.y,obj.use_snap);xml_div.style.left = xy[0] - obj.offset[0] - obj.transform[4] + 'px';xml_div.style.top = xy[1] - obj.offset[1] - obj.transform[5] + 'px';},false);\
1124
    canvas_div.addEventListener('mouseup',function(evt){dragging = false;xml_div.style.backgroundColor = no_color;dragdrop_reply[obj.object_cnt] = {object_cnt:obj.object_cnt,type:obj.onclick,x:xy[0],y:xy[1],r:0,angle:obj.angle,clicked:0};obj.x[0] = xy[0];obj.y[0] = xy[1];},false);\
1125
    xml_div.addEventListener('mousedown', function(evt){if(dragging){dragging = false;xml_div.style.backgroundColor = no_color;}else{dragging = true;xml_div.style.backgroundColor = back_color;};},false);\
1126
    break;\
1127
   default: break;\
1128
  };\
1129
 };\
1130
 return;\
16642 schaersvoo 1131
};",mathjax);
15111 schaersvoo 1132
 
1133
/*
1134
console.log('angle='+obj.angle+'obj.use_center='+obj.use_center+'id='+obj.id+'xml_div.id = '+xml_div.id+' once ='+obj.once+' offset='+ obj.offset+' div x = '+xml_div.style.left+' div y ='+xml_div.style.top+' obj.x='+px2x(obj.x)+'obj.y='+px2y(obj.y));\
1135
*/
1136
break;
1137
 
1138
case DRAW_SGRAPH:
1139
/*
1140
 xstart = given
1141
 ystart = given
1142
 sgraph(canvas_type,precision,xmajor,ymajor,xminor,yminor,majorcolor,minorcolor,fontfamily)
1143
*/
1144
fprintf(js_include_file,"\n/* draw sgraph */\
1145
var draw_sgraph = function(canvas_type,precision,xmajor,ymajor,xminor,yminor,majorcolor,minorcolor,fontfamily,opacity,font_size){\
1146
 var obj;if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){obj = document.getElementById(\"wims_canvas%d\"+canvas_type);}else{ obj = create_canvas%d(canvas_type,xsize,ysize);};\
1147
 var ctx = obj.getContext(\"2d\");\
1148
 ctx.font = fontfamily;\
1149
 var minor_opacity = 0.8*opacity;\
1150
 ctx.clearRect(0,0,xsize,ysize);\
1151
 var zero_x = 0.1*xsize;\
1152
 var zero_y = 0.9*ysize;\
1153
 var snor_x;var snor_y;\
1154
 if( xstart != xmin){\
1155
  snor_x = 0.1*xsize;\
16844 bpr 1156
 }else{\
15111 schaersvoo 1157
  snor_x = 0;\
1158
  xstart = xmin;\
1159
 };\
1160
 ctx.strokeStyle = \"rgba(\"+majorcolor+\",\"+opacity+\")\";\
1161
 ctx.lineWidth = 2;\
1162
 ctx.beginPath();\
1163
 ctx.moveTo(xsize,zero_y);\
1164
 ctx.lineTo(zero_x,zero_y);\
1165
 ctx.lineTo(zero_x,0);\
1166
 ctx.stroke();\
1167
 ctx.closePath();\
1168
 ctx.beginPath();\
1169
 ctx.moveTo(zero_x,zero_y);\
1170
 ctx.lineTo(zero_x + 0.25*snor_x,zero_y - 0.1*snor_x);\
1171
 ctx.lineTo(zero_x + 0.5*snor_x,zero_y + 0.1*snor_x);\
1172
 ctx.lineTo(zero_x + 0.75*snor_x,zero_y - 0.1*snor_x);\
1173
 ctx.lineTo(zero_x + snor_x,zero_y);\
1174
 ctx.stroke();\
1175
 ctx.closePath();\
1176
 ctx.beginPath();\
1177
 var num = xstart;\
1178
 var flipflop = 1;\
1179
 var step_x = xmajor*(xsize - zero_x - snor_x)/(xmax - xstart);\
1180
 var txtsize;var txt_marge=step_x - 5;\
1181
 for(var x = zero_x+snor_x ; x < xsize;x = x + step_x){\
1182
  txtsize = ctx.measureText(num).width;\
1183
  if( txtsize > txt_marge ){if( flipflop == 1 ){flipflop = 0;}else{flipflop = 1;};};\
1184
  if( flipflop == 1){\
1185
   ctx.fillText(num,x - 0.5*txtsize,zero_y+font_size);\
16844 bpr 1186
  } else {\
15111 schaersvoo 1187
   ctx.fillText(num,x - 0.5*txtsize,zero_y+2*font_size);\
1188
  };\
1189
  num = num + xmajor;\
1190
 };\
1191
 ctx.stroke();\
1192
 ctx.closePath();\
1193
 ctx.lineWidth = 1;\
1194
 ctx.beginPath();\
1195
 for(var x = zero_x+snor_x ; x < xsize;x = x + step_x){\
1196
   ctx.moveTo(x,zero_y);\
1197
   ctx.lineTo(x,0);\
1198
 };\
1199
 ctx.stroke();\
1200
 ctx.closePath();\
1201
 if( xminor > 1){\
1202
  ctx.lineWidth = 0.5;\
1203
  ctx.beginPath();\
1204
  ctx.strokeStyle = \"rgba(\"+minorcolor+\",\"+minor_opacity+\")\";\
1205
  var minor_step_x = step_x / xminor;\
1206
  var nx;\
1207
  for(var x = zero_x+snor_x; x < xsize;x = x + step_x){\
1208
    num = 1;\
1209
    for(var p = 1 ; p < xminor ; p++){\
1210
     nx = x + num*minor_step_x;\
1211
     ctx.moveTo(nx,zero_y);\
1212
     ctx.lineTo(nx,0);\
1213
     num++;\
1214
    };\
1215
  };\
1216
  ctx.stroke();\
1217
  ctx.closePath();\
1218
  ctx.beginPath();\
1219
  ctx.lineWidth = 2;\
1220
  ctx.strokeStyle = \"rgba(\"+majorcolor+\",\"+opacity+\")\";\
1221
  for(var x = zero_x+snor_x ; x < xsize;x = x + step_x){\
1222
   ctx.moveTo(x,zero_y);ctx.lineTo(x,zero_y - 12);\
1223
  };\
1224
  for(var x = zero_x+snor_x ; x < xsize;x = x + minor_step_x){\
1225
   ctx.moveTo(x,zero_y);ctx.lineTo(x,zero_y - 6);\
1226
  };\
1227
  ctx.stroke();\
1228
  ctx.closePath();\
1229
  ctx.lineWidth = 0.5;\
1230
 };\
1231
 xmin = xstart - (xmajor*(zero_x+snor_x)/step_x);\
1232
 if( ystart != ymin){\
1233
  snor_y = 0.1*ysize;\
16844 bpr 1234
 } else {\
15111 schaersvoo 1235
  snor_y = 0;\
1236
  ystart = ymin;\
1237
 };\
1238
 ctx.lineWidth = 2;\
1239
 ctx.strokeStyle = \"rgba(\"+majorcolor+\",\"+opacity+\")\";\
1240
 ctx.beginPath();\
1241
 ctx.moveTo(zero_x,zero_y);\
1242
 ctx.lineTo(zero_x - 0.1*snor_y,zero_y - 0.25*snor_y);\
1243
 ctx.lineTo(zero_x + 0.1*snor_y,zero_y - 0.5*snor_y);\
1244
 ctx.lineTo(zero_x - 0.1*snor_y,zero_y - 0.75*snor_y);\
1245
 ctx.lineTo(zero_x,zero_y - snor_y);\
1246
 ctx.stroke();\
1247
 ctx.closePath();\
1248
 ctx.beginPath();\
1249
 ctx.lineWidth = 1;\
1250
 num = ystart;\
1251
 var step_y = ymajor*(zero_y - snor_y)/(ymax - ystart);\
1252
 for(var y = zero_y - snor_y ; y > 0; y = y - step_y){\
1253
  ctx.moveTo(zero_x,y);\
1254
  ctx.lineTo(xsize,y);\
1255
  ctx.fillText(num,zero_x - ctx.measureText(num+\" \").width,parseInt(y+0.2*font_size));\
1256
  num = num + ymajor;\
1257
 };\
1258
 ctx.stroke();\
1259
 ctx.closePath();\
1260
 if( yminor > 1){\
1261
  ctx.lineWidth = 0.5;\
1262
  ctx.beginPath();\
1263
  ctx.strokeStyle = \"rgba(\"+minorcolor+\",\"+minor_opacity+\")\";\
1264
  var minor_step_y = step_y / yminor;\
1265
  var ny;\
1266
  for(var y = 0 ; y < zero_y - snor_y ;y = y + step_y){\
1267
   num = 1;\
1268
   for(var p = 1 ;p < yminor;p++){\
1269
     ny = y + num*minor_step_y;\
1270
     ctx.moveTo(zero_x,ny);\
1271
     ctx.lineTo(xsize,ny);\
1272
     num++;\
1273
    };\
1274
  };\
1275
  ctx.stroke();\
1276
  ctx.closePath();\
1277
  ctx.lineWidth = 2;\
1278
  ctx.beginPath();\
1279
  ctx.strokeStyle = \"rgba(\"+majorcolor+\",\"+opacity+\")\";\
1280
  for(var y = zero_y - snor_y ; y > 0 ;y = y - step_y){\
1281
   ctx.moveTo(zero_x,y);\
1282
   ctx.lineTo(zero_x+12,y);\
1283
  };\
1284
  for(var y = zero_y - snor_y ; y > 0 ;y = y - minor_step_y){\
1285
   ctx.moveTo(zero_x,y);\
1286
   ctx.lineTo(zero_x+6,y);\
1287
  };\
1288
  ctx.stroke();\
1289
  ctx.closePath();\
1290
 };\
1291
 ymin = ystart - (ymajor*(ysize - zero_y + snor_y)/step_y);\
1292
 if( typeof(legend%d)  !== 'undefined' ){\
1293
  ctx.globalAlpha = 1.0;\
1294
  var y_offset = 2*font_size;\
1295
  var txt;var txt_size;\
1296
  var x_offset = xsize - 2*font_size;\
1297
  var l_length = legend%d.length;var barcolor = new Array();\
1298
  if( typeof(legendcolors%d) !== 'undefined' ){\
1299
   for(var p = 0 ; p < l_length ; p++){\
1300
    barcolor[p] = legendcolors%d[p];\
1301
   };\
16844 bpr 1302
  } else {\
15111 schaersvoo 1303
   if( barcolor.length == 0 ){\
1304
    for(var p = 0 ; p < l_length ; p++){\
1305
     barcolor[p] = stroke_color;\
1306
    };\
1307
   };\
1308
  };\
1309
  for(var p = 0; p < l_length; p++){\
1310
   ctx.fillStyle = barcolor[p];\
1311
   txt = legend%d[p];\
1312
   txt_size = ctx.measureText(txt).width;\
1313
   ctx.fillText(legend%d[p],x_offset - txt_size, y_offset);\
1314
   y_offset = parseInt(y_offset + 1.5*font_size);\
1315
  };\
1316
 };\
1317
 if( typeof(xaxislabel) !== 'undefined' ){\
1318
   ctx.fillStyle = \'#000000\';\
1319
   var txt_size = ctx.measureText(xaxislabel).width + 4 ;\
1320
   ctx.fillText(xaxislabel,xsize - txt_size, zero_y - 7);\
1321
 };\
1322
 if( typeof(yaxislabel) !== 'undefined'){\
1323
   ctx.save();\
1324
   ctx.fillStyle = \'#000000\';\
1325
   var txt_size = ctx.measureText(yaxislabel).width;\
1326
   ctx.translate(zero_x+8 + font_size,txt_size+font_size);\
1327
   ctx.rotate(-0.5*Math.PI);\
1328
   ctx.fillText(yaxislabel,0,0);\
1329
   ctx.restore();\
1330
 };\
1331
};",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
1332
break;
1333
 
1334
case DRAW_NUMBERLINE:
1335
fprintf(js_include_file,"\n/* draw numberline */\
1336
var draw_numberline = function(canvas_type,use_axis_numbering,x0,x1,xmajor,xminor,y0,y1,linewidth,strokecolor,strokeopacity,fontfamily,fontcolor,precision){\
1337
 var obj = create_canvas%d(canvas_type,xsize,ysize);\
1338
 var ctx = obj.getContext(\"2d\");\
1339
 ctx.lineWidth = linewidth || 1;\
1340
 ctx.strokeStyle = \"rgba(\"+strokecolor+\",\"+strokeopacity+\")\";\
15313 schaersvoo 1341
 ctx.font = fontfamily || 'Arial 12px';\
15111 schaersvoo 1342
 var fontsize = parseInt(ctx.font);\
1343
 ctx.fillStyle =  \"rgba(\"+fontcolor+\",\"+strokeopacity+\")\";\
1344
 x1 = x2px(x1);\
1345
 x0 = x2px(x0);\
1346
 y0 = y2px(y0);\
1347
 y1 = y2px(y1);\
1348
 var sub_devision = -1;\
1349
 if( xminor%%2 == 0 ){ sub_devision = xminor/2; };\
1350
 var ybase1 = parseInt( y0 + fontsize + 2 );\
1351
 var ybase2 = parseInt( ybase1 + fontsize + 2 );\
1352
 var yh = Math.abs(parseInt( y0 - 0.3*(y0 -y1)));\
1353
 var ys = Math.abs(parseInt( y0 - 0.6*(y0 -y1)));\
1354
 xmajor = x2px(xmajor) - x2px(0);\
1355
 var i;var len;var p;\
1356
 xminor = xmajor / xminor;\
1357
 ctx.beginPath();\
1358
 for(p = x0 ; p < x1 ; p = p + xmajor){\
1359
  ctx.moveTo(p,y0);ctx.lineTo(p,y1);i = 0;\
1360
  for(var s = p ; s < p + xmajor ; s = s + xminor ){\
1361
   ctx.moveTo(s,y0);\
1362
   if( sub_devision == i){ ctx.lineTo(s,ys); } else { ctx.lineTo(s,yh); };\
1363
   i++;\
1364
  };\
1365
 };\
1366
 ctx.moveTo(p,y0);ctx.lineTo(p,y1);\
1367
 ctx.closePath();\
1368
 ctx.stroke();\
1369
 if( use_axis_numbering >-1 ){\
1370
  var str = x_strings[use_axis_numbering];\
1371
  len = str.length;if((len/2+0.5)%%2 == 0){ alert(\"xaxis number unpaired:  text missing ! \");return;};\
1372
  var corr;var x_nums;var x_text;var flipflop = 0;var off = ybase1;\
1373
  ctx.beginPath();\
1374
  if( x_strings_up[use_axis_numbering] == null){\
1375
   for(var p = 0 ; p < len ; p = p+2){\
1376
    var x_nums = x2px(eval(str[p]));\
1377
    var x_text = str[p+1];\
1378
    corr = ctx.measureText(x_text).width;\
1379
    if( corr > xmajor){ if(flipflop == 0 ){flipflop = 1; off = ybase2;}else{flipflop = 0; off = ybase1;};};\
1380
    ctx.fillText(x_text,parseInt(x_nums-0.5*corr),off);\
1381
   };\
16844 bpr 1382
  } else {\
15111 schaersvoo 1383
   for(var p = 0 ; p < len ; p = p+2){\
1384
    x_nums = x2px(eval(str[p]));\
1385
    x_text = str[p+1];\
1386
    corr = ctx.measureText(x_text).width + ybase1 - fontsize;\
1387
    ctx.save();\
1388
    ctx.translate(x_nums+0.5*fontsize, corr);\
1389
    ctx.rotate(-1.5708);\
1390
    ctx.fillText(x_text,0,0);\
1391
    ctx.restore();\
1392
   };\
1393
  }\
16844 bpr 1394
 } else {\
15111 schaersvoo 1395
  var corr;var num;var flipflop = 0;var off = ybase1;\
1396
  var prec = parseInt(Math.log(precision)/Math.log(10));\
1397
  for(var p = x0 ; p < x1+xmajor ; p = p+xmajor){\
1398
   num = (px2x(p)).toFixed(prec);\
1399
   corr = ctx.measureText(num).width;\
1400
   if( corr > xmajor){ if(flipflop == 0 ){flipflop = 1; off = ybase2;}else{flipflop = 0; off = ybase1;};};\
1401
   ctx.fillText(num,parseInt(p - 0.5*corr),off);\
1402
  };\
1403
 };\
1404
};",canvas_root_id);
1405
break;
1406
 
1407
case DRAW_GRID:/* not used for userdraw */
1408
fprintf(js_include_file,"\n/* draw grid */\
1409
var draw_grid%d = function(canvas_type,precision,stroke_opacity,xmajor,ymajor,xminor,yminor,tics_length,line_width,stroke_color,axis_color,font_size,font_family,use_axis,use_axis_numbering,use_dashed,dashtype0,dashtype1,font_color,fill_opacity){\
1410
var obj;if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){obj = document.getElementById(\"wims_canvas%d\"+canvas_type);}else{obj = create_canvas%d(canvas_type,xsize,ysize);};\
1411
var ctx = obj.getContext(\"2d\");ctx.clearRect(0,0,xsize,ysize);\
1412
if(use_dashed == 1){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{ctx.mozDash = [dashtype0,dashtype1];};};\
1413
ctx.save();\
1414
var stroke_color = \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
1415
ctx.fillStyle = \"rgba(\"+font_color+\",\"+1.0+\")\";\
1416
var axis_color = \"rgba(\"+axis_color+\",\"+stroke_opacity+\")\";\
1417
ctx.font = font_family;\
1418
var barcolor = new Array();\
1419
var xstep = xsize*xmajor/(xmax - xmin);\
1420
var ystep = ysize*ymajor/(ymax - ymin);\
1421
var x2step = xstep / xminor;\
1422
var y2step = ystep / yminor;\
1423
var zero_x = x2px(0);var zero_y = y2px(0);var f_x;var f_y;\
1424
if(xmin < 0 ){ f_x = -1;}else{ f_x = 1;};\
1425
if(ymin < 0 ){ f_y = -1;}else{ f_y = 1;};\
1426
ctx.beginPath();\
1427
ctx.lineWidth = line_width;\
1428
ctx.strokeStyle = stroke_color;\
1429
for(var p = zero_x ; p < xsize; p = p + xstep){\
1430
 ctx.moveTo(p,0);\
1431
 ctx.lineTo(p,ysize);\
1432
};\
1433
for(var p = zero_x ; p > 0; p = p - xstep){\
1434
 ctx.moveTo(p,0);\
1435
 ctx.lineTo(p,ysize);\
1436
};\
1437
for(var p = zero_y ; p < ysize; p = p + ystep){\
1438
 ctx.moveTo(0,p);\
1439
 ctx.lineTo(xsize,p);\
1440
};\
1441
for(var p = zero_y ; p > 0; p = p - ystep){\
1442
 ctx.moveTo(0,p);\
1443
 ctx.lineTo(xsize,p);\
1444
};\
1445
if( typeof(xaxislabel) !== 'undefined' ){\
1446
 ctx.save();\
15313 schaersvoo 1447
 ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 1448
 var corr =  parseInt(1.1*ctx.measureText(xaxislabel).width);\
1449
 ctx.fillText(xaxislabel,xsize - corr,zero_y - tics_length - 0.4*font_size);\
1450
 ctx.restore();\
1451
};\
1452
if( typeof(yaxislabel) !== 'undefined' ){\
1453
 ctx.save();\
15313 schaersvoo 1454
 ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 1455
 var corr = parseInt(ctx.measureText(yaxislabel).width + font_size);\
1456
 ctx.translate(zero_x+tics_length + font_size,corr);\
1457
 ctx.rotate(-0.5*Math.PI);\
1458
 ctx.fillText(yaxislabel,0,0);\
1459
 ctx.restore();\
1460
};\
1461
ctx.stroke();\
1462
ctx.closePath();",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
1463
 
1464
if( use_axis == 1 ){
1465
fprintf(js_include_file,"\
1466
 ctx.save();\
1467
 ctx.beginPath();\
1468
 ctx.strokeStyle = stroke_color;\
1469
 ctx.lineWidth = 0.6*line_width;\
1470
 for(var p = zero_x ; p < xsize; p = p + x2step){\
1471
  ctx.moveTo(p,0);\
1472
  ctx.lineTo(p,ysize);\
1473
 };\
1474
 for(var p = zero_x ; p > 0; p = p - x2step){\
1475
  ctx.moveTo(p,0);\
1476
  ctx.lineTo(p,ysize);\
1477
 };\
1478
 for(var p = zero_y ; p < ysize; p = p + y2step){\
1479
  ctx.moveTo(0,p);\
1480
  ctx.lineTo(xsize,p);\
1481
 };\
1482
 for(var p = zero_y ; p > 0; p = p - y2step){\
1483
  ctx.moveTo(0,p);\
1484
  ctx.lineTo(xsize,p);\
1485
 };\
1486
 ctx.stroke();\
1487
 ctx.closePath();\
1488
 ctx.beginPath();\
1489
 ctx.lineWidth = 2*line_width;\
1490
 ctx.strokeStyle = axis_color;\
1491
 ctx.moveTo(0,zero_y);\
1492
 ctx.lineTo(xsize,zero_y);\
1493
 ctx.moveTo(zero_x,0);\
1494
 ctx.lineTo(zero_x,ysize);\
1495
 ctx.stroke();\
1496
 ctx.closePath();\
1497
 ctx.lineWidth = line_width+0.5;\
1498
 ctx.beginPath();\
1499
 for(var p = zero_x ; p < xsize; p = p + xstep){\
1500
  ctx.moveTo(p,zero_y-tics_length);\
1501
  ctx.lineTo(p,zero_y+tics_length);\
1502
 };\
1503
 for(var p = zero_x ; p > 0; p = p - xstep){\
1504
  ctx.moveTo(p,zero_y-tics_length);\
1505
  ctx.lineTo(p,zero_y+tics_length);\
1506
 };\
1507
 for(var p = zero_y ; p < ysize; p = p + ystep){\
1508
  ctx.moveTo(zero_x-tics_length,p);\
1509
  ctx.lineTo(zero_x+tics_length,p);\
1510
 };\
1511
 for(var p = zero_y ; p > 0; p = p - ystep){\
1512
  ctx.moveTo(zero_x-tics_length,p);\
1513
  ctx.lineTo(zero_x+tics_length,p);\
1514
 };\
1515
 for(var p = zero_x ; p < xsize; p = p + x2step){\
1516
  ctx.moveTo(p,zero_y-0.5*tics_length);\
1517
  ctx.lineTo(p,zero_y+0.5*tics_length);\
1518
 };\
1519
 for(var p = zero_x ; p > 0; p = p - x2step){\
1520
  ctx.moveTo(p,zero_y-0.5*tics_length);\
1521
  ctx.lineTo(p,zero_y+0.5*tics_length);\
1522
 };\
1523
 for(var p = zero_y ; p < ysize; p = p + y2step){\
1524
  ctx.moveTo(zero_x-0.5*tics_length,p);\
1525
  ctx.lineTo(zero_x+0.5*tics_length,p);\
1526
 };\
1527
 for(var p = zero_y ; p > 0; p = p - y2step){\
1528
  ctx.moveTo(zero_x-0.5*tics_length,p);\
1529
  ctx.lineTo(zero_x+0.5*tics_length,p);\
1530
 };\
1531
 ctx.stroke();\
1532
 ctx.closePath();\
1533
 ctx.restore();");
1534
}
1535
 
1536
if( use_axis_numbering != -1 ){
1537
fprintf(js_include_file,"\
1538
 ctx.save();\
1539
 ctx.fillColor = axis_color;\
1540
 ctx.strokeStyle = axis_color;\
1541
 ctx.lineWidth = 2*line_width;\
1542
 ctx.font = font_family;\
1543
 var shift = zero_y+2*font_size;var flip=0;var skip=0;var corr;var cnt;var disp_cnt;var prec;\
1544
 if( x_strings[use_axis_numbering] != null ){\
1545
  var str = x_strings[use_axis_numbering];\
1546
  var len = str.length;if((len/2+0.5)%%2 == 0){ alert(\"xaxis number unpaired:  text missing ! \");return;};\
1547
  ctx.beginPath();\
1548
  if( x_strings_up[use_axis_numbering] == null){\
1549
   for(var p = 0 ; p < len ; p = p+2){\
1550
    var x_nums = x2px(eval(str[p]));\
1551
    var x_text = str[p+1];\
1552
    corr = ctx.measureText(x_text).width;\
1553
    skip = 1.2*corr/xstep;\
1554
    if( zero_y+2*font_size > ysize ){shift = ysize - 2*font_size;};\
1555
    if( skip > 1 ){if(flip == 0 ){flip = 1; shift = shift + font_size;}else{flip = 0; shift = shift - font_size;};};\
1556
    ctx.fillText(x_text,parseInt(x_nums-0.5*corr),shift);\
1557
    ctx.moveTo(x_nums,zero_y - tics_length);\
1558
    ctx.lineTo(x_nums,zero_y + tics_length);\
1559
   };\
16844 bpr 1560
  } else {\
15111 schaersvoo 1561
   for(var p = 0 ; p < len ; p = p+2){\
1562
    var x_nums = x2px(eval(str[p]));\
1563
    var x_text = str[p+1];\
1564
    corr = 2 + tics_length + zero_y + ctx.measureText(x_text).width;\
1565
    if( corr > ysize ){corr = ysize;};\
1566
    ctx.save();\
1567
    ctx.translate(x_nums+0.25*font_size, corr);\
1568
    ctx.rotate(-1.5708);\
1569
    ctx.fillText(x_text,0,0);\
1570
    ctx.restore();\
1571
    ctx.moveTo(x_nums,zero_y - tics_length);\
1572
    ctx.lineTo(x_nums,zero_y + tics_length);\
1573
   };\
1574
  };\
1575
  ctx.closePath();\
16844 bpr 1576
 } else {\
15111 schaersvoo 1577
  skip = 1;cnt = px2x(zero_x);\
1578
  prec = Math.log(precision)/(Math.log(10));\
1579
  var y_basis;if(f_y == 1){ y_basis = ysize }else{ y_basis = zero_y + 1.4*font_size;};\
1580
  for( var p = zero_x ; p < xsize ; p = p+xstep){\
1581
   if(skip == 0 ){\
1582
    disp_cnt = cnt.toFixed(prec);\
1583
    corr = ctx.measureText(disp_cnt).width;\
1584
    skip = parseInt(1.2*corr/xstep);\
1585
    ctx.fillText(disp_cnt,p-0.5*corr,y_basis);\
16844 bpr 1586
   } else {\
15111 schaersvoo 1587
    skip--;\
1588
   };\
1589
   cnt = cnt + xmajor;\
1590
  };\
1591
  cnt = px2x(zero_x);skip = 1;\
1592
  for( var p = zero_x ; p > 0 ; p = p-xstep){\
1593
   if(skip == 0 ){\
1594
    disp_cnt = cnt.toFixed(prec);\
1595
    corr = ctx.measureText(disp_cnt).width;\
1596
    skip = parseInt(1.2*corr/xstep);\
1597
    ctx.fillText(disp_cnt,p-0.5*corr,y_basis);\
16844 bpr 1598
   } else {\
15111 schaersvoo 1599
    skip--;\
1600
   };\
1601
   cnt = cnt - xmajor;\
1602
  };\
1603
 };\
1604
 if( y_strings != null ){\
1605
  var len = y_strings.length;if((len/2+0.5)%%2 == 0){ alert(\"yaxis number unpaired:  text missing ! \");return;};\
1606
  ctx.beginPath();\
1607
  for(var p = 0 ; p < len ; p = p+2){\
1608
   var y_nums = y2px(eval(y_strings[p]));\
1609
   var y_text = y_strings[p+1];\
1610
   corr = 2 + tics_length + ctx.measureText(y_text).width;\
1611
   if( corr > zero_x){corr = parseInt(zero_x+2); }\
1612
   ctx.fillText(y_text,zero_x - corr,y_nums + 0.5*font_size);\
1613
   ctx.moveTo(zero_x - tics_length,y_nums);\
1614
   ctx.lineTo(zero_x + tics_length,y_nums);\
1615
  };\
1616
  ctx.closePath();\
16844 bpr 1617
 } else {\
15111 schaersvoo 1618
  if(f_x == 1){ corr = 1.5*tics_length; }\
1619
  cnt = px2y(zero_y);skip = 1;\
1620
  for( var p = zero_y ; p < ysize ; p = p+ystep){\
1621
   if(skip == 0 ){\
1622
    skip = parseInt(1.4*font_size/ystep);\
1623
    disp_cnt = cnt.toFixed(prec);\
1624
    if(f_x == -1 ){ corr = parseInt(zero_x - (2 + tics_length + ctx.measureText(disp_cnt).width));};\
1625
    ctx.fillText(disp_cnt,parseInt(corr),parseInt(p+(0.4*font_size)));\
16844 bpr 1626
   } else {\
15111 schaersvoo 1627
    skip--;\
1628
   };\
1629
   cnt = cnt - ymajor;\
1630
  };\
1631
  corr = 0;cnt = px2y(zero_y);skip = 1;\
1632
  if(f_x == 1){ corr = 1.5*tics_length; }\
1633
  for( var p = zero_y ; p > 0 ; p = p-ystep){\
1634
   if(skip == 0 ){\
1635
    skip = parseInt(1.4*font_size/ystep);\
1636
    disp_cnt = cnt.toFixed(prec);\
1637
    if(f_x == -1 ){corr = parseInt(zero_x - (2 + tics_length + ctx.measureText(disp_cnt).width));};\
1638
    ctx.fillText(disp_cnt,parseInt(corr),parseInt(p+(0.4*font_size)));\
16844 bpr 1639
   } else {\
15111 schaersvoo 1640
    skip--;\
1641
   };\
1642
   cnt = cnt + ymajor;\
1643
  };\
1644
 };\
1645
 ctx.stroke();\
1646
 ctx.restore();");
1647
}
1648
 
1649
if( legend_cnt != -1 ){
1650
fprintf(js_include_file,"ctx.save();\
1651
 ctx.globalAlpha = 1.0;\
15313 schaersvoo 1652
 ctx.font = \"bold \"+font_size+\"px Arial\";\
15111 schaersvoo 1653
 var y_offset = 2*font_size;\
1654
 var txt;var txt_size;\
1655
 var x_offset = xsize - 2*font_size;\
1656
 var l_length = legend0.length;\
1657
 if( typeof(legendcolors0) !== 'undefined' ){\
1658
  for(var p = 0 ; p < l_length ; p++){\
1659
    barcolor[p] = legendcolors0[p];\
1660
  };\
16844 bpr 1661
 } else {\
15111 schaersvoo 1662
  if( barcolor.length == 0 ){\
1663
   for(var p = 0 ; p < l_length ; p++){\
1664
    barcolor[p] = stroke_color;\
1665
   };\
1666
  };\
1667
 };\
1668
 for(var p = 0; p < l_length; p++){\
1669
  ctx.fillStyle = barcolor[p];\
1670
  txt = legend0[p];\
1671
  txt_size = ctx.measureText(txt).width;\
1672
  ctx.fillText(legend0[p],x_offset - txt_size, y_offset);\
1673
  y_offset = parseInt(y_offset + 1.5*font_size);\
1674
 };\
1675
 ctx.restore();");
1676
}
1677
 
1678
if( barchart_cnt != 0 ){
1679
fprintf(js_include_file,"ctx.save();\
1680
 var num_barcharts = 0;\
1681
 var bar_name = eval('barchart_0');\
1682
 while( typeof(bar_name) !== 'undefined' ){\
1683
    try{ bar_name = eval('barchart_'+num_barcharts);num_barcharts++;}catch(e){break;};\
1684
 };\
1685
 var bar_width = parseInt(0.8*x2step/(num_barcharts));\
1686
 for(var i=0 ; i< num_barcharts ; i++){\
1687
  bar_name = eval('barchart_'+i);\
1688
  var bar_x = new Array();\
1689
  var bar_y = new Array();\
1690
  var lb = bar_name.length;\
1691
  var idx = 0;\
1692
  var dx = parseInt(0.5*i*bar_width);\
1693
  for( var p = 0 ; p < lb ; p = p + 3 ){\
1694
   bar_x[idx] = x2px(bar_name[p]);\
1695
   bar_y[idx] = y2px(bar_name[p+1]);\
1696
   barcolor[idx] = bar_name[p+2];\
1697
   idx++;\
1698
  };\
1699
  ctx.globalAlpha = fill_opacity;\
1700
  for( var p = 0; p < idx ; p++ ){\
1701
   ctx.beginPath();\
1702
   ctx.strokeStyle = barcolor[p];\
1703
   ctx.fillStyle = barcolor[p];\
1704
   ctx.rect(bar_x[p]-0.4*x2step+dx,bar_y[p],bar_width,zero_y - bar_y[p]);\
1705
   ctx.fill();\
1706
   ctx.stroke();\
1707
   ctx.closePath();\
1708
  };\
1709
 };\
1710
 ctx.restore();");
1711
}
1712
 
1713
if( linegraph_cnt != 0 ){
1714
fprintf(js_include_file,"ctx.save();\
1715
 ctx.globalAlpha = 1.0;\
1716
 var i = 0;\
1717
 var line_name = eval('linegraph_'+i);\
1718
 while ( typeof(line_name) !== 'undefined' ){\
1719
  ctx.strokeStyle = 'rgba('+line_name[0]+','+stroke_opacity+')';\
1720
  ctx.lineWidth = parseInt(line_name[1]);\
1721
  if(line_name[2] == \"1\"){\
1722
   var d1 = parseInt(line_name[3]);\
1723
   var d2 = parseInt(line_name[4]);\
1724
   if(ctx.setLineDash){ ctx.setLineDash([d1,d2]); } else { ctx.mozDash = [d1,d2];};\
16844 bpr 1725
  } else {\
15111 schaersvoo 1726
  if(ctx.setLineDash){ctx.setLineDash = null;};if(ctx.mozDash){ctx.mozDash = null;}\
1727
  };\
1728
  var data_x = new Array();var data_y = new Array();\
1729
  var lb = line_name.length;var idx = 0;\
1730
  for( var p = 5 ; p < lb ; p = p + 2 ){\
1731
   data_x[idx] = x2px(line_name[p]);\
1732
   data_y[idx] = y2px(line_name[p+1]);\
1733
   idx++;\
1734
  };\
1735
  for( var p = 0; p < idx ; p++){\
1736
   ctx.beginPath();\
1737
   ctx.moveTo(data_x[p],data_y[p]);\
1738
   ctx.lineTo(data_x[p+1],data_y[p+1]);\
1739
   ctx.stroke();\
1740
   ctx.closePath();\
1741
  };\
1742
  i++;\
1743
  try{ line_name = eval('linegraph_'+i); }catch(e){ break; }\
1744
 };\
1745
 ctx.restore();return;");
1746
}
1747
fprintf(js_include_file,"};");
1748
 
1749
break;
1750
 
1751
case DRAW_PIECHART:
1752
fprintf(js_include_file,"\n/* draw piecharts */\
1753
if( typeof(all_fill_patterns) != 'object' ){ var all_fill_patterns = []; };\
1754
function draw_piechart(canvas_type,x_center,y_center,radius, data_color_list,fill_opacity,legend_cnt,font_family,use_filled,use_offset){\
1755
 var obj;\
1756
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
1757
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 1758
 } else {\
15111 schaersvoo 1759
  obj = create_canvas%d(canvas_type,xsize,ysize);\
1760
 };\
1761
 var center_text = use_offset || 0;\
1762
 var ld = data_color_list.length;\
1763
 var sum = 0;\
1764
 var idx = 0;\
1765
 var font_size = parseInt(font_family.replace(/[^0-9\\.]+/g, \"\"));\
1766
 var colors = new Array();\
1767
 var data = new Array();\
1768
 for(var p = 0;p < ld; p = p + 2){\
1769
  data[idx] = parseFloat(data_color_list[p]);\
1770
  sum = sum + data[idx];\
1771
  colors[idx] = data_color_list[p+1];\
1772
  idx++;\
1773
 };\
1774
 if( use_filled > 1 ){\
1775
  var i = 2;\
1776
  for(var p = 0 ;  p < idx ; p++){\
1777
   if(i > 5 ){ i = 2; };\
1778
   var pat = create_Pattern(0,0,i,colors[p]); all_fill_patterns[p] = pat;i++;\
1779
  };\
1780
 };\
1781
 var ctx = obj.getContext(\"2d\");\
1782
 ctx.save();\
1783
 var angle;\
1784
 var angle_end = 0;\
1785
 var offset = Math.PI / 2;\
1786
 ctx.globalAlpha = fill_opacity;\
1787
 var angles = [];\
1788
 for(var p=0; p < idx; p++){\
1789
  ctx.beginPath();\
1790
  ctx.moveTo(x_center,y_center);\
1791
  angle = Math.PI * (2 * data[p] / sum);\
1792
  ctx.arc(x_center,y_center, radius, angle_end - offset, angle_end + angle - offset, false);\
1793
  ctx.lineTo(x_center, y_center);\
1794
  if( use_filled > 1 ){ ctx.fillStyle = all_fill_patterns[p]; }else{ ctx.fillStyle = colors[p];};\
1795
  ctx.fill();\
1796
  ctx.closePath();\
1797
  angles.push(angle_end + angle - offset);\
1798
  angle_end  = angle_end + angle;\
1799
 };\
1800
 if(typeof(legend0) !== 'undefined'){\
1801
  var legenda = eval(\"legend\"+legend_cnt);\
1802
  ctx.globalAlpha = 1.0;\
1803
  ctx.font = font_family;\
1804
  var y_offset = font_size;\
1805
  var x_offset = 0;\
1806
  var txt;var txt_size;\
1807
  for(var p = 0; p < idx; p++){\
1808
   ctx.fillStyle = colors[p];\
1809
   txt = legenda[p];\
1810
   txt_size = ctx.measureText(txt).width + 2;\
1811
   if(center_text == 4){\
1812
    ctx.save();\
1813
    ctx.translate(x_center, y_center);\
1814
    ctx.rotate(angles[p]);\
1815
    ctx.fillText(txt,radius-txt_size,0);\
1816
    ctx.restore();\
16844 bpr 1817
   } else {\
15111 schaersvoo 1818
    if( x_center + radius + txt_size > xsize ){ x_offset =  x_center + radius + txt_size - xsize;} else { x_offset = 0; };\
1819
    ctx.fillText(txt,x_center + radius - x_offset, y_center - radius + y_offset);\
1820
    y_offset = parseInt(y_offset + 1.5*font_size);\
1821
   };\
1822
  };\
1823
 };\
1824
 ctx.restore();\
1825
};",canvas_root_id,canvas_root_id,canvas_root_id);
1826
break;
1827
 
1828
case DRAW_JSBOXPLOT:
1829
fprintf(js_include_file,"\n/* draw jsboxplots */\
1830
if( typeof(all_fill_patterns) != 'object' ){ var all_fill_patterns = []; };\
1831
function statistics(data){\
1832
 var len = data.length;\
1833
 var min = 10000000;\
1834
 var max = -10000000;\
1835
 var sum = 0;var d;\
1836
 for(var i=0;i<len;i++){\
1837
  d = data[i];\
1838
  if(d < min){min = d;}else{if(d > max){max = d;};};\
1839
  sum+= parseFloat(data[i]);\
1840
 };\
1841
 var mean = parseFloat(sum/len);\
1842
 var variance = 0;\
1843
 for(var i=0;i<len;i++){\
1844
  d = data[i];\
1845
  variance += (d - mean)*(d - mean);\
1846
 };\
1847
 variance = parseFloat(variance / len);\
1848
 var std = Math.sqrt(variance);\
1849
 data.sort(function(a,b){return a - b;});\
1850
 var median;var Q1;var Q3;\
1851
 var half = Math.floor(0.5*len);\
1852
 var q1 = Math.floor(0.25*len);\
1853
 var q3 = Math.floor(0.75*len);\
1854
 var half = Math.floor(0.5*len);\
1855
 if(len %%2 == 1){\
1856
  median = data[half];\
1857
  Q1 = data[q1];\
1858
  Q3 = data[q3];\
16844 bpr 1859
 } else {\
15111 schaersvoo 1860
  median = (data[half - 1] + data[half] )/2;\
1861
  Q1 = (data[q1 - 1] + data[q1] )/2;\
1862
  Q3 = (data[q3 - 1] + data[q3] )/2;\
1863
 };\
1864
 return [min,Q1,median,Q3,max];\
1865
};");
1866
break;
1867
 
1868
case DRAW_BOXPLOT:
1869
fprintf(js_include_file,"\n/* draw boxplots */\
1870
if( typeof(all_fill_patterns) != 'object' ){ var all_fill_patterns = []; };\
1871
draw_boxplot = function(canvas_type,xy,hw,cxy,data,line_width,stroke_color,stroke_opacity,fill_color,fill_opacity,use_filled,use_dashed,dashtype0,dashtype1){\
1872
 var obj;\
1873
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){obj = document.getElementById(\"wims_canvas%d\"+canvas_type);}else{obj = create_canvas%d(canvas_type,xsize,ysize);};\
1874
 var ctx = obj.getContext(\"2d\");\
1875
 ctx.clearRect(0,0,xsize,ysize);\
1876
 ctx.save();\
1877
 ctx.lineWidth = line_width;\
1878
 ctx.strokeStyle =  \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
1879
 var colors = new Array(2);\
1880
 colors[0] = \"rgba(\"+fill_color+\",\"+fill_opacity+\")\";\
1881
 colors[1] = \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
1882
 if( use_filled > 1 ){\
1883
   var pat = create_Pattern(0,0,3,colors[0]);\
1884
   all_fill_patterns[0] = pat;\
1885
   pat = create_Pattern(0,0,4,colors[1]);\
1886
   all_fill_patterns[1] = pat;\
1887
 };\
1888
 if(use_dashed == 1){if(ctx.setLineDash){ctx.setLineDash([dashtype0,dashtype1]);}else{if(ctx.mozDash){ ctx.mozDash = [dashtype0,dashtype1];};};};\
1889
 var hh = 0.25*hw;\
1890
 switch(boxplot_source){\
1891
  case 1: if( typeof(jsboxplot_data) === 'undefined'){return;};data = statistics(jsboxplot_data);break;\
1892
  case 2: if( typeof(student_boxplot_data) === 'undefined'){return;};data = statistics(student_boxplot_data);break;\
1893
  case 3: if( typeof(student_boxplot) === 'undefined'){return;};data = student_boxplot;break;\
1894
  default: break;\
1895
 };\
1896
 var min,Q1,median,Q3,max;\
1897
 if(xy == 1 ){\
1898
  min=x2px(data[0]);Q1=x2px(data[1]);median=x2px(data[2]);Q3=x2px(data[3]);max=x2px(data[4]);\
1899
  hh = Math.abs(y2px(hh) - y2px(ystart));\
1900
  hw = Math.abs(y2px(hw) - y2px(ystart));\
1901
  cxy = y2px(cxy);\
1902
  ctx.beginPath();\
1903
  ctx.moveTo(min,cxy);\
1904
  ctx.lineTo(Q1,cxy);\
1905
  ctx.moveTo(Q3,cxy);\
1906
  ctx.lineTo(max,cxy);\
1907
  ctx.moveTo(min,cxy+hh);\
1908
  ctx.lineTo(min,cxy-hh);\
1909
  ctx.moveTo(max,cxy+hh);\
1910
  ctx.lineTo(max,cxy-hh);\
1911
  ctx.closePath();\
1912
  ctx.stroke();\
1913
  ctx.beginPath();\
1914
  ctx.rect(Q1,cxy-2*hh,median-Q1,hw);\
1915
  ctx.closePath();\
1916
  if( use_filled != 0 ){\
1917
   if( use_filled == 1 ) {ctx.fillStyle = colors[0]; }else{ ctx.fillStyle = all_fill_patterns[0] };\
1918
   ctx.fill();\
1919
  };\
1920
  ctx.stroke();\
1921
  ctx.beginPath();\
1922
  ctx.rect(median,cxy-2*hh,Q3-median,hw);\
1923
  ctx.closePath();\
1924
  if( use_filled != 0 ){\
1925
   if( use_filled == 1 ) {ctx.fillStyle = colors[1]; }else{ ctx.fillStyle = all_fill_patterns[1] };\
1926
   ctx.fill();\
1927
  };\
1928
  ctx.stroke();\
1929
 }else{\
1930
  min=y2px(data[0]);Q1=y2px(data[1]);median=y2px(data[2]);Q3=y2px(data[3]);max=y2px(data[4]);\
1931
  hh = Math.abs(x2px(hh) - x2px(xstart));\
1932
  hw = Math.abs(x2px(hw) - x2px(xstart));\
1933
  cxy = x2px(cxy);\
1934
  ctx.beginPath();\
1935
  ctx.moveTo(cxy,min);\
1936
  ctx.lineTo(cxy,Q1);\
1937
  ctx.moveTo(cxy,Q3);\
1938
  ctx.lineTo(cxy,max);\
1939
  ctx.moveTo(cxy + hh,min);\
1940
  ctx.lineTo(cxy - hh,min);\
1941
  ctx.moveTo(cxy + hh,max);\
1942
  ctx.lineTo(cxy - hh,max);\
1943
  ctx.closePath;\
1944
  ctx.stroke();\
1945
  ctx.beginPath();\
1946
  ctx.rect(cxy - 2*hh,Q1,hw,median - Q1);\
1947
  ctx.closePath();\
1948
  if( use_filled != 0 ){\
1949
   if( use_filled == 1 ) {ctx.fillStyle = colors[0]; }else{ ctx.fillStyle = all_fill_patterns[0] };\
1950
   ctx.fill();\
1951
  };\
1952
  ctx.stroke();\
1953
  ctx.beginPath();\
1954
  ctx.rect(cxy - 2*hh,median,hw,Q3 - median);\
1955
  ctx.closePath();\
1956
  if( use_filled != 0 ){\
1957
   if( use_filled == 1 ) {ctx.fillStyle = colors[1]; }else{ ctx.fillStyle = all_fill_patterns[1] };\
1958
   ctx.fill();\
1959
  };\
1960
  ctx.stroke();\
1961
 };\
1962
 ctx.restore();};",canvas_root_id,canvas_root_id,canvas_root_id);
1963
break;
1964
 
1965
case DRAW_CENTERSTRING:
1966
fprintf(js_include_file,"\n/* draw centerstring */\
1967
var draw_centerstring = function(canvas_type,y,font_family,stroke_color,stroke_opacity,text){\
1968
 var obj;\
1969
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
1970
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 1971
 } else {\
15111 schaersvoo 1972
  obj = create_canvas%d(canvas_type,xsize,ysize);\
1973
 };\
1974
 var ctx = obj.getContext(\"2d\");\
1975
 ctx.save();\
1976
 ctx.clearRect(0,0,xsize,ysize);\
1977
 ctx.font = font_family;\
1978
 ctx.fillStyle = \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
1979
 var stringwidth = ctx.measureText(text).width;\
1980
 var x = parseInt((xsize - stringwidth)/2);if( x < 0 ){x = 0;};\
1981
 ctx.fillText(text,x,y2px(y));\
1982
 ctx.restore();\
1983
return;\
1984
};",canvas_root_id,canvas_root_id,canvas_root_id);
1985
break;
1986
 
1987
case DRAW_TEXTS:
1988
fprintf(js_include_file,"\n/* draw text */\
1989
var draw_text = function(canvas_type,x,y,font_size,font_family,stroke_color,stroke_opacity,angle2,text,use_rotate,angle,use_offset){\
1990
 var obj;\
1991
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
1992
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 1993
 } else {\
15111 schaersvoo 1994
  obj = create_canvas%d(canvas_type,xsize,ysize);\
1995
 };\
1996
 var ctx = obj.getContext(\"2d\");\
1997
 if( font_family != 'null' ){\
1998
  ctx.font = font_family;\
16844 bpr 1999
 } else {\
15313 schaersvoo 2000
  ctx.font = font_size+'px Arial';\
15111 schaersvoo 2001
 };\
2002
 if( use_offset == 3 ){if(angle2 < 0 ){ y = y + 0.8*font_size; x = x + (Math.cos(angle2))*font_size; }else{y = y - 0.8*font_size; x = x + (Math.sin(angle2))*font_size;};};\
2003
 if(angle2 == 0 && angle != 0){\
2004
  ctx.save();\
2005
  if(use_rotate == 1 ){\
2006
  ctx.rotate(angle*Math.PI/180);};\
2007
  ctx.restore();\
2008
 };\
2009
 ctx.fillStyle = \"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
2010
 if(angle2 != 0){\
2011
  ctx.save();\
2012
  ctx.translate(x,y);\
2013
  ctx.rotate((360-angle2)*(Math.PI / 180));\
2014
  ctx.fillText(text,0,0);\
2015
  ctx.restore();\
16844 bpr 2016
 } else {\
15111 schaersvoo 2017
  ctx.fillText(text,x,y);\
2018
 };\
2019
 return;\
2020
};",canvas_root_id,canvas_root_id,canvas_root_id);
2021
break;
2022
 
2023
case DRAW_INPUTS:
2024
/* function center_input may be used for other centering...if not? integrate it in draw_static_inputs...*/
2025
fprintf(js_include_file,"\n/* draw static input fields */\
2026
if(typeof(input_cnt) !== 'undefined' ){var input_cnt = 0;};\
2027
var draw_static_inputs = function(root_id,num,x,y,size,readonly,css_class,value,use_offset){\
2028
var input = document.createElement(\"input\");\
2029
input.setAttribute(\"id\",\"canvas_input\"+num);\
2030
input.setAttribute(\"style\",\"text-align:center;position:absolute;left:\"+x+\"px;top:\"+y+\"px;\");\
2031
if(css_class != \"none\"){input.setAttribute(\"class\",css_class);};\
2032
input.setAttribute(\"size\",size);\
2033
input.setAttribute(\"value\",value);\
2034
input.addEventListener(\"touchstart\", function(e){this.focus();},false);\
2035
if( readonly == 0 || wims_status == \"done\" ){ input.setAttribute(\"readonly\",\"readonly\");if( wims_status == \"done\" ){input.setAttribute(\"value\",\"\");};};\
2036
canvas_div.appendChild(input);\
2037
if(use_offset != 0 ){ center_input('canvas_input'+num,x,y,css_class);};\
2038
input_cnt++;\
2039
};\
2040
function center_input(id,x,y,css_class){\
2041
 var inp = document.getElementById(id);\
2042
 var pos = inp.getBoundingClientRect();\
2043
 var center_x = parseInt(x - 0.5*(pos.width));\
2044
 var center_y = parseInt(y - 0.5*(pos.height));\
2045
 try{if(css_class != \"none\"){inp.setAttribute(\"class\",css_class);};inp.setAttribute(\"style\",\"text-align:center;position:absolute;left:\"+center_x+\"px;top:\"+center_y+\"px;\");}\
2046
 catch(e){console.log('error :'+e);return;};\
2047
};");
2048
break;
2049
 
2050
case DRAW_TEXTAREAS:
2051
fprintf(js_include_file,"\n/* draw text area inputfields */\
2052
var draw_textareas = function(root_id,num,x,y,cols,rows,readonly,style,value){\
2053
var canvas_div = document.getElementById(\"canvas_div\"+root_id);\
2054
var textarea = document.createElement(\"textarea\");\
2055
textarea.setAttribute(\"id\",\"canvas_input\"+num);\
2056
textarea.setAttribute(\"style\",\"position:absolute;left:\"+x+\"px;top:\"+y+\"px;\"+style);\
2057
textarea.setAttribute(\"cols\",cols);\
2058
textarea.setAttribute(\"rows\",rows);\
2059
textarea.value = value;\
2060
if( readonly == 0 || wims_status == \"done\" ){ textarea.setAttribute(\"readonly\",\"readonly\");if( wims_status == \"done\" ){textarea.value=\"\";};};\
2061
canvas_div.appendChild(textarea);};");
2062
break;
2063
 
2064
case DRAW_PIXELS:
2065
fprintf(js_include_file,"\n/* draw pixel */\
2066
var draw_setpixel = function(x,y,color,opacity,pixelsize){\
2067
 var idx = 2000+Math.ceil(1000*(Math.random()));\
2068
 var canvas = create_canvas%d(idx,xsize,ysize);\
2069
 var d = 0.5*pixelsize;\
2070
 var ctx = canvas.getContext(\"2d\");\
2071
 if(pixelsize%%2 == 1){ ctx.translate(0.5,0.5);};\
2072
 ctx.fillStyle = \"rgba(\"+color+\",\"+opacity+\")\";\
2073
 ctx.clearRect(0,0,xsize,ysize);\
2074
 for(var p=0; p<x.length;p++){\
2075
  ctx.fillRect( x2px(x[p]) - d, y2px(y[p]) - d , pixelsize, pixelsize );\
2076
 };\
2077
 ctx.fill();ctx.stroke();\
2078
};",canvas_root_id);
2079
break;
2080
 
2081
case DRAW_CLOCK:
2082
fprintf(js_include_file,"\n/* command clock */\
2083
var clock_canvas = create_canvas%d(%d,xsize,ysize);\
2084
var clock_ctx = clock_canvas.getContext(\"2d\");\
2085
var clock = function(xc,yc,radius,H,M,S,type,interaction,h_color,m_color,s_color,bg_color,fg_color){\
2086
 clock_ctx.clearRect(xc - radius,yc - radius,2*radius,2*radius);\
2087
 clock_ctx.save();\
2088
 clock_ctx.globalAlpha = clock_bg_opacity;\
2089
 this.type = type || 0;\
2090
 this.interaction = interaction || 0;\
2091
 this.H = H;\
2092
 this.M = M;\
2093
 this.S = S;\
2094
 this.xc = xc || xsize/2;\
2095
 this.yc = yc || ysize/2;\
2096
 this.radius = radius || xsize/4;\
2097
 var font_size = parseInt(0.2*this.radius);\
2098
 this.H_color = h_color || \"black\";\
2099
 this.M_color = m_color || \"black\";\
2100
 this.S_color = s_color || \"black\";\
2101
 this.fg_color = fg_color || \"black\";\
2102
 this.bg_color = bg_color || \"white\";\
2103
 clock_ctx.translate(this.xc,this.yc);\
2104
 clock_ctx.beginPath();\
2105
 clock_ctx.arc(0,0,this.radius,0,2*Math.PI,false);\
2106
 clock_ctx.fillStyle = this.bg_color;\
2107
 clock_ctx.fill();\
2108
 clock_ctx.closePath();\
2109
 clock_ctx.beginPath();\
2110
 clock_ctx.font = font_size+\"px Arial\";\
2111
 clock_ctx.fillStyle = this.fg_color;\
2112
 clock_ctx.textAlign = \"center\";\
2113
 clock_ctx.textBaseline = 'middle';\
2114
 var angle;var x1,y1,x2,y2;\
2115
 var angle_cos;var angle_sin;\
2116
 clock_ctx.globalAlpha = clock_fg_opacity;\
2117
 switch(type){\
2118
 case 0:clock_ctx.beginPath();\
2119
 for(var p = 1; p <= 12 ; p++){\
2120
  angle_cos = this.radius*(Math.cos(p * (Math.PI * 2) / 12));\
2121
  angle_sin = this.radius*(Math.sin(p * (Math.PI * 2) / 12));\
2122
  x1 = 0.8*angle_cos;y1 = 0.8*angle_sin;x2 = angle_cos;y2 = angle_sin;\
2123
  clock_ctx.moveTo(x1,y1);\
2124
  clock_ctx.lineTo(x2,y2);\
2125
 };\
2126
 for(var p = 1; p <= 60 ; p++){\
2127
  angle_cos = this.radius*(Math.cos(p * (Math.PI * 2) / 60));\
2128
  angle_sin = this.radius*(Math.sin(p * (Math.PI * 2) / 60));\
2129
  x1 = 0.9*angle_cos;y1 = 0.9*angle_sin;x2 = angle_cos;y2 = angle_sin;\
2130
  clock_ctx.moveTo(x1,y1);\
2131
  clock_ctx.lineTo(x2,y2);\
2132
 };\
2133
 clock_ctx.closePath();\
2134
 clock_ctx.stroke();\
2135
 break;\
2136
 case 1:\
2137
 for(var p= 1; p <= 12 ; p++){ angle = (p - 3) * (Math.PI * 2) / 12;x1 = 0.9*this.radius*Math.cos(angle);y1 = 0.9*this.radius*Math.sin(angle);clock_ctx.fillText(p, x1, y1);};break;\
2138
 case 2:\
2139
 for(var p= 1; p <= 12 ; p++){ angle = (p - 3) * (Math.PI * 2) / 12;x1 = 0.8*this.radius*Math.cos(angle);y1 = 0.8*this.radius*Math.sin(angle);clock_ctx.fillText(p, x1, y1);};\
2140
 clock_ctx.beginPath();\
2141
 for(var p = 1; p <= 12 ; p++){\
2142
  angle_cos = this.radius*(Math.cos(p * (Math.PI * 2) / 12));\
2143
  angle_sin = this.radius*(Math.sin(p * (Math.PI * 2) / 12));\
2144
  x1 = 0.9*angle_cos;y1 = 0.9*angle_sin;x2 = angle_cos;y2 = angle_sin;\
2145
  clock_ctx.moveTo(x1,y1);\
2146
  clock_ctx.lineTo(x2,y2);\
2147
 };\
2148
 for(var p = 1; p <= 60 ; p++){\
2149
  angle_cos = this.radius*(Math.cos(p * (Math.PI * 2) / 60));\
2150
  angle_sin = this.radius*(Math.sin(p * (Math.PI * 2) / 60));\
2151
  x1 = 0.95*angle_cos;y1 = 0.95*angle_sin;x2 = angle_cos;y2 = angle_sin;\
2152
  clock_ctx.moveTo(x1,y1);\
2153
  clock_ctx.lineTo(x2,y2);\
2154
 };\
2155
 clock_ctx.closePath();\
2156
 clock_ctx.stroke();\
2157
 break;\
2158
 };\
2159
 angle = (this.H - 3 + this.M/60 ) * 2 * Math.PI / 12;\
2160
 clock_ctx.rotate(angle);\
2161
 clock_ctx.beginPath();\
2162
 clock_ctx.moveTo(-3, -2);\
2163
 clock_ctx.lineTo(-3, 2);\
2164
 clock_ctx.lineTo(this.radius * 0.6, 1);\
2165
 clock_ctx.lineTo(this.radius  * 0.6, -1);\
2166
 clock_ctx.fillStyle = this.H_color;\
2167
 clock_ctx.fill();\
2168
 clock_ctx.rotate(-angle);\
2169
 angle = (this.M - 15 + this.S/60) * 2 * Math.PI / 60;\
2170
 clock_ctx.rotate(angle);\
2171
 clock_ctx.beginPath();\
2172
 clock_ctx.moveTo(-3, -2);\
2173
 clock_ctx.lineTo(-3, 2);\
2174
 clock_ctx.lineTo(this.radius  * 0.8, 1);\
2175
 clock_ctx.lineTo(this.radius  * 0.8, -1);\
2176
 clock_ctx.fillStyle = this.M_color;\
2177
 clock_ctx.fill();\
2178
 clock_ctx.rotate(-angle);\
2179
 angle = (this.S - 15) * 2 * Math.PI / 60;\
2180
 clock_ctx.rotate(angle);\
2181
 clock_ctx.beginPath();\
2182
 clock_ctx.moveTo(0,0);\
2183
 clock_ctx.lineTo(this.radius  * 0.9, 1);\
2184
 clock_ctx.lineTo(this.radius  * 0.9, -1);\
2185
 clock_ctx.strokeStyle = this.S_color;\
2186
 clock_ctx.stroke();\
2187
 clock_ctx.restore();\
2188
};",canvas_root_id,CLOCK_CANVAS);
2189
break;
2190
 
2191
case DRAW_LATTICE:
2192
fprintf(js_include_file,"\n/* draw lattice */\
2193
var draw_lattice = function(canvas_type,line_width,x0,y0,dx1,dy1,dx2,dy2,n1,n2,fill_color,fill_opacity,stroke_color,stroke_opacity,use_rotate,angle,use_filled){\
2194
 var obj;\
2195
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
2196
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 2197
 } else {\
15111 schaersvoo 2198
  obj = create_canvas%d(canvas_type,xsize,ysize);\
2199
 };\
2200
 var ctx = obj.getContext(\"2d\");\
2201
 ctx.save();\
2202
 if(use_rotate == 1 ){ctx.rotate(angle*Math.PI/180);}\
2203
 var color = \"rgba(\"+fill_color+\",\"+fill_opacity+\")\";\
2204
 if(use_filled > 1 ){ if(! all_fill_patterns[use_filled] ){ var pat = create_Pattern(0,0,use_filled,color); all_fill_patterns[use_filled] = pat;};ctx.fillStyle = all_fill_patterns[use_filled]; } else { ctx.fillStyle = color;};\
2205
 ctx.strokeStyle=\"rgba(\"+stroke_color+\",\"+stroke_opacity+\")\";\
2206
 var radius = line_width;\
2207
 var x = 0;\
2208
 var y = 0;\
2209
 var x_step_px = xsize/(xmax-xmin);\
2210
 var y_step_px = ysize/(ymax-ymin);\
2211
 var xv1 = dx1*x_step_px;\
2212
 var yv1 = dy1*y_step_px;\
2213
 var xv2 = dx2*x_step_px;\
2214
 var yv2 = dy2*y_step_px;\
2215
 for(var p = 0; p < n1 ;p++){\
2216
  x = p*xv1 + x0;\
2217
  y = p*yv1 + y0;\
2218
  for(var c = 0; c < n2 ; c++){\
2219
   ctx.beginPath();\
2220
   ctx.arc(x+c*xv2,y+c*yv2,radius,0,2*Math.PI,false);\
2221
   ctx.fill();\
2222
   ctx.stroke();\
2223
   ctx.closePath();\
2224
  };\
2225
 };\
2226
 ctx.restore();\
2227
 return;\
2228
};",canvas_root_id,canvas_root_id,canvas_root_id);
2229
break;
2230
 
2231
case DRAW_XYLOGSCALE:
2232
fprintf(js_include_file,"\n/* draw xylogscale */\
2233
var draw_grid%d = function(canvas_type,line_width,major_color,minor_color,major_opacity,minor_opacity,font_size,font_family,font_color,use_axis_numbering,precision){\
2234
 var obj;\
2235
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
2236
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 2237
 } else {\
15111 schaersvoo 2238
  obj = create_canvas%d(canvas_type,xsize,ysize);\
2239
 };\
2240
 var ctx = obj.getContext(\"2d\");\
2241
 ctx.clearRect(0,0,xsize,ysize);\
2242
 ctx.save();\
2243
 var xmarge;var ymarge;var x_e;var y_e;var num;var corr;var xtxt;var ytxt;\
2244
 var x_min = Math.log(xmin)/Math.log(xlogbase);\
2245
 var x_max = Math.log(xmax)/Math.log(xlogbase);\
2246
 var y_min = Math.log(ymin)/Math.log(ylogbase);\
2247
 var y_max = Math.log(ymax)/Math.log(ylogbase);\
2248
 if(use_axis_numbering != -1){\
2249
  ctx.font = font_family;\
2250
  xmarge = ctx.measureText(ylogbase+'^'+y_max.toFixed(0)+' ').width;\
2251
  ymarge = parseInt(1.5*font_size);\
2252
  ctx.save();\
2253
  ctx.fillStyle=\"rgba(255,215,0,0.2)\";\
2254
  ctx.rect(0,0,xmarge,ysize);\
2255
  ctx.rect(0,ysize-ymarge,xsize,ysize);\
2256
  ctx.fill();\
2257
  ctx.restore();\
2258
 }else{xmarge = 0;ymarge = 0;};\
2259
 if( typeof(xaxislabel) !== 'undefined' ){\
2260
  ctx.save();\
15313 schaersvoo 2261
  ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 2262
  ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2263
  corr =  ctx.measureText(xaxislabel).width;\
2264
  ctx.fillText(xaxislabel,xsize - 1.5*corr,ysize - 2*font_size);\
2265
  ctx.restore();\
2266
 };\
2267
 if( typeof(yaxislabel) !== 'undefined' ){\
2268
  ctx.save();\
15313 schaersvoo 2269
  ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 2270
  ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2271
  corr = ctx.measureText(yaxislabel).width;\
2272
  ctx.translate(xmarge+font_size,corr+font_size);\
2273
  ctx.rotate(-0.5*Math.PI);\
2274
  ctx.fillText(yaxislabel,0,0);\
2275
  ctx.restore();\
2276
 };\
2277
 ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2278
 ctx.lineWidth = line_width;\
2279
 for(var p = x_min; p <= x_max ; p++){\
2280
  num = Math.pow(xlogbase,p);\
2281
  for(var i = 1 ; i < xlogbase ; i++){\
2282
   x_e = x2px(i*num);\
2283
   if( i == 1 ){\
2284
    ctx.lineWidth = line_width;\
2285
    ctx.strokeStyle=\"rgba(\"+major_color+\",\"+major_opacity+\")\";\
2286
    if( use_axis_numbering != -1 && p > x_min){\
2287
      xtxt = xlogbase+'^'+p.toFixed(0);\
2288
      corr = 0.5*(ctx.measureText(xtxt).width);\
2289
      ctx.fillText(xtxt,x_e - corr,ysize - 4);\
2290
    };\
2291
   }else{\
2292
    ctx.lineWidth = 0.2*line_width;\
2293
    ctx.strokeStyle=\"rgba(\"+minor_color+\",\"+minor_opacity+\")\";\
2294
   };\
2295
   if( x_e >= xmarge ){\
2296
    ctx.beginPath();\
2297
    ctx.moveTo(x_e,0);\
2298
    ctx.lineTo(x_e,ysize - ymarge);\
2299
    ctx.stroke();\
2300
    ctx.closePath();\
2301
   };\
2302
  };\
2303
 };\
2304
 for(var p = y_min; p <= y_max ; p++){\
2305
  num = Math.pow(ylogbase,p);\
2306
  for(var i = 1 ; i < ylogbase ; i++){\
2307
   y_e = y2px(i*num);\
2308
   if( i == 1 ){\
2309
    ctx.lineWidth = line_width;\
2310
    ctx.strokeStyle=\"rgba(\"+major_color+\",\"+major_opacity+\")\";\
2311
    if( use_axis_numbering != -1 && p > y_min){\
2312
     ctx.fillText(ylogbase+'^'+p.toFixed(0),0,y_e);\
2313
    };\
2314
   }else{\
2315
    ctx.lineWidth = 0.2*line_width;\
2316
    ctx.strokeStyle=\"rgba(\"+minor_color+\",\"+minor_opacity+\")\";\
2317
   };\
2318
   ctx.beginPath();\
2319
   ctx.moveTo(xmarge,y_e);\
2320
   ctx.lineTo(xsize,y_e);\
2321
   ctx.stroke();\
2322
   ctx.closePath();\
2323
  };\
2324
 };\
2325
 ctx.restore();\
2326
};",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
2327
break;
2328
 
2329
case DRAW_XLOGSCALE:
2330
fprintf(js_include_file,"\n/* draw xlogscale */\
2331
var draw_grid%d = function(canvas_type,line_width,major_color,minor_color,major_opacity,minor_opacity,font_size,font_family,font_color,use_axis_numbering,ymajor,yminor,precision){\
2332
 var obj;\
2333
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
2334
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 2335
 } else {\
15111 schaersvoo 2336
  obj = create_canvas%d(canvas_type,xsize,ysize);\
2337
 };\
2338
 var ctx = obj.getContext(\"2d\");\
2339
 ctx.clearRect(0,0,xsize,ysize);\
2340
 ctx.save();\
2341
 ctx.lineWidth = line_width;\
2342
 var prec = Math.log(precision)/Math.log(10);\
2343
 var x_min = Math.log(xmin)/Math.log(xlogbase);\
2344
 var x_max = Math.log(xmax)/Math.log(xlogbase);\
2345
 var y_min = 0;var y_max = ysize;var x_e;var corr;\
2346
 var xtxt;var ytxt;var num;var xmarge;var ymarge;\
2347
 if(use_axis_numbering != -1){\
2348
  ctx.font = font_family;\
2349
  xmarge = ctx.measureText(ymax.toFixed(prec)+' ').width;\
2350
  ymarge = parseInt(1.5*font_size);\
2351
  ctx.save();\
2352
  ctx.fillStyle=\"rgba(255,215,0,0.2)\";\
2353
  ctx.rect(0,0,xmarge,ysize);\
2354
  ctx.rect(0,ysize-ymarge,xsize,ysize);\
2355
  ctx.fill();\
2356
  ctx.restore();\
2357
 }else{xmarge = 0;ymarge = 0;};\
2358
 if( typeof(xaxislabel) !== 'undefined' ){\
2359
  ctx.save();\
15313 schaersvoo 2360
  ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 2361
  ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2362
  corr =  ctx.measureText(xaxislabel).width;\
2363
  ctx.fillText(xaxislabel,xsize - 1.5*corr,ysize - 2*font_size);\
2364
  ctx.restore();\
2365
 };\
2366
 if( typeof(yaxislabel) !== 'undefined' ){\
2367
  ctx.save();\
15313 schaersvoo 2368
  ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 2369
  ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2370
  corr = ctx.measureText(yaxislabel).width;\
2371
  ctx.translate(xmarge+font_size,corr+font_size);\
2372
  ctx.rotate(-0.5*Math.PI);\
2373
  ctx.fillText(yaxislabel,0,0);\
2374
  ctx.restore();\
2375
 };\
2376
 ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2377
 ctx.lineWidth = line_width;\
2378
 for(var p = x_min; p <= x_max ; p++){\
2379
  num = Math.pow(xlogbase,p);\
2380
  for(var i = 1 ; i < xlogbase ; i++){\
2381
   x_e = x2px(i*num);\
2382
   if( i == 1 ){\
2383
     ctx.lineWidth = line_width;\
2384
     ctx.strokeStyle=\"rgba(\"+major_color+\",\"+major_opacity+\")\";\
2385
    if( use_axis_numbering != -1 && p > x_min ){\
2386
      xtxt = xlogbase+'^'+p.toFixed(0);\
2387
      corr = 0.5*(ctx.measureText(xtxt).width);\
2388
      ctx.fillText(xtxt,x_e - corr,ysize - 4);\
2389
    };\
2390
   }else{\
2391
    ctx.lineWidth = 0.2*line_width;\
2392
    ctx.strokeStyle=\"rgba(\"+minor_color+\",\"+minor_opacity+\")\";\
2393
   };\
2394
   if( x_e >= xmarge ){\
2395
    ctx.beginPath();\
2396
    ctx.moveTo(x_e,0);\
2397
    ctx.lineTo(x_e,ysize - ymarge);\
2398
    ctx.stroke();\
2399
    ctx.closePath();\
2400
   };\
2401
  };\
2402
 };\
2403
 var stepy = Math.abs(y2px(ymajor) - y2px(0));\
2404
 var minor_step = stepy / yminor;\
2405
 for(var y = 0 ; y < ysize - stepy ; y = y + stepy){\
2406
  ctx.strokeStyle=\"rgba(\"+major_color+\",\"+major_opacity+\")\";\
2407
  ctx.lineWidth = line_width;\
2408
  ctx.beginPath();\
2409
  ctx.moveTo(xmarge,y);\
2410
  ctx.lineTo(xsize,y);\
2411
  ctx.stroke();\
2412
  ctx.closePath();\
2413
  if( use_axis_numbering != -1){\
2414
   ytxt = (px2y(y)).toFixed(prec);\
2415
   ctx.fillText( ytxt,0 ,y + 0.5*font_size );\
2416
  };\
2417
  for(var dy = 1 ; dy < yminor ; dy++){\
2418
   ctx.strokeStyle=\"rgba(\"+minor_color+\",\"+minor_opacity+\")\";\
2419
   ctx.lineWidth = 0.2*line_width;\
2420
   ctx.beginPath();\
2421
   ctx.moveTo(xmarge,y+dy*minor_step);\
2422
   ctx.lineTo(xsize,y+dy*minor_step);\
2423
   ctx.stroke();\
2424
   ctx.closePath();\
2425
  };\
2426
 };\
2427
 ctx.restore();\
2428
};",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
2429
break;
2430
 
2431
case DRAW_YLOGSCALE:
2432
fprintf(js_include_file,"\n/* draw ylogscale */\
2433
var draw_grid%d = function(canvas_type,line_width,major_color,minor_color,major_opacity,minor_opacity,font_size,font_family,font_color,use_axis_numbering,xmajor,xminor,precision){\
2434
 var obj;\
2435
 if( document.getElementById(\"wims_canvas%d\"+canvas_type) ){\
2436
  obj = document.getElementById(\"wims_canvas%d\"+canvas_type);\
16844 bpr 2437
 } else {\
15111 schaersvoo 2438
  obj = create_canvas%d(canvas_type,xsize,ysize);\
2439
 };\
2440
 var ctx = obj.getContext(\"2d\");\
2441
 ctx.clearRect(0,0,xsize,ysize);\
2442
 ctx.save();\
2443
 ctx.lineWidth = line_width;\
2444
 var y_min = Math.log(ymin)/Math.log(ylogbase);\
2445
 var y_max = Math.log(ymax)/Math.log(ylogbase);\
2446
 var x_min = 0;var x_max = xsize;var y_s;var y_e;var num;var xmarge;var ymarge;\
2447
 if(use_axis_numbering != -1){\
2448
  ctx.font = font_family;\
2449
  xmarge = ctx.measureText(ylogbase+\"^\"+y_max.toFixed(0)+' ').width;\
2450
  ymarge = 2*font_size;\
2451
  ctx.save();\
2452
  ctx.fillStyle=\"rgba(255,215,0,0.2)\";\
2453
  ctx.rect(0,0,xmarge,ysize);\
2454
  ctx.rect(0,ysize-ymarge,xsize,ysize);\
2455
  ctx.fill();\
2456
  ctx.restore();\
2457
 }else{xmarge = 0;ymarge = 0;};\
2458
 if( typeof(xaxislabel) !== 'undefined' ){\
2459
  ctx.save();\
15313 schaersvoo 2460
  ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 2461
  ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2462
  corr =  ctx.measureText(xaxislabel).width;\
2463
  ctx.fillText(xaxislabel,xsize - 1.5*corr,ysize - 2*font_size);\
2464
  ctx.restore();\
2465
 };\
2466
 if( typeof(yaxislabel) !== 'undefined' ){\
2467
  ctx.save();\
15313 schaersvoo 2468
  ctx.font = \"italic \"+font_size+\"px Arial\";\
15111 schaersvoo 2469
  ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2470
  corr = ctx.measureText(yaxislabel).width;\
2471
  ctx.translate(xmarge+font_size,corr+font_size);\
2472
  ctx.rotate(-0.5*Math.PI);\
2473
  ctx.fillText(yaxislabel,0,0);\
2474
  ctx.restore();\
2475
 };\
2476
 ctx.fillStyle = \"rgba(\"+font_color+\",\"+major_opacity+\")\";\
2477
 ctx.lineWidth = line_width;\
2478
 for(var p = y_min; p <= y_max ; p++){\
2479
  num = Math.pow(ylogbase,p);\
2480
  for(var i = 1 ; i < ylogbase ; i++){\
2481
   y_e = y2px(i*num);\
2482
   if( i == 1 ){\
2483
    ctx.lineWidth = line_width;\
2484
    ctx.strokeStyle=\"rgba(\"+major_color+\",\"+major_opacity+\")\";\
2485
    if( use_axis_numbering != -1 && p > y_min){\
2486
     ctx.fillText(ylogbase+'^'+p.toFixed(0),0,y_e);\
2487
    };\
2488
   }else{\
2489
    ctx.lineWidth = 0.2*line_width;\
2490
    ctx.strokeStyle=\"rgba(\"+minor_color+\",\"+minor_opacity+\")\";\
2491
   };\
2492
   ctx.beginPath();\
2493
   ctx.moveTo(xmarge,y_e);\
2494
   ctx.lineTo(xsize,y_e);\
2495
   ctx.stroke();\
2496
   ctx.closePath();\
2497
  };\
2498
 };\
2499
 var stepx = Math.abs(x2px(xmajor) - x2px(0));\
2500
 var minor_step = stepx / xminor;\
2501
 var prec = Math.log(precision)/Math.log(10);\
2502
 var xtxt;var corr;var flip = 0;\
2503
 for(var x = stepx ; x < xsize ; x = x + stepx){\
2504
  ctx.strokeStyle=\"rgba(\"+major_color+\",\"+major_opacity+\")\";\
2505
  ctx.lineWidth = line_width;\
2506
  ctx.beginPath();\
2507
  ctx.moveTo(x,ysize-ymarge);\
2508
  ctx.lineTo(x,0);\
2509
  ctx.stroke();\
2510
  ctx.closePath();\
2511
  if( use_axis_numbering != -1){\
2512
   xtxt = (px2x(x)).toFixed(prec);\
2513
   corr = 0.5*(ctx.measureText(xtxt).width);\
2514
   if(flip == 0 ){flip = 1;ctx.fillText( xtxt,x - corr ,ysize - 0.2*font_size );}else{\
2515
   flip = 0;ctx.fillText( xtxt,x - corr ,ysize - 1.2*font_size );};\
2516
  };\
2517
  for(var dx = 1 ; dx < xminor ; dx++){\
2518
   ctx.strokeStyle=\"rgba(\"+minor_color+\",\"+minor_opacity+\")\";\
2519
   ctx.lineWidth = 0.2*line_width;\
2520
   ctx.beginPath();\
2521
   ctx.moveTo(x+dx*minor_step,ysize - ymarge);\
2522
   ctx.lineTo(x+dx*minor_step,0);\
2523
   ctx.stroke();\
2524
   ctx.closePath();\
2525
  };\
2526
 };\
2527
 ctx.restore();\
2528
};",canvas_root_id,canvas_root_id,canvas_root_id,canvas_root_id);
2529
break;
2530
 
2531
case ADD_USER_INPUTS:
2532
fprintf(js_include_file,"\n/* add_input_xy */\
2533
function add_input_xy(){\
2534
if( wims_status == \"done\" ){return;};\
2535
var tooltip_div = document.getElementById(\"tooltip_placeholder_div%d\");\
2536
var input_xy_div = document.createElement('div');\
2537
input_xy_div.id = \"input_xy_div\";\
2538
tooltip_div.appendChild(input_xy_div);",canvas_root_id);
2539
 
2540
if(strstr(draw_type,"polyline") != NULL || strstr(draw_type,"point") != NULL || strstr(draw_type,"cross") != NULL ){ /* ( input_x : input_y )*/
2541
type=1;
2542
fprintf(js_include_file,"input_xy_div.innerHTML=\"<br /><span class='%s'>(<input type='text' size='2' value='' id='userinput_x'/> : <input type='text' size='2' value='' id='userinput_y'/>)<input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";",css_class);
2543
}else{
2544
if(strstr(draw_type,"circle") != NULL ){/* M: (input_x :input_y) R:input_r*/
2545
type=2;
2546
fprintf(js_include_file,"input_xy_div.innerHTML=\"<br /><span class='%s'>M:&nbsp;(<input type='text' size='2' value='' id='userinput_x'/> : <input type='text' size='2' value='' id='userinput_y'/>) &nbsp;&nbsp;R:&nbsp;<input type='text' size='2' value='' id='userinput_r'/><input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";",css_class);
2547
}else{
2548
type=3;
2549
if(strstr(draw_type,"segment") != NULL  ||  strstr(draw_type,"line") != NULL  ||  strstr(draw_type,"arrow") != NULL  ){  /* ( input_x1 : input_y1) --- ( input_x2 : input_y2) */
2550
fprintf(js_include_file,"input_xy_div.innerHTML=\"<br /><span class='%s'>(<input type='text' size='2' value='' id='userinput_x1'/> : <input type='text' size='2' value='' id='userinput_y1'/>) &minus;&minus;&minus; (<input type='text' size='2' value='' id='userinput_x2'/> : <input type='text' size='2' value='' id='userinput_y2'/>)<input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";",css_class);
2551
}else{
2552
type=4;
2553
if(strstr(draw_type,"triang") != NULL ){ /* ( input_x1 : input_y1) --- ( input_x2 : input_y2) --- ( input_x3 : input_y3) */
2554
fprintf(js_include_file,"input_xy_div.innerHTML=\"<br /><span class='%s'>&#8420;&nbsp;&nbsp;<input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/><br/>(<input type='text' size='2' value='' id='userinput_x1'/> : <input type='text' size='2' value='' id='userinput_y1'/>)<br/>(<input type='text' size='2' value='' id='userinput_x2'/> : <input type='text' size='2' value='' id='userinput_y2'/>)<br/>(<input type='text' size='2' value='' id='userinput_x3'/> : <input type='text' size='2' value='' id='userinput_y3'/>)</span> \";",css_class);
2555
}else{
2556
type=5;
2557
if(strstr(draw_type,"text") != NULL ){ /*Text: input_r ( input_x1 : input_y1)  */
2558
fprintf(js_include_file,"input_xy_div.innerHTML=\"<br /><span class='%s'>(<input type='text' size='2' value='' id='userinput_x'/>:<input type='text' size='2' value='' id='userinput_y'/>)&nbsp;<input id='update_button' type='button' value='OK' onclick='' style='color:red;background-color:lightblue;'/><input id='delete_button' type='button' value='NOK' onclick='' style='color:blue;background-color:red;'/></span> \";",css_class);
2559
}else{canvas_error("command 'userinput' or 'userinput_xy' is not supported for your 'userdraw' type...");
2560
}}}}}
2561
 
2562
fprintf(js_include_file,"\
2563
var update_button = document.getElementById(\"update_button\");\
2564
var delete_button = document.getElementById(\"delete_button\");\
2565
update_button.addEventListener(\"mousedown\",function(e){update_me();redraw_userdraw();return;},false);\
2566
delete_button.addEventListener(\"mousedown\",function(e){remove_last();return;},false);\
2567
};add_input_xy();");
2568
 
2569
switch(type){
2570
 case 1:
2571
fprintf(js_include_file,"\n/* add_input_xy */\
2572
function update_me(){\
15529 schaersvoo 2573
 var x = safe_eval(document.getElementById('userinput_x').value);\
2574
 var y = safe_eval(document.getElementById('userinput_y').value);\
15111 schaersvoo 2575
 userdraw_x.push(x2px(x));userdraw_y.push(y2px(y));\
2576
 return;\
2577
};");break;
2578
 case 2:
2579
fprintf(js_include_file,"\n/* add_input_xy */\
2580
function update_me(){\
15529 schaersvoo 2581
 var x = safe_eval(document.getElementById('userinput_x').value);\
2582
 var y = safe_eval(document.getElementById('userinput_y').value);\
2583
 var r = safe_eval(document.getElementById('userinput_r').value);\
15111 schaersvoo 2584
 r = scale_x_radius(r);\
2585
 userdraw_radius.push(r);userdraw_x.push(x2px(x));userdraw_y.push(y2px(y));\
2586
 return;\
2587
};");break;
2588
 case 3:
2589
fprintf(js_include_file,"\n/* add_input_xy */\
2590
function update_me(){\
2591
 var x,y;\
2592
 for(var p=1; p<3;p++){\
15529 schaersvoo 2593
  x = safe_eval(document.getElementById('userinput_x'+p).value);\
2594
  y = safe_eval(document.getElementById('userinput_y'+p).value);\
15111 schaersvoo 2595
  userdraw_x.push(x2px(x));userdraw_y.push(y2px(y));\
2596
 };\
2597
 return;\
2598
};");
2599
 break;
2600
 case 4:
2601
fprintf(js_include_file,"\n/* add_input_xy */\
2602
function update_me(){\
2603
 var x,y;\
2604
 for(var p=1; p<4;p++){\
15529 schaersvoo 2605
  x = safe_eval(document.getElementById('userinput_x'+p).value);\
2606
  y = safe_eval(document.getElementById('userinput_y'+p).value);\
15111 schaersvoo 2607
  userdraw_x.push(x2px(x));userdraw_y.push(y2px(y));\
2608
 };\
2609
 return;\
2610
};");
2611
 break;
2612
 case 5:
2613
 /* a inputfield with 'id=userdraw_text_abc' is provided by command 'userdraw text,color'*/
2614
fprintf(js_include_file,"\n/* add_input_xy */\
2615
function update_me(){\
15529 schaersvoo 2616
 var x = safe_eval(document.getElementById('userinput_x').value);\
2617
 var y = safe_eval(document.getElementById('userinput_y').value);\
15111 schaersvoo 2618
 var txt = conv_to_unicode(document.getElementById('userdraw_text_abc').value);\
2619
 userdraw_x.push(x2px(x));userdraw_y.push(y2px(y));userdraw_text.push(txt.replace(/\\\\/g,' '));\
2620
 return;\
2621
};");
2622
 break;
2623
 default: canvas_error("hmmm, I've no idea...");break;
2624
}
2625
 
2626
break;
2627
 
2628
default:break;
2629
   }
2630
  }
2631
 }
2632
  return;
2633
}