Subversion Repositories wimsdev

Rev

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