Subversion Repositories wimsdev

Rev

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