Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations) (download) (as text)
Tue Jul 20 01:02:21 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 52128 byte(s)
getSVGContent() fixed
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 */
16
17 var systemDB;
18 var currentMode;
19 var editarea_w=80;
20 var editarea_h=10;
21 var MainTitle="Simple SVG Editor";
22
23 var preview=null;
24 var targetItem=null;
25 var selectedItems=new Array();
26 var sx=0;
27 var sy=0;
28 var ex=0;
29 var ey=0;
30 var modeSVG=null;
31 var iSlideMgr='iSlideManager.php';
32 var MgrPath="";
33 var nextId=1;
34
35 var lineEdit=null;
36 ////// SVG
37 var svg_ns = 'http://www.w3.org/2000/svg';
38 var svg_x=10;
39 var svg_y=10;
40 var svg_width = 100;
41 var svg_height = 50;
42 var svg_rx = 50;
43 var svg_ry = 30;
44 var svg_lw = 1;
45 var svg_wo = null;
46 var svg_ho = null;
47 var svg_ro = null;
48 var svg_rxo = null;
49 var svg_ryo = null;
50 var svg_fsize = null;
51 var svg_scale_dir = null;
52
53 var svg_top = null;
54 var svg_select = null;
55 var svg_defs = null;
56
57 //// Initialize
58 function initEditor(name, dispname, size){
59 systemDB = initDB(name, dispname, size);
60 fileSelector();
61 preview=document.getElementById('preview');
62 if(preview){
63 preview.addEventListener("touchstart", onTouchStart,false);
64 preview.addEventListener("touchmove", onTouchMove, false);
65 preview.addEventListener("touchend", onTouchEnd, false);
66 preview.addEventListener("gesturestart", onGestureStart,false);
67 preview.addEventListener("gesturechange", onGestureChange, false);
68 preview.addEventListener("gestureend", onGestureEnd, false);
69 }
70 }
71
72 function restoreValues(){
73 if(typeof(localStorage) == 'undefined'){
74 alert('local storage not suported');
75 }
76 MgrPath = localStorage.getItem('MgrPath') ? localStorage.getItem('MgrPath') : "";
77 window.onbeforeuload=function(){ return saveChanges(); }
78 }
79 function clearAll(){
80 localsStorage.clear();
81 restoreValudes();
82 }
83
84 function saveChanges(){
85 localStorage.getItem('MgrPath') = MgrPath;
86 }
87
88 // initialize a database
89 function initDB(name, dispname, size) {
90 try {
91 if (!window.openDatabase) {
92 alert('not supported');
93 } else {
94 var version = '1.0';
95 var myDB = openDatabase(name, version, dispname, size);
96 }
97 } catch(e) {
98 if (e == INVALID_STATE_ERR) {
99 alert("Invalid database version.");
100 } else {
101 alert("Unknown error "+e+".");
102 }
103 return null;
104 }
105
106 createTables(myDB);
107 return myDB;
108 }
109
110 function createTables(db) {
111 if (0) dropTables(db);
112
113 db.transaction(
114 function (transaction) {
115 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);
116 transaction.executeSql('CREATE TABLE IF NOT EXISTS filedata(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, datablob BLOB NOT NULL DEFAULT "");', [], nullDataHandler, errorHandler);
117 }
118 );
119 }
120
121 function dropTables(db) {
122 db.transaction(
123 function (transaction) {
124 transaction.executeSql('DROP TABLE files;');
125 transaction.executeSql('DROP TABLE filedata;');
126 }
127 );
128 }
129
130 /// Create New File
131 function reallyCreateNewFileAction(name, db){
132 var myDB = db;
133 if(!db) myDB = systemDB;
134
135 myDB.transaction(
136 function (transaction) {
137 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+name+"', results.insertId], nullDataHandler, killTransaction);");
138
139 transaction.executeSql('INSERT INTO filedata (datablob) VALUES ("");', [], myfunc, errorHandler);
140 }
141 );
142
143 fileSelector();
144 }
145
146 function createNewFileAction(db){
147 var myDB = db;
148 if(!db) myDB = systemDB;
149
150 var name = document.getElementById('createFilename').value
151 if(name == "") {
152 if (confirm('Filename is required, try agein?')) { createNewFile(); }else{ fileSelector(); }
153 return;
154 }
155
156 myDB.transaction(
157 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
158 "function (transaction, results) {"+
159 "if(results.rows.length == 0){"+
160 "reallyCreateNewFileAction('"+name+"');"+
161 "}else{"+
162 "if (confirm(results.rows.item(0)['name']+' already exist, try agein?')) {"+
163 "createNewFile();"+
164 "}else{"+
165 "fileSelector();"+
166 "}"+
167 "}"+
168 "}, errorHandler);")
169 );
170
171 }
172
173 //// Delete File
174 function deleteUpdateResults(transaction, results)
175 {
176 if (results.rowsAffected) {
177 fileSelector();
178 }
179 }
180
181 function reallyDelete(id, db){
182 var myDB = db;
183 if(!db) myDB = systemDB;
184
185 myDB.transaction(
186 new Function("transaction",
187 "transaction.executeSql('DELETE FROM files where id=?;', [ "+id+" ], null, errorHandler);"
188 +"transaction.executeSql('DELETE FROM filedata where id=?;', [ "+id+" ], deleteUpdateResults, errorHandler);")
189 );
190 }
191
192 function deleteFile(name, db){
193 var myDB = db;
194 if(!db) myDB = systemDB;
195
196 myDB.transaction(
197 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
198 "function (transaction, results) {"+
199 "if (confirm('Really delete '+results.rows.item(0)['name']+'?')) {"+
200 "reallyDelete(results.rows.item(0)['id']);"+
201 "}"+
202 "}, errorHandler);")
203 );
204 }
205
206 function reallyDeleteAll(db){
207 var myDB = db;
208 if(!db) myDB = systemDB;
209
210 myDB.transaction(
211 new Function("transaction",
212 "transaction.executeSql('DELETE FROM files;',[],null, errorHandler);"
213 +"transaction.executeSql('DELETE FROM filedata;',[],deleteUpdateResults, errorHandler);")
214 );
215 }
216
217 function deleteAllFile(db){
218 if (confirm('Really delete all file?')) {
219 reallyDeleteAll(db);
220 }
221 }
222
223 ///// Rename
224 function reallyRenameFileAction(id, newname, db){
225 var myDB = db;
226 if(!db) myDB = systemDB;
227
228 myDB.transaction(
229 function (transaction) {
230 transaction.executeSql('UPDATE files set name=? where id=?;', [newname,id ], null, errorHandler);
231 }
232 );
233 fileSelector();
234 }
235
236 function renameFileAction(db){
237 var myDB = db;
238 if(!db) myDB = systemDB;
239
240 var new_name = document.getElementById('newFilename').value
241 var id = document.getElementById('fileId').value
242
243 if(new_name == "") {
244 alert('Filename is required.');
245 fileSelector();
246 return;
247 }
248
249 myDB.transaction(
250 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+new_name+"'],"+
251 "function (transaction, results) {"+
252 "if(results.rows.length == 0){"+
253 "reallyRenameFileAction('"+id+"','"+new_name+"');"+
254 "}else{"+
255 "alert(results.rows.item(0)['name']+' already exist');"+
256 "fileSelector();"+
257 "}"+
258 "}, errorHandler);")
259 );
260
261 }
262
263
264 /// Save File
265 function saveFile(db){
266 var myDB = db;
267 if(!db) myDB = systemDB;
268
269 var editarea = document.getElementById('editarea');
270 var contents = "";
271 contents = editarea.value;
272
273 myDB.transaction(
274 function (transaction) {
275 var datadiv = document.getElementById('tempdata');
276 var filedata_id = datadiv.getAttribute('lfdataid');
277
278 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
279 [ contents, filedata_id ], nullDataHandler, errorHandler);
280
281 alert('Saved.');
282 }
283 );
284 }
285
286 function saveData(db){
287 var myDB = db;
288 if(!db) myDB = systemDB;
289
290 var contents = "";
291 contents = getSVGContent();
292
293 myDB.transaction(
294 function (transaction) {
295 var datadiv = document.getElementById('tempdata');
296 var filedata_id = datadiv.getAttribute('lfdataid');
297
298 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
299 [ contents, filedata_id ], nullDataHandler, errorHandler);
300
301 alert('Saved.');
302 }
303 );
304 }
305
306 function showFileData(transaction, results){
307 var data = results.rows.item(0);
308 var filename = data['name'];
309 var filedata = data['datablob'];
310
311 var datadiv = document.getElementById('tempdata');
312 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
313
314 document.title=filename;
315
316 previewFile(filedata);
317
318 updateShowMenu();
319 setMode('Preview');
320 }
321
322 function showFile(name){
323 getFile(name, 'showFileData');
324 }
325
326 function getFile(name, func, db){
327 var myDB = db;
328 if(!db) myDB = systemDB;
329
330 var datadiv = document.getElementById('tempdata');
331 if(datadiv) datadiv.setAttribute('lfname', name);
332
333 myDB.transaction(
334 function (transaction) {
335 transaction.executeSql('SELECT * from files, filedata where files.name=? and files.filedata_id = filedata.id;', [name], eval(func), errorHandler);
336 }
337 );
338 }
339
340 // Error Handlers
341 function killTransaction(transaction, error){
342 return true;
343 }
344
345 function errorHandler(transaction, error){
346 alert('Oops. Error was '+error.message+' (Code '+error.code+')');
347
348 var we_think_this_error_is_fatal = true;
349 if (we_think_this_error_is_fatal) return true;
350 return false;
351 }
352
353 function nullDataHandler(transaction, results){
354 }
355
356 ///////////////////////////
357
358 function fileSelector(db) {
359 var myDB = db;
360 if(!db) myDB = systemDB;
361
362 myDB.transaction(
363 function (transaction) {
364 transaction.executeSql("SELECT * from files where deleted=0;", [ ],
365 function (transaction, results) {
366 var filelist = '';
367 var menuDiv = document.getElementById('menuDiv');
368 if(menuDiv){
369 for(var i=0; i<results.rows.length; i++) {
370 var row = results.rows.item(i);
371 filelist = filelist + fileEntry(row);
372 }
373 if (filelist == "") {
374 filelist = "No files.<br />\n";
375 } else {
376 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
377 }
378 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+createMenuBar()+filelist;
379 }
380 }, errorHandler);
381 }
382 );
383 setMode('List');
384 }
385
386 function fileSelectorOnServer(val) {
387 var filelist = '';
388 var menuDiv = document.getElementById('menuDiv');
389 var results = val.split(',');
390
391 if(menuDiv){
392 for(var i=0; i<results.length; i++) {
393 var row = results[i];
394 filelist = filelist + fileEntryOnServer(row);
395 }
396 if (filelist == "") {
397 filelist = "No files.<br />\n";
398 } else {
399 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
400 }
401 var Menu = "<button onClick=\"fileSelector();\">Local Storage</button>";
402 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+Menu+filelist;
403 }
404 setMode('List');
405 }
406
407 function fileEntryOnServer(name){
408 name = name.split('.')[0];
409 var res = "<tr class='filerow'>";
410 res += "<td class='filenamecell' onClick=\"getRemoteFile('"+name+"');\">"+name+"</td>";
411 res += "<td class='filelinkcell'>";
412 res += "<button class='green' onClick=\"showRemoteFile('"+name+"');\">View</button>";
413 res += "<button onClick=\"downloadFile('"+name+"');\">Download</button>";
414 res += "</td></tr>\n";
415
416 return res;
417 }
418
419 function fileEntry(row){
420 var name = row['name'];
421 var files_id = row['id'];
422
423 var res = "<tr class='filerow'>";
424 res += "<td class='filenamecell' onClick=\"showFile('"+name+"');\">"+name+"</td>";
425 res += "<td class='filelinkcell'>";
426 res += "<button class='blue' onClick=\"editFile('"+name+"');\">&nbsp;Edit&nbsp;</button> &nbsp;";
427 res += "<button class='green' onClick=\"renameFile('"+name+"',"+files_id+");\">&nbsp;Rename&nbsp;</button> &nbsp;";
428 res += "<button onClick=\"uploadFile('"+name+"');\">Upload</button>";
429 res += "<button class='red' onClick=\"deleteFile('"+name+"');\">Delete</button>";
430 res += "</td></tr>\n";
431
432 return res;
433 }
434
435 function createMenuBar(){
436 var menu = "<ul id='menubar'>";
437 menu += "<li><button onClick='createNewFile()'>Create New File</button></li>";
438 menu += "<li><button onClick='deleteAllFile()'>Delete All</button></li>";
439 menu += "<li><button onClick='getRemoteFileList()'>File List on a Server</button></li>";
440 menu += "</ul><p class='cls'>";
441 return menu;
442 }
443
444 ////
445 function createNewFile(){
446 var popupDiv = document.getElementById('popup');
447 var string = "";
448
449 string += "<H1 class='title'>Create New File</H1>\n";
450 string += "<div class=\"input_form\">\n";
451 string += "Filename:<input id='createFilename' name='name' value=\"\" />\n";
452 string += "<button onClick=\"createNewFileAction();hideItemById('popup'); \">Create</button>\n";
453 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
454 string += "</div>\n";
455
456 popupDiv.innerHTML=string;
457 popupDiv.style.display='block';
458 }
459
460
461 /////
462 function renameFile(name, id){
463 var popupDiv = document.getElementById('popup');
464 var string = "";
465
466 string += "<H1 class='title'>Rename File</H1>\n";
467 string += "<div class='input_form'>\n";
468 string += "Old Filename: "+name+"<br>";
469 string += "New Filename:<input id='newFilename' name='newname' value=\"\" />\n";
470 string += "<input type='hidden' id='fileId' value=\""+id+"\" /><br>\n";
471 string += "<button onClick=\"renameFileAction();hideItemById('popup');\">Rename</button>\n";
472 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
473 string += "</div>\n";
474
475 popupDiv.innerHTML=string;
476 popupDiv.style.display='block';
477 }
478
479 /// EditMenu
480 function insertStr(str, len){
481 var editarea = document.getElementById('editarea');
482 if(len < 0) len = str.length;
483
484 if (editarea){
485 if(str=='DQ') str='"';
486 var strs = editarea.value;
487 var cPos = editarea.selectionStart;
488 var tmp = strs.substr(0,cPos);
489 editarea.value = tmp +str+strs.substr(cPos, strs.length);
490 cPos += len;
491 editarea.setSelectionRange(cPos, cPos);
492 editarea.focus();
493 }
494 }
495
496 function insertTag(tag){
497 var str;
498 var len = -1;
499 if (tag == "p"){
500 str = "<p> </p>";
501 len = 4;
502 }else if (tag == "ul"){
503 str = "<ul class=\" \"> \n\n</ul>";
504 len = 17;
505 }else if (tag == "li"){
506 str = "<li> </li>";
507 len = 5;
508 }else if (tag == "href"){
509 str = "xlink:href=\"\"";
510 len = 12;
511 }else if (tag == "EQ"){
512 str = "=\"\"";
513 len = 2;
514 }else if (tag == "svg:text"){
515 str = "<svg:text x=\"100\" y=\"100\" fill=\"black\" font-size=\"12\"> </svg:text>";
516 len = 58;
517 }else if (tag == "svg:rect"){
518 str = "<svg:rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"white\" stroke=\"black\" />";
519 len = 13;
520 }else if (tag == "svg:circle"){
521 str = "<svg:circle cx=\"10\" cy=\"100\" r=\"100\" fill=\"white\" stroke=\"black\" strokc-width=\"1\"/>";
522 len = 17;
523 }
524 insertStr(str, len);
525 }
526
527 function editMenuBar()
528 {
529 var str = "";
530 str += "<button onClick=\"insertStr('/',1);\">/</button>\n";
531 str += "<button onClick=\"insertStr('DQ',1);\">\"</button>\n";
532 str += "<button onClick=\"insertTag('EQ',1);\">=\"\"</button>\n";
533 str += "<button onClick=\"insertTag('p');\">p</button>\n";
534 str += "<button onClick=\"insertTag('href');\">href</button>\n";
535
536 str += "<button onClick=\"insertTag('svg:text');\">TEXT</button>\n";
537 str += "<button onClick=\"insertTag('svg:rect');\">rect</button>\n";
538 str += "<button onClick=\"insertTag('svg:circle');\">circle</button>\n";
539
540 str += "<button onClick=\"chEditareaHeight();\">...</button>\n";
541
542 return str;
543 }
544
545 function updateEditMenu(){
546 var menuDiv = document.getElementById('menuDiv');
547 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
548 menuDiv.innerHTML+= "<button onClick=\"saveFile();fileSelector();\"> Save </button>\n";
549 menuDiv.innerHTML+= "<button onClick=\"previewData();\"> Preview </button>\n";
550 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
551
552 menuDiv.style.display='block';
553 }
554
555 //// Editor
556 function editFileData(transaction, results){
557 var editDiv = document.getElementById('editDiv');
558 var datadiv = document.getElementById('tempdata');
559
560 var data = results.rows.item(0);
561 var filename = data['name'];
562 var filedata = data['datablob'];
563 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
564
565 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+filedata+"</textarea>\n";
566
567 document.title="EditFile: "+filename;
568 updateEditMenu();
569 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
570
571 setMode('Edit');
572 }
573
574 function editFile(name){
575 if(currentMode == 'Preview'){
576 var data = getSVGContent();
577 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+data+"</textarea>\n";
578 updateEditMenu();
579 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
580
581 setMode('Edit');
582 }else{
583 getFile(name, 'editFileData');
584 }
585 }
586
587 function editCurrentFile(){
588 var datadiv = document.getElementById('tempdata');
589 var name = datadiv.getAttribute('lfname');
590
591 editFile(name);
592 }
593
594 // Show File
595 function updateShowMenu(){
596 var menuDiv = document.getElementById('menuDiv');
597 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
598 menuDiv.innerHTML+= "<button onClick=\"editCurrentFile();\"> Edit </button>\n";
599 menuDiv.innerHTML+= "<button onClick=\"saveData();\"> Save </button>\n";
600 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
601 menuDiv.innerHTML+= "<button onClick=\"showSVGSource();\"> &lt;SVG &gt; </button>\n";
602 menuDiv.innerHTML+= updateSVGObjMenu();
603 menuDiv.style.display='block';
604 updateToolBar();
605 }
606
607
608 function updateToolBar(){
609 var toolbar = document.getElementById('toolBar');
610 toolbar.innerHTML= "<ul>";
611 toolbar.innerHTML+= "<li><button id=\"b_selector\" onClick=\"setSVGMode('selector');\"><img src=\"images/arrow.png\" /></button> </li>\n";
612 toolbar.innerHTML+= "<li><button id=\"b_newPath\" onClick=\"setSVGMode('newPath'); \"><img src=\"images/path.png\" /></button></li> \n";
613 toolbar.innerHTML+= "<li><button id=\"b_newLine\" onClick=\"setSVGMode('newLine'); \"><img src=\"images/line.png\" /> </button></li> \n";
614 toolbar.innerHTML+= "<li><button id=\"b_text\" onClick=\"setSVGMode('text'); \"><img src=\"images/text.png\" /></button> </li>\n";
615 toolbar.innerHTML+= "<li><button id=\"b_rect\" onClick=\"setSVGMode('rect'); \"> <img src=\"images/rect.png\" /> </button></li> \n";
616 toolbar.innerHTML+= "<li><button id=\"b_circle\" onClick=\"setSVGMode('circle'); \"> <img src=\"images/circle.png\" /> </button></li> \n";
617 toolbar.innerHTML+= "<li><button id=\"b_ellipse\" onClick=\"setSVGMode('ellipse'); \"> <img src=\"images/ellipse.png\" /> </button></li> \n";
618 toolbar.innerHTML+= "<li><button id=\"b_image\" onClick=\"setSVGMode('image'); \"> <img src=\"images/img.png\" /> </button></li> \n";
619 toolbar.innerHTML+= "</ul>";
620 toolbar.style.display='block';
621
622 }
623
624 function setMode(m){
625 currentMode=m;
626 switch(m){
627 case 'List':
628 hideItemById('editDiv');
629 hideItemById('preview');
630 hideItemById('popup');
631 hideItemById('toolBar');
632 showItemById('menuDiv');
633 break;
634 case 'Edit':
635 hideItemById('preview');
636 hideItemById('popup');
637 hideItemById('toolBar');
638 showItemById('editDiv');
639 showItemById('menuDiv');
640 break;
641 case 'Preview':
642 showItemById('preview');
643 hideItemById('editDiv');
644 hideItemById('popup');
645 showItemById('menuDiv');
646 showItemById('toolBar');
647 break;
648 default:
649 break;
650 }
651 }
652
653 function hideItemById(id){
654 var itm = document.getElementById(id);
655 if(itm) itm.style.display='none';
656 }
657
658 function showItemById(id){
659 var itm = document.getElementById(id);
660 if(itm) itm.style.display='block';
661 }
662
663 function removeChildNodes(id){
664 var itm = document.getElementById(id);
665 if(!itm) return;
666
667 var child = itm.firstChild;
668
669 while(child){
670 itm.removeChild(child);
671 child = itm.firstChild;
672 }
673 }
674
675 function chEditareaHeight(){
676 var itm = document.getElementById('editarea');
677 if(!itm) return;
678 var cv = itm.getAttribute('rows');
679 if(parseInt(cv) > editarea_h){
680 itm.setAttribute('rows', editarea_h);
681 }else{
682 itm.setAttribute('rows', editarea_h * 2);
683 }
684 }
685
686 function format_file(str){
687 return "<pre>"+str+"</pre>";
688 }
689
690 function previewData(data){
691 if(!data) data = document.getElementById('editarea').value;
692
693 previewFile(data);
694
695 updateShowMenu();
696 setMode('Preview');
697 }
698
699 function previewFile(data){
700 removeChildNodes('preview');
701
702 preview.style.display='block';
703 preview.style.position='absolute';
704 preview.style.top='180px';
705 preview.style.width='80%';
706 preview.style.height='80%';
707
708 var ele = toSVGElement(data, '100%','100%');
709
710 preview.appendChild(ele);
711
712 svg_top = document.getElementById('svg_top');
713 initSVGElementId(svg_top);
714 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
715 svg_select.setAttribute("id","svg_select");
716 appendSVGObj(svg_select);
717
718 }
719
720 ////// for SVG object
721 ////////////////
722 function updateSVGObjMenu(){
723 var res = "";
724 var tag = modeSVG;
725 if(selectedItems.length > 1) return res;
726 if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
727
728 switch(tag){
729 case 'text':
730 if(selectedItems[0]){
731 res += setSVGObjectProp(selectedItems[0]);
732 }else{
733 res += propSVGText("", 24, '#000000');
734 }
735 break;
736 case 'rect':
737 case 'circle':
738 case 'ellipse':
739 case 'newPath':
740 case 'newLine':
741 case 'path':
742 case 'line':
743 case 'polyline':
744 case 'polygon':
745 if(selectedItems[0]){
746 res += setSVGObjectProp(selectedItems[0]);
747 }else{
748 res += propSVGObj(tag+":", 1, '#000000', '#ffffff');
749 }
750 break;
751 case 'image':
752 if(selectedItems[0]){
753 res += setSVGObjectProp(selectedItems[0]);
754 }else{
755 res += propSVGImage("", 100, 100);
756 }
757 break;
758 default:
759 break;
760 }
761 return res;
762 }
763
764 function propSVGText(str, size, color){
765 if(!size) size = 24;
766 if(!color) color = '#000000';
767
768 var res = "Text:";
769 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\"/>";
770 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
771 res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
772 return res;
773 }
774
775 function propSVGObj(type, stroke, color, fill){
776 var res = type;
777 if(!stroke) stroke = 1;
778 if(!color) color = '#000000';
779 if(!fill) fill = '#ffffff';
780 res += "Fill:<input type=\"text\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
781 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
782 res += "L:<input type=\"text\" id=\"svg_stroke\" value=\""+stroke+"\" size=\"2\"/>";
783 return res;
784 }
785
786 function propSVGLine(type, stroke, color, fill, style){
787 var res = propSVGObj(type, stroke, color, fill);
788 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
789 res += "Arrow:";
790 if(hasArrow('start')){
791 res += "<button onClick=\"removeLeftArrow();\"> - </button>";
792 }else{
793 res += "<button onClick=\"setLeftArrow();\">��� </button>";
794 }
795 if(hasArrow('end')){
796 res += "<button onClick=\"removeRightArrow();\"> - </button>";
797 }else{
798 res += "<button onClick=\"setRightArrow();\">��� </button>";
799 }
800 return res;
801 }
802
803 function propSVGImage(str, w, h){
804 var res = "image:";
805 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
806 res += "Width:<input type=\"text\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
807 res += "Height:<input type=\"text\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
808 return res;
809 }
810
811 function setSVGMode(m){
812 modeSVG = m;
813 updateShowMenu();
814
815 if(m == 'selector'){
816 targetItem=null;
817 clearSelectedItems();
818 }
819
820 var btn = document.getElementById('b_'+modeSVG);
821 if(btn){
822 btn.style.border="3px solid red";
823 }
824 }
825
826
827 function toSVGElement(str, w, h){
828 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
829 var parser = new DOMParser();
830 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
831 var footer = "</svg:svg>";
832 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
833 var xmlRoot = xmlDoc.documentElement;
834 var ele = document.importNode(xmlRoot,true);
835
836 return ele;
837 }
838
839 function createSVGElement(tag, id){
840 if(id=='new'){
841 id = 'svg_'+nextId;
842 nextId++;
843 }
844 var ele= document.createElementNS(svg_ns, tag);
845 ele.setAttribute("id", id);
846 return ele;
847 }
848
849 function defSVGElement(node){
850 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
851 if(!svg_defs){
852 svg_defs = createSVGElement('defs', 'svg_defs');
853 svg_top.insertBefore(svg_defs, svg_top.firstChild);
854 }
855 if(node) svg_defs.appendChild(node);
856 }
857
858 function initSVGElementId(svg_top){
859 nextId = 1;
860 checkSVGElementId(svg_top);
861 appendSVGElementId(svg_top);
862 }
863
864 function checkSVGElementId(top){
865 var objs = top.childNodes;
866
867 for(var i=0; i<objs.length ;i++){
868 if(objs[i].tagName){
869 var id = objs[i].getAttribute("id");
870
871 if(id && id.match(/svg_[0-9]+/i)){
872 var n = parseInt(RegExp.lastMatch.substr(4));
873 if(n >= nextId){
874 nextId = n+1;
875 }
876
877 }
878 checkSVGElementId(objs[i]);
879 }
880 }
881 }
882
883 function appendSVGElementId(top){
884 var objs = top.childNodes;
885
886 for(var i=0; i<objs.length ;i++){
887 if(objs[i].tagName){
888 var id = objs[i].getAttribute("id");
889 if(!id){
890 objs[i].setAttribute("id", "svg_"+nextId);
891 nextId++;
892 }
893 }
894 appendSVGElementId(objs[i]);
895 }
896 }
897
898 function selectedRectangle(x, y, ex, ey){
899 if(!svg_select) return null;
900
901 svg_select.setAttribute("x",x);
902 svg_select.setAttribute("y",y);
903 svg_select.setAttribute("width", ex-x);
904 svg_select.setAttribute("height", ey-y);
905 svg_select.setAttribute("visibility", "visible");
906 return svg_select;
907 }
908
909
910 function setAttributes(obj, attrs){
911 var attr_array = attrs.split(',');
912
913 for (var i=0; i<attr_array.length;i++){
914 var x = attr_array[i].split('=');
915 if(x.length == 2){
916 obj.setAttribute(x[0], x[1]);
917 }
918 }
919 }
920
921 function createSVGObj(tag, attrs, fill, color, lw){
922 var ele = createSVGElement(tag, 'new');
923 setAttributes(ele, attrs);
924 if (fill) ele.setAttribute('fill', fill);
925 if (color) ele.setAttribute('stroke', color);
926 if(lw) ele.setAttribute('stroke-width', lw);
927
928 return ele;
929 }
930
931 function createSVGText(txt, x, y, size, color){
932 var ele = createSVGElement('text', 'new');
933
934 ele.setAttribute('x', x);
935 ele.setAttribute('y', y);
936 ele.setAttribute('font-size', size);
937 ele.setAttribute('fill', color);
938 ele.textContent=txt;
939
940 return ele;
941 }
942
943 function createSVGImage(fname, width, height, attrs){
944 var ele = createSVGElement('image', 'new');
945 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
946 ele.setAttribute('width', width);
947 ele.setAttribute('height', height);
948 setAttributes(ele, attrs);
949
950 return ele;
951 }
952
953 function createSVGMarker(pid, id, child){
954 var parent = document.getElementById(pid);
955 if(!parent) return;
956 var ele = createSVGElement('marker', pid+'_'+id);
957 ele.appendChild(child);
958 return ele;
959 }
960
961 function setLeftArrow(){
962 if( selectedItems.length == 1 ){
963 setArrow(selectedItems[0], 'start', '');
964 }
965 }
966
967 function setRightArrow(){
968 if( selectedItems.length == 1 ){
969 setArrow(selectedItems[0], 'end', '');
970 }
971 }
972
973 function removeLeftArrow(){
974 if( selectedItems.length == 1 ){
975 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
976 var pid = selectedItems[0].getAttribute('id');
977 var marker = document.getElementById(pid+'_startarrow');
978 svg_defs.removeChild(marker);
979 selectedItems[0].removeAttribute('marker-start');
980 }
981 }
982
983 function removeRightArrow(){
984 if( selectedItems.length == 1 ){
985 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
986 var pid = selectedItems[0].getAttribute('id');
987 var marker = document.getElementById(pid+'_endarrow');
988 svg_defs.removeChild(marker);
989 selectedItems[0].removeAttribute('marker-end');
990 }
991 }
992
993 function hasArrow(pos){
994 var pobj = selectedItems[0];
995 if(!pobj) return false;
996 var pid = pobj.getAttribute('id');
997 var marker = document.getElementById(pid+'_'+pos+'arrow');
998 if(marker) return true;
999 return false;
1000 }
1001
1002 function getArrowMarker(obj,pos){
1003 if(!obj) return false;
1004 var pid = obj.getAttribute('id');
1005 var marker = document.getElementById(pid+'_'+pos+'arrow');
1006 return false;
1007 }
1008
1009 function setArrow(pobj, pos, type){
1010 if(!pobj) return;
1011 var pid = pobj.getAttribute('id');
1012 var marker = document.getElementById(pid+'_'+pos+'arrow');
1013 if(marker) return;
1014
1015 var obj = createSVGElement('path', 'new');
1016
1017 var refX = 0;
1018 var refY = 0;
1019
1020 switch(pos){
1021 case 'start':
1022 refX=10;
1023 refY=10;
1024 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1025 break;
1026 case 'end':
1027 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1028 refX= 10;
1029 refY=10;
1030 break;
1031 default:
1032 return;
1033 }
1034
1035 marker = createSVGMarker(pid, pos+'arrow' , obj);
1036 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1037
1038 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1039
1040 defSVGElement(marker);
1041 var mid = "url(#"+marker.getAttribute("id")+")";
1042 var mattr = "marker-"+pos;
1043 pobj.setAttribute(mattr, mid);
1044 }
1045
1046 function appendSVGObj(obj){
1047 var svg_top = document.getElementById('svg_top');
1048 if(!svg_top) return;
1049
1050 svg_top.appendChild(obj);
1051 }
1052
1053 function isChildById(element, id) {
1054 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1055 else if (element.parentNode.id == id) return true;
1056 else return isChildById(element.parentNode, id);
1057 }
1058
1059 /////////////////////// Formatting SVG DOM
1060 function escapeHTML(text) {
1061 return text.replace( /[<>"&]/g,
1062 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1063 );
1064 };
1065
1066 function formatTag(ele){
1067 var str="";
1068 if(ele.nodeType == 1){
1069 var tag_a = ele.tagName.split(':');
1070 var tag;
1071 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1072
1073 str += "<"+tag;
1074 var attrs = ele.attributes;
1075 for(var i=0; i<attrs.length; i++){
1076 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1077 }
1078 var cn = ele.childNodes;
1079 if(cn.length > 0){
1080 str +=">\n";
1081 for(var i=0; i<cn.length; i++){
1082 var tmp = trim(formatTag(cn[i]));
1083 if(tmp) str += " "+tmp+"\n";
1084 }
1085 str += "</"+tag+">";
1086 }else{
1087 str +=" />";
1088 }
1089 return str;
1090 }else if(ele.nodeType==3){
1091 return ele.textContent;
1092 }
1093 }
1094
1095 function getSVGContent(){
1096 if(!svg_top) return "";
1097
1098 var str = "";
1099 var elements = svg_top.childNodes;
1100 for(var i=0; i<elements.length; i++){
1101 if(elements[i] != svg_select){
1102 var tmp = trim(formatTag(elements[i]));
1103 if(tmp) str += tmp + '\n';
1104 }
1105 }
1106 return str;
1107 }
1108
1109 function trim(str){
1110 return str.replace(/(^\s+)|(\s+$)/g, "");
1111 }
1112
1113 /////// Access Server
1114 function newXMLRequest(){
1115 if(this.XMLHttpRequest){
1116 return new XMLHttpRequest();
1117 }else {
1118 return new ActiveXObject("Microsoft.XMLHTTP");
1119 }
1120 }
1121
1122 function createRequestData(data){
1123 var str="filetype=svg";
1124 for (var i in data){
1125 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1126 }
1127 return str;
1128 }
1129
1130 function postRequest(url, data, func){
1131 var postData=createRequestData(data);
1132 var obj=newXMLRequest();
1133
1134 obj.onreadystatechange = function(){
1135 if (obj.readyState == 4 && obj.status == 200){
1136 func(obj.responseText);
1137 }
1138 }
1139 obj.open("POST", url, true);
1140 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1141 obj.send(postData);
1142 }
1143
1144 function commnadFinishAlert(s){
1145 alert(s);
1146 }
1147
1148 function uploadFileData(transaction, results){
1149 var data = results.rows.item(0);
1150 var updata = new Array(0);
1151 updata['name']= data['name'];
1152 updata['datalob'] = data['datablob'];
1153 updata['cmd'] = 'upload'
1154
1155 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1156 }
1157
1158 function uploadFile(name){
1159 getFile(name, 'uploadFileData');
1160 }
1161
1162 function getRemoteFileList(){
1163 var data=new Array();
1164 data['name'] = "SVG";
1165 data['cmd'] = "list";
1166 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1167 }
1168
1169 function previewRemoteFile(content){
1170 previewFile(content);
1171 setMode('Preview');
1172 }
1173
1174 function getRemoteFile(name){
1175 var data=new Array();
1176 data['name'] = name;
1177 data['cmd'] = "get";
1178 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1179 }
1180
1181 function showRemoteFile(name){
1182 getRemoteFile(name);
1183 }
1184
1185 //////// Event Handler
1186 function setInnerHTML(id, val){
1187 var itm=document.getElementById(id);
1188 if(itm) itm.innerHTML=val;
1189 }
1190
1191 function popupInfo(val){
1192 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1193 str += val;
1194 setInnerHTML('popup', str);
1195 showItemById('popup');
1196 }
1197
1198 function addAttributeVal(obj, itm, dv){
1199 if(obj.hasAttribute(itm)){
1200 var x = parseInt(obj.getAttribute(itm));
1201 x = x + dv;
1202 obj.setAttribute(itm, x)
1203 }
1204 }
1205
1206 function showSVGSource(){
1207 var str = getSVGContent();
1208 var escstr="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1209 escstr += "<pre>"+escapeHTML(str)+"</pre>";
1210 setInnerHTML('popup', escstr);
1211 showItemById('popup');
1212 }
1213
1214
1215 function getElementTag(obj){
1216 if (!obj) return null;
1217 var tag = obj.tagName.split(':');
1218 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1219 return tag[0];
1220 }
1221
1222 function setSVGObjectProp(obj){
1223 var tag = getElementTag(obj);
1224 var res ="";
1225 switch(tag){
1226 case 'text':
1227 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1228 break;
1229 case 'rect':
1230 case 'circle':
1231 case 'ellipse':
1232 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1233 break;
1234 case 'path':
1235 case 'line':
1236 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1237 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1238 break;
1239 case 'image':
1240 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"));
1241 break;
1242 default:
1243 break;
1244 }
1245 if(res != ""){
1246 res += "<button onClick=\"updateSVGObj();\">OK</button>";
1247 res += "<button onClick=\"delSVGObj();\">Del</button>";
1248 }
1249
1250 return res
1251 }
1252
1253 function updateSVGObj(){
1254 if(selectedItems.length != 1) return;
1255 var obj = selectedItems[0];
1256 var tag = getElementTag(obj);
1257 var res ="";
1258 switch(tag){
1259 case 'text':
1260 var txt=document.getElementById('svg_text');
1261 var color=document.getElementById('svg_color');
1262 var size=document.getElementById('svg_size');
1263 obj.textContent = txt.value;
1264 obj.setAttribute("fill", color.value);
1265 obj.setAttribute("font-size", size.value);
1266 break;
1267 case 'rect':
1268 case 'circle':
1269 case 'ellipse':
1270 var fill=document.getElementById('svg_fill');
1271 var color=document.getElementById('svg_color');
1272 var L=document.getElementById('svg_stroke');
1273 obj.setAttribute("fill", fill.value);
1274 obj.setAttribute("stroke", color.value);
1275 obj.setAttribute("stroke-width", L.value);
1276 break;
1277 case 'path':
1278 case 'line':
1279 var fill=document.getElementById('svg_fill');
1280 var color=document.getElementById('svg_color');
1281 var L=document.getElementById('svg_stroke');
1282 var dash=document.getElementById('svg_stroke_type');
1283 obj.setAttribute("fill", fill.value);
1284 obj.setAttribute("stroke", color.value);
1285 obj.setAttribute("stroke-width", L.value);
1286 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1287 var id = obj.getAttribute("id");
1288 var marker = document.getElementById(id+'_startarrow');
1289 if(marker) marker.setAttribute("fill", color.value);
1290 var marker = document.getElementById(id+'_endarrow');
1291 if(marker) marker.setAttribute("fill", color.value);
1292 break;
1293 case 'image':
1294 var fname=document.getElementById('svg_text');
1295 var w=document.getElementById('svg_w');
1296 var h=document.getElementById('svg_h');
1297 obj.setAttribute("xlink:href", fname.value);
1298 obj.setAttribute("width", w.value);
1299 obj.setAttribute("height", h.value);
1300 break;
1301 default:
1302 break;
1303 }
1304
1305 }
1306
1307 function delSVGObj(){
1308 if(selectedItems.length != 1) return;
1309 var obj = selectedItems[0];
1310
1311 if(!svg_top) return;
1312 svg_top.removeChild(obj);
1313 svg_select.setAttribute("visibility","hidden");
1314 }
1315
1316 ///// For MobileSafari
1317 function getPreviewX(x){ return x - preview.offsetLeft; }
1318 function getPreviewY(y){ return y - preview.offsetTop; }
1319
1320 function calcDit(x1, y1, x2, y2){
1321 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1322 }
1323
1324 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1325 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1326 }
1327
1328 function getAttributeVal(obj, name){
1329 try{
1330 return parseInt(obj.getAttribute(name));
1331 }catch(e){ return 0; }
1332 }
1333
1334 function checkIntersection(obj, x, y, ex, ey){
1335 var res = true;
1336 var bbox = obj.getBBox();
1337 var ox = bbox.x;
1338 var oy = bbox.y;
1339 var oex = bbox.x+bbox.width;
1340 var oey = bbox.y+bbox.height;
1341 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1342
1343 var tag = getElementTag(obj);
1344 switch(tag){
1345 case 'circle':
1346 case 'ellipse':
1347 var cx = getAttributeVal(obj,"cx");
1348 var cy = getAttributeVal(obj,"cy");
1349 var rx = getAttributeVal(obj,"r");
1350 var ry = rx;
1351 if(!rx){
1352 var rx = getAttributeVal(obj,"rx");
1353 var ry = getAttributeVal(obj,"ry");
1354 }
1355
1356 if(res){
1357 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1358 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1359 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1360 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1361 }
1362 break;
1363 case 'path':
1364 var d = obj.getAttribute("d");
1365 var p = getPoints(d);
1366 for(var i=0;i<p.length;i++){
1367 var ox=p[i][0];
1368 var oy=p[i][1];
1369 if(x < ox && ox < ex && y < oy && oy < ey) {
1370 return true;
1371 }
1372 }
1373 return false;
1374 break;
1375 case 'line':
1376 var x1 = getAttributeVal(obj,"x1");
1377 var y1 = getAttributeVal(obj,"y1");
1378 var x2 = getAttributeVal(obj,"x2");
1379 var y2 = getAttributeVal(obj,"y2");
1380 var d = (y2-y1)/(x2-x1);
1381
1382 if(res){
1383 var xx = Math.abs(x2-x1);
1384 var sign = 1;
1385 if(x2-x1 < 0){ sign = -1; }
1386 for(var i=0; i < xx; i++){
1387 var nx = i*sign + x1;
1388 var ny = d * i*sign + y1;
1389 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1390 }
1391 }
1392 return false;
1393
1394 return res;
1395 break;
1396 case 'text':
1397 case 'rect':
1398 case 'polygon':
1399 case 'polyline':
1400 case 'image':
1401 break;
1402 default:
1403 res=false;
1404 break;
1405 }
1406 return res;
1407 }
1408
1409 function getBoundingBox(obj){
1410 var res = new Array(4);
1411 var bbox = obj.getBBox();
1412 res[0] = bbox.x-1;
1413 res[1] = bbox.y-1;
1414 res[2] = bbox.x+bbox.width+2;
1415 res[3] = bbox.y+bbox.height+2;
1416 return res;
1417 }
1418
1419 function setSelectBox(){
1420 if(!svg_select) return;
1421
1422 if(selectedItems.length == 0){
1423 svg_select.setAttribute("visibility","hidden");
1424 return;
1425 }
1426
1427 var bbox = new Array(4);
1428 bbox[0] = 1000;
1429 bbox[1] = 1000;
1430 bbox[2] = 0;
1431 bbox[3] = 0;
1432
1433 for(var i=0;i<selectedItems.length;i++){
1434 var bp = getBoundingBox(selectedItems[i]);
1435 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1436 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1437 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1438 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1439 }
1440 svg_select.setAttribute("x", bbox[0]);
1441 svg_select.setAttribute("y", bbox[1]);
1442 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1443 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1444 svg_select.setAttribute("visibility","visible;");
1445 }
1446
1447 function getSelectedObjects(x1, y1, x2, y2){
1448 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1449 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1450
1451 var val="";
1452 if(svg_top){
1453 var val ="";
1454 var objs = svg_top.childNodes;
1455 selectedItems = new Array();
1456 for(var i=0; i<objs.length;i++){
1457 if(objs[i].tagName){
1458
1459 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1460 selectedItems.push(objs[i]);
1461 }
1462 val += objs[i].tagName+" ";
1463 }
1464 }
1465 }
1466 setSelectBox();
1467 }
1468
1469 function onTouchStart(e){
1470 //e.preventDefault();
1471 sx=e.touches[0].pageX;
1472 sy=e.touches[0].pageY;
1473 ex=e.touches[0].pageX;
1474 ey=e.touches[0].pageY;
1475
1476 if (e.touches.length == 1){
1477 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1478 var x1=getPreviewX(sx-1);
1479 var y1=getPreviewY(sy-1);
1480 var x2=getPreviewX(sx+2);
1481 var y2=getPreviewY(sy+2);
1482 getSelectedObjects(x1, y1, x2, y2);
1483
1484 if(selectedItems.length == 0){
1485 setSVGMode('selector');
1486 }else if(selectedItems.length == 1){
1487 targetItem=selectedItems[0];
1488 setSVGMode(getElementTag(targetItem));
1489 }else{
1490 setSVGMode('Group');
1491 }
1492 }else { // CreateMode
1493 if(selectedItems.length == 0){
1494
1495 var fill=document.getElementById('svg_fill');
1496 var color=document.getElementById('svg_color');
1497 var L=document.getElementById('svg_stroke');
1498
1499 var x = getPreviewX(sx);
1500 var y = getPreviewY(sy);
1501
1502 switch(modeSVG){
1503 case 'text':
1504 var txt=document.getElementById('svg_text');
1505 var size=document.getElementById('svg_size');
1506 var y = y + parseInt(size.value)*0.8;
1507 if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1508 break;
1509 case 'rect':
1510 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1511 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1512 break;
1513 case 'circle':
1514 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1515 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1516 break;
1517 case 'ellipse':
1518 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1519 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1520 break;
1521 case 'newPath':
1522 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1523 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1524 break;
1525 case 'newLine':
1526 var x2=x+1;
1527 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1528 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1529 break;
1530 case 'image':
1531 var attr = 'x='+x+',y='+y;
1532 var txt=document.getElementById('svg_text');
1533 var w=document.getElementById('svg_w');
1534 var h=document.getElementById('svg_h');
1535 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1536 default:
1537 break;
1538 }
1539 if (targetItem){
1540 appendSVGObj(targetItem);
1541 selectedItems[0]=targetItem;
1542 }
1543 }else{
1544 var x1=getPreviewX(sx-1);
1545 var y1=getPreviewY(sy-1);
1546 var x2=getPreviewX(sx+2);
1547 var y2=getPreviewY(sy+2);
1548 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1549 setSVGMode('selector');
1550 }
1551 }
1552 }
1553 }
1554
1555 updateSelectedRectangle();
1556 }
1557
1558 function getPoints(d){
1559 var p = d.split(' ');
1560 var res = new Array();
1561 var isx=true;
1562 var x, y;
1563 for(var i=0; i<p.length;i++){
1564 if(p[i].match('[MLHVCSQTA]','i')){
1565 }else{
1566 if(isx){
1567 x = parseInt(p[i]);
1568 }else{
1569 y = parseInt(p[i]);
1570 res.push(new Array(x, y));
1571 }
1572 isx = !isx;
1573 }
1574 }
1575 return res;
1576 }
1577
1578 function updatePath(d, x, y){
1579 var p = d.split(' ');
1580 var res = "";
1581 var isx=true;
1582 var val;
1583 for(var i=0; i<p.length;i++){
1584 if(p[i].match('[MLHVCSQTA]','i')){
1585 res += ' '+p[i];
1586 }else{
1587 if(isx){
1588 val = parseInt(p[i])+x;
1589 }else{
1590 val = parseInt(p[i])+y;
1591 }
1592
1593 res += ' '+ val;
1594 isx = !isx;
1595 }
1596 }
1597 return trim(res);
1598 }
1599
1600 function updateTransform(obj){
1601 try{
1602 var trans = obj.getAttribute("transform");
1603 if(!trans) return;
1604 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1605 var str = RegExp.lastMatch;
1606 var vals = str.substr(10,str.length-11).split(',') ;
1607 var dx = parseInt(vals[0]);
1608 var dy = parseInt(vals[1]);
1609 switch(getElementTag(obj)){
1610 case 'text':
1611 case 'rect':
1612 case 'image':
1613 addAttributeVal(obj, "x", dx);
1614 addAttributeVal(obj, "y", dy);
1615 break;
1616 case 'circle':
1617 case 'ellipse':
1618 addAttributeVal(obj, "cx", dx);
1619 addAttributeVal(obj, "cy", dy);
1620 break;
1621
1622 case 'path':
1623 var path = obj.getAttribute("d");
1624 obj.setAttribute("d", updatePath(path, dx, dy));
1625 break;
1626 case 'line':
1627 var x1 = getAttributeVal(obj,"x1");
1628 var y1 = getAttributeVal(obj,"y1");
1629 var x2 = getAttributeVal(obj,"x2");
1630 var y2 = getAttributeVal(obj,"y2");
1631 obj.setAttribute("x1", x1+dx);
1632 obj.setAttribute("y1", y1+dy);
1633 obj.setAttribute("x2", x2+dx);
1634 obj.setAttribute("y2", y2+dy);
1635
1636 break;
1637 default:
1638 break;
1639 }
1640 obj.removeAttribute("transform");
1641 }
1642 }catch (e){
1643 }
1644 }
1645
1646 function moveSelectedRectangle(dx, dy){
1647 if(!svg_select) return;
1648 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1649 }
1650
1651 function updateSelectedRectangle(){
1652 if(!svg_select) return;
1653 if(selectedItems.length > 0){
1654 svg_select.setAttribute("visibility","visible;");
1655 }else{
1656 svg_select.setAttribute("visibility","hidden;");
1657 }
1658 }
1659
1660 function clearSelectedItems(){
1661 for(i in selectedItems) delete selectedItems[i];
1662 }
1663
1664 function onTouchMove(e){
1665 e.preventDefault();
1666 if (e.touches.length == 1){
1667 if(targetItem || selectedItems.length > 0){
1668 switch(modeSVG){
1669 case 'newPath':
1670 if(targetItem.tagName == 'path' ){
1671 var path = targetItem.getAttribute("d");
1672 path = path + ' '+ getPreviewX(e.touches[0].pageX) + ' '+ getPreviewY(e.touches[0].pageY) ;
1673 targetItem.setAttribute("d",path);
1674 }
1675 break;
1676 case 'newLine':
1677 if(targetItem.tagName == 'line' ){
1678 var x2 = getPreviewX(e.touches[0].pageX);
1679 var y2 = getPreviewY(e.touches[0].pageY);
1680 targetItem.setAttribute("x2",x2);
1681 targetItem.setAttribute("y2",y2);
1682 }
1683 break;
1684
1685 default:
1686 var dx = e.touches[0].pageX - sx;
1687 var dy = e.touches[0].pageY - sy;
1688
1689 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1690 var lx = getPreviewX(e.touches[0].pageX);
1691 var ly = getPreviewY(e.touches[0].pageY);
1692
1693 if(!lineEdit){
1694 var x1 = getAttributeVal(selectedItems[0],"x1");
1695 var y1 = getAttributeVal(selectedItems[0],"y1");
1696 var x2 = getAttributeVal(selectedItems[0],"x2");
1697 var y2 = getAttributeVal(selectedItems[0],"y2");
1698 var xc = (x1+x2)/2;
1699 var yc = (y1+y2)/2;
1700 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1701 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1702 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1703
1704 var minVal = Math.min(eS, Math.min(eC, eE));
1705 if(minVal == eS) lineEdit='start';
1706 else if(minVal == eE) lineEdit='end';
1707 else lineEdit='move';
1708 }
1709 if(lineEdit=='start'){
1710 selectedItems[0].setAttribute("x1",lx );
1711 selectedItems[0].setAttribute("y1",ly );
1712 setSelectBox();
1713 }else if(lineEdit == 'end'){
1714 selectedItems[0].setAttribute("x2",lx );
1715 selectedItems[0].setAttribute("y2",ly );
1716 setSelectBox();
1717 }else{
1718 selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1719 moveSelectedRectangle(dx, dy);
1720 }
1721 }else{
1722 for(var i=0; i<selectedItems.length;i++){
1723 selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1724 }
1725 moveSelectedRectangle(dx, dy);
1726 }
1727 break;
1728 }
1729 updateShowMenu();
1730 }else if(modeSVG == 'selector'){
1731 ex = e.touches[0].pageX;
1732 ey = e.touches[0].pageY;
1733 var x1=sx;
1734 var y1=sy;
1735 var x2=ex;
1736 var y2=ey;
1737
1738 if(sx > ex){ x1=ex; x2=sx; }
1739 if(sy > ey){ y1=ey; y2=sy; }
1740
1741 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1742 }
1743 }else if (e.touches.length == 2){
1744 var dx= e.touches[0].pageX-e.touches[1].pageX;
1745 var dy = e.touches[0].pageY-e.touches[1].pageY;
1746 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
1747
1748 if(th > 165 || th < 25) svg_scale_dir = 'x';
1749 else if(th > 65 && th < 115) svg_scale_dir = 'y';
1750 else svg_scale_dir = null;
1751 }
1752 }
1753
1754 function onTouchEnd(e){
1755 e.preventDefault();
1756
1757 for(var i=0; i<selectedItems.length;i++){
1758 updateTransform(selectedItems[i]);
1759 }
1760
1761 if(modeSVG == 'selector'){
1762 var x1 = getPreviewX(sx);
1763 var y1 = getPreviewY(sy);
1764 var x2 = getPreviewX(ex);
1765 var y2 = getPreviewY(ey);
1766 getSelectedObjects(x1, y1, x2, y2);
1767 }
1768
1769 updateSelectedRectangle();
1770 updateTransform(svg_select);
1771
1772 setSelectBox();
1773 updateShowMenu();
1774 var btn = document.getElementById('b_'+modeSVG);
1775 if(btn){
1776 btn.style.border="3px solid red";
1777 }
1778 lineEdit=null;
1779 }
1780
1781
1782 function onGestureStart(e){
1783 targetItem = selectedItems[0];
1784 if(targetItem){
1785 svg_wo = targetItem.getAttribute("width");
1786 svg_ho = targetItem.getAttribute("height");
1787 svg_ro = targetItem.getAttribute("r");
1788 svg_rxo = targetItem.getAttribute("rx");
1789 svg_ryo = targetItem.getAttribute("ry");
1790 svg_fsize = targetItem.getAttribute("font-size");
1791 }else{
1792 svg_wo = null;
1793 svg_ho = null;
1794 svg_ro = null;
1795 svg_rxo = null;
1796 svg_ryo = null;
1797 svg_fsize = null;
1798 }
1799 }
1800
1801 function onGestureChange(e){
1802 var scale = e.scale;
1803 var rotation = e.rotation;
1804
1805 if(targetItem){
1806 e.preventDefault();
1807 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
1808 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
1809 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
1810 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
1811 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
1812 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
1813
1814 updateShowMenu();
1815 }
1816 }
1817
1818 function onGestureEnd(e){
1819 // e.preventDefault();
1820 svg_wo = null;
1821 svg_ho = null;
1822 svg_ro = null;
1823 svg_rxo = null;
1824 svg_ryo = null;
1825 svg_fsize = null;
1826 }
1827
1828 ///// For Safari
1829 function onMouseDown(e){
1830
1831 if(targetItem){
1832 removeClass(targetItem, "selected");
1833 }
1834
1835 if(isChildById(e.target, 'svg_top')) {
1836 targetItem=e.target;
1837 sx=e.pageX;
1838 sy=e.pageY;
1839 setInnerHTML('popup', e.pageX+","+e.pageY);
1840
1841 }else{
1842 targetItem = null;
1843 }
1844
1845 return true;
1846 }
1847
1848 function onMouseMove(e){
1849 if(targetItem){
1850 addAttributeVal(targetItem, "x", e.pageX - sx );
1851 addAttributeVal(targetItem, "y", e.pageY - sy );
1852 addAttributeVal(targetItem, "cx", e.pageX - sx );
1853 addAttributeVal(targetItem, "cy", e.pageY - sy );
1854 }
1855 sx=e.pageX;
1856 sy=e.pageY;
1857 return true;
1858 }
1859
1860 function onMouseUp(e){
1861 var str = getSVGContent();
1862 escstr = "<pre>"+escapeHTML(str)+"</pre>";
1863 setInnerHTML('popup', escstr);
1864
1865 targetItem=null;
1866 return true;
1867 }
1868
1869 if(!navigator.userAgent.match("iPad")){
1870 document.onmousedown=onMouseDown;
1871 document.onmousemove=onMouseMove;
1872 document.onmouseup=onMouseUp;
1873 }
1874

Properties

Name Value
svn:executable *

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