Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (show annotations) (download) (as text)
Fri Jul 16 08:16:41 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 50527 byte(s)
modify selecting line start/end
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+= "</ul>";
619 toolbar.style.display='block';
620
621 }
622
623 function setMode(m){
624 currentMode=m;
625 switch(m){
626 case 'List':
627 hideItemById('editDiv');
628 hideItemById('preview');
629 hideItemById('popup');
630 hideItemById('toolBar');
631 showItemById('menuDiv');
632 break;
633 case 'Edit':
634 hideItemById('preview');
635 hideItemById('popup');
636 hideItemById('toolBar');
637 showItemById('editDiv');
638 showItemById('menuDiv');
639 break;
640 case 'Preview':
641 showItemById('preview');
642 hideItemById('editDiv');
643 hideItemById('popup');
644 showItemById('menuDiv');
645 showItemById('toolBar');
646 break;
647 default:
648 break;
649 }
650 }
651
652 function hideItemById(id){
653 var itm = document.getElementById(id);
654 if(itm) itm.style.display='none';
655 }
656
657 function showItemById(id){
658 var itm = document.getElementById(id);
659 if(itm) itm.style.display='block';
660 }
661
662 function removeChildNodes(id){
663 var itm = document.getElementById(id);
664 if(!itm) return;
665
666 var child = itm.firstChild;
667
668 while(child){
669 itm.removeChild(child);
670 child = itm.firstChild;
671 }
672 }
673
674 function chEditareaHeight(){
675 var itm = document.getElementById('editarea');
676 if(!itm) return;
677 var cv = itm.getAttribute('rows');
678 if(parseInt(cv) > editarea_h){
679 itm.setAttribute('rows', editarea_h);
680 }else{
681 itm.setAttribute('rows', editarea_h * 2);
682 }
683 }
684
685 function format_file(str){
686 return "<pre>"+str+"</pre>";
687 }
688
689 function previewData(data){
690 if(!data) data = document.getElementById('editarea').value;
691
692 previewFile(data);
693
694 updateShowMenu();
695 setMode('Preview');
696 }
697
698 function previewFile(data){
699 removeChildNodes('preview');
700
701 preview.style.display='block';
702 preview.style.position='absolute';
703 preview.style.top='180px';
704 preview.style.width='80%';
705 preview.style.height='80%';
706
707 var ele = toSVGElement(data, '100%','100%');
708
709 preview.appendChild(ele);
710
711 svg_top = document.getElementById('svg_top');
712 initSVGElementId(svg_top);
713 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
714 svg_select.setAttribute("id","svg_select");
715 appendSVGObj(svg_select);
716
717 }
718
719 ////// for SVG object
720 ////////////////
721 function updateSVGObjMenu(){
722 var res = "";
723 var tag = modeSVG;
724 if(selectedItems.length > 1) return res;
725 if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
726
727 switch(tag){
728 case 'text':
729 if(selectedItems[0]){
730 res += setSVGObjectProp(selectedItems[0]);
731 }else{
732 res += propSVGText("", 24, '#000000');
733 }
734 break;
735 case 'rect':
736 case 'circle':
737 case 'ellipse':
738 case 'newPath':
739 case 'newLine':
740 case 'path':
741 case 'line':
742 case 'polyline':
743 case 'polygon':
744 if(selectedItems[0]){
745 res += setSVGObjectProp(selectedItems[0]);
746 }else{
747 res += propSVGObj(tag+":", 1, '#000000', '#ffffff');
748 }
749 break;
750 default:
751 break;
752 }
753 return res;
754 }
755
756 function propSVGText(str, size, color){
757 if(!size) size = 24;
758 if(!color) color = '#000000';
759
760 var res = "Text:";
761 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\"/>";
762 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
763 res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
764 return res;
765 }
766
767 function propSVGObj(type, stroke, color, fill){
768 var res = type;
769 if(!stroke) stroke = 1;
770 if(!color) color = '#000000';
771 if(!fill) fill = '#ffffff';
772 res += "Fill:<input type=\"text\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
773 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
774 res += "L:<input type=\"text\" id=\"svg_stroke\" value=\""+stroke+"\" size=\"2\"/>";
775 return res;
776 }
777
778 function propSVGLine(type, stroke, color, fill, style){
779 var res = propSVGObj(type, stroke, color, fill);
780 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
781 res += "Arrow:";
782 if(hasArrow('start')){
783 res += "<button onClick=\"removeLeftArrow();\"> - </button>";
784 }else{
785 res += "<button onClick=\"setLeftArrow();\">��� </button>";
786 }
787 if(hasArrow('end')){
788 res += "<button onClick=\"removeRightArrow();\"> - </button>";
789 }else{
790 res += "<button onClick=\"setRightArrow();\">��� </button>";
791 }
792 return res;
793 }
794
795 function setSVGMode(m){
796 modeSVG = m;
797 updateShowMenu();
798
799 if(m == 'selector'){
800 targetItem=null;
801 clearSelectedItems();
802 }
803
804 var btn = document.getElementById('b_'+modeSVG);
805 if(btn){
806 btn.style.border="3px solid red";
807 }
808 }
809
810
811 function toSVGElement(str, w, h){
812 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
813 var parser = new DOMParser();
814 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
815 var footer = "</svg:svg>";
816 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
817 var xmlRoot = xmlDoc.documentElement;
818 var ele = document.importNode(xmlRoot,true);
819
820 return ele;
821 }
822
823 function createSVGElement(tag, id){
824 if(id=='new'){
825 id = 'svg_'+nextId;
826 nextId++;
827 }
828 var ele= document.createElementNS(svg_ns, tag);
829 ele.setAttribute("id", id);
830 return ele;
831 }
832
833 function defSVGElement(node){
834 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
835 if(!svg_defs){
836 svg_defs = createSVGElement('defs', 'svg_defs');
837 svg_top.insertBefore(svg_defs, svg_top.firstChild);
838 }
839 if(node) svg_defs.appendChild(node);
840 }
841
842 function initSVGElementId(svg_top){
843 nextId = 1;
844 checkSVGElementId(svg_top);
845 appendSVGElementId(svg_top);
846 }
847
848 function checkSVGElementId(top){
849 var objs = top.childNodes;
850
851 for(var i=0; i<objs.length ;i++){
852 if(objs[i].tagName){
853 var id = objs[i].getAttribute("id");
854
855 if(id && id.match(/svg_[0-9]+/i)){
856 var n = parseInt(RegExp.lastMatch.substr(4));
857 if(n >= nextId){
858 nextId = n+1;
859 }
860
861 }
862 checkSVGElementId(objs[i]);
863 }
864 }
865 }
866
867 function appendSVGElementId(top){
868 var objs = top.childNodes;
869
870 for(var i=0; i<objs.length ;i++){
871 if(objs[i].tagName){
872 var id = objs[i].getAttribute("id");
873 if(!id){
874 objs[i].setAttribute("id", "svg_"+nextId);
875 nextId++;
876 }
877 }
878 appendSVGElementId(objs[i]);
879 }
880 }
881
882 function selectedRectangle(x, y, ex, ey){
883 if(!svg_select) return null;
884
885 svg_select.setAttribute("x",x);
886 svg_select.setAttribute("y",y);
887 svg_select.setAttribute("width", ex-x);
888 svg_select.setAttribute("height", ey-y);
889 svg_select.setAttribute("visibility", "visible");
890 return svg_select;
891 }
892
893
894 function setAttributes(obj, attrs){
895 var attr_array = attrs.split(',');
896
897 for (var i=0; i<attr_array.length;i++){
898 var x = attr_array[i].split('=');
899 if(x.length == 2){
900 obj.setAttribute(x[0], x[1]);
901 }
902 }
903 }
904
905 function createSVGObj(tag, attrs, fill, color, lw){
906 var ele = createSVGElement(tag, 'new');
907 setAttributes(ele, attrs);
908 if (fill) ele.setAttribute('fill', fill);
909 if (color) ele.setAttribute('stroke', color);
910 if(lw) ele.setAttribute('stroke-width', lw);
911
912 return ele;
913 }
914
915 function createSVGText(txt, x, y, size, color){
916 var ele = createSVGElement('text', 'new');
917
918 ele.setAttribute('x', x);
919 ele.setAttribute('y', y);
920 ele.setAttribute('font-size', size);
921 ele.setAttribute('fill', color);
922 ele.textContent=txt;
923
924 return ele;
925 }
926
927 function createSVGImage(fname, width, height, attrs){
928 var ele = createSVGElement('image', 'new');
929 ele.setAttribute('xlink:href', fname);
930 ele.setAttribute('width', width);
931 ele.setAttribute('height', height);
932 setAttributes(ele, attrs);
933
934 return ele;
935 }
936
937 function createSVGMarker(pid, id, child){
938 var parent = document.getElementById(pid);
939 if(!parent) return;
940 var ele = createSVGElement('marker', pid+'_'+id);
941 ele.appendChild(child);
942 return ele;
943 }
944
945 function setLeftArrow(){
946 if( selectedItems.length == 1 ){
947 setArrow(selectedItems[0], 'start', '');
948 }
949 }
950
951 function setRightArrow(){
952 if( selectedItems.length == 1 ){
953 setArrow(selectedItems[0], 'end', '');
954 }
955 }
956
957 function removeLeftArrow(){
958 if( selectedItems.length == 1 ){
959 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
960 var pid = selectedItems[0].getAttribute('id');
961 var marker = document.getElementById(pid+'_startarrow');
962 svg_defs.removeChild(marker);
963 selectedItems[0].removeAttribute('marker-start');
964 }
965 }
966
967 function removeRightArrow(){
968 if( selectedItems.length == 1 ){
969 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
970 var pid = selectedItems[0].getAttribute('id');
971 var marker = document.getElementById(pid+'_endarrow');
972 svg_defs.removeChild(marker);
973 selectedItems[0].removeAttribute('marker-end');
974 }
975 }
976
977 function hasArrow(pos){
978 var pobj = selectedItems[0];
979 if(!pobj) return false;
980 var pid = pobj.getAttribute('id');
981 var marker = document.getElementById(pid+'_'+pos+'arrow');
982 if(marker) return true;
983 return false;
984 }
985
986 function getArrowMarker(obj,pos){
987 if(!obj) return false;
988 var pid = obj.getAttribute('id');
989 var marker = document.getElementById(pid+'_'+pos+'arrow');
990 return false;
991 }
992
993 function setArrow(pobj, pos, type){
994 if(!pobj) return;
995 var pid = pobj.getAttribute('id');
996 var marker = document.getElementById(pid+'_'+pos+'arrow');
997 if(marker) return;
998
999 var obj = createSVGElement('path', 'new');
1000
1001 var refX = 0;
1002 var refY = 0;
1003
1004 switch(pos){
1005 case 'start':
1006 refX=10;
1007 refY=10;
1008 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1009 break;
1010 case 'end':
1011 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1012 refX= 10;
1013 refY=10;
1014 break;
1015 default:
1016 return;
1017 }
1018
1019 marker = createSVGMarker(pid, pos+'arrow' , obj);
1020 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1021
1022 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1023
1024 defSVGElement(marker);
1025 var mid = "url(#"+marker.getAttribute("id")+")";
1026 var mattr = "marker-"+pos;
1027 pobj.setAttribute(mattr, mid);
1028 }
1029
1030 function appendSVGObj(obj){
1031 var svg_top = document.getElementById('svg_top');
1032 if(!svg_top) return;
1033
1034 svg_top.appendChild(obj);
1035 }
1036
1037 function isChildById(element, id) {
1038 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1039 else if (element.parentNode.id == id) return true;
1040 else return isChildById(element.parentNode, id);
1041 }
1042
1043 /////////////////////// Formatting SVG DOM
1044 function escapeHTML(text) {
1045 return text.replace( /[<>"&]/g,
1046 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1047 );
1048 };
1049
1050 function formatTag(ele){
1051 var str="";
1052 if(ele.nodeType == 1){
1053 var tag_a = ele.tagName.split(':');
1054 var tag;
1055 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1056
1057 str += "<"+tag;
1058 var attrs = ele.attributes;
1059 for(var i=0; i<attrs.length; i++){
1060 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1061 }
1062 var cn = ele.childNodes;
1063 if(cn.length > 0){
1064 str +=">\n";
1065 for(var i=0; i<cn.length; i++){
1066 str += " "+trim(formatTag(cn[i]))+"\n";
1067 }
1068 str += "</"+tag+">";
1069 }else{
1070 str +=" />";
1071 }
1072 return str;
1073 }else if(ele.nodeType==3){
1074 return ele.textContent;
1075 }
1076 }
1077
1078 function getSVGContent(){
1079 if(!svg_top) return "";
1080
1081 var str = "";
1082 var elements = svg_top.childNodes;
1083 for(var i=0; i<elements.length; i++){
1084 if(elements[i] != svg_select) str += trim(formatTag(elements[i])) + '\n';
1085 }
1086 return str;
1087 }
1088
1089 function trim(str){
1090 return str.replace(/(^\s+)|(\s+$)/g, "");
1091 }
1092
1093 /////// Access Server
1094 function newXMLRequest(){
1095 if(this.XMLHttpRequest){
1096 return new XMLHttpRequest();
1097 }else {
1098 return new ActiveXObject("Microsoft.XMLHTTP");
1099 }
1100 }
1101
1102 function createRequestData(data){
1103 var str="filetype=svg";
1104 for (var i in data){
1105 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1106 }
1107 return str;
1108 }
1109
1110 function postRequest(url, data, func){
1111 var postData=createRequestData(data);
1112 var obj=newXMLRequest();
1113
1114 obj.onreadystatechange = function(){
1115 if (obj.readyState == 4 && obj.status == 200){
1116 func(obj.responseText);
1117 }
1118 }
1119 obj.open("POST", url, true);
1120 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1121 obj.send(postData);
1122 }
1123
1124 function commnadFinishAlert(s){
1125 alert(s);
1126 }
1127
1128 function uploadFileData(transaction, results){
1129 var data = results.rows.item(0);
1130 var updata = new Array(0);
1131 updata['name']= data['name'];
1132 updata['datalob'] = data['datablob'];
1133 updata['cmd'] = 'upload'
1134
1135 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1136 }
1137
1138 function uploadFile(name){
1139 getFile(name, 'uploadFileData');
1140 }
1141
1142 function getRemoteFileList(){
1143 var data=new Array();
1144 data['name'] = "SVG";
1145 data['cmd'] = "list";
1146 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1147 }
1148
1149 function previewRemoteFile(content){
1150 previewFile(content);
1151 setMode('Preview');
1152 }
1153
1154 function getRemoteFile(name){
1155 var data=new Array();
1156 data['name'] = name;
1157 data['cmd'] = "get";
1158 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1159 }
1160
1161 function showRemoteFile(name){
1162 getRemoteFile(name);
1163 }
1164
1165 //////// Event Handler
1166 function setInnerHTML(id, val){
1167 var itm=document.getElementById(id);
1168 if(itm) itm.innerHTML=val;
1169 }
1170
1171 function popupInfo(val){
1172 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1173 str += val;
1174 setInnerHTML('popup', str);
1175 showItemById('popup');
1176 }
1177
1178 function addAttributeVal(obj, itm, dv){
1179 if(obj.hasAttribute(itm)){
1180 var x = parseInt(obj.getAttribute(itm));
1181 x = x + dv;
1182 obj.setAttribute(itm, x)
1183 }
1184 }
1185
1186 function showSVGSource(){
1187 var str = getSVGContent();
1188 var escstr="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1189 escstr += "<pre>"+escapeHTML(str)+"</pre>";
1190 setInnerHTML('popup', escstr);
1191 showItemById('popup');
1192 }
1193
1194
1195 function getElementTag(obj){
1196 var tag = obj.tagName.split(':');
1197 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1198 return tag[0];
1199 }
1200
1201 function setSVGObjectProp(obj){
1202 var tag = getElementTag(obj);
1203 var res ="";
1204 switch(tag){
1205 case 'text':
1206 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1207 break;
1208 case 'rect':
1209 case 'circle':
1210 case 'ellipse':
1211 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1212 break;
1213 case 'path':
1214 case 'line':
1215 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1216 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1217 break;
1218 default:
1219 break;
1220 }
1221 if(res != ""){
1222 res += "<button onClick=\"updateSVGObj();\">OK</button>";
1223 res += "<button onClick=\"delSVGObj();\">Del</button>";
1224 }
1225
1226 return res
1227 }
1228
1229 function updateSVGObj(){
1230 if(selectedItems.length != 1) return;
1231 var obj = selectedItems[0];
1232 var tag = getElementTag(obj);
1233 var res ="";
1234 switch(tag){
1235 case 'text':
1236 var txt=document.getElementById('svg_text');
1237 var color=document.getElementById('svg_color');
1238 var size=document.getElementById('svg_size');
1239 obj.textContent = txt.value;
1240 obj.setAttribute("fill", color.value);
1241 obj.setAttribute("font-size", size.value);
1242 break;
1243 case 'rect':
1244 case 'circle':
1245 case 'ellipse':
1246 var fill=document.getElementById('svg_fill');
1247 var color=document.getElementById('svg_color');
1248 var L=document.getElementById('svg_stroke');
1249 obj.setAttribute("fill", fill.value);
1250 obj.setAttribute("stroke", color.value);
1251 obj.setAttribute("stroke-width", L.value);
1252 break;
1253 case 'path':
1254 case 'line':
1255 var fill=document.getElementById('svg_fill');
1256 var color=document.getElementById('svg_color');
1257 var L=document.getElementById('svg_stroke');
1258 var dash=document.getElementById('svg_stroke_type');
1259 obj.setAttribute("fill", fill.value);
1260 obj.setAttribute("stroke", color.value);
1261 obj.setAttribute("stroke-width", L.value);
1262 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1263 var id = obj.getAttribute("id");
1264 var marker = document.getElementById(id+'_startarrow');
1265 if(marker) marker.setAttribute("fill", color.value);
1266 var marker = document.getElementById(id+'_endarrow');
1267 if(marker) marker.setAttribute("fill", color.value);
1268 break;
1269 default:
1270 break;
1271 }
1272
1273 }
1274
1275 function delSVGObj(){
1276 if(selectedItems.length != 1) return;
1277 var obj = selectedItems[0];
1278
1279 if(!svg_top) return;
1280 svg_top.removeChild(obj);
1281 svg_select.setAttribute("visibility","hidden");
1282 }
1283
1284 ///// For MobileSafari
1285 function getPreviewX(x){ return x - preview.offsetLeft; }
1286 function getPreviewY(y){ return y - preview.offsetTop; }
1287
1288 function calcDit(x1, y1, x2, y2){
1289 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1290 }
1291
1292 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1293 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1294 }
1295
1296 function getAttributeVal(obj, name){
1297 try{
1298 return parseInt(obj.getAttribute(name));
1299 }catch(e){ return 0; }
1300 }
1301
1302 function checkIntersection(obj, x, y, ex, ey){
1303 var res = true;
1304 var bbox = obj.getBBox();
1305 var ox = bbox.x;
1306 var oy = bbox.y;
1307 var oex = bbox.x+bbox.width;
1308 var oey = bbox.y+bbox.height;
1309 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1310
1311 var tag = getElementTag(obj);
1312 switch(tag){
1313 case 'circle':
1314 case 'ellipse':
1315 var cx = getAttributeVal(obj,"cx");
1316 var cy = getAttributeVal(obj,"cy");
1317 var rx = getAttributeVal(obj,"r");
1318 var ry = rx;
1319 if(!rx){
1320 var rx = getAttributeVal(obj,"rx");
1321 var ry = getAttributeVal(obj,"ry");
1322 }
1323
1324 if(res){
1325 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1326 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1327 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1328 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1329 }
1330 break;
1331 case 'path':
1332 var d = obj.getAttribute("d");
1333 var p = getPoints(d);
1334 for(var i=0;i<p.length;i++){
1335 var ox=p[i][0];
1336 var oy=p[i][1];
1337 if(x < ox && ox < ex && y < oy && oy < ey) {
1338 return true;
1339 }
1340 }
1341 return false;
1342 break;
1343 case 'line':
1344 var x1 = getAttributeVal(obj,"x1");
1345 var y1 = getAttributeVal(obj,"y1");
1346 var x2 = getAttributeVal(obj,"x2");
1347 var y2 = getAttributeVal(obj,"y2");
1348 var d = (y2-y1)/(x2-x1);
1349
1350 if(res){
1351 var xx = Math.abs(x2-x1);
1352 var sign = 1;
1353 if(x2-x1 < 0){ sign = -1; }
1354 for(var i=0; i < xx; i++){
1355 var nx = i*sign + x1;
1356 var ny = d * i*sign + y1;
1357 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1358 }
1359 }
1360 return false;
1361
1362 return res;
1363 break;
1364 case 'text':
1365 case 'rect':
1366 case 'polygon':
1367 case 'polyline':
1368 case 'image':
1369 break;
1370 default:
1371 res=false;
1372 break;
1373 }
1374 return res;
1375 }
1376
1377 function getBoundingBox(obj){
1378 var res = new Array(4);
1379 var bbox = obj.getBBox();
1380 res[0] = bbox.x-1;
1381 res[1] = bbox.y-1;
1382 res[2] = bbox.x+bbox.width+2;
1383 res[3] = bbox.y+bbox.height+2;
1384 return res;
1385 }
1386
1387 function setSelectBox(){
1388 if(!svg_select) return;
1389
1390 if(selectedItems.length == 0){
1391 svg_select.setAttribute("visibility","hidden");
1392 return;
1393 }
1394
1395 var bbox = new Array(4);
1396 bbox[0] = 1000;
1397 bbox[1] = 1000;
1398 bbox[2] = 0;
1399 bbox[3] = 0;
1400
1401 for(var i=0;i<selectedItems.length;i++){
1402 var bp = getBoundingBox(selectedItems[i]);
1403 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1404 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1405 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1406 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1407 }
1408 svg_select.setAttribute("x", bbox[0]);
1409 svg_select.setAttribute("y", bbox[1]);
1410 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1411 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1412 svg_select.setAttribute("visibility","visible;");
1413 }
1414
1415 function getSelectedObjects(x1, y1, x2, y2){
1416 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1417 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1418
1419 var val="";
1420 if(svg_top){
1421 var val ="";
1422 var objs = svg_top.childNodes;
1423 selectedItems = new Array();
1424 for(var i=0; i<objs.length;i++){
1425 if(objs[i].tagName){
1426
1427 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1428 selectedItems.push(objs[i]);
1429 }
1430 val += objs[i].tagName+" ";
1431 }
1432 }
1433 }
1434 setSelectBox();
1435 }
1436
1437 function onTouchStart(e){
1438 //e.preventDefault();
1439 sx=e.touches[0].pageX;
1440 sy=e.touches[0].pageY;
1441 ex=e.touches[0].pageX;
1442 ey=e.touches[0].pageY;
1443
1444 if (e.touches.length == 1){
1445 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1446 var x1=getPreviewX(sx-1);
1447 var y1=getPreviewY(sy-1);
1448 var x2=getPreviewX(sx+2);
1449 var y2=getPreviewY(sy+2);
1450 getSelectedObjects(x1, y1, x2, y2);
1451
1452 if(selectedItems.length == 0){
1453 setSVGMode('selector');
1454 }else if(selectedItems.length == 1){
1455 targetItem=selectedItems[0];
1456 setSVGMode(getElementTag(targetItem));
1457 }else{
1458 setSVGMode('Group');
1459 }
1460 }else { // CreateMode
1461 if(selectedItems.length == 0){
1462
1463 var fill=document.getElementById('svg_fill');
1464 var color=document.getElementById('svg_color');
1465 var L=document.getElementById('svg_stroke');
1466
1467 var x = getPreviewX(sx);
1468 var y = getPreviewY(sy);
1469
1470 switch(modeSVG){
1471 case 'text':
1472 var txt=document.getElementById('svg_text');
1473 var size=document.getElementById('svg_size');
1474 var y = y + parseInt(size.value)*0.8;
1475 if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1476 break;
1477 case 'rect':
1478 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1479 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1480 break;
1481 case 'circle':
1482 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1483 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1484 break;
1485 case 'ellipse':
1486 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1487 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1488 break;
1489 case 'newPath':
1490 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1491 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1492 break;
1493 case 'newLine':
1494 var x2=x+1;
1495 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1496 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1497 default:
1498 break;
1499 }
1500 if (targetItem){
1501 appendSVGObj(targetItem);
1502 selectedItems[0]=targetItem;
1503 }
1504 }else{
1505 var x1=getPreviewX(sx-1);
1506 var y1=getPreviewY(sy-1);
1507 var x2=getPreviewX(sx+2);
1508 var y2=getPreviewY(sy+2);
1509 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1510 setSVGMode('selector');
1511 }
1512 }
1513 }
1514 }
1515
1516 updateSeletedRectangle();
1517 }
1518
1519 function getPoints(d){
1520 var p = d.split(' ');
1521 var res = new Array();
1522 var isx=true;
1523 var x, y;
1524 for(var i=0; i<p.length;i++){
1525 if(p[i].match('[MLHVCSQTA]','i')){
1526 }else{
1527 if(isx){
1528 x = parseInt(p[i]);
1529 }else{
1530 y = parseInt(p[i]);
1531 res.push(new Array(x, y));
1532 }
1533 isx = !isx;
1534 }
1535 }
1536 return res;
1537 }
1538
1539 function updatePath(d, x, y){
1540 var p = d.split(' ');
1541 var res = "";
1542 var isx=true;
1543 var val;
1544 for(var i=0; i<p.length;i++){
1545 if(p[i].match('[MLHVCSQTA]','i')){
1546 res += ' '+p[i];
1547 }else{
1548 if(isx){
1549 val = parseInt(p[i])+x;
1550 }else{
1551 val = parseInt(p[i])+y;
1552 }
1553
1554 res += ' '+ val;
1555 isx = !isx;
1556 }
1557 }
1558 return trim(res);
1559 }
1560
1561 function updateTransform(obj){
1562 try{
1563 var trans = obj.getAttribute("transform");
1564 if(!trans) return;
1565 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1566 var str = RegExp.lastMatch;
1567 var vals = str.substr(10,str.length-11).split(',') ;
1568 var dx = parseInt(vals[0]);
1569 var dy = parseInt(vals[1]);
1570 switch(getElementTag(obj)){
1571 case 'text':
1572 case 'rect':
1573 addAttributeVal(obj, "x", dx);
1574 addAttributeVal(obj, "y", dy);
1575 break;
1576 case 'circle':
1577 case 'ellipse':
1578 addAttributeVal(obj, "cx", dx);
1579 addAttributeVal(obj, "cy", dy);
1580 break;
1581
1582 case 'path':
1583 var path = obj.getAttribute("d");
1584 obj.setAttribute("d", updatePath(path, dx, dy));
1585 break;
1586 case 'line':
1587 var x1 = getAttributeVal(obj,"x1");
1588 var y1 = getAttributeVal(obj,"y1");
1589 var x2 = getAttributeVal(obj,"x2");
1590 var y2 = getAttributeVal(obj,"y2");
1591 obj.setAttribute("x1", x1+dx);
1592 obj.setAttribute("y1", y1+dy);
1593 obj.setAttribute("x2", x2+dx);
1594 obj.setAttribute("y2", y2+dy);
1595
1596 break;
1597 default:
1598 break;
1599 }
1600 obj.removeAttribute("transform");
1601 }
1602 }catch (e){
1603 }
1604 }
1605
1606 function moveSelectedRectangle(dx, dy){
1607 if(!svg_select) return;
1608 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1609 }
1610
1611 function updateSelectedRectangle(){
1612 if(!svg_select) return;
1613 if(selectedItems.length > 0){
1614 svg_select.setAttribute("visibility","visible;");
1615 }else{
1616 svg_select.setAttribute("visibility","hidden;");
1617 }
1618 }
1619
1620 function clearSelectedItems(){
1621 for(i in selectedItems) delete selectedItems[i];
1622 }
1623
1624 function onTouchMove(e){
1625 e.preventDefault();
1626 if (e.touches.length == 1){
1627 if(targetItem || selectedItems.length > 0){
1628 switch(modeSVG){
1629 case 'newPath':
1630 if(targetItem.tagName == 'path' ){
1631 var path = targetItem.getAttribute("d");
1632 path = path + ' '+ getPreviewX(e.touches[0].pageX) + ' '+ getPreviewY(e.touches[0].pageY) ;
1633 targetItem.setAttribute("d",path);
1634 }
1635 break;
1636 case 'newLine':
1637 if(targetItem.tagName == 'line' ){
1638 var x2 = getPreviewX(e.touches[0].pageX);
1639 var y2 = getPreviewY(e.touches[0].pageY);
1640 targetItem.setAttribute("x2",x2);
1641 targetItem.setAttribute("y2",y2);
1642 }
1643 break;
1644
1645 default:
1646 var dx = e.touches[0].pageX - sx;
1647 var dy = e.touches[0].pageY - sy;
1648
1649 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1650 var lx = getPreviewX(e.touches[0].pageX);
1651 var ly = getPreviewY(e.touches[0].pageY);
1652
1653 if(!lineEdit){
1654 var x1 = getAttributeVal(selectedItems[0],"x1");
1655 var y1 = getAttributeVal(selectedItems[0],"y1");
1656 var x2 = getAttributeVal(selectedItems[0],"x2");
1657 var y2 = getAttributeVal(selectedItems[0],"y2");
1658 var xc = (x1+x2)/2;
1659 var yc = (y1+y2)/2;
1660 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1661 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1662 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1663
1664 var minVal = Math.min(eS, Math.min(eC, eE));
1665 if(minVal == eS) lineEdit='start';
1666 else if(minVal == eE) lineEdit='end';
1667 else lineEdit='move';
1668 }
1669 if(lineEdit=='start'){
1670 selectedItems[0].setAttribute("x1",lx );
1671 selectedItems[0].setAttribute("y1",ly );
1672 setSelectBox();
1673 }else if(lineEdit == 'end'){
1674 selectedItems[0].setAttribute("x2",lx );
1675 selectedItems[0].setAttribute("y2",ly );
1676 setSelectBox();
1677 }else{
1678 selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1679 moveSelectedRectangle(dx, dy);
1680 }
1681 }else{
1682 for(var i=0; i<selectedItems.length;i++){
1683 selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1684 }
1685 moveSelectedRectangle(dx, dy);
1686 }
1687 break;
1688 }
1689 updateShowMenu();
1690 }else if(modeSVG == 'selector'){
1691 ex = e.touches[0].pageX;
1692 ey = e.touches[0].pageY;
1693 var x1=sx;
1694 var y1=sy;
1695 var x2=ex;
1696 var y2=ey;
1697
1698 if(sx > ex){ x1=ex; x2=sx; }
1699 if(sy > ey){ y1=ey; y2=sy; }
1700
1701 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1702 }
1703 }else if (e.touches.length == 2){
1704 var dx= e.touches[0].pageX-e.touches[1].pageX;
1705 var dy = e.touches[0].pageY-e.touches[1].pageY;
1706 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
1707
1708 if(th > 165 || th < 25) svg_scale_dir = 'x';
1709 else if(th > 65 && th < 115) svg_scale_dir = 'y';
1710 else svg_scale_dir = null;
1711 }
1712 }
1713
1714 function onTouchEnd(e){
1715 e.preventDefault();
1716
1717 for(var i=0; i<selectedItems.length;i++){
1718 updateTransform(selectedItems[i]);
1719 }
1720
1721 if(modeSVG == 'selector'){
1722 var x1 = getPreviewX(sx);
1723 var y1 = getPreviewY(sy);
1724 var x2 = getPreviewX(ex);
1725 var y2 = getPreviewY(ey);
1726 getSelectedObjects(x1, y1, x2, y2);
1727 }
1728
1729 updateSelectedRectangle();
1730 updateTransform(svg_select);
1731
1732 setSelectBox();
1733 updateShowMenu();
1734 var btn = document.getElementById('b_'+modeSVG);
1735 if(btn){
1736 btn.style.border="3px solid red";
1737 }
1738 lineEdit=null;
1739 }
1740
1741
1742 function onGestureStart(e){
1743 targetItem = selectedItems[0];
1744 if(targetItem){
1745 svg_wo = targetItem.getAttribute("width");
1746 svg_ho = targetItem.getAttribute("height");
1747 svg_ro = targetItem.getAttribute("r");
1748 svg_rxo = targetItem.getAttribute("rx");
1749 svg_ryo = targetItem.getAttribute("ry");
1750 svg_fsize = targetItem.getAttribute("font-size");
1751 }else{
1752 svg_wo = null;
1753 svg_ho = null;
1754 svg_ro = null;
1755 svg_rxo = null;
1756 svg_ryo = null;
1757 svg_fsize = null;
1758 }
1759 }
1760
1761 function onGestureChange(e){
1762 e.preventDefault();
1763 var scale = e.scale;
1764 var rotation = e.rotation;
1765
1766 if(targetItem){
1767 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
1768 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
1769 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
1770 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
1771 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
1772 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
1773
1774 updateShowMenu();
1775 }
1776 }
1777
1778 function onGestureEnd(e){
1779 e.preventDefault();
1780 svg_wo = null;
1781 svg_ho = null;
1782 svg_ro = null;
1783 svg_rxo = null;
1784 svg_ryo = null;
1785 svg_fsize = null;
1786 }
1787
1788 ///// For Safari
1789 function onMouseDown(e){
1790
1791 if(targetItem){
1792 removeClass(targetItem, "selected");
1793 }
1794
1795 if(isChildById(e.target, 'svg_top')) {
1796 targetItem=e.target;
1797 sx=e.pageX;
1798 sy=e.pageY;
1799 setInnerHTML('popup', e.pageX+","+e.pageY);
1800
1801 }else{
1802 targetItem = null;
1803 }
1804
1805 return true;
1806 }
1807
1808 function onMouseMove(e){
1809 if(targetItem){
1810 addAttributeVal(targetItem, "x", e.pageX - sx );
1811 addAttributeVal(targetItem, "y", e.pageY - sy );
1812 addAttributeVal(targetItem, "cx", e.pageX - sx );
1813 addAttributeVal(targetItem, "cy", e.pageY - sy );
1814 }
1815 sx=e.pageX;
1816 sy=e.pageY;
1817 return true;
1818 }
1819
1820 function onMouseUp(e){
1821 var str = getSVGContent();
1822 escstr = "<pre>"+escapeHTML(str)+"</pre>";
1823 setInnerHTML('popup', escstr);
1824
1825 targetItem=null;
1826 return true;
1827 }
1828
1829 if(!navigator.userAgent.match("iPad")){
1830 document.onmousedown=onMouseDown;
1831 document.onmousemove=onMouseMove;
1832 document.onmouseup=onMouseUp;
1833 }
1834

Properties

Name Value
svn:executable *

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