Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (show annotations) (download) (as text)
Wed Jul 21 02:27:23 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 59380 byte(s)
fix preview's width & height
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 preview.style.width='800px';
811 // preview.style.height='600px';
812 preview.style.height='525px';
813 mkColorPalette();
814
815 var ele = toSVGElement(data, '100%','100%');
816
817 preview.appendChild(ele);
818
819 svg_top = document.getElementById('svg_top');
820 initSVGElementId(svg_top);
821 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
822 svg_select.setAttribute("id","svg_select");
823 appendSVGObj(svg_select);
824 }
825
826
827
828 function mkColorPalette(){
829 var palette = document.getElementById('color-palette');
830 if(!palette) return;
831 if(palette.innerHTML) return;
832
833 palette.innerHTML="";
834 palette.addEventListener("touchstart", onTouchStartColor, false);
835
836 palette.innerHTML="<select id=\"color_sel\"><option value=\"fill\">Fill</option><option value=\"stroke\">Color</option></select>";
837 for(var i=0; i<colors.length ;i++){
838 if(colors[i] == 'none')
839 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\">X</div>";
840 else
841 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\"> </div>";
842 }
843 }
844
845 ////// for SVG object
846 ////////////////
847 function updateSVGObjMenu(){
848 var res = "";
849 var tag = modeSVG;
850 if(selectedItems.length > 1) return res;
851 if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
852
853 switch(tag){
854 case 'text':
855 if(selectedItems[0]){
856 res += setSVGObjectProp(selectedItems[0]);
857 }else{
858 res += propSVGText("", 24, '#000000');
859 }
860 break;
861 case 'rect':
862 case 'circle':
863 case 'ellipse':
864 case 'newPath':
865 case 'newLine':
866 case 'path':
867 case 'line':
868 case 'polyline':
869 case 'polygon':
870 if(selectedItems[0]){
871 res += setSVGObjectProp(selectedItems[0]);
872 }else{
873 res += propSVGObj(tag+":", 1, '#000000', '#ffffff');
874 }
875 break;
876 case 'image':
877 if(selectedItems[0]){
878 res += setSVGObjectProp(selectedItems[0]);
879 }else{
880 res += propSVGImage("", 100, 100);
881 }
882 break;
883 default:
884 break;
885 }
886 return res;
887 }
888
889 function propSVGText(str, size, color){
890 if(!size) size = 24;
891 if(!color) color = '#000000';
892
893 var res = "Text:";
894 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\"/>";
895 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
896 res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
897 return res;
898 }
899
900 function propSVGObj(type, stroke, color, fill){
901 var res = type;
902 if(!stroke) stroke = 1;
903 if(!color) color = '#000000';
904 if(!fill) fill = '#ffffff';
905 res += "Fill:<input type=\"text\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
906 res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
907 res += "L:<input type=\"text\" id=\"svg_stroke\" value=\""+stroke+"\" size=\"2\"/>";
908 return res;
909 }
910
911 function propSVGLine(type, stroke, color, fill, style){
912 var res = propSVGObj(type, stroke, color, fill);
913 if(style==null) style="";
914 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
915 res += "Arrow:";
916 if(hasArrow('start')){
917 res += "<button class=\"tool\" onClick=\"removeLeftArrow();\"><img src=\"images/normal.png\" /></button>";
918 }else{
919 res += "<button class=\"tool\" onClick=\"setLeftArrow();\"><img src=\"images/larrow.png\" /></button>";
920 }
921 if(hasArrow('end')){
922 res += "<button class=\"tool\" onClick=\"removeRightArrow();\"><img src=\"images/normal.png\" /></button>";
923 }else{
924 res += "<button class=\"tool\" onClick=\"setRightArrow();\"><img src=\"images/rarrow.png\" /></button>";
925 }
926 return res;
927 }
928
929 function propSVGImage(str, w, h){
930 var res = "image:";
931 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
932 res += "Width:<input type=\"text\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
933 res += "Height:<input type=\"text\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
934 return res;
935 }
936
937 function setSVGMode(m){
938 var btn = document.getElementById('b_'+modeSVG);
939 if(btn){ btn.style.border="1px solid black"; }
940
941 modeSVG = m;
942 updateShowMenu();
943
944 if(m == 'selector'){
945 targetItem=null;
946 clearSelectedItems();
947 }
948 var btn = document.getElementById('b_'+modeSVG);
949 if(btn){ btn.style.border="3px solid red"; }
950 }
951
952
953 function toSVGElement(str, w, h){
954 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
955 var parser = new DOMParser();
956 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
957 var footer = "</svg:svg>";
958 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
959 var xmlRoot = xmlDoc.documentElement;
960 var ele = document.importNode(xmlRoot,true);
961
962 return ele;
963 }
964
965 function createSVGElement(tag, id){
966 if(id=='new'){
967 id = 'svg_'+nextId;
968 nextId++;
969 }
970 var ele= document.createElementNS(svg_ns, tag);
971 ele.setAttribute("id", id);
972 return ele;
973 }
974
975 function defSVGElement(node){
976 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
977 if(!svg_defs){
978 svg_defs = createSVGElement('defs', 'svg_defs');
979 svg_top.insertBefore(svg_defs, svg_top.firstChild);
980 }
981 if(node) svg_defs.appendChild(node);
982 }
983
984 function initSVGElementId(svg_top){
985 nextId = 1;
986 checkSVGElementId(svg_top);
987 appendSVGElementId(svg_top);
988 }
989
990 function checkSVGElementId(top){
991 var objs = top.childNodes;
992
993 for(var i=0; i<objs.length ;i++){
994 if(objs[i].tagName){
995 var id = objs[i].getAttribute("id");
996
997 if(id && id.match(/svg_[0-9]+/i)){
998 var n = parseInt(RegExp.lastMatch.substr(4));
999 if(n >= nextId){
1000 nextId = n+1;
1001 }
1002
1003 }
1004 checkSVGElementId(objs[i]);
1005 }
1006 }
1007 }
1008
1009 function appendSVGElementId(top){
1010 var objs = top.childNodes;
1011
1012 for(var i=0; i<objs.length ;i++){
1013 if(objs[i].tagName){
1014 var id = objs[i].getAttribute("id");
1015 if(!id){
1016 objs[i].setAttribute("id", "svg_"+nextId);
1017 nextId++;
1018 }
1019 }
1020 appendSVGElementId(objs[i]);
1021 }
1022 }
1023
1024 function selectedRectangle(x, y, ex, ey){
1025 if(!svg_select) return null;
1026
1027 svg_select.setAttribute("x",x);
1028 svg_select.setAttribute("y",y);
1029 svg_select.setAttribute("width", ex-x);
1030 svg_select.setAttribute("height", ey-y);
1031 svg_select.setAttribute("visibility", "visible");
1032 return svg_select;
1033 }
1034
1035
1036 function setAttributes(obj, attrs){
1037 var attr_array = attrs.split(',');
1038
1039 for (var i=0; i<attr_array.length;i++){
1040 var x = attr_array[i].split('=');
1041 if(x.length == 2){
1042 obj.setAttribute(x[0], x[1]);
1043 }
1044 }
1045 }
1046
1047 function createSVGObj(tag, attrs, fill, color, lw){
1048 var ele = createSVGElement(tag, 'new');
1049 setAttributes(ele, attrs);
1050 if (fill) ele.setAttribute('fill', fill);
1051 if (color) ele.setAttribute('stroke', color);
1052 if(lw) ele.setAttribute('stroke-width', lw);
1053
1054 return ele;
1055 }
1056
1057 function createSVGText(txt, x, y, size, color){
1058 var ele = createSVGElement('text', 'new');
1059
1060 ele.setAttribute('x', x);
1061 ele.setAttribute('y', y);
1062 ele.setAttribute('font-size', size);
1063 ele.setAttribute('fill', color);
1064 ele.textContent=txt;
1065
1066 return ele;
1067 }
1068
1069 function createSVGImage(fname, width, height, attrs){
1070 var ele = createSVGElement('image', 'new');
1071 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1072 ele.setAttribute('width', width);
1073 ele.setAttribute('height', height);
1074 setAttributes(ele, attrs);
1075
1076 return ele;
1077 }
1078
1079 function createSVGMarker(pid, id, child){
1080 var parent = document.getElementById(pid);
1081 if(!parent) return;
1082 var ele = createSVGElement('marker', pid+'_'+id);
1083 ele.appendChild(child);
1084 return ele;
1085 }
1086
1087 function setLeftArrow(){
1088 if( selectedItems.length == 1 ){
1089 setArrow(selectedItems[0], 'start', '');
1090 }
1091 }
1092
1093 function setRightArrow(){
1094 if( selectedItems.length == 1 ){
1095 setArrow(selectedItems[0], 'end', '');
1096 }
1097 }
1098
1099 function removeLeftArrow(){
1100 if( selectedItems.length == 1 ){
1101 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1102 var pid = selectedItems[0].getAttribute('id');
1103 var marker = document.getElementById(pid+'_startarrow');
1104 svg_defs.removeChild(marker);
1105 selectedItems[0].removeAttribute('marker-start');
1106 }
1107 }
1108
1109 function removeRightArrow(){
1110 if( selectedItems.length == 1 ){
1111 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1112 var pid = selectedItems[0].getAttribute('id');
1113 var marker = document.getElementById(pid+'_endarrow');
1114 svg_defs.removeChild(marker);
1115 selectedItems[0].removeAttribute('marker-end');
1116 }
1117 }
1118
1119 function hasArrow(pos){
1120 var pobj = selectedItems[0];
1121 if(!pobj) return false;
1122 var pid = pobj.getAttribute('id');
1123 var marker = document.getElementById(pid+'_'+pos+'arrow');
1124 if(marker) return true;
1125 return false;
1126 }
1127
1128 function getArrowMarker(obj,pos){
1129 if(!obj) return false;
1130 var pid = obj.getAttribute('id');
1131 var marker = document.getElementById(pid+'_'+pos+'arrow');
1132 return false;
1133 }
1134
1135 function setArrow(pobj, pos, type){
1136 if(!pobj) return;
1137 var pid = pobj.getAttribute('id');
1138 var marker = document.getElementById(pid+'_'+pos+'arrow');
1139 if(marker) return;
1140
1141 var obj = createSVGElement('path', 'new');
1142
1143 var refX = 0;
1144 var refY = 0;
1145
1146 switch(pos){
1147 case 'start':
1148 refX=10;
1149 refY=10;
1150 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1151 break;
1152 case 'end':
1153 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1154 refX= 10;
1155 refY=10;
1156 break;
1157 default:
1158 return;
1159 }
1160
1161 marker = createSVGMarker(pid, pos+'arrow' , obj);
1162 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1163
1164 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1165
1166 defSVGElement(marker);
1167 var mid = "url(#"+marker.getAttribute("id")+")";
1168 var mattr = "marker-"+pos;
1169 pobj.setAttribute(mattr, mid);
1170 }
1171
1172 function appendSVGObj(obj){
1173 var svg_top = document.getElementById('svg_top');
1174 if(!svg_top) return;
1175
1176 svg_top.appendChild(obj);
1177 }
1178
1179 function isChildById(element, id) {
1180 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1181 else if (element.parentNode.id == id) return true;
1182 else return isChildById(element.parentNode, id);
1183 }
1184
1185 /////////////////////// Formatting SVG DOM
1186 function escapeHTML(text) {
1187 return text.replace( /[<>"&]/g,
1188 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1189 );
1190 };
1191
1192 function formatTag(ele){
1193 var str="";
1194 if(ele.nodeType == 1){
1195 var tag_a = ele.tagName.split(':');
1196 var tag;
1197 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1198
1199 str += "<"+tag;
1200 var attrs = ele.attributes;
1201 for(var i=0; i<attrs.length; i++){
1202 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1203 }
1204 var cn = ele.childNodes;
1205 if(cn.length > 0){
1206 str +=">\n";
1207 for(var i=0; i<cn.length; i++){
1208 var tmp = trim(formatTag(cn[i]));
1209 if(tmp) str += " "+tmp+"\n";
1210 }
1211 str += "</"+tag+">";
1212 }else{
1213 str +=" />";
1214 }
1215 return str;
1216 }else if(ele.nodeType==3){
1217 return ele.textContent;
1218 }
1219 }
1220
1221 function getSVGContent(){
1222 if(!svg_top) return "";
1223
1224 var str = "";
1225 var elements = svg_top.childNodes;
1226 for(var i=0; i<elements.length; i++){
1227 if(elements[i] != svg_select){
1228 var tmp = trim(formatTag(elements[i]));
1229 if(tmp) str += tmp + '\n';
1230 }
1231 }
1232 return str;
1233 }
1234
1235 function trim(str){
1236 return str.replace(/(^\s+)|(\s+$)/g, "");
1237 }
1238
1239 /////// Access Server
1240 function newXMLRequest(){
1241 if(this.XMLHttpRequest){
1242 return new XMLHttpRequest();
1243 }else {
1244 return new ActiveXObject("Microsoft.XMLHTTP");
1245 }
1246 }
1247
1248 function createRequestData(data){
1249 var str="filetype=svg";
1250 for (var i in data){
1251 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1252 }
1253 return str;
1254 }
1255
1256 function postRequest(url, data, func){
1257 var postData=createRequestData(data);
1258 var obj=newXMLRequest();
1259
1260 obj.onreadystatechange = function(){
1261 if (obj.readyState == 4 && obj.status == 200){
1262 func(obj.responseText);
1263 }
1264 }
1265 obj.open("POST", url, true);
1266 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1267 obj.send(postData);
1268 }
1269
1270 function commnadFinishAlert(s){
1271 alert(s);
1272 }
1273
1274 function uploadFileData(transaction, results){
1275 var data = results.rows.item(0);
1276 var updata = new Array(0);
1277 updata['name']= data['name'];
1278 updata['datalob'] = data['datablob'];
1279 updata['cmd'] = 'upload'
1280
1281 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1282 }
1283
1284 function uploadFile(name){
1285 getFile(name, 'uploadFileData');
1286 }
1287
1288 function getRemoteFileList(){
1289 var data=new Array();
1290 data['name'] = "SVG";
1291 data['cmd'] = "list";
1292 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1293 }
1294
1295 function previewRemoteFile(content){
1296 previewFile(content);
1297 setMode('Preview');
1298 }
1299
1300 function getRemoteFile(name){
1301 var data=new Array();
1302 data['name'] = name;
1303 data['cmd'] = "get";
1304 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1305 }
1306
1307 function saveRemoteFile(content){
1308 var datadiv = document.getElementById('tempdata');
1309 var fname = datadiv.getAttribute('lfname');
1310 saveContentWithFilename(fname, content);
1311 }
1312
1313 function downloadFile(name){
1314 var data=new Array();
1315 data['name'] = name;
1316 data['cmd'] = "get";
1317 var datadiv = document.getElementById('tempdata');
1318 datadiv.setAttribute('lfname', name);
1319 postRequest(MgrPath+iSlideMgr, data, saveRemoteFile);
1320 }
1321
1322 function showRemoteFile(name){
1323 getRemoteFile(name);
1324 }
1325
1326 function downloadToFile(name){
1327 var downloadForm = "";
1328 downloadForm += "<form action=\"iSlideManager.php\" method=\"post\">";
1329 downloadForm += "<input type=\"hidden\" name=\"cmd\" value=\"download\">";
1330 downloadForm += "<input type=\"hidden\" name=\"name\" value=\""+name+"\">";
1331 downloadForm += "<input type=\"hidden\" name=\"filetype\" value=\"svg\">";
1332 downloadForm += "<input type=\"submit\">";
1333 downloadForm += "</form>";
1334
1335 var cmdForm = document.getElementById('cmdForm');
1336 cmdForm.innerHTML = downloadForm;
1337 cmdForm.firstChild.submit();
1338 }
1339
1340 //////// Event Handler
1341 function setInnerHTML(id, val){
1342 var itm=document.getElementById(id);
1343 if(itm) itm.innerHTML=val;
1344 }
1345
1346 function popupInfo(val){
1347 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1348 str += val;
1349 setInnerHTML('popup', str);
1350 showItemById('popup');
1351 }
1352
1353 function addAttributeVal(obj, itm, dv){
1354 if(obj.hasAttribute(itm)){
1355 var x = parseInt(obj.getAttribute(itm));
1356 x = x + dv;
1357 obj.setAttribute(itm, x)
1358 }
1359 }
1360
1361 function showSVGSource(){
1362 var str = getSVGContent();
1363 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1364 escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1365 // escstr += "<pre>"+escapeHTML(str)+"</pre>";
1366 escstr += "<textarea cols=\"130\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1367 setInnerHTML('popup', escstr);
1368 showItemById('popup');
1369 }
1370
1371
1372 function getElementTag(obj){
1373 if (!obj) return null;
1374 var tag = obj.tagName.split(':');
1375 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1376 return tag[0];
1377 }
1378
1379 function setSVGObjectProp(obj){
1380 var tag = getElementTag(obj);
1381 var res ="";
1382 switch(tag){
1383 case 'text':
1384 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1385 break;
1386 case 'rect':
1387 case 'circle':
1388 case 'ellipse':
1389 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1390 break;
1391 case 'path':
1392 case 'line':
1393 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1394 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1395 break;
1396 case 'image':
1397 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"));
1398 break;
1399 default:
1400 break;
1401 }
1402 if(res != ""){
1403 res += "<button onClick=\"updateSVGObj();\">OK</button>";
1404 res += "<button onClick=\"delSVGObj();\">Del</button>";
1405 }
1406
1407 return res
1408 }
1409
1410 function updateSVGObj(){
1411 if(selectedItems.length != 1) return;
1412 var obj = selectedItems[0];
1413 var tag = getElementTag(obj);
1414 var res ="";
1415 switch(tag){
1416 case 'text':
1417 var txt=document.getElementById('svg_text');
1418 var color=document.getElementById('svg_color');
1419 var size=document.getElementById('svg_size');
1420 obj.textContent = txt.value;
1421 obj.setAttribute("fill", color.value);
1422 obj.setAttribute("font-size", size.value);
1423 break;
1424 case 'rect':
1425 case 'circle':
1426 case 'ellipse':
1427 var fill=document.getElementById('svg_fill');
1428 var color=document.getElementById('svg_color');
1429 var L=document.getElementById('svg_stroke');
1430 obj.setAttribute("fill", fill.value);
1431 obj.setAttribute("stroke", color.value);
1432 obj.setAttribute("stroke-width", L.value);
1433 break;
1434 case 'path':
1435 case 'line':
1436 var fill=document.getElementById('svg_fill');
1437 var color=document.getElementById('svg_color');
1438 var L=document.getElementById('svg_stroke');
1439 var dash=document.getElementById('svg_stroke_type');
1440 obj.setAttribute("fill", fill.value);
1441 obj.setAttribute("stroke", color.value);
1442 obj.setAttribute("stroke-width", L.value);
1443 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1444 var id = obj.getAttribute("id");
1445 var marker = document.getElementById(id+'_startarrow');
1446 if(marker) marker.setAttribute("fill", color.value);
1447 var marker = document.getElementById(id+'_endarrow');
1448 if(marker) marker.setAttribute("fill", color.value);
1449 break;
1450 case 'image':
1451 var fname=document.getElementById('svg_text');
1452 var w=document.getElementById('svg_w');
1453 var h=document.getElementById('svg_h');
1454 obj.setAttribute("xlink:href", fname.value);
1455 obj.setAttribute("width", w.value);
1456 obj.setAttribute("height", h.value);
1457 break;
1458 default:
1459 break;
1460 }
1461
1462 }
1463
1464 function delSVGObj(){
1465 if(selectedItems.length != 1) return;
1466 var obj = selectedItems[0];
1467
1468 if(!svg_top) return;
1469 svg_top.removeChild(obj);
1470 svg_select.setAttribute("visibility","hidden");
1471 }
1472
1473 ///// For MobileSafari
1474 function getPreviewX(x){ return x - preview.offsetLeft; }
1475 function getPreviewY(y){ return y - preview.offsetTop; }
1476
1477 function calcDit(x1, y1, x2, y2){
1478 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1479 }
1480
1481 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1482 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1483 }
1484
1485 function getAttributeVal(obj, name){
1486 try{
1487 return parseInt(obj.getAttribute(name));
1488 }catch(e){ return 0; }
1489 }
1490
1491 function checkIntersection(obj, x, y, ex, ey){
1492 if(!obj) return false;
1493 var res = true;
1494 var bbox = obj.getBBox();
1495 var ox = bbox.x;
1496 var oy = bbox.y;
1497 var oex = bbox.x+bbox.width;
1498 var oey = bbox.y+bbox.height;
1499 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1500
1501 var tag = getElementTag(obj);
1502 switch(tag){
1503 case 'circle':
1504 case 'ellipse':
1505 var cx = getAttributeVal(obj,"cx");
1506 var cy = getAttributeVal(obj,"cy");
1507 var rx = getAttributeVal(obj,"r");
1508 var ry = rx;
1509 if(!rx){
1510 var rx = getAttributeVal(obj,"rx");
1511 var ry = getAttributeVal(obj,"ry");
1512 }
1513
1514 if(res){
1515 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1516 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1517 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1518 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1519 }
1520 break;
1521 case 'path':
1522 var d = obj.getAttribute("d");
1523 var p = getPoints(d);
1524 for(var i=0;i<p.length;i++){
1525 var ox=p[i][0];
1526 var oy=p[i][1];
1527 if(x < ox && ox < ex && y < oy && oy < ey) {
1528 return true;
1529 }
1530 }
1531 return false;
1532 break;
1533 case 'line':
1534 var x1 = getAttributeVal(obj,"x1");
1535 var y1 = getAttributeVal(obj,"y1");
1536 var x2 = getAttributeVal(obj,"x2");
1537 var y2 = getAttributeVal(obj,"y2");
1538 var d = (y2-y1)/(x2-x1);
1539
1540 if(res){
1541 var xx = Math.abs(x2-x1);
1542 var sign = 1;
1543 if(x2-x1 < 0){ sign = -1; }
1544 for(var i=0; i < xx; i++){
1545 var nx = i*sign + x1;
1546 var ny = d * i*sign + y1;
1547 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1548 }
1549 }
1550 return false;
1551
1552 return res;
1553 break;
1554 case 'text':
1555 case 'rect':
1556 case 'polygon':
1557 case 'polyline':
1558 case 'image':
1559 break;
1560 default:
1561 res=false;
1562 break;
1563 }
1564 return res;
1565 }
1566
1567 function getBoundingBox(obj){
1568 var res = new Array(4);
1569 var bbox = obj.getBBox();
1570 res[0] = bbox.x-1;
1571 res[1] = bbox.y-1;
1572 res[2] = bbox.x+bbox.width+2;
1573 res[3] = bbox.y+bbox.height+2;
1574 return res;
1575 }
1576
1577 function setSelectBox(){
1578 if(!svg_select) return;
1579
1580 if(selectedItems.length == 0){
1581 svg_select.setAttribute("visibility","hidden");
1582 return;
1583 }
1584
1585 var bbox = new Array(4);
1586 bbox[0] = 1000;
1587 bbox[1] = 1000;
1588 bbox[2] = 0;
1589 bbox[3] = 0;
1590
1591 for(var i=0;i<selectedItems.length;i++){
1592 var bp = getBoundingBox(selectedItems[i]);
1593 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1594 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1595 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1596 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1597 }
1598 svg_select.setAttribute("x", bbox[0]);
1599 svg_select.setAttribute("y", bbox[1]);
1600 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1601 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1602 svg_select.setAttribute("visibility","visible;");
1603 }
1604
1605 function getSelectedObjects(x1, y1, x2, y2){
1606 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1607 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1608
1609 var val="";
1610 if(svg_top){
1611 var val ="";
1612 var objs = svg_top.childNodes;
1613 selectedItems = new Array();
1614 for(var i=0; i<objs.length;i++){
1615 if(objs[i].tagName){
1616
1617 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1618 selectedItems.push(objs[i]);
1619 }
1620 val += objs[i].tagName+" ";
1621 }
1622 }
1623 }
1624 setSelectBox();
1625 }
1626
1627 function onTouchStart(e){
1628 //e.preventDefault();
1629 sx=e.touches[0].pageX;
1630 sy=e.touches[0].pageY;
1631 ex=e.touches[0].pageX;
1632 ey=e.touches[0].pageY;
1633
1634 if (e.touches.length == 1){
1635 onTouchStartCore();
1636 }
1637
1638 updateSelectedRectangle();
1639 }
1640
1641 function onTouchStartCore(){
1642 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1643 var x1=getPreviewX(sx-1);
1644 var y1=getPreviewY(sy-1);
1645 var x2=getPreviewX(sx+2);
1646 var y2=getPreviewY(sy+2);
1647 getSelectedObjects(x1, y1, x2, y2);
1648
1649 if(selectedItems.length == 0){
1650 setSVGMode('selector');
1651 }else if(selectedItems.length == 1){
1652 targetItem=selectedItems[0];
1653 setSVGMode(getElementTag(targetItem));
1654 }else{
1655 setSVGMode('Group');
1656 }
1657 }else { // CreateMode
1658 if(selectedItems.length == 0){
1659
1660 var fill=document.getElementById('svg_fill');
1661 var color=document.getElementById('svg_color');
1662 var L=document.getElementById('svg_stroke');
1663
1664 var x = getPreviewX(sx);
1665 var y = getPreviewY(sy);
1666
1667 switch(modeSVG){
1668 case 'text':
1669 var txt=document.getElementById('svg_text');
1670 var size=document.getElementById('svg_size');
1671 var y = y + parseInt(size.value)*0.8;
1672 if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1673 break;
1674 case 'rect':
1675 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1676 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1677 break;
1678 case 'circle':
1679 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1680 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1681 break;
1682 case 'ellipse':
1683 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1684 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1685 break;
1686 case 'newPath':
1687 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1688 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1689 break;
1690 case 'newLine':
1691 var x2=x+1;
1692 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1693 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1694 break;
1695 case 'image':
1696 var attr = 'x='+x+',y='+y;
1697 var txt=document.getElementById('svg_text');
1698 var w=document.getElementById('svg_w');
1699 var h=document.getElementById('svg_h');
1700 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1701 default:
1702 break;
1703 }
1704 if (targetItem){
1705 appendSVGObj(targetItem);
1706 selectedItems[0]=targetItem;
1707 }
1708 }else{
1709 var x1=getPreviewX(sx-1);
1710 var y1=getPreviewY(sy-1);
1711 var x2=getPreviewX(sx+2);
1712 var y2=getPreviewY(sy+2);
1713 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1714 setSVGMode('selector');
1715 }
1716 }
1717 }
1718 }
1719
1720 function getPoints(d){
1721 var p = d.split(' ');
1722 var res = new Array();
1723 var isx=true;
1724 var x, y;
1725 for(var i=0; i<p.length;i++){
1726 if(p[i].match('[MLHVCSQTA]','i')){
1727 }else{
1728 if(isx){
1729 x = parseInt(p[i]);
1730 }else{
1731 y = parseInt(p[i]);
1732 res.push(new Array(x, y));
1733 }
1734 isx = !isx;
1735 }
1736 }
1737 return res;
1738 }
1739
1740 function updatePath(d, x, y){
1741 var p = d.split(' ');
1742 var res = "";
1743 var isx=true;
1744 var val;
1745 for(var i=0; i<p.length;i++){
1746 if(p[i].match('[MLHVCSQTA]','i')){
1747 res += ' '+p[i];
1748 }else{
1749 if(isx){
1750 val = parseInt(p[i])+x;
1751 }else{
1752 val = parseInt(p[i])+y;
1753 }
1754
1755 res += ' '+ val;
1756 isx = !isx;
1757 }
1758 }
1759 return trim(res);
1760 }
1761
1762 function updateTransform(obj){
1763 try{
1764 var trans = obj.getAttribute("transform");
1765 if(!trans) return;
1766 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1767 var str = RegExp.lastMatch;
1768 var vals = str.substr(10,str.length-11).split(',') ;
1769 var dx = parseInt(vals[0]);
1770 var dy = parseInt(vals[1]);
1771 switch(getElementTag(obj)){
1772 case 'text':
1773 case 'rect':
1774 case 'image':
1775 addAttributeVal(obj, "x", dx);
1776 addAttributeVal(obj, "y", dy);
1777 break;
1778 case 'circle':
1779 case 'ellipse':
1780 addAttributeVal(obj, "cx", dx);
1781 addAttributeVal(obj, "cy", dy);
1782 break;
1783
1784 case 'path':
1785 var path = obj.getAttribute("d");
1786 obj.setAttribute("d", updatePath(path, dx, dy));
1787 break;
1788 case 'line':
1789 var x1 = getAttributeVal(obj,"x1");
1790 var y1 = getAttributeVal(obj,"y1");
1791 var x2 = getAttributeVal(obj,"x2");
1792 var y2 = getAttributeVal(obj,"y2");
1793 obj.setAttribute("x1", x1+dx);
1794 obj.setAttribute("y1", y1+dy);
1795 obj.setAttribute("x2", x2+dx);
1796 obj.setAttribute("y2", y2+dy);
1797
1798 break;
1799 default:
1800 break;
1801 }
1802 obj.removeAttribute("transform");
1803 }
1804 }catch (e){
1805 }
1806 }
1807
1808 function moveSelectedRectangle(dx, dy){
1809 if(!svg_select) return;
1810 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1811 }
1812
1813 function updateSelectedRectangle(){
1814 if(!svg_select) return;
1815 if(selectedItems.length > 0){
1816 svg_select.setAttribute("visibility","visible;");
1817 }else{
1818 svg_select.setAttribute("visibility","hidden;");
1819 }
1820 }
1821
1822 function clearSelectedItems(){
1823 for(i in selectedItems) delete selectedItems[i];
1824 }
1825
1826 function onTouchMove(e){
1827 e.preventDefault();
1828
1829 if (e.touches.length == 1){
1830 onTouchMoveCode1(e.touches[0].pageX, e.touches[0].pageY);
1831 }else if (e.touches.length == 2){
1832 var dx = e.touches[0].pageX-e.touches[1].pageX;
1833 var dy = e.touches[0].pageY-e.touches[1].pageY;
1834 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
1835
1836 if(th > 165 || th < 25) svg_scale_dir = 'x';
1837 else if(th > 65 && th < 115) svg_scale_dir = 'y';
1838 else svg_scale_dir = null;
1839 }
1840 }
1841
1842 function onTouchMoveCode1(pageX, pageY){
1843 if(targetItem || selectedItems.length > 0){
1844 switch(modeSVG){
1845 case 'newPath':
1846 if(targetItem.tagName == 'path' ){
1847 var path = targetItem.getAttribute("d");
1848 path = path + ' '+ getPreviewX(pageX) + ' '+ getPreviewY(pageY) ;
1849 targetItem.setAttribute("d",path);
1850 }
1851 break;
1852 case 'newLine':
1853 if(targetItem.tagName == 'line' ){
1854 var x2 = getPreviewX(pageX);
1855 var y2 = getPreviewY(pageY);
1856 targetItem.setAttribute("x2",x2);
1857 targetItem.setAttribute("y2",y2);
1858 }
1859 break;
1860
1861 default:
1862 var dx = pageX - sx;
1863 var dy = pageY - sy;
1864
1865 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1866 var lx = getPreviewX(pageX);
1867 var ly = getPreviewY(pageY);
1868
1869 if(!lineEdit){
1870 var x1 = getAttributeVal(selectedItems[0],"x1");
1871 var y1 = getAttributeVal(selectedItems[0],"y1");
1872 var x2 = getAttributeVal(selectedItems[0],"x2");
1873 var y2 = getAttributeVal(selectedItems[0],"y2");
1874 var xc = (x1+x2)/2;
1875 var yc = (y1+y2)/2;
1876 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1877 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1878 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1879
1880 var minVal = Math.min(eS, Math.min(eC, eE));
1881 if(minVal == eS) lineEdit='start';
1882 else if(minVal == eE) lineEdit='end';
1883 else lineEdit='move';
1884 }
1885 if(lineEdit=='start'){
1886 selectedItems[0].setAttribute("x1",lx );
1887 selectedItems[0].setAttribute("y1",ly );
1888 setSelectBox();
1889 }else if(lineEdit == 'end'){
1890 selectedItems[0].setAttribute("x2",lx );
1891 selectedItems[0].setAttribute("y2",ly );
1892 setSelectBox();
1893 }else{
1894 selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1895 moveSelectedRectangle(dx, dy);
1896 }
1897 }else{
1898 for(var i=0; i<selectedItems.length;i++){
1899 if(selectedItems[i]) selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1900 }
1901 moveSelectedRectangle(dx, dy);
1902 }
1903 break;
1904 }
1905 updateShowMenu();
1906 }else if(modeSVG == 'selector'){
1907 ex = pageX;
1908 ey = pageY;
1909 var x1=sx;
1910 var y1=sy;
1911 var x2=ex;
1912 var y2=ey;
1913
1914 if(sx > ex){ x1=ex; x2=sx; }
1915 if(sy > ey){ y1=ey; y2=sy; }
1916
1917 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1918 }
1919 }
1920
1921 function onTouchEnd(e){
1922 e.preventDefault();
1923
1924 for(var i=0; i<selectedItems.length;i++){
1925 updateTransform(selectedItems[i]);
1926 }
1927
1928 if(modeSVG == 'selector'){
1929 var x1 = getPreviewX(sx);
1930 var y1 = getPreviewY(sy);
1931 var x2 = getPreviewX(ex);
1932 var y2 = getPreviewY(ey);
1933 getSelectedObjects(x1, y1, x2, y2);
1934 }
1935
1936 updateSelectedRectangle();
1937 updateTransform(svg_select);
1938
1939 setSelectBox();
1940 updateShowMenu();
1941 var btn = document.getElementById('b_'+modeSVG);
1942 if(btn){
1943 btn.style.border="3px solid red";
1944 }
1945 lineEdit=null;
1946 }
1947
1948
1949 function onGestureStart(e){
1950 targetItem = selectedItems[0];
1951 if(targetItem){
1952 svg_wo = targetItem.getAttribute("width");
1953 svg_ho = targetItem.getAttribute("height");
1954 svg_ro = targetItem.getAttribute("r");
1955 svg_rxo = targetItem.getAttribute("rx");
1956 svg_ryo = targetItem.getAttribute("ry");
1957 svg_fsize = targetItem.getAttribute("font-size");
1958 }else{
1959 svg_wo = null;
1960 svg_ho = null;
1961 svg_ro = null;
1962 svg_rxo = null;
1963 svg_ryo = null;
1964 svg_fsize = null;
1965 }
1966 }
1967
1968 function onGestureChange(e){
1969 var scale = e.scale;
1970 var rotation = e.rotation;
1971
1972 if(targetItem){
1973 e.preventDefault();
1974 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
1975 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
1976 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
1977 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
1978 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
1979 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
1980
1981 updateShowMenu();
1982 }
1983 }
1984
1985 function onGestureEnd(e){
1986 // e.preventDefault();
1987 svg_wo = null;
1988 svg_ho = null;
1989 svg_ro = null;
1990 svg_rxo = null;
1991 svg_ryo = null;
1992 svg_fsize = null;
1993 }
1994
1995 function onTouchStartColor(e){
1996 if(e.touches.length == 1){
1997 var ele = e.touches[0].target;
1998 var color = ele.getAttribute("color-val");
1999 var color_sel = document.getElementById('color_sel');
2000 var fill_input = document.getElementById('svg_fill');
2001 var color_input = document.getElementById('svg_color');
2002 if(color) {
2003 for(var i=0;selectedItems.length; i++){
2004 selectedItems[i].setAttribute(color_sel.value, color);
2005 if(color_sel.value == 'fill'){
2006 fill_input.value=color;
2007 }else{
2008 color_input.value=color;
2009 }
2010 }
2011 }
2012 }
2013 }
2014 ///// For Safari
2015 var mouse_state=0;
2016
2017 function onMouseDown(e){
2018 mouse_state=e.which;
2019
2020 sx=e.pageX;
2021 sy=e.pageY;
2022 x=e.pageX;
2023 ey=e.pageY;
2024
2025 if(isChildById(e.target, 'preview') || e.target.id == 'preview') {
2026 onTouchStartCore();
2027 updateSelectedRectangle();
2028 return false;
2029 }else if(isChildById(e.target, 'color-palette') && e.target.tagName == 'DIV'){
2030 var ele = e.target;
2031 var color = ele.getAttribute("color-val");
2032 var color_sel = document.getElementById('color_sel');
2033 var fill_input = document.getElementById('svg_fill');
2034 var color_input = document.getElementById('svg_color');
2035 if(color) {
2036 for(var i=0;i < selectedItems.length; i++){
2037 try{
2038 selectedItems[i].setAttribute(color_sel.value, color);
2039 if(color_sel.value == 'fill'){ fill_input.value=color; }
2040 else{ color_input.value=color; }
2041 }catch(err){}
2042 }
2043 }
2044 return false;
2045 }
2046 return true;
2047 }
2048
2049
2050 function onMouseMove(e){
2051 if(mouse_state != 1) return true;
2052 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2053
2054 onTouchMoveCode1(e.pageX, e.pageY);
2055
2056 // sx=e.pageX;
2057 // sy=e.pageY;
2058 return false;
2059 }
2060
2061 function onMouseUp(e){
2062 mouse_state = 0;
2063 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2064
2065 for(var i=0; i<selectedItems.length;i++){
2066 updateTransform(selectedItems[i]);
2067 }
2068
2069 if(modeSVG == 'selector'){
2070 var x1 = getPreviewX(sx);
2071 var y1 = getPreviewY(sy);
2072 var x2 = getPreviewX(ex);
2073 var y2 = getPreviewY(ey);
2074 getSelectedObjects(x1, y1, x2, y2);
2075 }
2076
2077 updateSelectedRectangle();
2078 updateTransform(svg_select);
2079
2080 setSelectBox();
2081 updateShowMenu();
2082 var btn = document.getElementById('b_'+modeSVG);
2083 if(btn){
2084 btn.style.border="3px solid red";
2085 }
2086 lineEdit=null;
2087
2088 }
2089
2090 if(!navigator.userAgent.match("iPad")){
2091 document.onmousedown=onMouseDown;
2092 document.onmousemove=onMouseMove;
2093 document.onmouseup=onMouseUp;
2094 }
2095

Properties

Name Value
svn:executable *

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