Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (show annotations) (download) (as text)
Fri Jul 16 12:22:13 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 51972 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 */
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'); \"> L </button></li> \n";
613 toolbar.innerHTML+= "<li><button id=\"b_newLine\" onClick=\"setSVGMode('newLine'); \"> l </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 </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 str += " "+trim(formatTag(cn[i]))+"\n";
1083 }
1084 str += "</"+tag+">";
1085 }else{
1086 str +=" />";
1087 }
1088 return str;
1089 }else if(ele.nodeType==3){
1090 return ele.textContent;
1091 }
1092 }
1093
1094 function getSVGContent(){
1095 if(!svg_top) return "";
1096
1097 var str = "";
1098 var elements = svg_top.childNodes;
1099 for(var i=0; i<elements.length; i++){
1100 if(elements[i] != svg_select) str += trim(formatTag(elements[i])) + '\n';
1101 }
1102 return str;
1103 }
1104
1105 function trim(str){
1106 return str.replace(/(^\s+)|(\s+$)/g, "");
1107 }
1108
1109 /////// Access Server
1110 function newXMLRequest(){
1111 if(this.XMLHttpRequest){
1112 return new XMLHttpRequest();
1113 }else {
1114 return new ActiveXObject("Microsoft.XMLHTTP");
1115 }
1116 }
1117
1118 function createRequestData(data){
1119 var str="filetype=svg";
1120 for (var i in data){
1121 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1122 }
1123 return str;
1124 }
1125
1126 function postRequest(url, data, func){
1127 var postData=createRequestData(data);
1128 var obj=newXMLRequest();
1129
1130 obj.onreadystatechange = function(){
1131 if (obj.readyState == 4 && obj.status == 200){
1132 func(obj.responseText);
1133 }
1134 }
1135 obj.open("POST", url, true);
1136 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1137 obj.send(postData);
1138 }
1139
1140 function commnadFinishAlert(s){
1141 alert(s);
1142 }
1143
1144 function uploadFileData(transaction, results){
1145 var data = results.rows.item(0);
1146 var updata = new Array(0);
1147 updata['name']= data['name'];
1148 updata['datalob'] = data['datablob'];
1149 updata['cmd'] = 'upload'
1150
1151 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1152 }
1153
1154 function uploadFile(name){
1155 getFile(name, 'uploadFileData');
1156 }
1157
1158 function getRemoteFileList(){
1159 var data=new Array();
1160 data['name'] = "SVG";
1161 data['cmd'] = "list";
1162 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1163 }
1164
1165 function previewRemoteFile(content){
1166 previewFile(content);
1167 setMode('Preview');
1168 }
1169
1170 function getRemoteFile(name){
1171 var data=new Array();
1172 data['name'] = name;
1173 data['cmd'] = "get";
1174 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1175 }
1176
1177 function showRemoteFile(name){
1178 getRemoteFile(name);
1179 }
1180
1181 //////// Event Handler
1182 function setInnerHTML(id, val){
1183 var itm=document.getElementById(id);
1184 if(itm) itm.innerHTML=val;
1185 }
1186
1187 function popupInfo(val){
1188 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1189 str += val;
1190 setInnerHTML('popup', str);
1191 showItemById('popup');
1192 }
1193
1194 function addAttributeVal(obj, itm, dv){
1195 if(obj.hasAttribute(itm)){
1196 var x = parseInt(obj.getAttribute(itm));
1197 x = x + dv;
1198 obj.setAttribute(itm, x)
1199 }
1200 }
1201
1202 function showSVGSource(){
1203 var str = getSVGContent();
1204 var escstr="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1205 escstr += "<pre>"+escapeHTML(str)+"</pre>";
1206 setInnerHTML('popup', escstr);
1207 showItemById('popup');
1208 }
1209
1210
1211 function getElementTag(obj){
1212 if (!obj) return null;
1213 var tag = obj.tagName.split(':');
1214 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1215 return tag[0];
1216 }
1217
1218 function setSVGObjectProp(obj){
1219 var tag = getElementTag(obj);
1220 var res ="";
1221 switch(tag){
1222 case 'text':
1223 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1224 break;
1225 case 'rect':
1226 case 'circle':
1227 case 'ellipse':
1228 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1229 break;
1230 case 'path':
1231 case 'line':
1232 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1233 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1234 break;
1235 case 'image':
1236 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"));
1237 break;
1238 default:
1239 break;
1240 }
1241 if(res != ""){
1242 res += "<button onClick=\"updateSVGObj();\">OK</button>";
1243 res += "<button onClick=\"delSVGObj();\">Del</button>";
1244 }
1245
1246 return res
1247 }
1248
1249 function updateSVGObj(){
1250 if(selectedItems.length != 1) return;
1251 var obj = selectedItems[0];
1252 var tag = getElementTag(obj);
1253 var res ="";
1254 switch(tag){
1255 case 'text':
1256 var txt=document.getElementById('svg_text');
1257 var color=document.getElementById('svg_color');
1258 var size=document.getElementById('svg_size');
1259 obj.textContent = txt.value;
1260 obj.setAttribute("fill", color.value);
1261 obj.setAttribute("font-size", size.value);
1262 break;
1263 case 'rect':
1264 case 'circle':
1265 case 'ellipse':
1266 var fill=document.getElementById('svg_fill');
1267 var color=document.getElementById('svg_color');
1268 var L=document.getElementById('svg_stroke');
1269 obj.setAttribute("fill", fill.value);
1270 obj.setAttribute("stroke", color.value);
1271 obj.setAttribute("stroke-width", L.value);
1272 break;
1273 case 'path':
1274 case 'line':
1275 var fill=document.getElementById('svg_fill');
1276 var color=document.getElementById('svg_color');
1277 var L=document.getElementById('svg_stroke');
1278 var dash=document.getElementById('svg_stroke_type');
1279 obj.setAttribute("fill", fill.value);
1280 obj.setAttribute("stroke", color.value);
1281 obj.setAttribute("stroke-width", L.value);
1282 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1283 var id = obj.getAttribute("id");
1284 var marker = document.getElementById(id+'_startarrow');
1285 if(marker) marker.setAttribute("fill", color.value);
1286 var marker = document.getElementById(id+'_endarrow');
1287 if(marker) marker.setAttribute("fill", color.value);
1288 break;
1289 case 'image':
1290 var fname=document.getElementById('svg_text');
1291 var w=document.getElementById('svg_w');
1292 var h=document.getElementById('svg_h');
1293 obj.setAttribute("xlink:href", fname.value);
1294 obj.setAttribute("width", w.value);
1295 obj.setAttribute("height", h.value);
1296 break;
1297 default:
1298 break;
1299 }
1300
1301 }
1302
1303 function delSVGObj(){
1304 if(selectedItems.length != 1) return;
1305 var obj = selectedItems[0];
1306
1307 if(!svg_top) return;
1308 svg_top.removeChild(obj);
1309 svg_select.setAttribute("visibility","hidden");
1310 }
1311
1312 ///// For MobileSafari
1313 function getPreviewX(x){ return x - preview.offsetLeft; }
1314 function getPreviewY(y){ return y - preview.offsetTop; }
1315
1316 function calcDit(x1, y1, x2, y2){
1317 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1318 }
1319
1320 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1321 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1322 }
1323
1324 function getAttributeVal(obj, name){
1325 try{
1326 return parseInt(obj.getAttribute(name));
1327 }catch(e){ return 0; }
1328 }
1329
1330 function checkIntersection(obj, x, y, ex, ey){
1331 var res = true;
1332 var bbox = obj.getBBox();
1333 var ox = bbox.x;
1334 var oy = bbox.y;
1335 var oex = bbox.x+bbox.width;
1336 var oey = bbox.y+bbox.height;
1337 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1338
1339 var tag = getElementTag(obj);
1340 switch(tag){
1341 case 'circle':
1342 case 'ellipse':
1343 var cx = getAttributeVal(obj,"cx");
1344 var cy = getAttributeVal(obj,"cy");
1345 var rx = getAttributeVal(obj,"r");
1346 var ry = rx;
1347 if(!rx){
1348 var rx = getAttributeVal(obj,"rx");
1349 var ry = getAttributeVal(obj,"ry");
1350 }
1351
1352 if(res){
1353 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1354 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1355 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1356 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1357 }
1358 break;
1359 case 'path':
1360 var d = obj.getAttribute("d");
1361 var p = getPoints(d);
1362 for(var i=0;i<p.length;i++){
1363 var ox=p[i][0];
1364 var oy=p[i][1];
1365 if(x < ox && ox < ex && y < oy && oy < ey) {
1366 return true;
1367 }
1368 }
1369 return false;
1370 break;
1371 case 'line':
1372 var x1 = getAttributeVal(obj,"x1");
1373 var y1 = getAttributeVal(obj,"y1");
1374 var x2 = getAttributeVal(obj,"x2");
1375 var y2 = getAttributeVal(obj,"y2");
1376 var d = (y2-y1)/(x2-x1);
1377
1378 if(res){
1379 var xx = Math.abs(x2-x1);
1380 var sign = 1;
1381 if(x2-x1 < 0){ sign = -1; }
1382 for(var i=0; i < xx; i++){
1383 var nx = i*sign + x1;
1384 var ny = d * i*sign + y1;
1385 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1386 }
1387 }
1388 return false;
1389
1390 return res;
1391 break;
1392 case 'text':
1393 case 'rect':
1394 case 'polygon':
1395 case 'polyline':
1396 case 'image':
1397 break;
1398 default:
1399 res=false;
1400 break;
1401 }
1402 return res;
1403 }
1404
1405 function getBoundingBox(obj){
1406 var res = new Array(4);
1407 var bbox = obj.getBBox();
1408 res[0] = bbox.x-1;
1409 res[1] = bbox.y-1;
1410 res[2] = bbox.x+bbox.width+2;
1411 res[3] = bbox.y+bbox.height+2;
1412 return res;
1413 }
1414
1415 function setSelectBox(){
1416 if(!svg_select) return;
1417
1418 if(selectedItems.length == 0){
1419 svg_select.setAttribute("visibility","hidden");
1420 return;
1421 }
1422
1423 var bbox = new Array(4);
1424 bbox[0] = 1000;
1425 bbox[1] = 1000;
1426 bbox[2] = 0;
1427 bbox[3] = 0;
1428
1429 for(var i=0;i<selectedItems.length;i++){
1430 var bp = getBoundingBox(selectedItems[i]);
1431 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1432 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1433 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1434 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1435 }
1436 svg_select.setAttribute("x", bbox[0]);
1437 svg_select.setAttribute("y", bbox[1]);
1438 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1439 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1440 svg_select.setAttribute("visibility","visible;");
1441 }
1442
1443 function getSelectedObjects(x1, y1, x2, y2){
1444 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1445 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1446
1447 var val="";
1448 if(svg_top){
1449 var val ="";
1450 var objs = svg_top.childNodes;
1451 selectedItems = new Array();
1452 for(var i=0; i<objs.length;i++){
1453 if(objs[i].tagName){
1454
1455 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1456 selectedItems.push(objs[i]);
1457 }
1458 val += objs[i].tagName+" ";
1459 }
1460 }
1461 }
1462 setSelectBox();
1463 }
1464
1465 function onTouchStart(e){
1466 //e.preventDefault();
1467 sx=e.touches[0].pageX;
1468 sy=e.touches[0].pageY;
1469 ex=e.touches[0].pageX;
1470 ey=e.touches[0].pageY;
1471
1472 if (e.touches.length == 1){
1473 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1474 var x1=getPreviewX(sx-1);
1475 var y1=getPreviewY(sy-1);
1476 var x2=getPreviewX(sx+2);
1477 var y2=getPreviewY(sy+2);
1478 getSelectedObjects(x1, y1, x2, y2);
1479
1480 if(selectedItems.length == 0){
1481 setSVGMode('selector');
1482 }else if(selectedItems.length == 1){
1483 targetItem=selectedItems[0];
1484 setSVGMode(getElementTag(targetItem));
1485 }else{
1486 setSVGMode('Group');
1487 }
1488 }else { // CreateMode
1489 if(selectedItems.length == 0){
1490
1491 var fill=document.getElementById('svg_fill');
1492 var color=document.getElementById('svg_color');
1493 var L=document.getElementById('svg_stroke');
1494
1495 var x = getPreviewX(sx);
1496 var y = getPreviewY(sy);
1497
1498 switch(modeSVG){
1499 case 'text':
1500 var txt=document.getElementById('svg_text');
1501 var size=document.getElementById('svg_size');
1502 var y = y + parseInt(size.value)*0.8;
1503 if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1504 break;
1505 case 'rect':
1506 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1507 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1508 break;
1509 case 'circle':
1510 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1511 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1512 break;
1513 case 'ellipse':
1514 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1515 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1516 break;
1517 case 'newPath':
1518 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1519 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1520 break;
1521 case 'newLine':
1522 var x2=x+1;
1523 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1524 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1525 break;
1526 case 'image':
1527 var attr = 'x='+x+',y='+y;
1528 var txt=document.getElementById('svg_text');
1529 var w=document.getElementById('svg_w');
1530 var h=document.getElementById('svg_h');
1531 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1532 default:
1533 break;
1534 }
1535 if (targetItem){
1536 appendSVGObj(targetItem);
1537 selectedItems[0]=targetItem;
1538 }
1539 }else{
1540 var x1=getPreviewX(sx-1);
1541 var y1=getPreviewY(sy-1);
1542 var x2=getPreviewX(sx+2);
1543 var y2=getPreviewY(sy+2);
1544 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1545 setSVGMode('selector');
1546 }
1547 }
1548 }
1549 }
1550
1551 updateSelectedRectangle();
1552 }
1553
1554 function getPoints(d){
1555 var p = d.split(' ');
1556 var res = new Array();
1557 var isx=true;
1558 var x, y;
1559 for(var i=0; i<p.length;i++){
1560 if(p[i].match('[MLHVCSQTA]','i')){
1561 }else{
1562 if(isx){
1563 x = parseInt(p[i]);
1564 }else{
1565 y = parseInt(p[i]);
1566 res.push(new Array(x, y));
1567 }
1568 isx = !isx;
1569 }
1570 }
1571 return res;
1572 }
1573
1574 function updatePath(d, x, y){
1575 var p = d.split(' ');
1576 var res = "";
1577 var isx=true;
1578 var val;
1579 for(var i=0; i<p.length;i++){
1580 if(p[i].match('[MLHVCSQTA]','i')){
1581 res += ' '+p[i];
1582 }else{
1583 if(isx){
1584 val = parseInt(p[i])+x;
1585 }else{
1586 val = parseInt(p[i])+y;
1587 }
1588
1589 res += ' '+ val;
1590 isx = !isx;
1591 }
1592 }
1593 return trim(res);
1594 }
1595
1596 function updateTransform(obj){
1597 try{
1598 var trans = obj.getAttribute("transform");
1599 if(!trans) return;
1600 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1601 var str = RegExp.lastMatch;
1602 var vals = str.substr(10,str.length-11).split(',') ;
1603 var dx = parseInt(vals[0]);
1604 var dy = parseInt(vals[1]);
1605 switch(getElementTag(obj)){
1606 case 'text':
1607 case 'rect':
1608 case 'image':
1609 addAttributeVal(obj, "x", dx);
1610 addAttributeVal(obj, "y", dy);
1611 break;
1612 case 'circle':
1613 case 'ellipse':
1614 addAttributeVal(obj, "cx", dx);
1615 addAttributeVal(obj, "cy", dy);
1616 break;
1617
1618 case 'path':
1619 var path = obj.getAttribute("d");
1620 obj.setAttribute("d", updatePath(path, dx, dy));
1621 break;
1622 case 'line':
1623 var x1 = getAttributeVal(obj,"x1");
1624 var y1 = getAttributeVal(obj,"y1");
1625 var x2 = getAttributeVal(obj,"x2");
1626 var y2 = getAttributeVal(obj,"y2");
1627 obj.setAttribute("x1", x1+dx);
1628 obj.setAttribute("y1", y1+dy);
1629 obj.setAttribute("x2", x2+dx);
1630 obj.setAttribute("y2", y2+dy);
1631
1632 break;
1633 default:
1634 break;
1635 }
1636 obj.removeAttribute("transform");
1637 }
1638 }catch (e){
1639 }
1640 }
1641
1642 function moveSelectedRectangle(dx, dy){
1643 if(!svg_select) return;
1644 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1645 }
1646
1647 function updateSelectedRectangle(){
1648 if(!svg_select) return;
1649 if(selectedItems.length > 0){
1650 svg_select.setAttribute("visibility","visible;");
1651 }else{
1652 svg_select.setAttribute("visibility","hidden;");
1653 }
1654 }
1655
1656 function clearSelectedItems(){
1657 for(i in selectedItems) delete selectedItems[i];
1658 }
1659
1660 function onTouchMove(e){
1661 e.preventDefault();
1662 if (e.touches.length == 1){
1663 if(targetItem || selectedItems.length > 0){
1664 switch(modeSVG){
1665 case 'newPath':
1666 if(targetItem.tagName == 'path' ){
1667 var path = targetItem.getAttribute("d");
1668 path = path + ' '+ getPreviewX(e.touches[0].pageX) + ' '+ getPreviewY(e.touches[0].pageY) ;
1669 targetItem.setAttribute("d",path);
1670 }
1671 break;
1672 case 'newLine':
1673 if(targetItem.tagName == 'line' ){
1674 var x2 = getPreviewX(e.touches[0].pageX);
1675 var y2 = getPreviewY(e.touches[0].pageY);
1676 targetItem.setAttribute("x2",x2);
1677 targetItem.setAttribute("y2",y2);
1678 }
1679 break;
1680
1681 default:
1682 var dx = e.touches[0].pageX - sx;
1683 var dy = e.touches[0].pageY - sy;
1684
1685 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1686 var lx = getPreviewX(e.touches[0].pageX);
1687 var ly = getPreviewY(e.touches[0].pageY);
1688
1689 if(!lineEdit){
1690 var x1 = getAttributeVal(selectedItems[0],"x1");
1691 var y1 = getAttributeVal(selectedItems[0],"y1");
1692 var x2 = getAttributeVal(selectedItems[0],"x2");
1693 var y2 = getAttributeVal(selectedItems[0],"y2");
1694 var xc = (x1+x2)/2;
1695 var yc = (y1+y2)/2;
1696 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1697 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1698 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1699
1700 var minVal = Math.min(eS, Math.min(eC, eE));
1701 if(minVal == eS) lineEdit='start';
1702 else if(minVal == eE) lineEdit='end';
1703 else lineEdit='move';
1704 }
1705 if(lineEdit=='start'){
1706 selectedItems[0].setAttribute("x1",lx );
1707 selectedItems[0].setAttribute("y1",ly );
1708 setSelectBox();
1709 }else if(lineEdit == 'end'){
1710 selectedItems[0].setAttribute("x2",lx );
1711 selectedItems[0].setAttribute("y2",ly );
1712 setSelectBox();
1713 }else{
1714 selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1715 moveSelectedRectangle(dx, dy);
1716 }
1717 }else{
1718 for(var i=0; i<selectedItems.length;i++){
1719 selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1720 }
1721 moveSelectedRectangle(dx, dy);
1722 }
1723 break;
1724 }
1725 updateShowMenu();
1726 }else if(modeSVG == 'selector'){
1727 ex = e.touches[0].pageX;
1728 ey = e.touches[0].pageY;
1729 var x1=sx;
1730 var y1=sy;
1731 var x2=ex;
1732 var y2=ey;
1733
1734 if(sx > ex){ x1=ex; x2=sx; }
1735 if(sy > ey){ y1=ey; y2=sy; }
1736
1737 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1738 }
1739 }else if (e.touches.length == 2){
1740 var dx= e.touches[0].pageX-e.touches[1].pageX;
1741 var dy = e.touches[0].pageY-e.touches[1].pageY;
1742 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
1743
1744 if(th > 165 || th < 25) svg_scale_dir = 'x';
1745 else if(th > 65 && th < 115) svg_scale_dir = 'y';
1746 else svg_scale_dir = null;
1747 }
1748 }
1749
1750 function onTouchEnd(e){
1751 e.preventDefault();
1752
1753 for(var i=0; i<selectedItems.length;i++){
1754 updateTransform(selectedItems[i]);
1755 }
1756
1757 if(modeSVG == 'selector'){
1758 var x1 = getPreviewX(sx);
1759 var y1 = getPreviewY(sy);
1760 var x2 = getPreviewX(ex);
1761 var y2 = getPreviewY(ey);
1762 getSelectedObjects(x1, y1, x2, y2);
1763 }
1764
1765 updateSelectedRectangle();
1766 updateTransform(svg_select);
1767
1768 setSelectBox();
1769 updateShowMenu();
1770 var btn = document.getElementById('b_'+modeSVG);
1771 if(btn){
1772 btn.style.border="3px solid red";
1773 }
1774 lineEdit=null;
1775 }
1776
1777
1778 function onGestureStart(e){
1779 targetItem = selectedItems[0];
1780 if(targetItem){
1781 svg_wo = targetItem.getAttribute("width");
1782 svg_ho = targetItem.getAttribute("height");
1783 svg_ro = targetItem.getAttribute("r");
1784 svg_rxo = targetItem.getAttribute("rx");
1785 svg_ryo = targetItem.getAttribute("ry");
1786 svg_fsize = targetItem.getAttribute("font-size");
1787 }else{
1788 svg_wo = null;
1789 svg_ho = null;
1790 svg_ro = null;
1791 svg_rxo = null;
1792 svg_ryo = null;
1793 svg_fsize = null;
1794 }
1795 }
1796
1797 function onGestureChange(e){
1798 var scale = e.scale;
1799 var rotation = e.rotation;
1800
1801 if(targetItem){
1802 e.preventDefault();
1803 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
1804 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
1805 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
1806 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
1807 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
1808 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
1809
1810 updateShowMenu();
1811 }
1812 }
1813
1814 function onGestureEnd(e){
1815 // e.preventDefault();
1816 svg_wo = null;
1817 svg_ho = null;
1818 svg_ro = null;
1819 svg_rxo = null;
1820 svg_ryo = null;
1821 svg_fsize = null;
1822 }
1823
1824 ///// For Safari
1825 function onMouseDown(e){
1826
1827 if(targetItem){
1828 removeClass(targetItem, "selected");
1829 }
1830
1831 if(isChildById(e.target, 'svg_top')) {
1832 targetItem=e.target;
1833 sx=e.pageX;
1834 sy=e.pageY;
1835 setInnerHTML('popup', e.pageX+","+e.pageY);
1836
1837 }else{
1838 targetItem = null;
1839 }
1840
1841 return true;
1842 }
1843
1844 function onMouseMove(e){
1845 if(targetItem){
1846 addAttributeVal(targetItem, "x", e.pageX - sx );
1847 addAttributeVal(targetItem, "y", e.pageY - sy );
1848 addAttributeVal(targetItem, "cx", e.pageX - sx );
1849 addAttributeVal(targetItem, "cy", e.pageY - sy );
1850 }
1851 sx=e.pageX;
1852 sy=e.pageY;
1853 return true;
1854 }
1855
1856 function onMouseUp(e){
1857 var str = getSVGContent();
1858 escstr = "<pre>"+escapeHTML(str)+"</pre>";
1859 setInnerHTML('popup', escstr);
1860
1861 targetItem=null;
1862 return true;
1863 }
1864
1865 if(!navigator.userAgent.match("iPad")){
1866 document.onmousedown=onMouseDown;
1867 document.onmousemove=onMouseMove;
1868 document.onmouseup=onMouseUp;
1869 }
1870

Properties

Name Value
svn:executable *

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