Develop and Download Open Source Software

Browse Subversion Repository

Contents of /SvgEditor.js

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *

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