From 8717067971102c2dc04fee3aa9ddabc79427443b Mon Sep 17 00:00:00 2001 From: sipp11 Date: Mon, 30 Mar 2015 17:21:16 +0700 Subject: [PATCH] new posts --- .../blog/2015-03-26-porting-carrier-101.md | 27 + ...ัญ-คุณห้ามหลง.md | 18 + content/media/2015/03/bua-khwan-sign.png | Bin 0 -> 85343 bytes .../svg-edit-2.7/browser-not-supported.html | 31 + content/media/2015/03/svg-edit-2.7/browser.js | 180 + .../media/2015/03/svg-edit-2.7/canvg/canvg.js | 2620 ++++++ .../2015/03/svg-edit-2.7/canvg/rgbcolor.js | 294 + .../2015/03/svg-edit-2.7/config-sample.js | 145 + content/media/2015/03/svg-edit-2.7/config.js | 12 + .../media/2015/03/svg-edit-2.7/contextmenu.js | 66 + .../contextmenu/jquery.contextMenu.js | 203 + content/media/2015/03/svg-edit-2.7/coords.js | 316 + content/media/2015/03/svg-edit-2.7/draw.js | 537 ++ .../media/2015/03/svg-edit-2.7/embedapi.html | 59 + .../media/2015/03/svg-edit-2.7/embedapi.js | 187 + .../extensions/allowedMimeTypes.php | 11 + .../extensions/closepath_icons.svg | 41 + .../executablebuilder-icocreator.svg | 9 + .../03/svg-edit-2.7/extensions/ext-arrows.js | 293 + .../svg-edit-2.7/extensions/ext-closepath.js | 91 + .../svg-edit-2.7/extensions/ext-connector.js | 593 ++ .../extensions/ext-executablebuilder.js | 67 + .../svg-edit-2.7/extensions/ext-eyedropper.js | 112 + .../extensions/ext-foreignobject.js | 268 + .../03/svg-edit-2.7/extensions/ext-grid.js | 155 + .../svg-edit-2.7/extensions/ext-helloworld.js | 80 + .../svg-edit-2.7/extensions/ext-imagelib.js | 460 + .../svg-edit-2.7/extensions/ext-imagelib.xml | 14 + .../03/svg-edit-2.7/extensions/ext-markers.js | 579 ++ .../03/svg-edit-2.7/extensions/ext-mathjax.js | 273 + .../extensions/ext-overview_window.js | 142 + .../03/svg-edit-2.7/extensions/ext-panning.js | 46 + .../svg-edit-2.7/extensions/ext-panning.xml | 7 + .../extensions/ext-php_savefile.js | 23 + .../03/svg-edit-2.7/extensions/ext-polygon.js | 295 + .../extensions/ext-server_moinsave.js | 59 + .../extensions/ext-server_opensave.js | 210 + .../03/svg-edit-2.7/extensions/ext-shapes.js | 357 + .../03/svg-edit-2.7/extensions/ext-shapes.xml | 10 + .../03/svg-edit-2.7/extensions/ext-star.js | 236 + .../extensions/ext-storage - Copy.js | 230 + .../03/svg-edit-2.7/extensions/ext-storage.js | 293 + .../svg-edit-2.7/extensions/ext-webappfind.js | 67 + .../extensions/ext-xdomain-messaging.js | 42 + .../extensions/eyedropper-icon.xml | 34 + .../03/svg-edit-2.7/extensions/eyedropper.png | Bin 0 -> 718 bytes .../03/svg-edit-2.7/extensions/fileopen.php | 49 + .../03/svg-edit-2.7/extensions/filesave.php | 60 + .../extensions/foreignobject-icons.xml | 96 + .../03/svg-edit-2.7/extensions/form-test.html | 27 + .../03/svg-edit-2.7/extensions/grid-icon.xml | 30 + .../extensions/helloworld-icon.xml | 21 + .../extensions/imagelib/index.html | 70 + .../extensions/imagelib/smiley.svg | 12 + .../svg-edit-2.7/extensions/markers-icons.xml | 115 + .../svg-edit-2.7/extensions/mathjax-icons.xml | 11 + .../svg-edit-2.7/extensions/polygon-icons.svg | 14 + .../2015/03/svg-edit-2.7/extensions/saved.svg | 8 + .../03/svg-edit-2.7/extensions/savefile.php | 16 + .../extensions/savefile_config.php | 3 + .../extensions/shapelib/animal.json | 21 + .../extensions/shapelib/arrow.json | 28 + .../extensions/shapelib/dialog_balloon.json | 9 + .../extensions/shapelib/electronics.json | 20 + .../extensions/shapelib/flowchart.json | 25 + .../extensions/shapelib/game.json | 13 + .../extensions/shapelib/math.json | 9 + .../extensions/shapelib/misc.json | 37 + .../extensions/shapelib/music.json | 21 + .../extensions/shapelib/object.json | 18 + .../extensions/shapelib/raphael.txt | 12 + .../extensions/shapelib/raphael_1.json | 65 + .../extensions/shapelib/raphael_2.json | 64 + .../extensions/shapelib/symbol.json | 28 + .../03/svg-edit-2.7/extensions/star-icons.svg | 14 + .../extensions/webappfind-icon.svg | 23 + content/media/2015/03/svg-edit-2.7/history.js | 613 ++ .../2015/03/svg-edit-2.7/images/README.txt | 61 + .../03/svg-edit-2.7/images/align-bottom.png | Bin 0 -> 291 bytes .../03/svg-edit-2.7/images/align-bottom.svg | 277 + .../03/svg-edit-2.7/images/align-center.png | Bin 0 -> 449 bytes .../03/svg-edit-2.7/images/align-center.svg | 252 + .../03/svg-edit-2.7/images/align-left.png | Bin 0 -> 305 bytes .../03/svg-edit-2.7/images/align-left.svg | 235 + .../03/svg-edit-2.7/images/align-middle.png | Bin 0 -> 459 bytes .../03/svg-edit-2.7/images/align-middle.svg | 250 + .../03/svg-edit-2.7/images/align-right.png | Bin 0 -> 339 bytes .../03/svg-edit-2.7/images/align-right.svg | 233 + .../2015/03/svg-edit-2.7/images/align-top.png | Bin 0 -> 287 bytes .../2015/03/svg-edit-2.7/images/align-top.svg | 233 + .../2015/03/svg-edit-2.7/images/bold.png | Bin 0 -> 2976 bytes .../2015/03/svg-edit-2.7/images/cancel.png | Bin 0 -> 1389 bytes .../2015/03/svg-edit-2.7/images/circle.png | Bin 0 -> 1040 bytes .../2015/03/svg-edit-2.7/images/clear.png | Bin 0 -> 812 bytes .../2015/03/svg-edit-2.7/images/clone.png | Bin 0 -> 715 bytes .../2015/03/svg-edit-2.7/images/conn.svg | 29 + .../2015/03/svg-edit-2.7/images/copy.png | Bin 0 -> 852 bytes .../media/2015/03/svg-edit-2.7/images/cut.png | Bin 0 -> 1294 bytes .../2015/03/svg-edit-2.7/images/delete.png | Bin 0 -> 663 bytes .../images/document-properties.png | Bin 0 -> 688 bytes .../2015/03/svg-edit-2.7/images/dropdown.gif | Bin 0 -> 49 bytes .../2015/03/svg-edit-2.7/images/ellipse.png | Bin 0 -> 811 bytes .../media/2015/03/svg-edit-2.7/images/eye.png | Bin 0 -> 750 bytes .../2015/03/svg-edit-2.7/images/fhpath.png | Bin 0 -> 1218 bytes .../2015/03/svg-edit-2.7/images/flyouth.png | Bin 0 -> 109 bytes .../2015/03/svg-edit-2.7/images/flyup.gif | Bin 0 -> 48 bytes .../svg-edit-2.7/images/freehand-circle.png | Bin 0 -> 1257 bytes .../svg-edit-2.7/images/freehand-square.png | Bin 0 -> 903 bytes .../2015/03/svg-edit-2.7/images/go-down.png | Bin 0 -> 683 bytes .../2015/03/svg-edit-2.7/images/go-up.png | Bin 0 -> 652 bytes .../2015/03/svg-edit-2.7/images/image.png | Bin 0 -> 900 bytes .../2015/03/svg-edit-2.7/images/italic.png | Bin 0 -> 2972 bytes .../2015/03/svg-edit-2.7/images/line.png | Bin 0 -> 1026 bytes .../03/svg-edit-2.7/images/link_controls.png | Bin 0 -> 919 bytes .../2015/03/svg-edit-2.7/images/logo.png | Bin 0 -> 3983 bytes .../2015/03/svg-edit-2.7/images/logo.svg | 32 + .../03/svg-edit-2.7/images/move_bottom.png | Bin 0 -> 737 bytes .../2015/03/svg-edit-2.7/images/move_top.png | Bin 0 -> 663 bytes .../03/svg-edit-2.7/images/node_clone.png | Bin 0 -> 571 bytes .../03/svg-edit-2.7/images/node_delete.png | Bin 0 -> 589 bytes .../2015/03/svg-edit-2.7/images/none.png | Bin 0 -> 136 bytes .../2015/03/svg-edit-2.7/images/open.png | Bin 0 -> 919 bytes .../2015/03/svg-edit-2.7/images/paste.png | Bin 0 -> 906 bytes .../2015/03/svg-edit-2.7/images/path.png | Bin 0 -> 854 bytes .../2015/03/svg-edit-2.7/images/polygon.png | Bin 0 -> 881 bytes .../2015/03/svg-edit-2.7/images/polygon.svg | 219 + .../2015/03/svg-edit-2.7/images/rect.png | Bin 0 -> 404 bytes .../2015/03/svg-edit-2.7/images/redo.png | Bin 0 -> 921 bytes .../2015/03/svg-edit-2.7/images/reorient.png | Bin 0 -> 980 bytes .../2015/03/svg-edit-2.7/images/rotate.png | Bin 0 -> 1500 bytes .../2015/03/svg-edit-2.7/images/save.png | Bin 0 -> 1272 bytes .../2015/03/svg-edit-2.7/images/select.png | Bin 0 -> 712 bytes .../03/svg-edit-2.7/images/select_node.png | Bin 0 -> 828 bytes .../media/2015/03/svg-edit-2.7/images/sep.png | Bin 0 -> 93 bytes .../images/shape_group_elements.png | Bin 0 -> 553 bytes .../03/svg-edit-2.7/images/shape_ungroup.png | Bin 0 -> 666 bytes .../2015/03/svg-edit-2.7/images/source.png | Bin 0 -> 1110 bytes .../svg-edit-2.7/images/spinbtn_updn_big.png | Bin 0 -> 2049 bytes .../2015/03/svg-edit-2.7/images/square.png | Bin 0 -> 422 bytes .../03/svg-edit-2.7/images/svg_edit_icons.svg | 1032 +++ .../svg-edit-2.7/images/svg_edit_icons.svgz | Bin 0 -> 5493 bytes .../2015/03/svg-edit-2.7/images/text.png | Bin 0 -> 1032 bytes .../2015/03/svg-edit-2.7/images/text.svg | 157 + .../2015/03/svg-edit-2.7/images/to_path.png | Bin 0 -> 1153 bytes .../2015/03/svg-edit-2.7/images/undo.png | Bin 0 -> 1122 bytes .../03/svg-edit-2.7/images/view-refresh.png | Bin 0 -> 912 bytes .../2015/03/svg-edit-2.7/images/wave.png | Bin 0 -> 2005 bytes .../2015/03/svg-edit-2.7/images/wireframe.png | Bin 0 -> 466 bytes .../2015/03/svg-edit-2.7/images/zoom.png | Bin 0 -> 1197 bytes content/media/2015/03/svg-edit-2.7/index.html | 795 ++ .../2015/03/svg-edit-2.7/jgraduate/LICENSE | 202 + .../2015/03/svg-edit-2.7/jgraduate/README | 3 + .../03/svg-edit-2.7/jgraduate/css/jPicker.css | 1 + .../svg-edit-2.7/jgraduate/css/jgraduate.css | 351 + .../jgraduate/images/AlphaBar.png | Bin 0 -> 2195 bytes .../03/svg-edit-2.7/jgraduate/images/Bars.png | Bin 0 -> 382 bytes .../03/svg-edit-2.7/jgraduate/images/Maps.png | Bin 0 -> 78245 bytes .../svg-edit-2.7/jgraduate/images/NoColor.png | Bin 0 -> 552 bytes .../jgraduate/images/bar-opacity.png | Bin 0 -> 134 bytes .../jgraduate/images/map-opacity.png | Bin 0 -> 139 bytes .../jgraduate/images/mappoint.gif | Bin 0 -> 93 bytes .../jgraduate/images/mappoint_c.png | Bin 0 -> 252 bytes .../jgraduate/images/mappoint_f.png | Bin 0 -> 255 bytes .../svg-edit-2.7/jgraduate/images/picker.gif | Bin 0 -> 146 bytes .../jgraduate/images/preview-opacity.png | Bin 0 -> 135 bytes .../jgraduate/images/rangearrows.gif | Bin 0 -> 76 bytes .../jgraduate/images/rangearrows2.gif | Bin 0 -> 93 bytes .../2015/03/svg-edit-2.7/jgraduate/jpicker.js | 2091 +++++ .../03/svg-edit-2.7/jgraduate/jpicker.min.js | 1 + .../jgraduate/jquery.jgraduate.js | 1175 +++ .../jgraduate/jquery.jgraduate.min.js | 37 + .../media/2015/03/svg-edit-2.7/jquery-svg.js | 74 + .../jquery-ui/jquery-ui-1.8.17.custom.min.js | 54 + .../jquery-ui/jquery-ui-1.8.custom.min.js | 84 + content/media/2015/03/svg-edit-2.7/jquery.js | 4 + .../svg-edit-2.7/jquerybbq/jquery.bbq.min.js | 18 + .../2015/03/svg-edit-2.7/js-hotkeys/README.md | 45 + .../js-hotkeys/jquery.hotkeys.min.js | 15 + .../2015/03/svg-edit-2.7/locale/README.txt | 18 + .../2015/03/svg-edit-2.7/locale/lang.af.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ar.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.az.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.be.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.bg.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ca.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.cs.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.cy.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.da.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.de.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.el.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.en.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.es.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.et.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.fa.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.fi.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.fr.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.fy.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ga.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.gl.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.he.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.hi.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.hr.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.hu.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.hy.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.id.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.is.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.it.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ja.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ko.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.lt.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.lv.js | 254 + .../2015/03/svg-edit-2.7/locale/lang.mk.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ms.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.mt.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.nl.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.no.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.pl.js | 251 + .../2015/03/svg-edit-2.7/locale/lang.pt-BR.js | 249 + .../2015/03/svg-edit-2.7/locale/lang.pt-PT.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.ro.js | 249 + .../2015/03/svg-edit-2.7/locale/lang.ru.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.sk.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.sl.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.sq.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.sr.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.sv.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.sw.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.test.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.th.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.tl.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.tr.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.uk.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.vi.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.yi.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.zh-CN.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.zh-HK.js | 250 + .../2015/03/svg-edit-2.7/locale/lang.zh-TW.js | 250 + .../2015/03/svg-edit-2.7/locale/locale.js | 328 + content/media/2015/03/svg-edit-2.7/math.js | 225 + content/media/2015/03/svg-edit-2.7/path.js | 992 +++ .../media/2015/03/svg-edit-2.7/recalculate.js | 819 ++ .../media/2015/03/svg-edit-2.7/sanitize.js | 258 + content/media/2015/03/svg-edit-2.7/select.js | 534 ++ .../03/svg-edit-2.7/spinbtn/JQuerySpinBtn.css | 41 + .../03/svg-edit-2.7/spinbtn/JQuerySpinBtn.js | 274 + .../svg-edit-2.7/spinbtn/JQuerySpinBtn.min.js | 7 + .../03/svg-edit-2.7/spinbtn/spinbtn_updn.png | Bin 0 -> 666 bytes .../2015/03/svg-edit-2.7/svg-editor - Copy.js | 4981 +++++++++++ .../03/svg-edit-2.7/svg-editor-copy-ok.js | 5120 +++++++++++ .../media/2015/03/svg-edit-2.7/svg-editor.css | 1466 ++++ .../media/2015/03/svg-edit-2.7/svg-editor.js | 5120 +++++++++++ .../2015/03/svg-edit-2.7/svg-editor.manifest | 122 + .../media/2015/03/svg-edit-2.7/svgcanvas.js | 7760 +++++++++++++++++ .../2015/03/svg-edit-2.7/svgedit.compiled.js | 481 + content/media/2015/03/svg-edit-2.7/svgedit.js | 28 + .../svg-edit-2.7/svgicons/jquery.svgicons.js | 486 ++ .../2015/03/svg-edit-2.7/svgtransformlist.js | 289 + .../media/2015/03/svg-edit-2.7/svgutils.js | 726 ++ content/media/2015/03/svg-edit-2.7/touch.js | 33 + content/media/2015/03/svg-edit-2.7/units.js | 282 + content/pages/misc.md | 3 +- themes/notmyideaever/static/css/main.css | 2 +- 262 files changed, 64200 insertions(+), 2 deletions(-) create mode 100644 content/blog/2015-03-26-porting-carrier-101.md create mode 100644 content/blog/2015-03-30-วัดบัวขวัญ-คุณห้ามหลง.md create mode 100644 content/media/2015/03/bua-khwan-sign.png create mode 100755 content/media/2015/03/svg-edit-2.7/browser-not-supported.html create mode 100755 content/media/2015/03/svg-edit-2.7/browser.js create mode 100755 content/media/2015/03/svg-edit-2.7/canvg/canvg.js create mode 100755 content/media/2015/03/svg-edit-2.7/canvg/rgbcolor.js create mode 100755 content/media/2015/03/svg-edit-2.7/config-sample.js create mode 100755 content/media/2015/03/svg-edit-2.7/config.js create mode 100755 content/media/2015/03/svg-edit-2.7/contextmenu.js create mode 100755 content/media/2015/03/svg-edit-2.7/contextmenu/jquery.contextMenu.js create mode 100755 content/media/2015/03/svg-edit-2.7/coords.js create mode 100755 content/media/2015/03/svg-edit-2.7/draw.js create mode 100755 content/media/2015/03/svg-edit-2.7/embedapi.html create mode 100755 content/media/2015/03/svg-edit-2.7/embedapi.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/allowedMimeTypes.php create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/closepath_icons.svg create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/executablebuilder-icocreator.svg create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-arrows.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-closepath.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-connector.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-executablebuilder.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-eyedropper.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-foreignobject.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-grid.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-helloworld.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-imagelib.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-imagelib.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-markers.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-mathjax.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-overview_window.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-panning.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-panning.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-php_savefile.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-polygon.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-server_moinsave.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-server_opensave.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-shapes.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-shapes.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-star.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-storage - Copy.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-storage.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-webappfind.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/ext-xdomain-messaging.js create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/eyedropper-icon.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/eyedropper.png create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/fileopen.php create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/filesave.php create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/foreignobject-icons.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/form-test.html create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/grid-icon.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/helloworld-icon.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/imagelib/index.html create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/imagelib/smiley.svg create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/markers-icons.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/mathjax-icons.xml create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/polygon-icons.svg create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/saved.svg create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/savefile.php create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/savefile_config.php create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/animal.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/arrow.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/dialog_balloon.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/electronics.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/flowchart.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/game.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/math.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/misc.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/music.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/object.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/raphael.txt create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/raphael_1.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/raphael_2.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/shapelib/symbol.json create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/star-icons.svg create mode 100755 content/media/2015/03/svg-edit-2.7/extensions/webappfind-icon.svg create mode 100755 content/media/2015/03/svg-edit-2.7/history.js create mode 100755 content/media/2015/03/svg-edit-2.7/images/README.txt create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-bottom.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-bottom.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-center.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-center.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-left.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-left.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-middle.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-middle.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-right.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-right.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-top.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/align-top.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/bold.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/cancel.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/circle.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/clear.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/clone.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/conn.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/copy.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/cut.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/delete.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/document-properties.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/dropdown.gif create mode 100755 content/media/2015/03/svg-edit-2.7/images/ellipse.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/eye.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/fhpath.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/flyouth.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/flyup.gif create mode 100755 content/media/2015/03/svg-edit-2.7/images/freehand-circle.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/freehand-square.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/go-down.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/go-up.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/image.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/italic.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/line.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/link_controls.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/logo.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/logo.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/move_bottom.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/move_top.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/node_clone.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/node_delete.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/none.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/open.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/paste.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/path.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/polygon.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/polygon.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/rect.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/redo.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/reorient.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/rotate.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/save.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/select.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/select_node.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/sep.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/shape_group_elements.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/shape_ungroup.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/source.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/spinbtn_updn_big.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/square.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/svg_edit_icons.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/svg_edit_icons.svgz create mode 100755 content/media/2015/03/svg-edit-2.7/images/text.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/text.svg create mode 100755 content/media/2015/03/svg-edit-2.7/images/to_path.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/undo.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/view-refresh.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/wave.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/wireframe.png create mode 100755 content/media/2015/03/svg-edit-2.7/images/zoom.png create mode 100755 content/media/2015/03/svg-edit-2.7/index.html create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/LICENSE create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/README create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/css/jPicker.css create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/css/jgraduate.css create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/AlphaBar.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/Bars.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/Maps.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/NoColor.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/bar-opacity.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/map-opacity.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint.gif create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint_c.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint_f.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/picker.gif create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/preview-opacity.png create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/rangearrows.gif create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/images/rangearrows2.gif create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/jpicker.js create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/jpicker.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/jquery.jgraduate.js create mode 100755 content/media/2015/03/svg-edit-2.7/jgraduate/jquery.jgraduate.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/jquery-svg.js create mode 100755 content/media/2015/03/svg-edit-2.7/jquery-ui/jquery-ui-1.8.17.custom.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/jquery-ui/jquery-ui-1.8.custom.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/jquery.js create mode 100755 content/media/2015/03/svg-edit-2.7/jquerybbq/jquery.bbq.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/js-hotkeys/README.md create mode 100755 content/media/2015/03/svg-edit-2.7/js-hotkeys/jquery.hotkeys.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/README.txt create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.af.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ar.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.az.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.be.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.bg.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ca.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.cs.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.cy.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.da.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.de.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.el.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.en.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.es.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.et.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.fa.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.fi.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.fr.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.fy.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ga.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.gl.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.he.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.hi.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.hr.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.hu.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.hy.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.id.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.is.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.it.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ja.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ko.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.lt.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.lv.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.mk.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ms.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.mt.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.nl.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.no.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.pl.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.pt-BR.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.pt-PT.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ro.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.ru.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.sk.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.sl.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.sq.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.sr.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.sv.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.sw.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.test.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.th.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.tl.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.tr.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.uk.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.vi.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.yi.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.zh-CN.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.zh-HK.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/lang.zh-TW.js create mode 100755 content/media/2015/03/svg-edit-2.7/locale/locale.js create mode 100755 content/media/2015/03/svg-edit-2.7/math.js create mode 100755 content/media/2015/03/svg-edit-2.7/path.js create mode 100755 content/media/2015/03/svg-edit-2.7/recalculate.js create mode 100755 content/media/2015/03/svg-edit-2.7/sanitize.js create mode 100755 content/media/2015/03/svg-edit-2.7/select.js create mode 100755 content/media/2015/03/svg-edit-2.7/spinbtn/JQuerySpinBtn.css create mode 100755 content/media/2015/03/svg-edit-2.7/spinbtn/JQuerySpinBtn.js create mode 100755 content/media/2015/03/svg-edit-2.7/spinbtn/JQuerySpinBtn.min.js create mode 100755 content/media/2015/03/svg-edit-2.7/spinbtn/spinbtn_updn.png create mode 100755 content/media/2015/03/svg-edit-2.7/svg-editor - Copy.js create mode 100755 content/media/2015/03/svg-edit-2.7/svg-editor-copy-ok.js create mode 100755 content/media/2015/03/svg-edit-2.7/svg-editor.css create mode 100755 content/media/2015/03/svg-edit-2.7/svg-editor.js create mode 100755 content/media/2015/03/svg-edit-2.7/svg-editor.manifest create mode 100755 content/media/2015/03/svg-edit-2.7/svgcanvas.js create mode 100755 content/media/2015/03/svg-edit-2.7/svgedit.compiled.js create mode 100755 content/media/2015/03/svg-edit-2.7/svgedit.js create mode 100755 content/media/2015/03/svg-edit-2.7/svgicons/jquery.svgicons.js create mode 100755 content/media/2015/03/svg-edit-2.7/svgtransformlist.js create mode 100755 content/media/2015/03/svg-edit-2.7/svgutils.js create mode 100755 content/media/2015/03/svg-edit-2.7/touch.js create mode 100755 content/media/2015/03/svg-edit-2.7/units.js diff --git a/content/blog/2015-03-26-porting-carrier-101.md b/content/blog/2015-03-26-porting-carrier-101.md new file mode 100644 index 0000000..a73c161 --- /dev/null +++ b/content/blog/2015-03-26-porting-carrier-101.md @@ -0,0 +1,27 @@ +title: ย้ายค่ายมือถือ 101 +date: Mar 26, 2015 +author: sipp11 +category: misc +tags: info +icon: briefcase +slug: ย้ายค่ายมือถือ-ข้อควรรู้ + + +การย้ายค่ายมือถือเป็นเรื่องง่ายในหลักการ แต่ความเป็นจริงนั้น มันก็มีข้อควรรู้ก่อนจะทำ เนื่องด้วยการย้ายค่ายนั้นจะใช้เวลาดำเนินการประมาณ 3-5 วันทำการ (อย่าลืม: ไม่รวมวันเสาร์ อาทิตย์ วันหยุด) สิ่งที่ต้องทำคร่าวๆ + +* จ่ายบิลที่คงค้างของค่ายที่ใช้อยู่ก่อน ซึ่งอาจจะไม่รวมเดือนสุดท้าย ซึ่งนั่นคือ บิลที่จะตามหลังมา + * ไม่ต้องแจ้งอะไร หรือแจ้งไปเค้าก็ไม่ได้ทำอะไรเพ่ิมเติมครับ เพราะการดำเนินการนี้เป็นหน้าที่ของค่ายใหม่ทั้งหมด +* ทำเรื่องย้ายเบอร์กับค่ายใหม่ + +ขั้นตอนง่ายๆนี้ จริงๆแล้วลำดับไม่สำคัญ แต่ควรจะจัดการให้เสร็จภายในวันเดียวกัน ไม่งั้นการย้ายค่ายจะช้าลง หลังจากนี้ก็เพียงรอเวลาค่ายใหม่แจ้งว่าการดำเนินการเสร็จสิ้นก็เปลี่ยน SIM ใช้งานได้ + +## What's the catch? + +ปัญหาเดียวของการย้ายค่ายนั่นคือ ช่วงเวลาครับ การปิดเบอร์มันมีเรื่องโง่ๆ เรื่องนึง คือ ค่ายอย่าง True (ผมไม่ทราบว่าค่ายอื่นทำอย่างนี้หรือไม่นะครับ แค่คิดว่าไม่ต่างกัน) จะคิดเงินรอบบิลสุดท้ายเต็มเดือน ไม่ว่าคุณจะยกเลิกมันวันไหนก็ตาม เช่น ถ้าคุณยกเลิกวันที่ 2 ของรอบบิล คุณจะต้องจ่ายเงินฟรีไปเกือบๆ 28 วันในรอบบิลสุดท้าย ดังนั้น การย้ายค่ายควรจะย้ายในสัปดาห์สุดท้ายของรอบเดือนเพื่อประโยชน์สูงสุดของเราเอง และเผื่อเวลาด้วยนะครับ ไม่ให้พลาด :) + +## What else? + +* เมื่อการย้ายค่ายเริ่มต้น จะมี SMS จากค่ายใหม่ส่งมาบอกว่าได้เริ่มต้นแล้ว และ SMS จากค่ายเดิมเพื่อเปลี่ยนใจไม่ให้ย้าย โดยได้โทรฟรี เล่นเน็ตฟรีซักช่วงนึงด้วย +* ระหว่างการย้ายค่ายจะมีช่วงที่ไม่สามารถใช้งานได้อยู่ประมาณ 24 ชม. สำหรับกรณีของผมเป็นทาง True ที่ปิดสัญญาณของ SIM เดิมประมาณตี 3 ของวันที่ 2 แล้ว DTAC สามารถใช้ได้เวลาประมาณตี 2 ของวันที่ 3 (โดยผมปิดๆเปิดๆเครื่องที่ใส่ SIM ใหม่ไว้ทุกๆ 2-3 ชม. ดังนั้นเวลาอาจจะคลาดเคลื่อนบ้างแต่คงไม่มากนัก) + +หวังว่าข้อมูลนี้จะช่วยให้คุณย้ายค่ายได้อย่างราบรื่นกว่าไม่รู้อะไรเลยครับ :) diff --git a/content/blog/2015-03-30-วัดบัวขวัญ-คุณห้ามหลง.md b/content/blog/2015-03-30-วัดบัวขวัญ-คุณห้ามหลง.md new file mode 100644 index 0000000..4d24b9b --- /dev/null +++ b/content/blog/2015-03-30-วัดบัวขวัญ-คุณห้ามหลง.md @@ -0,0 +1,18 @@ +title: คุณไม่รู้ทาง? เรามีทางแก้ไขจากวัดบัวขวัญ +date: Mar 30, 2015 +author: sipp11 +category: social +tags: failed +icon: briefcase +slug: คุณไม่รู้ทาง-เรามีทางแก้-จากวัดบัวขวัญ + + +ทุกคนก็น่าจะรู้ว่า ป้ายบอกทาง กับ เมืองไทยนั้นเป็นของที่น่าสับสนไม่ใช่น้อย ไม่ว่าจะวางตำแหน่งไม่ดี ไกลไป ใกล้ไป หรือ อีกอย่างก็คือ ถนนบ้านเรามันออกแบบอย่างไม่เป็นระบบมากพอที่จะทำให้ป้ายสามารถครอบคลุมได้ทุกสิ่ง + +แต่มันก็ไม่ทำให้วัด วัดหนึ่งยอมแพ้ต่อความยากลำบากนั้น วัดบัวขวัญนั้นแก้ไขด้วยการวางป้ายมันซะทุกที่ซะเลย ไม่ต้องห่วงว่าจะหลง เพราะถึงจะเลยทางเลี้ยงแล้ว ก็ยังมีป้ายแสดงให้กลับรถอีกด้วยนะครับ เรียกว่า บอกย้ำเส้นทางกันมากกว่า Nagivator ทั้งหลายพูดซะอีก + +![ป้ายแสดงทางไปวัดบัวขวัญ](/media/2015/03/bua-khwan-sign.png) + +ผมก็คงใส่เข้าไปเรื่อยๆนั่นแหละครับ นี่แค่ถ่ายเล่นๆ เวลาขับผ่านก็นับได้เกิน 30 ป้ายแล้ว ไม่รุ้ว่า วิธีการนี้จะได้ผลมั้ย แต่ที่แน่ๆ มันทำให้รู้ว่า เมืองไทยไม่มีระเบียบบ้าอะไรเลยจริงๆ :-/ + +ใครอยากเข้าไปดูรูปชัดๆ ว่า จริง หรือไม่จริง ก็เข้าไปได้ตามนี้ [Maps on Flickr](https://www.flickr.com/photos/37507575@N04/sets/72157651643441441/map?&fLat=13.8559&fLon=100.5115&zl=13&order_by=recent) ต้องของคุณ Flickr จริงๆ สำหรับพื้นที่ให้ upload รูปเยอะแยะ แถมจัดการสะดวกๆ :) \ No newline at end of file diff --git a/content/media/2015/03/bua-khwan-sign.png b/content/media/2015/03/bua-khwan-sign.png new file mode 100644 index 0000000000000000000000000000000000000000..8a33863f90e067633f2a751765ad23bbb535071d GIT binary patch literal 85343 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%0DHTeACi!qN!V%5H?53gl}0 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 + + + + + + + +Browser does not support SVG | SVG-edit + + + +
+SVG-edit logo
+

Sorry, but your browser does not support SVG. Below is a list of alternate browsers and versions that support SVG and SVG-edit (from caniuse.com).

+

Try the latest version of Firefox, Google Chrome, Safari, Opera or Internet Explorer.

+

If you are unable to install one of these and must use an old version of Internet Explorer, you can install the Google Chrome Frame plugin.

+ +
+ + + + diff --git a/content/media/2015/03/svg-edit-2.7/browser.js b/content/media/2015/03/svg-edit-2.7/browser.js new file mode 100755 index 0000000..dc6ee6e --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/browser.js @@ -0,0 +1,180 @@ +/*globals $, svgedit*/ +/*jslint vars: true, eqeq: true*/ +/** + * Package: svgedit.browser + * + * Licensed under the MIT License + * + * Copyright(c) 2010 Jeff Schiller + * Copyright(c) 2010 Alexis Deveria + */ + +// Dependencies: +// 1) jQuery (for $.alert()) + +(function() {'use strict'; + +if (!svgedit.browser) { + svgedit.browser = {}; +} + +// alias +var NS = svgedit.NS; + +var supportsSvg_ = (function() { + return !!document.createElementNS && !!document.createElementNS(NS.SVG, 'svg').createSVGRect; +}()); + +svgedit.browser.supportsSvg = function() { return supportsSvg_; }; +if(!svgedit.browser.supportsSvg()) { + window.location = 'browser-not-supported.html'; + return; +} + +var userAgent = navigator.userAgent; +var svg = document.createElementNS(NS.SVG, 'svg'); + +// Note: Browser sniffing should only be used if no other detection method is possible +var isOpera_ = !!window.opera; +var isWebkit_ = userAgent.indexOf('AppleWebKit') >= 0; +var isGecko_ = userAgent.indexOf('Gecko/') >= 0; +var isIE_ = userAgent.indexOf('MSIE') >= 0; +var isChrome_ = userAgent.indexOf('Chrome/') >= 0; +var isWindows_ = userAgent.indexOf('Windows') >= 0; +var isMac_ = userAgent.indexOf('Macintosh') >= 0; +var isTouch_ = 'ontouchstart' in window; + +var supportsSelectors_ = (function() { + return !!svg.querySelector; +}()); + +var supportsXpath_ = (function() { + return !!document.evaluate; +}()); + +// segList functions (for FF1.5 and 2.0) +var supportsPathReplaceItem_ = (function() { + var path = document.createElementNS(NS.SVG, 'path'); + path.setAttribute('d', 'M0,0 10,10'); + var seglist = path.pathSegList; + var seg = path.createSVGPathSegLinetoAbs(5,5); + try { + seglist.replaceItem(seg, 0); + return true; + } catch(err) {} + return false; +}()); + +var supportsPathInsertItemBefore_ = (function() { + var path = document.createElementNS(NS.SVG, 'path'); + path.setAttribute('d', 'M0,0 10,10'); + var seglist = path.pathSegList; + var seg = path.createSVGPathSegLinetoAbs(5,5); + try { + seglist.insertItemBefore(seg, 0); + return true; + } catch(err) {} + return false; +}()); + +// text character positioning (for IE9) +var supportsGoodTextCharPos_ = (function() { + var svgroot = document.createElementNS(NS.SVG, 'svg'); + var svgcontent = document.createElementNS(NS.SVG, 'svg'); + document.documentElement.appendChild(svgroot); + svgcontent.setAttribute('x', 5); + svgroot.appendChild(svgcontent); + var text = document.createElementNS(NS.SVG, 'text'); + text.textContent = 'a'; + svgcontent.appendChild(text); + var pos = text.getStartPositionOfChar(0).x; + document.documentElement.removeChild(svgroot); + return (pos === 0); +}()); + +var supportsPathBBox_ = (function() { + var svgcontent = document.createElementNS(NS.SVG, 'svg'); + document.documentElement.appendChild(svgcontent); + var path = document.createElementNS(NS.SVG, 'path'); + path.setAttribute('d', 'M0,0 C0,0 10,10 10,0'); + svgcontent.appendChild(path); + var bbox = path.getBBox(); + document.documentElement.removeChild(svgcontent); + return (bbox.height > 4 && bbox.height < 5); +}()); + +// Support for correct bbox sizing on groups with horizontal/vertical lines +var supportsHVLineContainerBBox_ = (function() { + var svgcontent = document.createElementNS(NS.SVG, 'svg'); + document.documentElement.appendChild(svgcontent); + var path = document.createElementNS(NS.SVG, 'path'); + path.setAttribute('d', 'M0,0 10,0'); + var path2 = document.createElementNS(NS.SVG, 'path'); + path2.setAttribute('d', 'M5,0 15,0'); + var g = document.createElementNS(NS.SVG, 'g'); + g.appendChild(path); + g.appendChild(path2); + svgcontent.appendChild(g); + var bbox = g.getBBox(); + document.documentElement.removeChild(svgcontent); + // Webkit gives 0, FF gives 10, Opera (correctly) gives 15 + return (bbox.width == 15); +}()); + +var supportsEditableText_ = (function() { + // TODO: Find better way to check support for this + return isOpera_; +}()); + +var supportsGoodDecimals_ = (function() { + // Correct decimals on clone attributes (Opera < 10.5/win/non-en) + var rect = document.createElementNS(NS.SVG, 'rect'); + rect.setAttribute('x', 0.1); + var crect = rect.cloneNode(false); + var retValue = (crect.getAttribute('x').indexOf(',') == -1); + if(!retValue) { + $.alert('NOTE: This version of Opera is known to contain bugs in SVG-edit.\n'+ + 'Please upgrade to the latest version in which the problems have been fixed.'); + } + return retValue; +}()); + +var supportsNonScalingStroke_ = (function() { + var rect = document.createElementNS(NS.SVG, 'rect'); + rect.setAttribute('style', 'vector-effect:non-scaling-stroke'); + return rect.style.vectorEffect === 'non-scaling-stroke'; +}()); + +var supportsNativeSVGTransformLists_ = (function() { + var rect = document.createElementNS(NS.SVG, 'rect'); + var rxform = rect.transform.baseVal; + var t1 = svg.createSVGTransform(); + rxform.appendItem(t1); + return rxform.getItem(0) == t1; +}()); + +// Public API + +svgedit.browser.isOpera = function() { return isOpera_; }; +svgedit.browser.isWebkit = function() { return isWebkit_; }; +svgedit.browser.isGecko = function() { return isGecko_; }; +svgedit.browser.isIE = function() { return isIE_; }; +svgedit.browser.isChrome = function() { return isChrome_; }; +svgedit.browser.isWindows = function() { return isWindows_; }; +svgedit.browser.isMac = function() { return isMac_; }; +svgedit.browser.isTouch = function() { return isTouch_; }; + +svgedit.browser.supportsSelectors = function() { return supportsSelectors_; }; +svgedit.browser.supportsXpath = function() { return supportsXpath_; }; + +svgedit.browser.supportsPathReplaceItem = function() { return supportsPathReplaceItem_; }; +svgedit.browser.supportsPathInsertItemBefore = function() { return supportsPathInsertItemBefore_; }; +svgedit.browser.supportsPathBBox = function() { return supportsPathBBox_; }; +svgedit.browser.supportsHVLineContainerBBox = function() { return supportsHVLineContainerBBox_; }; +svgedit.browser.supportsGoodTextCharPos = function() { return supportsGoodTextCharPos_; }; +svgedit.browser.supportsEditableText = function() { return supportsEditableText_; }; +svgedit.browser.supportsGoodDecimals = function() { return supportsGoodDecimals_; }; +svgedit.browser.supportsNonScalingStroke = function() { return supportsNonScalingStroke_; }; +svgedit.browser.supportsNativeTransformLists = function() { return supportsNativeSVGTransformLists_; }; + +}()); diff --git a/content/media/2015/03/svg-edit-2.7/canvg/canvg.js b/content/media/2015/03/svg-edit-2.7/canvg/canvg.js new file mode 100755 index 0000000..87bf2b9 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/canvg/canvg.js @@ -0,0 +1,2620 @@ +/* + * canvg.js - Javascript SVG parser and renderer on Canvas + * MIT Licensed + * Gabe Lerner (gabelerner@gmail.com) + * http://code.google.com/p/canvg/ + * + * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/ + */ +if(!window.console) { + window.console = {}; + window.console.log = function(str) {}; + window.console.dir = function(str) {}; +} + +if(!Array.prototype.indexOf){ + Array.prototype.indexOf = function(obj){ + for(var i=0; i ignore mouse events + // ignoreAnimation: true => ignore animations + // ignoreDimensions: true => does not try to resize canvas + // ignoreClear: true => does not clear canvas + // offsetX: int => draws at a x offset + // offsetY: int => draws at a y offset + // scaleWidth: int => scales horizontally to width + // scaleHeight: int => scales vertically to height + // renderCallback: function => will call the function after the first render is completed + // forceRedraw: function => will call the function on every frame, if it returns true, will redraw + this.canvg = function (target, s, opts) { + // no parameters + if (target == null && s == null && opts == null) { + var svgTags = document.getElementsByTagName('svg'); + for (var i=0; i]*>/, ''); + var xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); + xmlDoc.async = 'false'; + xmlDoc.loadXML(xml); + return xmlDoc; + } + } + + svg.Property = function(name, value) { + this.name = name; + this.value = value; + + this.hasValue = function() { + return (this.value != null && this.value !== ''); + } + + // return the numerical value of the property + this.numValue = function() { + if (!this.hasValue()) return 0; + + var n = parseFloat(this.value); + if ((this.value + '').match(/%$/)) { + n = n / 100.0; + } + return n; + } + + this.valueOrDefault = function(def) { + if (this.hasValue()) return this.value; + return def; + } + + this.numValueOrDefault = function(def) { + if (this.hasValue()) return this.numValue(); + return def; + } + + /* EXTENSIONS */ + var that = this; + + // color extensions + this.Color = { + // augment the current color value with the opacity + addOpacity: function(opacity) { + var newValue = that.value; + if (opacity != null && opacity != '') { + var color = new RGBColor(that.value); + if (color.ok) { + newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')'; + } + } + return new svg.Property(that.name, newValue); + } + } + + // definition extensions + this.Definition = { + // get the definition from the definitions table + getDefinition: function() { + var name = that.value.replace(/^(url\()?#([^\)]+)\)?$/, '$2'); + return svg.Definitions[name]; + }, + + isUrl: function() { + return that.value.indexOf('url(') == 0 + }, + + getFillStyle: function(e) { + var def = this.getDefinition(); + + // gradient + if (def != null && def.createGradient) { + return def.createGradient(svg.ctx, e); + } + + // pattern + if (def != null && def.createPattern) { + return def.createPattern(svg.ctx, e); + } + + return null; + } + } + + // length extensions + this.Length = { + DPI: function(viewPort) { + return 96.0; // TODO: compute? + }, + + EM: function(viewPort) { + var em = 12; + + var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); + if (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort); + + return em; + }, + + // get the length as pixels + toPixels: function(viewPort) { + if (!that.hasValue()) return 0; + var s = that.value+''; + if (s.match(/em$/)) return that.numValue() * this.EM(viewPort); + if (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0; + if (s.match(/px$/)) return that.numValue(); + if (s.match(/pt$/)) return that.numValue() * 1.25; + if (s.match(/pc$/)) return that.numValue() * 15; + if (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54; + if (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4; + if (s.match(/in$/)) return that.numValue() * this.DPI(viewPort); + if (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort); + return that.numValue(); + } + } + + // time extensions + this.Time = { + // get the time as milliseconds + toMilliseconds: function() { + if (!that.hasValue()) return 0; + var s = that.value+''; + if (s.match(/s$/)) return that.numValue() * 1000; + if (s.match(/ms$/)) return that.numValue(); + return that.numValue(); + } + } + + // angle extensions + this.Angle = { + // get the angle as radians + toRadians: function() { + if (!that.hasValue()) return 0; + var s = that.value+''; + if (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0); + if (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0); + if (s.match(/rad$/)) return that.numValue(); + return that.numValue() * (Math.PI / 180.0); + } + } + } + + // fonts + svg.Font = new (function() { + this.Styles = ['normal','italic','oblique','inherit']; + this.Variants = ['normal','small-caps','inherit']; + this.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit']; + + this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { + var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); + return { + fontFamily: fontFamily || f.fontFamily, + fontSize: fontSize || f.fontSize, + fontStyle: fontStyle || f.fontStyle, + fontWeight: fontWeight || f.fontWeight, + fontVariant: fontVariant || f.fontVariant, + toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } + } + } + + var that = this; + this.Parse = function(s) { + var f = {}; + var d = svg.trim(svg.compressSpaces(s || '')).split(' '); + var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false } + var ff = ''; + for (var i=0; i this.x2) this.x2 = x; + } + + if (y != null) { + if (isNaN(this.y1) || isNaN(this.y2)) { + this.y1 = y; + this.y2 = y; + } + if (y < this.y1) this.y1 = y; + if (y > this.y2) this.y2 = y; + } + } + this.addX = function(x) { this.addPoint(x, null); } + this.addY = function(y) { this.addPoint(null, y); } + + this.addBoundingBox = function(bb) { + this.addPoint(bb.x1, bb.y1); + this.addPoint(bb.x2, bb.y2); + } + + this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) { + var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) + var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) + var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) + var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) + this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); + } + + this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { + // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y]; + this.addPoint(p0[0], p0[1]); + this.addPoint(p3[0], p3[1]); + + for (i=0; i<=1; i++) { + var f = function(t) { + return Math.pow(1-t, 3) * p0[i] + + 3 * Math.pow(1-t, 2) * t * p1[i] + + 3 * (1-t) * Math.pow(t, 2) * p2[i] + + Math.pow(t, 3) * p3[i]; + } + + var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + var c = 3 * p1[i] - 3 * p0[i]; + + if (a == 0) { + if (b == 0) continue; + var t = -c / b; + if (0 < t && t < 1) { + if (i == 0) this.addX(f(t)); + if (i == 1) this.addY(f(t)); + } + continue; + } + + var b2ac = Math.pow(b, 2) - 4 * c * a; + if (b2ac < 0) continue; + var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + if (0 < t1 && t1 < 1) { + if (i == 0) this.addX(f(t1)); + if (i == 1) this.addY(f(t1)); + } + var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + if (0 < t2 && t2 < 1) { + if (i == 0) this.addX(f(t2)); + if (i == 1) this.addY(f(t2)); + } + } + } + + this.isPointInBox = function(x, y) { + return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2); + } + + this.addPoint(x1, y1); + this.addPoint(x2, y2); + } + + // transforms + svg.Transform = function(v) { + var that = this; + this.Type = {} + + // translate + this.Type.translate = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.translate(this.p.x || 0.0, this.p.y || 0.0); + } + this.applyToPoint = function(p) { + p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); + } + } + + // rotate + this.Type.rotate = function(s) { + var a = svg.ToNumberArray(s); + this.angle = new svg.Property('angle', a[0]); + this.cx = a[1] || 0; + this.cy = a[2] || 0; + this.apply = function(ctx) { + ctx.translate(this.cx, this.cy); + ctx.rotate(this.angle.Angle.toRadians()); + ctx.translate(-this.cx, -this.cy); + } + this.applyToPoint = function(p) { + var a = this.angle.Angle.toRadians(); + p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); + p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]); + p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); + } + } + + this.Type.scale = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); + } + this.applyToPoint = function(p) { + p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); + } + } + + this.Type.matrix = function(s) { + this.m = svg.ToNumberArray(s); + this.apply = function(ctx) { + ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); + } + this.applyToPoint = function(p) { + p.applyTransform(this.m); + } + } + + this.Type.SkewBase = function(s) { + this.base = that.Type.matrix; + this.base(s); + this.angle = new svg.Property('angle', s); + } + this.Type.SkewBase.prototype = new this.Type.matrix; + + this.Type.skewX = function(s) { + this.base = that.Type.SkewBase; + this.base(s); + this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0]; + } + this.Type.skewX.prototype = new this.Type.SkewBase; + + this.Type.skewY = function(s) { + this.base = that.Type.SkewBase; + this.base(s); + this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0]; + } + this.Type.skewY.prototype = new this.Type.SkewBase; + + this.transforms = []; + + this.apply = function(ctx) { + for (var i=0; i= this.tokens.length - 1; + } + + this.isCommandOrEnd = function() { + if (this.isEnd()) return true; + return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null; + } + + this.isRelativeCommand = function() { + return this.command == this.command.toLowerCase(); + } + + this.getToken = function() { + this.i = this.i + 1; + return this.tokens[this.i]; + } + + this.getScalar = function() { + return parseFloat(this.getToken()); + } + + this.nextCommand = function() { + this.previousCommand = this.command; + this.command = this.getToken(); + } + + this.getPoint = function() { + var p = new svg.Point(this.getScalar(), this.getScalar()); + return this.makeAbsolute(p); + } + + this.getAsControlPoint = function() { + var p = this.getPoint(); + this.control = p; + return p; + } + + this.getAsCurrentPoint = function() { + var p = this.getPoint(); + this.current = p; + return p; + } + + this.getReflectedControlPoint = function() { + if (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') { + return this.current; + } + + // reflect point + var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); + return p; + } + + this.makeAbsolute = function(p) { + if (this.isRelativeCommand()) { + p.x = this.current.x + p.x; + p.y = this.current.y + p.y; + } + return p; + } + + this.addMarker = function(p, from, priorTo) { + // if the last angle isn't filled in because we didn't have this point yet ... + if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) { + this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo); + } + this.addMarkerAngle(p, from == null ? null : from.angleTo(p)); + } + + this.addMarkerAngle = function(p, a) { + this.points.push(p); + this.angles.push(a); + } + + this.getMarkerPoints = function() { return this.points; } + this.getMarkerAngles = function() { + for (var i=0; i 1) { + rx *= Math.sqrt(l); + ry *= Math.sqrt(l); + } + // cx', cy' + var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt( + ((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) / + (Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2)) + ); + if (isNaN(s)) s = 0; + var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); + // cx, cy + var centp = new svg.Point( + (curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, + (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y + ); + // vector magnitude + var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); } + // ratio between two vectors + var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) } + // angle between two vectors + var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); } + // initial angle + var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]); + // angle delta + var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]; + var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry]; + var ad = a(u, v); + if (r(u,v) <= -1) ad = Math.PI; + if (r(u,v) >= 1) ad = 0; + + if (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI; + if (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI; + + // for markers + var halfWay = new svg.Point( + centp.x - rx * Math.cos((a1 + ad) / 2), + centp.y - ry * Math.sin((a1 + ad) / 2) + ); + pp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2); + pp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2); + + bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better + if (ctx != null) { + var r = rx > ry ? rx : ry; + var sx = rx > ry ? 1 : rx / ry; + var sy = rx > ry ? ry / rx : 1; + + ctx.translate(centp.x, centp.y); + ctx.rotate(xAxisRotation); + ctx.scale(sx, sy); + ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag); + ctx.scale(1/sx, 1/sy); + ctx.rotate(-xAxisRotation); + ctx.translate(-centp.x, -centp.y); + } + } + break; + case 'Z': + if (ctx != null) ctx.closePath(); + pp.current = pp.start; + } + } + + return bb; + } + + this.getMarkers = function() { + var points = this.PathParser.getMarkerPoints(); + var angles = this.PathParser.getMarkerAngles(); + + var markers = []; + for (var i=0; i this.maxDuration) { + // loop for indefinitely repeating animations + if (this.attribute('repeatCount').value == 'indefinite') { + this.duration = 0.0 + } + else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) { + this.removed = true; + this.getProperty().value = this.initialValue; + return true; + } + else { + return false; // no updates made + } + } + this.duration = this.duration + delta; + + // if we're past the begin time + var updated = false; + if (this.begin < this.duration) { + var newValue = this.calcValue(); // tween + + if (this.attribute('type').hasValue()) { + // for transform, etc. + var type = this.attribute('type').value; + newValue = type + '(' + newValue + ')'; + } + + this.getProperty().value = newValue; + updated = true; + } + + return updated; + } + + // fraction of duration we've covered + this.progress = function() { + return ((this.duration - this.begin) / (this.maxDuration - this.begin)); + } + } + svg.Element.AnimateBase.prototype = new svg.Element.ElementBase; + + // animate element + svg.Element.animate = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var from = this.attribute('from').numValue(); + var to = this.attribute('to').numValue(); + + // tween value linearly + return from + (to - from) * this.progress(); + }; + } + svg.Element.animate.prototype = new svg.Element.AnimateBase; + + // animate color element + svg.Element.animateColor = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var from = new RGBColor(this.attribute('from').value); + var to = new RGBColor(this.attribute('to').value); + + if (from.ok && to.ok) { + // tween color linearly + var r = from.r + (to.r - from.r) * this.progress(); + var g = from.g + (to.g - from.g) * this.progress(); + var b = from.b + (to.b - from.b) * this.progress(); + return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')'; + } + return this.attribute('from').value; + }; + } + svg.Element.animateColor.prototype = new svg.Element.AnimateBase; + + // animate transform element + svg.Element.animateTransform = function(node) { + this.base = svg.Element.animate; + this.base(node); + } + svg.Element.animateTransform.prototype = new svg.Element.animate; + + // font element + svg.Element.font = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + + this.horizAdvX = this.attribute('horiz-adv-x').numValue(); + + this.isRTL = false; + this.isArabic = false; + this.fontFace = null; + this.missingGlyph = null; + this.glyphs = []; + for (var i=0; i0 && text[i-1]!=' ' && i0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial'; + if (typeof(font.glyphs[c]) != 'undefined') { + glyph = font.glyphs[c][arabicForm]; + if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c]; + } + } + else { + glyph = font.glyphs[c]; + } + if (glyph == null) glyph = font.missingGlyph; + return glyph; + } + + this.renderChildren = function(ctx) { + var customFont = this.parent.style('font-family').Definition.getDefinition(); + if (customFont != null) { + var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); + var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); + var text = this.getText(); + if (customFont.isRTL) text = text.split("").reverse().join(""); + + var dx = svg.ToNumberArray(this.parent.attribute('dx').value); + for (var i=0; i 0 ? node.childNodes[0].nodeValue : // element + node.text; + this.getText = function() { + return this.text; + } + } + svg.Element.tspan.prototype = new svg.Element.TextElementBase; + + // tref + svg.Element.tref = function(node) { + this.base = svg.Element.TextElementBase; + this.base(node); + + this.getText = function() { + var element = this.attribute('xlink:href').Definition.getDefinition(); + if (element != null) return element.children[0].getText(); + } + } + svg.Element.tref.prototype = new svg.Element.TextElementBase; + + // a element + svg.Element.a = function(node) { + this.base = svg.Element.TextElementBase; + this.base(node); + + this.hasText = true; + for (var i=0; i 1 ? node.childNodes[1].nodeValue : ''); + css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments + css = svg.compressSpaces(css); // replace whitespace + var cssDefs = css.split('}'); + for (var i=0; i 0) { + var urlStart = srcs[s].indexOf('url'); + var urlEnd = srcs[s].indexOf(')', urlStart); + var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6); + var doc = svg.parseXml(svg.ajax(url)); + var fonts = doc.getElementsByTagName('font'); + for (var f=0; f + * @link http://www.phpied.com/rgb-color-parser-in-javascript/ + * @license Use it if you like it + */ +function RGBColor(color_string) { 'use strict'; + this.ok = false; + + // strip any leading # + if (color_string.charAt(0) === '#') { // remove # if any + color_string = color_string.substr(1,6); + } + + color_string = color_string.replace(/ /g,''); + color_string = color_string.toLowerCase(); + + // before getting into regexps, try simple matches + // and overwrite the input + var simple_colors = { + aliceblue: 'f0f8ff', + antiquewhite: 'faebd7', + aqua: '00ffff', + aquamarine: '7fffd4', + azure: 'f0ffff', + beige: 'f5f5dc', + bisque: 'ffe4c4', + black: '000000', + blanchedalmond: 'ffebcd', + blue: '0000ff', + blueviolet: '8a2be2', + brown: 'a52a2a', + burlywood: 'deb887', + cadetblue: '5f9ea0', + chartreuse: '7fff00', + chocolate: 'd2691e', + coral: 'ff7f50', + cornflowerblue: '6495ed', + cornsilk: 'fff8dc', + crimson: 'dc143c', + cyan: '00ffff', + darkblue: '00008b', + darkcyan: '008b8b', + darkgoldenrod: 'b8860b', + darkgray: 'a9a9a9', + darkgreen: '006400', + darkkhaki: 'bdb76b', + darkmagenta: '8b008b', + darkolivegreen: '556b2f', + darkorange: 'ff8c00', + darkorchid: '9932cc', + darkred: '8b0000', + darksalmon: 'e9967a', + darkseagreen: '8fbc8f', + darkslateblue: '483d8b', + darkslategray: '2f4f4f', + darkturquoise: '00ced1', + darkviolet: '9400d3', + deeppink: 'ff1493', + deepskyblue: '00bfff', + dimgray: '696969', + dodgerblue: '1e90ff', + feldspar: 'd19275', + firebrick: 'b22222', + floralwhite: 'fffaf0', + forestgreen: '228b22', + fuchsia: 'ff00ff', + gainsboro: 'dcdcdc', + ghostwhite: 'f8f8ff', + gold: 'ffd700', + goldenrod: 'daa520', + gray: '808080', + green: '008000', + greenyellow: 'adff2f', + honeydew: 'f0fff0', + hotpink: 'ff69b4', + indianred : 'cd5c5c', + indigo : '4b0082', + ivory: 'fffff0', + khaki: 'f0e68c', + lavender: 'e6e6fa', + lavenderblush: 'fff0f5', + lawngreen: '7cfc00', + lemonchiffon: 'fffacd', + lightblue: 'add8e6', + lightcoral: 'f08080', + lightcyan: 'e0ffff', + lightgoldenrodyellow: 'fafad2', + lightgrey: 'd3d3d3', + lightgreen: '90ee90', + lightpink: 'ffb6c1', + lightsalmon: 'ffa07a', + lightseagreen: '20b2aa', + lightskyblue: '87cefa', + lightslateblue: '8470ff', + lightslategray: '778899', + lightsteelblue: 'b0c4de', + lightyellow: 'ffffe0', + lime: '00ff00', + limegreen: '32cd32', + linen: 'faf0e6', + magenta: 'ff00ff', + maroon: '800000', + mediumaquamarine: '66cdaa', + mediumblue: '0000cd', + mediumorchid: 'ba55d3', + mediumpurple: '9370d8', + mediumseagreen: '3cb371', + mediumslateblue: '7b68ee', + mediumspringgreen: '00fa9a', + mediumturquoise: '48d1cc', + mediumvioletred: 'c71585', + midnightblue: '191970', + mintcream: 'f5fffa', + mistyrose: 'ffe4e1', + moccasin: 'ffe4b5', + navajowhite: 'ffdead', + navy: '000080', + oldlace: 'fdf5e6', + olive: '808000', + olivedrab: '6b8e23', + orange: 'ffa500', + orangered: 'ff4500', + orchid: 'da70d6', + palegoldenrod: 'eee8aa', + palegreen: '98fb98', + paleturquoise: 'afeeee', + palevioletred: 'd87093', + papayawhip: 'ffefd5', + peachpuff: 'ffdab9', + peru: 'cd853f', + pink: 'ffc0cb', + plum: 'dda0dd', + powderblue: 'b0e0e6', + purple: '800080', + red: 'ff0000', + rosybrown: 'bc8f8f', + royalblue: '4169e1', + saddlebrown: '8b4513', + salmon: 'fa8072', + sandybrown: 'f4a460', + seagreen: '2e8b57', + seashell: 'fff5ee', + sienna: 'a0522d', + silver: 'c0c0c0', + skyblue: '87ceeb', + slateblue: '6a5acd', + slategray: '708090', + snow: 'fffafa', + springgreen: '00ff7f', + steelblue: '4682b4', + tan: 'd2b48c', + teal: '008080', + thistle: 'd8bfd8', + tomato: 'ff6347', + turquoise: '40e0d0', + violet: 'ee82ee', + violetred: 'd02090', + wheat: 'f5deb3', + white: 'ffffff', + whitesmoke: 'f5f5f5', + yellow: 'ffff00', + yellowgreen: '9acd32' + }; + var key; + for (key in simple_colors) { + if (simple_colors.hasOwnProperty(key)) { + if (color_string == key) { + color_string = simple_colors[key]; + } + } + } + // emd of simple type-in colors + + // array of color definition objects + var color_defs = [ + { + re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, + example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], + process: function (bits){ + return [ + parseInt(bits[1], 10), + parseInt(bits[2], 10), + parseInt(bits[3], 10) + ]; + } + }, + { + re: /^(\w{2})(\w{2})(\w{2})$/, + example: ['#00ff00', '336699'], + process: function (bits){ + return [ + parseInt(bits[1], 16), + parseInt(bits[2], 16), + parseInt(bits[3], 16) + ]; + } + }, + { + re: /^(\w{1})(\w{1})(\w{1})$/, + example: ['#fb0', 'f0f'], + process: function (bits){ + return [ + parseInt(bits[1] + bits[1], 16), + parseInt(bits[2] + bits[2], 16), + parseInt(bits[3] + bits[3], 16) + ]; + } + } + ]; + + var i; + // search through the definitions to find a match + for (i = 0; i < color_defs.length; i++) { + var re = color_defs[i].re; + var processor = color_defs[i].process; + var bits = re.exec(color_string); + if (bits) { + var channels = processor(bits); + this.r = channels[0]; + this.g = channels[1]; + this.b = channels[2]; + this.ok = true; + } + + } + + // validate/cleanup values + this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r); + this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g); + this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b); + + // some getters + this.toRGB = function () { + return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; + }; + this.toHex = function () { + var r = this.r.toString(16); + var g = this.g.toString(16); + var b = this.b.toString(16); + if (r.length === 1) {r = '0' + r;} + if (g.length === 1) {g = '0' + g;} + if (b.length === 1) {b = '0' + b;} + return '#' + r + g + b; + }; + + // help + this.getHelpXML = function () { + var i, j; + var examples = []; + // add regexps + for (i = 0; i < color_defs.length; i++) { + var example = color_defs[i].example; + for (j = 0; j < example.length; j++) { + examples[examples.length] = example[j]; + } + } + // add type-in colors + var sc; + for (sc in simple_colors) { + if (simple_colors.hasOwnProperty(sc)) { + examples[examples.length] = sc; + } + } + + var xml = document.createElement('ul'); + xml.setAttribute('id', 'rgbcolor-examples'); + for (i = 0; i < examples.length; i++) { + try { + var list_item = document.createElement('li'); + var list_color = new RGBColor(examples[i]); + var example_div = document.createElement('div'); + example_div.style.cssText = + 'margin: 3px; ' + + 'border: 1px solid black; ' + + 'background:' + list_color.toHex() + '; ' + + 'color:' + list_color.toHex() + ; + example_div.appendChild(document.createTextNode('test')); + var list_item_value = document.createTextNode( + ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex() + ); + list_item.appendChild(example_div); + list_item.appendChild(list_item_value); + xml.appendChild(list_item); + + } catch(e){} + } + return xml; + + }; + +} diff --git a/content/media/2015/03/svg-edit-2.7/config-sample.js b/content/media/2015/03/svg-edit-2.7/config-sample.js new file mode 100755 index 0000000..fd93a22 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/config-sample.js @@ -0,0 +1,145 @@ +// DO NOT EDIT THIS FILE! +// THIS FILE IS JUST A SAMPLE; TO APPLY, YOU MUST +// CREATE A NEW FILE config.js AND ADD CONTENTS +// SUCH AS SHOWN BELOW INTO THAT FILE. + +/*globals svgEditor*/ +/* +The config.js file is intended for the setting of configuration or + preferences which must run early on; if this is not needed, it is + recommended that you create an extension instead (for greater + reusability and modularity). +*/ + +// CONFIG AND EXTENSION SETTING +/* +See defaultConfig and defaultExtensions in svg-editor.js for a list + of possible configuration settings. + +See svg-editor.js for documentation on using setConfig(). +*/ + +// URL OVERRIDE CONFIG +svgEditor.setConfig({ + /** + To override the ability for URLs to set URL-based SVG content, + uncomment the following: + */ + // preventURLContentLoading: true, + /** + To override the ability for URLs to set other configuration (including + extensions), uncomment the following: + */ + // preventAllURLConfig: true, + /** + To override the ability for URLs to set their own extensions, + uncomment the following (note that if setConfig() is used in + extension code, it will still be additive to extensions, + however): + */ + // lockExtensions: true, +}); + +svgEditor.setConfig({ + /* + Provide default values here which differ from that of the editor but + which the URL can override + */ +}, {allowInitialUserOverride: true}); + +// EXTENSION CONFIG +svgEditor.setConfig({ + extensions: [ + // 'ext-overview_window.js', 'ext-markers.js', 'ext-connector.js', 'ext-eyedropper.js', 'ext-shapes.js', 'ext-imagelib.js', 'ext-grid.js', 'ext-polygon.js', 'ext-star.js', 'ext-panning.js', 'ext-storage.js' + ] + // , noDefaultExtensions: false, // noDefaultExtensions can only be meaningfully used in config.js or in the URL +}); + +// OTHER CONFIG +svgEditor.setConfig({ + // canvasName: 'default', + // canvas_expansion: 3, + // initFill: { + // color: 'FF0000', // solid red + // opacity: 1 + // }, + // initStroke: { + // width: 5, + // color: '000000', // solid black + // opacity: 1 + // }, + // initOpacity: 1, + // colorPickerCSS: null, + // initTool: 'select', + // wireframe: false, + // showlayers: false, + // no_save_warning: false, + // PATH CONFIGURATION + // imgPath: 'images/', + // langPath: 'locale/', + // extPath: 'extensions/', + // jGraduatePath: 'jgraduate/images/', + /* + Uncomment the following to allow at least same domain (embedded) access, + including file:// access. + Setting as `['*']` would allow any domain to access but would be unsafe to + data privacy and integrity. + */ + // allowedOrigins: [window.location.origin || 'null'], // May be 'null' (as a string) when used as a file:// URL + // DOCUMENT PROPERTIES + // dimensions: [640, 480], + // EDITOR OPTIONS + // gridSnapping: false, + // gridColor: '#000', + // baseUnit: 'px', + // snappingStep: 10, + // showRulers: true, + // EXTENSION-RELATED (GRID) + // showGrid: false, // Set by ext-grid.js + // EXTENSION-RELATED (STORAGE) + // noStorageOnLoad: false, // Some interaction with ext-storage.js; prevent even the loading of previously saved local storage + // forceStorage: false, // Some interaction with ext-storage.js; strongly discouraged from modification as it bypasses user privacy by preventing them from choosing whether to keep local storage or not + // emptyStorageOnDecline: true, // Used by ext-storage.js; empty any prior storage if the user declines to store +}); + +// PREF CHANGES +/** +setConfig() can also be used to set preferences in addition to + configuration (see defaultPrefs in svg-editor.js for a list of + possible settings), but at least if you are using ext-storage.js + to store preferences, it will probably be better to let your + users control these. +As with configuration, one may use allowInitialUserOverride, but + in the case of preferences, any previously stored preferences + will also thereby be enabled to override this setting (and at a + higher priority than any URL preference setting overrides). + Failing to use allowInitialUserOverride will ensure preferences + are hard-coded here regardless of URL or prior user storage setting. +*/ +svgEditor.setConfig( + { + // lang: '', // Set dynamically within locale.js if not previously set + // iconsize: '', // Will default to 's' if the window height is smaller than the minimum height and 'm' otherwise + /** + * When showing the preferences dialog, svg-editor.js currently relies + * on curPrefs instead of $.pref, so allowing an override for bkgd_color + * means that this value won't have priority over block auto-detection as + * far as determining which color shows initially in the preferences + * dialog (though it can be changed and saved). + */ + // bkgd_color: '#FFF', + // bkgd_url: '', + // img_save: 'embed', + // Only shows in UI as far as alert notices + // save_notice_done: false, + // export_notice_done: false + } +); +svgEditor.setConfig( + { + // Indicate pref settings here if you wish to allow user storage or URL settings + // to be able to override your default preferences (unless other config options + // have already explicitly prevented one or the other) + }, + {allowInitialUserOverride: true} +); diff --git a/content/media/2015/03/svg-edit-2.7/config.js b/content/media/2015/03/svg-edit-2.7/config.js new file mode 100755 index 0000000..1364c44 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/config.js @@ -0,0 +1,12 @@ +/*globals svgEditor*/ + +svgEditor.setConfig({ +// extensions: [ +// 'ext-eyedropper.js', +// 'ext-shapes.js', +// 'ext-polygon.js', +// 'ext-star.js' +//], +//emptyStorageOnDecline: true + allowedOrigins: [window.location.origin] // May be 'null' (as a string) when used as a file:// URL +}); diff --git a/content/media/2015/03/svg-edit-2.7/contextmenu.js b/content/media/2015/03/svg-edit-2.7/contextmenu.js new file mode 100755 index 0000000..9fca31d --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/contextmenu.js @@ -0,0 +1,66 @@ +/*globals $, svgEditor*/ +/*jslint vars: true, eqeq: true*/ +/** + * Package: svgedit.contextmenu + * + * Licensed under the Apache License, Version 2 + * + * Author: Adam Bender + */ +// Dependencies: +// 1) jQuery (for dom injection of context menus) +var svgedit = svgedit || {}; +(function() { + var self = this; + if (!svgedit.contextmenu) { + svgedit.contextmenu = {}; + } + self.contextMenuExtensions = {}; + var menuItemIsValid = function(menuItem) { + return menuItem && menuItem.id && menuItem.label && menuItem.action && typeof menuItem.action == 'function'; + }; + var addContextMenuItem = function(menuItem) { + // menuItem: {id, label, shortcut, action} + if (!menuItemIsValid(menuItem)) { + console.error("Menu items must be defined and have at least properties: id, label, action, where action must be a function"); + return; + } + if (menuItem.id in self.contextMenuExtensions) { + console.error('Cannot add extension "' + menuItem.id + '", an extension by that name already exists"'); + return; + } + // Register menuItem action, see below for deferred menu dom injection + console.log("Registed contextmenu item: {id:"+ menuItem.id+", label:"+menuItem.label+"}"); + self.contextMenuExtensions[menuItem.id] = menuItem; + //TODO: Need to consider how to handle custom enable/disable behavior + }; + var hasCustomHandler = function(handlerKey) { + return self.contextMenuExtensions[handlerKey] && true; + }; + var getCustomHandler = function(handlerKey) { + return self.contextMenuExtensions[handlerKey].action; + }; + var injectExtendedContextMenuItemIntoDom = function(menuItem) { + if (Object.keys(self.contextMenuExtensions).length === 0) { + // all menuItems appear at the bottom of the menu in their own container. + // if this is the first extension menu we need to add the separator. + $("#cmenu_canvas").append("
  • "); + } + var shortcut = menuItem.shortcut || ""; + $("#cmenu_canvas").append("
  • " + + menuItem.label + "" + + shortcut + "
  • "); + }; + // Defer injection to wait out initial menu processing. This probably goes away once all context + // menu behavior is brought here. + svgEditor.ready(function() { + var menuItem; + for (menuItem in contextMenuExtensions) { + injectExtendedContextMenuItemIntoDom(contextMenuExtensions[menuItem]); + } + }); + svgedit.contextmenu.resetCustomMenus = function(){self.contextMenuExtensions = {};}; + svgedit.contextmenu.add = addContextMenuItem; + svgedit.contextmenu.hasCustomHandler = hasCustomHandler; + svgedit.contextmenu.getCustomHandler = getCustomHandler; +}()); diff --git a/content/media/2015/03/svg-edit-2.7/contextmenu/jquery.contextMenu.js b/content/media/2015/03/svg-edit-2.7/contextmenu/jquery.contextMenu.js new file mode 100755 index 0000000..7612601 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/contextmenu/jquery.contextMenu.js @@ -0,0 +1,203 @@ +// jQuery Context Menu Plugin +// +// Version 1.01 +// +// Cory S.N. LaViska +// A Beautiful Site (http://abeautifulsite.net/) +// Modified by Alexis Deveria +// +// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/ +// +// Terms of Use +// +// This plugin is dual-licensed under the GNU General Public License +// and the MIT License and is copyright A Beautiful Site, LLC. +// +if(jQuery)( function() { + var win = $(window); + var doc = $(document); + + $.extend($.fn, { + + contextMenu: function(o, callback) { + // Defaults + if( o.menu == undefined ) return false; + if( o.inSpeed == undefined ) o.inSpeed = 150; + if( o.outSpeed == undefined ) o.outSpeed = 75; + // 0 needs to be -1 for expected results (no fade) + if( o.inSpeed == 0 ) o.inSpeed = -1; + if( o.outSpeed == 0 ) o.outSpeed = -1; + // Loop each context menu + $(this).each( function() { + var el = $(this); + var offset = $(el).offset(); + + var menu = $('#' + o.menu); + + // Add contextMenu class + menu.addClass('contextMenu'); + // Simulate a true right click + $(this).bind( "mousedown", function(e) { + var evt = e; + $(this).mouseup( function(e) { + var srcElement = $(this); + srcElement.unbind('mouseup'); + if( evt.button === 2 || o.allowLeft || (evt.ctrlKey && svgedit.browser.isMac()) ) { + e.stopPropagation(); + // Hide context menus that may be showing + $(".contextMenu").hide(); + // Get this context menu + + if( el.hasClass('disabled') ) return false; + + // Detect mouse position + var d = {}, x = e.pageX, y = e.pageY; + + var x_off = win.width() - menu.width(), + y_off = win.height() - menu.height(); + + if(x > x_off - 15) x = x_off-15; + if(y > y_off - 30) y = y_off-30; // 30 is needed to prevent scrollbars in FF + + // Show the menu + doc.unbind('click'); + menu.css({ top: y, left: x }).fadeIn(o.inSpeed); + // Hover events + menu.find('A').mouseover( function() { + menu.find('LI.hover').removeClass('hover'); + $(this).parent().addClass('hover'); + }).mouseout( function() { + menu.find('LI.hover').removeClass('hover'); + }); + + // Keyboard + doc.keypress( function(e) { + switch( e.keyCode ) { + case 38: // up + if( !menu.find('LI.hover').length ) { + menu.find('LI:last').addClass('hover'); + } else { + menu.find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover'); + if( !menu.find('LI.hover').length ) menu.find('LI:last').addClass('hover'); + } + break; + case 40: // down + if( menu.find('LI.hover').length == 0 ) { + menu.find('LI:first').addClass('hover'); + } else { + menu.find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover'); + if( !menu.find('LI.hover').length ) menu.find('LI:first').addClass('hover'); + } + break; + case 13: // enter + menu.find('LI.hover A').trigger('click'); + break; + case 27: // esc + doc.trigger('click'); + break + } + }); + + // When items are selected + menu.find('A').unbind('mouseup'); + menu.find('LI:not(.disabled) A').mouseup( function() { + doc.unbind('click').unbind('keypress'); + $(".contextMenu").hide(); + // Callback + if( callback ) callback( $(this).attr('href').substr(1), $(srcElement), {x: x - offset.left, y: y - offset.top, docX: x, docY: y} ); + return false; + }); + + // Hide bindings + setTimeout( function() { // Delay for Mozilla + doc.click( function() { + doc.unbind('click').unbind('keypress'); + menu.fadeOut(o.outSpeed); + return false; + }); + }, 0); + } + }); + }); + + // Disable text selection + if( $.browser.mozilla ) { + $('#' + o.menu).each( function() { $(this).css({ 'MozUserSelect' : 'none' }); }); + } else if( $.browser.msie ) { + $('#' + o.menu).each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); }); + } else { + $('#' + o.menu).each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); }); + } + // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome) + $(el).add($('UL.contextMenu')).bind('contextmenu', function() { return false; }); + + }); + return $(this); + }, + + // Disable context menu items on the fly + disableContextMenuItems: function(o) { + if( o == undefined ) { + // Disable all + $(this).find('LI').addClass('disabled'); + return( $(this) ); + } + $(this).each( function() { + if( o != undefined ) { + var d = o.split(','); + for( var i = 0; i < d.length; i++ ) { + $(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled'); + + } + } + }); + return( $(this) ); + }, + + // Enable context menu items on the fly + enableContextMenuItems: function(o) { + if( o == undefined ) { + // Enable all + $(this).find('LI.disabled').removeClass('disabled'); + return( $(this) ); + } + $(this).each( function() { + if( o != undefined ) { + var d = o.split(','); + for( var i = 0; i < d.length; i++ ) { + $(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled'); + + } + } + }); + return( $(this) ); + }, + + // Disable context menu(s) + disableContextMenu: function() { + $(this).each( function() { + $(this).addClass('disabled'); + }); + return( $(this) ); + }, + + // Enable context menu(s) + enableContextMenu: function() { + $(this).each( function() { + $(this).removeClass('disabled'); + }); + return( $(this) ); + }, + + // Destroy context menu(s) + destroyContextMenu: function() { + // Destroy specified context menus + $(this).each( function() { + // Disable action + $(this).unbind('mousedown').unbind('mouseup'); + }); + return( $(this) ); + } + + }); +})(jQuery); \ No newline at end of file diff --git a/content/media/2015/03/svg-edit-2.7/coords.js b/content/media/2015/03/svg-edit-2.7/coords.js new file mode 100755 index 0000000..7105aee --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/coords.js @@ -0,0 +1,316 @@ +/*globals $, svgroot */ +/*jslint vars: true, eqeq: true, forin: true*/ +/** + * Coords. + * + * Licensed under the MIT License + * + */ + +// Dependencies: +// 1) jquery.js +// 2) math.js +// 3) browser.js +// 4) svgutils.js +// 5) units.js +// 6) svgtransformlist.js + +var svgedit = svgedit || {}; + +(function() {'use strict'; + +if (!svgedit.coords) { + svgedit.coords = {}; +} + +// this is how we map paths to our preferred relative segment types +var pathMap = [0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a', + 'H', 'h', 'V', 'v', 'S', 's', 'T', 't']; + +/** + * @typedef editorContext + * @type {?object} + * @property {function} getGridSnapping + * @property {function} getDrawing +*/ +var editorContext_ = null; + +/** +* @param {editorContext} editorContext +*/ +svgedit.coords.init = function(editorContext) { + editorContext_ = editorContext; +}; + +/** + * Applies coordinate changes to an element based on the given matrix + * @param {Element} selected - DOM element to be changed + * @param {object} changes - Object with changes to be remapped + * @param {SVGMatrix} m - Matrix object to use for remapping coordinates +*/ +svgedit.coords.remapElement = function(selected, changes, m) { + var i, type, + remap = function(x, y) { return svgedit.math.transformPoint(x, y, m); }, + scalew = function(w) { return m.a * w; }, + scaleh = function(h) { return m.d * h; }, + doSnapping = editorContext_.getGridSnapping() && selected.parentNode.parentNode.localName === 'svg', + finishUp = function() { + var o; + if (doSnapping) { + for (o in changes) { + changes[o] = svgedit.utilities.snapToGrid(changes[o]); + } + } + svgedit.utilities.assignAttributes(selected, changes, 1000, true); + }, + box = svgedit.utilities.getBBox(selected); + + for (i = 0; i < 2; i++) { + type = i === 0 ? 'fill' : 'stroke'; + var attrVal = selected.getAttribute(type); + if (attrVal && attrVal.indexOf('url(') === 0) { + if (m.a < 0 || m.d < 0) { + var grad = svgedit.utilities.getRefElem(attrVal); + var newgrad = grad.cloneNode(true); + if (m.a < 0) { + // flip x + var x1 = newgrad.getAttribute('x1'); + var x2 = newgrad.getAttribute('x2'); + newgrad.setAttribute('x1', -(x1 - 1)); + newgrad.setAttribute('x2', -(x2 - 1)); + } + + if (m.d < 0) { + // flip y + var y1 = newgrad.getAttribute('y1'); + var y2 = newgrad.getAttribute('y2'); + newgrad.setAttribute('y1', -(y1 - 1)); + newgrad.setAttribute('y2', -(y2 - 1)); + } + newgrad.id = editorContext_.getDrawing().getNextId(); + svgedit.utilities.findDefs().appendChild(newgrad); + selected.setAttribute(type, 'url(#' + newgrad.id + ')'); + } + + // Not really working :( +// if (selected.tagName === 'path') { +// reorientGrads(selected, m); +// } + } + } + + var elName = selected.tagName; + var chlist, mt; + if (elName === 'g' || elName === 'text' || elName == 'tspan' || elName === 'use') { + // if it was a translate, then just update x,y + if (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 && (m.e != 0 || m.f != 0) ) { + // [T][M] = [M][T'] + // therefore [T'] = [M_inv][T][M] + var existing = svgedit.math.transformListToTransform(selected).matrix, + t_new = svgedit.math.matrixMultiply(existing.inverse(), m, existing); + changes.x = parseFloat(changes.x) + t_new.e; + changes.y = parseFloat(changes.y) + t_new.f; + } else { + // we just absorb all matrices into the element and don't do any remapping + chlist = svgedit.transformlist.getTransformList(selected); + mt = svgroot.createSVGTransform(); + mt.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(chlist).matrix, m)); + chlist.clear(); + chlist.appendItem(mt); + } + } + var c, pt, pt1, pt2, len; + // now we have a set of changes and an applied reduced transform list + // we apply the changes directly to the DOM + switch (elName) { + case 'foreignObject': + case 'rect': + case 'image': + // Allow images to be inverted (give them matrix when flipped) + if (elName === 'image' && (m.a < 0 || m.d < 0)) { + // Convert to matrix + chlist = svgedit.transformlist.getTransformList(selected); + mt = svgroot.createSVGTransform(); + mt.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(chlist).matrix, m)); + chlist.clear(); + chlist.appendItem(mt); + } else { + pt1 = remap(changes.x, changes.y); + changes.width = scalew(changes.width); + changes.height = scaleh(changes.height); + changes.x = pt1.x + Math.min(0, changes.width); + changes.y = pt1.y + Math.min(0, changes.height); + changes.width = Math.abs(changes.width); + changes.height = Math.abs(changes.height); + } + finishUp(); + break; + case 'ellipse': + c = remap(changes.cx, changes.cy); + changes.cx = c.x; + changes.cy = c.y; + changes.rx = scalew(changes.rx); + changes.ry = scaleh(changes.ry); + changes.rx = Math.abs(changes.rx); + changes.ry = Math.abs(changes.ry); + finishUp(); + break; + case 'circle': + c = remap(changes.cx,changes.cy); + changes.cx = c.x; + changes.cy = c.y; + // take the minimum of the new selected box's dimensions for the new circle radius + var tbox = svgedit.math.transformBox(box.x, box.y, box.width, box.height, m); + var w = tbox.tr.x - tbox.tl.x, h = tbox.bl.y - tbox.tl.y; + changes.r = Math.min(w/2, h/2); + + if (changes.r) {changes.r = Math.abs(changes.r);} + finishUp(); + break; + case 'line': + pt1 = remap(changes.x1, changes.y1); + pt2 = remap(changes.x2, changes.y2); + changes.x1 = pt1.x; + changes.y1 = pt1.y; + changes.x2 = pt2.x; + changes.y2 = pt2.y; + // deliberately fall through here + case 'text': + case 'tspan': + case 'use': + finishUp(); + break; + case 'g': + var gsvg = $(selected).data('gsvg'); + if (gsvg) { + svgedit.utilities.assignAttributes(gsvg, changes, 1000, true); + } + break; + case 'polyline': + case 'polygon': + len = changes.points.length; + for (i = 0; i < len; ++i) { + pt = changes.points[i]; + pt = remap(pt.x, pt.y); + changes.points[i].x = pt.x; + changes.points[i].y = pt.y; + } + + len = changes.points.length; + var pstr = ''; + for (i = 0; i < len; ++i) { + pt = changes.points[i]; + pstr += pt.x + ',' + pt.y + ' '; + } + selected.setAttribute('points', pstr); + break; + case 'path': + var seg; + var segList = selected.pathSegList; + len = segList.numberOfItems; + changes.d = []; + for (i = 0; i < len; ++i) { + seg = segList.getItem(i); + changes.d[i] = { + type: seg.pathSegType, + x: seg.x, + y: seg.y, + x1: seg.x1, + y1: seg.y1, + x2: seg.x2, + y2: seg.y2, + r1: seg.r1, + r2: seg.r2, + angle: seg.angle, + largeArcFlag: seg.largeArcFlag, + sweepFlag: seg.sweepFlag + }; + } + + len = changes.d.length; + var firstseg = changes.d[0], + currentpt = remap(firstseg.x, firstseg.y); + changes.d[0].x = currentpt.x; + changes.d[0].y = currentpt.y; + for (i = 1; i < len; ++i) { + seg = changes.d[i]; + type = seg.type; + // if absolute or first segment, we want to remap x, y, x1, y1, x2, y2 + // if relative, we want to scalew, scaleh + if (type % 2 == 0) { // absolute + var thisx = (seg.x != undefined) ? seg.x : currentpt.x, // for V commands + thisy = (seg.y != undefined) ? seg.y : currentpt.y; // for H commands + pt = remap(thisx,thisy); + pt1 = remap(seg.x1, seg.y1); + pt2 = remap(seg.x2, seg.y2); + seg.x = pt.x; + seg.y = pt.y; + seg.x1 = pt1.x; + seg.y1 = pt1.y; + seg.x2 = pt2.x; + seg.y2 = pt2.y; + seg.r1 = scalew(seg.r1); + seg.r2 = scaleh(seg.r2); + } + else { // relative + seg.x = scalew(seg.x); + seg.y = scaleh(seg.y); + seg.x1 = scalew(seg.x1); + seg.y1 = scaleh(seg.y1); + seg.x2 = scalew(seg.x2); + seg.y2 = scaleh(seg.y2); + seg.r1 = scalew(seg.r1); + seg.r2 = scaleh(seg.r2); + } + } // for each segment + + var dstr = ''; + len = changes.d.length; + for (i = 0; i < len; ++i) { + seg = changes.d[i]; + type = seg.type; + dstr += pathMap[type]; + switch (type) { + case 13: // relative horizontal line (h) + case 12: // absolute horizontal line (H) + dstr += seg.x + ' '; + break; + case 15: // relative vertical line (v) + case 14: // absolute vertical line (V) + dstr += seg.y + ' '; + break; + case 3: // relative move (m) + case 5: // relative line (l) + case 19: // relative smooth quad (t) + case 2: // absolute move (M) + case 4: // absolute line (L) + case 18: // absolute smooth quad (T) + dstr += seg.x + ',' + seg.y + ' '; + break; + case 7: // relative cubic (c) + case 6: // absolute cubic (C) + dstr += seg.x1 + ',' + seg.y1 + ' ' + seg.x2 + ',' + seg.y2 + ' ' + + seg.x + ',' + seg.y + ' '; + break; + case 9: // relative quad (q) + case 8: // absolute quad (Q) + dstr += seg.x1 + ',' + seg.y1 + ' ' + seg.x + ',' + seg.y + ' '; + break; + case 11: // relative elliptical arc (a) + case 10: // absolute elliptical arc (A) + dstr += seg.r1 + ',' + seg.r2 + ' ' + seg.angle + ' ' + (+seg.largeArcFlag) + + ' ' + (+seg.sweepFlag) + ' ' + seg.x + ',' + seg.y + ' '; + break; + case 17: // relative smooth cubic (s) + case 16: // absolute smooth cubic (S) + dstr += seg.x2 + ',' + seg.y2 + ' ' + seg.x + ',' + seg.y + ' '; + break; + } + } + + selected.setAttribute('d', dstr); + break; + } +}; + +}()); diff --git a/content/media/2015/03/svg-edit-2.7/draw.js b/content/media/2015/03/svg-edit-2.7/draw.js new file mode 100755 index 0000000..f79b803 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/draw.js @@ -0,0 +1,537 @@ +/*globals $, svgedit*/ +/*jslint vars: true, eqeq: true, todo: true*/ +/** + * Package: svgedit.draw + * + * Licensed under the MIT License + * + * Copyright(c) 2011 Jeff Schiller + */ + +// Dependencies: +// 1) jQuery +// 2) browser.js +// 3) svgutils.js + +(function() {'use strict'; + +if (!svgedit.draw) { + svgedit.draw = {}; +} +// alias +var NS = svgedit.NS; + +var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use'.split(','); + +var RandomizeModes = { + LET_DOCUMENT_DECIDE: 0, + ALWAYS_RANDOMIZE: 1, + NEVER_RANDOMIZE: 2 +}; +var randomize_ids = RandomizeModes.LET_DOCUMENT_DECIDE; + +/** + * This class encapsulates the concept of a layer in the drawing + * @param {String} name - Layer name + * @param {SVGGElement} child - Layer SVG group. + */ +svgedit.draw.Layer = function(name, group) { + this.name_ = name; + this.group_ = group; +}; + +/** + * @returns {string} The layer name + */ +svgedit.draw.Layer.prototype.getName = function() { + return this.name_; +}; + +/** + * @returns {SVGGElement} The layer SVG group + */ +svgedit.draw.Layer.prototype.getGroup = function() { + return this.group_; +}; + + +/** + * Called to ensure that drawings will or will not have randomized ids. + * The currentDrawing will have its nonce set if it doesn't already. + * @param {boolean} enableRandomization - flag indicating if documents should have randomized ids + * @param {svgedit.draw.Drawing} currentDrawing + */ +svgedit.draw.randomizeIds = function(enableRandomization, currentDrawing) { + randomize_ids = enableRandomization === false ? + RandomizeModes.NEVER_RANDOMIZE : + RandomizeModes.ALWAYS_RANDOMIZE; + + if (randomize_ids == RandomizeModes.ALWAYS_RANDOMIZE && !currentDrawing.getNonce()) { + currentDrawing.setNonce(Math.floor(Math.random() * 100001)); + } else if (randomize_ids == RandomizeModes.NEVER_RANDOMIZE && currentDrawing.getNonce()) { + currentDrawing.clearNonce(); + } +}; + +/** + * This class encapsulates the concept of a SVG-edit drawing + * @param {SVGSVGElement} svgElem - The SVG DOM Element that this JS object + * encapsulates. If the svgElem has a se:nonce attribute on it, then + * IDs will use the nonce as they are generated. + * @param {String=svg_} [opt_idPrefix] - The ID prefix to use. + */ +svgedit.draw.Drawing = function(svgElem, opt_idPrefix) { + if (!svgElem || !svgElem.tagName || !svgElem.namespaceURI || + svgElem.tagName != 'svg' || svgElem.namespaceURI != NS.SVG) { + throw "Error: svgedit.draw.Drawing instance initialized without a element"; + } + + /** + * The SVG DOM Element that represents this drawing. + * @type {SVGSVGElement} + */ + this.svgElem_ = svgElem; + + /** + * The latest object number used in this drawing. + * @type {number} + */ + this.obj_num = 0; + + /** + * The prefix to prepend to each element id in the drawing. + * @type {String} + */ + this.idPrefix = opt_idPrefix || "svg_"; + + /** + * An array of released element ids to immediately reuse. + * @type {Array.} + */ + this.releasedNums = []; + + /** + * The z-ordered array of tuples containing layer names and elements. + * The first layer is the one at the bottom of the rendering. + * TODO: Turn this into an Array. + * @type {Array.>} + */ + this.all_layers = []; + + /** + * The current layer being used. + * TODO: Make this a {Layer}. + * @type {SVGGElement} + */ + this.current_layer = null; + + /** + * The nonce to use to uniquely identify elements across drawings. + * @type {!String} + */ + this.nonce_ = ''; + var n = this.svgElem_.getAttributeNS(NS.SE, 'nonce'); + // If already set in the DOM, use the nonce throughout the document + // else, if randomizeIds(true) has been called, create and set the nonce. + if (!!n && randomize_ids != RandomizeModes.NEVER_RANDOMIZE) { + this.nonce_ = n; + } else if (randomize_ids == RandomizeModes.ALWAYS_RANDOMIZE) { + this.setNonce(Math.floor(Math.random() * 100001)); + } +}; + +/** + * @param {string} id Element ID to retrieve + * @returns {Element} SVG element within the root SVGSVGElement +*/ +svgedit.draw.Drawing.prototype.getElem_ = function (id) { + if (this.svgElem_.querySelector) { + // querySelector lookup + return this.svgElem_.querySelector('#' + id); + } + // jQuery lookup: twice as slow as xpath in FF + return $(this.svgElem_).find('[id=' + id + ']')[0]; +}; + +/** + * @returns {SVGSVGElement} + */ +svgedit.draw.Drawing.prototype.getSvgElem = function () { + return this.svgElem_; +}; + +/** + * @returns {!string|number} The previously set nonce + */ +svgedit.draw.Drawing.prototype.getNonce = function() { + return this.nonce_; +}; + +/** + * @param {!string|number} n The nonce to set + */ +svgedit.draw.Drawing.prototype.setNonce = function(n) { + this.svgElem_.setAttributeNS(NS.XMLNS, 'xmlns:se', NS.SE); + this.svgElem_.setAttributeNS(NS.SE, 'se:nonce', n); + this.nonce_ = n; +}; + +/** + * Clears any previously set nonce + */ +svgedit.draw.Drawing.prototype.clearNonce = function () { + // We deliberately leave any se:nonce attributes alone, + // we just don't use it to randomize ids. + this.nonce_ = ''; +}; + +/** + * Returns the latest object id as a string. + * @return {String} The latest object Id. + */ +svgedit.draw.Drawing.prototype.getId = function () { + return this.nonce_ ? + this.idPrefix + this.nonce_ + '_' + this.obj_num : + this.idPrefix + this.obj_num; +}; + +/** + * Returns the next object Id as a string. + * @return {String} The next object Id to use. + */ +svgedit.draw.Drawing.prototype.getNextId = function () { + var oldObjNum = this.obj_num; + var restoreOldObjNum = false; + + // If there are any released numbers in the release stack, + // use the last one instead of the next obj_num. + // We need to temporarily use obj_num as that is what getId() depends on. + if (this.releasedNums.length > 0) { + this.obj_num = this.releasedNums.pop(); + restoreOldObjNum = true; + } else { + // If we are not using a released id, then increment the obj_num. + this.obj_num++; + } + + // Ensure the ID does not exist. + var id = this.getId(); + while (this.getElem_(id)) { + if (restoreOldObjNum) { + this.obj_num = oldObjNum; + restoreOldObjNum = false; + } + this.obj_num++; + id = this.getId(); + } + // Restore the old object number if required. + if (restoreOldObjNum) { + this.obj_num = oldObjNum; + } + return id; +}; + +/** + * Releases the object Id, letting it be used as the next id in getNextId(). + * This method DOES NOT remove any elements from the DOM, it is expected + * that client code will do this. + * @param {string} id - The id to release. + * @returns {boolean} True if the id was valid to be released, false otherwise. +*/ +svgedit.draw.Drawing.prototype.releaseId = function (id) { + // confirm if this is a valid id for this Document, else return false + var front = this.idPrefix + (this.nonce_ ? this.nonce_ + '_' : ''); + if (typeof id !== 'string' || id.indexOf(front) !== 0) { + return false; + } + // extract the obj_num of this id + var num = parseInt(id.substr(front.length), 10); + + // if we didn't get a positive number or we already released this number + // then return false. + if (typeof num !== 'number' || num <= 0 || this.releasedNums.indexOf(num) != -1) { + return false; + } + + // push the released number into the released queue + this.releasedNums.push(num); + + return true; +}; + +/** + * Returns the number of layers in the current drawing. + * @returns {integer} The number of layers in the current drawing. +*/ +svgedit.draw.Drawing.prototype.getNumLayers = function() { + return this.all_layers.length; +}; + +/** + * Check if layer with given name already exists + * @param {string} name - The layer name to check +*/ +svgedit.draw.Drawing.prototype.hasLayer = function (name) { + var i; + for (i = 0; i < this.getNumLayers(); i++) { + if(this.all_layers[i][0] == name) {return true;} + } + return false; +}; + + +/** + * Returns the name of the ith layer. If the index is out of range, an empty string is returned. + * @param {integer} i - The zero-based index of the layer you are querying. + * @returns {string} The name of the ith layer (or the empty string if none found) +*/ +svgedit.draw.Drawing.prototype.getLayerName = function (i) { + if (i >= 0 && i < this.getNumLayers()) { + return this.all_layers[i][0]; + } + return ''; +}; + +/** + * @returns {SVGGElement} The SVGGElement representing the current layer. + */ +svgedit.draw.Drawing.prototype.getCurrentLayer = function() { + return this.current_layer; +}; + +/** + * Returns the name of the currently selected layer. If an error occurs, an empty string + * is returned. + * @returns The name of the currently active layer (or the empty string if none found). +*/ +svgedit.draw.Drawing.prototype.getCurrentLayerName = function () { + var i; + for (i = 0; i < this.getNumLayers(); ++i) { + if (this.all_layers[i][1] == this.current_layer) { + return this.getLayerName(i); + } + } + return ''; +}; + +/** + * Sets the current layer. If the name is not a valid layer name, then this + * function returns false. Otherwise it returns true. This is not an + * undo-able action. + * @param {string} name - The name of the layer you want to switch to. + * @returns {boolean} true if the current layer was switched, otherwise false + */ +svgedit.draw.Drawing.prototype.setCurrentLayer = function(name) { + var i; + for (i = 0; i < this.getNumLayers(); ++i) { + if (name == this.getLayerName(i)) { + if (this.current_layer != this.all_layers[i][1]) { + this.current_layer.setAttribute("style", "pointer-events:none"); + this.current_layer = this.all_layers[i][1]; + this.current_layer.setAttribute("style", "pointer-events:all"); + } + return true; + } + } + return false; +}; + + +/** + * Deletes the current layer from the drawing and then clears the selection. + * This function then calls the 'changed' handler. This is an undoable action. + * @returns {SVGGElement} The SVGGElement of the layer removed or null. + */ +svgedit.draw.Drawing.prototype.deleteCurrentLayer = function() { + if (this.current_layer && this.getNumLayers() > 1) { + // actually delete from the DOM and return it + var parent = this.current_layer.parentNode; + var nextSibling = this.current_layer.nextSibling; + var oldLayerGroup = parent.removeChild(this.current_layer); + this.identifyLayers(); + return oldLayerGroup; + } + return null; +}; + +/** + * Updates layer system and sets the current layer to the + * top-most layer (last child of this drawing). +*/ +svgedit.draw.Drawing.prototype.identifyLayers = function() { + this.all_layers = []; + var numchildren = this.svgElem_.childNodes.length; + // loop through all children of SVG element + var orphans = [], layernames = []; + var a_layer = null; + var childgroups = false; + var i; + for (i = 0; i < numchildren; ++i) { + var child = this.svgElem_.childNodes.item(i); + // for each g, find its layer name + if (child && child.nodeType == 1) { + if (child.tagName == "g") { + childgroups = true; + var name = $("title", child).text(); + + // Hack for Opera 10.60 + if(!name && svgedit.browser.isOpera() && child.querySelectorAll) { + name = $(child.querySelectorAll('title')).text(); + } + + // store layer and name in global variable + if (name) { + layernames.push(name); + this.all_layers.push( [name, child] ); + a_layer = child; + svgedit.utilities.walkTree(child, function(e){e.setAttribute("style", "pointer-events:inherit");}); + a_layer.setAttribute("style", "pointer-events:none"); + } + // if group did not have a name, it is an orphan + else { + orphans.push(child); + } + } + // if child has is "visible" (i.e. not a or element), then it is an orphan + else if(~visElems.indexOf(child.nodeName)) { + var bb = svgedit.utilities.getBBox(child); + orphans.push(child); + } + } + } + + // create a new layer and add all the orphans to it + var svgdoc = this.svgElem_.ownerDocument; + if (orphans.length > 0 || !childgroups) { + i = 1; + // TODO(codedread): What about internationalization of "Layer"? + while (layernames.indexOf(("Layer " + i)) >= 0) { i++; } + var newname = "Layer " + i; + a_layer = svgdoc.createElementNS(NS.SVG, "g"); + var layer_title = svgdoc.createElementNS(NS.SVG, "title"); + layer_title.textContent = newname; + a_layer.appendChild(layer_title); + var j; + for (j = 0; j < orphans.length; ++j) { + a_layer.appendChild(orphans[j]); + } + this.svgElem_.appendChild(a_layer); + this.all_layers.push( [newname, a_layer] ); + } + svgedit.utilities.walkTree(a_layer, function(e){e.setAttribute("style", "pointer-events:inherit");}); + this.current_layer = a_layer; + this.current_layer.setAttribute("style", "pointer-events:all"); +}; + +/** + * Creates a new top-level layer in the drawing with the given name and + * sets the current layer to it. + * @param {string} name - The given name + * @returns {SVGGElement} The SVGGElement of the new layer, which is + * also the current layer of this drawing. +*/ +svgedit.draw.Drawing.prototype.createLayer = function(name) { + var svgdoc = this.svgElem_.ownerDocument; + var new_layer = svgdoc.createElementNS(NS.SVG, "g"); + var layer_title = svgdoc.createElementNS(NS.SVG, "title"); + layer_title.textContent = name; + new_layer.appendChild(layer_title); + this.svgElem_.appendChild(new_layer); + this.identifyLayers(); + return new_layer; +}; + +/** + * Returns whether the layer is visible. If the layer name is not valid, + * then this function returns false. + * @param {string} layername - The name of the layer which you want to query. + * @returns {boolean} The visibility state of the layer, or false if the layer name was invalid. +*/ +svgedit.draw.Drawing.prototype.getLayerVisibility = function(layername) { + // find the layer + var layer = null; + var i; + for (i = 0; i < this.getNumLayers(); ++i) { + if (this.getLayerName(i) == layername) { + layer = this.all_layers[i][1]; + break; + } + } + if (!layer) {return false;} + return (layer.getAttribute('display') !== 'none'); +}; + +/** + * Sets the visibility of the layer. If the layer name is not valid, this + * function returns false, otherwise it returns true. This is an + * undo-able action. + * @param {string} layername - The name of the layer to change the visibility + * @param {boolean} bVisible - Whether the layer should be visible + * @returns {?SVGGElement} The SVGGElement representing the layer if the + * layername was valid, otherwise null. +*/ +svgedit.draw.Drawing.prototype.setLayerVisibility = function(layername, bVisible) { + if (typeof bVisible !== 'boolean') { + return null; + } + // find the layer + var layer = null; + var i; + for (i = 0; i < this.getNumLayers(); ++i) { + if (this.getLayerName(i) == layername) { + layer = this.all_layers[i][1]; + break; + } + } + if (!layer) {return null;} + + var oldDisplay = layer.getAttribute("display"); + if (!oldDisplay) {oldDisplay = "inline";} + layer.setAttribute("display", bVisible ? "inline" : "none"); + return layer; +}; + + +/** + * Returns the opacity of the given layer. If the input name is not a layer, null is returned. + * @param {string} layername - name of the layer on which to get the opacity + * @returns {?number} The opacity value of the given layer. This will be a value between 0.0 and 1.0, or null + * if layername is not a valid layer +*/ +svgedit.draw.Drawing.prototype.getLayerOpacity = function(layername) { + var i; + for (i = 0; i < this.getNumLayers(); ++i) { + if (this.getLayerName(i) == layername) { + var g = this.all_layers[i][1]; + var opacity = g.getAttribute('opacity'); + if (!opacity) { + opacity = '1.0'; + } + return parseFloat(opacity); + } + } + return null; +}; + +/** + * Sets the opacity of the given layer. If the input name is not a layer, + * nothing happens. If opacity is not a value between 0.0 and 1.0, then + * nothing happens. + * @param {string} layername - Name of the layer on which to set the opacity + * @param {number} opacity - A float value in the range 0.0-1.0 +*/ +svgedit.draw.Drawing.prototype.setLayerOpacity = function(layername, opacity) { + if (typeof opacity !== 'number' || opacity < 0.0 || opacity > 1.0) { + return; + } + var i; + for (i = 0; i < this.getNumLayers(); ++i) { + if (this.getLayerName(i) == layername) { + var g = this.all_layers[i][1]; + g.setAttribute("opacity", opacity); + break; + } + } +}; + +}()); diff --git a/content/media/2015/03/svg-edit-2.7/embedapi.html b/content/media/2015/03/svg-edit-2.7/embedapi.html new file mode 100755 index 0000000..cea5cfc --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/embedapi.html @@ -0,0 +1,59 @@ + + + + + Embed API + + + + + + + +
    + + diff --git a/content/media/2015/03/svg-edit-2.7/embedapi.js b/content/media/2015/03/svg-edit-2.7/embedapi.js new file mode 100755 index 0000000..7024789 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/embedapi.js @@ -0,0 +1,187 @@ +/* +Embedded SVG-edit API + +General usage: +- Have an iframe somewhere pointing to a version of svg-edit > r1000 +- Initialize the magic with: +var svgCanvas = new EmbeddedSVGEdit(window.frames.svgedit); +- Pass functions in this format: +svgCanvas.setSvgString('string') +- Or if a callback is needed: +svgCanvas.setSvgString('string')(function(data, error){ + if (error){ + // There was an error + } else{ + // Handle data + } +}) + +Everything is done with the same API as the real svg-edit, +and all documentation is unchanged. + +However, this file depends on the postMessage API which +can only support JSON-serializable arguments and +return values, so, for example, arguments whose value is +'undefined', a function, a non-finite number, or a built-in +object like Date(), RegExp(), etc. will most likely not behave +as expected. In such a case one may need to host +the SVG editor on the same domain and reference the +JavaScript methods on the frame itself. + +The only other difference is +when handling returns: the callback notation is used instead. + +var blah = new EmbeddedSVGEdit(window.frames.svgedit); +blah.clearSelection('woot', 'blah', 1337, [1, 2, 3, 4, 5, 'moo'], -42, {a: 'tree',b:6, c: 9})(function(){console.log('GET DATA',arguments)}) +*/ + +(function () {'use strict'; + +var cbid = 0; + +function getCallbackSetter (d) { + return function () { + var t = this, // New callback + args = [].slice.call(arguments), + cbid = t.send(d, args, function(){}); // The callback (currently it's nothing, but will be set later) + + return function(newcallback){ + t.callbacks[cbid] = newcallback; // Set callback + }; + }; +} + +/* +* Having this separate from messageListener allows us to +* avoid using JSON parsing (and its limitations) in the case +* of same domain control +*/ +function addCallback (t, data) { + var result = data.result || data.error; + cbid = data.id; + if (t.callbacks[cbid]) { + if (data.result) { + t.callbacks[cbid](result); + } else { + t.callbacks[cbid](result, 'error'); + } + } +} + +function messageListener (e) { + // We accept and post strings as opposed to objects for the sake of IE9 support; this + // will most likely be changed in the future + if (typeof e.data !== 'string') { + return; + } + var allowedOrigins = this.allowedOrigins, + data = e.data && JSON.parse(e.data); + if (!data || typeof data !== 'object' || data.namespace !== 'svg-edit' || + e.source !== this.frame.contentWindow || + (allowedOrigins.indexOf('*') === -1 && allowedOrigins.indexOf(e.origin) === -1) + ) { + return; + } + addCallback(this, data); +} + +function getMessageListener (t) { + return function (e) { + messageListener.call(t, e); + }; +} + +/** +* @param {HTMLIFrameElement} frame +* @param {array} [allowedOrigins=[]] Array of origins from which incoming +* messages will be allowed when same origin is not used; defaults to none. +* If supplied, it should probably be the same as svgEditor's allowedOrigins +*/ +function EmbeddedSVGEdit (frame, allowedOrigins) { + if (!(this instanceof EmbeddedSVGEdit)) { // Allow invocation without 'new' keyword + return new EmbeddedSVGEdit(frame); + } + this.allowedOrigins = allowedOrigins || []; + // Initialize communication + this.frame = frame; + this.callbacks = {}; + // List of functions extracted with this: + // Run in firebug on http://svg-edit.googlecode.com/svn/trunk/docs/files/svgcanvas-js.html + + // for (var i=0,q=[],f = document.querySelectorAll('div.CFunction h3.CTitle a'); i < f.length; i++) { q.push(f[i].name); }; q + // var functions = ['clearSelection', 'addToSelection', 'removeFromSelection', 'open', 'save', 'getSvgString', 'setSvgString', + // 'createLayer', 'deleteCurrentLayer', 'setCurrentLayer', 'renameCurrentLayer', 'setCurrentLayerPosition', 'setLayerVisibility', + // 'moveSelectedToLayer', 'clear']; + + // Newer, well, it extracts things that aren't documented as well. All functions accessible through the normal thingy can now be accessed though the API + // var l = []; for (var i in svgCanvas){ if (typeof svgCanvas[i] == 'function') { l.push(i);} }; + // Run in svgedit itself + var i, + functions = ['updateElementFromJson', 'embedImage', 'fixOperaXML', 'clearSelection', + 'addToSelection', + 'removeFromSelection', 'addNodeToSelection', 'open', 'save', 'getSvgString', 'setSvgString', 'createLayer', + 'deleteCurrentLayer', 'getCurrentDrawing', 'setCurrentLayer', 'renameCurrentLayer', 'setCurrentLayerPosition', + 'setLayerVisibility', 'moveSelectedToLayer', 'clear', 'clearPath', 'getNodePoint', 'clonePathNode', 'deletePathNode', + 'getResolution', 'getImageTitle', 'setImageTitle', 'setResolution', 'setBBoxZoom', 'setZoom', 'getMode', 'setMode', + 'getStrokeColor', 'setStrokeColor', 'getFillColor', 'setFillColor', 'setStrokePaint', 'setFillPaint', 'getStrokeWidth', + 'setStrokeWidth', 'getStrokeStyle', 'setStrokeStyle', 'getOpacity', 'setOpacity', 'getFillOpacity', 'setFillOpacity', + 'getStrokeOpacity', 'setStrokeOpacity', 'getTransformList', 'getBBox', 'getRotationAngle', 'setRotationAngle', 'each', + 'bind', 'setIdPrefix', 'getBold', 'setBold', 'getItalic', 'setItalic', 'getFontFamily', 'setFontFamily', 'getFontSize', + 'setFontSize', 'getText', 'setTextContent', 'setImageURL', 'setRectRadius', 'setSegType', 'quickClone', + 'changeSelectedAttributeNoUndo', 'changeSelectedAttribute', 'deleteSelectedElements', 'groupSelectedElements', 'zoomChanged', + 'ungroupSelectedElement', 'moveToTopSelectedElement', 'moveToBottomSelectedElement', 'moveSelectedElements', + 'getStrokedBBox', 'getVisibleElements', 'cycleElement', 'getUndoStackSize', 'getRedoStackSize', 'getNextUndoCommandText', + 'getNextRedoCommandText', 'undo', 'redo', 'cloneSelectedElements', 'alignSelectedElements', 'getZoom', 'getVersion', + 'setIconSize', 'setLang', 'setCustomHandlers']; + + // TODO: rewrite the following, it's pretty scary. + for (i = 0; i < functions.length; i++) { + this[functions[i]] = getCallbackSetter(functions[i]); + } + + // Older IE may need a polyfill for addEventListener, but so it would for SVG + window.addEventListener('message', getMessageListener(this), false); +} + +EmbeddedSVGEdit.prototype.send = function (name, args, callback){ + var t = this; + cbid++; + + this.callbacks[cbid] = callback; + setTimeout(function () { // Delay for the callback to be set in case its synchronous + /* + * Todo: Handle non-JSON arguments and return values (undefined, + * nonfinite numbers, functions, and built-in objects like Date, + * RegExp), etc.? Allow promises instead of callbacks? Review + * SVG-Edit functions for whether JSON-able parameters can be + * made compatile with all API functionality + */ + // We accept and post strings for the sake of IE9 support + if (window.location.origin === t.frame.contentWindow.location.origin) { + // Although we do not really need this API if we are working same + // domain, it could allow us to write in a way that would work + // cross-domain as well, assuming we stick to the argument limitations + // of the current JSON-based communication API (e.g., not passing + // callbacks). We might be able to address these shortcomings; see + // the todo elsewhere in this file. + var message = {id: cbid}, + svgCanvas = t.frame.contentWindow.svgCanvas; + try { + message.result = svgCanvas[name].apply(svgCanvas, args); + } + catch (err) { + message.error = err.message; + } + addCallback(t, message); + } + else { // Requires the ext-xdomain-messaging.js extension + t.frame.contentWindow.postMessage(JSON.stringify({namespace: 'svgCanvas', id: cbid, name: name, args: args}), '*'); + } + }, 0); + return cbid; +}; + +window.embedded_svg_edit = EmbeddedSVGEdit; // Export old, deprecated API +window.EmbeddedSVGEdit = EmbeddedSVGEdit; // Follows common JS convention of CamelCase and, as enforced in JSLint, of initial caps for constructors + +}()); diff --git a/content/media/2015/03/svg-edit-2.7/extensions/allowedMimeTypes.php b/content/media/2015/03/svg-edit-2.7/extensions/allowedMimeTypes.php new file mode 100755 index 0000000..1e932b8 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/extensions/allowedMimeTypes.php @@ -0,0 +1,11 @@ + 'image/svg+xml;charset=utf-8', + 'png' => 'image/png', + 'jpeg' => 'image/jpeg', + 'bmp' => 'image/bmp', + 'webp' => 'image/webp' +); + +?> \ No newline at end of file diff --git a/content/media/2015/03/svg-edit-2.7/extensions/closepath_icons.svg b/content/media/2015/03/svg-edit-2.7/extensions/closepath_icons.svg new file mode 100755 index 0000000..7294f5e --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/extensions/closepath_icons.svg @@ -0,0 +1,41 @@ + + + + + Layer 1 + + + + + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/content/media/2015/03/svg-edit-2.7/extensions/executablebuilder-icocreator.svg b/content/media/2015/03/svg-edit-2.7/extensions/executablebuilder-icocreator.svg new file mode 100755 index 0000000..7c68adf --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/extensions/executablebuilder-icocreator.svg @@ -0,0 +1,9 @@ + + + + Layer 1 + + ICO + + + \ No newline at end of file diff --git a/content/media/2015/03/svg-edit-2.7/extensions/ext-arrows.js b/content/media/2015/03/svg-edit-2.7/extensions/ext-arrows.js new file mode 100755 index 0000000..6bf9b3f --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/extensions/ext-arrows.js @@ -0,0 +1,293 @@ +/*globals svgEditor, svgCanvas, $*/ +/*jslint vars: true, eqeq: true*/ +/* + * ext-arrows.js + * + * Licensed under the MIT License + * + * Copyright(c) 2010 Alexis Deveria + * + */ + +svgEditor.addExtension('Arrows', function(S) { + var svgcontent = S.svgcontent, + addElem = S.addSvgElementFromJson, + nonce = S.nonce, + randomize_ids = S.randomize_ids, + selElems, pathdata, + lang_list = { + 'en':[ + {'id': 'arrow_none', 'textContent': 'No arrow' } + ], + 'fr':[ + {'id': 'arrow_none', 'textContent': 'Sans flèche' } + ] + }, + arrowprefix, + prefix = 'se_arrow_'; + + function setArrowNonce(window, n) { + randomize_ids = true; + arrowprefix = prefix + n + '_'; + pathdata.fw.id = arrowprefix + 'fw'; + pathdata.bk.id = arrowprefix + 'bk'; + } + + function unsetArrowNonce(window) { + randomize_ids = false; + arrowprefix = prefix; + pathdata.fw.id = arrowprefix + 'fw'; + pathdata.bk.id = arrowprefix + 'bk'; + } + + + svgCanvas.bind('setnonce', setArrowNonce); + svgCanvas.bind('unsetnonce', unsetArrowNonce); + + if (randomize_ids) { + arrowprefix = prefix + nonce + '_'; + } else { + arrowprefix = prefix; + } + + pathdata = { + fw: {d: 'm0,0l10,5l-10,5l5,-5l-5,-5z', refx: 8, id: arrowprefix + 'fw'}, + bk: {d: 'm10,0l-10,5l10,5l-5,-5l5,-5z', refx: 2, id: arrowprefix + 'bk'} + }; + + function getLinked(elem, attr) { + var str = elem.getAttribute(attr); + if(!str) {return null;} + var m = str.match(/\(\#(.*)\)/); + if(!m || m.length !== 2) { + return null; + } + return S.getElem(m[1]); + } + + function showPanel(on) { + $('#arrow_panel').toggle(on); + if(on) { + var el = selElems[0]; + var end = el.getAttribute('marker-end'); + var start = el.getAttribute('marker-start'); + var mid = el.getAttribute('marker-mid'); + var val; + + if (end && start) { + val = 'both'; + } else if (end) { + val = 'end'; + } else if (start) { + val = 'start'; + } else if (mid) { + val = 'mid'; + if (mid.indexOf('bk') !== -1) { + val = 'mid_bk'; + } + } + + if (!start && !mid && !end) { + val = 'none'; + } + + $('#arrow_list').val(val); + } + } + + function resetMarker() { + var el = selElems[0]; + el.removeAttribute('marker-start'); + el.removeAttribute('marker-mid'); + el.removeAttribute('marker-end'); + } + + function addMarker(dir, type, id) { + // TODO: Make marker (or use?) per arrow type, since refX can be different + id = id || arrowprefix + dir; + + var marker = S.getElem(id); + var data = pathdata[dir]; + + if (type == 'mid') { + data.refx = 5; + } + + if (!marker) { + marker = addElem({ + 'element': 'marker', + 'attr': { + 'viewBox': '0 0 10 10', + 'id': id, + 'refY': 5, + 'markerUnits': 'strokeWidth', + 'markerWidth': 5, + 'markerHeight': 5, + 'orient': 'auto', + 'style': 'pointer-events:none' // Currently needed for Opera + } + }); + var arrow = addElem({ + 'element': 'path', + 'attr': { + 'd': data.d, + 'fill': '#000000' + } + }); + marker.appendChild(arrow); + S.findDefs().appendChild(marker); + } + + marker.setAttribute('refX', data.refx); + + return marker; + } + + function setArrow() { + var type = this.value; + resetMarker(); + + if (type == 'none') { + return; + } + + // Set marker on element + var dir = 'fw'; + if (type == 'mid_bk') { + type = 'mid'; + dir = 'bk'; + } else if (type == 'both') { + addMarker('bk', type); + svgCanvas.changeSelectedAttribute('marker-start', 'url(#' + pathdata.bk.id + ')'); + type = 'end'; + dir = 'fw'; + } else if (type == 'start') { + dir = 'bk'; + } + + addMarker(dir, type); + svgCanvas.changeSelectedAttribute('marker-' + type, 'url(#' + pathdata[dir].id + ')'); + S.call('changed', selElems); + } + + function colorChanged(elem) { + var color = elem.getAttribute('stroke'); + var mtypes = ['start', 'mid', 'end']; + var defs = S.findDefs(); + + $.each(mtypes, function(i, type) { + var marker = getLinked(elem, 'marker-'+type); + if(!marker) {return;} + + var cur_color = $(marker).children().attr('fill'); + var cur_d = $(marker).children().attr('d'); + var new_marker = null; + if(cur_color === color) {return;} + + var all_markers = $(defs).find('marker'); + // Different color, check if already made + all_markers.each(function() { + var attrs = $(this).children().attr(['fill', 'd']); + if(attrs.fill === color && attrs.d === cur_d) { + // Found another marker with this color and this path + new_marker = this; + } + }); + + if(!new_marker) { + // Create a new marker with this color + var last_id = marker.id; + var dir = last_id.indexOf('_fw') !== -1?'fw':'bk'; + + new_marker = addMarker(dir, type, arrowprefix + dir + all_markers.length); + + $(new_marker).children().attr('fill', color); + } + + $(elem).attr('marker-'+type, 'url(#' + new_marker.id + ')'); + + // Check if last marker can be removed + var remove = true; + $(S.svgcontent).find('line, polyline, path, polygon').each(function() { + var elem = this; + $.each(mtypes, function(j, mtype) { + if($(elem).attr('marker-' + mtype) === 'url(#' + marker.id + ')') { + remove = false; + return remove; + } + }); + if(!remove) {return false;} + }); + + // Not found, so can safely remove + if(remove) { + $(marker).remove(); + } + }); + } + + return { + name: 'Arrows', + context_tools: [{ + type: 'select', + panel: 'arrow_panel', + title: 'Select arrow type', + id: 'arrow_list', + options: { + none: 'No arrow', + end: '---->', + start: '<----', + both: '<--->', + mid: '-->--', + mid_bk: '--<--' + }, + defval: 'none', + events: { + change: setArrow + } + }], + callback: function() { + $('#arrow_panel').hide(); + // Set ID so it can be translated in locale file + $('#arrow_list option')[0].id = 'connector_no_arrow'; + }, + addLangData: function(lang) { + return { + data: lang_list[lang] + }; + }, + selectedChanged: function(opts) { + // Use this to update the current selected elements + selElems = opts.elems; + + var i = selElems.length; + var marker_elems = ['line', 'path', 'polyline', 'polygon']; + while(i--) { + var elem = selElems[i]; + if(elem && $.inArray(elem.tagName, marker_elems) !== -1) { + if(opts.selectedElement && !opts.multiselected) { + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + }, + elementChanged: function(opts) { + var elem = opts.elems[0]; + if(elem && ( + elem.getAttribute('marker-start') || + elem.getAttribute('marker-mid') || + elem.getAttribute('marker-end') + )) { +// var start = elem.getAttribute('marker-start'); +// var mid = elem.getAttribute('marker-mid'); +// var end = elem.getAttribute('marker-end'); + // Has marker, so see if it should match color + colorChanged(elem); + } + } + }; +}); diff --git a/content/media/2015/03/svg-edit-2.7/extensions/ext-closepath.js b/content/media/2015/03/svg-edit-2.7/extensions/ext-closepath.js new file mode 100755 index 0000000..b785842 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/extensions/ext-closepath.js @@ -0,0 +1,91 @@ +/*globals svgEditor, $*/ +/*jslint vars: true, eqeq: true*/ +/* + * ext-closepath.js + * + * Licensed under the MIT License + * + * Copyright(c) 2010 Jeff Schiller + * + */ + +// This extension adds a simple button to the contextual panel for paths +// The button toggles whether the path is open or closed +svgEditor.addExtension('ClosePath', function() {'use strict'; + var selElems, + updateButton = function(path) { + var seglist = path.pathSegList, + closed = seglist.getItem(seglist.numberOfItems - 1).pathSegType == 1, + showbutton = closed ? '#tool_openpath' : '#tool_closepath', + hidebutton = closed ? '#tool_closepath' : '#tool_openpath'; + $(hidebutton).hide(); + $(showbutton).show(); + }, + showPanel = function(on) { + $('#closepath_panel').toggle(on); + if (on) { + var path = selElems[0]; + if (path) {updateButton(path);} + } + }, + toggleClosed = function() { + var path = selElems[0]; + if (path) { + var seglist = path.pathSegList, + last = seglist.numberOfItems - 1; + // is closed + if (seglist.getItem(last).pathSegType == 1) { + seglist.removeItem(last); + } else { + seglist.appendItem(path.createSVGPathSegClosePath()); + } + updateButton(path); + } + }; + + return { + name: 'ClosePath', + svgicons: svgEditor.curConfig.extPath + 'closepath_icons.svg', + buttons: [{ + id: 'tool_openpath', + type: 'context', + panel: 'closepath_panel', + title: 'Open path', + events: { + click: function() { + toggleClosed(); + } + } + }, + { + id: 'tool_closepath', + type: 'context', + panel: 'closepath_panel', + title: 'Close path', + events: { + click: function() { + toggleClosed(); + } + } + }], + callback: function() { + $('#closepath_panel').hide(); + }, + selectedChanged: function(opts) { + selElems = opts.elems; + var i = selElems.length; + while (i--) { + var elem = selElems[i]; + if (elem && elem.tagName == 'path') { + if (opts.selectedElement && !opts.multiselected) { + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + } + }; +}); diff --git a/content/media/2015/03/svg-edit-2.7/extensions/ext-connector.js b/content/media/2015/03/svg-edit-2.7/extensions/ext-connector.js new file mode 100755 index 0000000..85d857e --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/extensions/ext-connector.js @@ -0,0 +1,593 @@ +/*globals svgEditor, svgCanvas, $*/ +/*jslint vars: true, continue: true, eqeq: true, todo: true*/ +/* + * ext-connector.js + * + * Licensed under the MIT License + * + * Copyright(c) 2010 Alexis Deveria + * + */ + +svgEditor.addExtension("Connector", function(S) { + var svgcontent = S.svgcontent, + svgroot = S.svgroot, + getNextId = S.getNextId, + getElem = S.getElem, + addElem = S.addSvgElementFromJson, + selManager = S.selectorManager, + curConfig = svgEditor.curConfig, + started = false, + start_x, + start_y, + cur_line, + start_elem, + end_elem, + connections = [], + conn_sel = ".se_connector", + se_ns, +// connect_str = "-SE_CONNECT-", + selElems = [], + elData = $.data; + + var lang_list = { + "en":[ + {"id": "mode_connect", "title": "Connect two objects" } + ], + "fr":[ + {"id": "mode_connect", "title": "Connecter deux objets"} + ] + }; + + function getBBintersect(x, y, bb, offset) { + if(offset) { + offset -= 0; + bb = $.extend({}, bb); + bb.width += offset; + bb.height += offset; + bb.x -= offset/2; + bb.y -= offset/2; + } + + var mid_x = bb.x + bb.width/2; + var mid_y = bb.y + bb.height/2; + var len_x = x - mid_x; + var len_y = y - mid_y; + + var slope = Math.abs(len_y/len_x); + + var ratio; + + if(slope < bb.height/bb.width) { + ratio = (bb.width/2) / Math.abs(len_x); + } else { + ratio = (bb.height/2) / Math.abs(len_y); + } + + + return { + x: mid_x + len_x * ratio, + y: mid_y + len_y * ratio + }; + } + + function getOffset(side, line) { + var give_offset = !!line.getAttribute('marker-' + side); +// var give_offset = $(line).data(side+'_off'); + + // TODO: Make this number (5) be based on marker width/height + var size = line.getAttribute('stroke-width') * 5; + return give_offset ? size : 0; + } + + function showPanel(on) { + var conn_rules = $('#connector_rules'); + if(!conn_rules.length) { + conn_rules = $(' +
    + +
    + + +
    +
    +

    Layers

    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + +
    Layer 1
    + Move elements to: + +
    +
    L a y e r s
    +
    + +
    +
    + SVG-Edit + + +
    + + +
    + + + +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    + + + +
    + + +
    + + + +
    + + +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    B
    +
    i
    +
    + +
    + + +
    + + + + + +
    + + +
    +
    + + + + +
    + +
    + +
    + +
    +
    +
    + + +
    + +
    + +
    +
    + +
    + + + + +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + + +
    + + +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + + +
    + + + + + + + +
    + +
    + + +
    +
    + +
    + +
    +
    +
    + +
    + + + + + +
    + + + +
    +
    +
    +
    + + +
    +
    +

    Copy the contents of this box into a text editor, then save the file with a .svg extension.

    + +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + + +
    + + +
    + Image Properties + + +
    + Canvas Dimensions + + + + + + +
    + +
    + Included Images + + +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    + +
    + Editor Preferences + + + + + +
    + Editor Background +
    + +

    Note: Background will not be saved with image.

    +
    + +
    + Grid + + + +
    + +
    + Units & Rulers + + + + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/LICENSE b/content/media/2015/03/svg-edit-2.7/jgraduate/LICENSE new file mode 100755 index 0000000..d645695 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/jgraduate/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/README b/content/media/2015/03/svg-edit-2.7/jgraduate/README new file mode 100755 index 0000000..ef3e21f --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/jgraduate/README @@ -0,0 +1,3 @@ +jGraduate - A jQuery plugin for picking gradients + +Licensed under the Apache License 2. See LICENSE for more information. diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/css/jPicker.css b/content/media/2015/03/svg-edit-2.7/jgraduate/css/jPicker.css new file mode 100755 index 0000000..d186af7 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/jgraduate/css/jPicker.css @@ -0,0 +1 @@ +.jPicker .Icon{display:inline-block;height:24px;position:relative;text-align:left;width:25px}.jPicker .Icon span.Color,.jPicker .Icon span.Alpha{background-position:2px 2px;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.jPicker .Icon span.Image{background-repeat:no-repeat;cursor:pointer;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.jPicker.Container{z-index:10}table.jPicker{background-color:#efefef;border:1px outset #666;font-family:Arial,Helvetica,Sans-Serif;font-size:12px!important;margin:0;padding:5px;width:545px;z-index:20}.jPicker .Move{background-color:#ddd;border-color:#fff #666 #666 #fff;border-style:solid;border-width:1px;cursor:move;height:12px;padding:0}.jPicker .Title{font-size:11px!important;font-weight:bold;margin:-2px 0 0 0;padding:0;text-align:center;width:100%}.jPicker div.Map{border-bottom:2px solid #fff;border-left:2px solid #9a9a9a;border-right:2px solid #fff;border-top:2px solid #9a9a9a;cursor:crosshair;height:260px;margin:0 5px 0 5px;overflow:hidden;padding:0;position:relative;width:260px}.jPicker div[class="Map"]{height:256px;width:256px}.jPicker div.Bar{border-bottom:2px solid #fff;border-left:2px solid #9a9a9a;border-right:2px solid #fff;border-top:2px solid #9a9a9a;cursor:n-resize;height:260px;margin:12px 10px 0 5px;overflow:hidden;padding:0;position:relative;width:24px}.jPicker div[class="Bar"]{height:256px;width:20px}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Map .Map3,.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4,.jPicker .Bar .Map5,.jPicker .Bar .Map6{background-color:transparent;background-image:none;display:block;left:0;position:absolute;top:0}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Map .Map3{height:2596px;width:256px}.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4{height:3896px;width:20px}.jPicker .Bar .Map5,.jPicker .Bar .Map6{height:256px;width:20px}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Bar .Map6{background-repeat:no-repeat}.jPicker .Map .Map3,.jPicker .Bar .Map5{background-repeat:repeat}.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4{background-repeat:repeat-x}.jPicker .Map .Arrow{display:block;position:absolute}.jPicker .Bar .Arrow{display:block;left:0;position:absolute}.jPicker .Preview{font-size:9px;text-align:center}.jPicker .Preview div{border:2px inset #eee;height:62px;margin:0 auto;padding:0;width:62px}.jPicker .Preview div span{border:1px solid #000;display:block;height:30px;margin:0 auto;padding:0;width:60px}.jPicker .Preview .Active{border-bottom-width:0}.jPicker .Preview .Current{border-top-width:0;cursor:pointer}.jPicker .Button{text-align:center;width:115px}.jPicker .Button input{width:100px}.jPicker .Button .Ok{margin:12px 0 5px 0}.jPicker td.Radio{margin:0;padding:0;width:31px}.jPicker td.Radio input{margin:0 5px 0 0;padding:0}.jPicker td.Text{font-size:12px!important;height:22px;margin:0;padding:0;text-align:left;width:70px}.jPicker tr.Hex td.Text{width:100px}.jPicker td.Text input{background-color:#fff;border:1px inset #aaa;height:19px;margin:0 0 0 5px;text-align:left;width:30px}.jPicker td[class="Text"] input{height:15px}.jPicker tr.Hex td.Text input.Hex{width:50px}.jPicker tr.Hex td.Text input.AHex{width:20px}.jPicker .Grid{text-align:center;width:114px}.jPicker .Grid span.QuickColor{border:1px inset #aaa;cursor:pointer;display:inline-block;height:15px;line-height:15px;margin:0;padding:0;width:19px}.jPicker .Grid span[class="QuickColor"]{width:17px} \ No newline at end of file diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/css/jgraduate.css b/content/media/2015/03/svg-edit-2.7/jgraduate/css/jgraduate.css new file mode 100755 index 0000000..5a9eed3 --- /dev/null +++ b/content/media/2015/03/svg-edit-2.7/jgraduate/css/jgraduate.css @@ -0,0 +1,351 @@ +/* + * jGraduate Default CSS + * + * Copyright (c) 2010 Jeff Schiller + * http://blog.codedread.com/ + * + * Copyright (c) 2010 Alexis Deveria + * http://a.deveria.com/ + * + * Licensed under the MIT License + */ + +h2.jGraduate_Title { + font-family: Arial, Helvetica, Sans-Serif; + font-size: 11px !important; + font-weight: bold; + margin: -13px 0px 0px 0px; + padding: 0px; + text-align: center; +} + +.jGraduate_Picker { + font-family: Arial, Helvetica, Sans-Serif; + font-size: 12px; + border-style: solid; + border-color: lightgrey black black lightgrey; + border-width: 1px; + background-color: #EFEFEF; + position: absolute; + padding: 10px; +} + +.jGraduate_tabs li { + background-color: #ccc; + display: inline; + border: solid 1px grey; + padding: 3px; + margin: 2px; + cursor: pointer; +} + +li.jGraduate_tab_current { + background-color: #EFEFEF; + display: inline; + padding: 3px; + margin: 2px; + border: solid 1px black; + cursor: pointer; +} + +.jGraduate_colPick { + display: none; +} + +.jGraduate_gradPick { + display: none; + border: outset 1px #666; + padding: 10px 7px 5px 5px; + overflow: auto; +} + +.jGraduate_gradPick { + display: none; + border: outset 1px #666; + padding: 10px 7px 5px 5px; + overflow: auto; +/* position: relative;*/ +} + +.jGraduate_tabs { + position: relative; + background-color: #EFEFEF; + padding: 0px; + margin: 0px; + margin-bottom: 5px; +} + +div.jGraduate_Swatch { + float: left; + margin: 8px; +} +div.jGraduate_GradContainer { + border: 2px inset #EEE; + background-image: url(../images/map-opacity.png); + background-position: 0px 0px; + height: 256px; + width: 256px; + position: relative; +} + +div.jGraduate_GradContainer div.grad_coord { + background: #000; + border: 1px solid #fff; + border-radius: 5px; + -moz-border-radius: 5px; + width: 10px; + height: 10px; + position: absolute; + margin: -5px -5px; + top: 0; + left: 0; + text-align: center; + font-size: xx-small; + line-height: 10px; + color: #fff; + text-decoration: none; + cursor: pointer; + -moz-user-select: none; + -webkit-user-select: none; +} + +.jGraduate_AlphaArrows { + position: absolute; + margin-top: -10px; + margin-left: 250.5px; +} + +div.jGraduate_Opacity { + border: 2px inset #eee; + margin-top: 14px; + background-color: black; + background-image: url(../images/Maps.png); + background-position: 0px -2816px; + height: 20px; + cursor: ew-resize; +} + +div.jGraduate_StopSlider { +/* border: 2px inset #eee;*/ + margin: 0 0 0 -10px; + width: 276px; + overflow: visible; + background: #efefef; + height: 45px; + cursor: pointer; +} + +div.jGraduate_StopSection { + width: 120px; + text-align: center; +} + + + + +input.jGraduate_Ok, input.jGraduate_Cancel { + display: block; + width: 100px; + margin-left: -4px; + margin-right: -4px; +} +input.jGraduate_Ok { + margin: 9px -4px 5px -4px; +} + +.colorBox { + float: left; + height: 16px; + width: 16px; + border: 1px solid #808080; + cursor: pointer; + margin: 4px 4px 4px 30px; +} + +.colorBox + label { + float: left; + margin-top: 7px; +} + +label.jGraduate_Form_Heading { + position: relative; + top: 10px; + background-color: #EFEFEF; + padding: 2px; + font-weight: bold; + font-size: 13px; +} + +div.jGraduate_Form_Section { + border-style: solid; + border-width: 1px; + border-color: grey; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding: 15px 5px 5px 5px; + margin: 5px 2px; + width: 110px; + text-align: center; + overflow: auto; +} + +div.jGraduate_Form_Section label { + padding: 0 2px; +} + +div.jGraduate_StopSection input[type=text], +div.jGraduate_Slider input[type=text] { + width: 33px; +} + +div.jGraduate_LightBox { + position: fixed; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + background-color: #000; + opacity: 0.5; + display: none; +} + +div.jGraduate_stopPicker { + position: absolute; + display: none; + background: #E8E8E8; +} + + +.jGraduate_gradPick { + width: 535px; +} + +.jGraduate_gradPick div.jGraduate_OpacField { + + position: absolute; + left: 0; + bottom: 5px; +/* + width: 270px; + + left: 284px; + width: 266px; + height: 200px; + top: 167px; + margin: -3px 3px 0px 4px; +*/ +} + +.jGraduate_gradPick .jGraduate_Form { + float: left; + width: 270px; + position: absolute; + left: 284px; + width: 266px; + height: 200px; + top: 167px; + margin: -3px 3px 0px 10px; +} + +.jGraduate_gradPick .jGraduate_Points { + position: static; + width: 150px; + margin-left: 0; +} + +.jGraduate_SpreadMethod { + position: absolute; + right: 8px; + top: 100px; +} + +.jGraduate_Colorblocks { + display: table; + border-spacing: 0 5px; +} + +.jGraduate_colorblock { + display: table-row; +} + +.jGraduate_Colorblocks .jGraduate_colorblock > * { + display: table-cell; + vertical-align: middle; + margin: 0; + float: none; +} + +.jGraduate_gradPick div.jGraduate_StopSection { + float: left; + width: 133px; + margin-top: -8px; +} + + +.jGraduate_gradPick .jGraduate_Form_Section { + padding-top: 9px; +} + + +.jGraduate_Slider { + text-align: center; + float: left; + width: 100%; +} + +.jGraduate_Slider .jGraduate_Form_Section { + border: none; + width: 250px; + padding: 0 2px; + overflow: visible; +} + +.jGraduate_Slider label { + display: inline-block; + float: left; + line-height: 50px; + padding: 0; +} + +.jGraduate_Slider label.prelabel { + width: 40px; + text-align: left; +} + +.jGraduate_SliderBar { + width: 140px; + float: left; + margin-right: 5px; + border:1px solid #BBB; + height:20px; + margin-top:14px; + margin-left:5px; + position: relative; +} + +div.jGraduate_Slider input { + margin-top: 5px; +} + +div.jGraduate_Slider img { + top: 0; + left: 0; + position: absolute; + margin-top: -10px; + cursor:ew-resize; +} + + +.jGraduate_gradPick .jGraduate_OkCancel { + position: absolute; + top: 39px; + right: 10px; + width: 113px; + +} + +.jGraduate_OpacField { + position: absolute; + right: -10px; + bottom: 0; +} \ No newline at end of file diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/AlphaBar.png b/content/media/2015/03/svg-edit-2.7/jgraduate/images/AlphaBar.png new file mode 100755 index 0000000000000000000000000000000000000000..2950daeb877f9e917f841953f29c64266b691fcc GIT binary patch literal 2195 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%0A&S-# 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

    ^m(L~pIE4v{JJ6sFjTx7 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 literal 0 HcmV?d00001 diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/NoColor.png b/content/media/2015/03/svg-edit-2.7/jgraduate/images/NoColor.png new file mode 100755 index 0000000000000000000000000000000000000000..5dc47670ef4eae06eec62292e0b1786594428c9b GIT binary patch literal 552 zcmV+@0@wYCP)(95lN6yi%m1DW<-}7mdEbf`ObXi z`yRFN=P+~$1`&^QI1INNL|`8Nmrr@#-_dB$$q6zUG@Gj7tu6R`baTUr1g55782I>5 zrDTtc;O!07D%I<}xv9!#)27Azek?EJ>4}m_l*{sh*H^r}pwq#_1Lbm*PGf8gYipRE zmUK(wa3B!iXjIBmp@7Rvg^_rEreYE2=kRzq7K7JIhB26@+tqb(ktZg!2bArO-E-(a)AJP2Aqn;USA9@i=+CJUJuWkVV5bw22$q&afKZ4xHgJDW`}=6MtaRI;kI-LSP(H5=BAB0t zAPJ06g~NhJr4pr5JUYszNqtSFqNXh@sHal?M{IBN?5tLlgK9MTeJGn1<9T%zrP9#) qFJpwqG_{)?U9F~j|G3wm0t^6t`@V<%CHN}<0000jZ!R literal 0 HcmV?d00001 diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/bar-opacity.png b/content/media/2015/03/svg-edit-2.7/jgraduate/images/bar-opacity.png new file mode 100755 index 0000000000000000000000000000000000000000..e42ad081260dcf697ad046e61356993d4c3c3d5b GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G8lEnWAr-fhY>J=pF!M-AOCP@J!(+klQmE(u|Nrg9=jPdZ eb6Ybo@h~`D<0uF}a@rE8hr!d;&t;ucLK6Vi2PWG9 literal 0 HcmV?d00001 diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/map-opacity.png b/content/media/2015/03/svg-edit-2.7/jgraduate/images/map-opacity.png new file mode 100755 index 0000000000000000000000000000000000000000..6756cee6df14dabac21fee85d68fd2e30f1873cb GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbUj@hLn>}1*%UwHVKz(1$>|B5)7j`^u&Pnwz>oj`>(>aS jpPwhotNJUGfy02oX)8y=1{2rcK#dHZu6{1-oD!M<2x%(! literal 0 HcmV?d00001 diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint.gif b/content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint.gif new file mode 100755 index 0000000000000000000000000000000000000000..f5f855745cfda02dcfa684d3fcd628eadf3d39e8 GIT binary patch literal 93 zcmZ?wbhEHba)%3-gb!1ED&*WW@NAi0RAo>Pyhe` literal 0 HcmV?d00001 diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint_c.png b/content/media/2015/03/svg-edit-2.7/jgraduate/images/mappoint_c.png new file mode 100755 index 0000000000000000000000000000000000000000..d0a6e1cea2daab6d3058aed7e82ff7cd83e7e80d GIT binary patch literal 252 zcmVo_2?5Z?39g(WZYO z$aJrzMs?nz2~nN#(2k_+osps{_~`sj7Xfn@IZu=jQ;fQN?oIoS z(}y``O4UY+4?Q@ywLP1-%>v)8vd`#gX1bgjg`#@E~D z{W&`O;(0MWuV-)MPwI6Dyp`Mk#;m0L_xboz4g&_+_yaXJDt1l>I+nrH)z4*}Q$iB} DXSHaG literal 0 HcmV?d00001 diff --git a/content/media/2015/03/svg-edit-2.7/jgraduate/images/picker.gif b/content/media/2015/03/svg-edit-2.7/jgraduate/images/picker.gif new file mode 100755 index 0000000000000000000000000000000000000000..374d891042f22ff5c23eed3148b6ae5fe2cfdb1c GIT binary patch literal 146 zcmZ?wbhEHblw^=#Sj56`S)_gx__~2Yh?c=8>m+y){r~YPZmz!j+@QWJ- rTTkXiR9;#Y7Lm*_bDc!{( zJaZG%Q-e|yQz{EjrrH1%X?nUihE&{2vMGMX!z^TAX6E+H$nXKH$<(wz|Nq+?{eN?F gbMw(m21Yi9jg}lG!VlE;12r*ty85}Sb4q9e04Z`P&^6s2AQ_8e46`C?&-1$jD#~0B3n3 barW) locX = barW; + if (locY < 0) locY = 0; + else if (locY > barH) locY = barH; + val.call($this, 'xy', { x: ((locX / barW) * rangeX) + minX, y: ((locY / barH) * rangeY) + minY }); + }, + draw = + function() + { + var arrowOffsetX = 0, + arrowOffsetY = 0, + barW = bar.w, + barH = bar.h, + arrowW = arrow.w, + arrowH = arrow.h; + setTimeout( + function() + { + if (rangeX > 0) // range is greater than zero + { + // constrain to bounds + if (x == maxX) arrowOffsetX = barW; + else arrowOffsetX = ((x / rangeX) * barW) | 0; + } + if (rangeY > 0) // range is greater than zero + { + // constrain to bounds + if (y == maxY) arrowOffsetY = barH; + else arrowOffsetY = ((y / rangeY) * barH) | 0; + } + // if arrow width is greater than bar width, center arrow and prevent horizontal dragging + if (arrowW >= barW) arrowOffsetX = (barW >> 1) - (arrowW >> 1); // number >> 1 - superfast bitwise divide by two and truncate (move bits over one bit discarding lowest) + else arrowOffsetX -= arrowW >> 1; + // if arrow height is greater than bar height, center arrow and prevent vertical dragging + if (arrowH >= barH) arrowOffsetY = (barH >> 1) - (arrowH >> 1); + else arrowOffsetY -= arrowH >> 1; + // set the arrow position based on these offsets + arrow.css({ left: arrowOffsetX + 'px', top: arrowOffsetY + 'px' }); + }, 0); + }, + val = + function(name, value, context) + { + var set = value !== undefined; + if (!set) + { + if (name === undefined || name == null) name = 'xy'; + switch (name.toLowerCase()) + { + case 'x': return x; + case 'y': return y; + case 'xy': + default: return { x: x, y: y }; + } + } + if (context != null && context == $this) return; + var changed = false, + newX, + newY; + if (name == null) name = 'xy'; + switch (name.toLowerCase()) + { + case 'x': + newX = value && (value.x && value.x | 0 || value | 0) || 0; + break; + case 'y': + newY = value && (value.y && value.y | 0 || value | 0) || 0; + break; + case 'xy': + default: + newX = value && value.x && value.x | 0 || 0; + newY = value && value.y && value.y | 0 || 0; + break; + } + if (newX != null) + { + if (newX < minX) newX = minX; + else if (newX > maxX) newX = maxX; + if (x != newX) + { + x = newX; + changed = true; + } + } + if (newY != null) + { + if (newY < minY) newY = minY; + else if (newY > maxY) newY = maxY; + if (y != newY) + { + y = newY; + changed = true; + } + } + changed && fireChangeEvents.call($this, context || $this); + }, + range = + function (name, value) + { + var set = value !== undefined; + if (!set) + { + if (name === undefined || name == null) name = 'all'; + switch (name.toLowerCase()) + { + case 'minx': return minX; + case 'maxx': return maxX; + case 'rangex': return { minX: minX, maxX: maxX, rangeX: rangeX }; + case 'miny': return minY; + case 'maxy': return maxY; + case 'rangey': return { minY: minY, maxY: maxY, rangeY: rangeY }; + case 'all': + default: return { minX: minX, maxX: maxX, rangeX: rangeX, minY: minY, maxY: maxY, rangeY: rangeY }; + } + } + var changed = false, + newMinX, + newMaxX, + newMinY, + newMaxY; + if (name == null) name = 'all'; + switch (name.toLowerCase()) + { + case 'minx': + newMinX = value && (value.minX && value.minX | 0 || value | 0) || 0; + break; + case 'maxx': + newMaxX = value && (value.maxX && value.maxX | 0 || value | 0) || 0; + break; + case 'rangex': + newMinX = value && value.minX && value.minX | 0 || 0; + newMaxX = value && value.maxX && value.maxX | 0 || 0; + break; + case 'miny': + newMinY = value && (value.minY && value.minY | 0 || value | 0) || 0; + break; + case 'maxy': + newMaxY = value && (value.maxY && value.maxY | 0 || value | 0) || 0; + break; + case 'rangey': + newMinY = value && value.minY && value.minY | 0 || 0; + newMaxY = value && value.maxY && value.maxY | 0 || 0; + break; + case 'all': + default: + newMinX = value && value.minX && value.minX | 0 || 0; + newMaxX = value && value.maxX && value.maxX | 0 || 0; + newMinY = value && value.minY && value.minY | 0 || 0; + newMaxY = value && value.maxY && value.maxY | 0 || 0; + break; + } + if (newMinX != null && minX != newMinX) + { + minX = newMinX; + rangeX = maxX - minX; + } + if (newMaxX != null && maxX != newMaxX) + { + maxX = newMaxX; + rangeX = maxX - minX; + } + if (newMinY != null && minY != newMinY) + { + minY = newMinY; + rangeY = maxY - minY; + } + if (newMaxY != null && maxY != newMaxY) + { + maxY = newMaxY; + rangeY = maxY - minY; + } + }, + bind = + function (callback) + { + if ($.isFunction(callback)) changeEvents.push(callback); + }, + unbind = + function (callback) + { + if (!$.isFunction(callback)) return; + var i; + while ((i = $.inArray(callback, changeEvents)) != -1) changeEvents.splice(i, 1); + }, + destroy = + function() + { + // unbind all possible events and null objects + $(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove); + bar.unbind('mousedown', mouseDown); + bar = null; + arrow = null; + changeEvents = null; + }; + $.extend(true, $this, // public properties, methods, and event bindings - these we need to access from other controls + { + val: val, + range: range, + bind: bind, + unbind: unbind, + destroy: destroy + }); + // initialize this control + arrow.src = options.arrow && options.arrow.image; + arrow.w = options.arrow && options.arrow.width || arrow.width(); + arrow.h = options.arrow && options.arrow.height || arrow.height(); + bar.w = options.map && options.map.width || bar.width(); + bar.h = options.map && options.map.height || bar.height(); + // bind mousedown event + bar.bind('mousedown', mouseDown); + bind.call($this, draw); + }, + ColorValuePicker = // controls for all the input elements for the typing in color values + function(picker, color, bindedHex, alphaPrecision) + { + var $this = this, // private properties and methods + inputs = picker.find('td.Text input'), + red = inputs.eq(3), + green = inputs.eq(4), + blue = inputs.eq(5), + alpha = inputs.length > 7 ? inputs.eq(6) : null, + hue = inputs.eq(0), + saturation = inputs.eq(1), + value = inputs.eq(2), + hex = inputs.eq(inputs.length > 7 ? 7 : 6), + ahex = inputs.length > 7 ? inputs.eq(8) : null, + keyDown = // input box key down - use arrows to alter color + function(e) + { + if (e.target.value == '' && e.target != hex.get(0) && (bindedHex != null && e.target != bindedHex.get(0) || bindedHex == null)) return; + if (!validateKey(e)) return e; + switch (e.target) + { + case red.get(0): + switch (e.keyCode) + { + case 38: + red.val(setValueInRange.call($this, (red.val() << 0) + 1, 0, 255)); + color.val('r', red.val(), e.target); + return false; + case 40: + red.val(setValueInRange.call($this, (red.val() << 0) - 1, 0, 255)); + color.val('r', red.val(), e.target); + return false; + } + break; + case green.get(0): + switch (e.keyCode) + { + case 38: + green.val(setValueInRange.call($this, (green.val() << 0) + 1, 0, 255)); + color.val('g', green.val(), e.target); + return false; + case 40: + green.val(setValueInRange.call($this, (green.val() << 0) - 1, 0, 255)); + color.val('g', green.val(), e.target); + return false; + } + break; + case blue.get(0): + switch (e.keyCode) + { + case 38: + blue.val(setValueInRange.call($this, (blue.val() << 0) + 1, 0, 255)); + color.val('b', blue.val(), e.target); + return false; + case 40: + blue.val(setValueInRange.call($this, (blue.val() << 0) - 1, 0, 255)); + color.val('b', blue.val(), e.target); + return false; + } + break; + case alpha && alpha.get(0): + switch (e.keyCode) + { + case 38: + alpha.val(setValueInRange.call($this, parseFloat(alpha.val()) + 1, 0, 100)); + color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target); + return false; + case 40: + alpha.val(setValueInRange.call($this, parseFloat(alpha.val()) - 1, 0, 100)); + color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target); + return false; + } + break; + case hue.get(0): + switch (e.keyCode) + { + case 38: + hue.val(setValueInRange.call($this, (hue.val() << 0) + 1, 0, 360)); + color.val('h', hue.val(), e.target); + return false; + case 40: + hue.val(setValueInRange.call($this, (hue.val() << 0) - 1, 0, 360)); + color.val('h', hue.val(), e.target); + return false; + } + break; + case saturation.get(0): + switch (e.keyCode) + { + case 38: + saturation.val(setValueInRange.call($this, (saturation.val() << 0) + 1, 0, 100)); + color.val('s', saturation.val(), e.target); + return false; + case 40: + saturation.val(setValueInRange.call($this, (saturation.val() << 0) - 1, 0, 100)); + color.val('s', saturation.val(), e.target); + return false; + } + break; + case value.get(0): + switch (e.keyCode) + { + case 38: + value.val(setValueInRange.call($this, (value.val() << 0) + 1, 0, 100)); + color.val('v', value.val(), e.target); + return false; + case 40: + value.val(setValueInRange.call($this, (value.val() << 0) - 1, 0, 100)); + color.val('v', value.val(), e.target); + return false; + } + break; + } + }, + keyUp = // input box key up - validate value and set color + function(e) + { + if (e.target.value == '' && e.target != hex.get(0) && (bindedHex != null && e.target != bindedHex.get(0) || bindedHex == null)) return; + if (!validateKey(e)) return e; + switch (e.target) + { + case red.get(0): + red.val(setValueInRange.call($this, red.val(), 0, 255)); + color.val('r', red.val(), e.target); + break; + case green.get(0): + green.val(setValueInRange.call($this, green.val(), 0, 255)); + color.val('g', green.val(), e.target); + break; + case blue.get(0): + blue.val(setValueInRange.call($this, blue.val(), 0, 255)); + color.val('b', blue.val(), e.target); + break; + case alpha && alpha.get(0): + alpha.val(setValueInRange.call($this, alpha.val(), 0, 100)); + color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target); + break; + case hue.get(0): + hue.val(setValueInRange.call($this, hue.val(), 0, 360)); + color.val('h', hue.val(), e.target); + break; + case saturation.get(0): + saturation.val(setValueInRange.call($this, saturation.val(), 0, 100)); + color.val('s', saturation.val(), e.target); + break; + case value.get(0): + value.val(setValueInRange.call($this, value.val(), 0, 100)); + color.val('v', value.val(), e.target); + break; + case hex.get(0): + hex.val(hex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 6)); + bindedHex && bindedHex.val(hex.val()); + color.val('hex', hex.val() != '' ? hex.val() : null, e.target); + break; + case bindedHex && bindedHex.get(0): + bindedHex.val(bindedHex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 6)); + hex.val(bindedHex.val()); + color.val('hex', bindedHex.val() != '' ? bindedHex.val() : null, e.target); + break; + case ahex && ahex.get(0): + ahex.val(ahex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 2)); + color.val('a', ahex.val() != null ? parseInt(ahex.val(), 16) : null, e.target); + break; + } + }, + blur = // input box blur - reset to original if value empty + function(e) + { + if (color.val() != null) + { + switch (e.target) + { + case red.get(0): red.val(color.val('r')); break; + case green.get(0): green.val(color.val('g')); break; + case blue.get(0): blue.val(color.val('b')); break; + case alpha && alpha.get(0): alpha.val(Math.precision((color.val('a') * 100) / 255, alphaPrecision)); break; + case hue.get(0): hue.val(color.val('h')); break; + case saturation.get(0): saturation.val(color.val('s')); break; + case value.get(0): value.val(color.val('v')); break; + case hex.get(0): + case bindedHex && bindedHex.get(0): + hex.val(color.val('hex')); + bindedHex && bindedHex.val(color.val('hex')); + break; + case ahex && ahex.get(0): ahex.val(color.val('ahex').substring(6)); break; + } + } + }, + validateKey = // validate key + function(e) + { + switch(e.keyCode) + { + case 9: + case 16: + case 29: + case 37: + case 39: + return false; + case 'c'.charCodeAt(): + case 'v'.charCodeAt(): + if (e.ctrlKey) return false; + } + return true; + }, + setValueInRange = // constrain value within range + function(value, min, max) + { + if (value == '' || isNaN(value)) return min; + if (value > max) return max; + if (value < min) return min; + return value; + }, + colorChanged = + function(ui, context) + { + var all = ui.val('all'); + if (context != red.get(0)) red.val(all != null ? all.r : ''); + if (context != green.get(0)) green.val(all != null ? all.g : ''); + if (context != blue.get(0)) blue.val(all != null ? all.b : ''); + if (alpha && context != alpha.get(0)) alpha.val(all != null ? Math.precision((all.a * 100) / 255, alphaPrecision) : ''); + if (context != hue.get(0)) hue.val(all != null ? all.h : ''); + if (context != saturation.get(0)) saturation.val(all != null ? all.s : ''); + if (context != value.get(0)) value.val(all != null ? all.v : ''); + if (context != hex.get(0) && (bindedHex && context != bindedHex.get(0) || !bindedHex)) hex.val(all != null ? all.hex : ''); + if (bindedHex && context != bindedHex.get(0) && context != hex.get(0)) bindedHex.val(all != null ? all.hex : ''); + if (ahex && context != ahex.get(0)) ahex.val(all != null ? all.ahex.substring(6) : ''); + }, + destroy = + function() + { + // unbind all events and null objects + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).unbind('keyup', keyUp).unbind('blur', blur); + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).unbind('keydown', keyDown); + color.unbind(colorChanged); + red = null; + green = null; + blue = null; + alpha = null; + hue = null; + saturation = null; + value = null; + hex = null; + ahex = null; + }; + $.extend(true, $this, // public properties and methods + { + destroy: destroy + }); + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).bind('keyup', keyUp).bind('blur', blur); + red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).bind('keydown', keyDown); + color.bind(colorChanged); + }; + $.jPicker = + { + List: [], // array holding references to each active instance of the control + Color: // color object - we will be able to assign by any color space type or retrieve any color space info + // we want this public so we can optionally assign new color objects to initial values using inputs other than a string hex value (also supported) + function(init) + { + var $this = this, + r, + g, + b, + a, + h, + s, + v, + changeEvents = new Array(), + fireChangeEvents = + function(context) + { + for (var i = 0; i < changeEvents.length; i++) changeEvents[i].call($this, $this, context); + }, + val = + function(name, value, context) + { + // Kind of ugly + var set = Boolean(value); + if (set && value.ahex === "") value.ahex = "00000000"; + if (!set) + { + if (name === undefined || name == null || name == '') name = 'all'; + if (r == null) return null; + switch (name.toLowerCase()) + { + case 'ahex': return ColorMethods.rgbaToHex({ r: r, g: g, b: b, a: a }); + case 'hex': return val('ahex').substring(0, 6); + case 'all': return { r: r, g: g, b: b, a: a, h: h, s: s, v: v, hex: val.call($this, 'hex'), ahex: val.call($this, 'ahex') }; + default: + var ret={}; + for (var i = 0; i < name.length; i++) + { + switch (name.charAt(i)) + { + case 'r': + if (name.length == 1) ret = r; + else ret.r = r; + break; + case 'g': + if (name.length == 1) ret = g; + else ret.g = g; + break; + case 'b': + if (name.length == 1) ret = b; + else ret.b = b; + break; + case 'a': + if (name.length == 1) ret = a; + else ret.a = a; + break; + case 'h': + if (name.length == 1) ret = h; + else ret.h = h; + break; + case 's': + if (name.length == 1) ret = s; + else ret.s = s; + break; + case 'v': + if (name.length == 1) ret = v; + else ret.v = v; + break; + } + } + return ret == {} ? val.call($this, 'all') : ret; + break; + } + } + if (context != null && context == $this) return; + var changed = false; + if (name == null) name = ''; + if (value == null) + { + if (r != null) + { + r = null; + changed = true; + } + if (g != null) + { + g = null; + changed = true; + } + if (b != null) + { + b = null; + changed = true; + } + if (a != null) + { + a = null; + changed = true; + } + if (h != null) + { + h = null; + changed = true; + } + if (s != null) + { + s = null; + changed = true; + } + if (v != null) + { + v = null; + changed = true; + } + changed && fireChangeEvents.call($this, context || $this); + return; + } + switch (name.toLowerCase()) + { + case 'ahex': + case 'hex': + var ret = ColorMethods.hexToRgba(value && (value.ahex || value.hex) || value || 'none'); + + val.call($this, 'rgba', { r: ret.r, g: ret.g, b: ret.b, a: name == 'ahex' ? ret.a : a != null ? a : 255 }, context); + break; + default: + if (value && (value.ahex != null || value.hex != null)) + { + val.call($this, 'ahex', value.ahex || value.hex || '00000000', context); + return; + } + var newV = {}, rgb = false, hsv = false; + if (value.r !== undefined && !name.indexOf('r') == -1) name += 'r'; + if (value.g !== undefined && !name.indexOf('g') == -1) name += 'g'; + if (value.b !== undefined && !name.indexOf('b') == -1) name += 'b'; + if (value.a !== undefined && !name.indexOf('a') == -1) name += 'a'; + if (value.h !== undefined && !name.indexOf('h') == -1) name += 'h'; + if (value.s !== undefined && !name.indexOf('s') == -1) name += 's'; + if (value.v !== undefined && !name.indexOf('v') == -1) name += 'v'; + for (var i = 0; i < name.length; i++) + { + switch (name.charAt(i)) + { + case 'r': + if (hsv) continue; + rgb = true; + newV.r = value && value.r && value.r | 0 || value && value | 0 || 0; + if (newV.r < 0) newV.r = 0; + else if (newV.r > 255) newV.r = 255; + if (r != newV.r) + { + r = newV.r; + changed = true; + } + break; + case 'g': + if (hsv) continue; + rgb = true; + newV.g = value && value.g && value.g | 0 || value && value | 0 || 0; + if (newV.g < 0) newV.g = 0; + else if (newV.g > 255) newV.g = 255; + if (g != newV.g) + { + g = newV.g; + changed = true; + } + break; + case 'b': + if (hsv) continue; + rgb = true; + newV.b = value && value.b && value.b | 0 || value && value | 0 || 0; + if (newV.b < 0) newV.b = 0; + else if (newV.b > 255) newV.b = 255; + if (b != newV.b) + { + b = newV.b; + changed = true; + } + break; + case 'a': + newV.a = value && value.a != null ? value.a | 0 : value != null ? value | 0 : 255; + if (newV.a < 0) newV.a = 0; + else if (newV.a > 255) newV.a = 255; + if (a != newV.a) + { + a = newV.a; + changed = true; + } + break; + case 'h': + if (rgb) continue; + hsv = true; + newV.h = value && value.h && value.h | 0 || value && value | 0 || 0; + if (newV.h < 0) newV.h = 0; + else if (newV.h > 360) newV.h = 360; + if (h != newV.h) + { + h = newV.h; + changed = true; + } + break; + case 's': + if (rgb) continue; + hsv = true; + newV.s = value && value.s != null ? value.s | 0 : value != null ? value | 0 : 100; + if (newV.s < 0) newV.s = 0; + else if (newV.s > 100) newV.s = 100; + if (s != newV.s) + { + s = newV.s; + changed = true; + } + break; + case 'v': + if (rgb) continue; + hsv = true; + newV.v = value && value.v != null ? value.v | 0 : value != null ? value | 0 : 100; + if (newV.v < 0) newV.v = 0; + else if (newV.v > 100) newV.v = 100; + if (v != newV.v) + { + v = newV.v; + changed = true; + } + break; + } + } + if (changed) + { + if (rgb) + { + r = r || 0; + g = g || 0; + b = b || 0; + var ret = ColorMethods.rgbToHsv({ r: r, g: g, b: b }); + h = ret.h; + s = ret.s; + v = ret.v; + } + else if (hsv) + { + h = h || 0; + s = s != null ? s : 100; + v = v != null ? v : 100; + var ret = ColorMethods.hsvToRgb({ h: h, s: s, v: v }); + r = ret.r; + g = ret.g; + b = ret.b; + } + a = a != null ? a : 255; + fireChangeEvents.call($this, context || $this); + } + break; + } + }, + bind = + function(callback) + { + if ($.isFunction(callback)) changeEvents.push(callback); + }, + unbind = + function(callback) + { + if (!$.isFunction(callback)) return; + var i; + while ((i = $.inArray(callback, changeEvents)) != -1) changeEvents.splice(i, 1); + }, + destroy = + function() + { + changeEvents = null; + } + $.extend(true, $this, // public properties and methods + { + val: val, + bind: bind, + unbind: unbind, + destroy: destroy + }); + if (init) + { + if (init.ahex != null) val('ahex', init); + else if (init.hex != null) val((init.a != null ? 'a' : '') + 'hex', init.a != null ? { ahex: init.hex + ColorMethods.intToHex(init.a) } : init); + else if (init.r != null && init.g != null && init.b != null) val('rgb' + (init.a != null ? 'a' : ''), init); + else if (init.h != null && init.s != null && init.v != null) val('hsv' + (init.a != null ? 'a' : ''), init); + } + }, + ColorMethods: // color conversion methods - make public to give use to external scripts + { + hexToRgba: + function(hex) + { + if (hex === '' || hex === 'none') return { r: null, g: null, b: null, a: null }; + hex = this.validateHex(hex); + var r = '00', g = '00', b = '00', a = '255'; + if (hex.length == 6) hex += 'ff'; + if (hex.length > 6) + { + r = hex.substring(0, 2); + g = hex.substring(2, 4); + b = hex.substring(4, 6); + a = hex.substring(6, hex.length); + } + else + { + if (hex.length > 4) + { + r = hex.substring(4, hex.length); + hex = hex.substring(0, 4); + } + if (hex.length > 2) + { + g = hex.substring(2, hex.length); + hex = hex.substring(0, 2); + } + if (hex.length > 0) b = hex.substring(0, hex.length); + } + return { r: this.hexToInt(r), g: this.hexToInt(g), b: this.hexToInt(b), a: this.hexToInt(a) }; + }, + validateHex: + function(hex) + { + //if (typeof hex === "object") return ""; + hex = hex.toLowerCase().replace(/[^a-f0-9]/g, ''); + if (hex.length > 8) hex = hex.substring(0, 8); + return hex; + }, + rgbaToHex: + function(rgba) + { + return this.intToHex(rgba.r) + this.intToHex(rgba.g) + this.intToHex(rgba.b) + this.intToHex(rgba.a); + }, + intToHex: + function(dec) + { + var result = (dec | 0).toString(16); + if (result.length == 1) result = ('0' + result); + return result.toLowerCase(); + }, + hexToInt: + function(hex) + { + return parseInt(hex, 16); + }, + rgbToHsv: + function(rgb) + { + var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255, hsv = { h: 0, s: 0, v: 0 }, min = 0, max = 0, delta; + if (r >= g && r >= b) + { + max = r; + min = g > b ? b : g; + } + else if (g >= b && g >= r) + { + max = g; + min = r > b ? b : r; + } + else + { + max = b; + min = g > r ? r : g; + } + hsv.v = max; + hsv.s = max ? (max - min) / max : 0; + if (!hsv.s) hsv.h = 0; + else + { + delta = max - min; + if (r == max) hsv.h = (g - b) / delta; + else if (g == max) hsv.h = 2 + (b - r) / delta; + else hsv.h = 4 + (r - g) / delta; + hsv.h = parseInt(hsv.h * 60); + if (hsv.h < 0) hsv.h += 360; + } + hsv.s = (hsv.s * 100) | 0; + hsv.v = (hsv.v * 100) | 0; + return hsv; + }, + hsvToRgb: + function(hsv) + { + var rgb = { r: 0, g: 0, b: 0, a: 100 }, h = hsv.h, s = hsv.s, v = hsv.v; + if (s == 0) + { + if (v == 0) rgb.r = rgb.g = rgb.b = 0; + else rgb.r = rgb.g = rgb.b = (v * 255 / 100) | 0; + } + else + { + if (h == 360) h = 0; + h /= 60; + s = s / 100; + v = v / 100; + var i = h | 0, + f = h - i, + p = v * (1 - s), + q = v * (1 - (s * f)), + t = v * (1 - (s * (1 - f))); + switch (i) + { + case 0: + rgb.r = v; + rgb.g = t; + rgb.b = p; + break; + case 1: + rgb.r = q; + rgb.g = v; + rgb.b = p; + break; + case 2: + rgb.r = p; + rgb.g = v; + rgb.b = t; + break; + case 3: + rgb.r = p; + rgb.g = q; + rgb.b = v; + break; + case 4: + rgb.r = t; + rgb.g = p; + rgb.b = v; + break; + case 5: + rgb.r = v; + rgb.g = p; + rgb.b = q; + break; + } + rgb.r = (rgb.r * 255) | 0; + rgb.g = (rgb.g * 255) | 0; + rgb.b = (rgb.b * 255) | 0; + } + return rgb; + } + } + }; + var Color = $.jPicker.Color, List = $.jPicker.List, ColorMethods = $.jPicker.ColorMethods; // local copies for YUI compressor + $.fn.jPicker = + function(options) + { + var $arguments = arguments; + return this.each( + function() + { + var $this = this, settings = $.extend(true, {}, $.fn.jPicker.defaults, options); // local copies for YUI compressor + if ($($this).get(0).nodeName.toLowerCase() == 'input') // Add color picker icon if binding to an input element and bind the events to the input + { + $.extend(true, settings, + { + window: + { + bindToInput: true, + expandable: true, + input: $($this) + } + }); + if($($this).val()=='') + { + settings.color.active = new Color({ hex: null }); + settings.color.current = new Color({ hex: null }); + } + else if (ColorMethods.validateHex($($this).val())) + { + settings.color.active = new Color({ hex: $($this).val(), a: settings.color.active.val('a') }); + settings.color.current = new Color({ hex: $($this).val(), a: settings.color.active.val('a') }); + } + } + if (settings.window.expandable) + $($this).after('    '); + else settings.window.liveUpdate = false; // Basic control binding for inline use - You will need to override the liveCallback or commitCallback function to retrieve results + var isLessThanIE7 = parseFloat(navigator.appVersion.split('MSIE')[1]) < 7 && document.body.filters, // needed to run the AlphaImageLoader function for IE6 + container = null, + colorMapDiv = null, + colorBarDiv = null, + colorMapL1 = null, // different layers of colorMap and colorBar + colorMapL2 = null, + colorMapL3 = null, + colorBarL1 = null, + colorBarL2 = null, + colorBarL3 = null, + colorBarL4 = null, + colorBarL5 = null, + colorBarL6 = null, + colorMap = null, // color maps + colorBar = null, + colorPicker = null, + elementStartX = null, // Used to record the starting css positions for dragging the control + elementStartY = null, + pageStartX = null, // Used to record the mousedown coordinates for dragging the control + pageStartY = null, + activePreview = null, // color boxes above the radio buttons + currentPreview = null, + okButton = null, + cancelButton = null, + grid = null, // preset colors grid + iconColor = null, // iconColor for popup icon + iconAlpha = null, // iconAlpha for popup icon + iconImage = null, // iconImage popup icon + moveBar = null, // drag bar + setColorMode = // set color mode and update visuals for the new color mode + function(colorMode) + { + var active = color.active, // local copies for YUI compressor + clientPath = images.clientPath, + hex = active.val('hex'), + rgbMap, + rgbBar; + settings.color.mode = colorMode; + switch (colorMode) + { + case 'h': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setImgLoc.call($this, colorMapL1, 0); + setAlpha.call($this, colorMapL1, 100); + setImgLoc.call($this, colorMapL2, 260); + setAlpha.call($this, colorMapL2, 100); + setBG.call($this, colorBarDiv, 'transparent'); + setImgLoc.call($this, colorBarL1, 0); + setAlpha.call($this, colorBarL1, 100); + setImgLoc.call($this, colorBarL2, 260); + setAlpha.call($this, colorBarL2, 100); + setImgLoc.call($this, colorBarL3, 260); + setAlpha.call($this, colorBarL3, 100); + setImgLoc.call($this, colorBarL4, 260); + setAlpha.call($this, colorBarL4, 100); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 100, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 360 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('s'), y: 100 - active.val('v') }, colorMap); + colorBar.val('y', 360 - active.val('h'), colorBar); + break; + case 's': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setImgLoc.call($this, colorMapL1, -260); + setImgLoc.call($this, colorMapL2, -520); + setImgLoc.call($this, colorBarL1, -260); + setImgLoc.call($this, colorBarL2, -520); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 100 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('v') }, colorMap); + colorBar.val('y', 100 - active.val('s'), colorBar); + break; + case 'v': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, '000000'); + setImgLoc.call($this, colorMapL1, -780); + setImgLoc.call($this, colorMapL2, 260); + setBG.call($this, colorBarDiv, hex); + setImgLoc.call($this, colorBarL1, -520); + setImgLoc.call($this, colorBarL2, 260); + setAlpha.call($this, colorBarL2, 100); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 100 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('s') }, colorMap); + colorBar.val('y', 100 - active.val('v'), colorBar); + break; + case 'r': + rgbMap = -1040; + rgbBar = -780; + colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('b'), y: 255 - active.val('g') }, colorMap); + colorBar.val('y', 255 - active.val('r'), colorBar); + break; + case 'g': + rgbMap = -1560; + rgbBar = -1820; + colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('b'), y: 255 - active.val('r') }, colorMap); + colorBar.val('y', 255 - active.val('g'), colorBar); + break; + case 'b': + rgbMap = -2080; + rgbBar = -2860; + colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('r'), y: 255 - active.val('g') }, colorMap); + colorBar.val('y', 255 - active.val('b'), colorBar); + break; + case 'a': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setImgLoc.call($this, colorMapL1, -260); + setImgLoc.call($this, colorMapL2, -520); + setImgLoc.call($this, colorBarL1, 260); + setImgLoc.call($this, colorBarL2, 260); + setAlpha.call($this, colorBarL2, 100); + setImgLoc.call($this, colorBarL6, 0); + setAlpha.call($this, colorBarL6, 100); + }, 0); + colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 }); + colorBar.range('rangeY', { minY: 0, maxY: 255 }); + if (active.val('ahex') == null) break; + colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('v') }, colorMap); + colorBar.val('y', 255 - active.val('a'), colorBar); + break; + default: + throw ('Invalid Mode'); + break; + } + switch (colorMode) + { + case 'h': + break; + case 's': + case 'v': + case 'a': + setTimeout( + function() + { + setAlpha.call($this, colorMapL1, 100); + setAlpha.call($this, colorBarL1, 100); + setImgLoc.call($this, colorBarL3, 260); + setAlpha.call($this, colorBarL3, 100); + setImgLoc.call($this, colorBarL4, 260); + setAlpha.call($this, colorBarL4, 100); + }, 0); + break; + case 'r': + case 'g': + case 'b': + setTimeout( + function() + { + setBG.call($this, colorMapDiv, 'transparent'); + setBG.call($this, colorBarDiv, 'transparent'); + setAlpha.call($this, colorBarL1, 100); + setAlpha.call($this, colorMapL1, 100); + setImgLoc.call($this, colorMapL1, rgbMap); + setImgLoc.call($this, colorMapL2, rgbMap - 260); + setImgLoc.call($this, colorBarL1, rgbBar - 780); + setImgLoc.call($this, colorBarL2, rgbBar - 520); + setImgLoc.call($this, colorBarL3, rgbBar); + setImgLoc.call($this, colorBarL4, rgbBar - 260); + setImgLoc.call($this, colorBarL6, 260); + setAlpha.call($this, colorBarL6, 100); + }, 0); + break; + } + if (active.val('ahex') == null) return; + activeColorChanged.call($this, active); + }, + activeColorChanged = // Update color when user changes text values + function(ui, context) + { + if (context == null || (context != colorBar && context != colorMap)) positionMapAndBarArrows.call($this, ui, context); + setTimeout( + function() + { + updatePreview.call($this, ui); + updateMapVisuals.call($this, ui); + updateBarVisuals.call($this, ui); + }, 0); + }, + mapValueChanged = // user has dragged the ColorMap pointer + function(ui, context) + { + var active = color.active; + if (context != colorMap && active.val() == null) return; + var xy = ui.val('all'); + switch (settings.color.mode) + { + case 'h': + active.val('sv', { s: xy.x, v: 100 - xy.y }, context); + break; + case 's': + case 'a': + active.val('hv', { h: xy.x, v: 100 - xy.y }, context); + break; + case 'v': + active.val('hs', { h: xy.x, s: 100 - xy.y }, context); + break; + case 'r': + active.val('gb', { g: 255 - xy.y, b: xy.x }, context); + break; + case 'g': + active.val('rb', { r: 255 - xy.y, b: xy.x }, context); + break; + case 'b': + active.val('rg', { r: xy.x, g: 255 - xy.y }, context); + break; + } + }, + colorBarValueChanged = // user has dragged the ColorBar slider + function(ui, context) + { + var active = color.active; + if (context != colorBar && active.val() == null) return; + switch (settings.color.mode) + { + case 'h': + active.val('h', { h: 360 - ui.val('y') }, context); + break; + case 's': + active.val('s', { s: 100 - ui.val('y') }, context); + break; + case 'v': + active.val('v', { v: 100 - ui.val('y') }, context); + break; + case 'r': + active.val('r', { r: 255 - ui.val('y') }, context); + break; + case 'g': + active.val('g', { g: 255 - ui.val('y') }, context); + break; + case 'b': + active.val('b', { b: 255 - ui.val('y') }, context); + break; + case 'a': + active.val('a', 255 - ui.val('y'), context); + break; + } + }, + positionMapAndBarArrows = // position map and bar arrows to match current color + function(ui, context) + { + if (context != colorMap) + { + switch (settings.color.mode) + { + case 'h': + var sv = ui.val('sv'); + colorMap.val('xy', { x: sv != null ? sv.s : 100, y: 100 - (sv != null ? sv.v : 100) }, context); + break; + case 's': + case 'a': + var hv = ui.val('hv'); + colorMap.val('xy', { x: hv && hv.h || 0, y: 100 - (hv != null ? hv.v : 100) }, context); + break; + case 'v': + var hs = ui.val('hs'); + colorMap.val('xy', { x: hs && hs.h || 0, y: 100 - (hs != null ? hs.s : 100) }, context); + break; + case 'r': + var bg = ui.val('bg'); + colorMap.val('xy', { x: bg && bg.b || 0, y: 255 - (bg && bg.g || 0) }, context); + break; + case 'g': + var br = ui.val('br'); + colorMap.val('xy', { x: br && br.b || 0, y: 255 - (br && br.r || 0) }, context); + break; + case 'b': + var rg = ui.val('rg'); + colorMap.val('xy', { x: rg && rg.r || 0, y: 255 - (rg && rg.g || 0) }, context); + break; + } + } + if (context != colorBar) + { + switch (settings.color.mode) + { + case 'h': + colorBar.val('y', 360 - (ui.val('h') || 0), context); + break; + case 's': + var s = ui.val('s'); + colorBar.val('y', 100 - (s != null ? s : 100), context); + break; + case 'v': + var v = ui.val('v'); + colorBar.val('y', 100 - (v != null ? v : 100), context); + break; + case 'r': + colorBar.val('y', 255 - (ui.val('r') || 0), context); + break; + case 'g': + colorBar.val('y', 255 - (ui.val('g') || 0), context); + break; + case 'b': + colorBar.val('y', 255 - (ui.val('b') || 0), context); + break; + case 'a': + var a = ui.val('a'); + colorBar.val('y', 255 - (a != null ? a : 255), context); + break; + } + } + }, + updatePreview = + function(ui) + { + try + { + var all = ui.val('all'); + activePreview.css({ backgroundColor: all && '#' + all.hex || 'transparent' }); + setAlpha.call($this, activePreview, all && Math.precision((all.a * 100) / 255, 4) || 0); + } + catch (e) { } + }, + updateMapVisuals = + function(ui) + { + switch (settings.color.mode) + { + case 'h': + setBG.call($this, colorMapDiv, new Color({ h: ui.val('h') || 0, s: 100, v: 100 }).val('hex')); + break; + case 's': + case 'a': + var s = ui.val('s'); + setAlpha.call($this, colorMapL2, 100 - (s != null ? s : 100)); + break; + case 'v': + var v = ui.val('v'); + setAlpha.call($this, colorMapL1, v != null ? v : 100); + break; + case 'r': + setAlpha.call($this, colorMapL2, Math.precision((ui.val('r') || 0) / 255 * 100, 4)); + break; + case 'g': + setAlpha.call($this, colorMapL2, Math.precision((ui.val('g') || 0) / 255 * 100, 4)); + break; + case 'b': + setAlpha.call($this, colorMapL2, Math.precision((ui.val('b') || 0) / 255 * 100)); + break; + } + var a = ui.val('a'); + setAlpha.call($this, colorMapL3, Math.precision(((255 - (a || 0)) * 100) / 255, 4)); + }, + updateBarVisuals = + function(ui) + { + switch (settings.color.mode) + { + case 'h': + var a = ui.val('a'); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (a || 0)) * 100) / 255, 4)); + break; + case 's': + var hva = ui.val('hva'), + saturatedColor = new Color({ h: hva && hva.h || 0, s: 100, v: hva != null ? hva.v : 100 }); + setBG.call($this, colorBarDiv, saturatedColor.val('hex')); + setAlpha.call($this, colorBarL2, 100 - (hva != null ? hva.v : 100)); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (hva && hva.a || 0)) * 100) / 255, 4)); + break; + case 'v': + var hsa = ui.val('hsa'), + valueColor = new Color({ h: hsa && hsa.h || 0, s: hsa != null ? hsa.s : 100, v: 100 }); + setBG.call($this, colorBarDiv, valueColor.val('hex')); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (hsa && hsa.a || 0)) * 100) / 255, 4)); + break; + case 'r': + case 'g': + case 'b': + var hValue = 0, vValue = 0, rgba = ui.val('rgba'); + if (settings.color.mode == 'r') + { + hValue = rgba && rgba.b || 0; + vValue = rgba && rgba.g || 0; + } + else if (settings.color.mode == 'g') + { + hValue = rgba && rgba.b || 0; + vValue = rgba && rgba.r || 0; + } + else if (settings.color.mode == 'b') + { + hValue = rgba && rgba.r || 0; + vValue = rgba && rgba.g || 0; + } + var middle = vValue > hValue ? hValue : vValue; + setAlpha.call($this, colorBarL2, hValue > vValue ? Math.precision(((hValue - vValue) / (255 - vValue)) * 100, 4) : 0); + setAlpha.call($this, colorBarL3, vValue > hValue ? Math.precision(((vValue - hValue) / (255 - hValue)) * 100, 4) : 0); + setAlpha.call($this, colorBarL4, Math.precision((middle / 255) * 100, 4)); + setAlpha.call($this, colorBarL5, Math.precision(((255 - (rgba && rgba.a || 0)) * 100) / 255, 4)); + break; + case 'a': + var a = ui.val('a'); + setBG.call($this, colorBarDiv, ui.val('hex') || '000000'); + setAlpha.call($this, colorBarL5, a != null ? 0 : 100); + setAlpha.call($this, colorBarL6, a != null ? 100 : 0); + break; + } + }, + setBG = + function(el, c) + { + el.css({ backgroundColor: c && c.length == 6 && '#' + c || 'transparent' }); + }, + setImg = + function(img, src) + { + if (isLessThanIE7 && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1)) + { + img.attr('pngSrc', src); + img.css({ backgroundImage: 'none', filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')' }); + } + else img.css({ backgroundImage: 'url(\'' + src + '\')' }); + }, + setImgLoc = + function(img, y) + { + img.css({ top: y + 'px' }); + }, + setAlpha = + function(obj, alpha) + { + obj.css({ visibility: alpha > 0 ? 'visible' : 'hidden' }); + if (alpha > 0 && alpha < 100) + { + if (isLessThanIE7) + { + var src = obj.attr('pngSrc'); + if (src != null && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1)) + obj.css({ filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\') progid:DXImageTransform.Microsoft.Alpha(opacity=' + alpha + ')' }); + else obj.css({ opacity: Math.precision(alpha / 100, 4) }); + } + else obj.css({ opacity: Math.precision(alpha / 100, 4) }); + } + else if (alpha == 0 || alpha == 100) + { + if (isLessThanIE7) + { + var src = obj.attr('pngSrc'); + if (src != null && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1)) + obj.css({ filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')' }); + else obj.css({ opacity: '' }); + } + else obj.css({ opacity: '' }); + } + }, + revertColor = // revert color to original color when opened + function() + { + color.active.val('ahex', color.current.val('ahex')); + }, + commitColor = // commit the color changes + function() + { + color.current.val('ahex', color.active.val('ahex')); + }, + radioClicked = + function(e) + { + $(this).parents('tbody:first').find('input:radio[value!="'+e.target.value+'"]').removeAttr('checked'); + setColorMode.call($this, e.target.value); + }, + currentClicked = + function() + { + revertColor.call($this); + }, + cancelClicked = + function() + { + revertColor.call($this); + settings.window.expandable && hide.call($this); + $.isFunction(cancelCallback) && cancelCallback.call($this, color.active, cancelButton); + }, + okClicked = + function() + { + commitColor.call($this); + settings.window.expandable && hide.call($this); + $.isFunction(commitCallback) && commitCallback.call($this, color.active, okButton); + }, + iconImageClicked = + function() + { + show.call($this); + }, + currentColorChanged = + function(ui, context) + { + var hex = ui.val('hex'); + currentPreview.css({ backgroundColor: hex && '#' + hex || 'transparent' }); + setAlpha.call($this, currentPreview, Math.precision(((ui.val('a') || 0) * 100) / 255, 4)); + }, + expandableColorChanged = + function(ui, context) + { + var hex = ui.val('hex'); + var va = ui.val('va'); + iconColor.css({ backgroundColor: hex && '#' + hex || 'transparent' }); + setAlpha.call($this, iconAlpha, Math.precision(((255 - (va && va.a || 0)) * 100) / 255, 4)); + if (settings.window.bindToInput&&settings.window.updateInputColor) + settings.window.input.css( + { + backgroundColor: hex && '#' + hex || 'transparent', + color: va == null || va.v > 75 ? '#000000' : '#ffffff' + }); + }, + moveBarMouseDown = + function(e) + { + var element = settings.window.element, // local copies for YUI compressor + page = settings.window.page; + elementStartX = parseInt(container.css('left')); + elementStartY = parseInt(container.css('top')); + pageStartX = e.pageX; + pageStartY = e.pageY; + // bind events to document to move window - we will unbind these on mouseup + $(document).bind('mousemove', documentMouseMove).bind('mouseup', documentMouseUp); + e.preventDefault(); // prevent attempted dragging of the column + }, + documentMouseMove = + function(e) + { + container.css({ left: elementStartX - (pageStartX - e.pageX) + 'px', top: elementStartY - (pageStartY - e.pageY) + 'px' }); + if (settings.window.expandable && !$.support.boxModel) container.prev().css({ left: container.css("left"), top: container.css("top") }); + e.stopPropagation(); + e.preventDefault(); + return false; + }, + documentMouseUp = + function(e) + { + $(document).unbind('mousemove', documentMouseMove).unbind('mouseup', documentMouseUp); + e.stopPropagation(); + e.preventDefault(); + return false; + }, + quickPickClicked = + function(e) + { + e.preventDefault(); + e.stopPropagation(); + color.active.val('ahex', $(this).attr('title') || null, e.target); + return false; + }, + commitCallback = $.isFunction($arguments[1]) && $arguments[1] || null, + liveCallback = $.isFunction($arguments[2]) && $arguments[2] || null, + cancelCallback = $.isFunction($arguments[3]) && $arguments[3] || null, + show = + function() + { + color.current.val('ahex', color.active.val('ahex')); + var attachIFrame = function() + { + if (!settings.window.expandable || $.support.boxModel) return; + var table = container.find('table:first'); + container.before('