Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 64 - (show annotations) (download) (as text)
Fri Jul 30 00:37:23 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 84856 byte(s)
bug fix
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) return res;
958 if(selectedItems.length == 1){
959 tag = getElementTag(selectedItems[0]);
960 res += setSVGObjectProp(selectedItems[0]);
961 }else{
962 switch(tag){
963 case 'text':
964 res += propSVGText("", svg_font_size, svg_color, 0);
965 break;
966 case 'rect':
967 case 'circle':
968 case 'ellipse':
969 case 'newPath':
970 case 'newLine':
971 case 'path':
972 case 'line':
973 res += propSVGObj(tag+":", svg_line_width, svg_color, svg_fill_color, "", 0);
974 break;
975 case 'image':
976 res += propSVGImage("", 100, 100, 0);
977 break;
978 default:
979 break;
980 }
981 }
982 return res;
983 }
984
985 function propSVGText(str, size, color, rot){
986 if(!size) size = 24;
987 if(!color) color = '#000000';
988 if(!rot) rot = 0;
989
990 var res = "Text:";
991 res += "<input type=\"hidden\" id=\"svg_text\" value=\""+str+"\"/>";
992 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
993 res += "Rot:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
994
995 res += "Size:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
996
997 document.getElementById('toolFill').style.backgroundColor=color;
998 return res;
999 }
1000
1001 function propSVGObj(type, stroke, color, fill, style, rot){
1002 var res = type;
1003 if(!stroke) stroke = 1;
1004 if(!color) color = '#000000';
1005 if(!fill) fill = '#ffffff';
1006 if(!rot) rot = 0;
1007
1008 res += "<input type=\"hidden\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
1009 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
1010 res += "<input type=\"hidden\" id=\"svg_stroke\" onChange=\"updateSVGObj();\" value=\""+stroke+"\" size=\"2\"/>";
1011 res += "Rot:<input type=\"text\" id=\"svg_rotate\" onChange=\"updateSVGObj();\" value=\""+rot+"\" size=\"4\"/>";
1012
1013 if(style==null) style="";
1014 res += "<input type=\"hidden\" id=\"svg_stroke_type\" onChange=\"updateSVGObj();\" value=\""+style+"\" size=\"8\"/>";
1015
1016 res += "<img id=\"strokeW\" src=\"images/strokeW.png\" usemap=\"#strokemenu\" />\n";
1017 res += "<map name=\"strokemenu\">";
1018 res += "<area shape=\"rect\" coords=\"0,0,60,25\" onClick=\"selectStrokeW(0);\">";
1019 res += "<area shape=\"rect\" coords=\"0,25,60,50\" onClick=\"selectStrokeW(1);\">";
1020 res += "<area shape=\"rect\" coords=\"0,50,60,75\" onClick=\"selectStrokeW(2);\">";
1021 res += "<area shape=\"rect\" coords=\"0,75,60,100\" onClick=\"selectStrokeW(3);\">";
1022 res += "<area shape=\"rect\" coords=\"0,100,60,125\" onClick=\"selectStrokeW(4);\">";
1023 res += "<area shape=\"rect\" coords=\"0,125,60,150\" onClick=\"selectStrokeW(5);\">";
1024 res += "<area shape=\"rect\" coords=\"0,150,60,175\" onClick=\"selectStrokeW(6);\">";
1025 res += "<area shape=\"rect\" coords=\"0,175,60,200\" onClick=\"selectStrokeW(7);\">";
1026 res += "<area shape=\"rect\" coords=\"0,200,60,225\" onClick=\"selectStrokeW(8);\">";
1027 res += "</map>";
1028
1029 res += "<img id=\"strokeDash\" src=\"images/dash_type.png\" usemap=\"#dashtype\" />\n";
1030 res += "<map name=\"dashtype\">";
1031 res += "<area shape=\"rect\" coords=\"0,0,50,25\" onClick=\"selectStrokeDash(0);\">";
1032 res += "<area shape=\"rect\" coords=\"0,25,50,50\" onClick=\"selectStrokeDash(1);\">";
1033 res += "<area shape=\"rect\" coords=\"0,50,50,75\" onClick=\"selectStrokeDash(2);\">";
1034 res += "<area shape=\"rect\" coords=\"0,75,50,100\" onClick=\"selectStrokeDash(3);\">";
1035 res += "<area shape=\"rect\" coords=\"0,100,50,125\" onClick=\"selectStrokeDash(4);\">";
1036 res += "<area shape=\"rect\" coords=\"0,125,50,150\" onClick=\"selectStrokeDash(5);\">";
1037 res += "<area shape=\"rect\" coords=\"0,150,50,175\" onClick=\"selectStrokeDash(6);\">";
1038 res += "</map>";
1039
1040 document.getElementById('toolFill').style.backgroundColor=fill;
1041 document.getElementById('toolStroke').style.backgroundColor=color;
1042 return res;
1043 }
1044
1045 function propSVGLine(type, stroke, color, fill, style, rot){
1046 var res = propSVGObj(type, stroke, color, fill, style, rot);
1047 if(!rot) rot = 0;
1048
1049 res += "<img id=\"arrow_l\" src=\"images/arrow_l.png\" usemap=\"#arrow_l\" />\n";
1050 res += "<map name=\"arrow_l\">";
1051 res += "<area shape=\"rect\" coords=\"0,0,30,25\" onClick=\"setLeftArrow();\">";
1052 res += "<area shape=\"rect\" coords=\"0,25,30,50\" onClick=\"removeLeftArrow();\">";
1053 res += "</map>";
1054
1055 res += "<img id=\"arrow_r\" src=\"images/arrow_r.png\" usemap=\"#arrow_r\" />\n";
1056 res += "<map name=\"arrow_r\">";
1057 res += "<area shape=\"rect\" coords=\"0,0,30,25\" onClick=\"setRightArrow();\">";
1058 res += "<area shape=\"rect\" coords=\"0,25,30,50\" onClick=\"removeRightArrow();\">";
1059 res += "</map>";
1060
1061
1062 res += "<img id=\"path_type\" src=\"images/path_type.png\" usemap=\"#path_type\" />\n";
1063 res += "<map name=\"path_type\">";
1064 res += "<area shape=\"rect\" coords=\"0,0,30,100\" onClick=\"togglePathType();\">";
1065 res += "</map>";
1066 document.getElementById('toolFill').style.backgroundColor=fill;
1067 document.getElementById('toolStroke').style.backgroundColor=color;
1068
1069 return res;
1070 }
1071
1072 function getStrokeWIdx(lw){
1073 var res=0;
1074 for(var i=0;i<lineW.length;i++){
1075 if(lw < lineW[i]){ return res; }
1076 res = i;
1077 }
1078 return lineW.length-1;
1079 }
1080
1081 function getStrokeW(idx){ return lineW[idx]; }
1082
1083 function updateStrokeWidth(){
1084 if(selectedItems.length == 1){
1085 var obj = selectedItems[0];
1086 if(!obj){ return; }
1087 var val = obj.getAttribute('stroke-width');
1088 if(!val) return;
1089 var lw = parseFloat(val);
1090 updateStrokeWImg(getStrokeWIdx(lw));
1091 updateStrokeDash();
1092 }
1093 }
1094
1095 function updateStrokeWImg(idx){
1096 var ele = document.getElementById('strokeW');
1097 if(!ele) return;
1098 var v1 = idx*25;
1099 var v2 = v1+25;
1100 var v3 = 81 - v1;
1101 ele.style.clip = "rect("+v1+"px,70px,"+v2+"px,0px)";
1102 ele.style.top = v3+"px";
1103 }
1104
1105 function selectStrokeW(idx){
1106 var ele = document.getElementById('strokeW');
1107 if(ele.style.clip != "rect(auto auto auto auto)"){
1108 ele.style.clip = "rect(auto auto auto auto)";
1109 ele.style.top = "81px";
1110 return;
1111 }
1112 if(selectedItems.length == 1){
1113 var obj = selectedItems[0];
1114 var lw = getStrokeW(idx);
1115 var plw = parseFloat(obj.getAttribute('stroke-width'));
1116 obj.setAttribute('stroke-width', lw);
1117 updateDashArray(obj, lw, plw, obj.getAttribute('stroke-dasharray'));
1118 updateStrokeWImg(idx);
1119 }else{
1120 updateStrokeWImg(1);
1121 }
1122 }
1123
1124 function updateStrokeDash(){
1125 if(selectedItems.length == 1){
1126 var obj = selectedItems[0];
1127 if(!obj){ return; }
1128 var val = obj.getAttribute('stroke-width');
1129 if(!val) return;
1130 var lw = parseFloat(val);
1131 var darr = obj.getAttribute('stroke-dasharray');
1132 if(!darr) return;
1133 updateStrokeDashImg( getDashArrayIndex(lw, darr) );
1134 }
1135 }
1136 function updateStrokeDashImg(idx){
1137 var ele = document.getElementById('strokeDash');
1138 if(!ele) return;
1139 var v1 = idx*25;
1140 var v2 = v1+25;
1141 var v3 = 81 - v1;
1142 ele.style.clip = "rect("+v1+"px,70px,"+v2+"px,0px)";
1143 ele.style.top = v3+"px";
1144 }
1145
1146 function selectStrokeDash(idx){
1147 var ele = document.getElementById('strokeDash');
1148 if(ele.style.clip != "rect(auto auto auto auto)"){
1149 ele.style.clip = "rect(auto auto auto auto)";
1150 ele.style.top = "81px";
1151 return;
1152 }
1153
1154 if(selectedItems.length == 1){
1155 var obj = selectedItems[0];
1156 var lw = obj.getAttribute('stroke-width');
1157 if(!lw ) lw=1;
1158 else lw=parseFloat(lw);
1159
1160 var darr = StrokeDash[idx];
1161 if(darr=="") try{ obj.removeAttribute('stroke-dasharray'); }catch(e){}
1162 else updateDashArray(obj, lw, 1, darr);
1163
1164 updateStrokeDashImg(idx);
1165 }else{
1166 updateStrokeDashImg(1);
1167 }
1168 }
1169
1170 function getDashArrayIndex(plw, darr){
1171 if(!darr || darr=="") return 0;
1172 var d_arr = darr.split(' ');
1173 var top = Math.round(parseFloat(d_arr[0])/plw);
1174 if(top == 6){
1175 if(d_arr.length == 2) return 2;
1176 if(d_arr.length == 4) return 3;
1177 }else if(top == 8){
1178 if(d_arr.length == 2) return 4;
1179 if(d_arr.length == 4) return 5;
1180 if(d_arr.length == 6) return 6;
1181 }else if(top == 2){
1182 return 1;
1183 }
1184 return 0;
1185 }
1186
1187 function updateDashArray(obj, lw, plw, darr){
1188 if(darr && darr != ""){
1189 var d_arr = darr.split(' ');
1190 darr = "";
1191 for(var i=0; i<d_arr.length; i++){
1192 var val = Math.round(parseFloat(d_arr[i])/plw);
1193 darr += val * lw + ' ';
1194 }
1195 obj.setAttribute('stroke-dasharray', trim(darr));
1196 return true;
1197 }
1198 return false;
1199 }
1200
1201 function togglePathType(){
1202 if(selectedItems.length != 1) return;
1203 var itm = selectedItems[0];
1204 var path = itm.getAttribute("d").split(' ');
1205 var newpath = "";
1206
1207 for(var i=0;i<path.length ;i++){
1208 if(path[i] == "L"){ path[i] = "Q"; }
1209 else if(path[i] == "Q"){ path[i] = "S"; }
1210 else if(path[i] == "S"){ path[i] = "T"; }
1211 else if(path[i] == "T"){ path[i] = "L"; }
1212 newpath += path[i] + ' ';
1213 }
1214 var mm = path.length % 4;
1215 if(mm != 0) {
1216 newpath += path[i-2] + ' ';
1217 newpath += path[i-1] + ' ';
1218 }
1219
1220 itm.setAttribute("d",trim(newpath));
1221 updatePathTypeMenu();
1222 }
1223
1224 function updatePathTypeMenu(){
1225 if(selectedItems.length != 1) return;
1226 var itm = selectedItems[0];
1227 if(!itm) return;
1228 var path = itm.getAttribute("d");
1229 var img = document.getElementById('path_type');
1230 if(!path){
1231 img.style.display='none';
1232 return;
1233 }
1234
1235 if(path.indexOf("Q") > 0){
1236 selectMenuImage(img, 1);
1237 }else if(path.indexOf("T") > 0){
1238 selectMenuImage(img, 2);
1239 }else if(path.indexOf("S") > 0){
1240 selectMenuImage(img, 3);
1241 }else{
1242 selectMenuImage(img, 0);
1243 }
1244 img.style.display='block';
1245 }
1246
1247 function updateArrowMenu(){
1248 try{
1249 var imgl = document.getElementById('arrow_l');
1250 if(hasArrow('start')){ selectMenuImage(imgl, 1); }else{ selectMenuImage(imgl, 0); }
1251 }catch(e){}
1252
1253 try{
1254 var imgr = document.getElementById('arrow_r');
1255 if(hasArrow('end')){ selectMenuImage(imgr, 1); }else{ selectMenuImage(imgr, 0); }
1256 }catch(e){}
1257 }
1258
1259 function selectMenuImage(img, pos){
1260 if(!img) return;
1261 var clip = new Array("rect(0px,30px,25px,0px)","rect(25px,30px,50px,0px)",
1262 "rect(50px,30px,75px,0px)", "rect(75px,30px,100px,0px)");
1263 var top = new Array( "81px", "56px", "31px", "6px");
1264
1265 img.style.clip = clip[pos];
1266 img.style.top = top[pos];
1267 }
1268
1269 function propSVGImage(str, w, h, rot){
1270 var res = "image:";
1271 if(!rot) rot = 0;
1272 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
1273 res += "Width:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
1274 res += "Height:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
1275 res += "Rot:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
1276 return res;
1277 }
1278
1279
1280 function setSVGMode(m){
1281 modeSVG = m;
1282 switch(m){
1283 case 'selector':
1284 selectToolBar(0);
1285 break;
1286 case 'newPath':
1287 selectToolBar(1);
1288 break;
1289 case 'newLine':
1290 selectToolBar(2);
1291 break;
1292 case 'text':
1293 selectToolBar(3);
1294 break;
1295 case 'rect':
1296 selectToolBar(4);
1297 break;
1298 case 'circle':
1299 selectToolBar(5);
1300 break;
1301 case 'ellipse':
1302 selectToolBar(6);
1303 break;
1304 case 'image':
1305 selectToolBar(7);
1306 break;
1307 default:
1308 break;
1309 }
1310 updateShowMenu();
1311 }
1312
1313
1314 function toSVGElement(str, w, h){
1315 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
1316 var parser = new DOMParser();
1317 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
1318 var footer = "</svg:svg>";
1319 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
1320 var xmlRoot = xmlDoc.documentElement;
1321 var ele = document.importNode(xmlRoot,true);
1322
1323 return ele;
1324 }
1325
1326 function newID(){
1327 var id = 'svg_'+nextId;
1328 nextId++;
1329 return id;
1330 }
1331
1332 function createSVGElement(tag, id){
1333 if(!id || id=='new') id = newID();
1334 var ele= document.createElementNS(svg_ns, tag);
1335 ele.setAttribute("id", id);
1336 return ele;
1337 }
1338
1339 function defSVGElement(node){
1340 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1341 if(!svg_defs){
1342 svg_defs = createSVGElement('defs', 'svg_defs');
1343 svg_top.insertBefore(svg_defs, svg_top.firstChild);
1344 }
1345 if(node) svg_defs.appendChild(node);
1346 }
1347
1348 function initSVGElementId(svg_top){
1349 nextId = 1;
1350 checkSVGElementId(svg_top);
1351 appendSVGElementId(svg_top);
1352 }
1353
1354 function checkSVGElementId(top){
1355 var objs = top.childNodes;
1356
1357 for(var i=0; i<objs.length ;i++){
1358 if(objs[i].tagName){
1359 var id = objs[i].getAttribute("id");
1360
1361 if(id && id.match(/svg_[0-9]+/i)){
1362 var n = parseInt(RegExp.lastMatch.substr(4));
1363 if(n >= nextId){
1364 nextId = n+1;
1365 }
1366
1367 }
1368 checkSVGElementId(objs[i]);
1369 }
1370 }
1371 }
1372
1373 function appendSVGElementId(top){
1374 var objs = top.childNodes;
1375
1376 for(var i=0; i<objs.length ;i++){
1377 if(objs[i].tagName){
1378 var id = objs[i].getAttribute("id");
1379 if(!id){
1380 objs[i].setAttribute("id", "svg_"+nextId);
1381 nextId++;
1382 }
1383 }
1384 appendSVGElementId(objs[i]);
1385 }
1386 }
1387
1388 function setAttributes(obj, attrs){
1389 var attr_array = attrs.split(',');
1390
1391 for (var i=0; i<attr_array.length;i++){
1392 var x = attr_array[i].split('=');
1393 if(x.length == 2){
1394 obj.setAttribute(x[0], x[1]);
1395 }
1396 }
1397 }
1398
1399 function createSVGObj(tag, attrs, fill, color, lw){
1400 var ele = createSVGElement(tag, 'new');
1401 setAttributes(ele, attrs);
1402 if (fill) ele.setAttribute('fill', fill);
1403 if (color) ele.setAttribute('stroke', color);
1404 if(lw) ele.setAttribute('stroke-width', lw);
1405
1406 return ele;
1407 }
1408
1409 function createSVGText(txt, x, y, size, color){
1410 var ele = createSVGElement('text', 'new');
1411
1412 ele.setAttribute('x', x);
1413 ele.setAttribute('y', y);
1414 ele.setAttribute('font-size', size);
1415 ele.setAttribute('fill', color);
1416 ele.textContent=txt;
1417
1418 return ele;
1419 }
1420
1421 function createSVGImage(fname, width, height, attrs){
1422 var ele = createSVGElement('image', 'new');
1423 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1424 ele.setAttribute('width', width);
1425 ele.setAttribute('height', height);
1426 setAttributes(ele, attrs);
1427
1428 return ele;
1429 }
1430
1431 function createSVGMarker(pid, id, child){
1432 var parent = document.getElementById(pid);
1433 if(!parent) return;
1434 var ele = createSVGElement('marker', pid+'_'+id);
1435 ele.appendChild(child);
1436 return ele;
1437 }
1438
1439 function setLeftArrow(){
1440 if( selectedItems.length == 1 ){
1441 setArrow(selectedItems[0], 'start', '');
1442 updateShowMenu();
1443 }
1444 }
1445
1446 function setRightArrow(){
1447 if( selectedItems.length == 1 ){
1448 setArrow(selectedItems[0], 'end', '');
1449 updateShowMenu();
1450 }
1451 }
1452
1453 function removeLeftArrow(){
1454 if( selectedItems.length == 1 ){
1455 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1456 try{
1457 var marker = getArrowMarker(selectedItems[0],'start');
1458 svg_defs.removeChild(marker);
1459 selectedItems[0].removeAttribute('marker-start');
1460 }catch(e){ }
1461 updateShowMenu();
1462 }
1463 }
1464
1465 function removeRightArrow(){
1466 if( selectedItems.length == 1 ){
1467 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1468 try{
1469 var marker = getArrowMarker(selectedItems[0],'end');
1470 svg_defs.removeChild(marker);
1471 selectedItems[0].removeAttribute('marker-end');
1472 }catch(e){ }
1473 updateShowMenu();
1474 }
1475 }
1476
1477 function removeAllMarker(obj){
1478 var smarker = getArrowMarker(obj,'start');
1479 if(smarker) svg_defs.removeChild(smarker);
1480 var emarker = getArrowMarker(obj,'end');
1481 if(emarker) svg_defs.removeChild(emarker);
1482 return true;
1483 }
1484
1485 function hasArrow(pos){
1486 var pobj = selectedItems[0];
1487 if(!pobj) return false;
1488 if(getArrowMarker(pobj,pos)) return true;
1489 return false;
1490 }
1491
1492 function getArrowMarker(obj,pos){
1493 try{
1494 return document.getElementById(obj.getAttribute('id')+'_'+pos+'arrow');
1495 }catch(e){ return null; }
1496
1497 }
1498
1499 function setArrow(pobj, pos, type){
1500 if(!pobj) return;
1501 var marker = getArrowMarker(pobj,pos);
1502 if(marker){ return; }
1503
1504 var obj = createSVGElement('path', 'new');
1505
1506 var refX = 10;
1507 var refY = 10;
1508
1509 switch(pos){
1510 case 'start':
1511 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1512 break;
1513 case 'end':
1514 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1515 break;
1516 default:
1517 return;
1518 }
1519
1520 var pid = pobj.getAttribute("id");
1521 marker = createSVGMarker(pid, pos+'arrow' , obj);
1522
1523 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1524
1525 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1526
1527 defSVGElement(marker);
1528 if(!document.getElementById(pid+'_'+pos+'arrow')){
1529 alert("Error in setArrow");
1530 return;
1531 }
1532 var mid = "url(#"+marker.getAttribute("id")+")";
1533 var mattr = "marker-"+pos;
1534 pobj.setAttribute(mattr, mid);
1535 updateShowMenu();
1536 }
1537
1538 function scalePath(itm, scale){
1539 if(!scale) return;
1540 var path = itm.getAttribute("d").split(' ');
1541 var bbox = itm.getBBox();
1542 var newpath = "";
1543 var sX=scale[0];
1544 var sY=scale[1];
1545 var isX=true;
1546 var dx = bbox.x - sX*bbox.x;
1547 var dy = bbox.y - sY*bbox.y;
1548
1549 for(var i=0;i<path.length ;i++){
1550 if(path[i].match(/[0-9]+/)){
1551 var val = parseInt(path[i]);
1552 if(isX){
1553 path[i] = Math.round(val*sX) + dx ;
1554 isX = false;
1555 }else{
1556 path[i] = Math.round(val*sY) + dy ;
1557 isX = true;
1558 }
1559 }
1560 newpath += path[i] + ' ';
1561 }
1562
1563 itm.setAttribute("d",trim(newpath));
1564 }
1565
1566 function scaleLine(itm, scale){
1567 if(!scale) return;
1568 var sX=scale[0];
1569 var sY=scale[1];
1570 var x1 = parseInt(itm.getAttribute("x1"));
1571 var y1 = parseInt(itm.getAttribute("y1"));
1572 var x2 = parseInt(itm.getAttribute("x2"));
1573 var y2 = parseInt(itm.getAttribute("y2"));
1574 var bbox = itm.getBBox();
1575 var dx = bbox.x - sX*bbox.x;
1576 var dy = bbox.y - sY*bbox.y;
1577
1578 itm.setAttribute("x1", Math.round(x1*sX)+dx);
1579 itm.setAttribute("y1", Math.round(y1*sY)+dy);
1580 itm.setAttribute("x2", Math.round(x2*sX)+dx);
1581 itm.setAttribute("y2", Math.round(y2*sY)+dy);
1582 }
1583
1584 function appendSVGObj(obj){
1585 var svg_top = document.getElementById('svg_top');
1586 if(!svg_top) return;
1587
1588 svg_top.appendChild(obj);
1589 }
1590
1591 function isChildById(element, id) {
1592 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1593 else if (element.parentNode.id == id) return true;
1594 else return isChildById(element.parentNode, id);
1595 }
1596
1597 /////////////////////// Formatting SVG DOM
1598 function escapeHTML(text) {
1599 return text.replace( /[<>"&]/g,
1600 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1601 );
1602 };
1603
1604 function formatTag(ele){
1605 var str="";
1606 if(ele.nodeType == 1){
1607 var tag_a = ele.tagName.split(':');
1608 var tag;
1609 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1610
1611 str += "<"+tag;
1612 var attrs = ele.attributes;
1613 for(var i=0; i<attrs.length; i++){
1614 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1615 }
1616 var cn = ele.childNodes;
1617 if(cn.length > 0){
1618 str +=">\n";
1619 for(var i=0; i<cn.length; i++){
1620 var tmp = trim(formatTag(cn[i]));
1621 if(tmp) str += " "+tmp+"\n";
1622 }
1623 str += "</"+tag+">";
1624 }else{
1625 str +=" />";
1626 }
1627 return str;
1628 }else if(ele.nodeType==3){
1629 return ele.textContent;
1630 }
1631 }
1632
1633 function getSVGContent(){
1634 if(!svg_top) return "";
1635
1636 var str = "";
1637 var elements = svg_top.childNodes;
1638 for(var i=0; i<elements.length; i++){
1639 if(elements[i] != svg_select){
1640 var tmp = trim(formatTag(elements[i]));
1641 if(tmp) str += tmp + '\n';
1642 }
1643 }
1644 return str;
1645 }
1646
1647 function trim(str){
1648 return str.replace(/(^\s+)|(\s+$)/g, "");
1649 }
1650
1651 /////// Access Server
1652 function newXMLRequest(){
1653 if(this.XMLHttpRequest){
1654 return new XMLHttpRequest();
1655 }else {
1656 return new ActiveXObject("Microsoft.XMLHTTP");
1657 }
1658 }
1659
1660 function createRequestData(data){
1661 var str="filetype=svg";
1662 for (var i in data){
1663 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1664 }
1665 return str;
1666 }
1667
1668 function postRequest(url, data, func){
1669 var postData=createRequestData(data);
1670 var obj=newXMLRequest();
1671
1672 obj.onreadystatechange = function(){
1673 if (obj.readyState == 4 && obj.status == 200){
1674 func(obj.responseText);
1675 }
1676 }
1677 obj.open("POST", url, true);
1678 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1679 obj.send(postData);
1680 }
1681
1682 function commnadFinishAlert(s){
1683 alert(s);
1684 }
1685
1686 function uploadFileData(transaction, results){
1687 var data = results.rows.item(0);
1688 var updata = new Array(0);
1689 updata['name']= data['name'];
1690 updata['datalob'] = data['datablob'];
1691 updata['cmd'] = 'upload'
1692
1693 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1694 }
1695
1696 function uploadFile(name){
1697 getFile(name, 'uploadFileData');
1698 }
1699
1700 function getRemoteFileList(){
1701 var data=new Array();
1702 data['name'] = "SVG";
1703 data['cmd'] = "list";
1704 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1705 }
1706
1707 function previewRemoteFile(content){
1708 previewFile(content);
1709 setMode('Preview');
1710 }
1711
1712 function getRemoteFile(name){
1713 var data=new Array();
1714 data['name'] = name;
1715 data['cmd'] = "get";
1716 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1717 }
1718
1719 function saveRemoteFile(content){
1720 var datadiv = document.getElementById('tempdata');
1721 var fname = datadiv.getAttribute('lfname');
1722 saveContentWithFilename(fname, content);
1723 }
1724
1725 function downloadFile(name){
1726 var data=new Array();
1727 data['name'] = name;
1728 data['cmd'] = "get";
1729 var datadiv = document.getElementById('tempdata');
1730 datadiv.setAttribute('lfname', name);
1731 postRequest(MgrPath+iSlideMgr, data, saveRemoteFile);
1732 }
1733
1734 function showRemoteFile(name){
1735 getRemoteFile(name);
1736 }
1737
1738 function downloadToFile(name){
1739 var downloadForm = "";
1740 downloadForm += "<form action=\"iSlideManager.php\" method=\"post\">";
1741 downloadForm += "<input type=\"hidden\" name=\"cmd\" value=\"download\">";
1742 downloadForm += "<input type=\"hidden\" name=\"name\" value=\""+name+"\">";
1743 downloadForm += "<input type=\"hidden\" name=\"filetype\" value=\"svg\">";
1744 downloadForm += "<input type=\"submit\">";
1745 downloadForm += "</form>";
1746
1747 var cmdForm = document.getElementById('cmdForm');
1748 cmdForm.innerHTML = downloadForm;
1749 cmdForm.firstChild.submit();
1750 }
1751
1752 //////// Event Handler
1753 function selectedRectangle(x, y, ex, ey){
1754 if(!svg_select) return null;
1755
1756 svg_select.setAttribute("x",x);
1757 svg_select.setAttribute("y",y);
1758 svg_select.setAttribute("width", ex-x);
1759 svg_select.setAttribute("height", ey-y);
1760 svg_select.setAttribute("visibility", "visible");
1761 return svg_select;
1762 }
1763
1764 function hideSelectedRectangle(){
1765 svg_select.setAttribute("x",0);
1766 svg_select.setAttribute("y",0);
1767 svg_select.setAttribute("width",0);
1768 svg_select.setAttribute("height",0);
1769 svg_select.setAttribute("visibility","hidden");
1770 }
1771
1772 function setInnerHTML(id, val){
1773 var itm=document.getElementById(id);
1774 if(itm) itm.innerHTML=val;
1775 }
1776
1777 function toggleRotateScaleLock(){
1778 var lock = document.getElementById('lock');
1779 if(svg_rotate_locked){
1780 svg_rotate_locked=false;
1781 if(lock.style.top == '450px'){
1782 lock.style.display='none';
1783 }else{
1784 svg_scale_locked=true;
1785 lock.style.top = '470px';
1786 }
1787 return;
1788 }
1789 if(svg_scale_locked){
1790 svg_scale_locked=false;
1791 if(lock.style.top == '470px'){
1792 lock.style.display='none';
1793 }else{
1794 svg_rotate_locked=true;
1795 lock.style.top = '450px';
1796 }
1797 return;
1798 }
1799
1800 }
1801
1802 function setRotLock(){
1803 var lock = document.getElementById('lock');
1804 if(!svg_rotate_locked){
1805 svg_rotate_locked = true;
1806 svg_scale_locked = false;
1807 lock.style.top = '450px';
1808 lock.style.display='block';
1809 }else alert("setRotLock");
1810 }
1811
1812 function setScaleLock(){
1813 var lock = document.getElementById('lock');
1814 if(!svg_scale_locked){
1815 svg_scale_locked = true;
1816 svg_rotate_locked = false;
1817 lock.style.top = '470px';
1818 lock.style.display='block';
1819 }else alert("setScaleLock");
1820 }
1821
1822 function popupInfo(val){
1823 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1824 str += val;
1825 setInnerHTML('popup', str);
1826 showItemById('popup');
1827 }
1828
1829 function addAttributeVal(obj, itm, dv){
1830 if(obj.hasAttribute(itm)){
1831 var x = parseInt(obj.getAttribute(itm));
1832 x = x + dv;
1833 obj.setAttribute(itm, x)
1834 }
1835 }
1836
1837 function showSVGSource(){
1838 var str = getSVGContent();
1839 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1840 escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1841 escstr += "<textarea cols=\"100\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1842 setInnerHTML('popup', escstr);
1843 showItemById('popup');
1844 }
1845
1846
1847 function getElementTag(obj){
1848 if (!obj) return null;
1849 var tag = obj.tagName.split(':');
1850 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1851 return tag[0];
1852 }
1853
1854 function setSVGObjectProp(obj){
1855 var tag = getElementTag(obj);
1856 var res ="";
1857 switch(tag){
1858 case 'text':
1859 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"),getRotateAngle(obj));
1860 break;
1861 case 'rect':
1862 case 'circle':
1863 case 'ellipse':
1864 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"),
1865 obj.getAttribute("fill"),obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1866 break;
1867 case 'path':
1868 case 'line':
1869 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1870 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1871 break;
1872 case 'image':
1873 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"),getRotateAngle(obj));
1874 break;
1875 default:
1876 break;
1877 }
1878
1879 return res
1880 }
1881
1882 function updateSVGObj(){
1883 if(selectedItems.length != 1) return;
1884 var obj = selectedItems[0];
1885 var tag = getElementTag(obj);
1886 var deg=document.getElementById('svg_rotate');
1887 var res ="";
1888 switch(tag){
1889 case 'text':
1890 var txt=document.getElementById('svg_text');
1891 var color=document.getElementById('svg_color');
1892 var size=document.getElementById('svg_size');
1893 obj.textContent = txt.value;
1894 obj.setAttribute("fill", color.value);
1895 obj.setAttribute("font-size", size.value);
1896 setRotate(obj,deg.value);
1897 break;
1898 case 'rect':
1899 case 'circle':
1900 case 'ellipse':
1901 var fill=document.getElementById('svg_fill');
1902 var color=document.getElementById('svg_color');
1903 var L=document.getElementById('svg_stroke');
1904 var dash=document.getElementById('svg_stroke_type');
1905 obj.setAttribute("fill", fill.value);
1906 obj.setAttribute("stroke", color.value);
1907 obj.setAttribute("stroke-width", L.value);
1908 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1909 setRotate(obj,deg.value);
1910 break;
1911 case 'path':
1912 case 'line':
1913 var fill=document.getElementById('svg_fill');
1914 var color=document.getElementById('svg_color');
1915 var L=document.getElementById('svg_stroke');
1916 var dash=document.getElementById('svg_stroke_type');
1917 obj.setAttribute("fill", fill.value);
1918 obj.setAttribute("stroke", color.value);
1919 obj.setAttribute("stroke-width", L.value);
1920 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1921 setRotate(obj,deg.value);
1922
1923 var id = obj.getAttribute("id");
1924 var marker = document.getElementById(id+'_startarrow');
1925 if(marker) marker.setAttribute("fill", color.value);
1926 var marker = document.getElementById(id+'_endarrow');
1927 if(marker) marker.setAttribute("fill", color.value);
1928 break;
1929 case 'image':
1930 var fname=document.getElementById('svg_text');
1931 var w=document.getElementById('svg_w');
1932 var h=document.getElementById('svg_h');
1933 obj.setAttribute("xlink:href", fname.value);
1934 obj.setAttribute("width", w.value);
1935 obj.setAttribute("height", h.value);
1936 setRotate(obj,deg.value);
1937 break;
1938 default:
1939 break;
1940 }
1941
1942 }
1943
1944 function delSVGObj(){
1945 if(!svg_top) return;
1946 for(var i=0; i< selectedItems.length; i++){
1947 var obj = selectedItems[i];
1948 removeAllMarker(obj);
1949 svg_top.removeChild(obj);
1950 }
1951 hideSelectedRectangle();
1952 }
1953
1954 ///// For MobileSafari
1955 function getPreviewX(x){ return x - preview.offsetLeft; }
1956 function getPreviewY(y){ return y - preview.offsetTop; }
1957
1958 function calcDict(x1, y1, x2, y2){
1959 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1960 }
1961
1962 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1963 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1964 }
1965
1966 function getAttributeVal(obj, name){
1967 try{
1968 return parseInt(obj.getAttribute(name));
1969 }catch(e){ return 0; }
1970 }
1971
1972 function checkIntersection(obj, x, y, ex, ey){
1973 if(!obj) return false;
1974 var res = true;
1975 var bbox = obj.getBBox();
1976 var ox = bbox.x;
1977 var oy = bbox.y;
1978 var oex = bbox.x+bbox.width;
1979 var oey = bbox.y+bbox.height;
1980 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1981
1982 var tag = getElementTag(obj);
1983 switch(tag){
1984 case 'circle':
1985 case 'ellipse':
1986 var cx = getAttributeVal(obj,"cx");
1987 var cy = getAttributeVal(obj,"cy");
1988 var rx = getAttributeVal(obj,"r");
1989 var ry = rx;
1990 if(!rx){
1991 var rx = getAttributeVal(obj,"rx");
1992 var ry = getAttributeVal(obj,"ry");
1993 }
1994
1995 if(res){
1996 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1997 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1998 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1999 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
2000 }
2001 break;
2002 case 'path':
2003 var d = obj.getAttribute("d");
2004 var p = getPoints(d);
2005 for(var i=0;i<p.length;i++){
2006 var ox=p[i][0];
2007 var oy=p[i][1];
2008 if(x < ox && ox < ex && y < oy && oy < ey) {
2009 return true;
2010 }
2011 }
2012 return false;
2013 break;
2014 case 'line':
2015 var x1 = getAttributeVal(obj,"x1");
2016 var y1 = getAttributeVal(obj,"y1");
2017 var x2 = getAttributeVal(obj,"x2");
2018 var y2 = getAttributeVal(obj,"y2");
2019 var d = (y2-y1)/(x2-x1);
2020
2021 if(res){
2022 var xx = Math.abs(x2-x1);
2023 var sign = 1;
2024 if(x2-x1 < 0){ sign = -1; }
2025 for(var i=0; i < xx; i++){
2026 var nx = i*sign + x1;
2027 var ny = d * i*sign + y1;
2028 if(x < nx && nx < ex && y < ny && ny < ey) return true;
2029 }
2030 }
2031 return false;
2032
2033 return res;
2034 break;
2035 case 'text':
2036 case 'rect':
2037 case 'polygon':
2038 case 'polyline':
2039 case 'image':
2040 break;
2041 default:
2042 res=false;
2043 break;
2044 }
2045 return res;
2046 }
2047
2048 function getBoundingBox(obj){
2049 var res = new Array(4);
2050 var bbox = obj.getBBox();
2051 res[0] = bbox.x-1;
2052 res[1] = bbox.y-1;
2053 res[2] = bbox.x+bbox.width+2;
2054 res[3] = bbox.y+bbox.height+2;
2055 return res;
2056 }
2057
2058 function setSelectBox(){
2059 if(!svg_select) return;
2060
2061 if(selectedItems.length == 0){
2062 hideSelectedRectangle()
2063 return;
2064 }
2065
2066 var bbox = new Array(1000,1000,0,0);
2067
2068 for(var i=0;i<selectedItems.length;i++){
2069 var bp = getBoundingBox(selectedItems[i]);
2070 if(bp[0] < bbox[0]) bbox[0]=bp[0];
2071 if(bp[1] < bbox[1]) bbox[1]=bp[1];
2072 if(bp[2] > bbox[2]) bbox[2]=bp[2];
2073 if(bp[3] > bbox[3]) bbox[3]=bp[3];
2074 }
2075 selectedRectangle(bbox[0], bbox[1], bbox[2], bbox[3]);
2076 }
2077
2078 function getSelectedObjects(x1, y1, x2, y2){
2079 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
2080 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
2081
2082 var val="";
2083 if(svg_top){
2084 var val ="";
2085 var objs = svg_top.childNodes;
2086 selectedItems = new Array();
2087 for(var i=0; i<objs.length;i++){
2088 if(objs[i].tagName){
2089
2090 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
2091 selectedItems.push(objs[i]);
2092 }
2093 val += objs[i].tagName+" ";
2094 }
2095 }
2096 }
2097 setSelectBox();
2098 }
2099
2100 function dupObject(){
2101 if(selectedItems.length == 0){ return; }
2102 dupItems = selectedItems;
2103 dupX = parseInt(svg_select.getAttribute("x"));
2104 dupY = parseInt(svg_select.getAttribute("y"));
2105 setSVGMode('Duplicate');
2106 }
2107
2108 function pasteObject(x,y){
2109 if(selectedItems.length == 0){ return; }
2110 for(var i=0;i<dupItems.length;i++){
2111 var itm = dupItems[i].cloneNode(true);
2112 itm.setAttribute("id", newID());
2113 replaceTranslate(itm,x-dupX,y-dupY);
2114 updateTransform(itm);
2115 appendSVGObj(itm);
2116 }
2117 }
2118
2119 function onTouchStartCore(){
2120 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
2121 var x1=getPreviewX(sx-1);
2122 var y1=getPreviewY(sy-1);
2123 var x2=getPreviewX(sx+2);
2124 var y2=getPreviewY(sy+2);
2125 getSelectedObjects(x1, y1, x2, y2);
2126
2127 if(selectedItems.length == 0){
2128 setSVGMode('selector');
2129 }else if(selectedItems.length == 1){
2130 targetItem=selectedItems[0];
2131 }else{
2132 setSVGMode('Group');
2133 }
2134 }else { // CreateMode
2135 if(selectedItems.length == 0){
2136
2137 var fill=document.getElementById('svg_fill');
2138 var color=document.getElementById('svg_color');
2139 var L=document.getElementById('svg_stroke');
2140
2141 var x = getPreviewX(sx);
2142 var y = getPreviewY(sy);
2143
2144 switch(modeSVG){
2145 case 'text':
2146 var txt=document.getElementById('svg_text');
2147 var size=document.getElementById('svg_size');
2148 if(txt.value){
2149 y = y + parseInt(size.value)*0.8;
2150 targetItem=createSVGText(txt.value, x, y, size.value, color.value);
2151 }else{
2152 putInputForm(x, y, txt.value, size.value);
2153 }
2154 break;
2155 case 'rect':
2156 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
2157 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2158 break;
2159 case 'circle':
2160 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
2161 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2162 break;
2163 case 'ellipse':
2164 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
2165 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2166 break;
2167 case 'newPath':
2168 //var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
2169 var attr = 'd=M '+x+' '+y+' L';
2170 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
2171 is_newPath=true;
2172 break;
2173 case 'newLine':
2174 var x2=x+1;
2175 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
2176 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
2177 break;
2178 case 'image':
2179 var attr = 'x='+x+',y='+y;
2180 var txt=document.getElementById('svg_text');
2181 var w=document.getElementById('svg_w');
2182 var h=document.getElementById('svg_h');
2183 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
2184 default:
2185 break;
2186 }
2187 if (targetItem){
2188 appendSVGObj(targetItem);
2189 selectedItems[0]=targetItem;
2190 }
2191 }else{
2192 var x1=getPreviewX(sx-1);
2193 var y1=getPreviewY(sy-1);
2194 var x2=getPreviewX(sx+2);
2195 var y2=getPreviewY(sy+2);
2196
2197 if(modeSVG == 'Duplicate'){ pasteObject(x1,y1); }
2198 if(modeSVG == 'newPath'){
2199 if(targetItem.tagName == 'path' ){
2200 var path = targetItem.getAttribute("d");
2201 path = path + ' '+ getPreviewX(sx) + ' '+ getPreviewY(sy) ;
2202 targetItem.setAttribute("d",path);
2203 }
2204 return;
2205 }
2206 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
2207 setSVGMode('selector');
2208 }
2209 }
2210 }
2211 }
2212
2213
2214 function onDoubleTap(e){
2215 if(selectedItems.length == 1 ){
2216 hideSelectedRectangle();
2217
2218 var obj = selectedItems[0];
2219 if(!obj) return;
2220 switch(obj.tagName){
2221 case 'svg:text':
2222 case 'text':
2223 var txt = trim(obj.textContent);
2224 var size = parseInt(obj.getAttribute("font-size"));
2225 var x = parseInt(obj.getAttribute("x"));
2226 var y = parseInt(obj.getAttribute("y"));
2227 x = x-20;
2228 y = y-size*0.8 -10;
2229 putInputForm(x, y, txt, size, obj.id);
2230 obj.style.display = 'none';
2231 editingTextObj = obj;
2232 break;
2233 case 'path':
2234 if(modeSVG == 'newPath'){ setSVGMode('selector'); }
2235 break;
2236 default:
2237 break;
2238 }
2239 return false;
2240 }
2241 }
2242
2243 function getPoints(d){
2244 var p = d.split(' ');
2245 var res = new Array();
2246 var isx=true;
2247 var x, y;
2248 for(var i=0; i<p.length;i++){
2249 if(p[i].match('[MLHVCSQTA]','i')){
2250 }else{
2251 if(isx){
2252 x = parseInt(p[i]);
2253 }else{
2254 y = parseInt(p[i]);
2255 res.push(new Array(x, y));
2256 }
2257 isx = !isx;
2258 }
2259 }
2260 return res;
2261 }
2262
2263 function updatePath(d, x, y){
2264 var p = d.split(' ');
2265 var res = "";
2266 var isx=true;
2267 var val;
2268 for(var i=0; i<p.length;i++){
2269 if(trim(p[i]) == "") continue;
2270 if(p[i].match('[MLHVCSQTA]','i')){
2271 res += ' '+p[i];
2272 }else{
2273 if(isx){
2274 val = parseInt(p[i])+x;
2275 }else{
2276 val = parseInt(p[i])+y;
2277 }
2278
2279 res += ' '+ val;
2280 isx = !isx;
2281 }
2282 }
2283 return trim(res);
2284 }
2285
2286 function updateTransform(obj){
2287 try{
2288 var trans = obj.getAttribute("transform");
2289 if(!trans) return;
2290 if(trans.match(new RegExp("translate(.+,.+)","i"))){
2291 var str = RegExp.lastMatch;
2292 var vals = str.substr(10,str.length-11).split(',') ;
2293 var dx = parseInt(vals[0]);
2294 var dy = parseInt(vals[1]);
2295 switch(getElementTag(obj)){
2296 case 'text':
2297 case 'rect':
2298 case 'image':
2299 addAttributeVal(obj, "x", dx);
2300 addAttributeVal(obj, "y", dy);
2301 break;
2302 case 'circle':
2303 case 'ellipse':
2304 addAttributeVal(obj, "cx", dx);
2305 addAttributeVal(obj, "cy", dy);
2306 break;
2307
2308 case 'path':
2309 var path = obj.getAttribute("d");
2310 obj.setAttribute("d", updatePath(path, dx, dy));
2311 break;
2312 case 'line':
2313 var x1 = getAttributeVal(obj,"x1");
2314 var y1 = getAttributeVal(obj,"y1");
2315 var x2 = getAttributeVal(obj,"x2");
2316 var y2 = getAttributeVal(obj,"y2");
2317 obj.setAttribute("x1", x1+dx);
2318 obj.setAttribute("y1", y1+dy);
2319 obj.setAttribute("x2", x2+dx);
2320 obj.setAttribute("y2", y2+dy);
2321
2322 break;
2323 default:
2324 break;
2325 }
2326 replaceTranslate(obj, 0, 0);
2327 updateRotate(obj);
2328 }
2329 }catch (e){
2330 }
2331 }
2332
2333 function moveSelectedRectangle(dx, dy){
2334 if(!svg_select) return;
2335 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
2336 }
2337
2338 function updateSelectedRectangle(){
2339 if(!svg_select) return;
2340 if(selectedItems.length > 0){
2341 svg_select.setAttribute("visibility","visible");
2342 }else{
2343 hideSelectedRectangle();
2344 }
2345 }
2346
2347 function clearSelectedItems(){
2348 targetItem=null;
2349 for(i in selectedItems) delete selectedItems[i];
2350 selectedItems=new Array();
2351 updateSelectedRectangle();
2352 }
2353
2354
2355 function replaceTranslate(obj, dx, dy){
2356 var trans = obj.getAttribute("transform");
2357
2358 if(trans && trans.indexOf("translate")>=0){
2359 var strs = trans.split(' ');
2360 trans = "";
2361 for(var i=0; i<strs.length; i++){
2362 if(strs[i].indexOf("translate")>=0){
2363 if (dx == 0 && dy == 0){ strs[i]=""; }else{ strs[i] = "translate("+dx+","+dy+")"; }
2364 }
2365
2366 trans += strs[i]+" ";
2367 }
2368 if(trim(trans)){ obj.setAttribute("transform", trim(trans));}
2369 else obj.removeAttribute("transform");
2370 }else{
2371 if(trans){
2372 trans += " translate("+dx+","+dy+")";
2373 obj.setAttribute("transform", trans);
2374 }else{
2375 obj.setAttribute("transform","translate("+dx+","+dy+")");
2376 }
2377 }
2378 updateRotate(obj,dx,dy);
2379 }
2380
2381 function updateRotate(obj,dx,dy){
2382 var trans = obj.getAttribute("transform");
2383
2384 if(!trans || trans.indexOf("rotate") < 0) return;
2385 var bbox = obj.getBBox();
2386 var x = bbox.x+bbox.width/2;
2387 var y = bbox.y+bbox.height/2;
2388 var strs = trans.split(' ');
2389 trans = "";
2390
2391 for(var i=0; i<strs.length ;i++){
2392 if(strs[i].indexOf("rotate") >= 0){
2393 var deg = strs[i].substr(7, strs[i].indexOf(",")-7);
2394 if(dx) x += dx;
2395 if(dy) y += dy;
2396 strs[i] = "rotate("+deg+","+x+","+y+")";
2397 }
2398 trans += strs[i]+" ";
2399 }
2400 obj.setAttribute("transform",trim(trans));
2401 }
2402
2403 function getRotateAngle(obj){
2404 var trans = obj.getAttribute("transform");
2405 if(!trans || trans.indexOf("rotate") < 0) return 0;
2406 var strs = trans.split(' ');
2407 for(var i=0; i<strs.length ;i++){
2408 if(strs[i].indexOf("rotate") >= 0){
2409 var deg = strs[i].substr(7, strs[i].indexOf(",")-7);
2410 return parseInt(deg);
2411 }
2412 }
2413 return 0;
2414 }
2415
2416 function setRotate(obj,deg){
2417 var trans = obj.getAttribute("transform");
2418 var bbox = obj.getBBox();
2419 var x = bbox.x+bbox.width/2;
2420 var y = bbox.y+bbox.height/2;
2421
2422 if(!trans) trans="";
2423 if(trans.indexOf("rotate") < 0){
2424 trans = "rotate("+deg+","+x+","+y+")";
2425 obj.setAttribute("transform", trans);
2426 }else{
2427 var strs = trans.split(' ');
2428 trans = "";
2429 for(var i=0; i<strs.length ;i++){
2430 if(strs[i].indexOf("rotate") >= 0){ strs[i] = "rotate("+deg+","+x+","+y+")"; }
2431 trans += strs[i]+" ";
2432 }
2433 obj.setAttribute("transform",trim(trans));
2434 }
2435 }
2436
2437 function getScale(obj){
2438 var trans = obj.getAttribute("transform");
2439 if(!trans || trans.indexOf("scale") < 0) return null;
2440 var strs = trans.split(' ');
2441 for(var i=0; i<strs.length ;i++){
2442 if(strs[i].indexOf("scale") >= 0){
2443 var degs = strs[i].substr(6, strs[i].indexOf(")")-6);
2444 var degs = degs.split(',');
2445 return new Array(parseFloat(degs[0]), parseFloat(degs[1]));
2446 }
2447 }
2448 return null;
2449 }
2450
2451 function setScale(obj,scaleX, scaleY){
2452 var trans = obj.getAttribute("transform");
2453 var x = parseInt(svg_select.getAttribute("x"));
2454 var y = parseInt(svg_select.getAttribute("y"));
2455 var dx = x - scaleX*x;
2456 var dy = y - scaleY*y;
2457
2458 if(!trans) trans="";
2459 if(trans.indexOf("scale") < 0){
2460 trans = "scale("+scaleX+","+scaleY+")";
2461 obj.setAttribute("transform", trans);
2462 }else{
2463 var strs = trans.split(' ');
2464 trans = "";
2465 for(var i=0; i<strs.length ;i++){
2466 if(strs[i].indexOf("scale") >= 0){ strs[i] = "scale("+scaleX+","+scaleY+")"; }
2467 if(scaleX == 1 && scaleY == 1) continue;
2468 trans += strs[i]+" ";
2469 }
2470 obj.setAttribute("transform",trim(trans));
2471 }
2472 replaceTranslate(obj, dx/scaleX, dy/scaleY);
2473 }
2474
2475 function onTouchMoveCode1(pageX, pageY){
2476 if(targetItem || selectedItems.length > 0){
2477 switch(modeSVG){
2478 case 'newPath':
2479 if(targetItem.tagName == 'path' ){
2480 var path = targetItem.getAttribute("d");
2481 path = path + ' '+ getPreviewX(pageX) + ' '+ getPreviewY(pageY) ;
2482 targetItem.setAttribute("d",path);
2483 }
2484 break;
2485 case 'newLine':
2486 if(targetItem.tagName == 'line' ){
2487 var x2 = getPreviewX(pageX);
2488 var y2 = getPreviewY(pageY);
2489 targetItem.setAttribute("x2",x2);
2490 targetItem.setAttribute("y2",y2);
2491 }
2492 break;
2493 default:
2494 var dx = pageX - sx;
2495 var dy = pageY - sy;
2496
2497 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
2498 var lx = getPreviewX(pageX);
2499 var ly = getPreviewY(pageY);
2500
2501 if(!lineEdit){
2502 var x1 = getAttributeVal(selectedItems[0],"x1");
2503 var y1 = getAttributeVal(selectedItems[0],"y1");
2504 var x2 = getAttributeVal(selectedItems[0],"x2");
2505 var y2 = getAttributeVal(selectedItems[0],"y2");
2506 var xc = (x1+x2)/2;
2507 var yc = (y1+y2)/2;
2508 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
2509 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
2510 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
2511
2512 var minVal = Math.min(eS, Math.min(eC, eE));
2513 if(minVal == eS) lineEdit='start';
2514 else if(minVal == eE) lineEdit='end';
2515 else lineEdit='move';
2516 }
2517 if(lineEdit=='start'){
2518 selectedItems[0].setAttribute("x1",lx );
2519 selectedItems[0].setAttribute("y1",ly );
2520 setSelectBox();
2521 }else if(lineEdit == 'end'){
2522 selectedItems[0].setAttribute("x2",lx );
2523 selectedItems[0].setAttribute("y2",ly );
2524 setSelectBox();
2525 }else{
2526 replaceTranslate(selectedItems[0], dx, dy);
2527 // selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
2528 moveSelectedRectangle(dx, dy);
2529 }
2530 }else{
2531 for(var i=0; i<selectedItems.length;i++){
2532 if(selectedItems[i]){
2533 // selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
2534 replaceTranslate(selectedItems[i], dx, dy);
2535 }
2536 }
2537 moveSelectedRectangle(dx, dy);
2538 }
2539 break;
2540 }
2541 updateShowMenu();
2542 }else if(modeSVG == 'selector'){
2543 ex = pageX;
2544 ey = pageY;
2545 var x1=sx;
2546 var y1=sy;
2547 var x2=ex;
2548 var y2=ey;
2549
2550 if(sx > ex){ x1=ex; x2=sx; }
2551 if(sy > ey){ y1=ey; y2=sy; }
2552
2553 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
2554 }
2555 }
2556
2557 function svgInputTextExec(e){
2558 var inputform = document.getElementById('svg_input');
2559 var color=document.getElementById('svg_color');
2560 var size=document.getElementById('svg_size');
2561 if(!color || !size) return;
2562 var y = parseInt(inputform.style.top) + parseInt(size.value)*0.8 + 12;
2563 var x = parseInt(inputform.style.left) + 12;
2564 if(inputform.value){
2565 targetItem=createSVGText(inputform.value, x, y, size.value, color.value);
2566
2567 appendSVGObj(targetItem);
2568 }
2569 inputform.setAttribute("type", "hidden");
2570 setSVGMode('selector');
2571 }
2572
2573 function svgModifyTextExec(e){
2574 var inputform = document.getElementById('svg_input');
2575 editingTextObj.textContent = inputform.value;
2576 inputform.setAttribute("type", "hidden");
2577 editingTextObj.style.display='block';
2578
2579 editingTextObj=null;
2580 setSVGMode('selector');
2581 }
2582
2583 function svgInputFormAdjust(e){
2584 var inputform = document.getElementById('svg_input');
2585 inputform.size = jstrlen(inputform.value) + 1;
2586 }
2587
2588 function jstrlen(str) {
2589 var len = 0;
2590 str = escape(str);
2591 for (var i = 0; i < str.length; i++, len++) {
2592 if (str.charAt(i) == "%") {
2593 if (str.charAt(++i) == "u") {
2594 i += 3;
2595 len++;
2596 }
2597 i++;
2598 }
2599 }
2600 return len;
2601 }
2602
2603 function putInputForm(x, y, txt, size, id){
2604 var inputform = document.getElementById('svg_input');
2605 if(!inputform){
2606 inputform = document.createElement('input');
2607 inputform.setAttribute("id", "svg_input");
2608 inputform.setAttribute("style", "position:absolute;top:0px;left:0px; border:0px none");
2609 preview.appendChild(inputform);
2610 }
2611
2612 if(document.addEventListner){
2613 if(id){
2614 inputform.addEventListener("onChange", svgModifyTextExec,false);
2615 }else{
2616 inputform.addEventListener("onChange", svgInputTextExec,false);
2617 }
2618 inputform.addEventListener("onkeydown", svgInputFormAdjust,false);
2619 }else{
2620 if(id){
2621 inputform.setAttribute("onChange", "svgModifyTextExec()");
2622 }else{
2623 inputform.setAttribute("onChange", "svgInputTextExec()");
2624 }
2625 inputform.setAttribute("onkeydown", "svgInputFormAdjust()");
2626 }
2627
2628 inputform.setAttribute("type", "text");
2629 inputform.style.left=x+'px';
2630 inputform.style.top=y+'px';
2631 inputform.style.fontSize=size+'px';
2632 inputform.style.background='none';
2633 inputform.value = txt;
2634 inputform.size = jstrlen(txt) + 1;
2635 inputform.focus();
2636 }
2637
2638 ///// EventHandler for iPad
2639
2640 function onTouchStart(e){
2641 //e.preventDefault();
2642 sx=e.touches[0].pageX;
2643 sy=e.touches[0].pageY;
2644 ex=e.touches[0].pageX;
2645 ey=e.touches[0].pageY;
2646
2647 if (e.touches.length == 1){
2648 var touchtime = new Date();
2649 var dt = touchtime.getTime() - firstTouch.getTime();
2650 if(editingTextObj){
2651 var inputform = document.getElementById('svg_input');
2652 inputform.setAttribute("type", "hidden");
2653 editingTextObj.style.display='block';
2654 editingTextObj=null;
2655 }
2656 if(dt < 300 ){ onDoubleTap(); }else{ onTouchStartCore(); }
2657 firstTouch = touchtime;
2658 }
2659 updateSelectedRectangle();
2660 }
2661
2662 function onTouchMove(e){
2663 if (e.touches.length == 1){
2664 e.preventDefault();
2665 onTouchMoveCode1(e.touches[0].pageX, e.touches[0].pageY);
2666 }else if (e.touches.length == 2){
2667 if(selectedItems.length == 1){
2668 e.preventDefault();
2669 var dx = e.touches[0].pageX-e.touches[1].pageX;
2670 var dy = e.touches[0].pageY-e.touches[1].pageY;
2671 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2672
2673 if(th > 165 || th < 25) svg_scale_dir = 'x';
2674 else if(th > 65 && th < 115) svg_scale_dir = 'y';
2675 else svg_scale_dir = null;
2676 }
2677 }
2678 }
2679
2680 function onTouchEnd(e){
2681 e.preventDefault();
2682
2683 for(var i=0; i<selectedItems.length;i++){
2684 updateTransform(selectedItems[i]);
2685 }
2686
2687 if(modeSVG == 'selector'){
2688 var x1 = getPreviewX(sx);
2689 var y1 = getPreviewY(sy);
2690 var x2 = getPreviewX(ex);
2691 var y2 = getPreviewY(ey);
2692 getSelectedObjects(x1, y1, x2, y2);
2693 }
2694
2695 updateSelectedRectangle();
2696 updateTransform(svg_select);
2697
2698 setSelectBox();
2699 updateShowMenu();
2700 lineEdit=null;
2701 }
2702
2703
2704 function onGestureStart(e){
2705 targetItem = selectedItems[0];
2706 if(targetItem){
2707 svg_wo = targetItem.getAttribute("width");
2708 svg_ho = targetItem.getAttribute("height");
2709 svg_ro = targetItem.getAttribute("r");
2710 svg_rxo = targetItem.getAttribute("rx");
2711 svg_ryo = targetItem.getAttribute("ry");
2712 svg_fsize = targetItem.getAttribute("font-size");
2713 }else{
2714 svg_wo = null;
2715 svg_ho = null;
2716 svg_ro = null;
2717 svg_rxo = null;
2718 svg_ryo = null;
2719 svg_fsize = null;
2720 }
2721 }
2722
2723 function scaleGesture(obj,scale){
2724 switch(getElementTag(obj)){
2725 case 'text':
2726 if(svg_fsize) obj.setAttribute("font-size", Math.round(svg_fsize*scale) );
2727 break;
2728 case 'rect':
2729 case 'image':
2730 if(svg_wo && svg_scale_dir != 'y') obj.setAttribute("width",Math.round(svg_wo*scale ));
2731 if(svg_ho && svg_scale_dir != 'x') obj.setAttribute("height",Math.round(svg_ho*scale ));
2732 break;
2733 case 'circle':
2734 if(svg_ro) obj.setAttribute("r",Math.round(svg_ro*scale ));
2735 break;
2736 case 'ellipse':
2737 if (svg_rxo && svg_scale_dir != 'y') obj.setAttribute("rx",Math.round(svg_rxo*scale) );
2738 if (svg_ryo && svg_scale_dir != 'x') obj.setAttribute("ry",Math.round(svg_ryo*scale) );
2739 break;
2740 case 'path':
2741 case 'line':
2742 var scaleX = scale;
2743 var scaleY = scale;
2744 if(svg_scale_dir == 'x') scaleY=1;
2745 else if(svg_scale_dir == 'y') scaleX=1;
2746 setScale(obj, scaleX, scaleY);
2747
2748 break;
2749 defult:
2750 break;
2751 }
2752 }
2753
2754 function onGestureChange(e){
2755 var scale = e.scale;
2756 var rotation = e.rotation;
2757
2758 if(targetItem){
2759 e.preventDefault();
2760 if(!svg_scale_locked) scaleGesture(targetItem,scale);
2761 if(!svg_rotate_locked) setRotate(targetItem, rotation);
2762
2763 updateShowMenu();
2764 }
2765 }
2766
2767 function updatePathAndLine(){
2768 if(getElementTag(targetItem) == 'path'){
2769 var scale = getScale(targetItem);
2770 if(scale){
2771 setScale(targetItem,1,1);
2772 scalePath(targetItem, scale);
2773 }
2774 }else if(getElementTag(targetItem) == 'line'){
2775 var scale = getScale(targetItem);
2776 if(scale){
2777 setScale(targetItem, 1,1);
2778 scaleLine(targetItem, scale);
2779 }
2780 }
2781 }
2782
2783 function onGestureEnd(e){
2784 // e.preventDefault();
2785 svg_wo = null;
2786 svg_ho = null;
2787 svg_ro = null;
2788 svg_rxo = null;
2789 svg_ryo = null;
2790 svg_fsize = null;
2791
2792 updatePathAndLine();
2793 }
2794
2795 function onTouchStartColor(e){
2796 if(e.touches.length == 1){
2797 var ele = e.touches[0].target;
2798 var color;
2799 try{
2800 color = ele.getAttribute("color-val");
2801 }catch(err){ hideItemById('color-palette'); return;}
2802 var palette = document.getElementById('color-palette');
2803 var color_sel = palette.getAttribute("targetType");
2804 var fill_input = document.getElementById('svg_fill');
2805 var color_input = document.getElementById('svg_color');
2806 if(color) {
2807 for(var i=0;i < selectedItems.length; i++){
2808 selectedItems[i].setAttribute(color_sel, color);
2809 if(color_sel == 'fill'){
2810 if(fill_input) fill_input.value=color;
2811 document.getElementById('toolFill').style.backgroundColor=color;
2812 }else{
2813 color_input.value=color;
2814 document.getElementById('toolStroke').style.backgroundColor=color;
2815 }
2816 }
2817 }
2818 palette.style.display='none'; } }
2819 ///// For Safari
2820 var mouse_state=0;
2821
2822 function onMouseDown(e){
2823 mouse_state=e.which;
2824
2825 sx=e.pageX;
2826 sy=e.pageY;
2827 ex=e.pageX;
2828 ey=e.pageY;
2829
2830 if(isChildById(e.target, 'preview') || e.target.id == 'preview') {
2831 if(editingTextObj){
2832 var inputform = document.getElementById('svg_input');
2833 inputform.setAttribute("type", "hidden");
2834 editingTextObj.style.display='block';
2835 editingTextObj=null;
2836 }
2837
2838 if(e.altKey){
2839 targetItem = selectedItems[0];
2840 if(targetItem){
2841 svg_wo = targetItem.getAttribute("width");
2842 svg_ho = targetItem.getAttribute("height");
2843 svg_ro = targetItem.getAttribute("r");
2844 svg_rxo = targetItem.getAttribute("rx");
2845 svg_ryo = targetItem.getAttribute("ry");
2846 svg_fsize = targetItem.getAttribute("font-size");
2847 }else{
2848 svg_wo = null;
2849 svg_ho = null;
2850 svg_ro = null;
2851 svg_rxo = null;
2852 svg_ryo = null;
2853 svg_fsize = null;
2854 }
2855 }else{
2856 onTouchStartCore();
2857 }
2858 updateSelectedRectangle();
2859 return false;
2860 }else if(isChildById(e.target, 'color-palette') && e.target.tagName == 'DIV'){
2861 var ele = e.target;
2862 var palette = document.getElementById('color-palette');
2863 var color = ele.getAttribute("color-val");
2864 var color_sel = palette.getAttribute("targetType");
2865 var fill_input = document.getElementById('svg_fill');
2866 var color_input = document.getElementById('svg_color');
2867 if(color) {
2868 for(var i=0;i < selectedItems.length; i++){
2869 selectedItems[i].setAttribute(color_sel, color);
2870 if(color_sel == 'fill'){
2871 if(fill_input) fill_input.value=color;
2872 document.getElementById('toolFill').style.backgroundColor=color;
2873 }else{
2874 color_input.value=color;
2875 document.getElementById('toolStroke').style.backgroundColor=color;
2876 }
2877 }
2878 palette.style.display='none';
2879 }
2880 return false;
2881 }
2882 return true;
2883 }
2884
2885 function onMouseMove(e){
2886 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2887
2888 if(mouse_state == 1) {
2889 if(e.altKey){
2890 var dx = sx-e.pageX;
2891 var dy = sy-e.pageY;
2892 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2893 var scale;
2894
2895 if(th > 165 || th < 25){
2896 svg_scale_dir = 'x';
2897 scale = -dx/50;
2898 }else if(th > 65 && th < 115){
2899 svg_scale_dir = 'y';
2900 scale = -dy/50;
2901 }else{
2902 svg_scale_dir = null;
2903 if(dx > 0 && dy > 0) scale = -dx*dy/2500;
2904 else if(dx < 0 && dy < 0) scale = dx*dy/2500;
2905 else scale = 1;
2906 }
2907
2908 if(scale >= 0){
2909 if(scale < 1) scale=1;
2910 }else{
2911 if(scale > -1) scale=1;
2912 else scale= -1/scale;
2913 }
2914 if(targetItem && !svg_scale_locked){
2915 scaleGesture(targetItem,scale);
2916 updateShowMenu();
2917 }
2918 }else if(e.shiftKey){
2919 if(targetItem && !svg_rotate_locked){
2920 var dy = e.pageY -sy;
2921 var deg = dy % 360;
2922 setRotate(targetItem, deg);
2923 var ele = document.getElementById('svg_rotate');
2924 if(ele) ele.value=deg;
2925 }
2926 }else {
2927 onTouchMoveCode1(e.pageX, e.pageY);
2928 }
2929 }