source: trunk/FACT++/www/smartfact/index.js@ 13719

Last change on this file since 13719 was 13716, checked in by tbretz, 13 years ago
Improved relating the rows in the table with the lines in the file.
File size: 38.9 KB
Line 
1var debug = false;
2
3var map = [ 393, 390, 391, 394, 1098, 395, 392, 389, 387, 388, 386,
41001, 1004, 1099, 1101, 1100, 1111, 1108, 286, 283, 377, 375, 376, 383,
5384, 999, 1002, 1005, 1007, 1102, 1104, 1103, 1114, 1113, 1110, 1107,
6285, 282, 280, 374, 372, 373, 380, 381, 382, 385, 1000, 1003, 1006,
7990, 992, 1105, 1089, 1106, 1126, 1125, 1115, 1112, 1109, 287, 284,
8281, 279, 277, 371, 369, 370, 413, 378, 379, 422, 425, 428, 431, 983,
9986, 991, 993, 995, 1090, 1092, 1091, 1129, 1128, 1127, 1138, 1135,
101150, 1147, 1144, 259, 256, 278, 276, 274, 368, 366, 367, 410, 411,
11412, 419, 420, 423, 426, 429, 981, 984, 987, 989, 994, 996, 998, 1093,
121095, 1094, 1132, 1131, 1130, 1141, 1140, 1137, 1134, 1149, 1146, 1143,
13258, 255, 253, 275, 273, 271, 365, 363, 364, 407, 408, 409, 416, 417,
14418, 421, 424, 427, 430, 982, 985, 988, 972, 974, 997, 1035, 1037,
151096, 1080, 1097, 1117, 1116, 1133, 1234, 1233, 1142, 1139, 1136, 1151,
161148, 1145, 260, 257, 254, 252, 268, 272, 270, 322, 362, 360, 361, 404,
17405, 406, 521, 414, 415, 512, 533, 536, 539, 920, 923, 926, 911, 914,
18973, 975, 977, 1036, 1038, 1040, 1081, 1083, 1082, 1120, 1119, 1118,
191237, 1236, 1235, 1228, 1225, 1258, 1255, 1252, 205, 202, 199, 196,
20193, 269, 267, 265, 323, 321, 319, 359, 357, 358, 401, 402, 403, 518,
21519, 520, 509, 510, 531, 534, 537, 918, 921, 924, 909, 912, 915, 917,
22976, 978, 980, 1039, 1041, 1043, 1084, 1086, 1085, 1123, 1122, 1121,
231240, 1239, 1238, 1231, 1230, 1227, 1224, 1257, 1254, 1251, 204, 201,
24198, 195, 192, 190, 266, 264, 262, 320, 318, 316, 356, 354, 355, 398,
25399, 400, 515, 516, 517, 506, 507, 508, 511, 532, 535, 538, 919, 922,
26925, 910, 913, 916, 900, 902, 979, 963, 965, 1042, 1026, 1028, 1087,
271071, 1088, 1180, 1179, 1124, 1216, 1215, 1241, 1288, 1287, 1232, 1229,
281226, 1259, 1256, 1253, 206, 203, 200, 197, 194, 191, 189, 187, 263,
29261, 250, 317, 315, 313, 353, 351, 352, 467, 396, 397, 503, 513, 514,
30575, 504, 505, 611, 524, 527, 530, 929, 932, 935, 848, 851, 854, 821,
31824, 901, 903, 905, 964, 966, 968, 1027, 1029, 1031, 1072, 1074, 1073,
321183, 1182, 1181, 1219, 1218, 1217, 1291, 1290, 1289, 1327, 1324, 1249,
331246, 1243, 214, 211, 208, 142, 139, 136, 106, 103, 188, 186, 184, 251,
34249, 247, 314, 312, 310, 350, 348, 349, 464, 465, 466, 500, 501, 502,
35572, 573, 574, 608, 609, 522, 525, 528, 927, 930, 933, 846, 849, 852,
36819, 822, 825, 827, 904, 906, 908, 967, 969, 971, 1030, 1032, 1034,
371075, 1077, 1076, 1186, 1185, 1184, 1222, 1221, 1220, 1294, 1293, 1292,
381330, 1329, 1326, 1323, 1248, 1245, 1242, 213, 210, 207, 141, 138, 135,
39105, 102, 100, 185, 183, 181, 248, 246, 244, 311, 309, 307, 347, 345,
40346, 461, 462, 463, 497, 498, 499, 569, 570, 571, 605, 606, 607, 610,
41523, 526, 529, 928, 931, 934, 847, 850, 853, 820, 823, 826, 810, 812,
42907, 891, 893, 970, 954, 956, 1033, 1017, 1019, 1078, 1062, 1079, 1171,
431170, 1187, 1207, 1206, 1223, 1279, 1278, 1295, 1315, 1314, 1331, 1328,
441325, 1250, 1247, 1244, 215, 212, 209, 143, 140, 137, 107, 104, 101,
4599, 97, 182, 180, 178, 245, 243, 241, 308, 306, 304, 344, 342, 343,
46458, 459, 460, 494, 495, 496, 566, 567, 568, 602, 603, 604, 647, 650,
47653, 656, 659, 662, 665, 857, 860, 863, 839, 842, 845, 830, 833, 811,
48813, 815, 892, 894, 896, 955, 957, 959, 1018, 1020, 1022, 1063, 1065,
491064, 1174, 1173, 1172, 1210, 1209, 1208, 1282, 1281, 1280, 1318, 1317,
501316, 1363, 1360, 1375, 1372, 1369, 1384, 1381, 1378, 133, 130, 127,
51124, 121, 118, 115, 112, 98, 96, 94, 179, 177, 175, 242, 240, 238, 305,
52303, 301, 332, 330, 331, 455, 456, 457, 491, 492, 493, 563, 564, 565,
53599, 600, 601, 644, 645, 648, 651, 654, 657, 660, 663, 855, 858, 861,
54837, 840, 843, 828, 831, 834, 836, 814, 816, 818, 895, 897, 899, 958,
55960, 962, 1021, 1023, 1025, 1066, 1068, 1067, 1177, 1176, 1175, 1213,
561212, 1211, 1285, 1284, 1283, 1321, 1320, 1319, 1366, 1365, 1362, 1359,
571374, 1371, 1368, 1383, 1380, 1377, 132, 129, 126, 123, 120, 117, 114,
58111, 109, 95, 93, 91, 176, 174, 172, 239, 237, 235, 302, 300, 298, 329,
59327, 328, 452, 453, 454, 488, 489, 490, 560, 561, 562, 596, 597, 598,
60641, 642, 643, 646, 649, 652, 655, 658, 661, 664, 856, 859, 862, 838,
61841, 844, 829, 832, 835, 756, 758, 817, 792, 794, 898, 882, 884, 961,
62945, 947, 1024, 1008, 1010, 1069, 1044, 1070, 1162, 1161, 1178, 1198,
631197, 1214, 1270, 1269, 1286, 1306, 1305, 1322, 1342, 1341, 1367, 1364,
641361, 1376, 1373, 1370, 1385, 1382, 1379, 134, 131, 128, 125, 122, 119,
65116, 113, 110, 108, 43, 92, 90, 79, 173, 171, 169, 236, 234, 232, 299,
66297, 295, 326, 324, 325, 449, 450, 451, 485, 486, 487, 557, 558, 559,
67593, 594, 595, 629, 639, 640, 638, 695, 698, 701, 668, 671, 674, 677,
68680, 683, 749, 752, 755, 740, 743, 746, 775, 777, 757, 759, 761, 793,
69795, 797, 883, 885, 887, 946, 948, 950, 1009, 1011, 1013, 1045, 1047,
701046, 1165, 1164, 1163, 1201, 1200, 1199, 1273, 1272, 1271, 1309, 1308,
711307, 1345, 1344, 1343, 1353, 1351, 1420, 1417, 1414, 1393, 1390, 1387,
721402, 1399, 1396, 34, 31, 28, 25, 22, 19, 62, 60, 44, 42, 40, 80, 78,
7376, 170, 168, 166, 233, 231, 229, 296, 294, 292, 341, 339, 340, 446,
74447, 448, 482, 483, 484, 554, 555, 556, 590, 591, 592, 626, 627, 628,
75636, 637, 693, 696, 699, 666, 669, 672, 675, 678, 681, 747, 750, 753,
76738, 741, 744, 774, 776, 778, 779, 760, 762, 764, 796, 798, 800, 886,
77888, 890, 949, 951, 953, 1012, 1014, 1016, 1054, 1057, 1048, 1168,
781167, 1166, 1204, 1203, 1202, 1276, 1275, 1274, 1312, 1311, 1310, 1348,
791347, 1346, 1355, 1354, 1352, 1350, 1419, 1416, 1413, 1392, 1389, 1386,
801401, 1398, 1395, 33, 30, 27, 24, 21, 18, 61, 59, 58, 41, 39, 37, 77,
8175, 73, 167, 165, 163, 230, 228, 226, 293, 291, 289, 338, 336, 337,
82443, 444, 445, 479, 480, 481, 551, 552, 553, 587, 588, 589, 623, 624,
83625, 634, 635, 684, 687, 694, 697, 700, 667, 670, 673, 676, 679, 682,
84748, 751, 754, 739, 742, 745, 787, 789, 791, 780, 765, 763, 769, 770,
85799, 801, 803, 889, 875, 864, 952, 936, 938, 1015, 1053, 1055, 1058,
861061, 1059, 1050, 1049, 1169, 1153, 1152, 1205, 1188, 1260, 1277, 1297,
871296, 1313, 1337, 1336, 1349, 1332, 1356, 1412, 1410, 1408, 1421, 1418,
881415, 1394, 1391, 1388, 1403, 1400, 1397, 35, 32, 29, 26, 23, 20, 65,
8963, 56, 55, 53, 38, 36, 48, 74, 72, 161, 164, 162, 152, 227, 225, 224,
90290, 288, 219, 335, 333, 334, 435, 441, 442, 440, 477, 478, 476, 549,
91550, 548, 585, 586, 615, 621, 622, 620, 631, 632, 633, 685, 688, 691,
92709, 706, 703, 718, 715, 712, 736, 733, 730, 727, 724, 721, 783, 785,
93788, 790, 781, 782, 766, 767, 771, 773, 802, 804, 873, 874, 865, 866,
94937, 939, 940, 942, 1056, 1060, 1052, 1051, 1157, 1156, 1155, 1154,
951190, 1189, 1262, 1261, 1299, 1298, 1339, 1338, 1334, 1333, 1358, 1357,
961411, 1409, 1406, 1404, 1424, 1427, 1430, 1433, 1436, 1439, 11, 14, 17,
972, 5, 8, 69, 67, 64, 57, 54, 52, 51, 50, 47, 89, 88, 84, 160, 159, 151,
98150, 148, 223, 222, 221, 218, 216, 433, 434, 437, 438, 439, 473, 474,
99475, 546, 547, 579, 583, 584, 614, 617, 618, 619, 630, 686, 689, 692,
100708, 705, 702, 717, 714, 711, 735, 732, 729, 726, 723, 720, 784, 786,
101768, 772, 805, 806, 808, 880, 877, 876, 867, 869, 871, 941, 943, 944,
1021160, 1159, 1158, 1194, 1192, 1191, 1263, 1265, 1264, 1302, 1301, 1300,
1031340, 1335, 1407, 1405, 1422, 1425, 1428, 1431, 1434, 1437, 9, 12, 15,
1040, 3, 6, 71, 68, 66, 49, 46, 45, 87, 83, 82, 158, 156, 149, 147, 146,
105144, 220, 217, 432, 436, 469, 470, 471, 472, 543, 545, 577, 578, 582,
106612, 613, 616, 710, 707, 704, 719, 716, 713, 737, 734, 731, 728, 725,
107722, 807, 809, 878, 879, 881, 868, 870, 872, 1196, 1195, 1193, 1268,
1081267, 1266, 1304, 1303, 1423, 1426, 1429, 1432, 1435, 1438, 10, 13, 16,
1091, 4, 7, 86, 85, 81, 157, 155, 154, 153, 145, 468, 540, 541, 542, 544,
110576, 580, 581, 70, 690 ];
111
112/*
113
114<a href="#" onMouseover="playsound(soundfile)">Example 1</a>
115<a href="#" onMouseover="playsound('different.wav')">Example 2</a>
116
117<div id="coolmenu" onMouseover="bindsound('A', soundfile, this)">
118
119<script type="text/javascript">
120
121//
122// JavaScript Sound effect- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
123// Visit http://www.dynamicDrive.com for hundreds of DHTML scripts
124// This notice must stay intact for legal use
125//
126
127var soundfile="sidebar.wav" //path to sound file, or pass in filename directly into playsound()
128
129function playsound(soundfile){
130if (document.all && document.getElementById){
131document.getElementById("soundeffect").src="" //reset first in case of problems
132document.getElementById("soundeffect").src=soundfile
133}
134}
135
136function bindsound(tag, soundfile, masterElement){
137if (!window.event) return
138var source=event.srcElement
139while (source!=masterElement && source.tagName!="HTML"){
140if (source.tagName==tag.toUpperCase()){
141playsound(soundfile)
142break
143}
144source=source.parentElement
145}
146}
147
148</script>
149
150Function "bindsound()" accepts 3 parameters- 1) The tag name of the element to bind the sound to ("A" for <a>, "SPAN" for <span> etc), 2) the sound file to play, whether a variable or path to sound file, and finally, 3), the keyword "this", which should never be modified.
151
152// -----------------------
153<audio controls="controls" height="50px" width="100px">
154 <source src="song.mp3" type="audio/mpeg" />
155 <source src="song.ogg" type="audio/ogg" />
156<embed height="50px" width="100px" src="song.mp3" />
157</audio>
158// ------------------------
159
160*/
161function $(id) { return document.getElementById(id); }
162function trim(str) { return str.replace("/^\s\s*/", '').replace("/\s\s*$/", ''); }
163function valid(str) { if (str==undefined) return false; if (str.length==0) return false; return true;}
164function isSliding() { var z = $("body").getAttribute("data-visible"); return $("table"+z).offsetLeft!=0; }
165
166function cycleCol(el)
167{
168 var col = el.getAttribute("data-color");
169 col++;
170 col %= 31;
171 el.setAttribute("data-color", col);
172 if (col>16)
173 col = 31-col;
174 var hex = col.toString(16);
175 el.style.color = "#"+hex+"0"+hex+"0"+hex+"f";
176}
177
178/*
179function newWindow(newContent)
180{
181 if (document.referrer != "http://www.referringPageName.html")
182 return;
183
184 winContent = window.open(newContent,
185 'nextWin',
186 'right=0,top=20,width=350,height=350,toolbar=no,scrollbars=no,resizable=no');
187 }*/
188
189function onload()
190{
191 try { new XMLHttpRequest(); }
192 catch(e)
193 {
194 alert("Your browser doesn't support dynamic reload.");
195 return;
196 }
197
198 var name = location.hash.length==0 ? "fact" : location.hash.substr(1);
199
200 var args = location.search.substr(1).split('&');
201
202 for (var i=0; i<args.length; i++)
203 {
204 var entry = args[i].split('=');
205 if (entry.length!=2)
206 continue;
207
208 switch (entry[0])
209 {
210 case "w": $("body").setAttribute("data-width", entry[1]); break;
211 case "h": $("body").setAttribute("data-height", entry[1]); break;
212 }
213 }
214
215
216 /*
217 alert("0 -- "+navigator.appCodeName+"\n"+
218 "1 -- "+navigator.appName+"\n"+
219 "2 -- "+navigator.appVersion+"\n"+
220 "3 -- "+navigator.platform+"\n"+
221 "4 -- "+navigator.userAgent);
222 */
223 loadPage(name, 0, 0);
224}
225
226function onresize()
227{
228 var z = $("body").getAttribute("data-visible");
229 doresize(z);
230}
231
232function loadPage(name, z, dz)
233{
234 var xmlPage = new XMLHttpRequest();
235 xmlPage.open('POST', "struct/"+name+'.table', true);
236 xmlPage.onload = function ()
237 {
238 if (xmlPage.status!=200)
239 {
240 alert("ERROR[0] - HTTP request '"+name+".table': "+xmlPage.statusText+" ["+xmlPage.status+"]");
241 //setTimeout("loadPage('+name+')", 5000);
242 /****** invalidate ******/
243 return;
244 }
245
246 buildPage(name, xmlPage.responseText, z, dz);
247 changePage(z, z+dz);
248
249 //changePage(name, xmlHttp.resposeText);
250 //slideOut(name, xmlHttp.responseText);
251 //displayPage(name, xmlHttp.responseText);
252 //onresize(true);
253 };
254
255 xmlPage.send(null);
256
257 location.hash = name;
258}
259
260function sendCommand(command, debug)
261{
262 var uri = "index.php?";
263 if (debug==true)
264 uri += "debug&";
265 uri += command;
266
267 var xmlCmd = new XMLHttpRequest();
268 xmlCmd.open('POST', uri, true);
269 xmlCmd.onload = function()
270 {
271 if (xmlCmd.status!=200)
272 {
273 alert("ERROR[1] - HTTP request: "+xmlCmd.statusText+" ["+xmlCmd.status+"]");
274 return;
275 }
276
277 if (xmlCmd.responseText.length==0)
278 {
279 alert("No proper acknowledgment of command execution received.");
280 return;
281 }
282
283 var txt = xmlCmd.responseText.split('\n');
284 switch (txt[0])
285 {
286 case "1": alert("dimctrl unreachable."); break;
287 case "2": /*success*/ break;
288 default: alert("Return code '"+txt[0]+"' unknown."); break;
289 }
290 if (txt.length>1)
291 alert(xmlCmd.responseText);
292 };
293 xmlCmd.send(null);
294}
295
296
297function submit(script)
298{
299 var inputs = document.getElementsByTagName("input");
300
301 var args = "start="+script;
302 for (var i=0; i<inputs.length; i++)
303 args += "&"+inputs[i].name+"="+inputs[i].value;
304
305 alert(args);
306
307 sendCommand(args);
308
309}
310
311function buildPage(name, text, oldz, dz)
312{
313 var fname = dz==0 ? "fact" : $("table"+oldz).getAttribute("data-file");
314
315 var z = oldz + dz;
316
317 var lines = text.split('\n');
318
319 if (lines.length==0)
320 {
321 alert("buildPage - received data empty.");
322 return;
323 }
324
325 if (lines[0].length==0)
326 {
327 alert("buildPage - title missing");
328 return;
329 }
330
331 var title = lines[0].split('/');
332
333 var table = $("table"+z);
334 if (table != undefined)
335 $("body").removeChild(table);
336
337 table = document.createElement("table");
338 table.setAttribute("class", "tborder");
339 table.id = "table"+z;
340 table.border = 0;
341 table.cellSpacing = 0;
342 table.cellPadding = "0px";
343 /*table.width = "100%";*/
344 table.setAttribute("style", "overflow:hidden;position:fixed;top:0px;left:"+window.innerWidth+"px;");
345
346 // -----------------------------------------------------
347
348 var th = document.createElement("thead");
349 th.colSpan = 3;
350 th.width = "100%";
351 table.appendChild(th);
352
353 var htr = document.createElement("tr");
354 th.appendChild(htr);
355
356 var htd = document.createElement("td");
357 htd.setAttribute("class", "thead");
358 htd.colSpan = 3;
359 htd.width = "100%";
360 htr.appendChild(htd);
361
362 // -------------
363
364 var htab = document.createElement("table");
365 htab.width = "100%";
366 htd.appendChild(htab);
367
368 var hhtr = document.createElement("tr");
369 htab.appendChild(hhtr);
370
371 var htd0 = document.createElement("td");
372 var htd1 = document.createElement("td");
373 var htd2 = document.createElement("td");
374 var htd3 = document.createElement("td");
375 htd0.setAttribute("class", "tcell1");
376 htd1.setAttribute("class", "tcell2");
377 htd2.setAttribute("class", "tcell1");
378 htd2.setAttribute("width", "1px");
379 htd3.setAttribute("class", "tcell1");
380 htd3.setAttribute("width", "1px");
381 hhtr.appendChild(htd3);
382 hhtr.appendChild(htd0);
383 hhtr.appendChild(htd1);
384 hhtr.appendChild(htd2);
385
386 var div1 = document.createElement("div");
387 var div2 = document.createElement("div");
388 var div3 = document.createElement("div");
389 div2.setAttribute("class", "icon_white");
390 div3.setAttribute("class", "icon_white");
391 div2.setAttribute("style", "background-position:-396px 50%;");
392 div3.setAttribute("style", "background-position:-575px 50%;");
393 div3.onclick = function() { this.style.backgroundColor='rgba(0,0,0,0.77)'; loadPage('fact', z, -z); }
394 div2.onclick = function() { this.style.backgroundColor='rgba(0,0,0,0.77)'; loadPage(fname, z, -dz); }
395
396 var sp0 = document.createElement("span");
397 var sp1 = document.createElement("span");
398 var sp2 = document.createElement("span");
399 sp0.id = "ldot" +z;
400 sp1.id = "title"+z;
401 sp2.id = "rdot" +z;
402 sp1.setAttribute("style", "font-size:large;");
403 sp0.setAttribute("data-color", "3");
404 sp2.setAttribute("data-color", "3");
405 sp0.appendChild(document.createTextNode(" \u2022 "));
406 sp1.appendChild(document.createTextNode(title[0]));
407 sp2.appendChild(document.createTextNode(" \u2022 "));
408 if (title[1]!=undefined)
409 sp1.onclick = function() { submit(title[1]); }
410
411 div1.setAttribute("style", "font-size:small;");
412 div1.id = "reporttime"+z;
413 div1.appendChild(document.createTextNode("---"));
414
415 htd0.appendChild(sp0);
416 htd0.appendChild(sp1);
417 htd0.appendChild(sp2);
418
419 htd1.appendChild(div1);
420 if (dz!=0/* && z+dz!=0*/)
421 htd2.appendChild(div2); // back
422 if (lines[0]!="FACT")
423 htd3.appendChild(div3); // home
424
425 // -----------------------------------------------------
426
427 var tbody = document.createElement("tbody");
428 table.appendChild(tbody);
429
430 // -----------------------------------------------------
431
432 var tf = document.createElement("tfoot");
433 table.appendChild(tf);
434
435 var ftr = document.createElement("tr");
436 tf.appendChild(ftr);
437
438 var ftd = document.createElement("td");
439 ftd.setAttribute("class", "tfoot");
440 ftd.width = "100%";
441 ftd.colSpan = 3;
442 ftr.appendChild(ftd);
443
444 var ftab = document.createElement("table");
445 ftab.width = "100%";
446 ftd.appendChild(ftab);
447
448 var ftd0 = document.createElement("td");
449 var ftd1 = document.createElement("td");
450
451 ftd0.setAttribute("class", "tcell1");
452 ftd1.setAttribute("class", "tcell2");
453
454 ftab.appendChild(ftd0);
455 ftab.appendChild(ftd1);
456
457 var fdiv0 = document.createElement("span");
458 var fdiv1 = document.createElement("span");
459
460 fdiv0.setAttribute("style", "font-size:large;");
461 fdiv1.setAttribute("style", "font-size:small;");
462 fdiv1.id = "localtime"+z;
463
464 fdiv0.appendChild(document.createTextNode("logbook"));
465 fdiv1.appendChild(document.createTextNode("loading..."));
466
467 ftd0.appendChild(fdiv0);
468 ftd1.appendChild(fdiv1);
469
470 $("body").appendChild(table);
471
472 var counter = 1;
473 for (var i=1; i<lines.length; i++)
474 {
475 lines[i] = trim(lines[i]);
476
477 if (lines[i].length==0 || lines[i][0] == '#')
478 continue;
479
480 var cols = lines[i].split(':');
481 if (cols.length != 3 && cols.length !=4)
482 {
483 alert("Wrong number of columns in line #"+i+" in '"+name+"': '"+lines[i]+"' N(cols)="+cols.length);
484 continue;
485 }
486
487 var check = cols[1].split("=");
488
489 if (check.length>1 && (check[0]=="camera" || check[0]=="hist"))
490 {
491 var data = cols[1].substring(check[0].length+1).split("/");
492
493 var tr = document.createElement("tr");
494 tr.setAttribute("class", "row");
495 //tr.setAttribute("style", "margin:0;padding:0;");
496
497 var td = document.createElement("td");
498 td.setAttribute("class", "container");
499 td.id = "container";
500 td.colSpan = 3;
501 tr.appendChild(td);
502
503 var canv = document.createElement("canvas");
504 canv.id = "canvas"+z;
505 canv.width = "1";
506 canv.height = "1";
507 //canv.onclick = function() { save(); }
508 canv.setAttribute("data-type", check[0]);
509 canv.setAttribute("data-file", data[0]);
510 canv.setAttribute("data-data", cols[1].substring(check[0].length+data[0].length+2));
511// canv.setAttribute("style", "display:none;");
512 td.appendChild(canv);
513
514 var img = document.createElement("img");
515 img.src = "img/dummy.png";//needed in firefox
516 img.id = "image"+z;
517 img.setAttribute("style", "width:1px;height:1px;display:none;");
518 td.appendChild(img);
519
520 tbody.appendChild(tr);
521 continue;
522 }
523
524 var tr = document.createElement("tr");
525 tr.setAttribute("class", "row");
526 if (valid(cols[0]))
527 tr.setAttribute("onclick", "this.style.background='#ccb'; loadPage('"+cols[0]+"', "+z+", -1);");
528 if (valid(cols[3]))
529 tr.setAttribute("onclick", "this.style.background='#ccb'; loadPage('"+cols[3]+"', "+z+", +1);");
530
531 var td0 = document.createElement("td");
532 td0.setAttribute("class", "tcol0");
533 tr.appendChild(td0);
534
535 if (check.length>0 && check[0]=="image")
536 {
537 var img = document.createElement("img");
538 img.style.width="100%";
539 img.src = check[1];
540 td0.style.paddingLeft=0;
541 td0.style.border=0;
542 td0.colSpan=3;
543 td0.appendChild(img);
544
545 tbody.appendChild(tr);
546 continue;
547 }
548
549 if (valid(cols[0]))
550 {
551 var sp = document.createElement("div");
552 sp.setAttribute("class", "icon_black");
553 sp.setAttribute("style", "background-position: -144px 50%;");
554 td0.appendChild(sp);
555 }
556
557 var td1 = document.createElement("td");
558 td1.setAttribute("class", "tcol1");
559 td1.width = "100%";
560 tr.appendChild(td1);
561
562 var td2 = document.createElement("td");
563 td2.setAttribute("class", "tcol2");
564 td2.width = "18px";
565 if (valid(cols[3]))
566 {
567 var sp = document.createElement("div");
568 sp.setAttribute("class", "icon_black");
569 sp.setAttribute("style", "background-position: -108px 50%;");
570 td2.appendChild(sp);
571 }
572 tr.appendChild(td2);
573
574 var tab = document.createElement("table");
575 tab.width = "100%";
576 td1.appendChild(tab);
577
578 var innertr = document.createElement("tr");
579 tab.appendChild(innertr);
580
581 var cell1 = document.createElement("td");
582 cell1.setAttribute("class", "tcell1");
583
584 var cell2 = document.createElement("td");
585 cell2.setAttribute("class", "tcell2");
586
587 if (check.length==0 || check[0]!="input")
588 {
589 cell1.appendChild(document.createTextNode(cols[1]));
590
591 if (cols.length>2 && cols[2].length>0)
592 {
593 cell2.id = "data"+z+"-"+counter;
594 cell2.setAttribute("data-form", cols[2]);
595 cell2.appendChild(document.createTextNode("---"));
596 counter++;
597 }
598 else
599 cell1.setAttribute("class", "description");
600 }
601 else
602 {
603 var opt = check[1].split('/');
604
605 if (opt.length<2)
606 alert("Argument name missing for'"+check[1]+"'");
607
608 cell1.appendChild(document.createTextNode(opt[0]));
609
610 var input = document.createElement("input");
611 input.name = opt[1];
612 input.type = "text";
613 input.maxlength = 80;
614 if (opt.length>2)
615 input.value=opt[2];
616
617 cell2.appendChild(input);
618 }
619
620 innertr.appendChild(cell1);
621 innertr.appendChild(cell2);
622
623 tbody.appendChild(tr);
624 }
625/*
626 if (true)
627 {
628 tr = document.createElement("tr");
629 tr.setAttribute("class", "row");
630
631 td = document.createElement("td");
632 td.colSpan = "3";
633 tr.appendChild(td);
634
635 var sp = document.createElement("div");
636 sp.setAttribute("class", "icon_color");
637 sp.setAttribute("style", "background-position: -144px -14px;");
638 td.appendChild(sp);
639
640 sp = document.createElement("div");
641 sp.setAttribute("class", "icon_color");
642 sp.setAttribute("style", "background-position: -56px -14px;");
643 td.appendChild(sp);
644
645 tr.appendChild(td);
646
647 tbody.appendChild(tr);
648 }
649*/
650 // ---------------------------------------
651 if (debug == true)
652 {
653 tr = document.createElement("tr");
654 tr.setAttribute("class", "row");
655
656 td = document.createElement("td");
657 td.id = "debug"+z;
658 td.colSpan = 3;
659 tr.appendChild(td);
660
661 tbody.appendChild(tr);
662 }
663
664 // ---------------------------------------
665
666 table.setAttribute("data-file", name);
667 doresize(z);
668}
669
670function resizeimpl(z, cnt)
671{
672 // 393 / 482 488/482 / 200 200+482-488
673 var img = $("image"+z);
674 var canv = $("canvas"+z);
675 if (img == undefined || canv == undefined)
676 return;
677
678 var h = $("table"+z).offsetHeight;
679 if (h == 0)
680 return;
681
682 var fixedw = $("body").getAttribute("data-width");
683 var fixedh = $("body").getAttribute("data-height");
684
685 var W = fixedw>0 ? fixedw : window.innerWidth;
686 var H = fixedh>0 ? fixedh : window.innerHeight;
687
688 $("table"+z).style.width = W+"px";
689
690/*
691 if (W==0 || H==0)
692 {
693 var w = $("table"+z).offsetWidth;
694 img.style.width = w+"px";
695 img.style.height= w+"px";
696
697 canv.width = w;
698 canv.height = w;
699 return;
700 }
701*/
702
703 var ih = H - h + parseInt(img.style.height, 10);
704
705 img.style.width = W +"px";
706 img.style.height= ih+"px";
707
708 canv.width = W;
709 canv.height = ih;
710
711 // ------ debug -----
712 if (debug == true)
713 {
714 $('debug'+z).innerHTML = "";
715 $('debug'+z).innerHTML += "|W="+W +"/"+H;
716 $('debug'+z).innerHTML += "|H="+h+"/"+$("table"+z).offsetHeight+"/"+img.offsetHeight;
717 $('debug'+z).innerHTML += "|I="+img.style.height+"+"+H+"-"+h;
718 }
719
720 if ($("table"+z).offsetHeight == H || cnt==2)
721 return;
722
723 resizeimpl(z, ++cnt);
724}
725
726function doresize(z)
727{
728 resizeimpl(z, 0);
729}
730
731var intervalSlide = null;
732
733function changePage(oldz, newz)
734{
735 // No page displayed yet
736 if (oldz==newz)
737 {
738 $("table"+newz).style.left="0px";
739 $("body").setAttribute("data-visible", newz);
740
741 doresize(0);
742
743 //setInterval(refresh_text, 1000);
744 //setInterval(refresh_graphics, 5000);
745
746 refresh_text();
747 refresh_graphics();
748 return;
749 }
750
751 var W = window.innerWidth;
752 if (W==0)
753 {
754 $("table"+newz).style.left="0px";
755 $("body").setAttribute("data-visible", newz);
756 $("body").removeChild($("table"+oldz));
757 return;
758 }
759
760 if (newz>oldz)
761 $("table"+newz).style.left = W+"px";
762 else
763 $("table"+newz).style.left = (-W-1)+"px";
764
765 //window.clearTimeout(timeoutText);
766 //window.clearTimeout(timeoutGraphics);
767
768 $("body").setAttribute("data-visible", newz);
769 intervalSlide = setInterval(function(){doShift(oldz,newz)}, 75);
770}
771
772function doShift(oldz, newz)
773{
774 var t0 = $("table"+oldz);
775 var t1 = $("table"+newz);
776
777 if (t0.style.display=="none")
778 {
779 clearInterval(intervalSlide);
780 $("body").removeChild(t0);
781 return;
782 }
783
784 var x0 = t0.offsetLeft;
785 var x1 = t1.offsetLeft;
786
787 var W = window.innerWidth;
788
789 if (newz<oldz)
790 {
791 x0 += W/5;
792 x1 += W/5;
793 }
794
795 if (newz>oldz)
796 {
797 x0 -= W/5;
798 x1 -= W/5;
799 }
800
801 if ((newz<oldz && x1>=0) || (newz>oldz && x1<=0))
802 {
803 t0.style.display="none";
804 x1 = 0;
805 }
806
807 t0.style.left = x0+"px";
808 t1.style.left = x1+"px";
809}
810
811var timeoutText = null;
812var timeoutGraphics = null;
813
814function refresh_text()
815{
816 var z=$("body").getAttribute("data-visible");
817 var table = $("table"+z);
818
819 // Is sliding or no file defined?
820 var fname = table.getAttribute("data-file");
821 if (isSliding() || !valid(fname))
822 {
823 // invalidate?
824 timeoutText = setTimeout(refresh_text, 1000);
825 return;
826 }
827
828 var xmlText = new XMLHttpRequest();
829 xmlText.open('POST', "data/"+fname+'.txt', true);
830 xmlText.onload = function ()
831 {
832 if (xmlText.status!=200)
833 {
834 alert("ERROR[1] - HTTP request '"+fname+".txt': "+xmlText.statusText+" ["+xmlText.status+"]");
835 timeoutText = setTimeout(refresh_text, 10000);
836 return;
837 }
838
839 if (!isSliding())
840 {
841 cycleCol($("ldot"+z));
842 update_text(fname, xmlText.responseText);
843 }
844 timeoutText = setTimeout(refresh_text, 3000);
845 };
846 xmlText.send(null);
847}
848
849function strike(e, status)
850{
851 if (!e)
852 return;
853
854 if (!status)
855 e.style.textDecoration="line-through";
856 else
857 e.style.textDecoration="";
858}
859
860/*
861function gray(id, str)
862{
863 var e = $(id);
864 if (!e)
865 return;
866
867 if (valid(str))
868 {
869 e.style.color="#000";
870 e.style.textDecoration="";
871 }
872 else
873 {
874 e.style.color="#daa";
875 e.style.textDecoration="line-through";
876 }
877}
878*/
879var date0 = null;
880
881function update_text(fname, result)
882{
883 var z=$("body").getAttribute("data-visible");
884 var table = $("table"+z);
885
886 if (table.getAttribute("data-file") != fname)
887 return;
888
889 var tokens = result.split('\n');
890
891 // ----------------------------------------------------
892
893 var time = $("reporttime"+z);
894 var ltime = $("localtime"+z);
895
896 var date1 = new Date();
897
898 if (tokens[0].length!=13)
899 {
900 if (date0 != null)
901 strike(time, date0.getTime()+60000>date1.getTime());
902 // FIXME: Reset display to "---" values -- no connection
903 return;
904 }
905
906 var date2 = new Date();
907 date2.setTime(tokens[0]);
908
909 strike(time, date2.getTime()+60000>date1.getTime());
910
911 date0 = date2;
912
913 var utc = date0.toUTCString();
914
915 time.innerHTML =
916 "&#8226;&nbsp;"+utc.substr(utc.length-12, 8)+"&nbsp;UTC&nbsp;&#8226;"
917 ltime.innerHTML =
918 "&#8226;&nbsp;"+date1.toLocaleString()+"&nbsp;&#8226;";
919
920 // ----------------------------------------------------
921
922 var p = table.tBodies.length==3 ? 1 : 0;
923 var tbody = table.tBodies[p];
924
925 for (var line=1; line<tokens.length; line++)
926 {
927 if (tokens[line].length==0)
928 continue;
929
930 var e = document.getElementById("data"+z+"-"+line);
931 if (e == undefined)
932 continue;
933
934 var form = e.getAttribute("data-form");
935 if (form==undefined)
936 continue;
937
938 var cols = tokens[line].split('\t');
939 for (var col=1; col<cols.length; col++)
940 form = form.replace("\$"+(col-1), cols[col].length==0 ? "&mdash;" : cols[col]);
941
942 if (cols.length<=1)
943 form = "&mdash;";
944
945 var newe = document.createElement("div");
946 newe.innerHTML = form;
947 e.replaceChild(newe, e.lastChild);
948
949 e.parentNode.parentNode.parentNode.parentNode.style.background=cols[0];
950 }
951}
952
953// http://billmill.org/static/canvastutorial/index.html
954// http://www.netmagazine.com/tutorials/learning-basics-html5-canvas
955// http://www.alistapart.com/articles/responsive-web-design/
956
957function refresh_graphics()
958{
959 var z = $("body").getAttribute("data-visible");
960
961 var canvas = $("canvas"+z);
962
963 // Is sliding or no data file defined?
964 var fname = canvas==null ? "" : canvas.getAttribute("data-file");
965 if (isSliding() || !valid(fname))
966 {
967 // invalidate?
968 timeoutGraphics = setTimeout(refresh_graphics, 1000);
969 return;
970 }
971
972 var xmlGfx = new XMLHttpRequest();
973 xmlGfx.open('POST', "data/"+fname, true);
974 xmlGfx.onload = function()
975 {
976 if (xmlGfx.status!=200)
977 {
978 alert("ERROR[2] - Request '"+fname+"': "+xmlGfx.statusText+" ["+xmlGfx.status+"]");
979 timeoutGraphics = setTimeout(refresh_graphics, 10000);
980 //****** invalidate ******
981 return;
982 }
983
984 if (!isSliding())
985 {
986 cycleCol($("rdot"+z));
987 process_eventdata(xmlGfx.responseText);
988 }
989 timeoutGraphics = setTimeout(refresh_graphics, 5000)
990 };
991 xmlGfx.send(null);
992}
993
994
995function hueToRGB(hue)
996{
997 hue /= 3;
998 hue %= 6;
999
1000 if (hue<1) return parseInt(255*hue, 10);
1001 if (hue<3) return parseInt(255, 10);
1002 if (hue<4) return parseInt(255*(4-hue), 10);
1003
1004/*
1005 if (hue<1*5/4) return parseInt(255*hue*4/5);
1006 if (hue<2*5/4) return parseInt(255);
1007 if (hue<3*5/4) return parseInt(255*(3*5/4-hue)*4/5);
1008*/
1009/*
1010 if (hue<1.5) return parseInt(255*hue/1.5);
1011 if (hue<3.0) return parseInt(255);
1012 if (hue<4.5) return parseInt(255*(4.5-hue)/1.5);
1013*/
1014 return 0.
1015}
1016
1017function hueToHex(flt)
1018{
1019 var s = hueToRGB(flt).toString(16);
1020 return s.length==2 ? s : "0"+s;
1021}
1022
1023function HLStoRGB(hue)
1024{
1025 hue *= 14;
1026
1027 var sr = hueToHex(20-hue);
1028 var sg = hueToHex(14-hue);
1029 var sb = hueToHex(26-hue);
1030
1031 return sr+sg+sb;
1032}
1033
1034
1035function color(col)
1036{
1037 if (col==65533)
1038 col = 0;
1039
1040 var hue = col/128;
1041 return HLStoRGB(hue);
1042}
1043
1044function toHex(str, idx)
1045{
1046 var ch = str[idx].toString(16);
1047 return ch.length==2 ? ch : "0"+ch;
1048}
1049
1050function drawHex(ctx, x, y, col)
1051{
1052 ctx.fillStyle = "#"+color(col);
1053
1054 ctx.save();
1055
1056 ctx.translate(x, y);
1057 ctx.scale(1/2, 1/3);
1058
1059 ctx.beginPath();
1060 ctx.moveTo( 1, 1);
1061 ctx.lineTo( 0, 2);
1062 ctx.lineTo(-1, 1);
1063 ctx.lineTo(-1, -1);
1064 ctx.lineTo( 0, -2);
1065 ctx.lineTo( 1, -1);
1066 ctx.fill();
1067
1068 ctx.restore();
1069}
1070
1071function drawDisc(ctx, x, y, r, col)
1072{
1073 ctx.fillStyle = "#"+color(col);
1074
1075 ctx.save();
1076
1077 ctx.translate(x, y);
1078
1079 ctx.beginPath();
1080 ctx.arc(0, 0, r, 0, Math.PI*2, true);
1081 ctx.fill();
1082
1083 ctx.restore();
1084}
1085
1086function beginDrawCam(scale)
1087{
1088 var z = $("body").getAttribute("data-visible");
1089 var canv = $("canvas"+z);
1090
1091 var w = Math.min(canv.width/scale, canv.height/scale);
1092
1093 var ctx = canv.getContext("2d");
1094
1095 ctx.save();
1096 ctx.translate(canv.width/2, canv.height/2);
1097 ctx.scale(w*2, w*2);
1098
1099 return ctx;
1100}
1101
1102/**
1103 * @constructor
1104 */
1105function position(s, ring, i)
1106{
1107 switch (s)
1108 {
1109 case 1: this.x = ring - i*0.5; this.y = + i; break;
1110 case 2: this.x = ring*0.5 - i; this.y = ring ; break;
1111 case 3: this.x = -ring*0.5 - i*0.5; this.y = ring - i; break;
1112 case 4: this.x = -ring + i*0.5; this.y = - i; break;
1113 case 5: this.x = -ring*0.5 + i; this.y = -ring ; break;
1114 case 0: this.x = ring*0.5 + i*0.5; this.y = -ring + i; break;
1115 }
1116 this.d = function() { return this.x*this.x + this.y*this.y*3/4; }
1117}
1118
1119function drawFullCam(data)
1120{
1121 if (data.length!=40 && data.length!=160 && data.length!=320 && data.length!=1440)
1122 {
1123 alert("Camera - Received data has invalid size ("+data.length+"b)");
1124 return;
1125 }
1126
1127 var div = map.length/data.length;
1128 var off = data.length==320 ? 0.2 : 0;
1129
1130 var ctx = beginDrawCam(83);
1131 // ctx.rotate(Math.PI/3);
1132
1133 ctx.scale(1, Math.sqrt(3)/2);
1134 ctx.translate(-0.5, 0);
1135
1136 drawHex(ctx, 0, 0, data.charCodeAt(parseInt(map[0]/div+off, 10)));
1137
1138 var cnt = 1;
1139 for (var ring=1; ring<24; ring++)
1140 {
1141 for (var s=0; s<6; s++)
1142 {
1143 for (var i=1; i<=ring; i++)
1144 {
1145 var pos = new position(s, ring, i);
1146 if (pos.d() - pos.x > 395.75)
1147 continue;
1148
1149 var p = parseInt(map[cnt]/div+off, 10);
1150
1151 drawHex(ctx, pos.x, pos.y, data.charCodeAt(p));
1152 cnt++;
1153 }
1154 }
1155 }
1156
1157 drawHex(ctx, 7, -22, data.charCodeAt(parseInt(map[1438]/div+off, 10)));
1158 drawHex(ctx, 7, 22, data.charCodeAt(parseInt(map[1439]/div+off, 10)));
1159
1160 ctx.restore();
1161}
1162
1163function drawCam(data)
1164{
1165 var ctx = beginDrawCam(27);
1166 ctx.rotate(Math.PI/6);
1167 ctx.scale(1, Math.sqrt(3)/2);
1168
1169 drawHex(ctx, 0, 0, data.charCodeAt(0));
1170
1171 var cnt = 1;
1172 for (var ring=1; ring<=7; ring++)
1173 {
1174 for (var s=0; s<6; s++)
1175 {
1176 for (var i=1; i<=ring; i++)
1177 {
1178 var pos = new position(s, ring, i);
1179 if (pos.d() > 44)
1180 continue;
1181
1182 if (ring==7)
1183 {
1184 if (i==6 && (s==0 || s==3))
1185 continue;
1186 if (i==1 && (s==1 || s==4))
1187 continue;
1188 }
1189
1190 drawHex(ctx, pos.x, pos.y, data.charCodeAt(cnt++));
1191 }
1192 }
1193 }
1194
1195 ctx.restore();
1196}
1197
1198function drawCamLegend(canv, min, max)
1199{
1200 var unit = canv.getAttribute("data-data");//.split("/");
1201 if (unit.length>0)
1202 unit = " "+unit;
1203
1204 var v0 = parseFloat(min);
1205 var v1 = parseFloat(max);
1206
1207 var diff = v1-v0;
1208
1209 var cw = canv.width;
1210 var ch = canv.height;
1211
1212 var ctx = canv.getContext("2d");
1213
1214 ctx.font = "8pt Arial";
1215 ctx.textAlign = "right";
1216 ctx.textBaseline = "top";
1217
1218 for (var i=0; i<11; i++)
1219 {
1220 ctx.strokeStyle = "#"+color(16*i);
1221 ctx.strokeText((v0+diff*i/10).toPrecision(3)+unit, cw-5, 120-i*12);
1222 }
1223}
1224
1225function drawGraph(canv, min, max, data)
1226{
1227 var unit = canv.getAttribute("data-data");//.split("/");
1228 if (unit.length>0)
1229 unit = " "+unit;
1230
1231 var cw = canv.width;
1232 var ch = canv.height;
1233
1234 var ctx = canv.getContext("2d");
1235
1236 var dw = 3; // tick width
1237
1238 var fs = 8; // font size
1239
1240 ctx.font = fs+"pt Arial";
1241 ctx.textAlign = "right";
1242
1243 var dim0 = ctx.measureText(min+unit);
1244 var dim1 = ctx.measureText(max+unit);
1245
1246 var tw = Math.max(dim0.width, dim1.width)+dw+2;
1247
1248 var ml = 5+tw; // margin left
1249 var mr = 10; // margin right
1250
1251 var mt = fs/2+5; // margin top
1252 var mb = fs/2+4; // margin bottom
1253
1254 var nx = 20;
1255 var ny = 10;
1256
1257 var w = cw-ml-mr;
1258 var h = ch-mt-mb;
1259
1260 ctx.strokeStyle = "#666";
1261
1262 // --- data ---
1263 ctx.beginPath();
1264 ctx.moveTo(ml, ch-mb-data.charCodeAt(0)/128*h);
1265 for (var i=1; i<data.length; i++)
1266 ctx.lineTo(ml+w/(data.length-1)*i, ch-mb-data.charCodeAt(i)/128*h);
1267
1268 // --- finalize data ---
1269 ctx.lineTo(cw-mr, ch-mb);
1270 ctx.lineTo(ml, ch-mb);
1271 ctx.fillStyle = "#"+color(100);
1272 ctx.stroke();
1273 ctx.fill();
1274
1275 ctx.beginPath();
1276
1277 // --- grid ---
1278
1279 ctx.strokeStyle = "#eee";
1280
1281 for (var i=1; i<=nx; i++)
1282 {
1283 ctx.moveTo(ml+w/nx*i, ch-mb);
1284 ctx.lineTo(ml+w/nx*i, mt);
1285 }
1286 for (var i=0; i<ny; i++)
1287 {
1288 ctx.moveTo(ml, mb+h/ny*i);
1289 ctx.lineTo(ml+w, mb+h/ny*i);
1290 }
1291 ctx.stroke();
1292 ctx.closePath();
1293 ctx.beginPath();
1294
1295 ctx.strokeStyle = "#000";
1296
1297 // --- axes ---
1298 ctx.moveTo(ml, mt);
1299 ctx.lineTo(ml, ch-mb);
1300 ctx.lineTo(cw-mr, ch-mb);
1301
1302 for (var i=1; i<=nx; i++)
1303 {
1304 ctx.moveTo(ml+w/nx*i, ch-mb-dw);
1305 ctx.lineTo(ml+w/nx*i, ch-mb+dw);
1306 }
1307 for (var i=0; i<ny; i++)
1308 {
1309 ctx.moveTo(ml-dw, mb+h/ny*i);
1310 ctx.lineTo(ml+dw, mb+h/ny*i);
1311 }
1312 ctx.stroke();
1313 ctx.closePath();
1314
1315 ctx.textBaseline = "bottom";
1316 ctx.strokeText(min+unit, ml-dw-2, ch-1);
1317
1318 ctx.textBaseline = "top";
1319 ctx.strokeText(max+unit, ml-dw-2, 0);
1320}
1321
1322var gfxtime0 = null;
1323
1324function process_eventdata(result)
1325{
1326 if (result.length==0)
1327 return;
1328
1329 var z = $("body").getAttribute("data-visible");
1330 var canv = $("canvas"+z);
1331 if (canv == undefined)
1332 return;
1333
1334 var type = canv.getAttribute("data-type");
1335
1336 var ctx = canv.getContext("2d");
1337 ctx.clearRect(0, 0, canv.width, canv.height);
1338
1339 var data = result.split('\n');
1340 if (result.length<3)
1341 return;
1342
1343 var l = data[0].length+1+data[1].length+1;
1344
1345 switch (type)
1346 {
1347 //case "camera": drawCam(result); break;
1348 case "hist":
1349 drawGraph(canv, data[0], data[1], result.substr(l));
1350 break;
1351 case "camera":
1352 drawFullCam(result.substr(l));
1353 drawCamLegend(canv, data[0], data[1]);
1354 break;
1355 }
1356
1357 var date = new Date();
1358 if (gfxtime0 != null && gfxdate0.getTime()+60000>date.getTime())
1359 {
1360 ctx.fillStyle = "rgba(255, 255, 255, 0.75)";
1361 ctx.fillRect(0, 0, canv.width, canv.height);
1362 }
1363
1364 //$("image"+z).src = canv.toDataURL("image/png");
1365}
1366
1367function save()
1368{
1369 var z = $("body").getAttribute("data-visible");
1370
1371 var canvas = $("canvas"+z);
1372 var img = canvas.toDataURL("image/png");
1373
1374 img = img.replace("image/png", "image/octet-stream");
1375
1376 document.location.href = img;
1377}
1378
1379window['onload'] = onload;
Note: See TracBrowser for help on using the repository browser.