Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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