Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 41 - (show annotations) (download) (as text)
Mon Jul 26 08:39:09 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 72733 byte(s)
Rotate Lock append
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 var systemDB;
16 var currentMode;
17 var editarea_w=80;
18 var editarea_h=10;
19 var MainTitle="Simple SVG Editor";
20
21 var preview=null;
22 var targetItem=null;
23 var selectedItems=new Array();
24 var sx=0;
25 var sy=0;
26 var ex=0;
27 var ey=0;
28 var modeSVG=null;
29 var iSlideMgr='iSlideManager.php';
30 var MgrPath="";
31 var nextId=1;
32
33 var lineEdit=null;
34
35 ////// SVG
36 var svg_ns = 'http://www.w3.org/2000/svg';
37 var svg_x=10;
38 var svg_y=10;
39 var svg_width = 100;
40 var svg_height = 50;
41 var svg_rx = 50;
42 var svg_ry = 30;
43 var svg_lw = 1;
44 var svg_wo = null;
45 var svg_ho = null;
46 var svg_ro = null;
47 var svg_rxo = null;
48 var svg_ryo = null;
49 var svg_fsize = null;
50 var svg_scale_dir = null;
51
52 var svg_top = null;
53 var svg_select = null;
54 var svg_defs = null;
55
56 var svg_font_size = 24;
57 var svg_font_family = 'Helvetica';
58 var svg_color = '#000000';
59 var svg_fill_color = '#ffffff';
60 var svg_line_width = 1;
61
62 var editingTextObj = null;
63 var svg_rotate_locked = true;
64
65 ///// Color
66 var colors=new Array('none', '#ffffff',
67 '#000000', '#3f3f3f', '#7f7f7f', '#bfbfbf',
68 '#ff0000', '#ff7f00', '#ffff00', '#7fff00',
69 '#00ff00', '#00ff7f', '#00ffff', '#007fff',
70 '#0000ff', '#7f00ff', '#ff00ff', '#ff007f',
71 '#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
72 '#007f00', '#007f3f', '#007f7f', '#003f7f',
73 '#00007f', '#3f007f', '#7f007f', '#7f003f',
74 '#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
75 '#ffaaaa', '#ffd4aa', '#ffffaa', '#d4ffaa',
76 '#aaffaa', '#aaffd4', '#aaffff', '#aad4ff',
77 '#aaaaff', '#d4aaff', '#ffaaff', '#ffaad4'
78 );
79
80 //// Initialize
81 function initEditor(name, dispname, size){
82 systemDB = initDB(name, dispname, size);
83 fileSelector();
84 preview=document.getElementById('preview');
85 if(preview){
86 preview.addEventListener("touchstart", onTouchStart,false);
87 preview.addEventListener("touchmove", onTouchMove, false);
88 preview.addEventListener("touchend", onTouchEnd, false);
89 preview.addEventListener("gesturestart", onGestureStart,false);
90 preview.addEventListener("gesturechange", onGestureChange, false);
91 preview.addEventListener("gestureend", onGestureEnd, false);
92 }
93 restoreValues();
94 }
95
96 function restoreValues(){
97 if(typeof(localStorage) == 'undefined'){
98 alert('local storage not suported');
99 }
100 MgrPath = localStorage.getItem('MgrPath') ? localStorage.getItem('MgrPath') : "";
101 window.onbeforeuload=function(){ return saveChanges(); }
102 }
103
104 function clearAll(){
105 localsStorage.clear();
106 restoreValudes();
107 }
108
109 function saveChanges(){
110 localStorage.setItem('MgrPath', MgrPath);
111 }
112
113 // initialize a database
114 function initDB(name, dispname, size) {
115 try {
116 if (!window.openDatabase) {
117 alert('not supported');
118 } else {
119 var version = '1.0';
120 var myDB = openDatabase(name, version, dispname, size);
121 }
122 } catch(e) {
123 if (e == INVALID_STATE_ERR) {
124 alert("Invalid database version.");
125 } else {
126 alert("Unknown error "+e+".");
127 }
128 return null;
129 }
130
131 createTables(myDB);
132 return myDB;
133 }
134
135 function createTables(db) {
136 if (0) dropTables(db);
137
138 db.transaction(
139 function (transaction) {
140 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);
141 transaction.executeSql('CREATE TABLE IF NOT EXISTS filedata(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, datablob BLOB NOT NULL DEFAULT "");', [], nullDataHandler, errorHandler);
142 }
143 );
144 }
145
146 function dropTables(db) {
147 db.transaction(
148 function (transaction) {
149 transaction.executeSql('DROP TABLE files;');
150 transaction.executeSql('DROP TABLE filedata;');
151 }
152 );
153 }
154
155 /// Create New File
156 function reallyCreateNewFileAction(name, db){
157 var myDB = db;
158 if(!db) myDB = systemDB;
159
160 myDB.transaction(
161 function (transaction) {
162 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+name+"', results.insertId], nullDataHandler, killTransaction);");
163
164 transaction.executeSql('INSERT INTO filedata (datablob) VALUES ("");', [], myfunc, errorHandler);
165 }
166 );
167
168 fileSelector();
169 }
170
171 function createNewFileAction(db){
172 var myDB = db;
173 if(!db) myDB = systemDB;
174
175 var name = document.getElementById('createFilename').value
176 if(name == "") {
177 if (confirm('Filename is required, try agein?')) { createNewFile(); }else{ fileSelector(); }
178 return;
179 }
180
181 myDB.transaction(
182 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
183 "function (transaction, results) {"+
184 "if(results.rows.length == 0){"+
185 "reallyCreateNewFileAction('"+name+"');"+
186 "}else{"+
187 "if (confirm(results.rows.item(0)['name']+' already exist, try agein?')) {"+
188 "createNewFile();"+
189 "}else{"+
190 "fileSelector();"+
191 "}"+
192 "}"+
193 "}, errorHandler);")
194 );
195
196 }
197
198 //// Delete File
199 function deleteUpdateResults(transaction, results)
200 {
201 if (results.rowsAffected) {
202 fileSelector();
203 }
204 }
205
206 function reallyDelete(id, db){
207 var myDB = db;
208 if(!db) myDB = systemDB;
209
210 myDB.transaction(
211 new Function("transaction",
212 "transaction.executeSql('DELETE FROM files where id=?;', [ "+id+" ], null, errorHandler);"
213 +"transaction.executeSql('DELETE FROM filedata where id=?;', [ "+id+" ], deleteUpdateResults, errorHandler);")
214 );
215 }
216
217 function deleteFile(name, db){
218 var myDB = db;
219 if(!db) myDB = systemDB;
220
221 myDB.transaction(
222 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+name+"'],"+
223 "function (transaction, results) {"+
224 "if (confirm('Really delete '+results.rows.item(0)['name']+'?')) {"+
225 "reallyDelete(results.rows.item(0)['id']);"+
226 "}"+
227 "}, errorHandler);")
228 );
229 }
230
231 function reallyDeleteAll(db){
232 var myDB = db;
233 if(!db) myDB = systemDB;
234
235 myDB.transaction(
236 new Function("transaction",
237 "transaction.executeSql('DELETE FROM files;',[],null, errorHandler);"
238 +"transaction.executeSql('DELETE FROM filedata;',[],deleteUpdateResults, errorHandler);")
239 );
240 }
241
242 function deleteAllFile(db){
243 if (confirm('Really delete all file?')) {
244 reallyDeleteAll(db);
245 }
246 }
247
248 ///// Rename
249 function reallyRenameFileAction(id, newname, db){
250 var myDB = db;
251 if(!db) myDB = systemDB;
252
253 myDB.transaction(
254 function (transaction) {
255 transaction.executeSql('UPDATE files set name=? where id=?;', [newname,id ], null, errorHandler);
256 }
257 );
258 fileSelector();
259 }
260
261 function renameFileAction(db){
262 var myDB = db;
263 if(!db) myDB = systemDB;
264
265 var new_name = document.getElementById('newFilename').value
266 var id = document.getElementById('fileId').value
267
268 if(new_name == "") {
269 alert('Filename is required.');
270 fileSelector();
271 return;
272 }
273
274 myDB.transaction(
275 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+new_name+"'],"+
276 "function (transaction, results) {"+
277 "if(results.rows.length == 0){"+
278 "reallyRenameFileAction('"+id+"','"+new_name+"');"+
279 "}else{"+
280 "alert(results.rows.item(0)['name']+' already exist');"+
281 "fileSelector();"+
282 "}"+
283 "}, errorHandler);")
284 );
285
286 }
287
288
289 /// Save File
290 function saveFile(db){
291 var myDB = db;
292 if(!db) myDB = systemDB;
293
294 var editarea = document.getElementById('editarea');
295 var contents = "";
296 contents = editarea.value;
297
298 myDB.transaction(
299 function (transaction) {
300 var datadiv = document.getElementById('tempdata');
301 var filedata_id = datadiv.getAttribute('lfdataid');
302
303 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
304 [ contents, filedata_id ], nullDataHandler, errorHandler);
305
306 alert('Saved.');
307 }
308 );
309 }
310
311 function saveData(db){
312 var myDB = db;
313 if(!db) myDB = systemDB;
314
315 var contents = "";
316 contents = getSVGContent();
317
318 myDB.transaction(
319 function (transaction) {
320 var datadiv = document.getElementById('tempdata');
321 var filedata_id = datadiv.getAttribute('lfdataid');
322
323 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
324 [ contents, filedata_id ], nullDataHandler, errorHandler);
325
326 alert('Saved.');
327 }
328 );
329 }
330
331 function saveContent(contents, db){
332 var myDB = db;
333 if(!db) myDB = systemDB;
334
335 if(!contents) {
336 alert("Invalid content");
337 return;
338 }
339
340 myDB.transaction(
341 function (transaction) {
342 var datadiv = document.getElementById('tempdata');
343 var filedata_id = datadiv.getAttribute('lfdataid');
344
345 transaction.executeSql("UPDATE filedata set datablob=? where id=?;",
346 [ contents, filedata_id ], nullDataHandler, errorHandler);
347
348 alert('Saved.');
349 }
350 );
351 }
352
353 function reallySaveNewFileAction(fname, db){
354 var myDB = db;
355 if(!db) myDB = systemDB;
356
357 var datadiv = document.getElementById('tempdata');
358 content = datadiv.textContent;
359
360 myDB.transaction(
361 function (transaction) {
362 var myfunc = new Function("transaction", "results", "transaction.executeSql('INSERT INTO files (name, filedata_id) VALUES (?, ?);', [ '"+fname+"', results.insertId], nullDataHandler, killTransaction);");
363
364 transaction.executeSql('INSERT INTO filedata (datablob) VALUES (?);', [content], myfunc, errorHandler);
365 }
366 );
367
368 datadiv.textContent="";
369 alert("download to "+fname);
370 }
371
372 function saveContentFilename(id, db){
373
374 var datadiv = document.getElementById('tempdata');
375 datadiv.setAttribute('lfdataid', id);
376 saveContent(datadiv.innerHTML, db);
377 datadiv.textContent="";
378 }
379
380 function saveContentWithFilename(fname, contents, db){
381 var myDB = db;
382 if(!db) myDB = systemDB;
383
384 if(!contents) {
385 alert("Invalid content");
386 return;
387 }
388
389 var datadiv = document.getElementById('tempdata');
390 datadiv.setAttribute('lfname', fname);
391 datadiv.textContent = contents;
392
393 myDB.transaction(
394 new Function("transaction", "transaction.executeSql('SELECT id,name from files where name=?;',['"+fname+"'],"+
395 "function (transaction, results) {"+
396 "if(results.rows.length == 0){"+
397 "reallySaveNewFileAction('"+fname+"');"+
398 "}else{"+
399 "if (confirm(results.rows.item(0)['name']+' already exist, Overwrite?')) {"+
400 "saveContentFilename(results.rows.item(0)['id']);"+
401 "}else{"+
402 "fileSelector();"+
403 "}"+
404 "}"+
405 "}, errorHandler);")
406 );
407
408 }
409
410 function showFileData(transaction, results){
411 var data = results.rows.item(0);
412 var filename = data['name'];
413 var filedata = data['datablob'];
414
415 var datadiv = document.getElementById('tempdata');
416 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
417
418 document.title=filename;
419
420 previewFile(filedata);
421
422 updateShowMenu();
423 setMode('Preview');
424 }
425
426 function showFile(name){
427 getFile(name, 'showFileData');
428 }
429
430 function getFile(name, func, db){
431 var myDB = db;
432 if(!db) myDB = systemDB;
433
434 var datadiv = document.getElementById('tempdata');
435 if(datadiv) datadiv.setAttribute('lfname', name);
436
437 myDB.transaction(
438 function (transaction) {
439 transaction.executeSql('SELECT * from files, filedata where files.name=? and files.filedata_id = filedata.id;', [name], eval(func), errorHandler);
440 }
441 );
442 }
443
444 // Error Handlers
445 function killTransaction(transaction, error){
446 return true;
447 }
448
449 function errorHandler(transaction, error){
450 alert('Oops. Error was '+error.message+' (Code '+error.code+')');
451
452 var we_think_this_error_is_fatal = true;
453 if (we_think_this_error_is_fatal) return true;
454 return false;
455 }
456
457 function nullDataHandler(transaction, results){
458 }
459
460 ///////////////////////////
461
462 function fileSelector(db) {
463 var myDB = db;
464 if(!db) myDB = systemDB;
465
466 myDB.transaction(
467 function (transaction) {
468 transaction.executeSql("SELECT * from files where deleted=0;", [ ],
469 function (transaction, results) {
470 var filelist = '';
471 var menuDiv = document.getElementById('menuDiv');
472 if(menuDiv){
473 for(var i=0; i<results.rows.length; i++) {
474 var row = results.rows.item(i);
475 filelist = filelist + fileEntry(row);
476 }
477 if (filelist == "") {
478 filelist = "No files.<br />\n";
479 } else {
480 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
481 }
482 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+createMenuBar()+filelist;
483 }
484 }, errorHandler);
485 }
486 );
487 setMode('List');
488 }
489
490 function fileSelectorOnServer(val) {
491 var filelist = '';
492 var menuDiv = document.getElementById('menuDiv');
493 var results = val.split(',');
494
495 if(menuDiv){
496 for(var i=0; i<results.length; i++) {
497 var row = results[i];
498 filelist = filelist + fileEntryOnServer(row);
499 }
500 if (filelist == "") {
501 filelist = "No files.<br />\n";
502 } else {
503 filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
504 }
505 var Menu = "<button onClick=\"fileSelector();\">Local Storage</button>";
506 Menu += "<button onClick=\"getRemoteFileList();\">List on Server</button>";
507 menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+Menu+filelist;
508 }
509 setMode('List');
510 }
511
512 function fileEntryOnServer(name){
513 name = name.split('.')[0];
514 var res = "<tr class='filerow'>";
515 res += "<td class='filenamecell' onClick=\"getRemoteFile('"+name+"');\">"+name+"</td>";
516 res += "<td class='filelinkcell'>";
517 res += "<button class='green' onClick=\"showRemoteFile('"+name+"');\">View</button>";
518 res += "<button onClick=\"downloadFile('"+name+"');\">Download to local storage</button>";
519 res += "<button onClick=\"downloadToFile('"+name+"');\">Download as SVG File</button>";
520 res += "</td></tr>\n";
521
522 return res;
523 }
524
525 function fileEntry(row){
526 var name = row['name'];
527 var files_id = row['id'];
528
529 var res = "<tr class='filerow'>";
530 res += "<td class='filenamecell' onClick=\"showFile('"+name+"');\">"+name+"</td>";
531 res += "<td class='filelinkcell'>";
532 res += "<button class='blue' onClick=\"editFile('"+name+"');\">&nbsp;Edit&nbsp;</button> &nbsp;";
533 res += "<button class='green' onClick=\"renameFile('"+name+"',"+files_id+");\">&nbsp;Rename&nbsp;</button> &nbsp;";
534 res += "<button onClick=\"uploadFile('"+name+"');\">Upload</button>";
535 res += "<button class='red' onClick=\"deleteFile('"+name+"');\">Delete</button>";
536 res += "</td></tr>\n";
537
538 return res;
539 }
540
541 function createMenuBar(){
542 var menu = "<ul id='menubar'>";
543 menu += "<li><button onClick='createNewFile()'>Create New File</button></li>";
544 menu += "<li><button onClick='deleteAllFile()'>Delete All</button></li>";
545 menu += "<li><button onClick='getRemoteFileList()'>File List on a Server</button></li>";
546 menu += "<li><button onClick='configServer()'>Server Configuration</button></li>";
547 menu += "</ul><p class='cls'>";
548 return menu;
549 }
550
551 //// Config
552 function setConfig(){
553 var ele = document.getElementById('ServerURL');
554 MgrPath=ele.value;
555 saveChanges();
556 alert("Done");
557 }
558
559 function configServer(){
560 var popupDiv = document.getElementById('popup');
561 var string = "";
562
563 string += "<H1 class='title'>Server Configration</H1>\n";
564 string += "<div class=\"input_form\">\n";
565 string += "Filename:<input id='ServerURL' name='url' value=\""+MgrPath+"\" size=\"80\"/><br>\n";
566 string += "<button onClick=\"setConfig();hideItemById('popup'); \">Done</button>\n";
567 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
568 string += "</div>\n";
569
570 popupDiv.innerHTML=string;
571 popupDiv.style.display='block';
572 }
573
574 ////
575 function createNewFile(){
576 var popupDiv = document.getElementById('popup');
577 var string = "";
578
579 string += "<H1 class='title'>Create New File</H1>\n";
580 string += "<div class=\"input_form\">\n";
581 string += "Filename:<input id='createFilename' name='name' value=\"\" />\n";
582 string += "<button onClick=\"createNewFileAction();hideItemById('popup'); \">Create</button>\n";
583 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
584 string += "</div>\n";
585
586 popupDiv.innerHTML=string;
587 popupDiv.style.display='block';
588 }
589
590
591 /////
592 function renameFile(name, id){
593 var popupDiv = document.getElementById('popup');
594 var string = "";
595
596 string += "<H1 class='title'>Rename File</H1>\n";
597 string += "<div class='input_form'>\n";
598 string += "Old Filename: "+name+"<br>";
599 string += "New Filename:<input id='newFilename' name='newname' value=\"\" />\n";
600 string += "<input type='hidden' id='fileId' value=\""+id+"\" /><br>\n";
601 string += "<button onClick=\"renameFileAction();hideItemById('popup');\">Rename</button>\n";
602 string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
603 string += "</div>\n";
604
605 popupDiv.innerHTML=string;
606 popupDiv.style.display='block';
607 }
608
609 /// EditMenu
610 function insertStr(str, len){
611 var editarea = document.getElementById('editarea');
612 if(len < 0) len = str.length;
613
614 if (editarea){
615 if(str=='DQ') str='"';
616 var strs = editarea.value;
617 var cPos = editarea.selectionStart;
618 var tmp = strs.substr(0,cPos);
619 editarea.value = tmp +str+strs.substr(cPos, strs.length);
620 cPos += len;
621 editarea.setSelectionRange(cPos, cPos);
622 editarea.focus();
623 }
624 }
625
626 function insertTag(tag){
627 var str;
628 var len = -1;
629 if (tag == "p"){
630 str = "<p> </p>";
631 len = 4;
632 }else if (tag == "ul"){
633 str = "<ul class=\" \"> \n\n</ul>";
634 len = 17;
635 }else if (tag == "li"){
636 str = "<li> </li>";
637 len = 5;
638 }else if (tag == "href"){
639 str = "xlink:href=\"\"";
640 len = 12;
641 }else if (tag == "EQ"){
642 str = "=\"\"";
643 len = 2;
644 }else if (tag == "svg:text"){
645 str = "<svg:text x=\"100\" y=\"100\" fill=\"black\" font-size=\"12\"> </svg:text>";
646 len = 58;
647 }else if (tag == "svg:rect"){
648 str = "<svg:rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"white\" stroke=\"black\" />";
649 len = 13;
650 }else if (tag == "svg:circle"){
651 str = "<svg:circle cx=\"10\" cy=\"100\" r=\"100\" fill=\"white\" stroke=\"black\" strokc-width=\"1\"/>";
652 len = 17;
653 }
654 insertStr(str, len);
655 }
656
657 function editMenuBar()
658 {
659 var str = "";
660 str += "<button onClick=\"insertStr('/',1);\">/</button>\n";
661 str += "<button onClick=\"insertStr('DQ',1);\">\"</button>\n";
662 str += "<button onClick=\"insertTag('EQ',1);\">=\"\"</button>\n";
663 str += "<button onClick=\"insertTag('p');\">p</button>\n";
664 str += "<button onClick=\"insertTag('href');\">href</button>\n";
665
666 str += "<button onClick=\"insertTag('svg:text');\">TEXT</button>\n";
667 str += "<button onClick=\"insertTag('svg:rect');\">rect</button>\n";
668 str += "<button onClick=\"insertTag('svg:circle');\">circle</button>\n";
669
670 str += "<button onClick=\"chEditareaHeight();\">...</button>\n";
671
672 return str;
673 }
674
675 function updateEditMenu(){
676 var menuDiv = document.getElementById('menuDiv');
677 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
678 menuDiv.innerHTML+= "<button onClick=\"saveFile();fileSelector();\"> Save </button>\n";
679 menuDiv.innerHTML+= "<button onClick=\"previewData();\"> Preview </button>\n";
680 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
681
682 menuDiv.style.display='block';
683 }
684
685 //// Editor
686 function editFileData(transaction, results){
687 var editDiv = document.getElementById('editDiv');
688 var datadiv = document.getElementById('tempdata');
689
690 if( results.rows.length == 0) return;
691 var data = results.rows.item(0);
692 var filename = data['name'];
693 var filedata = data['datablob'];
694 datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
695
696 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+filedata+"</textarea>\n";
697
698 document.title="EditFile: "+filename;
699 updateEditMenu();
700 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
701
702 setMode('Edit');
703 }
704
705 function editFile(name){
706 if(currentMode == 'Preview'){
707 var data = getSVGContent();
708 var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+data+"</textarea>\n";
709 updateEditMenu();
710 editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
711
712 setMode('Edit');
713 }else{
714 getFile(name, 'editFileData');
715 }
716 }
717
718 function editCurrentFile(){
719 var datadiv = document.getElementById('tempdata');
720 var name = datadiv.getAttribute('lfname');
721
722 editFile(name);
723 }
724
725 function downItem(){
726 if(selectedItems.length != 1) return;
727 var itm = selectedItems[0];
728
729 var nodes = svg_top.childNodes;
730 for(var i=0; i< nodes.length; i++){
731 if(nodes[i] == itm) break;
732 }
733 if (i > 0)
734 svg_top.insertBefore(itm, nodes[i-1]);
735 }
736
737 function upItem(){
738 if(selectedItems.length != 1) return;
739 var itm = selectedItems[0];
740
741 var nodes = svg_top.childNodes;
742 for(var i=0; i< nodes.length; i++){
743 if(nodes[i] == itm) break;
744 }
745
746 if (i == nodes.length-2){
747 svg_top.appendChild(itm);
748 }else if (i < nodes.length-1){
749 svg_top.insertBefore(itm, nodes[i+2]);
750 }
751 }
752
753 function bottomItem(){
754 if(selectedItems.length != 1) return;
755 var itm = selectedItems[0];
756 svg_top.insertBefore(itm, svg_top.firstChild);
757 }
758
759 function topItem(){
760 if(selectedItems.length != 1) return;
761 var itm = selectedItems[0];
762 svg_top.removeChild(itm);
763 svg_top.appendChild(itm);
764 }
765
766 // Show File
767 function updateShowMenu(){
768 var menuDiv = document.getElementById('menuDiv');
769 menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
770 menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"><img src=\"images/list.png\"></button>\n";
771 menuDiv.innerHTML+= "<button onClick=\"saveData();\"><img src=\"images/save.png\"></button>\n";
772 menuDiv.innerHTML+= "<button onClick=\"showSVGSource();\"><img src=\"images/SVG.png\"></button>\n";
773 menuDiv.innerHTML+= "<button onClick=\"topItem();\" ><img src=\"images/top.png\"></button>\n";
774 menuDiv.innerHTML+= "<button onClick=\"upItem();\" ><img src=\"images/up.png\"></button>\n";
775 menuDiv.innerHTML+= "<button onClick=\"downItem();\"><img src=\"images/down.png\"></button>\n";
776 menuDiv.innerHTML+= "<button onClick=\"bottomItem();\"><img src=\"images/bottom.png\"></button>\n";
777 menuDiv.innerHTML+= updateSVGObjMenu();
778 if(svg_rotate_locked)
779 menuDiv.innerHTML+= "<button onClick=\"toggleRotateLock();\">UnLockRot</button>\n";
780 else
781 menuDiv.innerHTML+= "<button onClick=\"toggleRotateLock();\">LockRot</button>\n";
782
783 menuDiv.style.display='block';
784 updateToolBar();
785 }
786
787 function showColorPalette(val){
788 var palette = document.getElementById('color-palette');
789 var ele;
790 var current = palette.getAttribute("targetType");
791
792 if(palette.style.display=='block' && current == val){
793 palette.style.display='none';
794 return;
795 }
796
797 if(val == 'fill'){
798 ele = document.getElementById('toolFill');
799 }else{
800 ele = document.getElementById('toolStroke');
801 }
802
803 var pos= ele.offsetTop + 110;
804 palette.style.top = pos +"px";
805 palette.style.display='block';
806 palette.setAttribute("targetType", val);
807
808 }
809
810 function updateToolBar(){
811 var toolbar = document.getElementById('toolBar');
812 var str = "";
813 if(!toolbar.innerHTML){
814 str += "<li><button id=\"b_selector\" onClick=\"setSVGMode('selector');\"><img src=\"images/arrow.png\" /></button> </li>\n";
815 str += "<li><button id=\"b_newPath\" onClick=\"setSVGMode('newPath'); \"><img src=\"images/path.png\" /></button></li> \n";
816 str += "<li><button id=\"b_newLine\" onClick=\"setSVGMode('newLine'); \"><img src=\"images/line.png\" /> </button></li> \n";
817 str += "<li><button id=\"b_text\" onClick=\"setSVGMode('text'); \"><img src=\"images/text.png\" /></button> </li>\n";
818 str += "<li><button id=\"b_rect\" onClick=\"setSVGMode('rect'); \"> <img src=\"images/rect.png\" /> </button></li> \n";
819 str += "<li><button id=\"b_circle\" onClick=\"setSVGMode('circle'); \"> <img src=\"images/circle.png\" /> </button></li> \n";
820 str += "<li><button id=\"b_ellipse\" onClick=\"setSVGMode('ellipse'); \"> <img src=\"images/ellipse.png\" /> </button></li> \n";
821 str += "<li><button id=\"b_image\" onClick=\"setSVGMode('image'); \"> <img src=\"images/img.png\" /> </button></li> \n";
822 str += "<li>&nbsp;</li>";
823 str += "<li><button id=\"b_fillColor\" onClick=\"showColorPalette('fill');\"><img src=\"images/Fill.png\" /><div id=\"toolFill\"></div></button></li> \n";
824 str += "<li><button id=\"b_strokeColor\" onClick=\"showColorPalette('stroke');\"><img src=\"images/Stroke.png\" /><div id=\"toolStroke\"></div></button></li> \n";
825 toolbar.innerHTML= "<ul>"+str+"</ul>";
826 }
827
828 toolbar.style.display='block';
829 }
830
831 function setMode(m){
832 currentMode=m;
833 switch(m){
834 case 'List':
835 hideItemById('editDiv');
836 hideItemById('preview');
837 hideItemById('popup');
838 hideItemById('toolBar');
839 hideItemById('color-palette');
840 showItemById('menuDiv');
841 break;
842 case 'Edit':
843 hideItemById('preview');
844 hideItemById('popup');
845 hideItemById('toolBar');
846 hideItemById('color-palette');
847 showItemById('editDiv');
848 showItemById('menuDiv');
849 break;
850 case 'Preview':
851 showItemById('preview');
852 hideItemById('editDiv');
853 hideItemById('popup');
854 hideItemById('color-palette');
855 showItemById('menuDiv');
856 showItemById('toolBar');
857 break;
858 default:
859 break;
860 }
861 }
862
863 function hideItemById(id){
864 var itm = document.getElementById(id);
865 if(itm) itm.style.display='none';
866 }
867
868 function showItemById(id){
869 var itm = document.getElementById(id);
870 if(itm) itm.style.display='block';
871 }
872
873 function removeChildNodes(id){
874 var itm = document.getElementById(id);
875 if(!itm) return;
876
877 var child = itm.firstChild;
878
879 while(child){
880 itm.removeChild(child);
881 child = itm.firstChild;
882 }
883 }
884
885 function chEditareaHeight(){
886 var itm = document.getElementById('editarea');
887 if(!itm) return;
888 var cv = itm.getAttribute('rows');
889 if(parseInt(cv) > editarea_h){
890 itm.setAttribute('rows', editarea_h);
891 }else{
892 itm.setAttribute('rows', editarea_h * 2);
893 }
894 }
895
896 function format_file(str){
897 return "<pre>"+str+"</pre>";
898 }
899
900 function previewData(data){
901 if(!data) data = document.getElementById('editarea').value;
902
903 previewFile(data);
904
905 updateShowMenu();
906 setMode('Preview');
907 }
908
909 function previewFile(data){
910 removeChildNodes('preview');
911
912 preview.style.display='block';
913 preview.style.position='absolute';
914 preview.style.top='180px';
915 preview.style.bottom='50px';
916 preview.style.left='0px';
917 preview.style.right='10px';
918 preview.style.width='800px';
919 // preview.style.height='600px';
920 preview.style.height='525px';
921 mkColorPalette();
922
923 var ele = toSVGElement(data, '100%','100%');
924
925 preview.appendChild(ele);
926
927 svg_top = document.getElementById('svg_top');
928 initSVGElementId(svg_top);
929 svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
930 svg_select.setAttribute("id","svg_select");
931 appendSVGObj(svg_select);
932 }
933
934 function mkColorPalette(){
935 var palette = document.getElementById('color-palette');
936 if(!palette) return;
937 if(palette.innerHTML) return;
938
939 palette.innerHTML="";
940 palette.addEventListener("touchstart", onTouchStartColor, false);
941
942 for(var i=0; i<colors.length ;i++){
943 if(colors[i] == 'none')
944 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\">X</div>";
945 else
946 palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\"> </div>";
947 }
948 palette.style.width='120px';
949 }
950
951 ////// for SVG object
952 ////////////////
953 function updateSVGObjMenu(){
954 var res = "";
955 var tag = modeSVG;
956 if(selectedItems.length > 1) return res;
957 if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
958
959 switch(tag){
960 case 'text':
961 if(selectedItems[0]){
962 res += setSVGObjectProp(selectedItems[0]);
963 }else{
964 res += propSVGText("", svg_font_size, svg_color, 0);
965 }
966 break;
967 case 'rect':
968 case 'circle':
969 case 'ellipse':
970 case 'newPath':
971 case 'newLine':
972 case 'path':
973 case 'line':
974 case 'polyline':
975 case 'polygon':
976 if(selectedItems[0]){
977 res += setSVGObjectProp(selectedItems[0]);
978 }else{
979 res += propSVGObj(tag+":", svg_line_width, svg_color, svg_fill_color, "", 0);
980 }
981 break;
982 case 'image':
983 if(selectedItems[0]){
984 res += setSVGObjectProp(selectedItems[0]);
985 }else{
986 res += propSVGImage("", 100, 100, 0);
987 }
988 break;
989 default:
990 break;
991 }
992 return res;
993 }
994
995 function propSVGText(str, size, color, rot){
996 if(!size) size = 24;
997 if(!color) color = '#000000';
998 if(!rot) rot = 0;
999
1000 var res = "Text:";
1001 res += "<input type=\"hidden\" id=\"svg_text\" value=\""+str+"\"/>";
1002 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
1003 res += "Rot:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
1004
1005 res += "Size:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
1006
1007 document.getElementById('toolFill').style.backgroundColor=color;
1008 return res;
1009 }
1010
1011 function propSVGObj(type, stroke, color, fill, style, rot){
1012 var res = type;
1013 if(!stroke) stroke = 1;
1014 if(!color) color = '#000000';
1015 if(!fill) fill = '#ffffff';
1016 if(!rot) rot = 0;
1017
1018 res += "<input type=\"hidden\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
1019 res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
1020 res += "Width:<input type=\"text\" id=\"svg_stroke\" onChange=\"updateSVGObj();\" value=\""+stroke+"\" size=\"2\"/>";
1021 res += "Rot:<input type=\"text\" id=\"svg_rotate\" onChange=\"updateSVGObj();\" value=\""+rot+"\" size=\"4\"/>";
1022
1023 if(style==null) style="";
1024 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" onChange=\"updateSVGObj();\" value=\""+style+"\" size=\"8\"/>";
1025
1026 document.getElementById('toolFill').style.backgroundColor=fill;
1027 document.getElementById('toolStroke').style.backgroundColor=color;
1028 return res;
1029 }
1030
1031 function propSVGLine(type, stroke, color, fill, style, rot){
1032 var res = propSVGObj(type, stroke, color, fill, style, rot);
1033 if(!rot) rot = 0;
1034
1035 res += "Arrow:";
1036
1037 if(hasArrow('start')){
1038 res += "<button class=\"tool\" onClick=\"removeLeftArrow();\"><img src=\"images/normal.png\" /></button>";
1039 }else{
1040 res += "<button class=\"tool\" onClick=\"setLeftArrow();\"><img src=\"images/larrow.png\" /></button>";
1041 }
1042 if(hasArrow('end')){
1043 res += "<button class=\"tool\" onClick=\"removeRightArrow();\"><img src=\"images/normal.png\" /></button>";
1044 }else{
1045 res += "<button class=\"tool\" onClick=\"setRightArrow();\"><img src=\"images/rarrow.png\" /></button>";
1046 }
1047
1048 document.getElementById('toolFill').style.backgroundColor=fill;
1049 document.getElementById('toolStroke').style.backgroundColor=color;
1050
1051 return res;
1052 }
1053
1054 function propSVGImage(str, w, h, rot){
1055 var res = "image:";
1056 if(!rot) rot = 0;
1057 res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
1058 res += "Width:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
1059 res += "Height:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
1060 res += "Rot:<input type=\"text\" onChange=\"updateSVGObj();\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
1061 return res;
1062 }
1063
1064 function setSVGMode(m){
1065 var btn = document.getElementById('b_'+modeSVG);
1066 if(btn){ btn.style.border="1px solid black"; }
1067
1068 modeSVG = m;
1069 updateShowMenu();
1070
1071 if(m == 'selector'){
1072 targetItem=null;
1073 clearSelectedItems();
1074 }
1075 var btn = document.getElementById('b_'+modeSVG);
1076 if(btn){ btn.style.border="3px solid red"; }
1077 }
1078
1079
1080 function toSVGElement(str, w, h){
1081 var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
1082 var parser = new DOMParser();
1083 var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
1084 var footer = "</svg:svg>";
1085 var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
1086 var xmlRoot = xmlDoc.documentElement;
1087 var ele = document.importNode(xmlRoot,true);
1088
1089 return ele;
1090 }
1091
1092 function createSVGElement(tag, id){
1093 if(id=='new'){
1094 id = 'svg_'+nextId;
1095 nextId++;
1096 }
1097 var ele= document.createElementNS(svg_ns, tag);
1098 ele.setAttribute("id", id);
1099 return ele;
1100 }
1101
1102 function defSVGElement(node){
1103 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1104 if(!svg_defs){
1105 svg_defs = createSVGElement('defs', 'svg_defs');
1106 svg_top.insertBefore(svg_defs, svg_top.firstChild);
1107 }
1108 if(node) svg_defs.appendChild(node);
1109 }
1110
1111 function initSVGElementId(svg_top){
1112 nextId = 1;
1113 checkSVGElementId(svg_top);
1114 appendSVGElementId(svg_top);
1115 }
1116
1117 function checkSVGElementId(top){
1118 var objs = top.childNodes;
1119
1120 for(var i=0; i<objs.length ;i++){
1121 if(objs[i].tagName){
1122 var id = objs[i].getAttribute("id");
1123
1124 if(id && id.match(/svg_[0-9]+/i)){
1125 var n = parseInt(RegExp.lastMatch.substr(4));
1126 if(n >= nextId){
1127 nextId = n+1;
1128 }
1129
1130 }
1131 checkSVGElementId(objs[i]);
1132 }
1133 }
1134 }
1135
1136 function appendSVGElementId(top){
1137 var objs = top.childNodes;
1138
1139 for(var i=0; i<objs.length ;i++){
1140 if(objs[i].tagName){
1141 var id = objs[i].getAttribute("id");
1142 if(!id){
1143 objs[i].setAttribute("id", "svg_"+nextId);
1144 nextId++;
1145 }
1146 }
1147 appendSVGElementId(objs[i]);
1148 }
1149 }
1150
1151 function selectedRectangle(x, y, ex, ey){
1152 if(!svg_select) return null;
1153
1154 svg_select.setAttribute("x",x);
1155 svg_select.setAttribute("y",y);
1156 svg_select.setAttribute("width", ex-x);
1157 svg_select.setAttribute("height", ey-y);
1158 svg_select.setAttribute("visibility", "visible");
1159 return svg_select;
1160 }
1161
1162
1163 function setAttributes(obj, attrs){
1164 var attr_array = attrs.split(',');
1165
1166 for (var i=0; i<attr_array.length;i++){
1167 var x = attr_array[i].split('=');
1168 if(x.length == 2){
1169 obj.setAttribute(x[0], x[1]);
1170 }
1171 }
1172 }
1173
1174 function createSVGObj(tag, attrs, fill, color, lw){
1175 var ele = createSVGElement(tag, 'new');
1176 setAttributes(ele, attrs);
1177 if (fill) ele.setAttribute('fill', fill);
1178 if (color) ele.setAttribute('stroke', color);
1179 if(lw) ele.setAttribute('stroke-width', lw);
1180
1181 return ele;
1182 }
1183
1184 function createSVGText(txt, x, y, size, color){
1185 var ele = createSVGElement('text', 'new');
1186
1187 ele.setAttribute('x', x);
1188 ele.setAttribute('y', y);
1189 ele.setAttribute('font-size', size);
1190 ele.setAttribute('fill', color);
1191 ele.textContent=txt;
1192
1193 return ele;
1194 }
1195
1196 function createSVGImage(fname, width, height, attrs){
1197 var ele = createSVGElement('image', 'new');
1198 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1199 ele.setAttribute('width', width);
1200 ele.setAttribute('height', height);
1201 setAttributes(ele, attrs);
1202
1203 return ele;
1204 }
1205
1206 function createSVGMarker(pid, id, child){
1207 var parent = document.getElementById(pid);
1208 if(!parent) return;
1209 var ele = createSVGElement('marker', pid+'_'+id);
1210 ele.appendChild(child);
1211 return ele;
1212 }
1213
1214 function setLeftArrow(){
1215 if( selectedItems.length == 1 ){
1216 setArrow(selectedItems[0], 'start', '');
1217 updateShowMenu();
1218 }
1219 }
1220
1221 function setRightArrow(){
1222 if( selectedItems.length == 1 ){
1223 setArrow(selectedItems[0], 'end', '');
1224 updateShowMenu();
1225 }
1226 }
1227
1228 function removeLeftArrow(){
1229 if( selectedItems.length == 1 ){
1230 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1231 var pid = selectedItems[0].getAttribute('id');
1232 var marker = document.getElementById(pid+'_startarrow');
1233 svg_defs.removeChild(marker);
1234 selectedItems[0].removeAttribute('marker-start');
1235 updateShowMenu();
1236 }
1237 }
1238
1239 function removeRightArrow(){
1240 if( selectedItems.length == 1 ){
1241 if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1242 var pid = selectedItems[0].getAttribute('id');
1243 var marker = document.getElementById(pid+'_endarrow');
1244 svg_defs.removeChild(marker);
1245 selectedItems[0].removeAttribute('marker-end');
1246 }
1247 }
1248
1249 function hasArrow(pos){
1250 var pobj = selectedItems[0];
1251 if(!pobj) return false;
1252 var pid = pobj.getAttribute('id');
1253 var marker = document.getElementById(pid+'_'+pos+'arrow');
1254 if(marker) return true;
1255 return false;
1256 }
1257
1258 function getArrowMarker(obj,pos){
1259 if(!obj) return false;
1260 var pid = obj.getAttribute('id');
1261 var marker = document.getElementById(pid+'_'+pos+'arrow');
1262 return false;
1263 }
1264
1265 function setArrow(pobj, pos, type){
1266 if(!pobj) return;
1267 var pid = pobj.getAttribute('id');
1268 var marker = document.getElementById(pid+'_'+pos+'arrow');
1269 if(marker) return;
1270
1271 var obj = createSVGElement('path', 'new');
1272
1273 var refX = 0;
1274 var refY = 0;
1275
1276 switch(pos){
1277 case 'start':
1278 refX=10;
1279 refY=10;
1280 setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1281 break;
1282 case 'end':
1283 setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1284 refX= 10;
1285 refY=10;
1286 break;
1287 default:
1288 return;
1289 }
1290
1291 marker = createSVGMarker(pid, pos+'arrow' , obj);
1292 setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1293
1294 marker.setAttribute("fill",pobj.getAttribute("stroke"));
1295
1296 defSVGElement(marker);
1297 var mid = "url(#"+marker.getAttribute("id")+")";
1298 var mattr = "marker-"+pos;
1299 pobj.setAttribute(mattr, mid);
1300 }
1301
1302 function appendSVGObj(obj){
1303 var svg_top = document.getElementById('svg_top');
1304 if(!svg_top) return;
1305
1306 svg_top.appendChild(obj);
1307 }
1308
1309 function isChildById(element, id) {
1310 if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1311 else if (element.parentNode.id == id) return true;
1312 else return isChildById(element.parentNode, id);
1313 }
1314
1315 /////////////////////// Formatting SVG DOM
1316 function escapeHTML(text) {
1317 return text.replace( /[<>"&]/g,
1318 function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1319 );
1320 };
1321
1322 function formatTag(ele){
1323 var str="";
1324 if(ele.nodeType == 1){
1325 var tag_a = ele.tagName.split(':');
1326 var tag;
1327 if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1328
1329 str += "<"+tag;
1330 var attrs = ele.attributes;
1331 for(var i=0; i<attrs.length; i++){
1332 str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1333 }
1334 var cn = ele.childNodes;
1335 if(cn.length > 0){
1336 str +=">\n";
1337 for(var i=0; i<cn.length; i++){
1338 var tmp = trim(formatTag(cn[i]));
1339 if(tmp) str += " "+tmp+"\n";
1340 }
1341 str += "</"+tag+">";
1342 }else{
1343 str +=" />";
1344 }
1345 return str;
1346 }else if(ele.nodeType==3){
1347 return ele.textContent;
1348 }
1349 }
1350
1351 function getSVGContent(){
1352 if(!svg_top) return "";
1353
1354 var str = "";
1355 var elements = svg_top.childNodes;
1356 for(var i=0; i<elements.length; i++){
1357 if(elements[i] != svg_select){
1358 var tmp = trim(formatTag(elements[i]));
1359 if(tmp) str += tmp + '\n';
1360 }
1361 }
1362 return str;
1363 }
1364
1365 function trim(str){
1366 return str.replace(/(^\s+)|(\s+$)/g, "");
1367 }
1368
1369 /////// Access Server
1370 function newXMLRequest(){
1371 if(this.XMLHttpRequest){
1372 return new XMLHttpRequest();
1373 }else {
1374 return new ActiveXObject("Microsoft.XMLHTTP");
1375 }
1376 }
1377
1378 function createRequestData(data){
1379 var str="filetype=svg";
1380 for (var i in data){
1381 str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1382 }
1383 return str;
1384 }
1385
1386 function postRequest(url, data, func){
1387 var postData=createRequestData(data);
1388 var obj=newXMLRequest();
1389
1390 obj.onreadystatechange = function(){
1391 if (obj.readyState == 4 && obj.status == 200){
1392 func(obj.responseText);
1393 }
1394 }
1395 obj.open("POST", url, true);
1396 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1397 obj.send(postData);
1398 }
1399
1400 function commnadFinishAlert(s){
1401 alert(s);
1402 }
1403
1404 function uploadFileData(transaction, results){
1405 var data = results.rows.item(0);
1406 var updata = new Array(0);
1407 updata['name']= data['name'];
1408 updata['datalob'] = data['datablob'];
1409 updata['cmd'] = 'upload'
1410
1411 postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1412 }
1413
1414 function uploadFile(name){
1415 getFile(name, 'uploadFileData');
1416 }
1417
1418 function getRemoteFileList(){
1419 var data=new Array();
1420 data['name'] = "SVG";
1421 data['cmd'] = "list";
1422 postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1423 }
1424
1425 function previewRemoteFile(content){
1426 previewFile(content);
1427 setMode('Preview');
1428 }
1429
1430 function getRemoteFile(name){
1431 var data=new Array();
1432 data['name'] = name;
1433 data['cmd'] = "get";
1434 postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1435 }
1436
1437 function saveRemoteFile(content){
1438 var datadiv = document.getElementById('tempdata');
1439 var fname = datadiv.getAttribute('lfname');
1440 saveContentWithFilename(fname, content);
1441 }
1442
1443 function downloadFile(name){
1444 var data=new Array();
1445 data['name'] = name;
1446 data['cmd'] = "get";
1447 var datadiv = document.getElementById('tempdata');
1448 datadiv.setAttribute('lfname', name);
1449 postRequest(MgrPath+iSlideMgr, data, saveRemoteFile);
1450 }
1451
1452 function showRemoteFile(name){
1453 getRemoteFile(name);
1454 }
1455
1456 function downloadToFile(name){
1457 var downloadForm = "";
1458 downloadForm += "<form action=\"iSlideManager.php\" method=\"post\">";
1459 downloadForm += "<input type=\"hidden\" name=\"cmd\" value=\"download\">";
1460 downloadForm += "<input type=\"hidden\" name=\"name\" value=\""+name+"\">";
1461 downloadForm += "<input type=\"hidden\" name=\"filetype\" value=\"svg\">";
1462 downloadForm += "<input type=\"submit\">";
1463 downloadForm += "</form>";
1464
1465 var cmdForm = document.getElementById('cmdForm');
1466 cmdForm.innerHTML = downloadForm;
1467 cmdForm.firstChild.submit();
1468 }
1469
1470 //////// Event Handler
1471 function setInnerHTML(id, val){
1472 var itm=document.getElementById(id);
1473 if(itm) itm.innerHTML=val;
1474 }
1475
1476 function toggleRotateLock(){
1477 if(svg_rotate_locked) svg_rotate_locked = false;
1478 else svg_rotate_locked = true;
1479 updateShowMenu();
1480
1481 }
1482
1483 function popupInfo(val){
1484 var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1485 str += val;
1486 setInnerHTML('popup', str);
1487 showItemById('popup');
1488 }
1489
1490 function addAttributeVal(obj, itm, dv){
1491 if(obj.hasAttribute(itm)){
1492 var x = parseInt(obj.getAttribute(itm));
1493 x = x + dv;
1494 obj.setAttribute(itm, x)
1495 }
1496 }
1497
1498 function showSVGSource(){
1499 var str = getSVGContent();
1500 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1501 escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1502 // escstr += "<pre>"+escapeHTML(str)+"</pre>";
1503 escstr += "<textarea cols=\"130\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1504 setInnerHTML('popup', escstr);
1505 showItemById('popup');
1506 }
1507
1508
1509 function getElementTag(obj){
1510 if (!obj) return null;
1511 var tag = obj.tagName.split(':');
1512 if(tag.length == 2 && tag[0]=='svg') return tag[1];
1513 return tag[0];
1514 }
1515
1516 function setSVGObjectProp(obj){
1517 var tag = getElementTag(obj);
1518 var res ="";
1519 switch(tag){
1520 case 'text':
1521 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"),getRotateAngle(obj));
1522 break;
1523 case 'rect':
1524 case 'circle':
1525 case 'ellipse':
1526 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"),
1527 obj.getAttribute("fill"),obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1528 break;
1529 case 'path':
1530 case 'line':
1531 res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1532 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1533 break;
1534 case 'image':
1535 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"),getRotateAngle(obj));
1536 break;
1537 default:
1538 break;
1539 }
1540 if(res != ""){
1541 res += "<button onClick=\"delSVGObj();\"><img src=\"images/Del.png\"></button>";
1542 }
1543
1544 return res
1545 }
1546
1547 function updateSVGObj(){
1548 if(selectedItems.length != 1) return;
1549 var obj = selectedItems[0];
1550 var tag = getElementTag(obj);
1551 var deg=document.getElementById('svg_rotate');
1552 var res ="";
1553 switch(tag){
1554 case 'text':
1555 var txt=document.getElementById('svg_text');
1556 var color=document.getElementById('svg_color');
1557 var size=document.getElementById('svg_size');
1558 obj.textContent = txt.value;
1559 obj.setAttribute("fill", color.value);
1560 obj.setAttribute("font-size", size.value);
1561 setRotate(obj,deg.value);
1562 break;
1563 case 'rect':
1564 case 'circle':
1565 case 'ellipse':
1566 var fill=document.getElementById('svg_fill');
1567 var color=document.getElementById('svg_color');
1568 var L=document.getElementById('svg_stroke');
1569 var dash=document.getElementById('svg_stroke_type');
1570 obj.setAttribute("fill", fill.value);
1571 obj.setAttribute("stroke", color.value);
1572 obj.setAttribute("stroke-width", L.value);
1573 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1574 setRotate(obj,deg.value);
1575 break;
1576 case 'path':
1577 case 'line':
1578 var fill=document.getElementById('svg_fill');
1579 var color=document.getElementById('svg_color');
1580 var L=document.getElementById('svg_stroke');
1581 var dash=document.getElementById('svg_stroke_type');
1582 obj.setAttribute("fill", fill.value);
1583 obj.setAttribute("stroke", color.value);
1584 obj.setAttribute("stroke-width", L.value);
1585 if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1586 setRotate(obj,deg.value);
1587
1588 var id = obj.getAttribute("id");
1589 var marker = document.getElementById(id+'_startarrow');
1590 if(marker) marker.setAttribute("fill", color.value);
1591 var marker = document.getElementById(id+'_endarrow');
1592 if(marker) marker.setAttribute("fill", color.value);
1593 break;
1594 case 'image':
1595 var fname=document.getElementById('svg_text');
1596 var w=document.getElementById('svg_w');
1597 var h=document.getElementById('svg_h');
1598 obj.setAttribute("xlink:href", fname.value);
1599 obj.setAttribute("width", w.value);
1600 obj.setAttribute("height", h.value);
1601 setRotate(obj,deg.value);
1602 break;
1603 default:
1604 break;
1605 }
1606
1607 }
1608
1609 function delSVGObj(){
1610 if(selectedItems.length != 1) return;
1611 var obj = selectedItems[0];
1612
1613 if(!svg_top) return;
1614 svg_top.removeChild(obj);
1615 svg_select.setAttribute("visibility","hidden");
1616 }
1617
1618 ///// For MobileSafari
1619 function getPreviewX(x){ return x - preview.offsetLeft; }
1620 function getPreviewY(y){ return y - preview.offsetTop; }
1621
1622 function calcDit(x1, y1, x2, y2){
1623 return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1624 }
1625
1626 function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1627 return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1628 }
1629
1630 function getAttributeVal(obj, name){
1631 try{
1632 return parseInt(obj.getAttribute(name));
1633 }catch(e){ return 0; }
1634 }
1635
1636 function checkIntersection(obj, x, y, ex, ey){
1637 if(!obj) return false;
1638 var res = true;
1639 var bbox = obj.getBBox();
1640 var ox = bbox.x;
1641 var oy = bbox.y;
1642 var oex = bbox.x+bbox.width;
1643 var oey = bbox.y+bbox.height;
1644 if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1645
1646 var tag = getElementTag(obj);
1647 switch(tag){
1648 case 'circle':
1649 case 'ellipse':
1650 var cx = getAttributeVal(obj,"cx");
1651 var cy = getAttributeVal(obj,"cy");
1652 var rx = getAttributeVal(obj,"r");
1653 var ry = rx;
1654 if(!rx){
1655 var rx = getAttributeVal(obj,"rx");
1656 var ry = getAttributeVal(obj,"ry");
1657 }
1658
1659 if(res){
1660 if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1661 else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1662 else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1663 else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1664 }
1665 break;
1666 case 'path':
1667 var d = obj.getAttribute("d");
1668 var p = getPoints(d);
1669 for(var i=0;i<p.length;i++){
1670 var ox=p[i][0];
1671 var oy=p[i][1];
1672 if(x < ox && ox < ex && y < oy && oy < ey) {
1673 return true;
1674 }
1675 }
1676 return false;
1677 break;
1678 case 'line':
1679 var x1 = getAttributeVal(obj,"x1");
1680 var y1 = getAttributeVal(obj,"y1");
1681 var x2 = getAttributeVal(obj,"x2");
1682 var y2 = getAttributeVal(obj,"y2");
1683 var d = (y2-y1)/(x2-x1);
1684
1685 if(res){
1686 var xx = Math.abs(x2-x1);
1687 var sign = 1;
1688 if(x2-x1 < 0){ sign = -1; }
1689 for(var i=0; i < xx; i++){
1690 var nx = i*sign + x1;
1691 var ny = d * i*sign + y1;
1692 if(x < nx && nx < ex && y < ny && ny < ey) return true;
1693 }
1694 }
1695 return false;
1696
1697 return res;
1698 break;
1699 case 'text':
1700 case 'rect':
1701 case 'polygon':
1702 case 'polyline':
1703 case 'image':
1704 break;
1705 default:
1706 res=false;
1707 break;
1708 }
1709 return res;
1710 }
1711
1712 function getBoundingBox(obj){
1713 var res = new Array(4);
1714 var bbox = obj.getBBox();
1715 res[0] = bbox.x-1;
1716 res[1] = bbox.y-1;
1717 res[2] = bbox.x+bbox.width+2;
1718 res[3] = bbox.y+bbox.height+2;
1719 return res;
1720 }
1721
1722 function setSelectBox(){
1723 if(!svg_select) return;
1724
1725 if(selectedItems.length == 0){
1726 svg_select.setAttribute("visibility","hidden");
1727 return;
1728 }
1729
1730 var bbox = new Array(4);
1731 bbox[0] = 1000;
1732 bbox[1] = 1000;
1733 bbox[2] = 0;
1734 bbox[3] = 0;
1735
1736 for(var i=0;i<selectedItems.length;i++){
1737 var bp = getBoundingBox(selectedItems[i]);
1738 if(bp[0] < bbox[0]) bbox[0]=bp[0];
1739 if(bp[1] < bbox[1]) bbox[1]=bp[1];
1740 if(bp[2] > bbox[2]) bbox[2]=bp[2];
1741 if(bp[3] > bbox[3]) bbox[3]=bp[3];
1742 }
1743 svg_select.setAttribute("x", bbox[0]);
1744 svg_select.setAttribute("y", bbox[1]);
1745 svg_select.setAttribute("width", bbox[2] - bbox[0]);
1746 svg_select.setAttribute("height", bbox[3] - bbox[1]);
1747 svg_select.setAttribute("visibility","visible;");
1748 }
1749
1750 function getSelectedObjects(x1, y1, x2, y2){
1751 if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1752 if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1753
1754 var val="";
1755 if(svg_top){
1756 var val ="";
1757 var objs = svg_top.childNodes;
1758 selectedItems = new Array();
1759 for(var i=0; i<objs.length;i++){
1760 if(objs[i].tagName){
1761
1762 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1763 selectedItems.push(objs[i]);
1764 }
1765 val += objs[i].tagName+" ";
1766 }
1767 }
1768 }
1769 setSelectBox();
1770 }
1771
1772 function onTouchStartCore(){
1773 if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1774 var x1=getPreviewX(sx-1);
1775 var y1=getPreviewY(sy-1);
1776 var x2=getPreviewX(sx+2);
1777 var y2=getPreviewY(sy+2);
1778 getSelectedObjects(x1, y1, x2, y2);
1779
1780 if(selectedItems.length == 0){
1781 setSVGMode('selector');
1782 }else if(selectedItems.length == 1){
1783 targetItem=selectedItems[0];
1784 setSVGMode(getElementTag(targetItem));
1785 }else{
1786 setSVGMode('Group');
1787 }
1788 }else { // CreateMode
1789 if(selectedItems.length == 0){
1790
1791 var fill=document.getElementById('svg_fill');
1792 var color=document.getElementById('svg_color');
1793 var L=document.getElementById('svg_stroke');
1794
1795 var x = getPreviewX(sx);
1796 var y = getPreviewY(sy);
1797
1798 switch(modeSVG){
1799 case 'text':
1800 var txt=document.getElementById('svg_text');
1801 var size=document.getElementById('svg_size');
1802 if(txt.value){
1803 y = y + parseInt(size.value)*0.8;
1804 targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1805 }else{
1806 putInputForm(x, y, txt.value, size.value);
1807 }
1808 break;
1809 case 'rect':
1810 var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1811 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1812 break;
1813 case 'circle':
1814 var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1815 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1816 break;
1817 case 'ellipse':
1818 var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1819 targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1820 break;
1821 case 'newPath':
1822 var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1823 targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1824 break;
1825 case 'newLine':
1826 var x2=x+1;
1827 var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1828 targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1829 break;
1830 case 'image':
1831 var attr = 'x='+x+',y='+y;
1832 var txt=document.getElementById('svg_text');
1833 var w=document.getElementById('svg_w');
1834 var h=document.getElementById('svg_h');
1835 if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1836 default:
1837 break;
1838 }
1839 if (targetItem){
1840 appendSVGObj(targetItem);
1841 selectedItems[0]=targetItem;
1842 }
1843 }else{
1844 var x1=getPreviewX(sx-1);
1845 var y1=getPreviewY(sy-1);
1846 var x2=getPreviewX(sx+2);
1847 var y2=getPreviewY(sy+2);
1848 if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1849 setSVGMode('selector');
1850 }
1851 }
1852 }
1853 }
1854
1855
1856 function onDoubleTap(e){
1857 if(selectedItems.length == 1 ){
1858 svg_select.setAttribute("visibility","hidden");
1859
1860 var obj = selectedItems[0];
1861 switch(obj.tagName){
1862 case 'svg:text':
1863 case 'text':
1864 var txt = trim(obj.textContent);
1865 var size = parseInt(obj.getAttribute("font-size"));
1866 var x = parseInt(obj.getAttribute("x"));
1867 var y = parseInt(obj.getAttribute("y"));
1868 x = x-20;
1869 y = y-size*0.8 -10;
1870 putInputForm(x, y, txt, size, obj.id);
1871 obj.style.display = 'none';
1872 editingTextObj = obj;
1873 break;
1874 default:
1875 break;
1876 }
1877 return false;
1878 }
1879 }
1880
1881 function getPoints(d){
1882 var p = d.split(' ');
1883 var res = new Array();
1884 var isx=true;
1885 var x, y;
1886 for(var i=0; i<p.length;i++){
1887 if(p[i].match('[MLHVCSQTA]','i')){
1888 }else{
1889 if(isx){
1890 x = parseInt(p[i]);
1891 }else{
1892 y = parseInt(p[i]);
1893 res.push(new Array(x, y));
1894 }
1895 isx = !isx;
1896 }
1897 }
1898 return res;
1899 }
1900
1901 function updatePath(d, x, y){
1902 var p = d.split(' ');
1903 var res = "";
1904 var isx=true;
1905 var val;
1906 for(var i=0; i<p.length;i++){
1907 if(p[i].match('[MLHVCSQTA]','i')){
1908 res += ' '+p[i];
1909 }else{
1910 if(isx){
1911 val = parseInt(p[i])+x;
1912 }else{
1913 val = parseInt(p[i])+y;
1914 }
1915
1916 res += ' '+ val;
1917 isx = !isx;
1918 }
1919 }
1920 return trim(res);
1921 }
1922
1923 function updateTransform(obj){
1924 try{
1925 var trans = obj.getAttribute("transform");
1926 if(!trans) return;
1927 if(trans.match(new RegExp("translate(.+,.+)","i"))){
1928 var str = RegExp.lastMatch;
1929 var vals = str.substr(10,str.length-11).split(',') ;
1930 var dx = parseInt(vals[0]);
1931 var dy = parseInt(vals[1]);
1932 switch(getElementTag(obj)){
1933 case 'text':
1934 case 'rect':
1935 case 'image':
1936 addAttributeVal(obj, "x", dx);
1937 addAttributeVal(obj, "y", dy);
1938 break;
1939 case 'circle':
1940 case 'ellipse':
1941 addAttributeVal(obj, "cx", dx);
1942 addAttributeVal(obj, "cy", dy);
1943 break;
1944
1945 case 'path':
1946 var path = obj.getAttribute("d");
1947 obj.setAttribute("d", updatePath(path, dx, dy));
1948 break;
1949 case 'line':
1950 var x1 = getAttributeVal(obj,"x1");
1951 var y1 = getAttributeVal(obj,"y1");
1952 var x2 = getAttributeVal(obj,"x2");
1953 var y2 = getAttributeVal(obj,"y2");
1954 obj.setAttribute("x1", x1+dx);
1955 obj.setAttribute("y1", y1+dy);
1956 obj.setAttribute("x2", x2+dx);
1957 obj.setAttribute("y2", y2+dy);
1958
1959 break;
1960 default:
1961 break;
1962 }
1963 replaceTranslate(obj, 0, 0);
1964 updateRotate(obj);
1965 }
1966 }catch (e){
1967 }
1968 }
1969
1970 function moveSelectedRectangle(dx, dy){
1971 if(!svg_select) return;
1972 svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1973 }
1974
1975 function updateSelectedRectangle(){
1976 if(!svg_select) return;
1977 if(selectedItems.length > 0){
1978 svg_select.setAttribute("visibility","visible");
1979 }else{
1980 svg_select.setAttribute("visibility","hidden");
1981 }
1982 }
1983
1984 function clearSelectedItems(){
1985 for(i in selectedItems) delete selectedItems[i];
1986 }
1987
1988
1989 function replaceTranslate(obj, dx, dy){
1990 var trans = obj.getAttribute("transform");
1991
1992 if(trans && trans.indexOf("translate")>=0){
1993 var strs = trans.split(' ');
1994 trans = "";
1995 for(var i=0; i<strs.length; i++){
1996 if(strs[i].indexOf("translate")>=0){
1997 if (dx == 0 && dy == 0){ strs[i]=""; }else{ strs[i] = "translate("+dx+","+dy+")"; }
1998 }
1999
2000 trans += strs[i]+" ";
2001 }
2002 if(trim(trans)){ obj.setAttribute("transform", trim(trans));}
2003 else obj.removeAttribute("transform");
2004 }else{
2005 if(trans){
2006 trans += " translate("+dx+","+dy+")";
2007 obj.setAttribute("transform", trans);
2008 }else{
2009 obj.setAttribute("transform","translate("+dx+","+dy+")");
2010 }
2011 }
2012 updateRotate(obj,dx,dy);
2013 }
2014
2015 function updateRotate(obj,dx,dy){
2016 var trans = obj.getAttribute("transform");
2017
2018 if(!trans || trans.indexOf("rotate") < 0) return;
2019 var bbox = obj.getBBox();
2020 var x = bbox.x+bbox.width/2;
2021 var y = bbox.y+bbox.height/2;
2022 var strs = trans.split(' ');
2023 trans = "";
2024
2025 for(var i=0; i<strs.length ;i++){
2026 if(strs[i].indexOf("rotate") >= 0){
2027 var deg = strs[i].substr(7, strs[i].indexOf(",")-7);
2028 if(dx) x += dx;
2029 if(dy) y += dy;
2030 strs[i] = "rotate("+deg+","+x+","+y+")";
2031 }
2032 trans += strs[i]+" ";
2033 }
2034 obj.setAttribute("transform",trim(trans));
2035 }
2036
2037 function getRotateAngle(obj){
2038 var trans = obj.getAttribute("transform");
2039 if(!trans || trans.indexOf("rotate") < 0) return 0;
2040 var strs = trans.split(' ');
2041 for(var i=0; i<strs.length ;i++){
2042 if(strs[i].indexOf("rotate") >= 0){
2043 var deg = strs[i].substr(7, strs[i].indexOf(",")-7);
2044 return parseInt(deg);
2045 }
2046 }
2047 return 0;
2048 }
2049
2050 function setRotate(obj,deg){
2051 var trans = obj.getAttribute("transform");
2052 var bbox = obj.getBBox();
2053 var x = bbox.x+bbox.width/2;
2054 var y = bbox.y+bbox.height/2;
2055
2056 if(!trans) trans="";
2057 if(trans.indexOf("rotate") < 0){
2058 trans = "rotate("+deg+","+x+","+y+")";
2059 obj.setAttribute("transform", trans);
2060 }else{
2061 var strs = trans.split(' ');
2062 trans = "";
2063 for(var i=0; i<strs.length ;i++){
2064 if(strs[i].indexOf("rotate") >= 0){ strs[i] = "rotate("+deg+","+x+","+y+")"; }
2065 trans += strs[i]+" ";
2066 }
2067 obj.setAttribute("transform",trim(trans));
2068 }
2069 }
2070
2071 function onTouchMoveCode1(pageX, pageY){
2072 if(targetItem || selectedItems.length > 0){
2073 switch(modeSVG){
2074 case 'newPath':
2075 if(targetItem.tagName == 'path' ){
2076 var path = targetItem.getAttribute("d");
2077 path = path + ' '+ getPreviewX(pageX) + ' '+ getPreviewY(pageY) ;
2078 targetItem.setAttribute("d",path);
2079 }
2080 break;
2081 case 'newLine':
2082 if(targetItem.tagName == 'line' ){
2083 var x2 = getPreviewX(pageX);
2084 var y2 = getPreviewY(pageY);
2085 targetItem.setAttribute("x2",x2);
2086 targetItem.setAttribute("y2",y2);
2087 }
2088 break;
2089 default:
2090 var dx = pageX - sx;
2091 var dy = pageY - sy;
2092
2093 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
2094 var lx = getPreviewX(pageX);
2095 var ly = getPreviewY(pageY);
2096
2097 if(!lineEdit){
2098 var x1 = getAttributeVal(selectedItems[0],"x1");
2099 var y1 = getAttributeVal(selectedItems[0],"y1");
2100 var x2 = getAttributeVal(selectedItems[0],"x2");
2101 var y2 = getAttributeVal(selectedItems[0],"y2");
2102 var xc = (x1+x2)/2;
2103 var yc = (y1+y2)/2;
2104 var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
2105 var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
2106 var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
2107
2108 var minVal = Math.min(eS, Math.min(eC, eE));
2109 if(minVal == eS) lineEdit='start';
2110 else if(minVal == eE) lineEdit='end';
2111 else lineEdit='move';
2112 }
2113 if(lineEdit=='start'){
2114 selectedItems[0].setAttribute("x1",lx );
2115 selectedItems[0].setAttribute("y1",ly );
2116 setSelectBox();
2117 }else if(lineEdit == 'end'){
2118 selectedItems[0].setAttribute("x2",lx );
2119 selectedItems[0].setAttribute("y2",ly );
2120 setSelectBox();
2121 }else{
2122 replaceTranslate(selectedItems[0], dx, dy);
2123 // selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
2124 moveSelectedRectangle(dx, dy);
2125 }
2126 }else{
2127 for(var i=0; i<selectedItems.length;i++){
2128 if(selectedItems[i]){
2129 // selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
2130 replaceTranslate(selectedItems[i], dx, dy);
2131 }
2132 }
2133 moveSelectedRectangle(dx, dy);
2134 }
2135 break;
2136 }
2137 updateShowMenu();
2138 }else if(modeSVG == 'selector'){
2139 ex = pageX;
2140 ey = pageY;
2141 var x1=sx;
2142 var y1=sy;
2143 var x2=ex;
2144 var y2=ey;
2145
2146 if(sx > ex){ x1=ex; x2=sx; }
2147 if(sy > ey){ y1=ey; y2=sy; }
2148
2149 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
2150 }
2151 }
2152
2153 function svgInputTextExec(e){
2154 var inputform = document.getElementById('svg_input');
2155 var color=document.getElementById('svg_color');
2156 var size=document.getElementById('svg_size');
2157 if(!color || !size) return;
2158 var y = parseInt(inputform.style.top) + parseInt(size.value)*0.8 + 12;
2159 var x = parseInt(inputform.style.left) + 12;
2160 if(inputform.value){
2161 targetItem=createSVGText(inputform.value, x, y, size.value, color.value);
2162
2163 appendSVGObj(targetItem);
2164 }
2165 inputform.setAttribute("type", "hidden");
2166 setSVGMode('selector');
2167 }
2168
2169 function svgModifyTextExec(e){
2170 var inputform = document.getElementById('svg_input');
2171 editingTextObj.textContent = inputform.value;
2172 inputform.setAttribute("type", "hidden");
2173 editingTextObj.style.display='block';
2174
2175 editingTextObj=null;
2176 setSVGMode('selector');
2177 }
2178
2179 function svgInputFormAdjust(e){
2180 var inputform = document.getElementById('svg_input');
2181 inputform.size = jstrlen(inputform.value) + 1;
2182 }
2183
2184 function jstrlen(str) {
2185 var len = 0;
2186 str = escape(str);
2187 for (var i = 0; i < str.length; i++, len++) {
2188 if (str.charAt(i) == "%") {
2189 if (str.charAt(++i) == "u") {
2190 i += 3;
2191 len++;
2192 }
2193 i++;
2194 }
2195 }
2196 return len;
2197 }
2198
2199 function putInputForm(x, y, txt, size, id){
2200 var inputform = document.getElementById('svg_input');
2201 if(!inputform){
2202 inputform = document.createElement('input');
2203 inputform.setAttribute("id", "svg_input");
2204 inputform.setAttribute("style", "position:absolute;top:0px;left:0px; border:0px none");
2205 preview.appendChild(inputform);
2206 }
2207
2208 if(document.addEventListner){
2209 if(id){
2210 inputform.addEventListener("onChange", svgModifyTextExec,false);
2211 }else{
2212 inputform.addEventListener("onChange", svgInputTextExec,false);
2213 }
2214 inputform.addEventListener("onkeydown", svgInputFormAdjust,false);
2215 }else{
2216 if(id){
2217 inputform.setAttribute("onChange", "svgModifyTextExec()");
2218 }else{
2219 inputform.setAttribute("onChange", "svgInputTextExec()");
2220 }
2221 inputform.setAttribute("onkeydown", "svgInputFormAdjust()");
2222 }
2223
2224 inputform.setAttribute("type", "text");
2225 inputform.style.left=x+'px';
2226 inputform.style.top=y+'px';
2227 inputform.style.fontSize=size+'px';
2228 inputform.style.background='none';
2229 inputform.value = txt;
2230 inputform.size = jstrlen(txt) + 1;
2231 inputform.focus();
2232 }
2233
2234 ///// EventHandler for iPad
2235 var firstTouch = new Date();
2236
2237 function onTouchStart(e){
2238 //e.preventDefault();
2239 sx=e.touches[0].pageX;
2240 sy=e.touches[0].pageY;
2241 ex=e.touches[0].pageX;
2242 ey=e.touches[0].pageY;
2243
2244 if (e.touches.length == 1){
2245 var touchtime = new Date();
2246 var dt = touchtime.getTime() - firstTouch.getTime();
2247 if(editingTextObj){
2248 var inputform = document.getElementById('svg_input');
2249 inputform.setAttribute("type", "hidden");
2250 editingTextObj.style.display='block';
2251 editingTextObj=null;
2252 }
2253 if(dt < 300 ){ onDoubleTap(); }else{ onTouchStartCore(); }
2254 firstTouch = touchtime;
2255 }
2256 updateSelectedRectangle();
2257 }
2258
2259 function onTouchMove(e){
2260 if (e.touches.length == 1){
2261 e.preventDefault();
2262 onTouchMoveCode1(e.touches[0].pageX, e.touches[0].pageY);
2263 }else if (e.touches.length == 2){
2264 if(selectedItems.length == 1){
2265 e.preventDefault();
2266 var dx = e.touches[0].pageX-e.touches[1].pageX;
2267 var dy = e.touches[0].pageY-e.touches[1].pageY;
2268 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2269
2270 if(th > 165 || th < 25) svg_scale_dir = 'x';
2271 else if(th > 65 && th < 115) svg_scale_dir = 'y';
2272 else svg_scale_dir = null;
2273 }
2274 }
2275 }
2276
2277 function onTouchEnd(e){
2278 e.preventDefault();
2279
2280 for(var i=0; i<selectedItems.length;i++){
2281 updateTransform(selectedItems[i]);
2282 }
2283
2284 if(modeSVG == 'selector'){
2285 var x1 = getPreviewX(sx);
2286 var y1 = getPreviewY(sy);
2287 var x2 = getPreviewX(ex);
2288 var y2 = getPreviewY(ey);
2289 getSelectedObjects(x1, y1, x2, y2);
2290 }
2291
2292 updateSelectedRectangle();
2293 updateTransform(svg_select);
2294
2295 setSelectBox();
2296 updateShowMenu();
2297 var btn = document.getElementById('b_'+modeSVG);
2298 if(btn){
2299 btn.style.border="3px solid red";
2300 }
2301 lineEdit=null;
2302 }
2303
2304
2305 function onGestureStart(e){
2306 targetItem = selectedItems[0];
2307 if(targetItem){
2308 svg_wo = targetItem.getAttribute("width");
2309 svg_ho = targetItem.getAttribute("height");
2310 svg_ro = targetItem.getAttribute("r");
2311 svg_rxo = targetItem.getAttribute("rx");
2312 svg_ryo = targetItem.getAttribute("ry");
2313 svg_fsize = targetItem.getAttribute("font-size");
2314 }else{
2315 svg_wo = null;
2316 svg_ho = null;
2317 svg_ro = null;
2318 svg_rxo = null;
2319 svg_ryo = null;
2320 svg_fsize = null;
2321 }
2322 }
2323
2324 function onGestureChange(e){
2325 var scale = e.scale;
2326 var rotation = e.rotation;
2327
2328 if(targetItem){
2329 e.preventDefault();
2330 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
2331 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
2332 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
2333 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
2334 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
2335 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
2336 if (!svg_rotate_locked) setRotate(targetItem, rotation);
2337
2338 updateShowMenu();
2339 }
2340 }
2341
2342 function onGestureEnd(e){
2343 // e.preventDefault();
2344 svg_wo = null;
2345 svg_ho = null;
2346 svg_ro = null;
2347 svg_rxo = null;
2348 svg_ryo = null;
2349 svg_fsize = null;
2350 }
2351
2352 function onTouchStartColor(e){
2353 if(e.touches.length == 1){
2354 var ele = e.touches[0].target;
2355 var color;
2356 try{
2357 color = ele.getAttribute("color-val");
2358 }catch(err){ hideItemById('color-palette'); return;}
2359 var palette = document.getElementById('color-palette');
2360 var color_sel = palette.getAttribute("targetType");
2361 var fill_input = document.getElementById('svg_fill');
2362 var color_input = document.getElementById('svg_color');
2363 if(color) {
2364 for(var i=0;i < selectedItems.length; i++){
2365 selectedItems[i].setAttribute(color_sel, color);
2366 if(color_sel == 'fill'){
2367 if(fill_input) fill_input.value=color;
2368 document.getElementById('toolFill').style.backgroundColor=color;
2369 }else{
2370 color_input.value=color;
2371 document.getElementById('toolStroke').style.backgroundColor=color;
2372 }
2373 }
2374 }
2375 palette.style.display='none';
2376 }
2377 }
2378 ///// For Safari
2379 var mouse_state=0;
2380
2381 function onMouseDown(e){
2382 mouse_state=e.which;
2383
2384 sx=e.pageX;
2385 sy=e.pageY;
2386 ex=e.pageX;
2387 ey=e.pageY;
2388
2389 if(isChildById(e.target, 'preview') || e.target.id == 'preview') {
2390 if(editingTextObj){
2391 var inputform = document.getElementById('svg_input');
2392 inputform.setAttribute("type", "hidden");
2393 editingTextObj.style.display='block';
2394 editingTextObj=null;
2395 }
2396
2397 if(e.altKey){
2398 targetItem = selectedItems[0];
2399 if(targetItem){
2400 svg_wo = targetItem.getAttribute("width");
2401 svg_ho = targetItem.getAttribute("height");
2402 svg_ro = targetItem.getAttribute("r");
2403 svg_rxo = targetItem.getAttribute("rx");
2404 svg_ryo = targetItem.getAttribute("ry");
2405 svg_fsize = targetItem.getAttribute("font-size");
2406 }else{
2407 svg_wo = null;
2408 svg_ho = null;
2409 svg_ro = null;
2410 svg_rxo = null;
2411 svg_ryo = null;
2412 svg_fsize = null;
2413 }
2414 }else{
2415 onTouchStartCore();
2416 }
2417 updateSelectedRectangle();
2418 return false;
2419 }else if(isChildById(e.target, 'color-palette') && e.target.tagName == 'DIV'){
2420 var ele = e.target;
2421 var palette = document.getElementById('color-palette');
2422 var color = ele.getAttribute("color-val");
2423 var color_sel = palette.getAttribute("targetType");
2424 var fill_input = document.getElementById('svg_fill');
2425 var color_input = document.getElementById('svg_color');
2426 if(color) {
2427 for(var i=0;i < selectedItems.length; i++){
2428 selectedItems[i].setAttribute(color_sel, color);
2429 if(color_sel == 'fill'){
2430 if(fill_input) fill_input.value=color;
2431 document.getElementById('toolFill').style.backgroundColor=color;
2432 }else{
2433 color_input.value=color;
2434 document.getElementById('toolStroke').style.backgroundColor=color;
2435 }
2436 }
2437 palette.style.display='none';
2438 }
2439 return false;
2440 }
2441 return true;
2442 }
2443
2444 function onMouseMove(e){
2445 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2446
2447 if(mouse_state == 1) {
2448 if(e.altKey){
2449 var dx = sx-e.pageX;
2450 var dy = sy-e.pageY;
2451 var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
2452 var scale;
2453
2454 if(th > 165 || th < 25){
2455 svg_scale_dir = 'x';
2456 scale = -dx/50;
2457 }else if(th > 65 && th < 115){
2458 svg_scale_dir = 'y';
2459 scale = -dy/50;
2460 }else{
2461 svg_scale_dir = null;
2462 if(dx > 0 && dy > 0) scale = -dx*dy/2500;
2463 else if(dx < 0 && dy < 0) scale = dx*dy/2500;
2464 else scale = 1;
2465 }
2466
2467 if(scale >= 0){
2468 if(scale < 1) scale=1;
2469 }else{
2470 if(scale > -1) scale=1;
2471 else{
2472 scale= -1/scale;
2473 }
2474 }
2475 if(targetItem){
2476 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
2477 if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
2478 if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
2479 if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
2480 if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
2481 if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
2482
2483 updateShowMenu();
2484 }
2485 }else if(e.shiftKey){
2486 if(targetItem){
2487 var dy = e.pageY -sy;
2488 var deg = dy % 360;
2489 setRotate(targetItem, deg);
2490 var ele = document.getElementById('svg_rotate');
2491 if(ele) ele.value=deg;
2492 }
2493 }else {
2494 onTouchMoveCode1(e.pageX, e.pageY);
2495 }
2496 }
2497
2498 return false;
2499 }
2500
2501 function onMouseUp(e){
2502 mouse_state = 0;
2503 if(!isChildById(e.target, 'preview') && e.target.id != 'preview') { return true; }
2504
2505 for(var i=0; i<selectedItems.length;i++){
2506 updateTransform(selectedItems[i]);
2507 }
2508
2509 if(modeSVG == 'selector'){
2510 var x1 = getPreviewX(sx);
2511 var y1 = getPreviewY(sy);
2512 var x2 = getPreviewX(ex);
2513 var y2 = getPreviewY(ey);
2514 getSelectedObjects(x1, y1, x2, y2);
2515 }
2516
2517 updateSelectedRectangle();
2518 updateTransform(svg_select);
2519
2520 setSelectBox();
2521 updateShowMenu();
2522 var btn = document.getElementById('b_'+modeSVG);
2523 if(btn){
2524 btn.style.border="3px solid red";
2525 }
2526 lineEdit=null;
2527
2528 }
2529
2530 if(!navigator.userAgent.match("iPad")){
2531 document.onmousedown=onMouseDown;
2532 document.onmousemove=onMouseMove;
2533 document.onmouseup=onMouseUp;
2534 document.ondblclick=onDoubleTap;
2535 }
2536

Properties

Name Value
svn:executable *

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