Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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