Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 65 - (show annotations) (download) (as text)
Fri Jul 30 02:52:09 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 85987 byte(s)
grouing partially supported
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 var svg_rotate_locked = false;
64 var svg_scale_locked = false;
65
66 var dupItems;
67 var dupX;
68 var dupY;
69 var is_newPath;
70
71 var firstTouch = new Date();
72
73 var lineW = new Array(0.25,0.5,0.75,1,1.5,2.25,3,4.5,6);
74 var StrokeDash = new Array("", "2", "6 2", "6 2 1 2", "8 2", "8 2 1 2", "8 2 1 2 1 2" );
75
76 ///// Color
77 var colors=new Array('none', '#ffffff',
78 '#000000', '#3f3f3f', '#7f7f7f', '#bfbfbf',
79 '#ff0000', '#ff7f00', '#ffff00', '#7fff00',
80 '#00ff00', '#00ff7f', '#00ffff', '#007fff',
81 '#0000ff', '#7f00ff', '#ff00ff', '#ff007f',
82 '#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
83 '#007f00', '#007f3f', '#007f7f', '#003f7f',
84 '#00007f', '#3f007f', '#7f007f', '#7f003f',
85 '#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
86 '#ffaaaa', '#ffd4aa', '#ffffaa', '#d4ffaa',
87 '#aaffaa', '#aaffd4', '#aaffff', '#aad4ff',
88 '#aaaaff', '#d4aaff', '#ffaaff', '#ffaad4'
89 );
90
91 //// Initialize
92 function initEditor(name, dispname, size){
93 systemDB = initDB(name, dispname, size);
94 fileSelector();
95 preview=document.getElementById('preview');
96 if(preview){
97 preview.addEventListener("touchstart", onTouchStart,false);
98 preview.addEventListener("touchmove", onTouchMove, false);
99 preview.addEventListener("touchend", onTouchEnd, false);
100 preview.addEventListener("gesturestart", onGestureStart,false);
101 preview.addEventListener("gesturechange", onGestureChange, false);
102 preview.addEventListener("gestureend", onGestureEnd, false);
103 }
104 restoreValues();
105 }
106
107 //// localStorage
108 function restoreValues(){
109 if(typeof(localStorage) == 'undefined'){ alert('local storage not suported'); }
110 MgrPath = localStorage.getItem('MgrPath') ? localStorage.getItem('MgrPath') : "";
111 window.onbeforeuload=function(){ return saveChanges(); }
112 }
113
114 function clearAll(){
115 localsStorage.clear();
116 restoreValudes();
117 }
118
119 function saveChanges(){
120 localStorage.setItem('MgrPath', MgrPath);
121 }
122
123 // initialize a database
124 function initDB(name, dispname, size) {
125 try {
126 if (!window.openDatabase) {
127 alert('not supported');
128 } else {
129 var version = '1.0';
130 var myDB = openDatabase(name, version, dispname, size);
131 }
132 }catch(e){
133 if (e == INVALID_STATE_ERR){ alert("Invalid database version."); }else{ alert("Unknown error "+e+"."); }
134 return null;
135 }
136 createTables(myDB);
137 return myDB;
138 }
139
140 function createTables(db) {
141 db.transaction(
142 function (transaction) {
143 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);
144 transaction.executeSql('CREATE TABLE IF NOT EXISTS filedata(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, datablob BLOB NOT NULL DEFAULT "");', [], nullDataHandler, errorHandler);
145 }
146 );
147 }
148
149 function dropTables(db) {
150 db.transaction(
151 function (transaction) {
152 transaction.executeSql('DROP TABLE files;');
153 transaction.executeSql('DROP TABLE filedata;');
154 }
155 );
156 }
157
158 /// Create New File
159 function reallyCreateNewFileAction(name, db){
160 var myDB = db;
161 if(!db) myDB = systemDB;
162
163 myDB.transaction(
164 function (transaction) {
165 var myfunc = new Function("transaction","results","transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+name+"', results.insertId], nullDataHandler, killTransaction);");
166
167 transaction.executeSql('INSERT INTO filedata (datablob) VALUES ("");', [], myfunc, errorHandler);
168 }
169 );
170 fileSelector();
171 }
172
173 function createNewFileAction(db){
174 var myDB = db;
175 if(!db) myDB = systemDB;
176
177 var name = document.getElementById('createFilename').value
178 if(name == "") {
179 if (confirm('Filename is required, try agein?')) { createNewFile(); }else{ fileSelector(); }
180 return;
181 }
182
183 myDB.transaction(
184 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
185 "function (transaction, results) {"+
186 "if(results.rows.length == 0){"+
187 "reallyCreateNewFileAction('"+name+"');"+
188 "}else{"+
189 "if (confirm(results.rows.item(0)['name']+' already exist, try agein?')) {"+
190 "createNewFile();"+
191 "}else{"+
192 "fileSelector();"+
193 "}"+
194 "}"+
195 "}, errorHandler);")
196 );
197
198 }
199
200 //// Delete File
201 function deleteUpdateResults(transaction, results){
202 if (results.rowsAffected) {
203 fileSelector();
204 }
205 }
206
207 function reallyDelete(id, db){
208 var myDB = db;
209 if(!db) myDB = systemDB;
210
211 myDB.transaction(
212 new Function("transaction",
213 "transaction.executeSql('DELETE FROM files where id=?;', [ "+id+" ], null, errorHandler);"
214 +"transaction.executeSql('DELETE FROM filedata where id=?;', [ "+id+" ], deleteUpdateResults, errorHandler);")
215 );
216 }
217
218 function deleteFile(name, db){
219 var myDB = db;
220 if(!db) myDB = systemDB;
221
222 myDB.transaction(
223 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
224 "function (transaction, results) {"+
225 "if (confirm('Really delete '+results.rows.item(0)['name']+'?')) {"+
226 "reallyDelete(results.rows.item(0)['id']);"+
227 "}"+
228 "}, errorHandler);")
229 );
230 }
231
232 function reallyDeleteAll(db){
233 var myDB = db;
234 if(!db) myDB = systemDB;
235
236 myDB.transaction(
237 new Function("transaction",
238 "transaction.executeSql('DELETE FROM files;',[],null, errorHandler);"
239 +"transaction.executeSql('DELETE FROM filedata;',[],deleteUpdateResults, errorHandler);")
240 );
241 }
242
243 function deleteAllFile(db){
244 if (confirm('Really delete all file?')) {
245 reallyDeleteAll(db);
246 }
247 }
248
249 ///// Rename
250 function reallyRenameFileAction(id, newname, db){
251 var myDB = db;
252 if(!db) myDB = systemDB;
253
254 myDB.transaction(
255 function (transaction) {
256 transaction.executeSql('UPDATE files set name=? where id=?;', [newname,id ], null, errorHandler);
257 }
258 );
259 fileSelector();
260 }
261
262 function renameFileAction(db){
263 var myDB = db;
264 if(!db) myDB = systemDB;
265
266 var new_name = document.getElementById('newFilename').value
267 var id = document.getElementById('fileId').value
268
269 if(new_name == "") {
270 alert('Filename is required.');
271 fileSelector();
272 return;
273 }
274
275 myDB.transaction(
276 new Function("transaction",
277 "transaction.executeSql('SELECT id,name from files where name=?;',['"+new_name+"'],"+
278 "function (transaction, results) {"+
279 "if(results.rows.length == 0){"+
280 "reallyRenameFileAction('"+id+"','"+new_name+"');"+
281 "}else{"+
282 "alert(results.rows.item(0)['name']+' already exist');"+
283 "fileSelector();"+
284 "}"+
285 "}, errorHandler);")
286 );
287
288 }
289
290 /// Save File
291 function saveFile(db){
292 var myDB = db;
293 if(!db) myDB = systemDB;
294
295 var editarea = document.getElementById('editarea');
296 var contents = "";
297 contents = editarea.value;
298
299 myDB.transaction(
300 function (transaction) {
301 var datadiv = document.getElementById('tempdata');
302 var filedata_id = datadiv.getAttribute('lfdataid');
303
304 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
305 [ contents, filedata_id ], nullDataHandler, errorHandler);
306
307 alert('Saved.');
308 }
309 );
310 }
311
312 function saveData(db){
313 var myDB = db;
314 if(!db) myDB = systemDB;
315
316 var contents = "";
317 contents = getSVGContent();
318
319 myDB.transaction(
320 function (transaction) {
321 var datadiv = document.getElementById('tempdata');
322 var filedata_id = datadiv.getAttribute('lfdataid');
323
324 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
325 [ contents, filedata_id ], nullDataHandler, errorHandler);
326
327 alert('Saved.');
328 }
329 );
330 }
331
332 function saveContent(contents, db){
333 var myDB = db;
334 if(!db) myDB = systemDB;
335
336 if(!contents) {
337 alert("Invalid content");
338 return;
339 }
340
341 myDB.transaction(
342 function (transaction) {
343 var datadiv = document.getElementById('tempdata');
344 var filedata_id = datadiv.getAttribute('lfdataid');
345
346 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
347 [ contents, filedata_id ], nullDataHandler, errorHandler);
348
349 alert('Saved.');
350 }
351 );
352 }
353
354 function reallySaveNewFileAction(fname, db){
355 var myDB = db;
356 if(!db) myDB = systemDB;
357
358 var datadiv = document.getElementById('tempdata');
359 content = datadiv.textContent;
360
361 myDB.transaction(
362 function (transaction) {
363 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+fname+"', results.insertId], nullDataHandler, killTransaction);");
364
365 transaction.executeSql('INSERT INTO filedata (datablob) VALUES (?);', [content], myfunc, errorHandler);
366 }
367 );
368 datadiv.textContent="";
369 alert("download to "+fname);
370 }
371
372 function saveContentFilename(id, db){
373 var datadiv = document.getElementById('tempdata');
374 datadiv.setAttribute('lfdataid', id);
375 saveContent(datadiv.innerHTML, db);
376 datadiv.textContent="";
377 }
378
379 function saveContentWithFilename(fname, contents, db){
380 var myDB = db;
381 if(!db) myDB = systemDB;
382 if(!contents) { alert("Invalid content"); return; }
383
384 var datadiv = document.getElementById('tempdata');
385 datadiv.setAttribute('lfname', fname);
386 datadiv.textContent = contents;
387
388 myDB.transaction(
389 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+fname+"'],"+
390 "function (transaction, results) {"+
391 "if(results.rows.length == 0){"+
392 "reallySaveNewFileAction('"+fname+"');"+
393 "}else{"+
394 "if (confirm(results.rows.item(0)['name']+' already exist, Overwrite?')) {"+
395 "saveContentFilename(results.rows.item(0)['id']);"+
396 "}else{"+
397 "fileSelector();"+
398 "}"+
399 "}"+
400 "}, errorHandler);")
401 );
402
403 }
404
405 function showFileData(transaction, results){
406 var data = results.rows.item(0);
407 var filename = data['name'];
408 var filedata = data['datablob'];
409
410 var datadiv = document.getElementById('tempdata');
411 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
412 document.title=filename;
413
414 previewFile(filedata);
415
416 updateShowMenu();
417 setMode('Preview');
418 }
419
420 function showFile(name){ getFile(name, 'showFileData'); }
421
422 function getFile(name, func, db){
423 var myDB = db;
424 if(!db) myDB = systemDB;
425
426 var datadiv = document.getElementById('tempdata');
427 if(datadiv) datadiv.setAttribute('lfname', name);
428
429 myDB.transaction(
430 function (transaction) {
431 transaction.executeSql('SELECT * from files, filedata where files.name=? and files.filedata_id = filedata.id;', [name], eval(func), errorHandler);
432 }
433 );
434 }
435
436 // Error Handlers
437 function killTransaction(transaction, error){ return true; }
438
439 function errorHandler(transaction, error){
440 alert('Oops. Error was '+error.message+' (Code '+error.code+')');
441
442 var we_think_this_error_is_fatal = true;
443 if (we_think_this_error_is_fatal) return true;
444 return false;
445 }
446
447 function nullDataHandler(transaction, results){ }
448
449 /////////
450 function fileSelector(db) {
451 var myDB = db;
452 if(!db) myDB = systemDB;
453
454 myDB.transaction(
455 function (transaction) {
456 transaction.executeSql("SELECT * from files where deleted=0;", [ ],
457 function (transaction, results) {
458 var filelist = '';
459 var menuDiv = document.getElementById('menuDiv');
460 if(menuDiv){
461 for(var i=0; i<results.rows.length; i++) {
462 var row = results.rows.item(i);
463 filelist = filelist + fileEntry(row);
464 }
465 if (filelist == "") {
466 filelist = "No files.<br />\n";
467 } else {
468 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
469 }
470 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+createMenuBar()+filelist;
471 }
472 }, errorHandler);
473 }
474 );
475 setMode('List');
476 }
477
478 function fileSelectorOnServer(val) {
479 var filelist = '';
480 var menuDiv = document.getElementById('menuDiv');
481 var results = val.split(',');
482
483 if(menuDiv){
484 for(var i=0; i<results.length; i++) {
485 var row = results[i];
486 filelist = filelist + fileEntryOnServer(row);
487 }
488 if (filelist == "") {
489 filelist = "No files.<br />\n";
490 } else {
491 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
492 }
493 var Menu = "<button onClick=\"fileSelector();\">Local Storage</button>";
494 Menu += "<button onClick=\"getRemoteFileList();\">List on Server</button>";
495 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+Menu+filelist;
496 }
497 setMode('List');
498 }
499
500 function fileEntryOnServer(name){
501 name = name.split('.')[0];
502 var res = "<tr class='filerow'>";
503 res += "<td class='filenamecell' onClick=\"getRemoteFile('"+name+"');\">"+name+"</td>";
504 res += "<td class='filelinkcell'>";
505 res += "<button class='green' onClick=\"showRemoteFile('"+name+"');\">View</button>";
506 res += "<button onClick=\"downloadFile('"+name+"');\">Download to local storage</button>";
507 res += "<button onClick=\"downloadToFile('"+name+"');\">Download as SVG File</button>";
508 res += "</td></tr>\n";
509
510 return res;
511 }
512
513 function fileEntry(row){
514 var name = row['name'];
515 var files_id = row['id'];
516
517 var res = "<tr class='filerow'>";
518 res += "<td class='filenamecell' onClick=\"showFile('"+name+"');\">"+name+"</td>";
519 res += "<td class='filelinkcell'>";
520 res += "<button class='blue' onClick=\"editFile('"+name+"');\">&nbsp;Edit&nbsp;</button> &nbsp;";
521 res += "<button class='green' onClick=\"renameFile('"+name+"',"+files_id+");\">&nbsp;Rename&nbsp;</button> &nbsp;";
522 res += "<button onClick=\"uploadFile('"+name+"');\">Upload</button>";
523 res += "<button class='red' onClick=\"deleteFile('"+name+"');\">Delete</button>";
524 res += "</td></tr>\n";
525
526 return res;
527 }
528
529 function createMenuBar(){
530 var menu = "<ul id='menubar'>";
531 menu += "<li><button onClick='createNewFile()'>Create New File</button></li>";
532 menu += "<li><button onClick='deleteAllFile()'>Delete All</button></li>";
533 menu += "<li><button onClick='getRemoteFileList()'>File List on a Server</button></li>";
534 menu += "<li><button onClick='configServer()'>Server Configuration</button></li>";
535 menu += "</ul><p class='cls'>";
536 return menu;
537 }
538
539 //// Config
540 function setConfig(){
541 var ele = document.getElementById('ServerURL');
542 MgrPath=ele.value;
543 saveChanges();
544 alert("Done");
545 }
546
547 function configServer(){
548 var popupDiv = document.getElementById('popup');
549 var string = "";
550
551 string += "<H1 class='title'>Server Configration</H1>\n";
552 string += "<div class=\"input_form\">\n";
553 string += "Filename:<input id='ServerURL' name='url' value=\""+MgrPath+"\" size=\"80\"/><br>\n";
554 string += "<button onClick=\"setConfig();hideItemById('popup'); \">Done</button>\n";
555 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
556 string += "</div>\n";
557
558 popupDiv.innerHTML=string;
559 popupDiv.style.display='block';
560 }
561
562 ////
563 function createNewFile(){
564 var popupDiv = document.getElementById('popup');
565 var string = "";
566
567 string += "<H1 class='title'>Create New File</H1>\n";
568 string += "<div class=\"input_form\">\n";
569 string += "Filename:<input id='createFilename' name='name' value=\"\" />\n";
570 string += "<button onClick=\"createNewFileAction();hideItemById('popup'); \">Create</button>\n";
571 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
572 string += "</div>\n";
573
574 popupDiv.innerHTML=string;
575 popupDiv.style.display='block';
576 }
577
578 /////
579 function renameFile(name, id){
580 var popupDiv = document.getElementById('popup');
581 var string = "";
582
583 string += "<H1 class='title'>Rename File</H1>\n";
584 string += "<div class='input_form'>\n";
585 string += "Old Filename: "+name+"<br>";
586 string += "New Filename:<input id='newFilename' name='newname' value=\"\" />\n";
587 string += "<input type='hidden' id='fileId' value=\""+id+"\" /><br>\n";
588 string += "<button onClick=\"renameFileAction();hideItemById('popup');\">Rename</button>\n";
589 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
590 string += "</div>\n";
591
592 popupDiv.innerHTML=string;
593 popupDiv.style.display='block';
594 }
595
596 /// EditMenu
597 function insertStr(str, len){
598 var editarea = document.getElementById('editarea');
599 if(len < 0) len = str.length;
600
601 if (editarea){
602 if(str=='DQ') str='"';
603 var strs = editarea.value;
604 var cPos = editarea.selectionStart;
605 var tmp = strs.substr(0,cPos);
606 editarea.value = tmp +str+strs.substr(cPos, strs.length);
607 cPos += len;
608 editarea.setSelectionRange(cPos, cPos);
609 editarea.focus();
610 }
611 }
612
613 function insertTag(tag){
614 var str;
615 var len = -1;
616 if (tag == "p"){
617 str = "<p> </p>";
618 len = 4;
619 }else if (tag == "ul"){
620 str = "<ul class=\" \"> \n\n</ul>";
621 len = 17;
622 }else if (tag == "li"){
623 str = "<li> </li>";
624 len = 5;
625 }else if (tag == "href"){
626 str = "xlink:href=\"\"";
627 len = 12;
628 }else if (tag == "EQ"){
629 str = "=\"\"";
630 len = 2;
631 }else if (tag == "svg:text"){
632 str = "<svg:text x=\"100\" y=\"100\" fill=\"black\" font-size=\"12\"> </svg:text>";
633 len = 58;
634 }else if (tag == "svg:rect"){
635 str = "<svg:rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"white\" stroke=\"black\" />";
636 len = 13;
637 }else if (tag == "svg:circle"){
638 str = "<svg:circle cx=\"10\" cy=\"100\" r=\"100\" fill=\"white\" stroke=\"black\" strokc-width=\"1\"/>";
639 len = 17;
640 }
641 insertStr(str, len);
642 }
643
644 function editMenuBar()
645 {
646 var str = "";
647 str += "<button onClick=\"insertStr('/',1);\">/</button>\n";
648 str += "<button onClick=\"insertStr('DQ',1);\">\"</button>\n";
649 str += "<button onClick=\"insertTag('EQ',1);\">=\"\"</button>\n";
650 str += "<button onClick=\"insertTag('p');\">p</button>\n";
651 str += "<button onClick=\"insertTag('href');\">href</button>\n";
652
653 str += "<button onClick=\"insertTag('svg:text');\">TEXT</button>\n";
654 str += "<button onClick=\"insertTag('svg:rect');\">rect</button>\n";
655 str += "<button onClick=\"insertTag('svg:circle');\">circle</button>\n";
656
657 str += "<button onClick=\"chEditareaHeight();\">...</button>\n";
658
659 return str;
660 }
661
662 function updateEditMenu(){
663 var menuDiv = document.getElementById('menuDiv');
664 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
665 menuDiv.innerHTML+= "<button onClick=\"saveFile();fileSelector();\"> Save </button>\n";
666 menuDiv.innerHTML+= "<button onClick=\"previewData();\"> Preview </button>\n";
667 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
668
669 menuDiv.style.display='block';
670 }
671
672 //// Editor
673 function editFileData(transaction, results){
674 var editDiv = document.getElementById('editDiv');
675 var datadiv = document.getElementById('tempdata');
676
677 if( results.rows.length == 0) return;
678 var data = results.rows.item(0);
679 var filename = data['name'];
680 var filedata = data['datablob'];
681 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
682
683 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+filedata+"</textarea>\n";
684
685 document.title="EditFile: "+filename;
686 updateEditMenu();
687 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
688
689 setMode('Edit');
690 }
691
692 function editFile(name){
693 if(currentMode == 'Preview'){
694 var data = getSVGContent();
695 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+data+"</textarea>\n";
696 updateEditMenu();
697 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
698
699 setMode('Edit');
700 }else{
701 getFile(name, 'editFileData');
702 }
703 }
704
705 function editCurrentFile(){
706 var datadiv = document.getElementById('tempdata');
707 var name = datadiv.getAttribute('lfname');
708
709 editFile(name);
710 }
711
712
713 // Show File (GUI Editor)
714 function updateShowMenu(){
715 var menuDiv = document.getElementById('menuDiv');
716 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
717 var menu_str = "<img src=\"images/menu.png\" usemap=\"#topmenu\" />\n";
718 menu_str+= "<map name=\"topmenu\">";
719 menu_str+= "<area shape=\"rect\" coords=\"0,0,30,25\" onClick=\"fileSelector();\">";
720 menu_str+= "<area shape=\"rect\" coords=\"30,0,60,25\" onClick=\"saveData();\">";
721 menu_str+= "<area shape=\"rect\" coords=\"60,0,90,25\" onClick=\"showSVGSource();\">";
722 menu_str+= "</map>";
723
724 menu_str+= updateSVGObjMenu();
725 menuDiv.innerHTML+= menu_str;
726 updateStrokeWidth();
727 updatePathTypeMenu();
728 updateArrowMenu();
729 menuDiv.style.display='block';
730 updateToolBar();
731 }
732
733 function showColorPalette(val){
734 var palette = document.getElementById('color-palette');
735 var ele;
736 var current = palette.getAttribute("targetType");
737
738 if(palette.style.display=='block' && current == val){
739 palette.style.display='none';
740 return;
741 }
742
743 if(val == 'fill'){
744 ele = document.getElementById('toolFill');
745 }else{
746 ele = document.getElementById('toolStroke');
747 }
748
749 var pos= ele.offsetTop + 110;
750 palette.style.top = pos +"px";
751 palette.style.display='block';
752 palette.setAttribute("targetType", val);
753
754 }
755
756 function selectToolBar(idx){
757 clearSelectedItems();
758 var ele=document.getElementById('tool_select');
759 var pos = idx *25;
760 ele.style.top= pos+'px';
761 }
762
763
764 function updateToolBar(){
765 var toolbar = document.getElementById('toolBar');
766 var str = "";
767 if(!toolbar.innerHTML){
768 str += "<li><img src=\"images/tools.png\" usemap=\"#toolbar\" />\n";
769 str += "<img id=\"tool_select\" src=\"images/select.png\" style=\"position:absolute;top:0;left:10px;\" />\n";
770 str += "<map name=\"toolbar\">";
771 str += "<area shape=\"rect\" coords=\"0,0,30,25\" onClick=\"setSVGMode('selector');\">";
772 str += "<area shape=\"rect\" coords=\"0,25,30,50\" onClick=\"setSVGMode('newPath');\">";
773 str += "<area shape=\"rect\" coords=\"0,50,30,75\" onClick=\"setSVGMode('newLine');\">";
774 str += "<area shape=\"rect\" coords=\"0,75,30,100\" onClick=\"setSVGMode('text');\">";
775 str += "<area shape=\"rect\" coords=\"0,100,30,125\" onClick=\"setSVGMode('rect');\">";
776 str += "<area shape=\"rect\" coords=\"0,125,30,150\" onClick=\"setSVGMode('circle');\">";
777 str += "<area shape=\"rect\" coords=\"0,150,30,175\" onClick=\"setSVGMode('ellipse');\">";
778 str += "<area shape=\"rect\" coords=\"0,175,30,200\" onClick=\"setSVGMode('image');\">";
779 str += "<area shape=\"rect\" coords=\"0,210,30,235\" onClick=\"showColorPalette('fill');\">";
780 str += "<area shape=\"rect\" coords=\"0,240,30,265\" onClick=\"showColorPalette('stroke');\">";
781 str += "<area shape=\"rect\" coords=\"0,280,30,305\" onClick=\"topItem();\">";
782 str += "<area shape=\"rect\" coords=\"0,305,30,330\" onClick=\"upItem();\">";
783 str += "<area shape=\"rect\" coords=\"0,330,30,355\" onClick=\"downItem();\">";
784 str += "<area shape=\"rect\" coords=\"0,355,30,380\" onClick=\"bottomItem();\">";
785 str += "<area shape=\"rect\" coords=\"0,390,30,415\" onClick=\"dupObject();\">";
786 str += "<area shape=\"rect\" coords=\"0,415,30,440\" onClick=\"delSVGObj();\">";
787 str += "<area shape=\"rect\" coords=\"0,450,30,470\" onClick=\"setRotLock();\">";
788 str += "<area shape=\"rect\" coords=\"0,470,30,490\" onClick=\"setScaleLock();\">";
789 str += "</map>";
790 str += "<img src=\"images/lock.png\" onClick=\"toggleRotateScaleLock();\" id=\"lock\" style=\"display:none;z-index:100;position:absolute;\"/>\n";
791 str += "<div id=\"toolFill\"></div>\n";
792 str += "<div id=\"toolStroke\"></div>\n";
793 str += "</li>\n";
794 toolbar.innerHTML= "<ul>"+str+"</ul>";
795 }
796 toolbar.style.display='block';
797 }
798
799 function setMode(m){
800 currentMode=m;
801 switch(m){
802 case 'List':
803 hideItemById('editDiv');
804 hideItemById('preview');
805 hideItemById('popup');
806 hideItemById('toolBar');
807 hideItemById('color-palette');
808 showItemById('menuDiv');
809 break;
810 case 'Edit':
811 hideItemById('preview');
812 hideItemById('popup');
813 hideItemById('toolBar');
814 hideItemById('color-palette');
815 showItemById('editDiv');
816 showItemById('menuDiv');
817 break;
818 case 'Preview':
819 showItemById('preview');
820 hideItemById('editDiv');
821 hideItemById('popup');
822 hideItemById('color-palette');
823 showItemById('menuDiv');
824 showItemById('toolBar');
825 break;
826 default:
827 break;
828 }
829 }
830
831 function hideItemById(id){
832 var itm = document.getElementById(id);
833 if(itm) itm.style.display='none';
834 }
835
836 function showItemById(id){
837 var itm = document.getElementById(id);
838 if(itm) itm.style.display='block';
839 }
840
841 function removeChildNodes(id){
842 var itm = document.getElementById(id);
843 if(!itm) return;
844
845 var child = itm.firstChild;
846
847 while(child){
848 itm.removeChild(child);
849 child = itm.firstChild;
850 }
851 }
852
853 function chEditareaHeight(){
854 var itm = document.getElementById('editarea');
855 if(!itm) return;
856 var cv = itm.getAttribute('rows');
857 if(parseInt(cv) > editarea_h){
858 itm.setAttribute('rows', editarea_h);
859 }else{
860 itm.setAttribute('rows', editarea_h * 2);
861 }
862 }
863
864 function format_file(str){
865 return "<pre>"+str+"</pre>";
866 }
867
868 function previewData(data){
869 if(!data) data = document.getElementById('editarea').value;
870
871 previewFile(data);
872
873 updateShowMenu();
874 setMode('Preview');
875 }
876
877 function previewFile(data){
878 removeChildNodes('preview');
879
880 preview.style.display='block';
881 preview.style.position='absolute';
882 preview.style.top='180px';
883 preview.style.bottom='50px';
884 preview.style.left='0px';
885 preview.style.right='10px';
886 preview.style.width='800px';
887 preview.style.height='525px';
888 mkColorPalette();
889
890 var ele = toSVGElement(data, '100%','100%');
891
892 preview.appendChild(ele);
893
894 svg_top = document.getElementById('svg_top');
895 initSVGElementId(svg_top);
896 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
897 svg_select.setAttribute("id","svg_select");
898 appendSVGObj(svg_select);
899 }
900
901 function mkColorPalette(){
902 var palette = document.getElementById('color-palette');
903 if(!palette) return;
904 if(palette.innerHTML) return;
905
906 palette.innerHTML="";
907 palette.addEventListener("touchstart", onTouchStartColor, false);
908
909 for(var i=0; i<colors.length ;i++){
910 if(colors[i] == 'none')
911 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\">X</div>";
912 else
913 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\"> </div>";
914 }
915 palette.style.width='120px';
916 }
917
918 ////// for SVG object
919 ////////////////
920 function downItem(){
921 if(selectedItems.length != 1) return;
922 var itm = selectedItems[0];
923 var nodes = svg_top.childNodes;
924 for(var i=0; i< nodes.length; i++){ if(nodes[i] == itm) break; }
925 if (i > 0) svg_top.insertBefore(itm, nodes[i-1]);
926 }
927
928 function upItem(){
929 if(selectedItems.length != 1) return;
930 var itm = selectedItems[0];
931 var nodes = svg_top.childNodes;
932 for(var i=0; i< nodes.length; i++){ if(nodes[i] == itm) break; }
933
934 if (i == nodes.length-2){
935 svg_top.appendChild(itm);
936 }else if (i < nodes.length-1){
937 svg_top.insertBefore(itm, nodes[i+2]);
938 }
939 }
940
941 function bottomItem(){
942 if(selectedItems.length != 1) return;
943 var itm = selectedItems[0];
944 svg_top.insertBefore(itm, svg_top.firstChild);
945 }
946
947 function topItem(){
948 if(selectedItems.length != 1) return;
949 var itm = selectedItems[0];
950 svg_top.removeChild(itm);
951 svg_top.appendChild(itm);
952 }
953
954 function updateSVGObjMenu(){
955 var res = "";
956 var tag = modeSVG;
957 if(selectedItems.length > 1){
958 res += '<button onClick="groupSVGObjects(selectedItems);">Group</button>';
959 return res;
960 }
961 if(selectedItems.length == 1){
962 tag = getElementTag(selectedItems[0]);
963 res += setSVGObjectProp(selectedItems[0]);
964 }else{
965 switch(tag){
966 case 'text':
967 res += propSVGText("", svg_font_size, svg_color, 0);
968 break;
969 case 'rect':
970 case 'circle':
971 case 'ellipse':
972 case 'newPath':
973 case 'newLine':
974 case 'path':
975 case 'line':
976 res += propSVGObj(tag+":", svg_line_width, svg_color, svg_fill_color, "", 0);
977 break;
978 case 'image':
979 res += propSVGImage("", 100, 100, 0);
980 break;
981 default:
982 break;
983 }
984 }
985 return res;
986 }
987
988 function propSVGText(str, size, color, rot){
989 if(!size) size = 24;
990 if(!color) color = '#000000';
991 if(!rot) rot = 0;
992
993 var res = "Text:";
994 res += "<input type=\"hidden\" id=\"svg_text\" value=\""+str+"\"/>";
995 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
996 res += "Rot:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
997
998 res += "Size:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
999
1000 document.getElementById('toolFill').style.backgroundColor=color;
1001 return res;
1002 }
1003
1004 function propSVGObj(type, stroke, color, fill, style, rot){
1005 var res = type;
1006 if(!stroke) stroke = 1;
1007 if(!color) color = '#000000';
1008 if(!fill) fill = '#ffffff';
1009 if(!rot) rot = 0;
1010
1011 res += "<input type=\"hidden\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
1012 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
1013 res += "<input type=\"hidden\" id=\"svg_stroke\" onChange=\"updateSVGObj();\" value=\""+stroke+"\" size=\"2\"/>";
1014 res += "Rot:<input type=\"text\" id=\"svg_rotate\" onChange=\"updateSVGObj();\" value=\""+rot+"\" size=\"4\"/>";
1015
1016 if(style==null) style="";
1017 res += "<input type=\"hidden\" id=\"svg_stroke_type\" onChange=\"updateSVGObj();\" value=\""+style+"\" size=\"8\"/>";
1018
1019 res += "<img id=\"strokeW\" src=\"images/strokeW.png\" usemap=\"#strokemenu\" />\n";
1020 res += "<map name=\"strokemenu\">";
1021 res += "<area shape=\"rect\" coords=\"0,0,60,25\" onClick=\"selectStrokeW(0);\">";
1022 res += "<area shape=\"rect\" coords=\"0,25,60,50\" onClick=\"selectStrokeW(1);\">";
1023 res += "<area shape=\"rect\" coords=\"0,50,60,75\" onClick=\"selectStrokeW(2);\">";
1024 res += "<area shape=\"rect\" coords=\"0,75,60,100\" onClick=\"selectStrokeW(3);\">";
1025 res += "<area shape=\"rect\" coords=\"0,100,60,125\" onClick=\"selectStrokeW(4);\">";
1026 res += "<area shape=\"rect\" coords=\"0,125,60,150\" onClick=\"selectStrokeW(5);\">";
1027 res += "<area shape=\"rect\" coords=\"0,150,60,175\" onClick=\"selectStrokeW(6);\">";
1028 res += "<area shape=\"rect\" coords=\"0,175,60,200\" onClick=\"selectStrokeW(7);\">";
1029 res += "<area shape=\"rect\" coords=\"0,200,60,225\" onClick=\"selectStrokeW(8);\">";
1030 res += "</map>";
1031
1032 res += "<img id=\"strokeDash\" src=\"images/dash_type.png\" usemap=\"#dashtype\" />\n";
1033 res += "<map name=\"dashtype\">";
1034 res += "<area shape=\"rect\" coords=\"0,0,50,25\" onClick=\"selectStrokeDash(0);\">";
1035 res += "<area shape=\"rect\" coords=\"0,25,50,50\" onClick=\"selectStrokeDash(1);\">";
1036 res += "<area shape=\"rect\" coords=\"0,50,50,75\" onClick=\"selectStrokeDash(2);\">";
1037 res += "<area shape=\"rect\" coords=\"0,75,50,100\" onClick=\"selectStrokeDash(3);\">";
1038 res += "<area shape=\"rect\" coords=\"0,100,50,125\" onClick=\"selectStrokeDash(4);\">";
1039 res += "<area shape=\"rect\" coords=\"0,125,50,150\" onClick=\"selectStrokeDash(5);\">";
1040 res += "<area shape=\"rect\" coords=\"0,150,50,175\" onClick=\"selectStrokeDash(6);\">";
1041 res += "</map>";
1042
1043 document.getElementById('toolFill').style.backgroundColor=fill;
1044 document.getElementById('toolStroke').style.backgroundColor=color;
1045 return res;
1046 }
1047
1048 function propSVGLine(type, stroke, color, fill, style, rot){
1049 var res = propSVGObj(type, stroke, color, fill, style, rot);
1050 if(!rot) rot = 0;
1051
1052 res += "<img id=\"arrow_l\" src=\"images/arrow_l.png\" usemap=\"#arrow_l\" />\n";
1053 res += "<map name=\"arrow_l\">";
1054 res += "<area shape=\"rect\" coords=\"0,0,30,25\" onClick=\"setLeftArrow();\">";
1055 res += "<area shape=\"rect\" coords=\"0,25,30,50\" onClick=\"removeLeftArrow();\">";
1056 res += "</map>";
1057
1058 res += "<img id=\"arrow_r\" src=\"images/arrow_r.png\" usemap=\"#arrow_r\" />\n";
1059 res += "<map name=\"arrow_r\">";
1060 res += "<area shape=\"rect\" coords=\"0,0,30,25\" onClick=\"setRightArrow();\">";
1061 res += "<area shape=\"rect\" coords=\"0,25,30,50\" onClick=\"removeRightArrow();\">";
1062 res += "</map>";
1063
1064
1065 res += "<img id=\"path_type\" src=\"images/path_type.png\" usemap=\"#path_type\" />\n";
1066 res += "<map name=\"path_type\">";
1067 res += "<area shape=\"rect\" coords=\"0,0,30,100\" onClick=\"togglePathType();\">";
1068 res += "</map>";
1069 document.getElementById('toolFill').style.backgroundColor=fill;
1070 document.getElementById('toolStroke').style.backgroundColor=color;
1071
1072 return res;
1073 }
1074
1075 function getStrokeWIdx(lw){
1076 var res=0;
1077 for(var i=0;i<lineW.length;i++){
1078 if(lw < lineW[i]){ return res; }
1079 res = i;
1080 }
1081 return lineW.length-1;
1082 }
1083
1084 function getStrokeW(idx){ return lineW[idx]; }
1085
1086 function updateStrokeWidth(){
1087 if(selectedItems.length == 1){
1088 var obj = selectedItems[0];
1089 if(!obj){ return; }
1090 var val = obj.getAttribute('stroke-width');
1091 if(!val) return;
1092 var lw = parseFloat(val);
1093 updateStrokeWImg(getStrokeWIdx(lw));
1094 updateStrokeDash();
1095 }
1096 }
1097
1098 function updateStrokeWImg(idx){
1099 var ele = document.getElementById('strokeW');
1100 if(!ele) return;
1101 var v1 = idx*25;
1102 var v2 = v1+25;
1103 var v3 = 81 - v1;
1104 ele.style.clip = "rect("+v1+"px,70px,"+v2+"px,0px)";
1105 ele.style.top = v3+"px";
1106 }
1107
1108 function selectStrokeW(idx){
1109 var ele = document.getElementById('strokeW');
1110 if(ele.style.clip != "rect(auto auto auto auto)"){
1111 ele.style.clip = "rect(auto auto auto auto)";
1112 ele.style.top = "81px";
1113 return;
1114 }
1115 if(selectedItems.length == 1){
1116 var obj = selectedItems[0];
1117 var lw = getStrokeW(idx);
1118 var plw = parseFloat(obj.getAttribute('stroke-width'));
1119 obj.setAttribute('stroke-width', lw);
1120 updateDashArray(obj, lw, plw, obj.getAttribute('stroke-dasharray'));
1121 updateStrokeWImg(idx);
1122 }else{
1123 updateStrokeWImg(1);
1124 }
1125 }
1126
1127 function updateStrokeDash(){
1128 if(selectedItems.length == 1){
1129 var obj = selectedItems[0];
1130 if(!obj){ return; }
1131 var val = obj.getAttribute('stroke-width');
1132 if(!val) return;
1133 var lw = parseFloat(val);
1134 var darr = obj.getAttribute('stroke-dasharray');
1135 if(!darr) return;
1136 updateStrokeDashImg( getDashArrayIndex(lw, darr) );
1137 }
1138 }
1139 function updateStrokeDashImg(idx){
1140 var ele = document.getElementById('strokeDash');
1141 if(!ele) return;
1142 var v1 = idx*25;
1143 var v2 = v1+25;
1144 var v3 = 81 - v1;
1145 ele.style.clip = "rect("+v1+"px,70px,"+v2+"px,0px)";
1146 ele.style.top = v3+"px";
1147 }
1148
1149 function selectStrokeDash(idx){
1150 var ele = document.getElementById('strokeDash');
1151 if(ele.style.clip != "rect(auto auto auto auto)"){
1152 ele.style.clip = "rect(auto auto auto auto)";
1153 ele.style.top = "81px";
1154 return;
1155 }
1156
1157 if(selectedItems.length == 1){
1158 var obj = selectedItems[0];
1159 var lw = obj.getAttribute('stroke-width');
1160 if(!lw ) lw=1;
1161 else lw=parseFloat(lw);
1162
1163 var darr = StrokeDash[idx];
1164 if(darr=="") try{ obj.removeAttribute('stroke-dasharray'); }catch(e){}
1165 else updateDashArray(obj, lw, 1, darr);
1166
1167 updateStrokeDashImg(idx);
1168 }else{
1169 updateStrokeDashImg(1);
1170 }
1171 }
1172
1173 function getDashArrayIndex(plw, darr){
1174 if(!darr || darr=="") return 0;
1175 var d_arr = darr.split(' ');
1176 var top = Math.round(parseFloat(d_arr[0])/plw);
1177 if(top == 6){
1178 if(d_arr.length == 2) return 2;
1179 if(d_arr.length == 4) return 3;
1180 }else if(top == 8){
1181 if(d_arr.length == 2) return 4;
1182 if(d_arr.length == 4) return 5;
1183 if(d_arr.length == 6) return 6;
1184 }else if(top == 2){
1185 return 1;
1186 }
1187 return 0;
1188 }
1189
1190 function updateDashArray(obj, lw, plw, darr){
1191 if(darr && darr != ""){
1192 var d_arr = darr.split(' ');
1193 darr = "";
1194 for(var i=0; i<d_arr.length; i++){
1195 var val = Math.round(parseFloat(d_arr[i])/plw);
1196 darr += val * lw + ' ';
1197 }
1198 obj.setAttribute('stroke-dasharray', trim(darr));
1199 return true;
1200 }
1201 return false;
1202 }
1203
1204 function togglePathType(){
1205 if(selectedItems.length != 1) return;
1206 var itm = selectedItems[0];
1207 var path = itm.getAttribute("d").split(' ');
1208 var newpath = "";
1209
1210 for(var i=0;i<path.length ;i++){
1211 if(path[i] == "L"){ path[i] = "Q"; }
1212 else if(path[i] == "Q"){ path[i] = "S"; }
1213 else if(path[i] == "S"){ path[i] = "T"; }
1214 else if(path[i] == "T"){ path[i] = "L"; }
1215 newpath += path[i] + ' ';
1216 }
1217 var mm = path.length % 4;
1218 if(mm != 0) {
1219 newpath += path[i-2] + ' ';
1220 newpath += path[i-1] + ' ';
1221 }
1222
1223 itm.setAttribute("d",trim(newpath));
1224 updatePathTypeMenu();
1225 }
1226
1227 function updatePathTypeMenu(){
1228 if(selectedItems.length != 1) return;
1229 var itm = selectedItems[0];
1230 if(!itm) return;
1231 var path = itm.getAttribute("d");
1232 var img = document.getElementById('path_type');
1233 if(!path){
1234 if(img) img.style.display='none';
1235 return;
1236 }
1237
1238 if(path.indexOf("Q") > 0){
1239 selectMenuImage(img, 1);
1240 }else if(path.indexOf("T") > 0){
1241 selectMenuImage(img, 2);
1242 }else if(path.indexOf("S") > 0){
1243 selectMenuImage(img, 3);
1244 }else{
1245 selectMenuImage(img, 0);
1246 }
1247 img.style.display='block';
1248 }
1249
1250 function updateArrowMenu(){
1251 try{
1252 var imgl = document.getElementById('arrow_l');
1253 if(hasArrow('start')){ selectMenuImage(imgl, 1); }else{ selectMenuImage(imgl, 0); }
1254 }catch(e){}
1255
1256 try{
1257 var imgr = document.getElementById('arrow_r');
1258 if(hasArrow('end')){ selectMenuImage(imgr, 1); }else{ selectMenuImage(imgr, 0); }
1259 }catch(e){}
1260 }
1261
1262 function selectMenuImage(img, pos){
1263 if(!img) return;
1264 var clip = new Array("rect(0px,30px,25px,0px)","rect(25px,30px,50px,0px)",
1265 "rect(50px,30px,75px,0px)", "rect(75px,30px,100px,0px)");
1266 var top = new Array( "81px", "56px", "31px", "6px");
1267
1268 img.style.clip = clip[pos];
1269 img.style.top = top[pos];
1270 }
1271
1272 function propSVGImage(str, w, h, rot){
1273 var res = "image:";
1274 if(!rot) rot = 0;
1275 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
1276 res += "Width:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
1277 res += "Height:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
1278 res += "Rot:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
1279 return res;
1280 }
1281
1282
1283 function setSVGMode(m){
1284 modeSVG = m;
1285 switch(m){
1286 case 'selector':
1287 selectToolBar(0);
1288 break;
1289 case 'newPath':
1290 selectToolBar(1);
1291 break;
1292 case 'newLine':
1293 selectToolBar(2);
1294 break;
1295 case 'text':
1296 selectToolBar(3);
1297 break;
1298 case 'rect':
1299 selectToolBar(4);
1300 break;
1301 case 'circle':
1302 selectToolBar(5);
1303 break;
1304 case 'ellipse':
1305 selectToolBar(6);
1306 break;
1307 case 'image':
1308 selectToolBar(7);
1309 break;
1310 default:
1311 break;
1312 }
1313 updateShowMenu();
1314 }
1315
1316
1317 function toSVGElement(str, w, h){
1318 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
1319 var parser = new DOMParser();
1320 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
1321 var footer = "</svg:svg>";
1322 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
1323 var xmlRoot = xmlDoc.documentElement;
1324 var ele = document.importNode(xmlRoot,true);
1325
1326 return ele;
1327 }
1328
1329 function newID(){
1330 var id = 'svg_'+nextId;
1331 nextId++;
1332 return id;
1333 }
1334
1335 function createSVGElement(tag, id){
1336 if(!id || id=='new') id = newID();
1337 var ele= document.createElementNS(svg_ns, tag);
1338 ele.setAttribute("id", id);
1339 return ele;
1340 }
1341
1342 function defSVGElement(node){
1343 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1344 if(!svg_defs){
1345 svg_defs = createSVGElement('defs', 'svg_defs');
1346 svg_top.insertBefore(svg_defs, svg_top.firstChild);
1347 }
1348 if(node) svg_defs.appendChild(node);
1349 }
1350
1351 function initSVGElementId(svg_top){
1352 nextId = 1;
1353 checkSVGElementId(svg_top);
1354 appendSVGElementId(svg_top);
1355 }
1356
1357 function checkSVGElementId(top){
1358 var objs = top.childNodes;
1359
1360 for(var i=0; i<objs.length ;i++){
1361 if(objs[i].tagName){
1362 var id = objs[i].getAttribute("id");
1363
1364 if(id && id.match(/svg_[0-9]+/i)){
1365 var n = parseInt(RegExp.lastMatch.substr(4));
1366 if(n >= nextId){
1367 nextId = n+1;
1368 }
1369
1370 }
1371 checkSVGElementId(objs[i]);
1372 }
1373 }
1374 }
1375
1376 function appendSVGElementId(top){
1377 var objs = top.childNodes;
1378
1379 for(var i=0; i<objs.length ;i++){
1380 if(objs[i].tagName){
1381 var id = objs[i].getAttribute("id");
1382 if(!id){
1383 objs[i].setAttribute("id", "svg_"+nextId);
1384 nextId++;
1385 }
1386 }
1387 appendSVGElementId(objs[i]);
1388 }
1389 }
1390
1391 function setAttributes(obj, attrs){
1392 var attr_array = attrs.split(',');
1393
1394 for (var i=0; i<attr_array.length;i++){
1395 var x = attr_array[i].split('=');
1396 if(x.length == 2){
1397 obj.setAttribute(x[0], x[1]);
1398 }
1399 }
1400 }
1401
1402 function createSVGObj(tag, attrs, fill, color, lw){
1403 var ele = createSVGElement(tag, 'new');
1404 setAttributes(ele, attrs);
1405 if (fill) ele.setAttribute('fill', fill);
1406 if (color) ele.setAttribute('stroke', color);
1407 if(lw) ele.setAttribute('stroke-width', lw);
1408
1409 return ele;
1410 }
1411
1412 function createSVGText(txt, x, y, size, color){
1413 var ele = createSVGElement('text', 'new');
1414
1415 ele.setAttribute('x', x);
1416 ele.setAttribute('y', y);
1417 ele.setAttribute('font-size', size);
1418 ele.setAttribute('fill', color);
1419 ele.textContent=txt;
1420
1421 return ele;
1422 }
1423
1424 function createSVGImage(fname, width, height, attrs){
1425 var ele = createSVGElement('image', 'new');
1426 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1427 ele.setAttribute('width', width);
1428 ele.setAttribute('height', height);
1429 setAttributes(ele, attrs);
1430
1431 return ele;
1432 }
1433
1434 function groupSVGObjects(){
1435 try{
1436 var objs = selectedItems;
1437 if(objs.length == 0) return null;
1438 var ele = createSVGElement('g', 'new');
1439 for(var i=0;i<objs.length;i++){
1440 var obj = objs[i];
1441 obj.parentNode.removeChild(obj);
1442 ele.appendChild(obj);
1443 }
1444 appendSVGObj(ele);
1445 selectedItems = new Array(ele);
1446 updateShowMenu();
1447 return ele;
1448 }catch(e){ return null;}
1449 }
1450
1451 function ungroupSVGObjects(){
1452 try{
1453 var obj = selectedItems[0];
1454 if(getElementTag(obj) != 'g') return;
1455 var parent = obj.parentNode;
1456 selectedItems = new Array();
1457 while(obj.firstChild != null){
1458 selectedItems.push(obj.firstChild);
1459 parent.appendChild(obj.firstChild);
1460 }
1461 parent.removeChild(obj);
1462 updateShowMenu();
1463 }catch(e){ return;}
1464 }
1465
1466 function createSVGMarker(pid, id, child){
1467 var parent = document.getElementById(pid);
1468 if(!parent) return;
1469 var ele = createSVGElement('marker', pid+'_'+id);
1470 ele.appendChild(child);
1471 return ele;
1472 }
1473
1474 function setLeftArrow(){
1475 if( selectedItems.length == 1 ){
1476 setArrow(selectedItems[0], 'start', '');
1477 updateShowMenu();
1478 }
1479 }
1480
1481 function setRightArrow(){
1482 if( selectedItems.length == 1 ){
1483 setArrow(selectedItems[0], 'end', '');
1484 updateShowMenu();
1485 }
1486 }
1487
1488 function removeLeftArrow(){
1489 if( selectedItems.length == 1 ){
1490 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1491 try{
1492 var marker = getArrowMarker(selectedItems[0],'start');
1493 svg_defs.removeChild(marker);
1494 selectedItems[0].removeAttribute('marker-start');
1495 }catch(e){ }
1496 updateShowMenu();
1497 }
1498 }
1499
1500 function removeRightArrow(){
1501 if( selectedItems.length == 1 ){
1502 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1503 try{
1504 var marker = getArrowMarker(selectedItems[0],'end');
1505 svg_defs.removeChild(marker);
1506 selectedItems[0].removeAttribute('marker-end');
1507 }catch(e){ }
1508 updateShowMenu();
1509 }
1510 }
1511
1512 function removeAllMarker(obj){
1513 var smarker = getArrowMarker(obj,'start');
1514 if(smarker) svg_defs.removeChild(smarker);
1515 var emarker = getArrowMarker(obj,'end');
1516 if(emarker) svg_defs.removeChild(emarker);
1517 return true;
1518 }
1519
1520 function hasArrow(pos){
1521 var pobj = selectedItems[0];
1522 if(!pobj) return false;
1523 if(getArrowMarker(pobj,pos)) return true;
1524 return false;
1525 }
1526
1527 function getArrowMarker(obj,pos){
1528 try{
1529 return document.getElementById(obj.getAttribute('id')+'_'+pos+'arrow');
1530 }catch(e){ return null; }
1531
1532 }
1533
1534 function setArrow(pobj, pos, type){
1535 if(!pobj) return;
1536 var marker = getArrowMarker(pobj,pos);
1537 if(marker){ return; }
1538
1539 var obj = createSVGElement('path', 'new');
1540
1541 var refX = 10;
1542 var refY = 10;
1543
1544 switch(pos){
1545 case 'start':
1546 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1547 break;
1548 case 'end':
1549 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1550 break;
1551 default:
1552 return;
1553 }
1554
1555 var pid = pobj.getAttribute("id");
1556 marker = createSVGMarker(pid, pos+'arrow' , obj);
1557
1558 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1559
1560 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1561
1562 defSVGElement(marker);
1563 if(!document.getElementById(pid+'_'+pos+'arrow')){
1564 alert("Error in setArrow");
1565 return;
1566 }
1567 var mid = "url(#"+marker.getAttribute("id")+")";
1568 var mattr = "marker-"+pos;
1569 pobj.setAttribute(mattr, mid);
1570 updateShowMenu();
1571 }
1572
1573 function scalePath(itm, scale){
1574 if(!scale) return;
1575 var path = itm.getAttribute("d").split(' ');
1576 var bbox = itm.getBBox();
1577 var newpath = "";
1578 var sX=scale[0];
1579 var sY=scale[1];
1580 var isX=true;
1581 var dx = bbox.x - sX*bbox.x;
1582 var dy = bbox.y - sY*bbox.y;
1583
1584 for(var i=0;i<path.length ;i++){
1585 if(path[i].match(/[0-9]+/)){
1586 var val = parseInt(path[i]);
1587 if(isX){
1588 path[i] = Math.round(val*sX) + dx ;
1589 isX = false;
1590 }else{
1591 path[i] = Math.round(val*sY) + dy ;
1592 isX = true;
1593 }
1594 }
1595 newpath += path[i] + ' ';
1596 }
1597
1598 itm.setAttribute("d",trim(newpath));
1599 }
1600
1601 function scaleLine(itm, scale){
1602 if(!scale) return;
1603 var sX=scale[0];
1604 var sY=scale[1];
1605 var x1 = parseInt(itm.getAttribute("x1"));
1606 var y1 = parseInt(itm.getAttribute("y1"));
1607 var x2 = parseInt(itm.getAttribute("x2"));
1608 var y2 = parseInt(itm.getAttribute("y2"));
1609 var bbox = itm.getBBox();
1610 var dx = bbox.x - sX*bbox.x;
1611 var dy = bbox.y - sY*bbox.y;
1612
1613 itm.setAttribute("x1", Math.round(x1*sX)+dx);
1614 itm.setAttribute("y1", Math.round(y1*sY)+dy);
1615 itm.setAttribute("x2", Math.round(x2*sX)+dx);
1616 itm.setAttribute("y2", Math.round(y2*sY)+dy);
1617 }
1618
1619 function appendSVGObj(obj){
1620 var svg_top = document.getElementById('svg_top');
1621 if(!svg_top) return;
1622
1623 svg_top.appendChild(obj);
1624 }
1625
1626 function removeSVGObj(obj){
1627 var svg_top = document.getElementById('svg_top');
1628 if(!svg_top) return;
1629
1630 svg_top.removeChild(obj);
1631 }
1632
1633
1634 function isChildById(element, id) {
1635 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1636 else if (element.parentNode.id == id) return true;
1637 else return isChildById(element.parentNode, id);
1638 }
1639
1640 /////////////////////// Formatting SVG DOM
1641 function escapeHTML(text) {
1642 return text.replace( /[<>"&]/g,
1643 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1644 );
1645 };
1646
1647 function formatTag(ele){
1648 var str="";
1649 if(ele.nodeType == 1){
1650 var tag_a = ele.tagName.split(':');
1651 var tag;
1652 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1653
1654 str += "<"+tag;
1655 var attrs = ele.attributes;
1656 for(var i=0; i<attrs.length; i++){
1657 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1658 }
1659 var cn = ele.childNodes;
1660 if(cn.length > 0){
1661 str +=">\n";
1662 for(var i=0; i<cn.length; i++){
1663 var tmp = trim(formatTag(cn[i]));
1664 if(tmp) str += " "+tmp+"\n";
1665 }
1666 str += "</"+tag+">";
1667 }else{
1668 str +=" />";
1669 }
1670 return str;
1671 }else if(ele.nodeType==3){
1672 return ele.textContent;
1673 }
1674 }
1675
1676 function getSVGContent(){
1677 if(!svg_top) return "";
1678
1679 var str = "";
1680 var elements = svg_top.childNodes;
1681 for(var i=0; i<elements.length; i++){
1682 if(elements[i] != svg_select){
1683 var tmp = trim(formatTag(elements[i]));
1684 if(tmp) str += tmp + '\n';
1685 }
1686 }
1687 return str;
1688 }
1689
1690 function trim(str){
1691 return str.replace(/(^\s+)|(\s+$)/g, "");
1692 }
1693
1694 /////// Access Server
1695 function newXMLRequest(){
1696 if(this.XMLHttpRequest){
1697 return new XMLHttpRequest();
1698 }else {
1699 return new ActiveXObject("Microsoft.XMLHTTP");
1700 }
1701 }
1702
1703 function createRequestData(data){
1704 var str="filetype=svg";
1705 for (var i in data){
1706 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1707 }
1708 return str;
1709 }
1710
1711 function postRequest(url, data, func){
1712 var postData=createRequestData(data);
1713 var obj=newXMLRequest();
1714
1715 obj.onreadystatechange = function(){
1716 if (obj.readyState == 4 && obj.status == 200){
1717 func(obj.responseText);
1718 }
1719 }
1720 obj.open("POST", url, true);
1721 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1722 obj.send(postData);
1723 }
1724
1725 function commnadFinishAlert(s){
1726 alert(s);
1727 }
1728
1729 function uploadFileData(transaction, results){
1730 var data = results.rows.item(0);
1731 var updata = new Array(0);
1732 updata['name']= data['name'];
1733 updata['datalob'] = data['datablob'];
1734 updata['cmd'] = 'upload'
1735
1736 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1737 }
1738
1739 function uploadFile(name){
1740 getFile(name, 'uploadFileData');
1741 }
1742
1743 function getRemoteFileList(){
1744 var data=new Array();
1745 data['name'] = "SVG";
1746 data['cmd'] = "list";
1747 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1748 }
1749
1750 function previewRemoteFile(content){
1751 previewFile(content);
1752 setMode('Preview');
1753 }
1754
1755 function getRemoteFile(name){
1756 var data=new Array();
1757 data['name'] = name;
1758 data['cmd'] = "get";
1759 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1760 }
1761
1762 function saveRemoteFile(content){
1763 var datadiv = document.getElementById('tempdata');
1764 var fname = datadiv.getAttribute('lfname');
1765 saveContentWithFilename(fname, content);
1766 }
1767
1768 function downloadFile(name){
1769 var data=new Array();
1770 data['name'] = name;
1771 data['cmd'] = "get";
1772 var datadiv = document.getElementById('tempdata');
1773 datadiv.setAttribute('lfname', name);
1774 postRequest(MgrPath+iSlideMgr, data, saveRemoteFile);
1775 }
1776
1777 function showRemoteFile(name){
1778 getRemoteFile(name);
1779 }
1780
1781 function downloadToFile(name){
1782 var downloadForm = "";
1783 downloadForm += "<form action=\"iSlideManager.php\" method=\"post\">";
1784 downloadForm += "<input type=\"hidden\" name=\"cmd\" value=\"download\">";
1785 downloadForm += "<input type=\"hidden\" name=\"name\" value=\""+name+"\">";
1786 downloadForm += "<input type=\"hidden\" name=\"filetype\" value=\"svg\">";
1787 downloadForm += "<input type=\"submit\">";
1788 downloadForm += "</form>";
1789
1790 var cmdForm = document.getElementById('cmdForm');
1791 cmdForm.innerHTML = downloadForm;
1792 cmdForm.firstChild.submit();
1793 }
1794
1795 //////// Event Handler
1796 function selectedRectangle(x, y, ex, ey){
1797 if(!svg_select) return null;
1798
1799 svg_select.setAttribute("x",x);
1800 svg_select.setAttribute("y",y);
1801 svg_select.setAttribute("width", ex-x);
1802 svg_select.setAttribute("height", ey-y);
1803 svg_select.setAttribute("visibility", "visible");
1804 return svg_select;
1805 }
1806
1807 function hideSelectedRectangle(){
1808 svg_select.setAttribute("x",0);
1809 svg_select.setAttribute("y",0);
1810 svg_select.setAttribute("width",0);
1811 svg_select.setAttribute("height",0);
1812 svg_select.setAttribute("visibility","hidden");
1813 }
1814
1815 function setInnerHTML(id, val){
1816 var itm=document.getElementById(id);
1817 if(itm) itm.innerHTML=val;
1818 }
1819
1820 function toggleRotateScaleLock(){
1821 var lock = document.getElementById('lock');
1822 if(svg_rotate_locked){
1823 svg_rotate_locked=false;
1824 if(lock.style.top == '450px'){
1825 lock.style.display='none';
1826 }else{
1827 svg_scale_locked=true;
1828 lock.style.top = '470px';
1829 }
1830 return;
1831 }
1832 if(svg_scale_locked){
1833 svg_scale_locked=false;
1834 if(lock.style.top == '470px'){
1835 lock.style.display='none';
1836 }else{
1837 svg_rotate_locked=true;
1838 lock.style.top = '450px';
1839 }
1840 return;
1841 }
1842
1843 }
1844
1845 function setRotLock(){
1846 var lock = document.getElementById('lock');
1847 if(!svg_rotate_locked){
1848 svg_rotate_locked = true;
1849 svg_scale_locked = false;
1850 lock.style.top = '450px';
1851 lock.style.display='block';
1852 }else alert("setRotLock");
1853 }
1854
1855 function setScaleLock(){
1856 var lock = document.getElementById('lock');
1857 if(!svg_scale_locked){
1858 svg_scale_locked = true;
1859 svg_rotate_locked = false;
1860 lock.style.top = '470px';
1861 lock.style.display='block';
1862 }else alert("setScaleLock");
1863 }
1864
1865 function popupInfo(val){
1866 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1867 str += val;
1868 setInnerHTML('popup', str);
1869 showItemById('popup');
1870 }
1871
1872 function addAttributeVal(obj, itm, dv){
1873 if(obj.hasAttribute(itm)){
1874 var x = parseInt(obj.getAttribute(itm));
1875 x = x + dv;
1876 obj.setAttribute(itm, x)
1877 }else alert("No such attribute:"+itm);
1878 }
1879
1880 function showSVGSource(){
1881 var str = getSVGContent();
1882 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1883 escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1884 escstr += "<textarea cols=\"100\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1885 setInnerHTML('popup', escstr);
1886 showItemById('popup');
1887 }
1888
1889
1890 function getElementTag(obj){
1891 if (!obj) return null;
1892 if(!obj.tagName) return "NoName";
1893 var tag = obj.tagName.split(':');
1894 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1895 return tag[0];
1896 }
1897
1898 function setSVGObjectProp(obj){
1899 var tag = getElementTag(obj);
1900 var res ="";
1901 switch(tag){
1902 case 'text':
1903 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"),getRotateAngle(obj));
1904 break;
1905 case 'rect':
1906 case 'circle':
1907 case 'ellipse':
1908 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"),
1909 obj.getAttribute("fill"),obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1910 break;
1911 case 'path':
1912 case 'line':
1913 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1914 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1915 break;
1916 case 'image':
1917 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"),getRotateAngle(obj));
1918 break;
1919 case 'g':
1920 res += '<button onClick="ungroupSVGObjects();">Ungroup</button>';
1921 break;
1922 default:
1923 break;
1924 }
1925
1926 return res
1927 }
1928
1929 function updateSVGObj(){
1930 if(selectedItems.length != 1) return;
1931 var obj = selectedItems[0];
1932 var tag = getElementTag(obj);
1933 var deg=document.getElementById('svg_rotate');
1934 var res ="";
1935 switch(tag){
1936 case 'text':
1937 var txt=document.getElementById('svg_text');
1938 var color=document.getElementById('svg_color');
1939 var size=document.getElementById('svg_size');
1940 obj.textContent = txt.value;
1941 obj.setAttribute("fill", color.value);
1942 obj.setAttribute("font-size", size.value);
1943 setRotate(obj,deg.value);
1944 break;
1945 case 'rect':
1946 case 'circle':
1947 case 'ellipse':
1948 var fill=document.getElementById('svg_fill');
1949 var color=document.getElementById('svg_color');
1950 var L=document.getElementById('svg_stroke');
1951 var dash=document.getElementById('svg_stroke_type');
1952 obj.setAttribute("fill", fill.value);
1953 obj.setAttribute("stroke", color.value);
1954 obj.setAttribute("stroke-width", L.value);
1955 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1956 setRotate(obj,deg.value);
1957 break;
1958 case 'path':
1959 case 'line':
1960 var fill=document.getElementById('svg_fill');
1961 var color=document.getElementById('svg_color');
1962 var L=document.getElementById('svg_stroke');
1963 var dash=document.getElementById('svg_stroke_type');
1964 obj.setAttribute("fill", fill.value);
1965 obj.setAttribute("stroke", color.value);
1966 obj.setAttribute("stroke-width", L.value);
1967 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1968 setRotate(obj,deg.value);
1969
1970 var id = obj.getAttribute("id");
1971 var marker = document.getElementById(id+'_startarrow');
1972 if(marker) marker.setAttribute("fill", color.value);
1973 var marker = document.getElementById(id+'_endarrow');
1974 if(marker) marker.setAttribute("fill", color.value);
1975 break;
1976 case 'image':
1977 var fname=document.getElementById('svg_text');
1978 var w=document.getElementById('svg_w');
1979 var h=document.getElementById('svg_h');
1980 obj.setAttribute("xlink:href", fname.value);
1981 obj.setAttribute("width", w.value);
1982 obj.setAttribute("height", h.value);
1983 setRotate(obj,deg.value);
1984 break;
1985 default:
1986 break;
1987 }
1988
1989 }
1990
1991 function delSVGObj(){
1992 if(!svg_top) return;
1993 for(var i=0; i< selectedItems.length; i++){
1994 var obj = selectedItems[i];
1995 removeAllMarker(obj);
1996 svg_top.removeChild(obj);
1997 }
1998 hideSelectedRectangle();
1999 }
2000
2001 ///// For MobileSafari
2002 function getPreviewX(x){ return x - preview.offsetLeft; }
2003 function getPreviewY(y){ return y - preview.offsetTop; }
2004
2005 function calcDict(x1, y1, x2, y2){
2006 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
2007 }
2008
2009 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
2010 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
2011 }
2012
2013 function getAttributeVal(obj, name){
2014 try{
2015 return parseInt(obj.getAttribute(name));
2016 }catch(e){ return 0; }
2017 }
2018
2019 function checkIntersection(obj, x, y, ex, ey){
2020 if(!obj) return false;
2021 var res = true;
2022 var bbox = obj.getBBox();
2023 var ox = bbox.x;
2024 var oy = bbox.y;
2025 var oex = bbox.x+bbox.width;
2026 var oey = bbox.y+bbox.height;
2027 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
2028
2029 var tag = getElementTag(obj);
2030 switch(tag){
2031 case 'circle':
2032 case 'ellipse':
2033 var cx = getAttributeVal(obj,"cx");
2034 var cy = getAttributeVal(obj,"cy");
2035 var rx = getAttributeVal(obj,"r");
2036 var ry = rx;
2037 if(!rx){
2038 var rx = getAttributeVal(obj,"rx");
2039 var ry = getAttributeVal(obj,"ry");
2040 }
2041
2042 if(res){
2043 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
2044 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
2045 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
2046 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
2047 }
2048 break;
2049 case 'path':
2050 var d = obj.getAttribute("d");
2051 var p = getPoints(d);
2052 for(var i=0;i<p.length;i++){
2053 var ox=p[i][0];
2054 var oy=p[i][1];
2055 if(x < ox && ox < ex && y < oy && oy < ey) {
2056 return true;
2057 }
2058 }
2059 return false;
2060 break;
2061 case 'line':
2062 var x1 = getAttributeVal(obj,"x1");
2063 var y1 = getAttributeVal(obj,"y1");
2064 var x2 = getAttributeVal(obj,"x2");
2065 var y2 = getAttributeVal(obj,"y2");
2066 var d = (y2-y1)/(x2-x1);
2067
2068 if(res){
2069 var xx = Math.abs(x2-x1);
2070 var sign = 1;
2071 if(x2-x1 < 0){ sign = -1; }
2072 for(var i=0; i < xx; i++){
2073 var nx = i*sign + x1;
2074 var ny = d * i*sign + y1;
2075 if(x < nx && nx < ex && y < ny && ny < ey) return true;
2076 }
2077 }
2078 return false;
2079
2080 return res;
2081 break;
2082 case 'text':
2083 case 'rect':
2084 case 'polygon':
2085 case 'polyline':
2086 case 'image':
2087 case 'g':
2088 break;
2089 default:
2090 res=false;
2091 break;
2092 }
2093 return res;
2094 }
2095
2096 function getBoundingBox(obj){
2097 var res = new Array(4);
2098 var bbox = obj.getBBox();
2099 res[0] = bbox.x-1;
2100 res[1] = bbox.y-1;
2101 res[2] = bbox.x+bbox.width+2;
2102 res[3] = bbox.y+bbox.height+2;
2103 return res;
2104 }
2105
2106 function setSelectBox(){
2107 if(!svg_select) return;
2108
2109 if(selectedItems.length == 0){
2110 hideSelectedRectangle()
2111 return;
2112 }
2113
2114 var bbox = new Array(1000,1000,0,0);
2115
2116 for(var i=0;i<selectedItems.length;i++){
2117 var bp = getBoundingBox(selectedItems[i]);
2118 if(bp[0] < bbox[0]) bbox[0]=bp[0];
2119 if(bp[1] < bbox[1]) bbox[1]=bp[1];
2120 if(bp[2] > bbox[2]) bbox[2]=bp[2];
2121 if(bp[3] > bbox[3]) bbox[3]=bp[3];
2122 }
2123 selectedRectangle(bbox[0], bbox[1], bbox[2], bbox[3]);
2124 }
2125
2126 function getSelectedObjects(x1, y1, x2, y2){
2127 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
2128 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
2129
2130 var val="";
2131 if(svg_top){
2132 var val ="";
2133 var objs = svg_top.childNodes;
2134 selectedItems = new Array();
2135 for(var i=0; i<objs.length;i++){
2136 if(objs[i].tagName){
2137
2138 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
2139 selectedItems.push(objs[i]);
2140 }
2141 val += objs[i].tagName+" ";
2142 }
2143 }
2144 }
2145 setSelectBox();
2146 }
2147
2148 function dupObject(){
2149 if(selectedItems.length == 0){ return; }
2150 dupItems = selectedItems;
2151 dupX = parseInt(svg_select.getAttribute("x"));
2152 dupY = parseInt(svg_select.getAttribute("y"));
2153 setSVGMode('Duplicate');
2154 }
2155
2156 function pasteObject(x,y){
2157 if(selectedItems.length == 0){ return; }
2158 for(var i=0;i<dupItems.length;i++){
2159 var itm = dupItems[i].cloneNode(true);
2160 itm.setAttribute("id", newID());
2161 replaceTranslate(itm,x-dupX,y-dupY);
2162 updateTransform(itm);
2163 appendSVGObj(itm);
2164 }
2165 }
2166
2167 function onTouchStartCore(){
2168 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
2169 var x1=getPreviewX(sx-1);
2170 var y1=getPreviewY(sy-1);
2171 var x2=getPreviewX(sx+2);
2172 var y2=getPreviewY(sy+2);
2173 getSelectedObjects(x1, y1, x2, y2);
2174
2175 if(selectedItems.length == 0){
2176 setSVGMode('selector');
2177 }else if(selectedItems.length == 1){
2178 targetItem=selectedItems[0];
2179 }else{
2180 setSVGMode('Group');
2181 }
2182 }else { // CreateMode
2183 if(selectedItems.length == 0){
2184
2185 var fill=document.getElementById('svg_fill');
2186 var color=document.getElementById('svg_color');
2187 var L=document.getElementById('svg_stroke');
2188
2189 var x = getPreviewX(sx);
2190 var y = getPreviewY(sy);
2191
2192 switch(modeSVG){
2193 case 'text':
2194 var txt=document.getElementById('svg_text');
2195 var size=document.getElementById('svg_size');
2196 if(txt.value){
2197 y = y + parseInt(size.value)*0.8;
2198 targetItem=createSVGText(txt.value, x, y, size.value, color.value);
2199 }else{
2200 putInputForm(x, y, txt.value, size.value);
2201 }
2202 break;
2203 case 'rect':
2204 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
2205 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2206 break;
2207 case 'circle':
2208 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
2209 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2210 break;
2211 case 'ellipse':
2212 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
2213 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2214 break;
2215 case 'newPath':
2216 //var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
2217 var attr = 'd=M '+x+' '+y+' L';
2218 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
2219 is_newPath=true;
2220 break;
2221 case 'newLine':
2222 var x2=x+1;
2223 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
2224 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
2225 break;
2226 case 'image':
2227 var attr = 'x='+x+',y='+y;
2228 var txt=document.getElementById('svg_text');
2229 var w=document.getElementById('svg_w');
2230 var h=document.getElementById('svg_h');
2231 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
2232 default:
2233 break;
2234 }
2235 if (targetItem){
2236 appendSVGObj(targetItem);
2237 selectedItems[0]=targetItem;
2238 }
2239 }else{
2240 var x1=getPreviewX(sx-1);
2241 var y1=getPreviewY(sy-1);
2242 var x2=getPreviewX(sx+2);
2243 var y2=getPreviewY(sy+2);
2244
2245 if(modeSVG == 'Duplicate'){ pasteObject(x1,y1); }
2246 if(modeSVG == 'newPath'){
2247 if(targetItem.tagName == 'path' ){
2248 var path = targetItem.getAttribute("d");
2249 path = path + ' '+ getPreviewX(sx) + ' '+ getPreviewY(sy) ;
2250 targetItem.setAttribute("d",path);
2251 }
2252 return;
2253 }
2254 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
2255 setSVGMode('selector');
2256 }
2257 }
2258 }
2259 }
2260
2261
2262 function onDoubleTap(e){
2263 if(selectedItems.length == 1 ){
2264 hideSelectedRectangle();
2265
2266 var obj = selectedItems[0];
2267 if(!obj) return;
2268 switch(obj.tagName){
2269 case 'svg:text':
2270 case 'text':
2271 var txt = trim(obj.textContent);
2272 var size = parseInt(obj.getAttribute("font-size"));
2273 var x = parseInt(obj.getAttribute("x"));
2274 var y = parseInt(obj.getAttribute("y"));
2275 x = x-20;
2276 y = y-size*0.8 -10;
2277 putInputForm(x, y, txt, size, obj.id);
2278 obj.style.display = 'none';
2279 editingTextObj = obj;
2280 break;
2281 case 'path':
2282 if(modeSVG == 'newPath'){ setSVGMode('selector'); }
2283 break;
2284 default:
2285 break;
2286 }
2287 return false;
2288 }
2289 }
2290
2291 function getPoints(d){
2292 var p = d.split(' ');
2293 var res = new Array();
2294 var isx=true;
2295 var x, y;
2296 for(var i=0; i<p.length;i++){
2297 if(p[i].match('[MLHVCSQTA]','i')){
2298 }else{
2299 if(isx){
2300 x = parseInt(p[i]);
2301 }else{
2302 y = parseInt(p[i]);
2303 res.push(new Array(x, y));
2304 }
2305 isx = !isx;
2306 }
2307 }
2308 return res;
2309 }
2310
2311 function updatePath(d, x, y){
2312 var p = d.split(' ');
2313 var res = "";
2314 var isx=true;
2315 var val;
2316 for(var i=0; i<p.length;i++){
2317 if(trim(p[i]) == "") continue;
2318 if(p[i].match('[MLHVCSQTA]','i')){
2319 res += ' '+p[i];
2320 }else{
2321 if(isx){
2322 val = parseInt(p[i])+x;
2323 }else{
2324 val = parseInt(p[i])+y;
2325 }
2326
2327 res += ' '+ val;
2328 isx = !isx;
2329 }
2330 }
2331 return trim(res);
2332 }
2333
2334 function translateObject(obj, dx, dy){
2335 switch(getElementTag(obj)){
2336 case 'text':
2337 case 'rect':
2338 case 'image':
2339 addAttributeVal(obj, "x", dx);
2340 addAttributeVal(obj, "y", dy);
2341 break;
2342 case 'circle':
2343 case 'ellipse':
2344 addAttributeVal(obj, "cx", dx);
2345 addAttributeVal(obj, "cy", dy);
2346 break;
2347
2348 case 'path':
2349 var path = obj.getAttribute("d");
2350 obj.setAttribute("d", updatePath(path, dx, dy));
2351 break;
2352 case 'line':
2353 var x1 = getAttributeVal(obj,"x1");
2354 var y1 = getAttributeVal(obj,"y1");
2355 var x2 = getAttributeVal(obj,"x2");
2356 var y2 = getAttributeVal(obj,"y2");
2357 obj.setAttribute("x1", x1+dx);
2358 obj.setAttribute("y1", y1+dy);
2359 obj.setAttribute("x2", x2+dx);
2360 obj.setAttribute("y2", y2+dy);
2361
2362 break;
2363 case 'g':
2364 var objs = obj.childNodes;
2365 for(var i=0;i<objs.length;i++){ translateObject(objs[i], dx, dy); }
2366 break;
2367 default:
2368 break;
2369 }
2370 }
2371
2372 function updateTransform(obj){
2373 try{
2374 var trans = obj.getAttribute("transform");
2375 if(!trans) return;
2376 if(trans.match(new RegExp("translate(.+,.+)","i"))){
2377 var str = RegExp.lastMatch;
2378 var vals = str.substr(10,str.length-11).split(',') ;
2379 var dx = parseInt(vals[0]);
2380 var dy = parseInt(vals[1]);
2381 translateObject(obj, dx, dy);
2382 replaceTranslate(obj, 0, 0);
2383 updateRotate(obj);
2384 }
2385 }catch (e){
2386 }
2387 }
2388
2389 function moveSelectedRectangle(dx, dy){
2390 if(!svg_select) return;
2391 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
2392 }
2393
2394 function updateSelectedRectangle(){
2395 if(!svg_select) return;
2396 if(selectedItems.length > 0){
2397 svg_select.setAttribute("visibility","visible");
2398 }else{
2399 hideSelectedRectangle();
2400 }
2401 }
2402
2403 function clearSelectedItems(){
2404 targetItem=null;
2405 for(i in selectedItems) delete selectedItems[i];
2406 selectedItems=new Array();
2407 updateSelectedRectangle();
2408 }
2409
2410
2411 function replaceTranslate(obj, dx, dy){
2412 var trans = obj.getAttribute("transform");
2413
2414 if(trans && trans.indexOf("translate")>=0){
2415 var strs = trans.split(' ');
2416 trans = "";
2417 for(var i=0; i<strs.length; i++){
2418 if(strs[i].indexOf("translate")>=0){
2419 if (dx == 0 && dy == 0){ strs[i]=""; }else{ strs[i] = "translate("+dx+","+dy+")"; }
2420 }
2421
2422 trans += strs[i]+" ";
2423 }
2424 if(trim(trans)){ obj.setAttribute("transform", trim(trans));}
2425 else obj.removeAttribute("transform");
2426 }else{
2427 if(trans){
2428 trans += " translate("+dx+","+dy+")";
2429 obj.setAttribute("transform", trans);
2430 }else{
2431 obj.setAttribute("transform","translate("+dx+","+dy+")");
2432 }
2433 }
2434 updateRotate(obj,dx,dy);
2435 }
2436
2437 function updateRotate(obj,dx,dy){
2438 var trans = obj.getAttribute("transform");
2439
2440 if(!trans || trans.indexOf("rotate") < 0) return;
2441 var bbox = obj.getBBox();
2442 var x = bbox.x+bbox.width/2;
2443 var y = bbox.y+bbox.height/2;
2444 var strs = trans.split(' ');
2445 trans = "";
2446
2447 for(var i=0; i<strs.length ;i++){
2448 if(strs[i].indexOf("rotate") >= 0){
2449 var deg = strs[i].substr(7, strs[i].indexOf(",")-7);
2450 if(dx) x += dx;
2451 if(dy) y += dy;
2452 strs[i] = "rotate("+deg+","+x+","+y+")";
2453 }
2454 trans += strs[i]+" ";
2455 }
2456 obj.setAttribute("transform",trim(trans));
2457 }
2458
2459 function getRotateAngle(obj){
2460 var trans = obj.getAttribute("transform");
2461 if(!trans || trans.indexOf("rotate") < 0) return 0;
2462 var strs = trans.split(' ');
2463 for(var i=0; i<strs.length ;i++){
2464 if(strs[i].indexOf("rotate") >= 0){
2465 var deg = strs[i].substr(7, strs[i].indexOf(",")-7);
2466 return parseInt(deg);
2467 }
2468 }
2469 return 0;
2470 }
2471
2472 function setRotate(obj,deg){
2473 var trans = obj.getAttribute("transform");
2474 var bbox = obj.getBBox();
2475 var x = bbox.x+bbox.width/2;
2476 var y = bbox.y+bbox.height/2;
2477
2478 if(!trans) trans="";
2479 if(trans.indexOf("rotate") < 0){
2480 trans = "rotate("+deg+","+x+","+y+")";
2481 obj.setAttribute("transform", trans);
2482 }else{
2483 var strs = trans.split(' ');
2484 trans = "";
2485 for(var i=0; i<strs.length ;i++){
2486 if(strs[i].indexOf("rotate") >= 0){ strs[i] = "rotate("+deg+","+x+","+y+")"; }
2487 trans += strs[i]+" ";
2488 }
2489 obj.setAttribute("transform",trim(trans));
2490 }
2491 }
2492
2493 function getScale(obj){
2494 var trans = obj.getAttribute("transform");
2495 if(!trans || trans.indexOf("scale") < 0) return null;
2496 var strs = trans.split(' ');
2497 for(var i=0; i<strs.length ;i++){
2498 if(strs[i].indexOf("scale") >= 0){
2499 var degs = strs[i].substr(6, strs[i].indexOf(")")-6);
2500 var degs = degs.split(',');
2501 return new Array(parseFloat(degs[0]), parseFloat(degs[1]));
2502 }
2503 }
2504 return null;
2505 }
2506
2507 function setScale(obj,scaleX, scaleY){
2508 var trans = obj.getAttribute("transform");
2509 var x = parseInt(svg_select.getAttribute("x"));
2510 var y = parseInt(svg_select.getAttribute("y"));
2511 var dx = x - scaleX*x;
2512 var dy = y - scaleY*y;
2513
2514 if(!trans) trans="";
2515 if(trans.indexOf("scale") < 0){
2516 trans = "scale("+scaleX+","+scaleY+")";
2517 obj.setAttribute("transform", trans);
2518 }else{
2519 var strs = trans.split(' ');
2520 trans = "";
2521 for(var i=0; i<strs.length ;i++){
2522 if(strs[i].indexOf("scale") >= 0){ strs[i] = "scale("+scaleX+","+scaleY+")"; }
2523 if(scaleX == 1 && scaleY == 1) continue;
2524 trans += strs[i]+" ";
2525 }
2526 obj.setAttribute("transform",trim(trans));
2527 }
2528 replaceTranslate(obj, dx/scaleX, dy/scaleY);
2529 }
2530
2531 function onTouchMoveCode1(pageX, pageY){
2532 if(targetItem || selectedItems.length > 0){
2533 switch(modeSVG){
2534 case 'newPath':
2535 if(targetItem.tagName == 'path' ){
2536 var path = targetItem.getAttribute("d");
2537 path = path + ' '+ getPreviewX(pageX) + ' '+ getPreviewY(pageY) ;
2538 targetItem.setAttribute("d",path);
2539 }
2540 break;
2541 case 'newLine':
2542 if(targetItem.tagName == 'line' ){
2543 var x2 = getPreviewX(pageX);
2544 var y2 = getPreviewY(pageY);
2545 targetItem.setAttribute("x2",x2);
2546 targetItem.setAttribute("y2",y2);
2547 }
2548 break;
2549 default:
2550 var dx = pageX - sx;
2551 var dy = pageY - sy;
2552
2553 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
2554 var lx = getPreviewX(pageX);
2555 var ly = getPreviewY(pageY);
2556
2557 if(!lineEdit){
2558 var x1 = getAttributeVal(selectedItems[0],"x1");
2559 var y1 = getAttributeVal(selectedItems[0],"y1");
2560 var x2 = getAttributeVal(selectedItems[0],"x2");
2561 var y2 = getAttributeVal(selectedItems[0],"y2");
2562 var xc = (x1+x2)/2;
2563 var yc = (y1+y2)/2;
2564 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
2565 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
2566 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
2567
2568 var minVal = Math.min(eS, Math.min(eC, eE));
2569 if(minVal == eS) lineEdit='start';
2570 else if(minVal == eE) lineEdit='end';
2571 else lineEdit='move';
2572 }
2573 if(lineEdit=='start'){
2574 selectedItems[0].setAttribute("x1",lx );
2575 selectedItems[0].setAttribute("y1",ly );
2576 setSelectBox();
2577 }else if(lineEdit == 'end'){
2578 selectedItems[0].setAttribute("x2",lx );
2579 selectedItems[0].setAttribute("y2",ly );
2580 setSelectBox();
2581 }else{
2582 replaceTranslate(selectedItems[0], dx, dy);
2583 moveSelectedRectangle(dx, dy);
2584 }
2585 }else{
2586 for(var i=0; i<selectedItems.length;i++){
2587 if(selectedItems[i]){
2588 replaceTranslate(selectedItems[i], dx, dy);
2589 }
2590 }
2591 moveSelectedRectangle(dx, dy);
2592 }
2593 break;
2594 }
2595 updateShowMenu();
2596 }else if(modeSVG == 'selector'){
2597 ex = pageX;
2598 ey = pageY;
2599 var x1=sx;
2600 var y1=sy;
2601 var x2=ex;
2602 var y2=ey;
2603
2604 if(sx > ex){ x1=ex; x2=sx; }
2605 if(sy > ey){ y1=ey; y2=sy; }
2606
2607 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
2608 }
2609 }
2610
2611 function svgInputTextExec(e){
2612 var inputform = document.getElementById('svg_input');
2613 var color=document.getElementById('svg_color');
2614 var size=document.getElementById('svg_size');
2615 if(!color || !size) return;
2616 var y = parseInt(inputform.style.top) + parseInt(size.value)*0.8 + 12;
2617 var x = parseInt(inputform.style.left) + 12;
2618 if(inputform.value){
2619 targetItem=createSVGText(inputform.value, x, y, size.value, color.value);
2620
2621 appendSVGObj(targetItem);
2622 }
2623 inputform.setAttribute("type", "hidden");
2624 setSVGMode('selector');
2625 }
2626
2627 function svgModifyTextExec(e){
2628 var inputform = document.getElementById('svg_input');
2629 editingTextObj.textContent = inputform.value;
2630 inputform.setAttribute("type", "hidden");
2631 editingTextObj.style.display='block';
2632
2633 editingTextObj=null;
2634 setSVGMode('selector');
2635 }
2636
2637 function svgInputFormAdjust(e){
2638 var inputform = document.getElementById('svg_input');
2639 inputform.size = jstrlen(inputform.value) + 1;
2640 }
2641
2642 function jstrlen(str) {
2643 var len = 0;
2644 str = escape(str);
2645 for (var i = 0; i < str.length; i++, len++) {
2646 if (str.charAt(i) == "%") {
2647 if (str.charAt(++i) == "u") {
2648 i += 3;
2649 len++;
2650 }
2651 i++;
2652 }
2653 }
2654 return len;
2655 }
2656
2657 function putInputForm(x, y, txt, size, id){
2658 var inputform = document.getElementById('svg_input');
2659 if(!inputform){
2660 inputform = document.createElement('input');
2661 inputform.setAttribute("id", "svg_input");
2662 inputform.setAttribute("style", "position:absolute;top:0px;left:0px; border:0px none");
2663 preview.appendChild(inputform);
2664 }
2665
2666 if(document.addEventListner){
2667 if(id){
2668 inputform.addEventListener("onChange", svgModifyTextExec,false);
2669 }else{
2670 inputform.addEventListener("onChange", svgInputTextExec,false);
2671 }
2672 inputform.addEventListener("onkeydown", svgInputFormAdjust,false);
2673 }else{
2674 if(id){
2675 inputform.setAttribute("onChange", "svgModifyTextExec()");
2676 }else{
2677 inputform.setAttribute("onChange", "svgInputTextExec()");
2678 }
2679 inputform.setAttribute("onkeydown", "svgInputFormAdjust()");
2680 }
2681
2682 inputform.setAttribute("type", "text");
2683 inputform.style.left=x+'px';
2684 inputform.style.top=y+'px';
2685 inputform.style.fontSize=size+'px';
2686 inputform.style.background='none';
2687 inputform.value = txt;
2688 inputform.size = jstrlen(txt) + 1;
2689 inputform.focus();
2690 }
2691
2692 ///// EventHandler for iPad
2693
2694 function onTouchStart(e){
2695 //e.preventDefault();
2696 sx=e.touches[0].pageX;
2697 sy=e.touches[0].pageY;
2698 ex=e.touches[0].pageX;
2699 ey=e.touches[0].pageY;
2700
2701 if (e.touches.length == 1){
2702 var touchtime = new Date();
2703 var dt = touchtime.getTime() - firstTouch.getTime();
2704 if(editingTextObj){
2705 var inputform = document.getElementById('svg_input');
2706 inputform.setAttribute("type", "hidden");
2707 editingTextObj.style.display='block';
2708 editingTextObj=null;
2709 }
2710 if(dt < 300 ){ onDoubleTap(); }else{ onTouchStartCore(); }
2711 firstTouch = touchtime;
2712 }
2713 updateSelectedRectangle();
2714 }
2715
2716 function onTouchMove(e){
2717 if (e.touches.length == 1){
2718 e.preventDefault();
2719 onTouchMoveCode1(e.touches[0].pageX, e.touches[0].pageY);
2720 }else if (e.touches.length == 2){
2721 if(selectedItems.length == 1){
2722 e.preventDefault();
2723 var dx = e.touches[0].pageX-e.touches[1].pageX;
2724 var dy = e.touches[0].pageY-e.touches[1].pageY;
2725 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2726
2727 if(th > 165 || th < 25) svg_scale_dir = 'x';
2728 else if(th > 65 && th < 115) svg_scale_dir = 'y';
2729 else svg_scale_dir = null;
2730 }
2731 }
2732 }
2733
2734 function onTouchEnd(e){
2735 e.preventDefault();
2736
2737 for(var i=0; i<selectedItems.length;i++){
2738 updateTransform(selectedItems[i]);
2739 }
2740
2741 if(modeSVG == 'selector'){
2742 var x1 = getPreviewX(sx);
2743 var y1 = getPreviewY(sy);
2744 var x2 = getPreviewX(ex);
2745 var y2 = getPreviewY(ey);
2746 getSelectedObjects(x1, y1, x2, y2);
2747 }
2748
2749 updateSelectedRectangle();
2750 updateTransform(svg_select);
2751
2752 setSelectBox();
2753 updateShowMenu();
2754 lineEdit=null;
2755 }
2756
2757
2758 function onGestureStart(e){
2759 targetItem = selectedItems[0];
2760 if(targetItem){
2761 svg_wo = targetItem.getAttribute("width");
2762 svg_ho = targetItem.getAttribute("height");
2763 svg_ro = targetItem.getAttribute("r");
2764 svg_rxo = targetItem.getAttribute("rx");
2765 svg_ryo = targetItem.getAttribute("ry");
2766 svg_fsize = targetItem.getAttribute("font-size");
2767 }else{
2768 svg_wo = null;
2769 svg_ho = null;
2770 svg_ro = null;
2771 svg_rxo = null;
2772 svg_ryo = null;
2773 svg_fsize = null;
2774 }
2775 }
2776
2777 function scaleGesture(obj,scale){
2778 switch(getElementTag(obj)){
2779 case 'text':
2780 if(svg_fsize) obj.setAttribute("font-size", Math.round(svg_fsize*scale) );
2781 break;
2782 case 'rect':
2783 case 'image':
2784 if(svg_wo && svg_scale_dir != 'y') obj.setAttribute("width",Math.round(svg_wo*scale ));
2785 if(svg_ho && svg_scale_dir != 'x') obj.setAttribute("height",Math.round(svg_ho*scale ));
2786 break;
2787 case 'circle':
2788 if(svg_ro) obj.setAttribute("r",Math.round(svg_ro*scale ));
2789 break;
2790 case 'ellipse':
2791 if (svg_rxo && svg_scale_dir != 'y') obj.setAttribute("rx",Math.round(svg_rxo*scale) );
2792 if (svg_ryo && svg_scale_dir != 'x') obj.setAttribute("ry",Math.round(svg_ryo*scale) );
2793 break;
2794 case 'path':
2795 case 'line':
2796 var scaleX = scale;
2797 var scaleY = scale;
2798 if(svg_scale_dir == 'x') scaleY=1;
2799 else if(svg_scale_dir == 'y') scaleX=1;
2800 setScale(obj, scaleX, scaleY);
2801
2802 break;
2803 defult:
2804 break;
2805 }
2806 }
2807
2808 function updatePathAndLine(){
2809 if(getElementTag(targetItem) == 'path'){
2810 var scale = getScale(targetItem);
2811 if(scale){
2812 setScale(targetItem,1,1);
2813 scalePath(targetItem, scale);
2814 }
2815 }else if(getElementTag(targetItem) == 'line'){
2816 var scale = getScale(targetItem);
2817 if(scale){
2818 setScale(targetItem, 1,1);
2819 scaleLine(targetItem, scale);
2820 }
2821 }
2822 }
2823
2824 function onGestureChange(e){
2825 var scale = e.scale;
2826 var rotation = e.rotation;
2827
2828 if(targetItem){
2829 e.preventDefault();
2830 if(!svg_scale_locked) scaleGesture(targetItem,scale);
2831 if(!svg_rotate_locked) setRotate(targetItem, rotation);
2832
2833 updateShowMenu();
2834 }
2835 }
2836
2837
2838 function onGestureEnd(e){
2839 svg_wo = null;
2840 svg_ho = null;
2841 svg_ro = null;
2842 svg_rxo = null;
2843 svg_ryo = null;
2844 svg_fsize = null;
2845
2846 updatePathAndLine();
2847 }
2848
2849 function setObjectColor(obj, color_sel, color){
2850 try{
2851 var tag = getElementTag(obj);
2852 if(tag == "NoName") return;
2853 if(tag == "g"){
2854 var objs=obj.childNodes;
2855 for(var i=0;i<objs.length;i++){
2856 setObjectColor(objs[i], color_sel, color);
2857 }
2858 }
2859 obj.setAttribute(color_sel, color);
2860 if(color_sel == 'fill'){
2861 if(fill_input) fill_input.value=color;
2862 document.getElementById('toolFill').style.backgroundColor=color;
2863 }else{
2864 color_input.value=color;
2865 document.getElementById('toolStroke').style.backgroundColor=color;
2866 }
2867 }catch(e){}
2868 }
2869
2870 function onTouchStartColor(e){
2871 if(e.touches.length == 1){
2872 var ele = e.touches[0].target;
2873 var color;
2874 try{
2875 color = ele.getAttribute("color-val");
2876 }catch(err){ hideItemById('color-palette'); return;}
2877 var palette = document.getElementById('color-palette');
2878 var color_sel = palette.getAttribute("targetType");
2879 var fill_input = document.getElementById('svg_fill');
2880 var color_input = document.getElementById('svg_color');
2881 if(color) {
2882 for(var i=0;i < selectedItems.length; i++){
2883 setObjectColor(selectedItems[i], color_sel, color);
2884 }
2885 }
2886 palette.style.display='none'; }
2887 }
2888
2889 ///// For Safari
2890 var mouse_state=0;
2891
2892 function onMouseDown(e){
2893 mouse_state=e.which;
2894
2895 sx=e.pageX;
2896 sy=e.pageY;
2897 ex=e.pageX;
2898 ey=e.pageY;
2899
2900 if(isChildById(e.target, 'preview') || e.target.id == 'preview') {
2901 if(editingTextObj){
2902 var inputform = document.getElementById('svg_input');
2903 inputform.setAttribute("type", "hidden");
2904 editingTextObj.style.display='block';
2905 editingTextObj=null;
2906 }
2907
2908 if(e.altKey){
2909 targetItem = selectedItems[0];
2910 if(targetItem){
2911 svg_wo = targetItem.getAttribute("width");
2912 svg_ho = targetItem.getAttribute("height");
2913 svg_ro = targetItem.getAttribute("r");
2914 svg_rxo = targetItem.getAttribute("rx");
2915 svg_ryo = targetItem.getAttribute("ry");
2916 svg_fsize = targetItem.getAttribute("font-size");
2917 }else{
2918 svg_wo = null;
2919 svg_ho = null;
2920 svg_ro = null;
2921 svg_rxo = null;
2922 svg_ryo = null;
2923 svg_fsize = null;
2924 }
2925 }else{
2926 onTouchStartCore();
2927 }
2928 updateSelectedRectangle();
2929 return false;
2930 }else if(isChildById(e.target, 'color-palette') && e.target.tagName == 'DIV'){
2931 var ele = e.target;
2932 var palette = document.getElementById('color-palette');
2933 var color = ele.getAttribute("color-val");
2934 var color_sel = palette.getAttribute("targetType");
2935 var fill_input = document.getElementById('svg_fill');
2936 var color_input = document.getElementById('svg_color');
2937 if(color) {
2938