Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 31 - (show annotations) (download) (as text)
Fri Jul 23 00:51:32 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 67679 byte(s)
support manifest
1 /*
2 SvgEditor.js
3
4 iSlideMaker
5 http://sourceforge.jp/projects/islidemaker/simple/
6
7 Copyright(c) 2010, Isao Hara, isao-hara@users.sourceforge.jp
8
9 All rights reserved. This program is made available under the terms of the
10 Eclipse Public License v1.0 which accompanies this distribution, and is
11 available at http://www.eclipse.org/legal/epl-v10.html
12
13 Contributors: Isao Hara.
14 */
15 var systemDB;
16 var currentMode;
17 var editarea_w=80;
18 var editarea_h=10;
19 var MainTitle="Simple SVG Editor";
20
21 var preview=null;
22 var targetItem=null;
23 var selectedItems=new Array();
24 var sx=0;
25 var sy=0;
26 var ex=0;
27 var ey=0;
28 var modeSVG=null;
29 var iSlideMgr='iSlideManager.php';
30 var MgrPath="";
31 var nextId=1;
32
33 var lineEdit=null;
34
35 ////// SVG
36 var svg_ns = 'http://www.w3.org/2000/svg';
37 var svg_x=10;
38 var svg_y=10;
39 var svg_width = 100;
40 var svg_height = 50;
41 var svg_rx = 50;
42 var svg_ry = 30;
43 var svg_lw = 1;
44 var svg_wo = null;
45 var svg_ho = null;
46 var svg_ro = null;
47 var svg_rxo = null;
48 var svg_ryo = null;
49 var svg_fsize = null;
50 var svg_scale_dir = null;
51
52 var svg_top = null;
53 var svg_select = null;
54 var svg_defs = null;
55
56 var svg_font_size = 24;
57 var svg_font_family = 'Helvetica';
58 var svg_color = '#000000';
59 var svg_fill_color = '#ffffff';
60 var svg_line_width = 1;
61
62 var editingTextObj = null;
63
64 ///// Color
65 var colors=new Array('none', '#ffffff',
66 '#000000', '#3f3f3f', '#7f7f7f', '#bfbfbf',
67 '#ff0000', '#ff7f00', '#ffff00', '#7fff00',
68 '#00ff00', '#00ff7f', '#00ffff', '#007fff',
69 '#0000ff', '#7f00ff', '#ff00ff', '#ff007f',
70 '#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
71 '#007f00', '#007f3f', '#007f7f', '#003f7f',
72 '#00007f', '#3f007f', '#7f007f', '#7f003f',
73 '#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
74 '#ffaaaa', '#ffd4aa', '#ffffaa', '#d4ffaa',
75 '#aaffaa', '#aaffd4', '#aaffff', '#aad4ff',
76 '#aaaaff', '#d4aaff', '#ffaaff', '#ffaad4'
77 );
78
79 //// Initialize
80 function initEditor(name, dispname, size){
81 systemDB = initDB(name, dispname, size);
82 fileSelector();
83 preview=document.getElementById('preview');
84 if(preview){
85 preview.addEventListener("touchstart", onTouchStart,false);
86 preview.addEventListener("touchmove", onTouchMove, false);
87 preview.addEventListener("touchend", onTouchEnd, false);
88 preview.addEventListener("gesturestart", onGestureStart,false);
89 preview.addEventListener("gesturechange", onGestureChange, false);
90 preview.addEventListener("gestureend", onGestureEnd, false);
91 }
92 }
93
94 function restoreValues(){
95 if(typeof(localStorage) == 'undefined'){
96 alert('local storage not suported');
97 }
98 MgrPath = localStorage.getItem('MgrPath') ? localStorage.getItem('MgrPath') : "";
99 window.onbeforeuload=function(){ return saveChanges(); }
100 }
101
102 function clearAll(){
103 localsStorage.clear();
104 restoreValudes();
105 }
106
107 function saveChanges(){
108 localStorage.getItem('MgrPath') = MgrPath;
109 }
110
111 // initialize a database
112 function initDB(name, dispname, size) {
113 try {
114 if (!window.openDatabase) {
115 alert('not supported');
116 } else {
117 var version = '1.0';
118 var myDB = openDatabase(name, version, dispname, size);
119 }
120 } catch(e) {
121 if (e == INVALID_STATE_ERR) {
122 alert("Invalid database version.");
123 } else {
124 alert("Unknown error "+e+".");
125 }
126 return null;
127 }
128
129 createTables(myDB);
130 return myDB;
131 }
132
133 function createTables(db) {
134 if (0) dropTables(db);
135
136 db.transaction(
137 function (transaction) {
138 transaction.executeSql('CREATE TABLE IF NOT EXISTS files(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, filedata_id INTEGER NOT NULL, deleted INTEGER NOT NULL DEFAULT 0);', [], nullDataHandler, killTransaction);
139 transaction.executeSql('CREATE TABLE IF NOT EXISTS filedata(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, datablob BLOB NOT NULL DEFAULT "");', [], nullDataHandler, errorHandler);
140 }
141 );
142 }
143
144 function dropTables(db) {
145 db.transaction(
146 function (transaction) {
147 transaction.executeSql('DROP TABLE files;');
148 transaction.executeSql('DROP TABLE filedata;');
149 }
150 );
151 }
152
153 /// Create New File
154 function reallyCreateNewFileAction(name, db){
155 var myDB = db;
156 if(!db) myDB = systemDB;
157
158 myDB.transaction(
159 function (transaction) {
160 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+name+"', results.insertId], nullDataHandler, killTransaction);");
161
162 transaction.executeSql('INSERT INTO filedata (datablob) VALUES ("");', [], myfunc, errorHandler);
163 }
164 );
165
166 fileSelector();
167 }
168
169 function createNewFileAction(db){
170 var myDB = db;
171 if(!db) myDB = systemDB;
172
173 var name = document.getElementById('createFilename').value
174 if(name == "") {
175 if (confirm('Filename is required, try agein?')) { createNewFile(); }else{ fileSelector(); }
176 return;
177 }
178
179 myDB.transaction(
180 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
181 "function (transaction, results) {"+
182 "if(results.rows.length == 0){"+
183 "reallyCreateNewFileAction('"+name+"');"+
184 "}else{"+
185 "if (confirm(results.rows.item(0)['name']+' already exist, try agein?')) {"+
186 "createNewFile();"+
187 "}else{"+
188 "fileSelector();"+
189 "}"+
190 "}"+
191 "}, errorHandler);")
192 );
193
194 }
195
196 //// Delete File
197 function deleteUpdateResults(transaction, results)
198 {
199 if (results.rowsAffected) {
200 fileSelector();
201 }
202 }
203
204 function reallyDelete(id, db){
205 var myDB = db;
206 if(!db) myDB = systemDB;
207
208 myDB.transaction(
209 new Function("transaction",
210 "transaction.executeSql('DELETE FROM files where id=?;', [ "+id+" ], null, errorHandler);"
211 +"transaction.executeSql('DELETE FROM filedata where id=?;', [ "+id+" ], deleteUpdateResults, errorHandler);")
212 );
213 }
214
215 function deleteFile(name, db){
216 var myDB = db;
217 if(!db) myDB = systemDB;
218
219 myDB.transaction(
220 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
221 "function (transaction, results) {"+
222 "if (confirm('Really delete '+results.rows.item(0)['name']+'?')) {"+
223 "reallyDelete(results.rows.item(0)['id']);"+
224 "}"+
225 "}, errorHandler);")
226 );
227 }
228
229 function reallyDeleteAll(db){
230 var myDB = db;
231 if(!db) myDB = systemDB;
232
233 myDB.transaction(
234 new Function("transaction",
235 "transaction.executeSql('DELETE FROM files;',[],null, errorHandler);"
236 +"transaction.executeSql('DELETE FROM filedata;',[],deleteUpdateResults, errorHandler);")
237 );
238 }
239
240 function deleteAllFile(db){
241 if (confirm('Really delete all file?')) {
242 reallyDeleteAll(db);
243 }
244 }
245
246 ///// Rename
247 function reallyRenameFileAction(id, newname, db){
248 var myDB = db;
249 if(!db) myDB = systemDB;
250
251 myDB.transaction(
252 function (transaction) {
253 transaction.executeSql('UPDATE files set name=? where id=?;', [newname,id ], null, errorHandler);
254 }
255 );
256 fileSelector();
257 }
258
259 function renameFileAction(db){
260 var myDB = db;
261 if(!db) myDB = systemDB;
262
263 var new_name = document.getElementById('newFilename').value
264 var id = document.getElementById('fileId').value
265
266 if(new_name == "") {
267 alert('Filename is required.');
268 fileSelector();
269 return;
270 }
271
272 myDB.transaction(
273 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+new_name+"'],"+
274 "function (transaction, results) {"+
275 "if(results.rows.length == 0){"+
276 "reallyRenameFileAction('"+id+"','"+new_name+"');"+
277 "}else{"+
278 "alert(results.rows.item(0)['name']+' already exist');"+
279 "fileSelector();"+
280 "}"+
281 "}, errorHandler);")
282 );
283
284 }
285
286
287 /// Save File
288 function saveFile(db){
289 var myDB = db;
290 if(!db) myDB = systemDB;
291
292 var editarea = document.getElementById('editarea');
293 var contents = "";
294 contents = editarea.value;
295
296 myDB.transaction(
297 function (transaction) {
298 var datadiv = document.getElementById('tempdata');
299 var filedata_id = datadiv.getAttribute('lfdataid');
300
301 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
302 [ contents, filedata_id ], nullDataHandler, errorHandler);
303
304 alert('Saved.');
305 }
306 );
307 }
308
309 function saveData(db){
310 var myDB = db;
311 if(!db) myDB = systemDB;
312
313 var contents = "";
314 contents = getSVGContent();
315
316 myDB.transaction(
317 function (transaction) {
318 var datadiv = document.getElementById('tempdata');
319 var filedata_id = datadiv.getAttribute('lfdataid');
320
321 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
322 [ contents, filedata_id ], nullDataHandler, errorHandler);
323
324 alert('Saved.');
325 }
326 );
327 }
328
329 function saveContent(contents, db){
330 var myDB = db;
331 if(!db) myDB = systemDB;
332
333 if(!contents) {
334 alert("Invalid content");
335 return;
336 }
337
338 myDB.transaction(
339 function (transaction) {
340 var datadiv = document.getElementById('tempdata');
341 var filedata_id = datadiv.getAttribute('lfdataid');
342
343 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
344 [ contents, filedata_id ], nullDataHandler, errorHandler);
345
346 alert('Saved.');
347 }
348 );
349 }
350
351 function reallySaveNewFileAction(fname, db){
352 var myDB = db;
353 if(!db) myDB = systemDB;
354
355 var datadiv = document.getElementById('tempdata');
356 content = datadiv.textContent;
357
358 myDB.transaction(
359 function (transaction) {
360 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+fname+"', results.insertId], nullDataHandler, killTransaction);");
361
362 transaction.executeSql('INSERT INTO filedata (datablob) VALUES (?);', [content], myfunc, errorHandler);
363 }
364 );
365
366 datadiv.textContent="";
367 alert("download to "+fname);
368 }
369
370 function saveContentFilename(id, db){
371
372 var datadiv = document.getElementById('tempdata');
373 datadiv.setAttribute('lfdataid', id);
374 saveContent(datadiv.innerHTML, db);
375 datadiv.textContent="";
376 }
377
378 function saveContentWithFilename(fname, contents, db){
379 var myDB = db;
380 if(!db) myDB = systemDB;
381
382 if(!contents) {
383 alert("Invalid content");
384 return;
385 }
386
387 var datadiv = document.getElementById('tempdata');
388 datadiv.setAttribute('lfname', fname);
389 datadiv.textContent = contents;
390
391 myDB.transaction(
392 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+fname+"'],"+
393 "function (transaction, results) {"+
394 "if(results.rows.length == 0){"+
395 "reallySaveNewFileAction('"+fname+"');"+
396 "}else{"+
397 "if (confirm(results.rows.item(0)['name']+' already exist, Overwrite?')) {"+
398 "saveContentFilename(results.rows.item(0)['id']);"+
399 "}else{"+
400 "fileSelector();"+
401 "}"+
402 "}"+
403 "}, errorHandler);")
404 );
405
406 }
407
408 function showFileData(transaction, results){
409 var data = results.rows.item(0);
410 var filename = data['name'];
411 var filedata = data['datablob'];
412
413 var datadiv = document.getElementById('tempdata');
414 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
415
416 document.title=filename;
417
418 previewFile(filedata);
419
420 updateShowMenu();
421 setMode('Preview');
422 }
423
424 function showFile(name){
425 getFile(name, 'showFileData');
426 }
427
428 function getFile(name, func, db){
429 var myDB = db;
430 if(!db) myDB = systemDB;
431
432 var datadiv = document.getElementById('tempdata');
433 if(datadiv) datadiv.setAttribute('lfname', name);
434
435 myDB.transaction(
436 function (transaction) {
437 transaction.executeSql('SELECT * from files, filedata where files.name=? and files.filedata_id = filedata.id;', [name], eval(func), errorHandler);
438 }
439 );
440 }
441
442 // Error Handlers
443 function killTransaction(transaction, error){
444 return true;
445 }
446
447 function errorHandler(transaction, error){
448 alert('Oops. Error was '+error.message+' (Code '+error.code+')');
449
450 var we_think_this_error_is_fatal = true;
451 if (we_think_this_error_is_fatal) return true;
452 return false;
453 }
454
455 function nullDataHandler(transaction, results){
456 }
457
458 ///////////////////////////
459
460 function fileSelector(db) {
461 var myDB = db;
462 if(!db) myDB = systemDB;
463
464 myDB.transaction(
465 function (transaction) {
466 transaction.executeSql("SELECT * from files where deleted=0;", [ ],
467 function (transaction, results) {
468 var filelist = '';
469 var menuDiv = document.getElementById('menuDiv');
470 if(menuDiv){
471 for(var i=0; i<results.rows.length; i++) {
472 var row = results.rows.item(i);
473 filelist = filelist + fileEntry(row);
474 }
475 if (filelist == "") {
476 filelist = "No files.<br />\n";
477 } else {
478 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
479 }
480 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+createMenuBar()+filelist;
481 }
482 }, errorHandler);
483 }
484 );
485 setMode('List');
486 }
487
488 function fileSelectorOnServer(val) {
489 var filelist = '';
490 var menuDiv = document.getElementById('menuDiv');
491 var results = val.split(',');
492
493 if(menuDiv){
494 for(var i=0; i<results.length; i++) {
495 var row = results[i];
496 filelist = filelist + fileEntryOnServer(row);
497 }
498 if (filelist == "") {
499 filelist = "No files.<br />\n";
500 } else {
501 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
502 }
503 var Menu = "<button onClick=\"fileSelector();\">Local Storage</button>";
504 Menu += "<button onClick=\"getRemoteFileList();\">List on Server</button>";
505 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+Menu+filelist;
506 }
507 setMode('List');
508 }
509
510 function fileEntryOnServer(name){
511 name = name.split('.')[0];
512 var res = "<tr class='filerow'>";
513 res += "<td class='filenamecell' onClick=\"getRemoteFile('"+name+"');\">"+name+"</td>";
514 res += "<td class='filelinkcell'>";
515 res += "<button class='green' onClick=\"showRemoteFile('"+name+"');\">View</button>";
516 res += "<button onClick=\"downloadFile('"+name+"');\">Download to local storage</button>";
517 res += "<button onClick=\"downloadToFile('"+name+"');\">Download as SVG File</button>";
518 res += "</td></tr>\n";
519
520 return res;
521 }
522
523 function fileEntry(row){
524 var name = row['name'];
525 var files_id = row['id'];
526
527 var res = "<tr class='filerow'>";
528 res += "<td class='filenamecell' onClick=\"showFile('"+name+"');\">"+name+"</td>";
529 res += "<td class='filelinkcell'>";
530 res += "<button class='blue' onClick=\"editFile('"+name+"');\">&nbsp;Edit&nbsp;</button> &nbsp;";
531 res += "<button class='green' onClick=\"renameFile('"+name+"',"+files_id+");\">&nbsp;Rename&nbsp;</button> &nbsp;";
532 res += "<button onClick=\"uploadFile('"+name+"');\">Upload</button>";
533 res += "<button class='red' onClick=\"deleteFile('"+name+"');\">Delete</button>";
534 res += "</td></tr>\n";
535
536 return res;
537 }
538
539 function createMenuBar(){
540 var menu = "<ul id='menubar'>";
541 menu += "<li><button onClick='createNewFile()'>Create New File</button></li>";
542 menu += "<li><button onClick='deleteAllFile()'>Delete All</button></li>";
543 menu += "<li><button onClick='getRemoteFileList()'>File List on a Server</button></li>";
544 menu += "<li><button onClick='configServer()'>Server Configuration</button></li>";
545 menu += "</ul><p class='cls'>";
546 return menu;
547 }
548
549 //// Config
550 function setConfig(){
551 var ele = document.getElementById('ServerURL');
552 MgrPath=ele.value;
553 alert("Done");
554 }
555
556 function configServer(){
557 var popupDiv = document.getElementById('popup');
558 var string = "";
559
560 string += "<H1 class='title'>Server Configration</H1>\n";
561 string += "<div class=\"input_form\">\n";
562 string += "Filename:<input id='ServerURL' name='url' value=\""+MgrPath+"\" size=\"80\"/><br>\n";
563 string += "<button onClick=\"setConfig();hideItemById('popup'); \">Done</button>\n";
564 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
565 string += "</div>\n";
566
567 popupDiv.innerHTML=string;
568 popupDiv.style.display='block';
569 }
570
571 ////
572 function createNewFile(){
573 var popupDiv = document.getElementById('popup');
574 var string = "";
575
576 string += "<H1 class='title'>Create New File</H1>\n";
577 string += "<div class=\"input_form\">\n";
578 string += "Filename:<input id='createFilename' name='name' value=\"\" />\n";
579 string += "<button onClick=\"createNewFileAction();hideItemById('popup'); \">Create</button>\n";
580 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
581 string += "</div>\n";
582
583 popupDiv.innerHTML=string;
584 popupDiv.style.display='block';
585 }
586
587
588 /////
589 function renameFile(name, id){
590 var popupDiv = document.getElementById('popup');
591 var string = "";
592
593 string += "<H1 class='title'>Rename File</H1>\n";
594 string += "<div class='input_form'>\n";
595 string += "Old Filename: "+name+"<br>";
596 string += "New Filename:<input id='newFilename' name='newname' value=\"\" />\n";
597 string += "<input type='hidden' id='fileId' value=\""+id+"\" /><br>\n";
598 string += "<button onClick=\"renameFileAction();hideItemById('popup');\">Rename</button>\n";
599 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
600 string += "</div>\n";
601
602 popupDiv.innerHTML=string;
603 popupDiv.style.display='block';
604 }
605
606 /// EditMenu
607 function insertStr(str, len){
608 var editarea = document.getElementById('editarea');
609 if(len < 0) len = str.length;
610
611 if (editarea){
612 if(str=='DQ') str='"';
613 var strs = editarea.value;
614 var cPos = editarea.selectionStart;
615 var tmp = strs.substr(0,cPos);
616 editarea.value = tmp +str+strs.substr(cPos, strs.length);
617 cPos += len;
618 editarea.setSelectionRange(cPos, cPos);
619 editarea.focus();
620 }
621 }
622
623 function insertTag(tag){
624 var str;
625 var len = -1;
626 if (tag == "p"){
627 str = "<p> </p>";
628 len = 4;
629 }else if (tag == "ul"){
630 str = "<ul class=\" \"> \n\n</ul>";
631 len = 17;
632 }else if (tag == "li"){
633 str = "<li> </li>";
634 len = 5;
635 }else if (tag == "href"){
636 str = "xlink:href=\"\"";
637 len = 12;
638 }else if (tag == "EQ"){
639 str = "=\"\"";
640 len = 2;
641 }else if (tag == "svg:text"){
642 str = "<svg:text x=\"100\" y=\"100\" fill=\"black\" font-size=\"12\"> </svg:text>";
643 len = 58;
644 }else if (tag == "svg:rect"){
645 str = "<svg:rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"white\" stroke=\"black\" />";
646 len = 13;
647 }else if (tag == "svg:circle"){
648 str = "<svg:circle cx=\"10\" cy=\"100\" r=\"100\" fill=\"white\" stroke=\"black\" strokc-width=\"1\"/>";
649 len = 17;
650 }
651 insertStr(str, len);
652 }
653
654 function editMenuBar()
655 {
656 var str = "";
657 str += "<button onClick=\"insertStr('/',1);\">/</button>\n";
658 str += "<button onClick=\"insertStr('DQ',1);\">\"</button>\n";
659 str += "<button onClick=\"insertTag('EQ',1);\">=\"\"</button>\n";
660 str += "<button onClick=\"insertTag('p');\">p</button>\n";
661 str += "<button onClick=\"insertTag('href');\">href</button>\n";
662
663 str += "<button onClick=\"insertTag('svg:text');\">TEXT</button>\n";
664 str += "<button onClick=\"insertTag('svg:rect');\">rect</button>\n";
665 str += "<button onClick=\"insertTag('svg:circle');\">circle</button>\n";
666
667 str += "<button onClick=\"chEditareaHeight();\">...</button>\n";
668
669 return str;
670 }
671
672 function updateEditMenu(){
673 var menuDiv = document.getElementById('menuDiv');
674 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
675 menuDiv.innerHTML+= "<button onClick=\"saveFile();fileSelector();\"> Save </button>\n";
676 menuDiv.innerHTML+= "<button onClick=\"previewData();\"> Preview </button>\n";
677 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
678
679 menuDiv.style.display='block';
680 }
681
682 //// Editor
683 function editFileData(transaction, results){
684 var editDiv = document.getElementById('editDiv');
685 var datadiv = document.getElementById('tempdata');
686
687 if( results.rows.length == 0) return;
688 var data = results.rows.item(0);
689 var filename = data['name'];
690 var filedata = data['datablob'];
691 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
692
693 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+filedata+"</textarea>\n";
694
695 document.title="EditFile: "+filename;
696 updateEditMenu();
697 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
698
699 setMode('Edit');
700 }
701
702 function editFile(name){
703 if(currentMode == 'Preview'){
704 var data = getSVGContent();
705 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+data+"</textarea>\n";
706 updateEditMenu();
707 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
708
709 setMode('Edit');
710 }else{
711 getFile(name, 'editFileData');
712 }
713 }
714
715 function editCurrentFile(){
716 var datadiv = document.getElementById('tempdata');
717 var name = datadiv.getAttribute('lfname');
718
719 editFile(name);
720 }
721
722 // Show File
723 function updateShowMenu(){
724 var menuDiv = document.getElementById('menuDiv');
725 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
726 menuDiv.innerHTML+= "<button onClick=\"editCurrentFile();\"> Edit </button>\n";
727 menuDiv.innerHTML+= "<button onClick=\"saveData();\"> Save </button>\n";
728 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
729 menuDiv.innerHTML+= "<button onClick=\"showSVGSource();\"> &lt;SVG &gt; </button>\n";
730 menuDiv.innerHTML+= updateSVGObjMenu();
731 menuDiv.style.display='block';
732 updateToolBar();
733 }
734
735 function showColorPalette(val){
736 var palette = document.getElementById('color-palette');
737 var ele;
738 var current = palette.getAttribute("targetType");
739
740 if(palette.style.display=='block' && current == val){
741 palette.style.display='none';
742 return;
743 }
744
745 if(val == 'fill'){
746 ele = document.getElementById('toolFill');
747 }else{
748 ele = document.getElementById('toolStroke');
749 }
750
751 var pos= ele.offsetTop + 110;
752 palette.style.top = pos +"px";
753 palette.style.display='block';
754 palette.setAttribute("targetType", val);
755
756 }
757
758 function updateToolBar(){
759 var toolbar = document.getElementById('toolBar');
760 var str = "";
761 if(!toolbar.innerHTML){
762 str += "<li><button id=\"b_selector\" onClick=\"setSVGMode('selector');\"><img src=\"images/arrow.png\" /></button> </li>\n";
763 str += "<li><button id=\"b_newPath\" onClick=\"setSVGMode('newPath'); \"><img src=\"images/path.png\" /></button></li> \n";
764 str += "<li><button id=\"b_newLine\" onClick=\"setSVGMode('newLine'); \"><img src=\"images/line.png\" /> </button></li> \n";
765 str += "<li><button id=\"b_text\" onClick=\"setSVGMode('text'); \"><img src=\"images/text.png\" /></button> </li>\n";
766 str += "<li><button id=\"b_rect\" onClick=\"setSVGMode('rect'); \"> <img src=\"images/rect.png\" /> </button></li> \n";
767 str += "<li><button id=\"b_circle\" onClick=\"setSVGMode('circle'); \"> <img src=\"images/circle.png\" /> </button></li> \n";
768 str += "<li><button id=\"b_ellipse\" onClick=\"setSVGMode('ellipse'); \"> <img src=\"images/ellipse.png\" /> </button></li> \n";
769 str += "<li><button id=\"b_image\" onClick=\"setSVGMode('image'); \"> <img src=\"images/img.png\" /> </button></li> \n";
770 str += "<li>&nbsp;</li>";
771 str += "<li><button id=\"b_fillColor\" onClick=\"showColorPalette('fill');\"><img src=\"images/Fill.png\" /><div id=\"toolFill\"></div></button></li> \n";
772 str += "<li><button id=\"b_strokeColor\" onClick=\"showColorPalette('stroke');\"><img src=\"images/Stroke.png\" /><div id=\"toolStroke\"></div></button></li> \n";
773 toolbar.innerHTML= "<ul>"+str+"</ul>";
774 }
775
776 toolbar.style.display='block';
777 }
778
779 function setMode(m){
780 currentMode=m;
781 switch(m){
782 case 'List':
783 hideItemById('editDiv');
784 hideItemById('preview');
785 hideItemById('popup');
786 hideItemById('toolBar');
787 hideItemById('color-palette');
788 showItemById('menuDiv');
789 break;
790 case 'Edit':
791 hideItemById('preview');
792 hideItemById('popup');
793 hideItemById('toolBar');
794 hideItemById('color-palette');
795 showItemById('editDiv');
796 showItemById('menuDiv');
797 break;
798 case 'Preview':
799 showItemById('preview');
800 hideItemById('editDiv');
801 hideItemById('popup');
802 hideItemById('color-palette');
803 showItemById('menuDiv');
804 showItemById('toolBar');
805 break;
806 default:
807 break;
808 }
809 }
810
811 function hideItemById(id){
812 var itm = document.getElementById(id);
813 if(itm) itm.style.display='none';
814 }
815
816 function showItemById(id){
817 var itm = document.getElementById(id);
818 if(itm) itm.style.display='block';
819 }
820
821 function removeChildNodes(id){
822 var itm = document.getElementById(id);
823 if(!itm) return;
824
825 var child = itm.firstChild;
826
827 while(child){
828 itm.removeChild(child);
829 child = itm.firstChild;
830 }
831 }
832
833 function chEditareaHeight(){
834 var itm = document.getElementById('editarea');
835 if(!itm) return;
836 var cv = itm.getAttribute('rows');
837 if(parseInt(cv) > editarea_h){
838 itm.setAttribute('rows', editarea_h);
839 }else{
840 itm.setAttribute('rows', editarea_h * 2);
841 }
842 }
843
844 function format_file(str){
845 return "<pre>"+str+"</pre>";
846 }
847
848 function previewData(data){
849 if(!data) data = document.getElementById('editarea').value;
850
851 previewFile(data);
852
853 updateShowMenu();
854 setMode('Preview');
855 }
856
857 function previewFile(data){
858 removeChildNodes('preview');
859
860 preview.style.display='block';
861 preview.style.position='absolute';
862 preview.style.top='180px';
863 preview.style.bottom='50px';
864 preview.style.left='0px';
865 preview.style.right='10px';
866 preview.style.width='800px';
867 // preview.style.height='600px';
868 preview.style.height='525px';
869 mkColorPalette();
870
871 var ele = toSVGElement(data, '100%','100%');
872
873 preview.appendChild(ele);
874
875 svg_top = document.getElementById('svg_top');
876 initSVGElementId(svg_top);
877 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
878 svg_select.setAttribute("id","svg_select");
879 appendSVGObj(svg_select);
880 }
881
882 function mkColorPalette(){
883 var palette = document.getElementById('color-palette');
884 if(!palette) return;
885 if(palette.innerHTML) return;
886
887 palette.innerHTML="";
888
889 if(!navigator.userAgent.match("iPad")){
890 palette.addEventListener("touchstart", onTouchStartColor, false);
891 }
892
893 // palette.innerHTML="<select id=\"color_sel\"><option value=\"fill\">Fill</option><option value=\"stroke\">Color</option></select>";
894 for(var i=0; i<colors.length ;i++){
895 if(colors[i] == 'none')
896 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\">X</div>";
897 else
898 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\"> </div>";
899 }
900 palette.style.width='120px';
901 }
902
903 ////// for SVG object
904 ////////////////
905 function updateSVGObjMenu(){
906 var res = "";
907 var tag = modeSVG;
908 if(selectedItems.length > 1) return res;
909 if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
910
911 switch(tag){
912 case 'text':
913 if(selectedItems[0]){
914 res += setSVGObjectProp(selectedItems[0]);
915 }else{
916 res += propSVGText("", svg_font_size, svg_color);
917 }
918 break;
919 case 'rect':
920 case 'circle':
921 case 'ellipse':
922 case 'newPath':
923 case 'newLine':
924 case 'path':
925 case 'line':
926 case 'polyline':
927 case 'polygon':
928 if(selectedItems[0]){
929 res += setSVGObjectProp(selectedItems[0]);
930 }else{
931 res += propSVGObj(tag+":", svg_line_width, svg_color, svg_fill_color);
932 }
933 break;
934 case 'image':
935 if(selectedItems[0]){
936 res += setSVGObjectProp(selectedItems[0]);
937 }else{
938 res += propSVGImage("", 100, 100);
939 }
940 break;
941 default:
942 break;
943 }
944 return res;
945 }
946
947 function propSVGText(str, size, color){
948 if(!size) size = 24;
949 if(!color) color = '#000000';
950
951 var res = "Text:";
952 res += "<input type=\"hidden\" id=\"svg_text\" value=\""+str+"\"/>";
953 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
954 res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
955
956 document.getElementById('toolFill').style.backgroundColor=color;
957 return res;
958 }
959
960 function propSVGObj(type, stroke, color, fill){
961 var res = type;
962 if(!stroke) stroke = 1;
963 if(!color) color = '#000000';
964 if(!fill) fill = '#ffffff';
965 res += "<input type=\"hidden\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
966 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
967 res += "Width:<input type=\"text\" id=\"svg_stroke\" value=\""+stroke+"\" size=\"2\"/>";
968
969 document.getElementById('toolFill').style.backgroundColor=fill;
970 document.getElementById('toolStroke').style.backgroundColor=color;
971 return res;
972 }
973
974 function propSVGLine(type, stroke, color, fill, style){
975 var res = propSVGObj(type, stroke, color, fill);
976 if(style==null) style="";
977 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
978 res += "Arrow:";
979 if(hasArrow('start')){
980 res += "<button class=\"tool\" onClick=\"removeLeftArrow();\"><img src=\"images/normal.png\" /></button>";
981 }else{
982 res += "<button class=\"tool\" onClick=\"setLeftArrow();\"><img src=\"images/larrow.png\" /></button>";
983 }
984 if(hasArrow('end')){
985 res += "<button class=\"tool\" onClick=\"removeRightArrow();\"><img src=\"images/normal.png\" /></button>";
986 }else{
987 res += "<button class=\"tool\" onClick=\"setRightArrow();\"><img src=\"images/rarrow.png\" /></button>";
988 }
989
990 document.getElementById('toolFill').style.backgroundColor=fill;
991 document.getElementById('toolStroke').style.backgroundColor=color;
992
993 return res;
994 }
995
996 function propSVGImage(str, w, h){
997 var res = "image:";
998 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
999 res += "Width:<input type=\"text\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
1000 res += "Height:<input type=\"text\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
1001 return res;
1002 }
1003
1004 function setSVGMode(m){
1005 var btn = document.getElementById('b_'+modeSVG);
1006 if(btn){ btn.style.border="1px solid black"; }
1007
1008 modeSVG = m;
1009 updateShowMenu();
1010
1011 if(m == 'selector'){
1012 targetItem=null;
1013 clearSelectedItems();
1014 }
1015 var btn = document.getElementById('b_'+modeSVG);
1016 if(btn){ btn.style.border="3px solid red"; }
1017 }
1018
1019
1020 function toSVGElement(str, w, h){
1021 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
1022 var parser = new DOMParser();
1023 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
1024 var footer = "</svg:svg>";
1025 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
1026 var xmlRoot = xmlDoc.documentElement;
1027 var ele = document.importNode(xmlRoot,true);
1028
1029 return ele;
1030 }
1031
1032 function createSVGElement(tag, id){
1033 if(id=='new'){
1034 id = 'svg_'+nextId;
1035 nextId++;
1036 }
1037 var ele= document.createElementNS(svg_ns, tag);
1038 ele.setAttribute("id", id);
1039 return ele;
1040 }
1041
1042 function defSVGElement(node){
1043 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1044 if(!svg_defs){
1045 svg_defs = createSVGElement('defs', 'svg_defs');
1046 svg_top.insertBefore(svg_defs, svg_top.firstChild);
1047 }
1048 if(node) svg_defs.appendChild(node);
1049 }
1050
1051 function initSVGElementId(svg_top){
1052 nextId = 1;
1053 checkSVGElementId(svg_top);
1054 appendSVGElementId(svg_top);
1055 }
1056
1057 function checkSVGElementId(top){
1058 var objs = top.childNodes;
1059
1060 for(var i=0; i<objs.length ;i++){
1061 if(objs[i].tagName){
1062 var id = objs[i].getAttribute("id");
1063
1064 if(id && id.match(/svg_[0-9]+/i)){
1065 var n = parseInt(RegExp.lastMatch.substr(4));
1066 if(n >= nextId){
1067 nextId = n+1;
1068 }
1069
1070 }
1071 checkSVGElementId(objs[i]);
1072 }
1073 }
1074 }
1075
1076 function appendSVGElementId(top){
1077 var objs = top.childNodes;
1078
1079 for(var i=0; i<objs.length ;i++){
1080 if(objs[i].tagName){
1081 var id = objs[i].getAttribute("id");
1082 if(!id){
1083 objs[i].setAttribute("id", "svg_"+nextId);
1084 nextId++;
1085 }
1086 }
1087 appendSVGElementId(objs[i]);
1088 }
1089 }
1090
1091 function selectedRectangle(x, y, ex, ey){
1092 if(!svg_select) return null;
1093
1094 svg_select.setAttribute("x",x);
1095 svg_select.setAttribute("y",y);
1096 svg_select.setAttribute("width", ex-x);
1097 svg_select.setAttribute("height", ey-y);
1098 svg_select.setAttribute("visibility", "visible");
1099 return svg_select;
1100 }
1101
1102
1103 function setAttributes(obj, attrs){
1104 var attr_array = attrs.split(',');
1105
1106 for (var i=0; i<attr_array.length;i++){
1107 var x = attr_array[i].split('=');
1108 if(x.length == 2){
1109 obj.setAttribute(x[0], x[1]);
1110 }
1111 }
1112 }
1113
1114 function createSVGObj(tag, attrs, fill, color, lw){
1115 var ele = createSVGElement(tag, 'new');
1116 setAttributes(ele, attrs);
1117 if (fill) ele.setAttribute('fill', fill);
1118 if (color) ele.setAttribute('stroke', color);
1119 if(lw) ele.setAttribute('stroke-width', lw);
1120
1121 return ele;
1122 }
1123
1124 function createSVGText(txt, x, y, size, color){
1125 var ele = createSVGElement('text', 'new');
1126
1127 ele.setAttribute('x', x);
1128 ele.setAttribute('y', y);
1129 ele.setAttribute('font-size', size);
1130 ele.setAttribute('fill', color);
1131 ele.textContent=txt;
1132
1133 return ele;
1134 }
1135
1136 function createSVGImage(fname, width, height, attrs){
1137 var ele = createSVGElement('image', 'new');
1138 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1139 ele.setAttribute('width', width);
1140 ele.setAttribute('height', height);
1141 setAttributes(ele, attrs);
1142
1143 return ele;
1144 }
1145
1146 function createSVGMarker(pid, id, child){
1147 var parent = document.getElementById(pid);
1148 if(!parent) return;
1149 var ele = createSVGElement('marker', pid+'_'+id);
1150 ele.appendChild(child);
1151 return ele;
1152 }
1153
1154 function setLeftArrow(){
1155 if( selectedItems.length == 1 ){
1156 setArrow(selectedItems[0], 'start', '');
1157 }
1158 }
1159
1160 function setRightArrow(){
1161 if( selectedItems.length == 1 ){
1162 setArrow(selectedItems[0], 'end', '');
1163 }
1164 }
1165
1166 function removeLeftArrow(){
1167 if( selectedItems.length == 1 ){
1168 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1169 var pid = selectedItems[0].getAttribute('id');
1170 var marker = document.getElementById(pid+'_startarrow');
1171 svg_defs.removeChild(marker);
1172 selectedItems[0].removeAttribute('marker-start');
1173 }
1174 }
1175
1176 function removeRightArrow(){
1177 if( selectedItems.length == 1 ){
1178 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1179 var pid = selectedItems[0].getAttribute('id');
1180 var marker = document.getElementById(pid+'_endarrow');
1181 svg_defs.removeChild(marker);
1182 selectedItems[0].removeAttribute('marker-end');
1183 }
1184 }
1185
1186 function hasArrow(pos){
1187 var pobj = selectedItems[0];
1188 if(!pobj) return false;
1189 var pid = pobj.getAttribute('id');
1190 var marker = document.getElementById(pid+'_'+pos+'arrow');
1191 if(marker) return true;
1192 return false;
1193 }
1194
1195 function getArrowMarker(obj,pos){
1196 if(!obj) return false;
1197 var pid = obj.getAttribute('id');
1198 var marker = document.getElementById(pid+'_'+pos+'arrow');
1199 return false;
1200 }
1201
1202 function setArrow(pobj, pos, type){
1203 if(!pobj) return;
1204 var pid = pobj.getAttribute('id');
1205 var marker = document.getElementById(pid+'_'+pos+'arrow');
1206 if(marker) return;
1207
1208 var obj = createSVGElement('path', 'new');
1209
1210 var refX = 0;
1211 var refY = 0;
1212
1213 switch(pos){
1214 case 'start':
1215 refX=10;
1216 refY=10;
1217 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1218 break;
1219 case 'end':
1220 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1221 refX= 10;
1222 refY=10;
1223 break;
1224 default:
1225 return;
1226 }
1227
1228 marker = createSVGMarker(pid, pos+'arrow' , obj);
1229 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1230
1231 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1232
1233 defSVGElement(marker);
1234 var mid = "url(#"+marker.getAttribute("id")+")";
1235 var mattr = "marker-"+pos;
1236 pobj.setAttribute(mattr, mid);
1237 }
1238
1239 function appendSVGObj(obj){
1240 var svg_top = document.getElementById('svg_top');
1241 if(!svg_top) return;
1242
1243 svg_top.appendChild(obj);
1244 }
1245
1246 function isChildById(element, id) {
1247 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1248 else if (element.parentNode.id == id) return true;
1249 else return isChildById(element.parentNode, id);
1250 }
1251
1252 /////////////////////// Formatting SVG DOM
1253 function escapeHTML(text) {
1254 return text.replace( /[<>"&]/g,
1255 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1256 );
1257 };
1258
1259 function formatTag(ele){
1260 var str="";
1261 if(ele.nodeType == 1){
1262 var tag_a = ele.tagName.split(':');
1263 var tag;
1264 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1265
1266 str += "<"+tag;
1267 var attrs = ele.attributes;
1268 for(var i=0; i<attrs.length; i++){
1269 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1270 }
1271 var cn = ele.childNodes;
1272 if(cn.length > 0){
1273 str +=">\n";
1274 for(var i=0; i<cn.length; i++){
1275 var tmp = trim(formatTag(cn[i]));
1276 if(tmp) str += " "+tmp+"\n";
1277 }
1278 str += "</"+tag+">";
1279 }else{
1280 str +=" />";
1281 }
1282 return str;
1283 }else if(ele.nodeType==3){
1284 return ele.textContent;
1285 }
1286 }
1287
1288 function getSVGContent(){
1289 if(!svg_top) return "";
1290
1291 var str = "";
1292 var elements = svg_top.childNodes;
1293 for(var i=0; i<elements.length; i++){
1294 if(elements[i] != svg_select){
1295 var tmp = trim(formatTag(elements[i]));
1296 if(tmp) str += tmp + '\n';
1297 }
1298 }
1299 return str;
1300 }
1301
1302 function trim(str){
1303 return str.replace(/(^\s+)|(\s+$)/g, "");
1304 }
1305
1306 /////// Access Server
1307 function newXMLRequest(){
1308 if(this.XMLHttpRequest){
1309 return new XMLHttpRequest();
1310 }else {
1311 return new ActiveXObject("Microsoft.XMLHTTP");
1312 }
1313 }
1314
1315 function createRequestData(data){
1316 var str="filetype=svg";
1317 for (var i in data){
1318 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1319 }
1320 return str;
1321 }
1322
1323 function postRequest(url, data, func){
1324 var postData=createRequestData(data);
1325 var obj=newXMLRequest();
1326
1327 obj.onreadystatechange = function(){
1328 if (obj.readyState == 4 && obj.status == 200){
1329 func(obj.responseText);
1330 }
1331 }
1332 obj.open("POST", url, true);
1333 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1334 obj.send(postData);
1335 }
1336
1337 function commnadFinishAlert(s){
1338 alert(s);
1339 }
1340
1341 function uploadFileData(transaction, results){
1342 var data = results.rows.item(0);
1343 var updata = new Array(0);
1344 updata['name']= data['name'];
1345 updata['datalob'] = data['datablob'];
1346 updata['cmd'] = 'upload'
1347
1348 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1349 }
1350
1351 function uploadFile(name){
1352 getFile(name, 'uploadFileData');
1353 }
1354
1355 function getRemoteFileList(){
1356 var data=new Array();
1357 data['name'] = "SVG";
1358 data['cmd'] = "list";
1359 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1360 }
1361
1362 function previewRemoteFile(content){
1363 previewFile(content);
1364 setMode('Preview');
1365 }
1366
1367 function getRemoteFile(name){
1368 var data=new Array();
1369 data['name'] = name;
1370 data['cmd'] = "get";
1371 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1372 }
1373
1374 function saveRemoteFile(content){
1375 var datadiv = document.getElementById('tempdata');
1376 var fname = datadiv.getAttribute('lfname');
1377 saveContentWithFilename(fname, content);
1378 }
1379
1380 function downloadFile(name){
1381 var data=new Array();
1382 data['name'] = name;
1383 data['cmd'] = "get";
1384 var datadiv = document.getElementById('tempdata');
1385 datadiv.setAttribute('lfname', name);
1386 postRequest(MgrPath+iSlideMgr, data, saveRemoteFile);
1387 }
1388
1389 function showRemoteFile(name){
1390 getRemoteFile(name);
1391 }
1392
1393 function downloadToFile(name){
1394 var downloadForm = "";
1395 downloadForm += "<form action=\"iSlideManager.php\" method=\"post\">";
1396 downloadForm += "<input type=\"hidden\" name=\"cmd\" value=\"download\">";
1397 downloadForm += "<input type=\"hidden\" name=\"name\" value=\""+name+"\">";
1398 downloadForm += "<input type=\"hidden\" name=\"filetype\" value=\"svg\">";
1399 downloadForm += "<input type=\"submit\">";
1400 downloadForm += "</form>";
1401
1402 var cmdForm = document.getElementById('cmdForm');
1403 cmdForm.innerHTML = downloadForm;
1404 cmdForm.firstChild.submit();
1405 }
1406
1407 //////// Event Handler
1408 function setInnerHTML(id, val){
1409 var itm=document.getElementById(id);
1410 if(itm) itm.innerHTML=val;
1411 }
1412
1413 function popupInfo(val){
1414 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1415 str += val;
1416 setInnerHTML('popup', str);
1417 showItemById('popup');
1418 }
1419
1420 function addAttributeVal(obj, itm, dv){
1421 if(obj.hasAttribute(itm)){
1422 var x = parseInt(obj.getAttribute(itm));
1423 x = x + dv;
1424 obj.setAttribute(itm, x)
1425 }
1426 }
1427
1428 function showSVGSource(){
1429 var str = getSVGContent();
1430 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1431 escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1432 // escstr += "<pre>"+escapeHTML(str)+"</pre>";
1433 escstr += "<textarea cols=\"130\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1434 setInnerHTML('popup', escstr);
1435 showItemById('popup');
1436 }
1437
1438
1439 function getElementTag(obj){
1440 if (!obj) return null;
1441 var tag = obj.tagName.split(':');
1442 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1443 return tag[0];
1444 }
1445
1446 function setSVGObjectProp(obj){
1447 var tag = getElementTag(obj);
1448 var res ="";
1449 switch(tag){
1450 case 'text':
1451 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1452 break;
1453 case 'rect':
1454 case 'circle':
1455 case 'ellipse':
1456 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1457 break;
1458 case 'path':
1459 case 'line':
1460 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1461 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1462 break;
1463 case 'image':
1464 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"));
1465 break;
1466 default:
1467 break;
1468 }
1469 if(res != ""){
1470 res += "<button onClick=\"updateSVGObj();\">Apply</button>";
1471 res += "<button onClick=\"delSVGObj();\">Del</button>";
1472 }
1473
1474 return res
1475 }
1476
1477 function updateSVGObj(){
1478 if(selectedItems.length != 1) return;
1479 var obj = selectedItems[0];
1480 var tag = getElementTag(obj);
1481 var res ="";
1482 switch(tag){
1483 case 'text':
1484 var txt=document.getElementById('svg_text');
1485 var color=document.getElementById('svg_color');
1486 var size=document.getElementById('svg_size');
1487 obj.textContent = txt.value;
1488 obj.setAttribute("fill", color.value);
1489 obj.setAttribute("font-size", size.value);
1490 break;
1491 case 'rect':
1492 case 'circle':
1493 case 'ellipse':
1494 var fill=document.getElementById('svg_fill');
1495 var color=document.getElementById('svg_color');
1496 var L=document.getElementById('svg_stroke');
1497 obj.setAttribute("fill", fill.value);
1498 obj.setAttribute("stroke", color.value);
1499 obj.setAttribute("stroke-width", L.value);
1500 break;
1501 case 'path':
1502 case 'line':
1503 var fill=document.getElementById('svg_fill');
1504 var color=document.getElementById('svg_color');
1505 var L=document.getElementById('svg_stroke');
1506 var dash=document.getElementById('svg_stroke_type');
1507 obj.setAttribute("fill", fill.value);
1508 obj.setAttribute("stroke", color.value);
1509 obj.setAttribute("stroke-width", L.value);
1510 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1511 var id = obj.getAttribute("id");
1512 var marker = document.getElementById(id+'_startarrow');
1513 if(marker) marker.setAttribute("fill", color.value);
1514 var marker = document.getElementById(id+'_endarrow');
1515 if(marker) marker.setAttribute("fill", color.value);
1516 break;
1517 case 'image':
1518 var fname=document.getElementById('svg_text');
1519 var w=document.getElementById('svg_w');
1520 var h=document.getElementById('svg_h');
1521 obj.setAttribute("xlink:href", fname.value);
1522 obj.setAttribute("width", w.value);
1523 obj.setAttribute("height", h.value);
1524 break;
1525 default:
1526 break;
1527 }
1528
1529 }
1530
1531 function delSVGObj(){
1532 if(selectedItems.length != 1) return;
1533 var obj = selectedItems[0];
1534
1535 if(!svg_top) return;
1536 svg_top.removeChild(obj);
1537 svg_select.setAttribute("visibility","hidden");
1538 }
1539
1540 ///// For MobileSafari
1541 function getPreviewX(x){ return x - preview.offsetLeft; }
1542 function getPreviewY(y){ return y - preview.offsetTop; }
1543
1544 function calcDit(x1, y1, x2, y2){
1545 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1546 }
1547
1548 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1549 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1550 }
1551
1552 function getAttributeVal(obj, name){
1553 try{
1554 return parseInt(obj.getAttribute(name));
1555 }catch(e){ return 0; }
1556 }
1557
1558 function checkIntersection(obj, x, y, ex, ey){
1559 if(!obj) return false;
1560 var res = true;
1561 var bbox = obj.getBBox();
1562 var ox = bbox.x;
1563 var oy = bbox.y;
1564 var oex = bbox.x+bbox.width;
1565 var oey = bbox.y+bbox.height;
1566 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1567
1568 var tag = getElementTag(obj);
1569 switch(tag){
1570 case 'circle':
1571 case 'ellipse':
1572 var cx = getAttributeVal(obj,"cx");
1573 var cy = getAttributeVal(obj,"cy");
1574 var rx = getAttributeVal(obj,"r");
1575 var ry = rx;
1576 if(!rx){
1577 var rx = getAttributeVal(obj,"rx");
1578 var ry = getAttributeVal(obj,"ry");
1579 }
1580
1581 if(res){
1582 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1583 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1584 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1585 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1586 }
1587 break;
1588 case 'path':
1589 var d = obj.getAttribute("d");
1590 var p = getPoints(d);
1591 for(var i=0;i<p.length;i++){
1592 var ox=p[i][0];
1593 var oy=p[i][1];
1594 if(x < ox && ox < ex && y < oy && oy < ey) {
1595 return true;
1596 }
1597 }
1598 return false;
1599 break;
1600 case 'line':
1601 var x1 = getAttributeVal(obj,"x1");
1602 var y1 = getAttributeVal(obj,"y1");
1603 var x2 = getAttributeVal(obj,"x2");
1604 var y2 = getAttributeVal(obj,"y2");
1605 var d = (y2-y1)/(x2-x1);
1606
1607 if(res){
1608 var xx = Math.abs(x2-x1);
1609 var sign = 1;
1610 if(x2-x1 < 0){ sign = -1; }
1611 for(var i=0; i < xx; i++){
1612 var nx = i*sign + x1;
1613 var ny = d * i*sign + y1;
1614 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1615 }
1616 }
1617 return false;
1618
1619 return res;
1620 break;
1621 case 'text':
1622 case 'rect':
1623 case 'polygon':
1624 case 'polyline':
1625 case 'image':
1626 break;
1627 default:
1628 res=false;
1629 break;
1630 }
1631 return res;
1632 }
1633
1634 function getBoundingBox(obj){
1635 var res = new Array(4);
1636 var bbox = obj.getBBox();
1637 res[0] = bbox.x-1;
1638 res[1] = bbox.y-1;
1639 res[2] = bbox.x+bbox.width+2;
1640 res[3] = bbox.y+bbox.height+2;
1641 return res;
1642 }
1643
1644 function setSelectBox(){
1645 if(!svg_select) return;
1646
1647 if(selectedItems.length == 0){
1648 svg_select.setAttribute("visibility","hidden");
1649 return;
1650 }
1651
1652 var bbox = new Array(4);
1653 bbox[0] = 1000;
1654 bbox[1] = 1000;
1655 bbox[2] = 0;
1656 bbox[3] = 0;
1657
1658 for(var i=0;i<selectedItems.length;i++){
1659 var bp = getBoundingBox(selectedItems[i]);
1660 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1661 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1662 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1663 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1664 }
1665 svg_select.setAttribute("x", bbox[0]);
1666 svg_select.setAttribute("y", bbox[1]);
1667 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1668 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1669 svg_select.setAttribute("visibility","visible;");
1670 }
1671
1672 function getSelectedObjects(x1, y1, x2, y2){
1673 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1674 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1675
1676 var val="";
1677 if(svg_top){
1678 var val ="";
1679 var objs = svg_top.childNodes;
1680 selectedItems = new Array();
1681 for(var i=0; i<objs.length;i++){
1682 if(objs[i].tagName){
1683
1684 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1685 selectedItems.push(objs[i]);
1686 }
1687 val += objs[i].tagName+" ";
1688 }
1689 }
1690 }
1691 setSelectBox();
1692 }
1693
1694 function onTouchStartCore(){
1695 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1696 var x1=getPreviewX(sx-1);
1697 var y1=getPreviewY(sy-1);
1698 var x2=getPreviewX(sx+2);
1699 var y2=getPreviewY(sy+2);
1700 getSelectedObjects(x1, y1, x2, y2);
1701
1702 if(selectedItems.length == 0){
1703 setSVGMode('selector');
1704 }else if(selectedItems.length == 1){
1705 targetItem=selectedItems[0];
1706 setSVGMode(getElementTag(targetItem));
1707 }else{
1708 setSVGMode('Group');
1709 }
1710 }else { // CreateMode
1711 if(selectedItems.length == 0){
1712
1713 var fill=document.getElementById('svg_fill');
1714 var color=document.getElementById('svg_color');
1715 var L=document.getElementById('svg_stroke');
1716
1717 var x = getPreviewX(sx);
1718 var y = getPreviewY(sy);
1719
1720 switch(modeSVG){
1721 case 'text':
1722 var txt=document.getElementById('svg_text');
1723 var size=document.getElementById('svg_size');
1724 if(txt.value){
1725 y = y + parseInt(size.value)*0.8;
1726 targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1727 }else{
1728 putInputForm(x, y, txt.value, size.value);
1729 }
1730 break;
1731 case 'rect':
1732 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1733 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1734 break;
1735 case 'circle':
1736 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1737 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1738 break;
1739 case 'ellipse':
1740 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1741 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1742 break;
1743 case 'newPath':
1744 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1745 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1746 break;
1747 case 'newLine':
1748 var x2=x+1;
1749 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1750 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1751 break;
1752 case 'image':
1753 var attr = 'x='+x+',y='+y;
1754 var txt=document.getElementById('svg_text');
1755 var w=document.getElementById('svg_w');
1756 var h=document.getElementById('svg_h');
1757 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1758 default:
1759 break;
1760 }
1761 if (targetItem){
1762 appendSVGObj(targetItem);
1763 selectedItems[0]=targetItem;
1764 }
1765 }else{
1766 var x1=getPreviewX(sx-1);
1767 var y1=getPreviewY(sy-1);
1768 var x2=getPreviewX(sx+2);
1769 var y2=getPreviewY(sy+2);
1770 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1771 setSVGMode('selector');
1772 }
1773 }
1774 }
1775 }
1776
1777
1778 function onDoubleTap(e){
1779 if(selectedItems.length == 1 ){
1780 svg_select.setAttribute("visibility","hidden");
1781
1782 var obj = selectedItems[0];
1783 switch(obj.tagName){
1784 case 'svg:text':
1785 case 'text':
1786 var txt = trim(obj.textContent);
1787 var size = parseInt(obj.getAttribute("font-size"));
1788 var x = parseInt(obj.getAttribute("x"));
1789 var y = parseInt(obj.getAttribute("y"));
1790 x = x-20;
1791 y = y-size*0.8 -10;
1792 putInputForm(x, y, txt, size, obj.id);
1793 obj.style.display = 'none';
1794 editingTextObj = obj;
1795 break;
1796 default:
1797 break;
1798 }
1799 return false;
1800 }
1801 }
1802
1803 function getPoints(d){
1804 var p = d.split(' ');
1805 var res = new Array();
1806 var isx=true;
1807 var x, y;
1808 for(var i=0; i<p.length;i++){
1809 if(p[i].match('[MLHVCSQTA]','i')){
1810 }else{
1811 if(isx){
1812 x = parseInt(p[i]);
1813 }else{
1814 y = parseInt(p[i]);
1815 res.push(new Array(x, y));
1816 }
1817 isx = !isx;
1818 }
1819 }
1820 return res;
1821 }
1822
1823 function updatePath(d, x, y){
1824 var p = d.split(' ');
1825 var res = "";
1826 var isx=true;
1827 var val;
1828 for(var i=0; i<p.length;i++){
1829 if(p[i].match('[MLHVCSQTA]','i')){
1830 res += ' '+p[i];
1831 }else{
1832 if(isx){
1833 val = parseInt(p[i])+x;
1834 }else{
1835 val = parseInt(p[i])+y;
1836 }
1837
1838 res += ' '+ val;
1839 isx = !isx;
1840 }
1841 }
1842 return trim(res);
1843 }
1844
1845 function updateTransform(obj){
1846 try{
1847 var trans = obj.getAttribute("transform");
1848 if(!trans) return;
1849 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1850 var str = RegExp.lastMatch;
1851 var vals = str.substr(10,str.length-11).split(',') ;
1852 var dx = parseInt(vals[0]);
1853 var dy = parseInt(vals[1]);
1854 switch(getElementTag(obj)){
1855 case 'text':
1856 case 'rect':
1857 case 'image':
1858 addAttributeVal(obj, "x", dx);
1859 addAttributeVal(obj, "y", dy);
1860 break;
1861 case 'circle':
1862 case 'ellipse':
1863 addAttributeVal(obj, "cx", dx);
1864 addAttributeVal(obj, "cy", dy);
1865 break;
1866
1867 case 'path':
1868 var path = obj.getAttribute("d");
1869 obj.setAttribute("d", updatePath(path, dx, dy));
1870 break;
1871 case 'line':
1872 var x1 = getAttributeVal(obj,"x1");
1873 var y1 = getAttributeVal(obj,"y1");
1874 var x2 = getAttributeVal(obj,"x2");
1875 var y2 = getAttributeVal(obj,"y2");
1876 obj.setAttribute("x1", x1+dx);
1877 obj.setAttribute("y1", y1+dy);
1878 obj.setAttribute("x2", x2+dx);
1879 obj.setAttribute("y2", y2+dy);
1880
1881 break;
1882 default:
1883 break;
1884 }
1885 obj.removeAttribute("transform");
1886 }
1887 }catch (e){
1888 }
1889 }
1890
1891 function moveSelectedRectangle(dx, dy){
1892 if(!svg_select) return;
1893 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1894 }
1895
1896 function updateSelectedRectangle(){
1897 if(!svg_select) return;
1898 if(selectedItems.length > 0){
1899 svg_select.setAttribute("visibility","visible");
1900 }else{
1901 svg_select.setAttribute("visibility","hidden");
1902 }
1903 }
1904
1905 function clearSelectedItems(){
1906 for(i in selectedItems) delete selectedItems[i];
1907 }
1908
1909 function onTouchMoveCode1(pageX, pageY){
1910 if(targetItem || selectedItems.length > 0){
1911 switch(modeSVG){
1912 case 'newPath':
1913 if(targetItem.tagName == 'path' ){
1914 var path = targetItem.getAttribute("d");
1915 path = path + ' '+ getPreviewX(pageX) + ' '+ getPreviewY(pageY) ;
1916 targetItem.setAttribute("d",path);
1917 }
1918 break;
1919 case 'newLine':
1920 if(targetItem.tagName == 'line' ){
1921 var x2 = getPreviewX(pageX);
1922 var y2 = getPreviewY(pageY);
1923 targetItem.setAttribute("x2",x2);
1924 targetItem.setAttribute("y2",y2);
1925 }
1926 break;
1927
1928 default:
1929 var dx = pageX - sx;
1930 var dy = pageY - sy;
1931
1932 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1933 var lx = getPreviewX(pageX);
1934 var ly = getPreviewY(pageY);
1935
1936 if(!lineEdit){
1937 var x1 = getAttributeVal(selectedItems[0],"x1");
1938 var y1 = getAttributeVal(selectedItems[0],"y1");
1939 var x2 = getAttributeVal(selectedItems[0],"x2");
1940 var y2 = getAttributeVal(selectedItems[0],"y2");
1941 var xc = (x1+x2)/2;
1942 var yc = (y1+y2)/2;
1943 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1944 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1945 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1946
1947 var minVal = Math.min(eS, Math.min(eC, eE));
1948 if(minVal == eS) lineEdit='start';
1949 else if(minVal == eE) lineEdit='end';
1950 else lineEdit='move';
1951 }
1952 if(lineEdit=='start'){
1953 selectedItems[0].setAttribute("x1",lx );
1954 selectedItems[0].setAttribute("y1",ly );
1955 setSelectBox();
1956 }else if(lineEdit == 'end'){
1957 selectedItems[0].setAttribute("x2",lx );
1958 selectedItems[0].setAttribute("y2",ly );
1959 setSelectBox();
1960 }else{
1961 selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1962 moveSelectedRectangle(dx, dy);
1963 }
1964 }else{
1965 for(var i=0; i<selectedItems.length;i++){
1966 if(selectedItems[i]) selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1967 }
1968 moveSelectedRectangle(dx, dy);
1969 }
1970 break;
1971 }
1972 updateShowMenu();
1973 }else if(modeSVG == 'selector'){
1974 ex = pageX;
1975 ey = pageY;
1976 var x1=sx;
1977 var y1=sy;
1978 var x2=ex;
1979 var y2=ey;
1980
1981 if(sx > ex){ x1=ex; x2=sx; }
1982 if(sy > ey){ y1=ey; y2=sy; }
1983
1984 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1985 }
1986 }
1987
1988 function svgInputTextExec(e){
1989 var inputform = document.getElementById('svg_input');
1990 var color=document.getElementById('svg_color');
1991 var size=document.getElementById('svg_size');
1992 if(!color || !size) return;
1993 var y = parseInt(inputform.style.top) + parseInt(size.value)*0.8 + 12;
1994 var x = parseInt(inputform.style.left) + 12;
1995 if(inputform.value){
1996 targetItem=createSVGText(inputform.value, x, y, size.value, color.value);
1997
1998 appendSVGObj(targetItem);
1999 }
2000 inputform.setAttribute("type", "hidden");
2001 setSVGMode('selector');
2002 }
2003
2004 function svgModifyTextExec(e){
2005 var inputform = document.getElementById('svg_input');
2006 editingTextObj.textContent = inputform.value;
2007 inputform.setAttribute("type", "hidden");
2008 editingTextObj.style.display='block';
2009
2010 editingTextObj=null;
2011 setSVGMode('selector');
2012 }
2013
2014 function svgInputFormAdjust(e){
2015 var inputform = document.getElementById('svg_input');
2016 inputform.size = jstrlen(inputform.value) + 1;
2017 }
2018
2019 function jstrlen(str) {
2020 var len = 0;
2021 str = escape(str);
2022 for (var i = 0; i < str.length; i++, len++) {
2023 if (str.charAt(i) == "%") {
2024 if (str.charAt(++i) == "u") {
2025 i += 3;
2026 len++;
2027 }
2028 i++;
2029 }
2030 }
2031 return len;
2032 }
2033
2034 function putInputForm(x, y, txt, size, id){
2035 var inputform = document.getElementById('svg_input');
2036 if(!inputform){
2037 inputform = document.createElement('input');
2038 inputform.setAttribute("id", "svg_input");
2039 inputform.setAttribute("style", "position:absolute;top:0px;left:0px; border:0px none");
2040 preview.appendChild(inputform);
2041 }
2042
2043 if(document.addEventListner){
2044 if(id){
2045 inputform.addEventListener("onChange", svgModifyTextExec,false);
2046 }else{
2047 inputform.addEventListener("onChange", svgInputTextExec,false);
2048 }
2049 inputform.addEventListener("onkeydown", svgInputFormAdjust,false);
2050 }else{
2051 if(id){
2052 inputform.setAttribute("onChange", "svgModifyTextExec()");
2053 }else{
2054 inputform.setAttribute("onChange", "svgInputTextExec()");
2055 }
2056 inputform.setAttribute("onkeydown", "svgInputFormAdjust()");
2057 }
2058
2059 inputform.setAttribute("type", "text");
2060 inputform.style.left=x+'px';
2061 inputform.style.top=y+'px';
2062 inputform.style.fontSize=size+'px';
2063 inputform.style.background='none';
2064 inputform.value = txt;
2065 inputform.size = jstrlen(txt) + 1;
2066 inputform.focus();
2067 }
2068
2069 ///// EventHandler for iPad
2070 var firstTouch = new Date();
2071
2072 function onTouchStart(e){
2073 //e.preventDefault();
2074 sx=e.touches[0].pageX;
2075 sy=e.touches[0].pageY;
2076 ex=e.touches[0].pageX;
2077 ey=e.touches[0].pageY;
2078
2079 if (e.touches.length == 1){
2080 var touchtime = new Date();
2081 var dt = touchtime.getTime() - firstTouch.getTime();
2082 if(editingTextObj){
2083 var inputform = document.getElementById('svg_input');
2084 inputform.setAttribute("type", "hidden");
2085 editingTextObj.style.display='block';
2086 editingTextObj=null;
2087 }
2088
2089 if(dt < 300 ){
2090 onDoubleTap();
2091 }else{
2092 onTouchStartCore();
2093 }
2094 firstTouch = touchtime;
2095 }
2096
2097 updateSelectedRectangle();
2098 }
2099
2100 function onTouchMove(e){
2101
2102 if (e.touches.length == 1){
2103 e.preventDefault();
2104 onTouchMoveCode1(e.touches[0].pageX, e.touches[0].pageY);
2105 }else if (e.touches.length == 2){
2106 e.preventDefault();
2107 var dx = e.touches[0].pageX-e.touches[1].pageX;
2108 var dy = e.touches[0].pageY-e.touches[1].pageY;
2109 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2110
2111 if(th > 165 || th < 25) svg_scale_dir = 'x';
2112 else if(th > 65 && th < 115) svg_scale_dir = 'y';
2113 else svg_scale_dir = null;
2114 }
2115 }
2116
2117 function onTouchEnd(e){
2118 e.preventDefault();
2119
2120 for(var i=0; i<selectedItems.length;i++){
2121 updateTransform(selectedItems[i]);
2122 }
2123
2124 if(modeSVG == 'selector'){
2125 var x1 = getPreviewX(sx);
2126 var y1 = getPreviewY(sy);
2127 var x2 = getPreviewX(ex);
2128 var y2 = getPreviewY(ey);
2129 getSelectedObjects(x1, y1, x2, y2);
2130 }
2131
2132 updateSelectedRectangle();
2133 updateTransform(svg_select);
2134
2135 setSelectBox();
2136 updateShowMenu();
2137 var btn = document.getElementById('b_'+modeSVG);
2138 if(btn){
2139 btn.style.border="3px solid red";
2140 }
2141 lineEdit=null;
2142 }
2143
2144
2145 function onGestureStart(e){
2146 targetItem = selectedItems[0];
2147 if(targetItem){
2148 svg_wo = targetItem.getAttribute("width");
2149 svg_ho = targetItem.getAttribute("height");
2150 svg_ro = targetItem.getAttribute("r");
2151 svg_rxo = targetItem.getAttribute("rx");
2152 svg_ryo = targetItem.getAttribute("ry");
2153 svg_fsize = targetItem.getAttribute("font-size");
2154 }else{
2155 svg_wo = null;
2156 svg_ho = null;
2157 svg_ro = null;
2158 svg_rxo = null;
2159 svg_ryo = null;
2160 svg_fsize = null;
2161 }
2162 }
2163
2164 function onGestureChange(e){
2165 var scale = e.scale;
2166 var rotation = e.rotation;
2167
2168 if(targetItem){
2169 e.preventDefault();
2170 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
2171 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
2172 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
2173 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
2174 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
2175 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
2176
2177 updateShowMenu();
2178 }
2179 }
2180
2181 function onGestureEnd(e){
2182 // e.preventDefault();
2183 svg_wo = null;
2184 svg_ho = null;
2185 svg_ro = null;
2186 svg_rxo = null;
2187 svg_ryo = null;
2188 svg_fsize = null;
2189 }
2190
2191 function onTouchStartColor(e){
2192 if(e.touches.length == 1){
2193 var ele = e.touches[0].target;
2194 var color;
2195 try{
2196 color = ele.getAttribute("color-val");
2197 }catch(err){ hideItemById('color-palette'); return;}
2198 var palette = document.getElementById('color-palette');
2199 var color_sel = palette.getAttribute("targetType");
2200 var fill_input = document.getElementById('svg_fill');
2201 var color_input = document.getElementById('svg_color');
2202 if(color) {
2203 for(var i=0;i < selectedItems.length; i++){
2204 selectedItems[i].setAttribute(color_sel, color);
2205 if(color_sel == 'fill'){
2206 if(fill_input) fill_input.value=color;
2207 document.getElementById('toolFill').style.backgroundColor=color;
2208 }else{
2209 color_input.value=color;
2210 document.getElementById('toolStroke').style.backgroundColor=color;
2211 }
2212 }
2213 }
2214 palette.style.display='none';
2215 }
2216 }
2217 ///// For Safari
2218 var mouse_state=0;
2219
2220 function onMouseDown(e){
2221 mouse_state=e.which;
2222
2223 sx=e.pageX;
2224 sy=e.pageY;
2225 x=e.pageX;
2226 ey=e.pageY;
2227
2228 if(isChildById(e.target, 'preview') || e.target.id == 'preview') {
2229 if(editingTextObj){
2230 var inputform = document.getElementById('svg_input');
2231 inputform.setAttribute("type", "hidden");
2232 editingTextObj.style.display='block';
2233 editingTextObj=null;
2234 }
2235
2236 if(e.altKey){
2237 targetItem = selectedItems[0];
2238 if(targetItem){
2239 svg_wo = targetItem.getAttribute("width");
2240 svg_ho = targetItem.getAttribute("height");
2241 svg_ro = targetItem.getAttribute("r");
2242 svg_rxo = targetItem.getAttribute("rx");
2243 svg_ryo = targetItem.getAttribute("ry");
2244 svg_fsize = targetItem.getAttribute("font-size");
2245 }else{
2246 svg_wo = null;
2247 svg_ho = null;
2248 svg_ro = null;
2249 svg_rxo = null;
2250 svg_ryo = null;
2251 svg_fsize = null;
2252 }
2253 }else{
2254 onTouchStartCore();
2255 }
2256 updateSelectedRectangle();
2257 return false;
2258 }else if(isChildById(e.target, 'color-palette') && e.target.tagName == 'DIV'){
2259 var ele = e.target;
2260 var palette = document.getElementById('color-palette');
2261 var color = ele.getAttribute("color-val");
2262 var color_sel = palette.getAttribute("targetType");
2263 var fill_input = document.getElementById('svg_fill');
2264 var color_input = document.getElementById('svg_color');
2265 if(color) {
2266 for(var i=0;i < selectedItems.length; i++){
2267 selectedItems[i].setAttribute(color_sel, color);
2268 if(color_sel == 'fill'){
2269 fill_input.value=color;
2270 document.getElementById('toolFill').style.backgroundColor=color;
2271 }else{
2272 color_input.value=color;
2273 document.getElementById('toolStroke').style.backgroundColor=color;
2274 }
2275 }
2276 palette.style.display='none';
2277 }
2278 return false;
2279 }
2280 return true;
2281 }
2282
2283 function onMouseMove(e){
2284 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2285
2286 if(mouse_state == 1) {
2287 if(e.altKey){
2288 var dx = sx-e.pageX;
2289 var dy = sy-e.pageY;
2290 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2291 var scale;
2292
2293 if(th > 165 || th < 25){
2294 svg_scale_dir = 'x';
2295 scale = -dx/50;
2296 }else if(th > 65 && th < 115){
2297 svg_scale_dir = 'y';
2298 scale = -dy/50;
2299 }else{
2300 svg_scale_dir = null;
2301 if(dx > 0 && dy > 0) scale = -dx*dy/2500;
2302 else if(dx < 0 && dy < 0) scale = dx*dy/2500;
2303 else scale = 1;
2304 }
2305
2306 if(scale >= 0){
2307 if(scale < 1) scale=1;
2308 }else{
2309 if(scale > -1) scale=1;
2310 else{
2311 scale= -1/scale;
2312 }
2313 }
2314 if(targetItem){
2315 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
2316 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
2317 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
2318 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
2319 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
2320 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
2321
2322 updateShowMenu();
2323 }
2324 }else {
2325 onTouchMoveCode1(e.pageX, e.pageY);
2326 }
2327 }
2328
2329 return false;
2330 }
2331
2332 function onMouseUp(e){
2333 mouse_state = 0;
2334 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2335
2336 for(var i=0; i<selectedItems.length;i++){
2337 updateTransform(selectedItems[i]);
2338 }
2339
2340 if(modeSVG == 'selector'){
2341 var x1 = getPreviewX(sx);
2342 var y1 = getPreviewY(sy);
2343 var x2 = getPreviewX(ex);
2344 var y2 = getPreviewY(ey);
2345 getSelectedObjects(x1, y1, x2, y2);
2346 }
2347
2348 updateSelectedRectangle();
2349 updateTransform(svg_select);
2350
2351 setSelectBox();
2352 updateShowMenu();
2353 var btn = document.getElementById('b_'+modeSVG);
2354 if(btn){
2355 btn.style.border="3px solid red";
2356 }
2357 lineEdit=null;
2358
2359 }
2360
2361 if(!navigator.userAgent.match("iPad")){
2362 document.onmousedown=onMouseDown;
2363 document.onmousemove=onMouseMove;
2364 document.onmouseup=onMouseUp;
2365 document.ondblclick=onDoubleTap;
2366 }
2367

Properties

Name Value
svn:executable *

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26