Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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