Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 36 - (hide 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 isao-hara 2 /*
2 isao-hara 31 SvgEditor.js
3 isao-hara 2
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 isao-hara 24
35 isao-hara 2 ////// 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 isao-hara 25 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 isao-hara 27 var editingTextObj = null;
63    
64 isao-hara 14 ///// 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 isao-hara 2 //// 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 isao-hara 33 restoreValues();
93 isao-hara 2 }
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 isao-hara 25
103 isao-hara 2 function clearAll(){
104     localsStorage.clear();
105     restoreValudes();
106     }
107    
108     function saveChanges(){
109 isao-hara 33 localStorage.setItem('MgrPath', MgrPath);
110 isao-hara 2 }
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 isao-hara 14 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 isao-hara 17 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 isao-hara 2 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 isao-hara 16 Menu += "<button onClick=\"getRemoteFileList();\">List on Server</button>";
506 isao-hara 2 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 isao-hara 16 res += "<button onClick=\"downloadFile('"+name+"');\">Download to local storage</button>";
518     res += "<button onClick=\"downloadToFile('"+name+"');\">Download as SVG File</button>";
519 isao-hara 2 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 isao-hara 25 menu += "<li><button onClick='configServer()'>Server Configuration</button></li>";
546 isao-hara 2 menu += "</ul><p class='cls'>";
547     return menu;
548     }
549    
550 isao-hara 25 //// Config
551     function setConfig(){
552     var ele = document.getElementById('ServerURL');
553     MgrPath=ele.value;
554 isao-hara 33 saveChanges();
555 isao-hara 25 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 isao-hara 2 ////
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 isao-hara 18 if( results.rows.length == 0) return;
690 isao-hara 2 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 isao-hara 36 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 isao-hara 2 // 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 isao-hara 36 menuDiv.innerHTML+= "<button onClick=\"upItem();\">Up</button>\n";
761     menuDiv.innerHTML+= "<button onClick=\"downItem();\">Down</button>\n";
762 isao-hara 2 menuDiv.innerHTML+= updateSVGObjMenu();
763     menuDiv.style.display='block';
764     updateToolBar();
765     }
766    
767 isao-hara 25 function showColorPalette(val){
768     var palette = document.getElementById('color-palette');
769     var ele;
770     var current = palette.getAttribute("targetType");
771 isao-hara 2
772 isao-hara 25 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 isao-hara 2 function updateToolBar(){
791     var toolbar = document.getElementById('toolBar');
792 isao-hara 25 var str = "";
793 isao-hara 14 if(!toolbar.innerHTML){
794 isao-hara 25 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 isao-hara 14 }
807 isao-hara 25
808 isao-hara 2 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 isao-hara 14 hideItemById('color-palette');
820 isao-hara 2 showItemById('menuDiv');
821     break;
822     case 'Edit':
823     hideItemById('preview');
824     hideItemById('popup');
825     hideItemById('toolBar');
826 isao-hara 14 hideItemById('color-palette');
827 isao-hara 2 showItemById('editDiv');
828     showItemById('menuDiv');
829     break;
830     case 'Preview':
831     showItemById('preview');
832     hideItemById('editDiv');
833     hideItemById('popup');
834 isao-hara 25 hideItemById('color-palette');
835 isao-hara 2 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 isao-hara 14 preview.style.bottom='50px';
896     preview.style.left='0px';
897     preview.style.right='10px';
898 isao-hara 21 preview.style.width='800px';
899     // preview.style.height='600px';
900     preview.style.height='525px';
901 isao-hara 14 mkColorPalette();
902 isao-hara 2
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 isao-hara 14 }
913 isao-hara 2
914 isao-hara 14 function mkColorPalette(){
915     var palette = document.getElementById('color-palette');
916     if(!palette) return;
917     if(palette.innerHTML) return;
918    
919     palette.innerHTML="";
920 isao-hara 32 palette.addEventListener("touchstart", onTouchStartColor, false);
921 isao-hara 30
922 isao-hara 14 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 isao-hara 25 palette.style.width='120px';
929 isao-hara 2 }
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 isao-hara 36 res += propSVGText("", svg_font_size, svg_color, 0);
945 isao-hara 2 }
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 isao-hara 36 res += propSVGObj(tag+":", svg_line_width, svg_color, svg_fill_color, 0);
960 isao-hara 2 }
961     break;
962 isao-hara 5 case 'image':
963     if(selectedItems[0]){
964     res += setSVGObjectProp(selectedItems[0]);
965     }else{
966 isao-hara 36 res += propSVGImage("", 100, 100, 0);
967 isao-hara 5 }
968     break;
969 isao-hara 2 default:
970     break;
971     }
972     return res;
973     }
974    
975 isao-hara 36 function propSVGText(str, size, color, rot){
976 isao-hara 2 if(!size) size = 24;
977     if(!color) color = '#000000';
978 isao-hara 36 if(!rot) rot = 0;
979 isao-hara 2
980     var res = "Text:";
981 isao-hara 28 res += "<input type=\"hidden\" id=\"svg_text\" value=\""+str+"\"/>";
982     res += "<input type=\"hidden\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
983 isao-hara 36 res += "Rot:<input type=\"text\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
984    
985 isao-hara 2 res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
986 isao-hara 25
987     document.getElementById('toolFill').style.backgroundColor=color;
988 isao-hara 2 return res;
989     }
990    
991 isao-hara 36 function propSVGObj(type, stroke, color, fill, rot){
992 isao-hara 2 var res = type;
993     if(!stroke) stroke = 1;
994     if(!color) color = '#000000';
995     if(!fill) fill = '#ffffff';
996 isao-hara 36 if(!rot) rot = 0;
997 isao-hara 28 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 isao-hara 36 res += "Rot:<input type=\"text\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
1001 isao-hara 25
1002     document.getElementById('toolFill').style.backgroundColor=fill;
1003     document.getElementById('toolStroke').style.backgroundColor=color;
1004 isao-hara 2 return res;
1005     }
1006    
1007 isao-hara 36 function propSVGLine(type, stroke, color, fill, style, rot){
1008     var res = propSVGObj(type, stroke, color, fill, rot);
1009     if(!rot) rot = 0;
1010 isao-hara 14 if(style==null) style="";
1011 isao-hara 2 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
1012     res += "Arrow:";
1013 isao-hara 36
1014 isao-hara 2 if(hasArrow('start')){
1015 isao-hara 14 res += "<button class=\"tool\" onClick=\"removeLeftArrow();\"><img src=\"images/normal.png\" /></button>";
1016 isao-hara 2 }else{
1017 isao-hara 14 res += "<button class=\"tool\" onClick=\"setLeftArrow();\"><img src=\"images/larrow.png\" /></button>";
1018 isao-hara 2 }
1019     if(hasArrow('end')){
1020 isao-hara 14 res += "<button class=\"tool\" onClick=\"removeRightArrow();\"><img src=\"images/normal.png\" /></button>";
1021 isao-hara 2 }else{
1022 isao-hara 14 res += "<button class=\"tool\" onClick=\"setRightArrow();\"><img src=\"images/rarrow.png\" /></button>";
1023 isao-hara 2 }
1024 isao-hara 25
1025     document.getElementById('toolFill').style.backgroundColor=fill;
1026     document.getElementById('toolStroke').style.backgroundColor=color;
1027    
1028 isao-hara 2 return res;
1029     }
1030    
1031 isao-hara 36 function propSVGImage(str, w, h, rot){
1032 isao-hara 5 var res = "image:";
1033 isao-hara 36 if(!rot) rot = 0;
1034 isao-hara 5 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 isao-hara 36 res += "Rot:<input type=\"text\" id=\"svg_rotate\" value=\""+rot+"\" size=\"4\"/>";
1038 isao-hara 5 return res;
1039     }
1040    
1041 isao-hara 2 function setSVGMode(m){
1042 isao-hara 14 var btn = document.getElementById('b_'+modeSVG);
1043     if(btn){ btn.style.border="1px solid black"; }
1044    
1045 isao-hara 2 modeSVG = m;
1046     updateShowMenu();
1047 isao-hara 4
1048 isao-hara 2 if(m == 'selector'){
1049     targetItem=null;
1050     clearSelectedItems();
1051     }
1052 isao-hara 4 var btn = document.getElementById('b_'+modeSVG);
1053 isao-hara 14 if(btn){ btn.style.border="3px solid red"; }
1054 isao-hara 2 }
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 isao-hara 7 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1176 isao-hara 2 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 isao-hara 36 updateShowMenu();
1195 isao-hara 2 }
1196     }
1197    
1198     function setRightArrow(){
1199     if( selectedItems.length == 1 ){
1200     setArrow(selectedItems[0], 'end', '');
1201 isao-hara 36 updateShowMenu();
1202 isao-hara 2 }
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 isao-hara 36 updateShowMenu();
1213 isao-hara 2 }
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 isao-hara 13 var tmp = trim(formatTag(cn[i]));
1316     if(tmp) str += " "+tmp+"\n";
1317 isao-hara 2 }
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 isao-hara 12 if(elements[i] != svg_select){
1335     var tmp = trim(formatTag(elements[i]));
1336     if(tmp) str += tmp + '\n';
1337     }
1338 isao-hara 2 }
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 isao-hara 16 function saveRemoteFile(content){
1415 isao-hara 17 var datadiv = document.getElementById('tempdata');
1416     var fname = datadiv.getAttribute('lfname');
1417     saveContentWithFilename(fname, content);
1418 isao-hara 16 }
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 isao-hara 2 function showRemoteFile(name){
1430     getRemoteFile(name);
1431     }
1432    
1433 isao-hara 16 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 isao-hara 2 //////// 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 isao-hara 14 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 isao-hara 2 setInnerHTML('popup', escstr);
1475     showItemById('popup');
1476     }
1477    
1478    
1479     function getElementTag(obj){
1480 isao-hara 6 if (!obj) return null;
1481 isao-hara 2 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 isao-hara 36 res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"),getRotateAngle(obj));
1492 isao-hara 2 break;
1493     case 'rect':
1494     case 'circle':
1495     case 'ellipse':
1496 isao-hara 36 res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"),getRotateAngle(obj));
1497 isao-hara 2 break;
1498     case 'path':
1499     case 'line':
1500     res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1501 isao-hara 36 obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"),getRotateAngle(obj));
1502 isao-hara 2 break;
1503 isao-hara 5 case 'image':
1504 isao-hara 36 res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"),getRotateAngle(obj));
1505 isao-hara 5 break;
1506 isao-hara 2 default:
1507     break;
1508     }
1509     if(res != ""){
1510 isao-hara 28 res += "<button onClick=\"updateSVGObj();\">Apply</button>";
1511 isao-hara 2 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 isao-hara 36 var deg=document.getElementById('svg_rotate');
1522 isao-hara 2 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 isao-hara 36 setRotate(obj,deg.value);
1532 isao-hara 2 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 isao-hara 36 setRotate(obj,deg.value);
1543 isao-hara 2 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 isao-hara 36 setRotate(obj,deg.value);
1554 isao-hara 2 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 isao-hara 5 case 'image':
1562     var fname=document.getElementById('svg_text');
1563     var w=document.getElementById('svg_w');
1564     var h=document.getElementById('svg_h');
1565 isao-hara 6 obj.setAttribute("xlink:href", fname.value);
1566 isao-hara 5 obj.setAttribute("width", w.value);
1567     obj.setAttribute("height", h.value);
1568 isao-hara 36 setRotate(obj,deg.value);
1569 isao-hara 5 break;
1570 isao-hara 2 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 isao-hara 18 if(!obj) return false;
1605 isao-hara 2 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 isao-hara 3 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 isao-hara 2 return false;
1663    
1664 isao-hara 3 return res;
1665 isao-hara 2 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 isao-hara 3 var val="";
1722 isao-hara 2 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 isao-hara 3
1729 isao-hara 2 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1730     selectedItems.push(objs[i]);
1731     }
1732 isao-hara 3 val += objs[i].tagName+" ";
1733 isao-hara 2 }
1734     }
1735     }
1736     setSelectBox();
1737     }
1738    
1739 isao-hara 19 function onTouchStartCore(){
1740 isao-hara 35 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 isao-hara 2
1758 isao-hara 35 var fill=document.getElementById('svg_fill');
1759     var color=document.getElementById('svg_color');
1760     var L=document.getElementById('svg_stroke');
1761 isao-hara 2
1762 isao-hara 35 var x = getPreviewX(sx);
1763     var y = getPreviewY(sy);
1764 isao-hara 2
1765 isao-hara 35 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 isao-hara 2 }
1806 isao-hara 35 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 isao-hara 2 }
1819 isao-hara 35 }
1820 isao-hara 2 }
1821    
1822 isao-hara 25
1823     function onDoubleTap(e){
1824     if(selectedItems.length == 1 ){
1825 isao-hara 29 svg_select.setAttribute("visibility","hidden");
1826    
1827 isao-hara 25 var obj = selectedItems[0];
1828     switch(obj.tagName){
1829     case 'svg:text':
1830 isao-hara 29 case 'text':
1831 isao-hara 25 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 isao-hara 29 return false;
1845 isao-hara 25 }
1846     }
1847    
1848 isao-hara 2 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 isao-hara 6 case 'image':
1903 isao-hara 2 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 isao-hara 36 // obj.removeAttribute("transform");
1931     replaceTranslate(obj, 0, 0);
1932     updateRotate(obj);
1933 isao-hara 2 }
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 isao-hara 29 svg_select.setAttribute("visibility","visible");
1947 isao-hara 2 }else{
1948 isao-hara 29 svg_select.setAttribute("visibility","hidden");
1949 isao-hara 2 }
1950     }
1951    
1952     function clearSelectedItems(){
1953     for(i in selectedItems) delete selectedItems[i];
1954     }
1955    
1956 isao-hara 36
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 isao-hara 19 function onTouchMoveCode1(pageX, pageY){
2047 isao-hara 35 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 isao-hara 2
2068 isao-hara 35 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
2069     var lx = getPreviewX(pageX);
2070     var ly = getPreviewY(pageY);
2071 isao-hara 2
2072 isao-hara 35 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 isao-hara 2
2083 isao-hara 35 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 isao-hara 4 }else{
2097 isao-hara 36 replaceTranslate(selectedItems[0], dx, dy);
2098     // selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
2099 isao-hara 4 moveSelectedRectangle(dx, dy);
2100     }
2101 isao-hara 35 }else{
2102     for(var i=0; i<selectedItems.length;i++){
2103 isao-hara 36 if(selectedItems[i]){
2104     // selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
2105     replaceTranslate(selectedItems[i], dx, dy);
2106     }
2107 isao-hara 35 }
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 isao-hara 2
2121 isao-hara 35 if(sx > ex){ x1=ex; x2=sx; }
2122     if(sy > ey){ y1=ey; y2=sy; }
2123 isao-hara 2
2124 isao-hara 35 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
2125     }
2126 isao-hara 2 }
2127    
2128 isao-hara 23 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 isao-hara 29 if(!color || !size) return;
2133 isao-hara 24 var y = parseInt(inputform.style.top) + parseInt(size.value)*0.8 + 12;
2134     var x = parseInt(inputform.style.left) + 12;
2135 isao-hara 23 if(inputform.value){
2136 isao-hara 24 targetItem=createSVGText(inputform.value, x, y, size.value, color.value);
2137    
2138 isao-hara 23 appendSVGObj(targetItem);
2139     }
2140     inputform.setAttribute("type", "hidden");
2141     setSVGMode('selector');
2142     }
2143    
2144 isao-hara 25 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 isao-hara 27
2150     editingTextObj=null;
2151 isao-hara 25 setSVGMode('selector');
2152     }
2153    
2154 isao-hara 23 function svgInputFormAdjust(e){
2155     var inputform = document.getElementById('svg_input');
2156 isao-hara 24 inputform.size = jstrlen(inputform.value) + 1;
2157 isao-hara 23 }
2158    
2159 isao-hara 24 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 isao-hara 25 function putInputForm(x, y, txt, size, id){
2175 isao-hara 23 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 isao-hara 29 preview.appendChild(inputform);
2181     }
2182    
2183     if(document.addEventListner){
2184     if(id){
2185     inputform.addEventListener("onChange", svgModifyTextExec,false);
2186 isao-hara 23 }else{
2187 isao-hara 29 inputform.addEventListener("onChange", svgInputTextExec,false);
2188 isao-hara 23 }
2189 isao-hara 29 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 isao-hara 23 }
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 isao-hara 25 inputform.size = jstrlen(txt) + 1;
2206 isao-hara 23 inputform.focus();
2207     }
2208    
2209     ///// EventHandler for iPad
2210 isao-hara 25 var firstTouch = new Date();
2211    
2212 isao-hara 23 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 isao-hara 25 var touchtime = new Date();
2221     var dt = touchtime.getTime() - firstTouch.getTime();
2222 isao-hara 27 if(editingTextObj){
2223     var inputform = document.getElementById('svg_input');
2224     inputform.setAttribute("type", "hidden");
2225     editingTextObj.style.display='block';
2226     editingTextObj=null;
2227     }
2228 isao-hara 35 if(dt < 300 ){ onDoubleTap(); }else{ onTouchStartCore(); }
2229 isao-hara 25 firstTouch = touchtime;
2230 isao-hara 36 }
2231 isao-hara 35 updateSelectedRectangle();
2232 isao-hara 23 }
2233    
2234     function onTouchMove(e){
2235     if (e.touches.length == 1){
2236 isao-hara 25 e.preventDefault();
2237 isao-hara 23 onTouchMoveCode1(e.touches[0].pageX, e.touches[0].pageY);
2238     }else if (e.touches.length == 2){
2239 isao-hara 35 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 isao-hara 23
2245 isao-hara 35 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 isao-hara 23 }
2250     }
2251    
2252 isao-hara 2 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 isao-hara 4 var btn = document.getElementById('b_'+modeSVG);
2273     if(btn){
2274     btn.style.border="3px solid red";
2275     }
2276 isao-hara 2 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 isao-hara 4 var scale = e.scale;
2301     var rotation = e.rotation;
2302 isao-hara 2
2303 isao-hara 4 if(targetItem){
2304 isao-hara 7 e.preventDefault();
2305 isao-hara 4 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 isao-hara 2
2312 isao-hara 4 updateShowMenu();
2313     }
2314 isao-hara 2 }
2315    
2316     function onGestureEnd(e){
2317 isao-hara 7 // e.preventDefault();
2318 isao-hara 4 svg_wo = null;
2319     svg_ho = null;
2320     svg_ro = null;
2321     svg_rxo = null;
2322     svg_ryo = null;
2323     svg_fsize = null;
2324 isao-hara 2 }
2325    
2326 isao-hara 14 function onTouchStartColor(e){
2327     if(e.touches.length == 1){
2328     var ele = e.touches[0].target;
2329 isao-hara 25 var color;
2330     try{
2331 isao-hara 32 color = ele.getAttribute("color-val");
2332 isao-hara 25 }catch(err){ hideItemById('color-palette'); return;}
2333     var palette = document.getElementById('color-palette');
2334     var color_sel = palette.getAttribute("targetType");
2335 isao-hara 14 var fill_input = document.getElementById('svg_fill');
2336     var color_input = document.getElementById('svg_color');
2337     if(color) {
2338 isao-hara 25 for(var i=0;i