Added the "visualise links" script. It's disabled because it doesn't
[cocanwiki.git] / html / _js / wz_jsgraphics.js
1 /* This notice must be untouched at all times.\r
2 \r
3 wz_jsgraphics.js    v. 2.3\r
4 The latest version is available at\r
5 http://www.walterzorn.com\r
6 or http://www.devira.com\r
7 or http://www.walterzorn.de\r
8 \r
9 Copyright (c) 2002-2004 Walter Zorn. All rights reserved.\r
10 Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )\r
11 Last modified: 17. 5. 2004\r
12 \r
13 Performance optimizations for Internet Explorer\r
14 by Thomas Frank and John Holdsworth.\r
15 fillPolygon method implemented by Matthieu Haller.\r
16 \r
17 High Performance JavaScript Graphics Library.\r
18 Provides methods\r
19 - to draw lines, rectangles, ellipses, polygons\r
20   with specifiable line thickness,\r
21 - to fill rectangles and ellipses\r
22 - to draw text.\r
23 NOTE: Operations, functions and branching have rather been optimized\r
24 to efficiency and speed than to shortness of source code.\r
25 \r
26 This program is free software;\r
27 you can redistribute it and/or modify it under the terms of the\r
28 GNU General Public License as published by the Free Software Foundation;\r
29 either version 2 of the License, or (at your option) any later version.\r
30 This program is distributed in the hope that it will be useful,\r
31 but WITHOUT ANY WARRANTY;\r
32 without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
33 See the GNU General Public License\r
34 at http://www.gnu.org/copyleft/gpl.html for more details.\r
35 */\r
36 \r
37 \r
38 var jg_ihtm, jg_ie, jg_fast, jg_dom, jg_moz,\r
39 jg_n4 = (document.layers && typeof document.classes != "undefined");\r
40 \r
41 \r
42 function chkDHTM(x, i)\r
43 {\r
44         x = document.body || null;\r
45         jg_ie = x && typeof x.insertAdjacentHTML != "undefined";\r
46         jg_dom = (x && !jg_ie &&\r
47                 typeof x.appendChild != "undefined" &&\r
48                 typeof document.createRange != "undefined" &&\r
49                 typeof (i = document.createRange()).setStartBefore != "undefined" &&\r
50                 typeof i.createContextualFragment != "undefined");\r
51         jg_ihtm = !jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined";\r
52         jg_fast = jg_ie && document.all && !window.opera;\r
53         jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";\r
54 }\r
55 \r
56 \r
57 function pntDoc()\r
58 {\r
59         this.wnd.document.write(jg_fast? this.htmRpc() : this.htm);\r
60         this.htm = '';\r
61 }\r
62 \r
63 \r
64 function pntCnvDom()\r
65 {\r
66         var x = document.createRange();\r
67         x.setStartBefore(this.cnv);\r
68         x = x.createContextualFragment(jg_fast? this.htmRpc() : this.htm);\r
69         this.cnv.appendChild(x);\r
70         this.htm = '';\r
71 }\r
72 \r
73 \r
74 function pntCnvIe()\r
75 {\r
76         this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this.htmRpc() : this.htm);\r
77         this.htm = '';\r
78 }\r
79 \r
80 \r
81 function pntCnvIhtm()\r
82 {\r
83         this.cnv.innerHTML += this.htm;\r
84         this.htm = '';\r
85 }\r
86 \r
87 \r
88 function pntCnv()\r
89 {\r
90         this.htm = '';\r
91 }\r
92 \r
93 \r
94 function mkDiv(x, y, w, h)\r
95 {\r
96         this.htm += '<div style="position:absolute;'+\r
97                 'left:' + x + 'px;'+\r
98                 'top:' + y + 'px;'+\r
99                 'width:' + w + 'px;'+\r
100                 'height:' + h + 'px;'+\r
101                 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
102                 'background-color:' + this.color +\r
103                 (!jg_moz? ';overflow:hidden' : '')+\r
104                 ';"><\/div>';\r
105 }\r
106 \r
107 \r
108 function mkDivIe(x, y, w, h)\r
109 {\r
110         this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';\r
111 }\r
112 \r
113 \r
114 function mkDivPrt(x, y, w, h)\r
115 {\r
116         this.htm += '<div style="position:absolute;'+\r
117                 'border-left:' + w + 'px solid ' + this.color + ';'+\r
118                 'left:' + x + 'px;'+\r
119                 'top:' + y + 'px;'+\r
120                 'width:0px;'+\r
121                 'height:' + h + 'px;'+\r
122                 'clip:rect(0,'+w+'px,'+h+'px,0);'+\r
123                 'background-color:' + this.color +\r
124                 (!jg_moz? ';overflow:hidden' : '')+\r
125                 ';"><\/div>';\r
126 }\r
127 \r
128 \r
129 function mkLyr(x, y, w, h)\r
130 {\r
131         this.htm += '<layer '+\r
132                 'left="' + x + '" '+\r
133                 'top="' + y + '" '+\r
134                 'width="' + w + '" '+\r
135                 'height="' + h + '" '+\r
136                 'bgcolor="' + this.color + '"><\/layer>\n';\r
137 }\r
138 \r
139 \r
140 var regex =  /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;\r
141 function htmRpc()\r
142 {\r
143         return this.htm.replace(\r
144                 regex,\r
145                 '<div style="overflow:hidden;position:absolute;background-color:'+\r
146                 '$1;left:$2;top:$3;width:$4;height:$5"></div>\n');\r
147 }\r
148 \r
149 \r
150 function htmPrtRpc()\r
151 {\r
152         return this.htm.replace(\r
153                 regex,\r
154                 '<div style="overflow:hidden;position:absolute;background-color:'+\r
155                 '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');\r
156 }\r
157 \r
158 \r
159 function mkLin(x1, y1, x2, y2)\r
160 {\r
161         if (x1 > x2)\r
162         {\r
163                 var _x2 = x2;\r
164                 var _y2 = y2;\r
165                 x2 = x1;\r
166                 y2 = y1;\r
167                 x1 = _x2;\r
168                 y1 = _y2;\r
169         }\r
170         var dx = x2-x1, dy = Math.abs(y2-y1),\r
171         x = x1, y = y1,\r
172         yIncr = (y1 > y2)? -1 : 1;\r
173 \r
174         if (dx >= dy)\r
175         {\r
176                 var pr = dy<<1,\r
177                 pru = pr - (dx<<1),\r
178                 p = pr-dx,\r
179                 ox = x;\r
180                 while ((dx--) > 0)\r
181                 {\r
182                         ++x;\r
183                         if (p > 0)\r
184                         {\r
185                                 this.mkDiv(ox, y, x-ox, 1);\r
186                                 y += yIncr;\r
187                                 p += pru;\r
188                                 ox = x;\r
189                         }\r
190                         else p += pr;\r
191                 }\r
192                 this.mkDiv(ox, y, x2-ox+1, 1);\r
193         }\r
194 \r
195         else\r
196         {\r
197                 var pr = dx<<1,\r
198                 pru = pr - (dy<<1),\r
199                 p = pr-dy,\r
200                 oy = y;\r
201                 if (y2 <= y1)\r
202                 {\r
203                         while ((dy--) > 0)\r
204                         {\r
205                                 if (p > 0)\r
206                                 {\r
207                                         this.mkDiv(x++, y, 1, oy-y+1);\r
208                                         y += yIncr;\r
209                                         p += pru;\r
210                                         oy = y;\r
211                                 }\r
212                                 else\r
213                                 {\r
214                                         y += yIncr;\r
215                                         p += pr;\r
216                                 }\r
217                         }\r
218                         this.mkDiv(x2, y2, 1, oy-y2+1);\r
219                 }\r
220                 else\r
221                 {\r
222                         while ((dy--) > 0)\r
223                         {\r
224                                 y += yIncr;\r
225                                 if (p > 0)\r
226                                 {\r
227                                         this.mkDiv(x++, oy, 1, y-oy);\r
228                                         p += pru;\r
229                                         oy = y;\r
230                                 }\r
231                                 else p += pr;\r
232                         }\r
233                         this.mkDiv(x2, oy, 1, y2-oy+1);\r
234                 }\r
235         }\r
236 }\r
237 \r
238 \r
239 function mkLin2D(x1, y1, x2, y2)\r
240 {\r
241         if (x1 > x2)\r
242         {\r
243                 var _x2 = x2;\r
244                 var _y2 = y2;\r
245                 x2 = x1;\r
246                 y2 = y1;\r
247                 x1 = _x2;\r
248                 y1 = _y2;\r
249         }\r
250         var dx = x2-x1, dy = Math.abs(y2-y1),\r
251         x = x1, y = y1,\r
252         yIncr = (y1 > y2)? -1 : 1;\r
253 \r
254         var s = this.stroke;\r
255         if (dx >= dy)\r
256         {\r
257                 if (s-3 > 0)\r
258                 {\r
259                         var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;\r
260                         _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
261                 }\r
262                 else var _s = s;\r
263                 var ad = Math.ceil(s/2);\r
264 \r
265                 var pr = dy<<1,\r
266                 pru = pr - (dx<<1),\r
267                 p = pr-dx,\r
268                 ox = x;\r
269                 while ((dx--) > 0)\r
270                 {\r
271                         ++x;\r
272                         if (p > 0)\r
273                         {\r
274                                 this.mkDiv(ox, y, x-ox+ad, _s);\r
275                                 y += yIncr;\r
276                                 p += pru;\r
277                                 ox = x;\r
278                         }\r
279                         else p += pr;\r
280                 }\r
281                 this.mkDiv(ox, y, x2-ox+ad+1, _s);\r
282         }\r
283 \r
284         else\r
285         {\r
286                 if (s-3 > 0)\r
287                 {\r
288                         var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;\r
289                         _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;\r
290                 }\r
291                 else var _s = s;\r
292                 var ad = Math.round(s/2);\r
293 \r
294                 var pr = dx<<1,\r
295                 pru = pr - (dy<<1),\r
296                 p = pr-dy,\r
297                 oy = y;\r
298                 if (y2 <= y1)\r
299                 {\r
300                         ++ad;\r
301                         while ((dy--) > 0)\r
302                         {\r
303                                 if (p > 0)\r
304                                 {\r
305                                         this.mkDiv(x++, y, _s, oy-y+ad);\r
306                                         y += yIncr;\r
307                                         p += pru;\r
308                                         oy = y;\r
309                                 }\r
310                                 else\r
311                                 {\r
312                                         y += yIncr;\r
313                                         p += pr;\r
314                                 }\r
315                         }\r
316                         this.mkDiv(x2, y2, _s, oy-y2+ad);\r
317                 }\r
318                 else\r
319                 {\r
320                         while ((dy--) > 0)\r
321                         {\r
322                                 y += yIncr;\r
323                                 if (p > 0)\r
324                                 {\r
325                                         this.mkDiv(x++, oy, _s, y-oy+ad);\r
326                                         p += pru;\r
327                                         oy = y;\r
328                                 }\r
329                                 else p += pr;\r
330                         }\r
331                         this.mkDiv(x2, oy, _s, y2-oy+ad+1);\r
332                 }\r
333         }\r
334 }\r
335 \r
336 \r
337 function mkLinDott(x1, y1, x2, y2)\r
338 {\r
339         if (x1 > x2)\r
340         {\r
341                 var _x2 = x2;\r
342                 var _y2 = y2;\r
343                 x2 = x1;\r
344                 y2 = y1;\r
345                 x1 = _x2;\r
346                 y1 = _y2;\r
347         }\r
348         var dx = x2-x1, dy = Math.abs(y2-y1),\r
349         x = x1, y = y1,\r
350         yIncr = (y1 > y2)? -1 : 1,\r
351         drw = true;\r
352         if (dx >= dy)\r
353         {\r
354                 var pr = dy<<1,\r
355                 pru = pr - (dx<<1),\r
356                 p = pr-dx;\r
357                 while ((dx--) > 0)\r
358                 {\r
359                         if (drw) this.mkDiv(x, y, 1, 1);\r
360                         drw = !drw;\r
361                         if (p > 0)\r
362                         {\r
363                                 y += yIncr;\r
364                                 p += pru;\r
365                         }\r
366                         else p += pr;\r
367                         ++x;\r
368                 }\r
369                 if (drw) this.mkDiv(x, y, 1, 1);\r
370         }\r
371 \r
372         else\r
373         {\r
374                 var pr = dx<<1,\r
375                 pru = pr - (dy<<1),\r
376                 p = pr-dy;\r
377                 while ((dy--) > 0)\r
378                 {\r
379                         if (drw) this.mkDiv(x, y, 1, 1);\r
380                         drw = !drw;\r
381                         y += yIncr;\r
382                         if (p > 0)\r
383                         {\r
384                                 ++x;\r
385                                 p += pru;\r
386                         }\r
387                         else p += pr;\r
388                 }\r
389                 if (drw) this.mkDiv(x, y, 1, 1);\r
390         }\r
391 }\r
392 \r
393 \r
394 function mkOv(left, top, width, height)\r
395 {\r
396         var a = width>>1, b = height>>1,\r
397         wod = width&1, hod = (height&1)+1,\r
398         cx = left+a, cy = top+b,\r
399         x = 0, y = b,\r
400         ox = 0, oy = b,\r
401         aa = (a*a)<<1, bb = (b*b)<<1,\r
402         st = (aa>>1)*(1-(b<<1)) + bb,\r
403         tt = (bb>>1) - aa*((b<<1)-1),\r
404         w, h;\r
405         while (y > 0)\r
406         {\r
407                 if (st < 0)\r
408                 {\r
409                         st += bb*((x<<1)+3);\r
410                         tt += (bb<<1)*(++x);\r
411                 }\r
412                 else if (tt < 0)\r
413                 {\r
414                         st += bb*((x<<1)+3) - (aa<<1)*(y-1);\r
415                         tt += (bb<<1)*(++x) - aa*(((y--)<<1)-3);\r
416                         w = x-ox;\r
417                         h = oy-y;\r
418                         if (w&2 && h&2)\r
419                         {\r
420                                 this.mkOvQds(cx, cy, -x+2, ox+wod, -oy, oy-1+hod, 1, 1);\r
421                                 this.mkOvQds(cx, cy, -x+1, x-1+wod, -y-1, y+hod, 1, 1);\r
422                         }\r
423                         else this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, oy-h+hod, w, h);\r
424                         ox = x;\r
425                         oy = y;\r
426                 }\r
427                 else\r
428                 {\r
429                         tt -= aa*((y<<1)-3);\r
430                         st -= (aa<<1)*(--y);\r
431                 }\r
432         }\r
433         this.mkDiv(cx-a, cy-oy, a-ox+1, (oy<<1)+hod);\r
434         this.mkDiv(cx+ox+wod, cy-oy, a-ox+1, (oy<<1)+hod);\r
435 }\r
436 \r
437 \r
438 function mkOv2D(left, top, width, height)\r
439 {\r
440         var s = this.stroke;\r
441         width += s-1;\r
442         height += s-1;\r
443         var a = width>>1, b = height>>1,\r
444         wod = width&1, hod = (height&1)+1,\r
445         cx = left+a, cy = top+b,\r
446         x = 0, y = b,\r
447         aa = (a*a)<<1, bb = (b*b)<<1,\r
448         st = (aa>>1)*(1-(b<<1)) + bb,\r
449         tt = (bb>>1) - aa*((b<<1)-1);\r
450 \r
451         if (s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))\r
452         {\r
453                 var ox = 0, oy = b,\r
454                 w, h,\r
455                 pxl, pxr, pxt, pxb, pxw;\r
456                 while (y > 0)\r
457                 {\r
458                         if (st < 0)\r
459                         {\r
460                                 st += bb*((x<<1)+3);\r
461                                 tt += (bb<<1)*(++x);\r
462                         }\r
463                         else if (tt < 0)\r
464                         {\r
465                                 st += bb*((x<<1)+3) - (aa<<1)*(y-1);\r
466                                 tt += (bb<<1)*(++x) - aa*(((y--)<<1)-3);\r
467                                 w = x-ox;\r
468                                 h = oy-y;\r
469 \r
470                                 if (w-1)\r
471                                 {\r
472                                         pxw = w+1+(s&1);\r
473                                         h = s;\r
474                                 }\r
475                                 else if (h-1)\r
476                                 {\r
477                                         pxw = s;\r
478                                         h += 1+(s&1);\r
479                                 }\r
480                                 else pxw = h = s;\r
481                                 this.mkOvQds(cx, cy, -x+1, ox-pxw+w+wod, -oy, -h+oy+hod, pxw, h);\r
482                                 ox = x;\r
483                                 oy = y;\r
484                         }\r
485                         else\r
486                         {\r
487                                 tt -= aa*((y<<1)-3);\r
488                                 st -= (aa<<1)*(--y);\r
489                         }\r
490                 }\r
491                 this.mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);\r
492                 this.mkDiv(cx+a+wod-s+1, cy-oy, s, (oy<<1)+hod);\r
493         }\r
494 \r
495         else\r
496         {\r
497                 var _a = (width-((s-1)<<1))>>1,\r
498                 _b = (height-((s-1)<<1))>>1,\r
499                 _x = 0, _y = _b,\r
500                 _aa = (_a*_a)<<1, _bb = (_b*_b)<<1,\r
501                 _st = (_aa>>1)*(1-(_b<<1)) + _bb,\r
502                 _tt = (_bb>>1) - _aa*((_b<<1)-1),\r
503 \r
504                 pxl = new Array(),\r
505                 pxt = new Array(),\r
506                 _pxb = new Array();\r
507                 pxl[0] = 0;\r
508                 pxt[0] = b;\r
509                 _pxb[0] = _b-1;\r
510                 while (y > 0)\r
511                 {\r
512                         if (st < 0)\r
513                         {\r
514                                 st += bb*((x<<1)+3);\r
515                                 tt += (bb<<1)*(++x);\r
516                                 pxl[pxl.length] = x;\r
517                                 pxt[pxt.length] = y;\r
518                         }\r
519                         else if (tt < 0)\r
520                         {\r
521                                 st += bb*((x<<1)+3) - (aa<<1)*(y-1);\r
522                                 tt += (bb<<1)*(++x) - aa*(((y--)<<1)-3);\r
523                                 pxl[pxl.length] = x;\r
524                                 pxt[pxt.length] = y;\r
525                         }\r
526                         else\r
527                         {\r
528                                 tt -= aa*((y<<1)-3);\r
529                                 st -= (aa<<1)*(--y);\r
530                         }\r
531 \r
532                         if (_y > 0)\r
533                         {\r
534                                 if (_st < 0)\r
535                                 {\r
536                                         _st += _bb*((_x<<1)+3);\r
537                                         _tt += (_bb<<1)*(++_x);\r
538                                         _pxb[_pxb.length] = _y-1;\r
539                                 }\r
540                                 else if (_tt < 0)\r
541                                 {\r
542                                         _st += _bb*((_x<<1)+3) - (_aa<<1)*(_y-1);\r
543                                         _tt += (_bb<<1)*(++_x) - _aa*(((_y--)<<1)-3);\r
544                                         _pxb[_pxb.length] = _y-1;\r
545                                 }\r
546                                 else\r
547                                 {\r
548                                         _tt -= _aa*((_y<<1)-3);\r
549                                         _st -= (_aa<<1)*(--_y);\r
550                                         _pxb[_pxb.length-1]--;\r
551                                 }\r
552                         }\r
553                 }\r
554 \r
555                 var ox = 0, oy = b,\r
556                 _oy = _pxb[0],\r
557                 l = pxl.length,\r
558                 w, h;\r
559                 for (var i = 0; i < l; i++)\r
560                 {\r
561                         if (typeof _pxb[i] != "undefined")\r
562                         {\r
563                                 if (_pxb[i] < _oy || pxt[i] < oy)\r
564                                 {\r
565                                         x = pxl[i];\r
566                                         this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, _oy+hod, x-ox, oy-_oy);\r
567                                         ox = x;\r
568                                         oy = pxt[i];\r
569                                         _oy = _pxb[i];\r
570                                 }\r
571                         }\r
572                         else\r
573                         {\r
574                                 x = pxl[i];\r
575                                 this.mkDiv(cx-x+1, cy-oy, 1, (oy<<1)+hod);\r
576                                 this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
577                                 ox = x;\r
578                                 oy = pxt[i];\r
579                         }\r
580                 }\r
581                 this.mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);\r
582                 this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);\r
583         }\r
584 }\r
585 \r
586 \r
587 function mkOvDott(left, top, width, height)\r
588 {\r
589         var a = width>>1, b = height>>1,\r
590         wod = width&1, hod = height&1,\r
591         cx = left+a, cy = top+b,\r
592         x = 0, y = b,\r
593         aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,\r
594         st = (aa2>>1)*(1-(b<<1)) + bb,\r
595         tt = (bb>>1) - aa2*((b<<1)-1),\r
596         drw = true;\r
597         while (y > 0)\r
598         {\r
599                 if (st < 0)\r
600                 {\r
601                         st += bb*((x<<1)+3);\r
602                         tt += (bb<<1)*(++x);\r
603                 }\r
604                 else if (tt < 0)\r
605                 {\r
606                         st += bb*((x<<1)+3) - aa4*(y-1);\r
607                         tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-3);\r
608                 }\r
609                 else\r
610                 {\r
611                         tt -= aa2*((y<<1)-3);\r
612                         st -= aa4*(--y);\r
613                 }\r
614                 if (drw) this.mkOvQds(cx, cy, -x, x+wod, -y, y+hod, 1, 1);\r
615                 drw = !drw;\r
616         }\r
617 }\r
618 \r
619 \r
620 function mkRect(x, y, w, h)\r
621 {\r
622         var s = this.stroke;\r
623         this.mkDiv(x, y, w, s);\r
624         this.mkDiv(x+w, y, s, h);\r
625         this.mkDiv(x, y+h, w+s, s);\r
626         this.mkDiv(x, y+s, s, h-s);\r
627 }\r
628 \r
629 \r
630 function mkRectDott(x, y, w, h)\r
631 {\r
632         this.drawLine(x, y, x+w, y);\r
633         this.drawLine(x+w, y, x+w, y+h);\r
634         this.drawLine(x, y+h, x+w, y+h);\r
635         this.drawLine(x, y, x, y+h);\r
636 }\r
637 \r
638 \r
639 function jsgFont()\r
640 {\r
641         this.PLAIN = 'font-weight:normal;';\r
642         this.BOLD = 'font-weight:bold;';\r
643         this.ITALIC = 'font-style:italic;';\r
644         this.ITALIC_BOLD = this.ITALIC + this.BOLD;\r
645         this.BOLD_ITALIC = this.ITALIC_BOLD;\r
646 }\r
647 var Font = new jsgFont();\r
648 \r
649 \r
650 function jsgStroke()\r
651 {\r
652         this.DOTTED = -1;\r
653 }\r
654 var Stroke = new jsgStroke();\r
655 \r
656 \r
657 function jsGraphics(id, wnd)\r
658 {\r
659         this.setColor = new Function('arg', 'this.color = arg.toLowerCase();');\r
660 \r
661         this.setStroke = function(x)\r
662         {\r
663                 this.stroke = x;\r
664                 if (!(x+1))\r
665                 {\r
666                         this.drawLine = mkLinDott;\r
667                         this.mkOv = mkOvDott;\r
668                         this.drawRect = mkRectDott;\r
669                 }\r
670                 else if (x-1 > 0)\r
671                 {\r
672                         this.drawLine = mkLin2D;\r
673                         this.mkOv = mkOv2D;\r
674                         this.drawRect = mkRect;\r
675                 }\r
676                 else\r
677                 {\r
678                         this.drawLine = mkLin;\r
679                         this.mkOv = mkOv;\r
680                         this.drawRect = mkRect;\r
681                 }\r
682         };\r
683 \r
684 \r
685         this.setPrintable = function(arg)\r
686         {\r
687                 this.printable = arg;\r
688                 if (jg_fast)\r
689                 {\r
690                         this.mkDiv = mkDivIe;\r
691                         this.htmRpc = arg? htmPrtRpc : htmRpc;\r
692                 }\r
693                 else this.mkDiv = jg_n4? mkLyr : arg? mkDivPrt : mkDiv;\r
694         };\r
695 \r
696 \r
697         this.setFont = function(fam, sz, sty)\r
698         {\r
699                 this.ftFam = fam;\r
700                 this.ftSz = sz;\r
701                 this.ftSty = sty || Font.PLAIN;\r
702         };\r
703 \r
704 \r
705         this.drawPolyline = this.drawPolyLine = function(x, y, s)\r
706         {\r
707                 for (var i=0 ; i<x.length-1 ; i++ )\r
708                         this.drawLine(x[i], y[i], x[i+1], y[i+1]);\r
709         };\r
710 \r
711 \r
712         this.fillRect = function(x, y, w, h)\r
713         {\r
714                 this.mkDiv(x, y, w, h);\r
715         };\r
716 \r
717 \r
718         this.drawPolygon = function(x, y)\r
719         {\r
720                 this.drawPolyline(x, y);\r
721                 this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);\r
722         };\r
723 \r
724 \r
725         this.drawEllipse = this.drawOval = function(x, y, w, h)\r
726         {\r
727                 this.mkOv(x, y, w, h);\r
728         };\r
729 \r
730 \r
731         this.fillEllipse = this.fillOval = function(left, top, w, h)\r
732         {\r
733                 var a = (w -= 1)>>1, b = (h -= 1)>>1,\r
734                 wod = (w&1)+1, hod = (h&1)+1,\r
735                 cx = left+a, cy = top+b,\r
736                 x = 0, y = b,\r
737                 ox = 0, oy = b,\r
738                 aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,\r
739                 st = (aa2>>1)*(1-(b<<1)) + bb,\r
740                 tt = (bb>>1) - aa2*((b<<1)-1),\r
741                 pxl, dw, dh;\r
742                 if (w+1) while (y > 0)\r
743                 {\r
744                         if (st < 0)\r
745                         {\r
746                                 st += bb*((x<<1)+3);\r
747                                 tt += (bb<<1)*(++x);\r
748                         }\r
749                         else if (tt < 0)\r
750                         {\r
751                                 st += bb*((x<<1)+3) - aa4*(y-1);\r
752                                 pxl = cx-x;\r
753                                 dw = (x<<1)+wod;\r
754                                 tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-3);\r
755                                 dh = oy-y;\r
756                                 this.mkDiv(pxl, cy-oy, dw, dh);\r
757                                 this.mkDiv(pxl, cy+oy-dh+hod, dw, dh);\r
758                                 ox = x;\r
759                                 oy = y;\r
760                         }\r
761                         else\r
762                         {\r
763                                 tt -= aa2*((y<<1)-3);\r
764                                 st -= aa4*(--y);\r
765                         }\r
766                 }\r
767                 this.mkDiv(cx-a, cy-oy, w+1, (oy<<1)+hod);\r
768         };\r
769 \r
770 \r
771 \r
772 /* fillPolygon method, implemented by Matthieu Haller.\r
773 This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.\r
774 C source of GD 1.8.4 found at http://www.boutell.com/gd/\r
775 \r
776 THANKS to Kirsten Schulz for the polygon fixes!\r
777 \r
778 The intersection finding technique of this code could be improved\r
779 by remembering the previous intertersection, and by using the slope.\r
780 That could help to adjust intersections to produce a nice\r
781 interior_extrema. */\r
782         this.fillPolygon = function(array_x, array_y)\r
783         {\r
784                 var i;\r
785                 var y;\r
786                 var miny, maxy;\r
787                 var x1, y1;\r
788                 var x2, y2;\r
789                 var ind1, ind2;\r
790                 var ints;\r
791 \r
792                 var n = array_x.length;\r
793 \r
794                 if (!n) return;\r
795 \r
796 \r
797                 miny = array_y[0];\r
798                 maxy = array_y[0];\r
799                 for (i = 1; i < n; i++)\r
800                 {\r
801                         if (array_y[i] < miny)\r
802                                 miny = array_y[i];\r
803 \r
804                         if (array_y[i] > maxy)\r
805                                 maxy = array_y[i];\r
806                 }\r
807                 for (y = miny; y <= maxy; y++)\r
808                 {\r
809                         var polyInts = new Array();\r
810                         ints = 0;\r
811                         for (i = 0; i < n; i++)\r
812                         {\r
813                                 if (!i)\r
814                                 {\r
815                                         ind1 = n-1;\r
816                                         ind2 = 0;\r
817                                 }\r
818                                 else\r
819                                 {\r
820                                         ind1 = i-1;\r
821                                         ind2 = i;\r
822                                 }\r
823                                 y1 = array_y[ind1];\r
824                                 y2 = array_y[ind2];\r
825                                 if (y1 < y2)\r
826                                 {\r
827                                         x1 = array_x[ind1];\r
828                                         x2 = array_x[ind2];\r
829                                 }\r
830                                 else if (y1 > y2)\r
831                                 {\r
832                                         y2 = array_y[ind1];\r
833                                         y1 = array_y[ind2];\r
834                                         x2 = array_x[ind1];\r
835                                         x1 = array_x[ind2];\r
836                                 }\r
837                                 else continue;\r
838 \r
839                                  // modified 11. 2. 2004 Walter Zorn\r
840                                 if ((y >= y1) && (y < y2))\r
841                                         polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
842 \r
843                                 else if ((y == maxy) && (y > y1) && (y <= y2))\r
844                                         polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);\r
845                         }\r
846                         polyInts.sort(integer_compare);\r
847 \r
848                         for (i = 0; i < ints; i+=2)\r
849                         {\r
850                                 w = polyInts[i+1]-polyInts[i]\r
851                                 this.mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);\r
852                         }\r
853                 }\r
854         };\r
855 \r
856 \r
857         this.drawString = function(txt, x, y)\r
858         {\r
859                 this.htm += '<div style="position:absolute;white-space:nowrap;'+\r
860                         'left:' + x + 'px;'+\r
861                         'top:' + y + 'px;'+\r
862                         'font-family:' +  this.ftFam + ';'+\r
863                         'font-size:' + this.ftSz + ';'+\r
864                         'color:' + this.color + ';' + this.ftSty + '">'+\r
865                         txt +\r
866                         '<\/div>';\r
867         }\r
868 \r
869 \r
870         this.drawImage = function(imgSrc, x, y, w, h)\r
871         {\r
872                 this.htm += '<div style="position:absolute;'+\r
873                         'left:' + x + 'px;'+\r
874                         'top:' + y + 'px;'+\r
875                         'width:' +  w + ';'+\r
876                         'height:' + h + ';">'+\r
877                         '<img src="' + imgSrc + '" width="' + w + '" height="' + h + '">'+\r
878                         '<\/div>';\r
879         }\r
880 \r
881 \r
882         this.clear = function()\r
883         {\r
884                 this.htm = "";\r
885                 if (this.cnv) this.cnv.innerHTML = this.defhtm;\r
886         };\r
887 \r
888 \r
889         this.mkOvQds = function(cx, cy, xl, xr, yt, yb, w, h)\r
890         {\r
891                 this.mkDiv(xr+cx, yt+cy, w, h);\r
892                 this.mkDiv(xr+cx, yb+cy, w, h);\r
893                 this.mkDiv(xl+cx, yb+cy, w, h);\r
894                 this.mkDiv(xl+cx, yt+cy, w, h);\r
895         };\r
896 \r
897         this.setStroke(1);\r
898         this.setFont('verdana,geneva,helvetica,sans-serif', String.fromCharCode(0x31, 0x32, 0x70, 0x78), Font.PLAIN);\r
899         this.color = '#000000';\r
900         this.htm = '';\r
901         this.wnd = wnd || window;\r
902 \r
903         if (!(jg_ie || jg_dom || jg_ihtm)) chkDHTM();\r
904         if (typeof id != 'string' || !id) this.paint = pntDoc;\r
905         else\r
906         {\r
907                 this.cnv = document.all? (this.wnd.document.all[id] || null)\r
908                         : document.getElementById? (this.wnd.document.getElementById(id) || null)\r
909                         : null;\r
910                 this.defhtm = (this.cnv && this.cnv.innerHTML)? this.cnv.innerHTML : '';\r
911                 this.paint = jg_dom? pntCnvDom : jg_ie? pntCnvIe : jg_ihtm? pntCnvIhtm : pntCnv;\r
912         }\r
913 \r
914         this.setPrintable(false);\r
915 }\r
916 \r
917 \r
918 \r
919 function integer_compare(x,y)\r
920 {\r
921         return (x < y) ? -1 : ((x > y)*1);\r
922 }\r
923 \r