Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 14 - (hide annotations) (download) (as text)
Tue Jul 20 03:42:47 2010 UTC (13 years, 8 months ago) by isao-hara
File MIME type: application/x-javascript
File size: 55248 byte(s)
add color-palette
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 2 function showFileData(transaction, results){
344     var data = results.rows.item(0);
345     var filename = data['name'];
346     var filedata = data['datablob'];
347    
348     var datadiv = document.getElementById('tempdata');
349     datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
350    
351     document.title=filename;
352    
353     previewFile(filedata);
354    
355     updateShowMenu();
356     setMode('Preview');
357     }
358    
359     function showFile(name){
360     getFile(name, 'showFileData');
361     }
362    
363     function getFile(name, func, db){
364     var myDB = db;
365     if(!db) myDB = systemDB;
366    
367     var datadiv = document.getElementById('tempdata');
368     if(datadiv) datadiv.setAttribute('lfname', name);
369    
370     myDB.transaction(
371     function (transaction) {
372     transaction.executeSql('SELECT * from files, filedata where files.name=? and files.filedata_id = filedata.id;', [name], eval(func), errorHandler);
373     }
374     );
375     }
376    
377     // Error Handlers
378     function killTransaction(transaction, error){
379     return true;
380     }
381    
382     function errorHandler(transaction, error){
383     alert('Oops. Error was '+error.message+' (Code '+error.code+')');
384    
385     var we_think_this_error_is_fatal = true;
386     if (we_think_this_error_is_fatal) return true;
387     return false;
388     }
389    
390     function nullDataHandler(transaction, results){
391     }
392    
393     ///////////////////////////
394    
395     function fileSelector(db) {
396     var myDB = db;
397     if(!db) myDB = systemDB;
398    
399     myDB.transaction(
400     function (transaction) {
401     transaction.executeSql("SELECT * from files where deleted=0;", [ ],
402     function (transaction, results) {
403     var filelist = '';
404     var menuDiv = document.getElementById('menuDiv');
405     if(menuDiv){
406     for(var i=0; i<results.rows.length; i++) {
407     var row = results.rows.item(i);
408     filelist = filelist + fileEntry(row);
409     }
410     if (filelist == "") {
411     filelist = "No files.<br />\n";
412     } else {
413     filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
414     }
415     menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+createMenuBar()+filelist;
416     }
417     }, errorHandler);
418     }
419     );
420     setMode('List');
421     }
422    
423     function fileSelectorOnServer(val) {
424     var filelist = '';
425     var menuDiv = document.getElementById('menuDiv');
426     var results = val.split(',');
427    
428     if(menuDiv){
429     for(var i=0; i<results.length; i++) {
430     var row = results[i];
431     filelist = filelist + fileEntryOnServer(row);
432     }
433     if (filelist == "") {
434     filelist = "No files.<br />\n";
435     } else {
436     filelist = "<center><table class='filetable'>"+filelist+"</table></center>";
437     }
438     var Menu = "<button onClick=\"fileSelector();\">Local Storage</button>";
439     menuDiv.innerHTML="<H1 class='title'>"+MainTitle+"</H1>"+Menu+filelist;
440     }
441     setMode('List');
442     }
443    
444     function fileEntryOnServer(name){
445     name = name.split('.')[0];
446     var res = "<tr class='filerow'>";
447     res += "<td class='filenamecell' onClick=\"getRemoteFile('"+name+"');\">"+name+"</td>";
448     res += "<td class='filelinkcell'>";
449     res += "<button class='green' onClick=\"showRemoteFile('"+name+"');\">View</button>";
450     res += "<button onClick=\"downloadFile('"+name+"');\">Download</button>";
451     res += "</td></tr>\n";
452    
453     return res;
454     }
455    
456     function fileEntry(row){
457     var name = row['name'];
458     var files_id = row['id'];
459    
460     var res = "<tr class='filerow'>";
461     res += "<td class='filenamecell' onClick=\"showFile('"+name+"');\">"+name+"</td>";
462     res += "<td class='filelinkcell'>";
463     res += "<button class='blue' onClick=\"editFile('"+name+"');\">&nbsp;Edit&nbsp;</button> &nbsp;";
464     res += "<button class='green' onClick=\"renameFile('"+name+"',"+files_id+");\">&nbsp;Rename&nbsp;</button> &nbsp;";
465     res += "<button onClick=\"uploadFile('"+name+"');\">Upload</button>";
466     res += "<button class='red' onClick=\"deleteFile('"+name+"');\">Delete</button>";
467     res += "</td></tr>\n";
468    
469     return res;
470     }
471    
472     function createMenuBar(){
473     var menu = "<ul id='menubar'>";
474     menu += "<li><button onClick='createNewFile()'>Create New File</button></li>";
475     menu += "<li><button onClick='deleteAllFile()'>Delete All</button></li>";
476     menu += "<li><button onClick='getRemoteFileList()'>File List on a Server</button></li>";
477     menu += "</ul><p class='cls'>";
478     return menu;
479     }
480    
481     ////
482     function createNewFile(){
483     var popupDiv = document.getElementById('popup');
484     var string = "";
485    
486     string += "<H1 class='title'>Create New File</H1>\n";
487     string += "<div class=\"input_form\">\n";
488     string += "Filename:<input id='createFilename' name='name' value=\"\" />\n";
489     string += "<button onClick=\"createNewFileAction();hideItemById('popup'); \">Create</button>\n";
490     string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
491     string += "</div>\n";
492    
493     popupDiv.innerHTML=string;
494     popupDiv.style.display='block';
495     }
496    
497    
498     /////
499     function renameFile(name, id){
500     var popupDiv = document.getElementById('popup');
501     var string = "";
502    
503     string += "<H1 class='title'>Rename File</H1>\n";
504     string += "<div class='input_form'>\n";
505     string += "Old Filename: "+name+"<br>";
506     string += "New Filename:<input id='newFilename' name='newname' value=\"\" />\n";
507     string += "<input type='hidden' id='fileId' value=\""+id+"\" /><br>\n";
508     string += "<button onClick=\"renameFileAction();hideItemById('popup');\">Rename</button>\n";
509     string += "<button onClick=\"hideItemById('popup'); \">Cancel</button>\n";
510     string += "</div>\n";
511    
512     popupDiv.innerHTML=string;
513     popupDiv.style.display='block';
514     }
515    
516     /// EditMenu
517     function insertStr(str, len){
518     var editarea = document.getElementById('editarea');
519     if(len < 0) len = str.length;
520    
521     if (editarea){
522     if(str=='DQ') str='"';
523     var strs = editarea.value;
524     var cPos = editarea.selectionStart;
525     var tmp = strs.substr(0,cPos);
526     editarea.value = tmp +str+strs.substr(cPos, strs.length);
527     cPos += len;
528     editarea.setSelectionRange(cPos, cPos);
529     editarea.focus();
530     }
531     }
532    
533     function insertTag(tag){
534     var str;
535     var len = -1;
536     if (tag == "p"){
537     str = "<p> </p>";
538     len = 4;
539     }else if (tag == "ul"){
540     str = "<ul class=\" \"> \n\n</ul>";
541     len = 17;
542     }else if (tag == "li"){
543     str = "<li> </li>";
544     len = 5;
545     }else if (tag == "href"){
546     str = "xlink:href=\"\"";
547     len = 12;
548     }else if (tag == "EQ"){
549     str = "=\"\"";
550     len = 2;
551     }else if (tag == "svg:text"){
552     str = "<svg:text x=\"100\" y=\"100\" fill=\"black\" font-size=\"12\"> </svg:text>";
553     len = 58;
554     }else if (tag == "svg:rect"){
555     str = "<svg:rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"white\" stroke=\"black\" />";
556     len = 13;
557     }else if (tag == "svg:circle"){
558     str = "<svg:circle cx=\"10\" cy=\"100\" r=\"100\" fill=\"white\" stroke=\"black\" strokc-width=\"1\"/>";
559     len = 17;
560     }
561     insertStr(str, len);
562     }
563    
564     function editMenuBar()
565     {
566     var str = "";
567     str += "<button onClick=\"insertStr('/',1);\">/</button>\n";
568     str += "<button onClick=\"insertStr('DQ',1);\">\"</button>\n";
569     str += "<button onClick=\"insertTag('EQ',1);\">=\"\"</button>\n";
570     str += "<button onClick=\"insertTag('p');\">p</button>\n";
571     str += "<button onClick=\"insertTag('href');\">href</button>\n";
572    
573     str += "<button onClick=\"insertTag('svg:text');\">TEXT</button>\n";
574     str += "<button onClick=\"insertTag('svg:rect');\">rect</button>\n";
575     str += "<button onClick=\"insertTag('svg:circle');\">circle</button>\n";
576    
577     str += "<button onClick=\"chEditareaHeight();\">...</button>\n";
578    
579     return str;
580     }
581    
582     function updateEditMenu(){
583     var menuDiv = document.getElementById('menuDiv');
584     menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
585     menuDiv.innerHTML+= "<button onClick=\"saveFile();fileSelector();\"> Save </button>\n";
586     menuDiv.innerHTML+= "<button onClick=\"previewData();\"> Preview </button>\n";
587     menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
588    
589     menuDiv.style.display='block';
590     }
591    
592     //// Editor
593     function editFileData(transaction, results){
594     var editDiv = document.getElementById('editDiv');
595     var datadiv = document.getElementById('tempdata');
596    
597     var data = results.rows.item(0);
598     var filename = data['name'];
599     var filedata = data['datablob'];
600     datadiv.setAttribute('lfdataid', parseInt(data['filedata_id']));
601    
602     var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+filedata+"</textarea>\n";
603    
604     document.title="EditFile: "+filename;
605     updateEditMenu();
606     editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
607    
608     setMode('Edit');
609     }
610    
611     function editFile(name){
612     if(currentMode == 'Preview'){
613     var data = getSVGContent();
614     var editcontent="<textarea id=\"editarea\" rows=\""+editarea_h+"\" cols=\""+editarea_w+"\">"+data+"</textarea>\n";
615     updateEditMenu();
616     editDiv.innerHTML = editMenuBar() +"<br>"+ editcontent;
617    
618     setMode('Edit');
619     }else{
620     getFile(name, 'editFileData');
621     }
622     }
623    
624     function editCurrentFile(){
625     var datadiv = document.getElementById('tempdata');
626     var name = datadiv.getAttribute('lfname');
627    
628     editFile(name);
629     }
630    
631     // Show File
632     function updateShowMenu(){
633     var menuDiv = document.getElementById('menuDiv');
634     menuDiv.innerHTML="<h1 class='title'>" +document.title+"</h1>\n";
635     menuDiv.innerHTML+= "<button onClick=\"editCurrentFile();\"> Edit </button>\n";
636     menuDiv.innerHTML+= "<button onClick=\"saveData();\"> Save </button>\n";
637     menuDiv.innerHTML+= "<button onClick=\"fileSelector();\"> File List </button>\n";
638     menuDiv.innerHTML+= "<button onClick=\"showSVGSource();\"> &lt;SVG &gt; </button>\n";
639     menuDiv.innerHTML+= updateSVGObjMenu();
640     menuDiv.style.display='block';
641     updateToolBar();
642     }
643    
644    
645     function updateToolBar(){
646     var toolbar = document.getElementById('toolBar');
647 isao-hara 14 if(!toolbar.innerHTML){
648     toolbar.innerHTML= "<ul>";
649     toolbar.innerHTML+= "<li><button id=\"b_selector\" onClick=\"setSVGMode('selector');\"><img src=\"images/arrow.png\" /></button> </li>\n";
650     toolbar.innerHTML+= "<li><button id=\"b_newPath\" onClick=\"setSVGMode('newPath'); \"><img src=\"images/path.png\" /></button></li> \n";
651     toolbar.innerHTML+= "<li><button id=\"b_newLine\" onClick=\"setSVGMode('newLine'); \"><img src=\"images/line.png\" /> </button></li> \n";
652     toolbar.innerHTML+= "<li><button id=\"b_text\" onClick=\"setSVGMode('text'); \"><img src=\"images/text.png\" /></button> </li>\n";
653     toolbar.innerHTML+= "<li><button id=\"b_rect\" onClick=\"setSVGMode('rect'); \"> <img src=\"images/rect.png\" /> </button></li> \n";
654     toolbar.innerHTML+= "<li><button id=\"b_circle\" onClick=\"setSVGMode('circle'); \"> <img src=\"images/circle.png\" /> </button></li> \n";
655     toolbar.innerHTML+= "<li><button id=\"b_ellipse\" onClick=\"setSVGMode('ellipse'); \"> <img src=\"images/ellipse.png\" /> </button></li> \n";
656     toolbar.innerHTML+= "<li><button id=\"b_image\" onClick=\"setSVGMode('image'); \"> <img src=\"images/img.png\" /> </button></li> \n";
657     toolbar.innerHTML+= "</ul>";
658     }
659 isao-hara 2 toolbar.style.display='block';
660 isao-hara 4
661 isao-hara 2 }
662    
663     function setMode(m){
664     currentMode=m;
665     switch(m){
666     case 'List':
667     hideItemById('editDiv');
668     hideItemById('preview');
669     hideItemById('popup');
670     hideItemById('toolBar');
671 isao-hara 14 hideItemById('color-palette');
672 isao-hara 2 showItemById('menuDiv');
673     break;
674     case 'Edit':
675     hideItemById('preview');
676     hideItemById('popup');
677     hideItemById('toolBar');
678 isao-hara 14 hideItemById('color-palette');
679 isao-hara 2 showItemById('editDiv');
680     showItemById('menuDiv');
681     break;
682     case 'Preview':
683     showItemById('preview');
684     hideItemById('editDiv');
685     hideItemById('popup');
686 isao-hara 14 showItemById('color-palette');
687 isao-hara 2 showItemById('menuDiv');
688     showItemById('toolBar');
689     break;
690     default:
691     break;
692     }
693     }
694    
695     function hideItemById(id){
696     var itm = document.getElementById(id);
697     if(itm) itm.style.display='none';
698     }
699    
700     function showItemById(id){
701     var itm = document.getElementById(id);
702     if(itm) itm.style.display='block';
703     }
704    
705     function removeChildNodes(id){
706     var itm = document.getElementById(id);
707     if(!itm) return;
708    
709     var child = itm.firstChild;
710    
711     while(child){
712     itm.removeChild(child);
713     child = itm.firstChild;
714     }
715     }
716    
717     function chEditareaHeight(){
718     var itm = document.getElementById('editarea');
719     if(!itm) return;
720     var cv = itm.getAttribute('rows');
721     if(parseInt(cv) > editarea_h){
722     itm.setAttribute('rows', editarea_h);
723     }else{
724     itm.setAttribute('rows', editarea_h * 2);
725     }
726     }
727    
728     function format_file(str){
729     return "<pre>"+str+"</pre>";
730     }
731    
732     function previewData(data){
733     if(!data) data = document.getElementById('editarea').value;
734    
735     previewFile(data);
736    
737     updateShowMenu();
738     setMode('Preview');
739     }
740    
741     function previewFile(data){
742     removeChildNodes('preview');
743    
744     preview.style.display='block';
745     preview.style.position='absolute';
746     preview.style.top='180px';
747 isao-hara 14 preview.style.bottom='50px';
748     preview.style.left='0px';
749     preview.style.right='10px';
750     mkColorPalette();
751 isao-hara 2
752     var ele = toSVGElement(data, '100%','100%');
753    
754     preview.appendChild(ele);
755    
756     svg_top = document.getElementById('svg_top');
757     initSVGElementId(svg_top);
758     svg_select = createSVGObj('rect', 'x=1,y=1,width=1,height=1,visibility=hidden,stroke-dasharray=9 5', 'none', 'blue', 2);
759     svg_select.setAttribute("id","svg_select");
760     appendSVGObj(svg_select);
761 isao-hara 14 }
762 isao-hara 2
763 isao-hara 14
764    
765     function mkColorPalette(){
766     var palette = document.getElementById('color-palette');
767     if(!palette) return;
768     if(palette.innerHTML) return;
769    
770     palette.innerHTML="";
771     palette.addEventListener("touchstart", onTouchStartColor, false);
772    
773     palette.innerHTML="<select id=\"color_sel\"><option value=\"fill\">Fill</option><option value=\"stroke\">Color</option></select>";
774     for(var i=0; i<colors.length ;i++){
775     if(colors[i] == 'none')
776     palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\">X</div>";
777     else
778     palette.innerHTML +="<div class=\"item\" style=\"background-color:"+colors[i]+";\" color-val=\""+colors[i]+"\"> </div>";
779     }
780 isao-hara 2 }
781    
782     ////// for SVG object
783     ////////////////
784     function updateSVGObjMenu(){
785     var res = "";
786     var tag = modeSVG;
787     if(selectedItems.length > 1) return res;
788     if(selectedItems.length == 1) tag = getElementTag(selectedItems[0]);
789    
790     switch(tag){
791     case 'text':
792     if(selectedItems[0]){
793     res += setSVGObjectProp(selectedItems[0]);
794     }else{
795     res += propSVGText("", 24, '#000000');
796     }
797     break;
798     case 'rect':
799     case 'circle':
800     case 'ellipse':
801     case 'newPath':
802     case 'newLine':
803     case 'path':
804     case 'line':
805     case 'polyline':
806     case 'polygon':
807     if(selectedItems[0]){
808     res += setSVGObjectProp(selectedItems[0]);
809     }else{
810     res += propSVGObj(tag+":", 1, '#000000', '#ffffff');
811     }
812     break;
813 isao-hara 5 case 'image':
814     if(selectedItems[0]){
815     res += setSVGObjectProp(selectedItems[0]);
816     }else{
817 isao-hara 6 res += propSVGImage("", 100, 100);
818 isao-hara 5 }
819     break;
820 isao-hara 2 default:
821     break;
822     }
823     return res;
824     }
825    
826     function propSVGText(str, size, color){
827     if(!size) size = 24;
828     if(!color) color = '#000000';
829    
830     var res = "Text:";
831     res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\"/>";
832     res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
833     res += "Size:<input type=\"text\" id=\"svg_size\" value=\""+size+"\" size=\"4\"/>";
834     return res;
835     }
836    
837     function propSVGObj(type, stroke, color, fill){
838     var res = type;
839     if(!stroke) stroke = 1;
840     if(!color) color = '#000000';
841     if(!fill) fill = '#ffffff';
842     res += "Fill:<input type=\"text\" id=\"svg_fill\" value=\""+fill+"\" size=\"8\"/>";
843     res += "Color:<input type=\"text\" id=\"svg_color\" value=\""+color+"\" size=\"8\"/>";
844     res += "L:<input type=\"text\" id=\"svg_stroke\" value=\""+stroke+"\" size=\"2\"/>";
845     return res;
846     }
847    
848     function propSVGLine(type, stroke, color, fill, style){
849     var res = propSVGObj(type, stroke, color, fill);
850 isao-hara 14 if(style==null) style="";
851 isao-hara 2 res += "Type:<input type=\"text\" id=\"svg_stroke_type\" value=\""+style+"\" size=\"8\"/>";
852     res += "Arrow:";
853     if(hasArrow('start')){
854 isao-hara 14 res += "<button class=\"tool\" onClick=\"removeLeftArrow();\"><img src=\"images/normal.png\" /></button>";
855 isao-hara 2 }else{
856 isao-hara 14 res += "<button class=\"tool\" onClick=\"setLeftArrow();\"><img src=\"images/larrow.png\" /></button>";
857 isao-hara 2 }
858     if(hasArrow('end')){
859 isao-hara 14 res += "<button class=\"tool\" onClick=\"removeRightArrow();\"><img src=\"images/normal.png\" /></button>";
860 isao-hara 2 }else{
861 isao-hara 14 res += "<button class=\"tool\" onClick=\"setRightArrow();\"><img src=\"images/rarrow.png\" /></button>";
862 isao-hara 2 }
863     return res;
864     }
865    
866 isao-hara 5 function propSVGImage(str, w, h){
867     var res = "image:";
868     res += "<input type=\"text\" id=\"svg_text\" value=\""+str+"\" />";
869     res += "Width:<input type=\"text\" id=\"svg_w\" value=\""+w+"\" size=\"4\"/>";
870     res += "Height:<input type=\"text\" id=\"svg_h\" value=\""+h+"\" size=\"4\"/>";
871     return res;
872     }
873    
874 isao-hara 2 function setSVGMode(m){
875 isao-hara 14 var btn = document.getElementById('b_'+modeSVG);
876     if(btn){ btn.style.border="1px solid black"; }
877    
878 isao-hara 2 modeSVG = m;
879     updateShowMenu();
880 isao-hara 4
881 isao-hara 2 if(m == 'selector'){
882     targetItem=null;
883     clearSelectedItems();
884     }
885 isao-hara 4
886     var btn = document.getElementById('b_'+modeSVG);
887 isao-hara 14 if(btn){ btn.style.border="3px solid red"; }
888 isao-hara 2 }
889    
890    
891     function toSVGElement(str, w, h){
892     var xmlsvg = "xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"";
893     var parser = new DOMParser();
894     var header = "<svg:svg width=\""+w+"\" height=\""+h+"\" "+xmlsvg+" id=\"svg_top\">";
895     var footer = "</svg:svg>";
896     var xmlDoc = parser.parseFromString(header+str+footer, "text/xml");
897     var xmlRoot = xmlDoc.documentElement;
898     var ele = document.importNode(xmlRoot,true);
899    
900     return ele;
901     }
902    
903     function createSVGElement(tag, id){
904     if(id=='new'){
905     id = 'svg_'+nextId;
906     nextId++;
907     }
908     var ele= document.createElementNS(svg_ns, tag);
909     ele.setAttribute("id", id);
910     return ele;
911     }
912    
913     function defSVGElement(node){
914     if(!svg_defs) svg_defs = document.getElementById('svg_defs');
915     if(!svg_defs){
916     svg_defs = createSVGElement('defs', 'svg_defs');
917     svg_top.insertBefore(svg_defs, svg_top.firstChild);
918     }
919     if(node) svg_defs.appendChild(node);
920     }
921    
922     function initSVGElementId(svg_top){
923     nextId = 1;
924     checkSVGElementId(svg_top);
925     appendSVGElementId(svg_top);
926     }
927    
928     function checkSVGElementId(top){
929     var objs = top.childNodes;
930    
931     for(var i=0; i<objs.length ;i++){
932     if(objs[i].tagName){
933     var id = objs[i].getAttribute("id");
934    
935     if(id && id.match(/svg_[0-9]+/i)){
936     var n = parseInt(RegExp.lastMatch.substr(4));
937     if(n >= nextId){
938     nextId = n+1;
939     }
940    
941     }
942     checkSVGElementId(objs[i]);
943     }
944     }
945     }
946    
947     function appendSVGElementId(top){
948     var objs = top.childNodes;
949    
950     for(var i=0; i<objs.length ;i++){
951     if(objs[i].tagName){
952     var id = objs[i].getAttribute("id");
953     if(!id){
954     objs[i].setAttribute("id", "svg_"+nextId);
955     nextId++;
956     }
957     }
958     appendSVGElementId(objs[i]);
959     }
960     }
961    
962     function selectedRectangle(x, y, ex, ey){
963     if(!svg_select) return null;
964    
965     svg_select.setAttribute("x",x);
966     svg_select.setAttribute("y",y);
967     svg_select.setAttribute("width", ex-x);
968     svg_select.setAttribute("height", ey-y);
969     svg_select.setAttribute("visibility", "visible");
970     return svg_select;
971     }
972    
973    
974     function setAttributes(obj, attrs){
975     var attr_array = attrs.split(',');
976    
977     for (var i=0; i<attr_array.length;i++){
978     var x = attr_array[i].split('=');
979     if(x.length == 2){
980     obj.setAttribute(x[0], x[1]);
981     }
982     }
983     }
984    
985     function createSVGObj(tag, attrs, fill, color, lw){
986     var ele = createSVGElement(tag, 'new');
987     setAttributes(ele, attrs);
988     if (fill) ele.setAttribute('fill', fill);
989     if (color) ele.setAttribute('stroke', color);
990     if(lw) ele.setAttribute('stroke-width', lw);
991    
992     return ele;
993     }
994    
995     function createSVGText(txt, x, y, size, color){
996     var ele = createSVGElement('text', 'new');
997    
998     ele.setAttribute('x', x);
999     ele.setAttribute('y', y);
1000     ele.setAttribute('font-size', size);
1001     ele.setAttribute('fill', color);
1002     ele.textContent=txt;
1003    
1004     return ele;
1005     }
1006    
1007     function createSVGImage(fname, width, height, attrs){
1008     var ele = createSVGElement('image', 'new');
1009 isao-hara 7 ele.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', fname);
1010 isao-hara 2 ele.setAttribute('width', width);
1011     ele.setAttribute('height', height);
1012     setAttributes(ele, attrs);
1013    
1014     return ele;
1015     }
1016    
1017     function createSVGMarker(pid, id, child){
1018     var parent = document.getElementById(pid);
1019     if(!parent) return;
1020     var ele = createSVGElement('marker', pid+'_'+id);
1021     ele.appendChild(child);
1022     return ele;
1023     }
1024    
1025     function setLeftArrow(){
1026     if( selectedItems.length == 1 ){
1027     setArrow(selectedItems[0], 'start', '');
1028     }
1029     }
1030    
1031     function setRightArrow(){
1032     if( selectedItems.length == 1 ){
1033     setArrow(selectedItems[0], 'end', '');
1034     }
1035     }
1036    
1037     function removeLeftArrow(){
1038     if( selectedItems.length == 1 ){
1039     if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1040     var pid = selectedItems[0].getAttribute('id');
1041     var marker = document.getElementById(pid+'_startarrow');
1042     svg_defs.removeChild(marker);
1043     selectedItems[0].removeAttribute('marker-start');
1044     }
1045     }
1046    
1047     function removeRightArrow(){
1048     if( selectedItems.length == 1 ){
1049     if(!svg_defs) svg_defs = document.getElementById('svg_defs');
1050     var pid = selectedItems[0].getAttribute('id');
1051     var marker = document.getElementById(pid+'_endarrow');
1052     svg_defs.removeChild(marker);
1053     selectedItems[0].removeAttribute('marker-end');
1054     }
1055     }
1056    
1057     function hasArrow(pos){
1058     var pobj = selectedItems[0];
1059     if(!pobj) return false;
1060     var pid = pobj.getAttribute('id');
1061     var marker = document.getElementById(pid+'_'+pos+'arrow');
1062     if(marker) return true;
1063     return false;
1064     }
1065    
1066     function getArrowMarker(obj,pos){
1067     if(!obj) return false;
1068     var pid = obj.getAttribute('id');
1069     var marker = document.getElementById(pid+'_'+pos+'arrow');
1070     return false;
1071     }
1072    
1073     function setArrow(pobj, pos, type){
1074     if(!pobj) return;
1075     var pid = pobj.getAttribute('id');
1076     var marker = document.getElementById(pid+'_'+pos+'arrow');
1077     if(marker) return;
1078    
1079     var obj = createSVGElement('path', 'new');
1080    
1081     var refX = 0;
1082     var refY = 0;
1083    
1084     switch(pos){
1085     case 'start':
1086     refX=10;
1087     refY=10;
1088     setAttributes(obj,'d=M 20 0 L 0 10 20 20 Z');
1089     break;
1090     case 'end':
1091     setAttributes(obj,'d=M 0 0 L 20 10 0 20 Z');
1092     refX= 10;
1093     refY=10;
1094     break;
1095     default:
1096     return;
1097     }
1098    
1099     marker = createSVGMarker(pid, pos+'arrow' , obj);
1100     setAttributes(marker,'markerWidth=10,markerHeight=10,orient=auto,viewBox=0 0 20 20,markerUnits=strokeWidth,refX='+refX+',refY='+refY);
1101    
1102     marker.setAttribute("fill",pobj.getAttribute("stroke"));
1103    
1104     defSVGElement(marker);
1105     var mid = "url(#"+marker.getAttribute("id")+")";
1106     var mattr = "marker-"+pos;
1107     pobj.setAttribute(mattr, mid);
1108     }
1109    
1110     function appendSVGObj(obj){
1111     var svg_top = document.getElementById('svg_top');
1112     if(!svg_top) return;
1113    
1114     svg_top.appendChild(obj);
1115     }
1116    
1117     function isChildById(element, id) {
1118     if (element == null || element.parentNode == null || element.parentNode.nodeName=='BODY') return false;
1119     else if (element.parentNode.id == id) return true;
1120     else return isChildById(element.parentNode, id);
1121     }
1122    
1123     /////////////////////// Formatting SVG DOM
1124     function escapeHTML(text) {
1125     return text.replace( /[<>"&]/g,
1126     function (m) { return { '<': '&lt;', '>': '&gt;', '"': '&quot;', '&': '&amp;' }[m]; }
1127     );
1128     };
1129    
1130     function formatTag(ele){
1131     var str="";
1132     if(ele.nodeType == 1){
1133     var tag_a = ele.tagName.split(':');
1134     var tag;
1135     if(tag_a.length == 1){ tag = "svg:"+tag_a[0]; }else{ tag = ele.tagName; }
1136    
1137     str += "<"+tag;
1138     var attrs = ele.attributes;
1139     for(var i=0; i<attrs.length; i++){
1140     str += " "+attrs[i].nodeName+"=\""+attrs[i].nodeValue+"\"";
1141     }
1142     var cn = ele.childNodes;
1143     if(cn.length > 0){
1144     str +=">\n";
1145     for(var i=0; i<cn.length; i++){
1146 isao-hara 13 var tmp = trim(formatTag(cn[i]));
1147     if(tmp) str += " "+tmp+"\n";
1148 isao-hara 2 }
1149     str += "</"+tag+">";
1150     }else{
1151     str +=" />";
1152     }
1153     return str;
1154     }else if(ele.nodeType==3){
1155     return ele.textContent;
1156     }
1157     }
1158    
1159     function getSVGContent(){
1160     if(!svg_top) return "";
1161    
1162     var str = "";
1163     var elements = svg_top.childNodes;
1164     for(var i=0; i<elements.length; i++){
1165 isao-hara 12 if(elements[i] != svg_select){
1166     var tmp = trim(formatTag(elements[i]));
1167     if(tmp) str += tmp + '\n';
1168     }
1169 isao-hara 2 }
1170     return str;
1171     }
1172    
1173     function trim(str){
1174     return str.replace(/(^\s+)|(\s+$)/g, "");
1175     }
1176    
1177     /////// Access Server
1178     function newXMLRequest(){
1179     if(this.XMLHttpRequest){
1180     return new XMLHttpRequest();
1181     }else {
1182     return new ActiveXObject("Microsoft.XMLHTTP");
1183     }
1184     }
1185    
1186     function createRequestData(data){
1187     var str="filetype=svg";
1188     for (var i in data){
1189     str = str +"&"+ i +"="+encodeURIComponent(data[i]);
1190     }
1191     return str;
1192     }
1193    
1194     function postRequest(url, data, func){
1195     var postData=createRequestData(data);
1196     var obj=newXMLRequest();
1197    
1198     obj.onreadystatechange = function(){
1199     if (obj.readyState == 4 && obj.status == 200){
1200     func(obj.responseText);
1201     }
1202     }
1203     obj.open("POST", url, true);
1204     obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
1205     obj.send(postData);
1206     }
1207    
1208     function commnadFinishAlert(s){
1209     alert(s);
1210     }
1211    
1212     function uploadFileData(transaction, results){
1213     var data = results.rows.item(0);
1214     var updata = new Array(0);
1215     updata['name']= data['name'];
1216     updata['datalob'] = data['datablob'];
1217     updata['cmd'] = 'upload'
1218    
1219     postRequest(MgrPath+iSlideMgr, updata, commnadFinishAlert);
1220     }
1221    
1222     function uploadFile(name){
1223     getFile(name, 'uploadFileData');
1224     }
1225    
1226     function getRemoteFileList(){
1227     var data=new Array();
1228     data['name'] = "SVG";
1229     data['cmd'] = "list";
1230     postRequest(MgrPath+iSlideMgr, data, fileSelectorOnServer);
1231     }
1232    
1233     function previewRemoteFile(content){
1234     previewFile(content);
1235     setMode('Preview');
1236     }
1237    
1238     function getRemoteFile(name){
1239     var data=new Array();
1240     data['name'] = name;
1241     data['cmd'] = "get";
1242     postRequest(MgrPath+iSlideMgr, data, previewRemoteFile);
1243     }
1244    
1245     function showRemoteFile(name){
1246     getRemoteFile(name);
1247     }
1248    
1249     //////// Event Handler
1250     function setInnerHTML(id, val){
1251     var itm=document.getElementById(id);
1252     if(itm) itm.innerHTML=val;
1253     }
1254    
1255     function popupInfo(val){
1256     var str="<button onClick=\"hideItemById('popup');\">Close</button><hr> ";
1257     str += val;
1258     setInnerHTML('popup', str);
1259     showItemById('popup');
1260     }
1261    
1262     function addAttributeVal(obj, itm, dv){
1263     if(obj.hasAttribute(itm)){
1264     var x = parseInt(obj.getAttribute(itm));
1265     x = x + dv;
1266     obj.setAttribute(itm, x)
1267     }
1268     }
1269    
1270     function showSVGSource(){
1271     var str = getSVGContent();
1272 isao-hara 14 var escstr="<button onClick=\"hideItemById('popup');\">Close</button>";
1273     escstr+="<button onClick=\"saveContent(document.getElementById('ContentView').value); previewData(document.getElementById('ContentView').value);\">Save</button><hr> ";
1274     // escstr += "<pre>"+escapeHTML(str)+"</pre>";
1275     escstr += "<textarea cols=\"130\" rows=\"30\" id=\"ContentView\">"+str+"</textarea>";
1276 isao-hara 2 setInnerHTML('popup', escstr);
1277     showItemById('popup');
1278     }
1279    
1280    
1281     function getElementTag(obj){
1282 isao-hara 6 if (!obj) return null;
1283 isao-hara 2 var tag = obj.tagName.split(':');
1284     if(tag.length == 2 && tag[0]=='svg') return tag[1];
1285     return tag[0];
1286     }
1287    
1288     function setSVGObjectProp(obj){
1289     var tag = getElementTag(obj);
1290     var res ="";
1291     switch(tag){
1292     case 'text':
1293     res = propSVGText(obj.textContent, obj.getAttribute("font-size"), obj.getAttribute("fill"));
1294     break;
1295     case 'rect':
1296     case 'circle':
1297     case 'ellipse':
1298     res = propSVGObj(tag+":", obj.getAttribute("stroke-width"), obj.getAttribute("stroke"), obj.getAttribute("fill"));
1299     break;
1300     case 'path':
1301     case 'line':
1302     res = propSVGLine(tag+":",obj.getAttribute("stroke-width"),
1303     obj.getAttribute("stroke"),obj.getAttribute("fill"), obj.getAttribute("stroke-dasharray"));
1304     break;
1305 isao-hara 5 case 'image':
1306     res = propSVGImage(obj.getAttribute("xlink:href"),obj.getAttribute("width"),obj.getAttribute("height"));
1307     break;
1308 isao-hara 2 default:
1309     break;
1310     }
1311     if(res != ""){
1312     res += "<button onClick=\"updateSVGObj();\">OK</button>";
1313     res += "<button onClick=\"delSVGObj();\">Del</button>";
1314     }
1315    
1316     return res
1317     }
1318    
1319     function updateSVGObj(){
1320     if(selectedItems.length != 1) return;
1321     var obj = selectedItems[0];
1322     var tag = getElementTag(obj);
1323     var res ="";
1324     switch(tag){
1325     case 'text':
1326     var txt=document.getElementById('svg_text');
1327     var color=document.getElementById('svg_color');
1328     var size=document.getElementById('svg_size');
1329     obj.textContent = txt.value;
1330     obj.setAttribute("fill", color.value);
1331     obj.setAttribute("font-size", size.value);
1332     break;
1333     case 'rect':
1334     case 'circle':
1335     case 'ellipse':
1336     var fill=document.getElementById('svg_fill');
1337     var color=document.getElementById('svg_color');
1338     var L=document.getElementById('svg_stroke');
1339     obj.setAttribute("fill", fill.value);
1340     obj.setAttribute("stroke", color.value);
1341     obj.setAttribute("stroke-width", L.value);
1342     break;
1343     case 'path':
1344     case 'line':
1345     var fill=document.getElementById('svg_fill');
1346     var color=document.getElementById('svg_color');
1347     var L=document.getElementById('svg_stroke');
1348     var dash=document.getElementById('svg_stroke_type');
1349     obj.setAttribute("fill", fill.value);
1350     obj.setAttribute("stroke", color.value);
1351     obj.setAttribute("stroke-width", L.value);
1352     if(dash) obj.setAttribute("stroke-dasharray", dash.value);
1353     var id = obj.getAttribute("id");
1354     var marker = document.getElementById(id+'_startarrow');
1355     if(marker) marker.setAttribute("fill", color.value);
1356     var marker = document.getElementById(id+'_endarrow');
1357     if(marker) marker.setAttribute("fill", color.value);
1358     break;
1359 isao-hara 5 case 'image':
1360     var fname=document.getElementById('svg_text');
1361     var w=document.getElementById('svg_w');
1362     var h=document.getElementById('svg_h');
1363 isao-hara 6 obj.setAttribute("xlink:href", fname.value);
1364 isao-hara 5 obj.setAttribute("width", w.value);
1365     obj.setAttribute("height", h.value);
1366     break;
1367 isao-hara 2 default:
1368     break;
1369     }
1370    
1371     }
1372    
1373     function delSVGObj(){
1374     if(selectedItems.length != 1) return;
1375     var obj = selectedItems[0];
1376    
1377     if(!svg_top) return;
1378     svg_top.removeChild(obj);
1379     svg_select.setAttribute("visibility","hidden");
1380     }
1381    
1382     ///// For MobileSafari
1383     function getPreviewX(x){ return x - preview.offsetLeft; }
1384     function getPreviewY(y){ return y - preview.offsetTop; }
1385    
1386     function calcDit(x1, y1, x2, y2){
1387     return (x1-x2)*(x1-x2) +(y1-y2)*(y1-y2);
1388     }
1389    
1390     function isIncludeEllipse( x1, y1, cx, cy, rx, ry){
1391     return ((x1-cx)*(x1-cx)/rx/rx +(y1-cy)*(y1-cy)/ry/ry) < 1;
1392     }
1393    
1394     function getAttributeVal(obj, name){
1395     try{
1396     return parseInt(obj.getAttribute(name));
1397     }catch(e){ return 0; }
1398     }
1399    
1400     function checkIntersection(obj, x, y, ex, ey){
1401     var res = true;
1402     var bbox = obj.getBBox();
1403     var ox = bbox.x;
1404     var oy = bbox.y;
1405     var oex = bbox.x+bbox.width;
1406     var oey = bbox.y+bbox.height;
1407     if( ex < ox || oex < x || ey < oy || oey < y) res = false;
1408    
1409     var tag = getElementTag(obj);
1410     switch(tag){
1411     case 'circle':
1412     case 'ellipse':
1413     var cx = getAttributeVal(obj,"cx");
1414     var cy = getAttributeVal(obj,"cy");
1415     var rx = getAttributeVal(obj,"r");
1416     var ry = rx;
1417     if(!rx){
1418     var rx = getAttributeVal(obj,"rx");
1419     var ry = getAttributeVal(obj,"ry");
1420     }
1421    
1422     if(res){
1423     if(cx <x && cy < y && !isIncludeEllipse(x,y,cx,cy,rx,ry)) res=false;
1424     else if(cx < x && cy > ey && !isIncludeEllipse(x,ey,cx,cy,rx,ry)) res=false;
1425     else if(cx > ex && cy > ey && !isIncludeEllipse(ex,ey,cx,cy,rx,ry)) res=false;
1426     else if(cx > ex && cy < y && !isIncludeEllipse( ex,y,cx,cy,rx,ry)) res=false;
1427     }
1428     break;
1429     case 'path':
1430     var d = obj.getAttribute("d");
1431     var p = getPoints(d);
1432     for(var i=0;i<p.length;i++){
1433     var ox=p[i][0];
1434     var oy=p[i][1];
1435     if(x < ox && ox < ex && y < oy && oy < ey) {
1436     return true;
1437     }
1438     }
1439     return false;
1440     break;
1441     case 'line':
1442     var x1 = getAttributeVal(obj,"x1");
1443     var y1 = getAttributeVal(obj,"y1");
1444     var x2 = getAttributeVal(obj,"x2");
1445     var y2 = getAttributeVal(obj,"y2");
1446 isao-hara 3 var d = (y2-y1)/(x2-x1);
1447    
1448     if(res){
1449     var xx = Math.abs(x2-x1);
1450     var sign = 1;
1451     if(x2-x1 < 0){ sign = -1; }
1452     for(var i=0; i < xx; i++){
1453     var nx = i*sign + x1;
1454     var ny = d * i*sign + y1;
1455     if(x < nx && nx < ex && y < ny && ny < ey) return true;
1456     }
1457     }
1458 isao-hara 2 return false;
1459    
1460 isao-hara 3 return res;
1461 isao-hara 2 break;
1462     case 'text':
1463     case 'rect':
1464     case 'polygon':
1465     case 'polyline':
1466     case 'image':
1467     break;
1468     default:
1469     res=false;
1470     break;
1471     }
1472     return res;
1473     }
1474    
1475     function getBoundingBox(obj){
1476     var res = new Array(4);
1477     var bbox = obj.getBBox();
1478     res[0] = bbox.x-1;
1479     res[1] = bbox.y-1;
1480     res[2] = bbox.x+bbox.width+2;
1481     res[3] = bbox.y+bbox.height+2;
1482     return res;
1483     }
1484    
1485     function setSelectBox(){
1486     if(!svg_select) return;
1487    
1488     if(selectedItems.length == 0){
1489     svg_select.setAttribute("visibility","hidden");
1490     return;
1491     }
1492    
1493     var bbox = new Array(4);
1494     bbox[0] = 1000;
1495     bbox[1] = 1000;
1496     bbox[2] = 0;
1497     bbox[3] = 0;
1498    
1499     for(var i=0;i<selectedItems.length;i++){
1500     var bp = getBoundingBox(selectedItems[i]);
1501     if(bp[0] < bbox[0]) bbox[0]=bp[0];
1502     if(bp[1] < bbox[1]) bbox[1]=bp[1];
1503     if(bp[2] > bbox[2]) bbox[2]=bp[2];
1504     if(bp[3] > bbox[3]) bbox[3]=bp[3];
1505     }
1506     svg_select.setAttribute("x", bbox[0]);
1507     svg_select.setAttribute("y", bbox[1]);
1508     svg_select.setAttribute("width", bbox[2] - bbox[0]);
1509     svg_select.setAttribute("height", bbox[3] - bbox[1]);
1510     svg_select.setAttribute("visibility","visible;");
1511     }
1512    
1513     function getSelectedObjects(x1, y1, x2, y2){
1514     if(x1 > x2) { var tmp = x1; x1=x2; x2=tmp; }
1515     if(y1 > y2) { var tmp = y1; y1=y2; y2=tmp; }
1516    
1517 isao-hara 3 var val="";
1518 isao-hara 2 if(svg_top){
1519     var val ="";
1520     var objs = svg_top.childNodes;
1521     selectedItems = new Array();
1522     for(var i=0; i<objs.length;i++){
1523     if(objs[i].tagName){
1524 isao-hara 3
1525 isao-hara 2 if(objs[i] != svg_select && checkIntersection(objs[i], x1, y1, x2, y2)){
1526     selectedItems.push(objs[i]);
1527     }
1528 isao-hara 3 val += objs[i].tagName+" ";
1529 isao-hara 2 }
1530     }
1531     }
1532     setSelectBox();
1533     }
1534    
1535     function onTouchStart(e){
1536     //e.preventDefault();
1537     sx=e.touches[0].pageX;
1538     sy=e.touches[0].pageY;
1539     ex=e.touches[0].pageX;
1540     ey=e.touches[0].pageY;
1541    
1542     if (e.touches.length == 1){
1543     if((!modeSVG || modeSVG == 'selector') && selectedItems.length == 0){ // Selector Mode
1544     var x1=getPreviewX(sx-1);
1545     var y1=getPreviewY(sy-1);
1546     var x2=getPreviewX(sx+2);
1547     var y2=getPreviewY(sy+2);
1548     getSelectedObjects(x1, y1, x2, y2);
1549    
1550     if(selectedItems.length == 0){
1551     setSVGMode('selector');
1552     }else if(selectedItems.length == 1){
1553     targetItem=selectedItems[0];
1554     setSVGMode(getElementTag(targetItem));
1555     }else{
1556     setSVGMode('Group');
1557     }
1558     }else { // CreateMode
1559     if(selectedItems.length == 0){
1560    
1561     var fill=document.getElementById('svg_fill');
1562     var color=document.getElementById('svg_color');
1563     var L=document.getElementById('svg_stroke');
1564    
1565     var x = getPreviewX(sx);
1566     var y = getPreviewY(sy);
1567    
1568     switch(modeSVG){
1569     case 'text':
1570     var txt=document.getElementById('svg_text');
1571     var size=document.getElementById('svg_size');
1572     var y = y + parseInt(size.value)*0.8;
1573     if(txt.value) targetItem=createSVGText(txt.value, x, y, size.value, color.value);
1574     break;
1575     case 'rect':
1576     var attr = 'x='+x+',y='+y+',width='+svg_width+',height='+svg_height;
1577     targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1578     break;
1579     case 'circle':
1580     var attr = 'cx='+x+',cy='+y+',r='+svg_rx;
1581     targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1582     break;
1583     case 'ellipse':
1584     var attr = 'cx='+x+',cy='+y+',rx='+svg_rx+',ry='+svg_ry;
1585     targetItem=createSVGObj(modeSVG,attr, fill.value, color.value, L.value);
1586     break;
1587     case 'newPath':
1588     var attr = 'd=M '+x+' '+y+' L '+x+' '+y;
1589     targetItem=createSVGObj('path' ,attr, 'none', color.value, L.value);
1590     break;
1591     case 'newLine':
1592     var x2=x+1;
1593     var attr = 'x1='+x+',y1='+y+',x2='+x2+',y2='+y;
1594     targetItem=createSVGObj('line' ,attr, 'none', color.value, L.value);
1595 isao-hara 6 break;
1596 isao-hara 5 case 'image':
1597     var attr = 'x='+x+',y='+y;
1598     var txt=document.getElementById('svg_text');
1599     var w=document.getElementById('svg_w');
1600     var h=document.getElementById('svg_h');
1601     if(txt.value) targetItem=createSVGImage(txt.value ,w.value, h.value, attr);
1602 isao-hara 2 default:
1603     break;
1604     }
1605     if (targetItem){
1606     appendSVGObj(targetItem);
1607     selectedItems[0]=targetItem;
1608     }
1609     }else{
1610     var x1=getPreviewX(sx-1);
1611     var y1=getPreviewY(sy-1);
1612     var x2=getPreviewX(sx+2);
1613     var y2=getPreviewY(sy+2);
1614     if(!checkIntersection(svg_select, x1, y1, x2, y2)){
1615     setSVGMode('selector');
1616     }
1617     }
1618     }
1619     }
1620    
1621 isao-hara 6 updateSelectedRectangle();
1622 isao-hara 2 }
1623    
1624     function getPoints(d){
1625     var p = d.split(' ');
1626     var res = new Array();
1627     var isx=true;
1628     var x, y;
1629     for(var i=0; i<p.length;i++){
1630     if(p[i].match('[MLHVCSQTA]','i')){
1631     }else{
1632     if(isx){
1633     x = parseInt(p[i]);
1634     }else{
1635     y = parseInt(p[i]);
1636     res.push(new Array(x, y));
1637     }
1638     isx = !isx;
1639     }
1640     }
1641     return res;
1642     }
1643    
1644     function updatePath(d, x, y){
1645     var p = d.split(' ');
1646     var res = "";
1647     var isx=true;
1648     var val;
1649     for(var i=0; i<p.length;i++){
1650     if(p[i].match('[MLHVCSQTA]','i')){
1651     res += ' '+p[i];
1652     }else{
1653     if(isx){
1654     val = parseInt(p[i])+x;
1655     }else{
1656     val = parseInt(p[i])+y;
1657     }
1658    
1659     res += ' '+ val;
1660     isx = !isx;
1661     }
1662     }
1663     return trim(res);
1664     }
1665    
1666     function updateTransform(obj){
1667     try{
1668     var trans = obj.getAttribute("transform");
1669     if(!trans) return;
1670     if(trans.match(new RegExp("translate(.+,.+)","i"))){
1671     var str = RegExp.lastMatch;
1672     var vals = str.substr(10,str.length-11).split(',') ;
1673     var dx = parseInt(vals[0]);
1674     var dy = parseInt(vals[1]);
1675     switch(getElementTag(obj)){
1676     case 'text':
1677     case 'rect':
1678 isao-hara 6 case 'image':
1679 isao-hara 2 addAttributeVal(obj, "x", dx);
1680     addAttributeVal(obj, "y", dy);
1681     break;
1682     case 'circle':
1683     case 'ellipse':
1684     addAttributeVal(obj, "cx", dx);
1685     addAttributeVal(obj, "cy", dy);
1686     break;
1687    
1688     case 'path':
1689     var path = obj.getAttribute("d");
1690     obj.setAttribute("d", updatePath(path, dx, dy));
1691     break;
1692     case 'line':
1693     var x1 = getAttributeVal(obj,"x1");
1694     var y1 = getAttributeVal(obj,"y1");
1695     var x2 = getAttributeVal(obj,"x2");
1696     var y2 = getAttributeVal(obj,"y2");
1697     obj.setAttribute("x1", x1+dx);
1698     obj.setAttribute("y1", y1+dy);
1699     obj.setAttribute("x2", x2+dx);
1700     obj.setAttribute("y2", y2+dy);
1701    
1702     break;
1703     default:
1704     break;
1705     }
1706     obj.removeAttribute("transform");
1707     }
1708     }catch (e){
1709     }
1710     }
1711    
1712     function moveSelectedRectangle(dx, dy){
1713     if(!svg_select) return;
1714     svg_select.setAttribute("transform","translate("+dx+","+dy+")");
1715     }
1716    
1717     function updateSelectedRectangle(){
1718     if(!svg_select) return;
1719     if(selectedItems.length > 0){
1720     svg_select.setAttribute("visibility","visible;");
1721     }else{
1722     svg_select.setAttribute("visibility","hidden;");
1723     }
1724     }
1725    
1726     function clearSelectedItems(){
1727     for(i in selectedItems) delete selectedItems[i];
1728     }
1729    
1730     function onTouchMove(e){
1731 isao-hara 4 e.preventDefault();
1732     if (e.touches.length == 1){
1733     if(targetItem || selectedItems.length > 0){
1734     switch(modeSVG){
1735     case 'newPath':
1736     if(targetItem.tagName == 'path' ){
1737     var path = targetItem.getAttribute("d");
1738     path = path + ' '+ getPreviewX(e.touches[0].pageX) + ' '+ getPreviewY(e.touches[0].pageY) ;
1739     targetItem.setAttribute("d",path);
1740     }
1741     break;
1742     case 'newLine':
1743     if(targetItem.tagName == 'line' ){
1744     var x2 = getPreviewX(e.touches[0].pageX);
1745     var y2 = getPreviewY(e.touches[0].pageY);
1746     targetItem.setAttribute("x2",x2);
1747     targetItem.setAttribute("y2",y2);
1748     }
1749     break;
1750 isao-hara 2
1751 isao-hara 4 default:
1752     var dx = e.touches[0].pageX - sx;
1753     var dy = e.touches[0].pageY - sy;
1754 isao-hara 2
1755 isao-hara 4 if(selectedItems.length == 1 && getElementTag(selectedItems[0]) == 'line'){
1756     var lx = getPreviewX(e.touches[0].pageX);
1757     var ly = getPreviewY(e.touches[0].pageY);
1758 isao-hara 2
1759 isao-hara 4 if(!lineEdit){
1760     var x1 = getAttributeVal(selectedItems[0],"x1");
1761     var y1 = getAttributeVal(selectedItems[0],"y1");
1762     var x2 = getAttributeVal(selectedItems[0],"x2");
1763     var y2 = getAttributeVal(selectedItems[0],"y2");
1764     var xc = (x1+x2)/2;
1765     var yc = (y1+y2)/2;
1766     var eS = Math.min(Math.abs(x1-lx), Math.abs(y1-ly));
1767     var eC = Math.min(Math.abs(xc-lx), Math.abs(yc-ly));
1768     var eE = Math.min(Math.abs(x2-lx), Math.abs(y2-ly));
1769 isao-hara 2
1770 isao-hara 4 var minVal = Math.min(eS, Math.min(eC, eE));
1771     if(minVal == eS) lineEdit='start';
1772     else if(minVal == eE) lineEdit='end';
1773     else lineEdit='move';
1774     }
1775     if(lineEdit=='start'){
1776     selectedItems[0].setAttribute("x1",lx );
1777     selectedItems[0].setAttribute("y1",ly );
1778     setSelectBox();
1779     }else if(lineEdit == 'end'){
1780     selectedItems[0].setAttribute("x2",lx );
1781     selectedItems[0].setAttribute("y2",ly );
1782     setSelectBox();
1783     }else{
1784     selectedItems[0].setAttribute("transform","translate("+dx+","+dy+")");
1785     moveSelectedRectangle(dx, dy);
1786     }
1787     }else{
1788     for(var i=0; i<selectedItems.length;i++){
1789     selectedItems[i].setAttribute("transform","translate("+dx+","+dy+")");
1790     }
1791     moveSelectedRectangle(dx, dy);
1792     }
1793     break;
1794     }
1795     updateShowMenu();
1796     }else if(modeSVG == 'selector'){
1797     ex = e.touches[0].pageX;
1798     ey = e.touches[0].pageY;
1799     var x1=sx;
1800     var y1=sy;
1801     var x2=ex;
1802     var y2=ey;
1803 isao-hara 2
1804 isao-hara 4 if(sx > ex){ x1=ex; x2=sx; }
1805     if(sy > ey){ y1=ey; y2=sy; }
1806 isao-hara 2
1807 isao-hara 4 selectedRectangle(getPreviewX(x1), getPreviewY(y1), getPreviewX(x2), getPreviewY(y2));
1808     }
1809     }else if (e.touches.length == 2){
1810     var dx= e.touches[0].pageX-e.touches[1].pageX;
1811     var dy = e.touches[0].pageY-e.touches[1].pageY;
1812     var th = Math.abs(Math.atan2(dy , dx)/Math.PI *180);
1813 isao-hara 2
1814 isao-hara 4 if(th > 165 || th < 25) svg_scale_dir = 'x';
1815     else if(th > 65 && th < 115) svg_scale_dir = 'y';
1816     else svg_scale_dir = null;
1817     }
1818 isao-hara 2 }
1819    
1820     function onTouchEnd(e){
1821     e.preventDefault();
1822    
1823     for(var i=0; i<selectedItems.length;i++){
1824     updateTransform(selectedItems[i]);
1825     }
1826    
1827     if(modeSVG == 'selector'){
1828     var x1 = getPreviewX(sx);
1829     var y1 = getPreviewY(sy);
1830     var x2 = getPreviewX(ex);
1831     var y2 = getPreviewY(ey);
1832     getSelectedObjects(x1, y1, x2, y2);
1833     }
1834    
1835     updateSelectedRectangle();
1836     updateTransform(svg_select);
1837    
1838     setSelectBox();
1839     updateShowMenu();
1840 isao-hara 4 var btn = document.getElementById('b_'+modeSVG);
1841     if(btn){
1842     btn.style.border="3px solid red";
1843     }
1844 isao-hara 2 lineEdit=null;
1845     }
1846    
1847    
1848     function onGestureStart(e){
1849     targetItem = selectedItems[0];
1850     if(targetItem){
1851     svg_wo = targetItem.getAttribute("width");
1852     svg_ho = targetItem.getAttribute("height");
1853     svg_ro = targetItem.getAttribute("r");
1854     svg_rxo = targetItem.getAttribute("rx");
1855     svg_ryo = targetItem.getAttribute("ry");
1856     svg_fsize = targetItem.getAttribute("font-size");
1857     }else{
1858     svg_wo = null;
1859     svg_ho = null;
1860     svg_ro = null;
1861     svg_rxo = null;
1862     svg_ryo = null;
1863     svg_fsize = null;
1864     }
1865     }
1866    
1867     function onGestureChange(e){
1868 isao-hara 4 var scale = e.scale;
1869     var rotation = e.rotation;
1870 isao-hara 2
1871 isao-hara 4 if(targetItem){
1872 isao-hara 7 e.preventDefault();
1873 isao-hara 4 if (svg_wo && svg_scale_dir != 'y') targetItem.setAttribute("width", Math.round(svg_wo*scale ));
1874     if (svg_ho && svg_scale_dir != 'x') targetItem.setAttribute("height", Math.round(svg_ho*scale ));
1875     if (svg_ro) targetItem.setAttribute("r", Math.round(svg_ro*scale ));
1876     if (svg_rxo && svg_scale_dir != 'y') targetItem.setAttribute("rx", Math.round(svg_rxo*scale) );
1877     if (svg_ryo && svg_scale_dir != 'x') targetItem.setAttribute("ry", Math.round(svg_ryo*scale) );
1878     if (svg_fsize) targetItem.setAttribute("font-size", Math.round(svg_fsize*scale) );
1879 isao-hara 2
1880 isao-hara 4 updateShowMenu();
1881     }
1882 isao-hara 2 }
1883    
1884     function onGestureEnd(e){
1885 isao-hara 7 // e.preventDefault();
1886 isao-hara 4 svg_wo = null;
1887     svg_ho = null;
1888     svg_ro = null;
1889     svg_rxo = null;
1890     svg_ryo = null;
1891     svg_fsize = null;
1892 isao-hara 2 }
1893    
1894 isao-hara 14 function onTouchStartColor(e){
1895     if(e.touches.length == 1){
1896     var ele = e.touches[0].target;
1897     var color = ele.getAttribute("color-val");
1898     var color_sel = document.getElementById('color_sel');
1899     var fill_input = document.getElementById('svg_fill');
1900     var color_input = document.getElementById('svg_color');
1901     if(color) {
1902     for(var i=0;selectedItems.length; i++){
1903     selectedItems[i].setAttribute(color_sel.value, color);
1904     if(color_sel.value == 'fill'){
1905     fill_input.value=color;
1906     }else{
1907     color_input.value=color;
1908     }
1909     }
1910     }
1911     }
1912     }
1913 isao-hara 2 ///// For Safari
1914     function onMouseDown(e){
1915    
1916     if(targetItem){
1917     removeClass(targetItem, "selected");
1918     }
1919    
1920     if(isChildById(e.target, 'svg_top')) {
1921     targetItem=e.target;
1922     sx=e.pageX;
1923     sy=e.pageY;
1924     setInnerHTML('popup', e.pageX+","+e.pageY);
1925    
1926     }else{
1927     targetItem = null;
1928     }
1929    
1930     return true;
1931     }
1932    
1933     function onMouseMove(e){
1934     if(targetItem){
1935     addAttributeVal(targetItem, "x", e.pageX - sx );
1936     addAttributeVal(targetItem, "y", e.pageY - sy );
1937     addAttributeVal(targetItem, "cx", e.pageX - sx );
1938     addAttributeVal(targetItem, "cy", e.pageY - sy );
1939     }
1940     sx=e.pageX;
1941     sy=e.pageY;
1942     return true;
1943     }
1944    
1945     function onMouseUp(e){
1946     var str = getSVGContent();
1947     escstr = "<pre>"+escapeHTML(str)+"</pre>";
1948     setInnerHTML('popup', escstr);
1949    
1950     targetItem=null;
1951     return true;
1952     }
1953    
1954     if(!navigator.userAgent.match("iPad")){
1955     document.onmousedown=onMouseDown;
1956     document.onmousemove=onMouseMove;
1957     document.onmouseup=onMouseUp;
1958     }
1959    

Properties

Name Value
svn:executable *

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