Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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