Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18 - (show annotations) (download) (as text)
Tue Jul 20 08:38:24 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 60812 byte(s)
under constructing
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 reallySaveNewFileAction(fname, db){
344 var myDB = db;
345 if(!db) myDB = systemDB;
346
347 var datadiv = document.getElementById('tempdata');
348 content = datadiv.textContent;
349
350 myDB.transaction(
351 function (transaction) {
352 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+fname+"', results.insertId], nullDataHandler, killTransaction);");
353
354 transaction.executeSql('INSERT INTO filedata (datablob) VALUES (?);', [content], myfunc, errorHandler);
355 }
356 );
357
358 datadiv.textContent="";
359 alert("download to "+fname);
360 }
361
362 function saveContentFilename(id, db){
363
364 var datadiv = document.getElementById('tempdata');
365 datadiv.setAttribute('lfdataid', id);
366 saveContent(datadiv.innerHTML, db);
367 datadiv.textContent="";
368 }
369
370 function saveContentWithFilename(fname, contents, db){
371 var myDB = db;
372 if(!db) myDB = systemDB;
373
374 if(!contents) {
375 alert("Invalid content");
376 return;
377 }
378
379 var datadiv = document.getElementById('tempdata');
380 datadiv.setAttribute('lfname', fname);
381 datadiv.textContent = contents;
382
383 myDB.transaction(
384 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+fname+"'],"+
385 "function (transaction, results) {"+
386 "if(results.rows.length == 0){"+
387 "reallySaveNewFileAction('"+fname+"');"+
388 "}else{"+
389 "if (confirm(results.rows.item(0)['name']+' already exist, Overwrite?')) {"+
390 "saveContentFilename(results.rows.item(0)['id']);"+
391 "}else{"+
392 "fileSelector();"+
393 "}"+
394 "}"+
395 "}, errorHandler);")
396 );
397
398 }
399
400 function showFileData(transaction, results){
401 var data = results.rows.item(0);
402 var filename = data['name'];
403 var filedata = data['datablob'];
404
405 var datadiv = document.getElementById('tempdata');
406 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
407
408 document.title=filename;
409
410 previewFile(filedata);
411
412 updateShowMenu();
413 setMode('Preview');
414 }
415
416 function showFile(name){
417 getFile(name, 'showFileData');
418 }
419
420 function getFile(name, func, db){
421 var myDB = db;
422 if(!db) myDB = systemDB;
423
424 var datadiv = document.getElementById('tempdata');
425 if(datadiv) datadiv.setAttribute('lfname', name);
426
427 myDB.transaction(
428 function (transaction) {
429 transaction.executeSql('SELECT * from files, filedata where files.name=? and files.filedata_id = filedata.id;', [name], eval(func), errorHandler);
430 }
431 );
432 }
433
434 // Error Handlers
435 function killTransaction(transaction, error){
436 return true;
437 }
438
439 function errorHandler(transaction, error){
440 alert('Oops. Error was '+error.message+' (Code '+error.code+')');
441
442 var we_think_this_error_is_fatal = true;
443 if (we_think_this_error_is_fatal) return true;
444 return false;
445 }
446
447 function nullDataHandler(transaction, results){
448 }
449
450 ///////////////////////////
451
452 function fileSelector(db) {
453 var myDB = db;
454 if(!db) myDB = systemDB;
455
456 myDB.transaction(
457 function (transaction) {
458 transaction.executeSql("SELECT * from files where deleted=0;", [ ],
459 function (transaction, results) {
460 var filelist = '';
461 var menuDiv = document.getElementById('menuDiv');
462 if(menuDiv){
463 for(var i=0; i<results.rows.length; i++) {
464 var row = results.rows.item(i);
465 filelist = filelist + fileEntry(row);
466 }
467 if (filelist == "") {
468 filelist = "No files.<br />\n";
469 } else {
470 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
471 }
472 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+createMenuBar()+filelist;
473 }
474 }, errorHandler);
475 }
476 );
477 setMode('List');
478 }
479
480 function fileSelectorOnServer(val) {
481 var filelist = '';
482 var menuDiv = document.getElementById('menuDiv');
483 var results = val.split(',');
484
485 if(menuDiv){
486 for(var i=0; i<results.length; i++) {
487 var row = results[i];
488 filelist = filelist + fileEntryOnServer(row);
489 }
490 if (filelist == "") {
491 filelist = "No files.<br />\n";
492 } else {
493 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
494 }
495 var Menu = "<button onClick=\"fileSelector();\">Local Storage</button>";
496 Menu += "<button onClick=\"getRemoteFileList();\">List on Server</button>";
497 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+Menu+filelist;
498 }
499 setMode('List');
500 }
501
502 function fileEntryOnServer(name){
503 name = name.split('.')[0];
504 var res = "<tr class='filerow'>";
505 res += "<td class='filenamecell' onClick=\"getRemoteFile('"+name+"');\">"+name+"</td>";
506 res += "<td class='filelinkcell'>";
507 res += "<button class='green' onClick=\"showRemoteFile('"+name+"');\">View</button>";
508 res += "<button onClick=\"downloadFile('"+name+"');\">Download to local storage</button>";
509 res += "<button onClick=\"downloadToFile('"+name+"');\">Download as SVG File</button>";
510 res += "</td></tr>\n";
511
512 return res;
513 }
514
515 function fileEntry(row){
516 var name = row['name'];
517 var files_id = row['id'];
518
519 var res = "<tr class='filerow'>";
520 res += "<td class='filenamecell' onClick=\"showFile('"+name+"');\">"+name+"</td>";
521 res += "<td class='filelinkcell'>";
522 res += "<button class='blue' onClick=\"editFile('"+name+"');\">&nbsp;Edit&nbsp;</button> &nbsp;";
523 res += "<button class='green' onClick=\"renameFile('"+name+"',"+files_id+");\">&nbsp;Rename&nbsp;</button> &nbsp;";
524 res += "<button onClick=\"uploadFile('"+name+"');\">Upload</button>";
525 res += "<button class='red' onClick=\"deleteFile('"+name+"');\">Delete</button>";
526 res += "</td></tr>\n";
527
528 return res;
529 }
530
531 function createMenuBar(){
532 var menu = "<ul id='menubar'>";
533 menu += "<li><button onClick='createNewFile()'>Create New File</button></li>";
534 menu += "<li><button onClick='deleteAllFile()'>Delete All</button></li>";
535 menu += "<li><button onClick='getRemoteFileList()'>File List on a Server</button></li>";
536 menu += "</ul><p class='cls'>";
537 return menu;
538 }
539
540 ////
541 function createNewFile(){
542 var popupDiv = document.getElementById('popup');
543 var string = "";
544
545 string += "<H1 class='title'>Create New File</H1>\n";
546 string += "<div class=\"input_form\">\n";
547 string += "Filename:<input id='createFilename' name='name' value=\"\" />\n";
548 string += "<button onClick=\"createNewFileAction();hideItemById('popup'); \">Create</button>\n";
549 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
550 string += "</div>\n";
551
552 popupDiv.innerHTML=string;
553 popupDiv.style.display='block';
554 }
555
556
557 /////
558 function renameFile(name, id){
559 var popupDiv = document.getElementById('popup');
560 var string = "";
561
562 string += "<H1 class='title'>Rename File</H1>\n";
563 string += "<div class='input_form'>\n";
564 string += "Old Filename: "+name+"<br>";
565 string += "New Filename:<input id='newFilename' name='newname' value=\"\" />\n";
566 string += "<input type='hidden' id='fileId' value=\""+id+"\" /><br>\n";
567 string += "<button onClick=\"renameFileAction();hideItemById('popup');\">Rename</button>\n";
568 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
569 string += "</div>\n";
570
571 popupDiv.innerHTML=string;
572 popupDiv.style.display='block';
573 }
574
575 /// EditMenu
576 function insertStr(str, len){
577 var editarea = document.getElementById('editarea');
578 if(len < 0) len = str.length;
579
580 if (editarea){
581 if(str=='DQ') str='"';
582 var strs = editarea.value;
583 var cPos = editarea.selectionStart;
584 var tmp = strs.substr(0,cPos);
585 editarea.value = tmp +str+strs.substr(cPos, strs.length);
586 cPos += len;
587 editarea.setSelectionRange(cPos, cPos);
588 editarea.focus();
589 }
590 }
591
592 function insertTag(tag){
593 var str;
594 var len = -1;
595 if (tag == "p"){
596 str = "<p> </p>";
597 len = 4;
598 }else if (tag == "ul"){
599 str = "<ul class=\" \"> \n\n</ul>";
600 len = 17;
601 }else if (tag == "li"){
602 str = "<li> </li>";
603 len = 5;
604 }else if (tag == "href"){
605 str = "xlink:href=\"\"";
606 len = 12;
607 }else if (tag == "EQ"){
608 str = "=\"\"";
609 len = 2;
610 }else if (tag == "svg:text"){
611 str = "<svg:text x=\"100\" y=\"100\" fill=\"black\" font-size=\"12\"> </svg:text>";
612 len = 58;
613 }else if (tag == "svg:rect"){
614 str = "<svg:rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"white\" stroke=\"black\" />";
615 len = 13;
616 }else if (tag == "svg:circle"){
617 str = "<svg:circle cx=\"10\" cy=\"100\" r=\"100\" fill=\"white\" stroke=\"black\" strokc-width=\"1\"/>";
618 len = 17;
619 }
620 insertStr(str, len);
621 }
622
623 function editMenuBar()
624 {
625 var str = "";
626 str += "<button onClick=\"insertStr('/',1);\">/</button>\n";
627 str += "<button onClick=\"insertStr('DQ',1);\">\"</button>\n";
628 str += "<button onClick=\"insertTag('EQ',1);\">=\"\"</button>\n";
629 str += "<button onClick=\"insertTag('p');\">p</button>\n";
630 str += "<button onClick=\"insertTag('href');\">href</button>\n";
631
632 str += "<button onClick=\"insertTag('svg:text');\">TEXT</button>\n";
633 str += "<button onClick=\"insertTag('svg:rect');\">rect</button>\n";
634 str += "<button onClick=\"insertTag('svg:circle');\">circle</button>\n";
635
636 str += "<button onClick=\"chEditareaHeight();\">...</button>\n";
637
638 return str;
639 }
640
641 function updateEditMenu(){
642 var menuDiv = document.getElementById('menuDiv');
643 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
644 menuDiv.innerHTML+= "<button onClick=\"saveFile();fileSelector();\"> Save </button>\n";
645 menuDiv.innerHTML+= "<button onClick=\"previewData();\"> Preview </button>\n";
646 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
647
648 menuDiv.style.display='block';
649 }
650
651 //// Editor
652 function editFileData(transaction, results){
653 var editDiv = document.getElementById('editDiv');
654 var datadiv = document.getElementById('tempdata');
655
656 if( results.rows.length == 0) return;
657 var data = results.rows.item(0);
658 var filename = data['name'];
659 var filedata = data['datablob'];
660 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
661
662 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+filedata+"</textarea>\n";
663
664 document.title="EditFile: "+filename;
665 updateEditMenu();
666 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
667
668 setMode('Edit');
669 }
670
671 function editFile(name){
672 if(currentMode == 'Preview'){
673 var data = getSVGContent();
674 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+data+"</textarea>\n";
675 updateEditMenu();
676 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
677
678 setMode('Edit');
679 }else{
680 getFile(name, 'editFileData');
681 }
682 }
683
684 function editCurrentFile(){
685 var datadiv = document.getElementById('tempdata');
686 var name = datadiv.getAttribute('lfname');
687
688 editFile(name);
689 }
690
691 // Show File
692 function updateShowMenu(){
693 var menuDiv = document.getElementById('menuDiv');
694 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
695 menuDiv.innerHTML+= "<button onClick=\"editCurrentFile();\"> Edit </button>\n";
696 menuDiv.innerHTML+= "<button onClick=\"saveData();\"> Save </button>\n";
697 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
698 menuDiv.innerHTML+= "<button onClick=\"showSVGSource();\"> &lt;SVG &gt; </button>\n";
699 menuDiv.innerHTML+= updateSVGObjMenu();
700 menuDiv.style.display='block';
701 updateToolBar();
702 }
703
704
705 function updateToolBar(){
706 var toolbar = document.getElementById('toolBar');
707 if(!toolbar.innerHTML){
708 toolbar.innerHTML= "<ul>";
709 toolbar.innerHTML+= "<li><button id=\"b_selector\" onClick=\"setSVGMode('selector');\"><img src=\"images/arrow.png\" /></button> </li>\n";
710 toolbar.innerHTML+= "<li><button id=\"b_newPath\" onClick=\"setSVGMode('newPath'); \"><img src=\"images/path.png\" /></button></li> \n";
711 toolbar.innerHTML+= "<li><button id=\"b_newLine\" onClick=\"setSVGMode('newLine'); \"><img src=\"images/line.png\" /> </button></li> \n";
712 toolbar.innerHTML+= "<li><button id=\"b_text\" onClick=\"setSVGMode('text'); \"><img src=\"images/text.png\" /></button> </li>\n";
713 toolbar.innerHTML+= "<li><button id=\"b_rect\" onClick=\"setSVGMode('rect'); \"> <img src=\"images/rect.png\" /> </button></li> \n";
714 toolbar.innerHTML+= "<li><button id=\"b_circle\" onClick=\"setSVGMode('circle'); \"> <img src=\"images/circle.png\" /> </button></li> \n";
715 toolbar.innerHTML+= "<li><button id=\"b_ellipse\" onClick=\"setSVGMode('ellipse'); \"> <img src=\"images/ellipse.png\" /> </button></li> \n";
716 toolbar.innerHTML+= "<li><button id=\"b_image\" onClick=\"setSVGMode('image'); \"> <img src=\"images/img.png\" /> </button></li> \n";
717 toolbar.innerHTML+= "</ul>";
718 }
719 toolbar.style.display='block';
720
721 }
722
723 function setMode(m){
724 currentMode=m;
725 switch(m){
726 case 'List':
727 hideItemById('editDiv');
728 hideItemById('preview');
729 hideItemById('popup');
730 hideItemById('toolBar');
731 hideItemById('color-palette');
732 showItemById('menuDiv');
733 break;
734 case 'Edit':
735 hideItemById('preview');
736 hideItemById('popup');
737 hideItemById('toolBar');
738 hideItemById('color-palette');
739 showItemById('editDiv');
740 showItemById('menuDiv');
741 break;
742 case 'Preview':
743 showItemById('preview');
744 hideItemById('editDiv');
745 hideItemById('popup');
746 showItemById('color-palette');
747 showItemById('menuDiv');
748 showItemById('toolBar');
749 break;
750 default:
751 break;
752 }
753 }
754
755 function hideItemById(id){
756 var itm = document.getElementById(id);
757 if(itm) itm.style.display='none';
758 }
759
760 function showItemById(id){
761 var itm = document.getElementById(id);
762 if(itm) itm.style.display='block';
763 }
764
765 function removeChildNodes(id){
766 var itm = document.getElementById(id);
767 if(!itm) return;
768
769 var child = itm.firstChild;
770
771 while(child){
772 itm.removeChild(child);
773 child = itm.firstChild;
774 }
775 }
776
777 function chEditareaHeight(){
778 var itm = document.getElementById('editarea');
779 if(!itm) return;
780 var cv = itm.getAttribute('rows');
781 if(parseInt(cv) > editarea_h){
782 itm.setAttribute('rows', editarea_h);
783 }else{
784 itm.setAttribute('rows', editarea_h * 2);
785 }
786 }
787
788 function format_file(str){
789 return "<pre>"+str+"</pre>";
790 }
791
792 function previewData(data){
793 if(!data) data = document.getElementById('editarea').value;
794
795 previewFile(data);
796
797 updateShowMenu();
798 setMode('Preview');
799 }
800
801 function previewFile(data){
802 removeChildNodes('preview');
803
804 preview.style.display='block';
805 preview.style.position='absolute';
806 preview.style.top='180px';
807 preview.style.bottom='50px';
808 preview.style.left='0px';
809 preview.style.right='10px';
810 mkColorPalette();
811
812 var ele = toSVGElement(data, '100%','100%');
813
814 preview.appendChild(ele);
815
816 svg_top = document.getElementById('svg_top');
817 initSVGElementId(svg_top);
818 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
819 svg_select.setAttribute("id","svg_select");
820 appendSVGObj(svg_select);
821 }
822
823
824
825 function mkColorPalette(){
826 var palette = document.getElementById('color-palette');
827 if(!palette) return;
828 if(palette.innerHTML) return;
829
830 palette.innerHTML="";
831 palette.addEventListener("touchstart", onTouchStartColor, false);
832
833 palette.innerHTML="<select id=\"color_sel\"><option value=\"fill\">Fill</option><option value=\"stroke\">Color</option></select>";
834 for(var i=0; i<colors.length ;i++){
835 if(colors[i] == 'none')
836 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\">X</div>";
837 else
838 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\"> </div>";
839 }
840 }
841
842 ////// for SVG object
843 ////////////////
844 function updateSVGObjMenu(){
845 var res = "";
846 var tag = modeSVG;
847 if(selectedItems.length > 1) return res;
848 if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
849
850 switch(tag){
851 case 'text':
852 if(selectedItems[0]){
853 res += setSVGObjectProp(selectedItems[0]);
854 }else{
855 res += propSVGText("", 24, '#000000');
856 }
857 break;
858 case 'rect':
859 case 'circle':
860 case 'ellipse':
861 case 'newPath':
862 case 'newLine':
863 case 'path':
864 case 'line':
865 case 'polyline':
866 case 'polygon':
867 if(selectedItems[0]){
868 res += setSVGObjectProp(selectedItems[0]);
869 }else{
870 res += propSVGObj(tag+":", 1, '#000000', '#ffffff');
871 }
872 break;
873 case 'image':
874 if(selectedItems[0]){
875 res += setSVGObjectProp(selectedItems[0]);
876 }else{
877 res += propSVGImage("", 100, 100);
878 }
879 break;
880 default:
881 break;
882 }
883 return res;
884 }
885
886 function propSVGText(str, size, color){
887 if(!size) size = 24;
888 if(!color) color = '#000000';
889
890 var res = "Text:";
891 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\"/>";
892 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
893 res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
894 return res;
895 }
896
897 function propSVGObj(type, stroke, color, fill){
898 var res = type;
899 if(!stroke) stroke = 1;
900 if(!color) color = '#000000';
901 if(!fill) fill = '#ffffff';
902 res += "Fill:<input type=\"text\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
903 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
904 res += "L:<input type=\"text\" id=\"svg_stroke\" value=\""+stroke+"\" size=\"2\"/>";
905 return res;
906 }
907
908 function propSVGLine(type, stroke, color, fill, style){
909 var res = propSVGObj(type, stroke, color, fill);
910 if(style==null) style="";
911 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
912 res += "Arrow:";
913 if(hasArrow('start')){
914 res += "<button class=\"tool\" onClick=\"removeLeftArrow();\"><img src=\"images/normal.png\" /></button>";
915 }else{
916 res += "<button class=\"tool\" onClick=\"setLeftArrow();\"><img src=\"images/larrow.png\" /></button>";
917 }
918 if(hasArrow('end')){
919 res += "<button class=\"tool\" onClick=\"removeRightArrow();\"><img src=\"images/normal.png\" /></button>";
920 }else{
921 res += "<button class=\"tool\" onClick=\"setRightArrow();\"><img src=\"images/rarrow.png\" /></button>";
922 }
923 return res;
924 }
925
926 function propSVGImage(str, w, h){
927 var res = "image:";
928 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
929 res += "Width:<input type=\"text\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
930 res += "Height:<input type=\"text\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
931 return res;
932 }
933
934 function setSVGMode(m){
935 var btn = document.getElementById('b_'+modeSVG);
936 if(btn){ btn.style.border="1px solid black"; }
937
938 modeSVG = m;
939 updateShowMenu();
940
941 if(m == 'selector'){
942 targetItem=null;
943 clearSelectedItems();
944 }
945 var btn = document.getElementById('b_'+modeSVG);
946 if(btn){ btn.style.border="3px solid red"; }
947 }
948
949
950 function toSVGElement(str, w, h){
951 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
952 var parser = new DOMParser();
953 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
954 var footer = "</svg:svg>";
955 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
956 var xmlRoot = xmlDoc.documentElement;
957 var ele = document.importNode(xmlRoot,true);
958
959 return ele;
960 }
961
962 function createSVGElement(tag, id){
963 if(id=='new'){
964 id = 'svg_'+nextId;
965 nextId++;
966 }
967 var ele= document.createElementNS(svg_ns, tag);
968 ele.setAttribute("id", id);
969 return ele;
970 }
971
972 function defSVGElement(node){
973 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
974 if(!svg_defs){
975 svg_defs = createSVGElement('defs', 'svg_defs');
976 svg_top.insertBefore(svg_defs, svg_top.firstChild);
977 }
978 if(node) svg_defs.appendChild(node);
979 }
980
981 function initSVGElementId(svg_top){
982 nextId = 1;
983 checkSVGElementId(svg_top);
984 appendSVGElementId(svg_top);
985 }
986
987 function checkSVGElementId(top){
988 var objs = top.childNodes;
989
990 for(var i=0; i<objs.length ;i++){
991 if(objs[i].tagName){
992 var id = objs[i].getAttribute("id");
993
994 if(id && id.match(/svg_[0-9]+/i)){
995 var n = parseInt(RegExp.lastMatch.substr(4));
996 if(n >= nextId){
997 nextId = n+1;
998 }
999
1000 }
1001 checkSVGElementId(objs[i]);
1002 }
1003 }
1004 }
1005
1006 function appendSVGElementId(top){
1007 var objs = top.childNodes;
1008
1009 for(var i=0; i<objs.length ;i++){
1010 if(objs[i].tagName){
1011 var id = objs[i].getAttribute("id");
1012 if(!id){
1013 objs[i].setAttribute("id", "svg_"+nextId);
1014 nextId++;
1015 }
1016 }
1017 appendSVGElementId(objs[i]);
1018 }
1019 }
1020
1021 function selectedRectangle(x, y, ex, ey){
1022 if(!svg_select) return null;
1023
1024 svg_select.setAttribute("x",x);
1025 svg_select.setAttribute("y",y);
1026 svg_select.setAttribute("width", ex-x);
1027 svg_select.setAttribute("height", ey-y);
1028 svg_select.setAttribute("visibility", "visible");
1029 return svg_select;
1030 }
1031
1032
1033 function setAttributes(obj, attrs){
1034 var attr_array = attrs.split(',');
1035
1036 for (var i=0; i<attr_array.length;i++){
1037 var x = attr_array[i].split('=');
1038 if(x.length == 2){
1039 obj.setAttribute(x[0], x[1]);
1040 }
1041 }
1042 }
1043
1044 function createSVGObj(tag, attrs, fill, color, lw){
1045 var ele = createSVGElement(tag, 'new');
1046 setAttributes(ele, attrs);
1047 if (fill) ele.setAttribute('fill', fill);
1048 if (color) ele.setAttribute('stroke', color);
1049 if(lw) ele.setAttribute('stroke-width', lw);
1050
1051 return ele;
1052 }
1053
1054 function createSVGText(txt, x, y, size, color){
1055 var ele = createSVGElement('text', 'new');
1056
1057 ele.setAttribute('x', x);
1058 ele.setAttribute('y', y);
1059 ele.setAttribute('font-size', size);
1060 ele.setAttribute('fill', color);
1061 ele.textContent=txt;
1062
1063 return ele;
1064 }
1065
1066 function createSVGImage(fname, width, height, attrs){
1067 var ele = createSVGElement('image', 'new');
1068 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1069 ele.setAttribute('width', width);
1070 ele.setAttribute('height', height);
1071 setAttributes(ele, attrs);
1072
1073 return ele;
1074 }
1075
1076 function createSVGMarker(pid, id, child){
1077 var parent = document.getElementById(pid);
1078 if(!parent) return;
1079 var ele = createSVGElement('marker', pid+'_'+id);
1080 ele.appendChild(child);
1081 return ele;
1082 }
1083
1084 function setLeftArrow(){
1085 if( selectedItems.length == 1 ){
1086 setArrow(selectedItems[0], 'start', '');
1087 }
1088 }
1089
1090 function setRightArrow(){
1091 if( selectedItems.length == 1 ){
1092 setArrow(selectedItems[0], 'end', '');
1093 }
1094 }
1095
1096 function removeLeftArrow(){
1097 if( selectedItems.length == 1 ){
1098 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1099 var pid = selectedItems[0].getAttribute('id');
1100 var marker = document.getElementById(pid+'_startarrow');
1101 svg_defs.removeChild(marker);
1102 selectedItems[0].removeAttribute('marker-start');
1103 }
1104 }
1105
1106 function removeRightArrow(){
1107 if( selectedItems.length == 1 ){
1108 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1109 var pid = selectedItems[0].getAttribute('id');
1110 var marker = document.getElementById(pid+'_endarrow');
1111 svg_defs.removeChild(marker);
1112 selectedItems[0].removeAttribute('marker-end');
1113 }
1114 }
1115
1116 function hasArrow(pos){
1117 var pobj = selectedItems[0];
1118 if(!pobj) return false;
1119 var pid = pobj.getAttribute('id');
1120 var marker = document.getElementById(pid+'_'+pos+'arrow');
1121 if(marker) return true;
1122 return false;
1123 }
1124
1125 function getArrowMarker(obj,pos){
1126 if(!obj) return false;
1127 var pid = obj.getAttribute('id');
1128 var marker = document.getElementById(pid+'_'+pos+'arrow');
1129 return false;
1130 }
1131
1132 function setArrow(pobj, pos, type){
1133 if(!pobj) return;
1134 var pid = pobj.getAttribute('id');
1135 var marker = document.getElementById(pid+'_'+pos+'arrow');
1136 if(marker) return;
1137
1138 var obj = createSVGElement('path', 'new');
1139
1140 var refX = 0;
1141 var refY = 0;
1142
1143 switch(pos){
1144 case 'start':
1145 refX=10;
1146 refY=10;
1147 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1148 break;
1149 case 'end':
1150 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1151 refX= 10;
1152 refY=10;
1153 break;
1154 default:
1155 return;
1156 }
1157
1158 marker = createSVGMarker(pid, pos+'arrow' , obj);
1159 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1160
1161 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1162
1163 defSVGElement(marker);
1164 var mid = "url(#"+marker.getAttribute("id")+")";
1165 var mattr = "marker-"+pos;
1166 pobj.setAttribute(mattr, mid);
1167 }
1168
1169 function appendSVGObj(obj){
1170 var svg_top = document.getElementById('svg_top');
1171 if(!svg_top) return;
1172
1173 svg_top.appendChild(obj);
1174 }
1175
1176 function isChildById(element, id) {
1177 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1178 else if (element.parentNode.id == id) return true;
1179 else return isChildById(element.parentNode, id);
1180 }
1181
1182 /////////////////////// Formatting SVG DOM
1183 function escapeHTML(text) {
1184 return text.replace( /[<>"&]/g,
1185 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1186 );
1187 };
1188
1189 function formatTag(ele){
1190 var str="";
1191 if(ele.nodeType == 1){
1192 var tag_a = ele.tagName.split(':');
1193 var tag;
1194 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1195
1196 str += "<"+tag;
1197 var attrs = ele.attributes;
1198 for(var i=0; i<attrs.length; i++){
1199 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1200 }
1201 var cn = ele.childNodes;
1202 if(cn.length > 0){
1203 str +=">\n";
1204 for(var i=0; i<cn.length; i++){
1205 var tmp = trim(formatTag(cn[i]));
1206 if(tmp) str += " "+tmp+"\n";
1207 }
1208 str += "</"+tag+">";
1209 }else{
1210 str +=" />";
1211 }
1212 return str;
1213 }else if(ele.nodeType==3){
1214 return ele.textContent;
1215 }
1216 }
1217
1218 function getSVGContent(){
1219 if(!svg_top) return "";
1220
1221 var str = "";
1222 var elements = svg_top.childNodes;
1223 for(var i=0; i<elements.length; i++){
1224 if(elements[i] != svg_select){
1225 var tmp = trim(formatTag(elements[i]));
1226 if(tmp) str += tmp + '\n';
1227 }
1228 }
1229 return str;
1230 }
1231
1232 function trim(str){
1233 return str.replace(/(^\s+)|(\s+$)/g, "");
1234 }
1235
1236 /////// Access Server
1237 function newXMLRequest(){
1238 if(this.XMLHttpRequest){
1239 return new XMLHttpRequest();
1240 }else {
1241 return new ActiveXObject("Microsoft.XMLHTTP");
1242 }
1243 }
1244
1245 function createRequestData(data){
1246 var str="filetype=svg";
1247 for (var i in data){
1248 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1249 }
1250 return str;
1251 }
1252
1253 function postRequest(url, data, func){
1254 var postData=createRequestData(data);
1255 var obj=newXMLRequest();
1256
1257 obj.onreadystatechange = function(){
1258 if (obj.readyState == 4 && obj.status == 200){
1259 func(obj.responseText);
1260 }
1261 }
1262 obj.open("POST", url, true);
1263 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1264 obj.send(postData);
1265 }
1266
1267 function commnadFinishAlert(s){
1268 alert(s);
1269 }
1270
1271 function uploadFileData(transaction, results){
1272 var data = results.rows.item(0);
1273 var updata = new Array(0);
1274 updata['name']= data['name'];
1275 updata['datalob'] = data['datablob'];
1276 updata['cmd'] = 'upload'
1277
1278 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1279 }
1280
1281 function uploadFile(name){
1282 getFile(name, 'uploadFileData');
1283 }
1284
1285 function getRemoteFileList(){
1286 var data=new Array();
1287 data['name'] = "SVG";
1288 data['cmd'] = "list";
1289 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1290 }
1291
1292 function previewRemoteFile(content){
1293 previewFile(content);
1294 setMode('Preview');
1295 }
1296
1297 function getRemoteFile(name){
1298 var data=new Array();
1299 data['name'] = name;
1300 data['cmd'] = "get";
1301 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1302 }
1303
1304 function saveRemoteFile(content){
1305 var datadiv = document.getElementById('tempdata');
1306 var fname = datadiv.getAttribute('lfname');
1307 saveContentWithFilename(fname, content);
1308 }
1309
1310 function downloadFile(name){
1311 var data=new Array();
1312 data['name'] = name;
1313 data['cmd'] = "get";
1314 var datadiv = document.getElementById('tempdata');
1315 datadiv.setAttribute('lfname', name);
1316 postRequest(MgrPath+iSlideMgr, data, saveRemoteFile);
1317 }
1318
1319 function showRemoteFile(name){
1320 getRemoteFile(name);
1321 }
1322
1323 function downloadToFile(name){
1324 var downloadForm = "";
1325 downloadForm += "<form action=\"iSlideManager.php\" method=\"post\">";
1326 downloadForm += "<input type=\"hidden\" name=\"cmd\" value=\"download\">";
1327 downloadForm += "<input type=\"hidden\" name=\"name\" value=\""+name+"\">";
1328 downloadForm += "<input type=\"hidden\" name=\"filetype\" value=\"svg\">";
1329 downloadForm += "<input type=\"submit\">";
1330 downloadForm += "</form>";
1331
1332 var cmdForm = document.getElementById('cmdForm');
1333 cmdForm.innerHTML = downloadForm;
1334 cmdForm.firstChild.submit();
1335 }
1336
1337 //////// Event Handler
1338 function setInnerHTML(id, val){
1339 var itm=document.getElementById(id);
1340 if(itm) itm.innerHTML=val;
1341 }
1342
1343 function popupInfo(val){
1344 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1345 str += val;
1346 setInnerHTML('popup', str);
1347 showItemById('popup');
1348 }
1349
1350 function addAttributeVal(obj, itm, dv){
1351 if(obj.hasAttribute(itm)){
1352 var x = parseInt(obj.getAttribute(itm));
1353 x = x + dv;
1354 obj.setAttribute(itm, x)
1355 }
1356 }
1357
1358 function showSVGSource(){
1359 var str = getSVGContent();
1360 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1361 escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1362 // escstr += "<pre>"+escapeHTML(str)+"</pre>";
1363 escstr += "<textarea cols=\"130\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1364 setInnerHTML('popup', escstr);
1365 showItemById('popup');
1366 }
1367
1368
1369 function getElementTag(obj){
1370 if (!obj) return null;
1371 var tag = obj.tagName.split(':');
1372 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1373 return tag[0];
1374 }
1375
1376 function setSVGObjectProp(obj){
1377 var tag = getElementTag(obj);
1378 var res ="";
1379 switch(tag){
1380 case 'text':
1381 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1382 break;
1383 case 'rect':
1384 case 'circle':
1385 case 'ellipse':
1386 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1387 break;
1388 case 'path':
1389 case 'line':
1390 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1391 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1392 break;
1393 case 'image':
1394 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"));
1395 break;
1396 default:
1397 break;
1398 }
1399 if(res != ""){
1400 res += "<button onClick=\"updateSVGObj();\">OK</button>";
1401 res += "<button onClick=\"delSVGObj();\">Del</button>";
1402 }
1403
1404 return res
1405 }
1406
1407 function updateSVGObj(){
1408 if(selectedItems.length != 1) return;
1409 var obj = selectedItems[0];
1410 var tag = getElementTag(obj);
1411 var res ="";
1412 switch(tag){
1413 case 'text':
1414 var txt=document.getElementById('svg_text');
1415 var color=document.getElementById('svg_color');
1416 var size=document.getElementById('svg_size');
1417 obj.textContent = txt.value;
1418 obj.setAttribute("fill", color.value);
1419 obj.setAttribute("font-size", size.value);
1420 break;
1421 case 'rect':
1422 case 'circle':
1423 case 'ellipse':
1424 var fill=document.getElementById('svg_fill');
1425 var color=document.getElementById('svg_color');
1426 var L=document.getElementById('svg_stroke');
1427 obj.setAttribute("fill", fill.value);
1428 obj.setAttribute("stroke", color.value);
1429 obj.setAttribute("stroke-width", L.value);
1430 break;
1431 case 'path':
1432 case 'line':
1433 var fill=document.getElementById('svg_fill');
1434 var color=document.getElementById('svg_color');
1435 var L=document.getElementById('svg_stroke');
1436 var dash=document.getElementById('svg_stroke_type');
1437 obj.setAttribute("fill", fill.value);
1438 obj.setAttribute("stroke", color.value);
1439 obj.setAttribute("stroke-width", L.value);
1440 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1441 var id = obj.getAttribute("id");
1442 var marker = document.getElementById(id+'_startarrow');
1443 if(marker) marker.setAttribute("fill", color.value);
1444 var marker = document.getElementById(id+'_endarrow');
1445 if(marker) marker.setAttribute("fill", color.value);
1446 break;
1447 case 'image':
1448 var fname=document.getElementById('svg_text');
1449 var w=document.getElementById('svg_w');
1450 var h=document.getElementById('svg_h');
1451 obj.setAttribute("xlink:href", fname.value);
1452 obj.setAttribute("width", w.value);
1453 obj.setAttribute("height", h.value);
1454 break;
1455 default:
1456 break;
1457 }
1458
1459 }
1460
1461 function delSVGObj(){
1462 if(selectedItems.length != 1) return;
1463 var obj = selectedItems[0];
1464
1465 if(!svg_top) return;
1466 svg_top.removeChild(obj);
1467 svg_select.setAttribute("visibility","hidden");
1468 }
1469
1470 ///// For MobileSafari
1471 function getPreviewX(x){ return x - preview.offsetLeft; }
1472 function getPreviewY(y){ return y - preview.offsetTop; }
1473
1474 function calcDit(x1, y1, x2, y2){
1475 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1476 }
1477
1478 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1479 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1480 }
1481
1482 function getAttributeVal(obj, name){
1483 try{
1484 return parseInt(obj.getAttribute(name));
1485 }catch(e){ return 0; }
1486 }
1487
1488 function checkIntersection(obj, x, y, ex, ey){
1489 if(!obj) return false;
1490 var res = true;
1491 var bbox = obj.getBBox();
1492 var ox = bbox.x;
1493 var oy = bbox.y;
1494 var oex = bbox.x+bbox.width;
1495 var oey = bbox.y+bbox.height;
1496 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1497
1498 var tag = getElementTag(obj);
1499 switch(tag){
1500 case 'circle':
1501 case 'ellipse':
1502 var cx = getAttributeVal(obj,"cx");
1503 var cy = getAttributeVal(obj,"cy");
1504 var rx = getAttributeVal(obj,"r");
1505 var ry = rx;
1506 if(!rx){
1507 var rx = getAttributeVal(obj,"rx");
1508 var ry = getAttributeVal(obj,"ry");
1509 }
1510
1511 if(res){
1512 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1513 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1514 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1515 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1516 }
1517 break;
1518 case 'path':
1519 var d = obj.getAttribute("d");
1520 var p = getPoints(d);
1521 for(var i=0;i<p.length;i++){
1522 var ox=p[i][0];
1523 var oy=p[i][1];
1524 if(x < ox && ox < ex && y < oy && oy < ey) {
1525 return true;
1526 }
1527 }
1528 return false;
1529 break;
1530 case 'line':
1531 var x1 = getAttributeVal(obj,"x1");
1532 var y1 = getAttributeVal(obj,"y1");
1533 var x2 = getAttributeVal(obj,"x2");
1534 var y2 = getAttributeVal(obj,"y2");
1535 var d = (y2-y1)/(x2-x1);
1536
1537 if(res){
1538 var xx = Math.abs(x2-x1);
1539 var sign = 1;
1540 if(x2-x1 < 0){ sign = -1; }
1541 for(var i=0; i < xx; i++){
1542 var nx = i*sign + x1;
1543 var ny = d * i*sign + y1;
1544 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1545 }
1546 }
1547 return false;
1548
1549 return res;
1550 break;
1551 case 'text':
1552 case 'rect':
1553 case 'polygon':
1554 case 'polyline':
1555 case 'image':
1556 break;
1557 default:
1558 res=false;
1559 break;
1560 }
1561 return res;
1562 }
1563
1564 function getBoundingBox(obj){
1565 var res = new Array(4);
1566 var bbox = obj.getBBox();
1567 res[0] = bbox.x-1;
1568 res[1] = bbox.y-1;
1569 res[2] = bbox.x+bbox.width+2;
1570 res[3] = bbox.y+bbox.height+2;
1571 return res;
1572 }
1573
1574 function setSelectBox(){
1575 if(!svg_select) return;
1576
1577 if(selectedItems.length == 0){
1578 svg_select.setAttribute("visibility","hidden");
1579 return;
1580 }
1581
1582 var bbox = new Array(4);
1583 bbox[0] = 1000;
1584 bbox[1] = 1000;
1585 bbox[2] = 0;
1586 bbox[3] = 0;
1587
1588 for(var i=0;i<selectedItems.length;i++){
1589 var bp = getBoundingBox(selectedItems[i]);
1590 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1591 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1592 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1593 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1594 }
1595 svg_select.setAttribute("x", bbox[0]);
1596 svg_select.setAttribute("y", bbox[1]);
1597 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1598 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1599 svg_select.setAttribute("visibility","visible;");
1600 }
1601
1602 function getSelectedObjects(x1, y1, x2, y2){
1603 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1604 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1605
1606 var val="";
1607 if(svg_top){
1608 var val ="";
1609 var objs = svg_top.childNodes;
1610 selectedItems = new Array();
1611 for(var i=0; i<objs.length;i++){
1612 if(objs[i].tagName){
1613
1614 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1615 selectedItems.push(objs[i]);
1616 }
1617 val += objs[i].tagName+" ";
1618 }
1619 }
1620 }
1621 setSelectBox();
1622 }
1623
1624 function onTouchStart(e){
1625 //e.preventDefault();
1626 sx=e.touches[0].pageX;
1627 sy=e.touches[0].pageY;
1628 ex=e.touches[0].pageX;
1629 ey=e.touches[0].pageY;
1630
1631 if (e.touches.length == 1){
1632 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1633 var x1=getPreviewX(sx-1);
1634 var y1=getPreviewY(sy-1);
1635 var x2=getPreviewX(sx+2);
1636 var y2=getPreviewY(sy+2);
1637 getSelectedObjects(x1, y1, x2, y2);
1638
1639 if(selectedItems.length == 0){
1640 setSVGMode('selector');
1641 }else if(selectedItems.length == 1){
1642 targetItem=selectedItems[0];
1643 setSVGMode(getElementTag(targetItem));
1644 }else{
1645 setSVGMode('Group');
1646 }
1647 }else { // CreateMode
1648 if(selectedItems.length == 0){
1649
1650 var fill=document.getElementById('svg_fill');
1651 var color=document.getElementById('svg_color');
1652 var L=document.getElementById('svg_stroke');
1653
1654 var x = getPreviewX(sx);
1655 var y = getPreviewY(sy);
1656
1657 switch(modeSVG){
1658 case 'text':
1659 var txt=document.getElementById('svg_text');
1660 var size=document.getElementById('svg_size');
1661 var y = y + parseInt(size.value)*0.8;
1662 if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1663 break;
1664 case 'rect':
1665 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1666 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1667 break;
1668 case 'circle':
1669 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1670 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1671 break;
1672 case 'ellipse':
1673 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1674 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1675 break;
1676 case 'newPath':
1677 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1678 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1679 break;
1680 case 'newLine':
1681 var x2=x+1;
1682 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1683 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1684 break;
1685 case 'image':
1686 var attr = 'x='+x+',y='+y;
1687 var txt=document.getElementById('svg_text');
1688 var w=document.getElementById('svg_w');
1689 var h=document.getElementById('svg_h');
1690 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1691 default:
1692 break;
1693 }
1694 if (targetItem){
1695 appendSVGObj(targetItem);
1696 selectedItems[0]=targetItem;
1697 }
1698 }else{
1699 var x1=getPreviewX(sx-1);
1700 var y1=getPreviewY(sy-1);
1701 var x2=getPreviewX(sx+2);
1702 var y2=getPreviewY(sy+2);
1703 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1704 setSVGMode('selector');
1705 }
1706 }
1707 }
1708 }
1709
1710 updateSelectedRectangle();
1711 }
1712
1713 function getPoints(d){
1714 var p = d.split(' ');
1715 var res = new Array();
1716 var isx=true;
1717 var x, y;
1718 for(var i=0; i<p.length;i++){
1719 if(p[i].match('[MLHVCSQTA]','i')){
1720 }else{
1721 if(isx){
1722 x = parseInt(p[i]);
1723 }else{
1724 y = parseInt(p[i]);
1725 res.push(new Array(x, y));
1726 }
1727 isx = !isx;
1728 }
1729 }
1730 return res;
1731 }
1732
1733 function updatePath(d, x, y){
1734 var p = d.split(' ');
1735 var res = "";
1736 var isx=true;
1737 var val;
1738 for(var i=0; i<p.length;i++){
1739 if(p[i].match('[MLHVCSQTA]','i')){
1740 res += ' '+p[i];
1741 }else{
1742 if(isx){
1743 val = parseInt(p[i])+x;
1744 }else{
1745 val = parseInt(p[i])+y;
1746 }
1747
1748 res += ' '+ val;
1749 isx = !isx;
1750 }
1751 }
1752 return trim(res);
1753 }
1754
1755 function updateTransform(obj){
1756 try{
1757 var trans = obj.getAttribute("transform");
1758 if(!trans) return;
1759 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1760 var str = RegExp.lastMatch;
1761 var vals = str.substr(10,str.length-11).split(',') ;
1762 var dx = parseInt(vals[0]);
1763 var dy = parseInt(vals[1]);
1764 switch(getElementTag(obj)){
1765 case 'text':
1766 case 'rect':
1767 case 'image':
1768 addAttributeVal(obj, "x", dx);
1769 addAttributeVal(obj, "y", dy);
1770 break;
1771 case 'circle':
1772 case 'ellipse':
1773 addAttributeVal(obj, "cx", dx);
1774 addAttributeVal(obj, "cy", dy);
1775 break;
1776
1777 case 'path':
1778 var path = obj.getAttribute("d");
1779 obj.setAttribute("d", updatePath(path, dx, dy));
1780 break;
1781 case 'line':
1782 var x1 = getAttributeVal(obj,"x1");
1783 var y1 = getAttributeVal(obj,"y1");
1784 var x2 = getAttributeVal(obj,"x2");
1785 var y2 = getAttributeVal(obj,"y2");
1786 obj.setAttribute("x1", x1+dx);
1787 obj.setAttribute("y1", y1+dy);
1788 obj.setAttribute("x2", x2+dx);
1789 obj.setAttribute("y2", y2+dy);
1790
1791 break;
1792 default:
1793 break;
1794 }
1795 obj.removeAttribute("transform");
1796 }
1797 }catch (e){
1798 }
1799 }
1800
1801 function moveSelectedRectangle(dx, dy){
1802 if(!svg_select) return;
1803 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1804 }
1805
1806 function updateSelectedRectangle(){
1807 if(!svg_select) return;
1808 if(selectedItems.length > 0){
1809 svg_select.setAttribute("visibility","visible;");
1810 }else{
1811 svg_select.setAttribute("visibility","hidden;");
1812 }
1813 }
1814
1815 function clearSelectedItems(){
1816 for(i in selectedItems) delete selectedItems[i];
1817 }
1818
1819 function onTouchMove(e){
1820 e.preventDefault();
1821 if (e.touches.length == 1){
1822 if(targetItem || selectedItems.length > 0){
1823 switch(modeSVG){
1824 case 'newPath':
1825 if(targetItem.tagName == 'path' ){
1826 var path = targetItem.getAttribute("d");
1827 path = path + ' '+ getPreviewX(e.touches[0].pageX) + ' '+ getPreviewY(e.touches[0].pageY) ;
1828 targetItem.setAttribute("d",path);
1829 }
1830 break;
1831 case 'newLine':
1832 if(targetItem.tagName == 'line' ){
1833 var x2 = getPreviewX(e.touches[0].pageX);
1834 var y2 = getPreviewY(e.touches[0].pageY);
1835 targetItem.setAttribute("x2",x2);
1836 targetItem.setAttribute("y2",y2);
1837 }
1838 break;
1839
1840 default:
1841 var dx = e.touches[0].pageX - sx;
1842 var dy = e.touches[0].pageY - sy;
1843
1844 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1845 var lx = getPreviewX(e.touches[0].pageX);
1846 var ly = getPreviewY(e.touches[0].pageY);
1847
1848 if(!lineEdit){
1849 var x1 = getAttributeVal(selectedItems[0],"x1");
1850 var y1 = getAttributeVal(selectedItems[0],"y1");
1851 var x2 = getAttributeVal(selectedItems[0],"x2");
1852 var y2 = getAttributeVal(selectedItems[0],"y2");
1853 var xc = (x1+x2)/2;
1854 var yc = (y1+y2)/2;
1855 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1856 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1857 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1858
1859 var minVal = Math.min(eS, Math.min(eC, eE));
1860 if(minVal == eS) lineEdit='start';
1861 else if(minVal == eE) lineEdit='end';
1862 else lineEdit='move';
1863 }
1864 if(lineEdit=='start'){
1865 selectedItems[0].setAttribute("x1",lx );
1866 selectedItems[0].setAttribute("y1",ly );
1867 setSelectBox();
1868 }else if(lineEdit == 'end'){
1869 selectedItems[0].setAttribute("x2",lx );
1870 selectedItems[0].setAttribute("y2",ly );
1871 setSelectBox();
1872 }else{
1873 selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1874 moveSelectedRectangle(dx, dy);
1875 }
1876 }else{
1877 for(var i=0; i<selectedItems.length;i++){
1878 selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1879 }
1880 moveSelectedRectangle(dx, dy);
1881 }
1882 break;
1883 }
1884 updateShowMenu();
1885 }else if(modeSVG == 'selector'){
1886 ex = e.touches[0].pageX;
1887 ey = e.touches[0].pageY;
1888 var x1=sx;
1889 var y1=sy;
1890 var x2=ex;
1891 var y2=ey;
1892
1893 if(sx > ex){ x1=ex; x2=sx; }
1894 if(sy > ey){ y1=ey; y2=sy; }
1895
1896 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1897 }
1898 }else if (e.touches.length == 2){
1899 var dx= e.touches[0].pageX-e.touches[1].pageX;
1900 var dy = e.touches[0].pageY-e.touches[1].pageY;
1901 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
1902
1903 if(th > 165 || th < 25) svg_scale_dir = 'x';
1904 else if(th > 65 && th < 115) svg_scale_dir = 'y';
1905 else svg_scale_dir = null;
1906 }
1907 }
1908
1909 function onTouchEnd(e){
1910 e.preventDefault();
1911
1912 for(var i=0; i<selectedItems.length;i++){
1913 updateTransform(selectedItems[i]);
1914 }
1915
1916 if(modeSVG == 'selector'){
1917 var x1 = getPreviewX(sx);
1918 var y1 = getPreviewY(sy);
1919 var x2 = getPreviewX(ex);
1920 var y2 = getPreviewY(ey);
1921 getSelectedObjects(x1, y1, x2, y2);
1922 }
1923
1924 updateSelectedRectangle();
1925 updateTransform(svg_select);
1926
1927 setSelectBox();
1928 updateShowMenu();
1929 var btn = document.getElementById('b_'+modeSVG);
1930 if(btn){
1931 btn.style.border="3px solid red";
1932 }
1933 lineEdit=null;
1934 }
1935
1936
1937 function onGestureStart(e){
1938 targetItem = selectedItems[0];
1939 if(targetItem){
1940 svg_wo = targetItem.getAttribute("width");
1941 svg_ho = targetItem.getAttribute("height");
1942 svg_ro = targetItem.getAttribute("r");
1943 svg_rxo = targetItem.getAttribute("rx");
1944 svg_ryo = targetItem.getAttribute("ry");
1945 svg_fsize = targetItem.getAttribute("font-size");
1946 }else{
1947 svg_wo = null;
1948 svg_ho = null;
1949 svg_ro = null;
1950 svg_rxo = null;
1951 svg_ryo = null;
1952 svg_fsize = null;
1953 }
1954 }
1955
1956 function onGestureChange(e){
1957 var scale = e.scale;
1958 var rotation = e.rotation;
1959
1960 if(targetItem){
1961 e.preventDefault();
1962 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
1963 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
1964 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
1965 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
1966 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
1967 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
1968
1969 updateShowMenu();
1970 }
1971 }
1972
1973 function onGestureEnd(e){
1974 // e.preventDefault();
1975 svg_wo = null;
1976 svg_ho = null;
1977 svg_ro = null;
1978 svg_rxo = null;
1979 svg_ryo = null;
1980 svg_fsize = null;
1981 }
1982
1983 function onTouchStartColor(e){
1984 if(e.touches.length == 1){
1985 var ele = e.touches[0].target;
1986 var color = ele.getAttribute("color-val");
1987 var color_sel = document.getElementById('color_sel');
1988 var fill_input = document.getElementById('svg_fill');
1989 var color_input = document.getElementById('svg_color');
1990 if(color) {
1991 for(var i=0;selectedItems.length; i++){
1992 selectedItems[i].setAttribute(color_sel.value, color);
1993 if(color_sel.value == 'fill'){
1994 fill_input.value=color;
1995 }else{
1996 color_input.value=color;
1997 }
1998 }
1999 }
2000 }
2001 }
2002 ///// For Safari
2003
2004 function onMouseDown2(e){
2005
2006 if(isChildById(e.target, 'svg_top')) {
2007 targetItem=e.target;
2008 sx=e.pageX;
2009 sy=e.pageY;
2010 setInnerHTML('popup', e.pageX+","+e.pageY);
2011
2012 }else{
2013 targetItem = null;
2014 }
2015
2016 return true;
2017 }
2018
2019 function onMouseDown(e){
2020 if(!isChildById(e.target, 'svg_top')) { return true; }
2021 sx=e.pageX;
2022 sy=e.pageY;
2023 ex=e.pageX;
2024 ey=e.pageY;
2025
2026 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
2027
2028 var x1=getPreviewX(sx-1);
2029 var y1=getPreviewY(sy-1);
2030 var x2=getPreviewX(sx+2);
2031 var y2=getPreviewY(sy+2);
2032
2033 getSelectedObjects(x1, y1, x2, y2);
2034
2035 if(selectedItems.length == 0){
2036 setSVGMode('selector');
2037
2038 }else if(selectedItems.length == 1){
2039
2040 targetItem=selectedItems[0];
2041 setSVGMode(getElementTag(targetItem));
2042
2043 }else{
2044
2045 setSVGMode('Group');
2046 }
2047 }else {
2048 if(selectedItems.length == 0){
2049 var fill=document.getElementById('svg_fill');
2050 var color=document.getElementById('svg_color');
2051 var L=document.getElementById('svg_stroke');
2052
2053 var x = getPreviewX(sx);
2054 var y = getPreviewY(sy);
2055
2056 switch(modeSVG){
2057 case 'text':
2058 var txt=document.getElementById('svg_text');
2059 var size=document.getElementById('svg_size');
2060 var y = y + parseInt(size.value)*0.8;
2061 if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
2062 break;
2063 case 'rect':
2064 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
2065 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2066 break;
2067 case 'circle':
2068 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
2069 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2070 break;
2071 case 'ellipse':
2072 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
2073 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
2074 break;
2075 case 'newPath':
2076 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
2077 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
2078 break;
2079 case 'newLine':
2080 var x2=x+1;
2081 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
2082 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
2083 break;
2084 case 'image':
2085 var attr = 'x='+x+',y='+y;
2086 var txt=document.getElementById('svg_text');
2087 var w=document.getElementById('svg_w');
2088 var h=document.getElementById('svg_h');
2089 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
2090 default:
2091 break;
2092 }
2093 if (targetItem){
2094 appendSVGObj(targetItem);
2095 selectedItems[0]=targetItem;
2096 }
2097 }else{
2098 var x1=getPreviewX(sx-1);
2099 var y1=getPreviewY(sy-1);
2100 var x2=getPreviewX(sx+2);
2101 var y2=getPreviewY(sy+2);
2102 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
2103 setSVGMode('selector');
2104 }
2105 }
2106
2107 }
2108 updateSelectedRectangle();
2109 }
2110
2111
2112 function onMouseMove(e){
2113 if(targetItem){
2114 addAttributeVal(targetItem, "x", e.pageX - sx );
2115 addAttributeVal(targetItem, "y", e.pageY - sy );
2116 addAttributeVal(targetItem, "cx", e.pageX - sx );
2117 addAttributeVal(targetItem, "cy", e.pageY - sy );
2118 }
2119 sx=e.pageX;
2120 sy=e.pageY;
2121 return true;
2122 }
2123
2124 function onMouseUp(e){
2125 targetItem = null;
2126 }
2127
2128 if(!navigator.userAgent.match("iPad")){
2129 document.onmousedown=onMouseDown;
2130 document.onmousemove=onMouseMove;
2131 document.onmouseup=onMouseUp;
2132 }
2133

Properties

Name Value
svn:executable *

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