Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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