Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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