Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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