method_draw 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +148 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/javascripts/method_draw.js +9 -0
  6. data/app/assets/javascripts/method_draw/base64.js +95 -0
  7. data/app/assets/javascripts/method_draw_embed.js +76 -0
  8. data/app/assets/stylesheets/sketchily.css +6 -0
  9. data/app/helpers/method_draw_helper.rb +35 -0
  10. data/app/views/method_draw/_embed.html.erb +51 -0
  11. data/app/views/method_draw/_method_draw.html.erb +19 -0
  12. data/app/views/method_draw/_method_draw_tag.html.erb +14 -0
  13. data/lib/method_draw.rb +16 -0
  14. data/lib/method_draw/engine.rb +4 -0
  15. data/lib/method_draw/method_draw.rb +37 -0
  16. data/lib/method_draw/method_draw_tag.rb +20 -0
  17. data/lib/method_draw/version.rb +3 -0
  18. data/spec/app/helpers/method_draw_helper_spec.rb +8 -0
  19. data/spec/dummy/README.md +3 -0
  20. data/spec/dummy/Rakefile +7 -0
  21. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  22. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  24. data/spec/dummy/app/controllers/drawings_controller.rb +18 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/models/drawing.rb +2 -0
  27. data/spec/dummy/app/views/drawings/method_draw.html.erb +3 -0
  28. data/spec/dummy/app/views/drawings/method_draw_tag.html.erb +3 -0
  29. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  30. data/spec/dummy/config.ru +4 -0
  31. data/spec/dummy/config/application.rb +27 -0
  32. data/spec/dummy/config/boot.rb +5 -0
  33. data/spec/dummy/config/database.yml +25 -0
  34. data/spec/dummy/config/environment.rb +5 -0
  35. data/spec/dummy/config/environments/development.rb +29 -0
  36. data/spec/dummy/config/environments/production.rb +80 -0
  37. data/spec/dummy/config/environments/test.rb +36 -0
  38. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  39. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  40. data/spec/dummy/config/initializers/inflections.rb +16 -0
  41. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  42. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  43. data/spec/dummy/config/initializers/session_store.rb +3 -0
  44. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  45. data/spec/dummy/config/locales/en.yml +23 -0
  46. data/spec/dummy/config/routes.rb +8 -0
  47. data/spec/dummy/db/development.sqlite3 +0 -0
  48. data/spec/dummy/db/migrate/0_create_drawings.rb +7 -0
  49. data/spec/dummy/db/schema.rb +20 -0
  50. data/spec/dummy/db/test.sqlite3 +0 -0
  51. data/spec/dummy/log/development.log +922 -0
  52. data/spec/dummy/log/test.log +181 -0
  53. data/spec/dummy/public/404.html +26 -0
  54. data/spec/dummy/public/422.html +26 -0
  55. data/spec/dummy/public/500.html +25 -0
  56. data/spec/dummy/public/favicon.ico +0 -0
  57. data/spec/dummy/script/rails +6 -0
  58. data/spec/dummy/tmp/cache/assets/development/sprockets/01e63791dcd008779246d1eeeace9408 +0 -0
  59. data/spec/dummy/tmp/cache/assets/development/sprockets/061f36c32f08daef6eca93b74eaf74fd +0 -0
  60. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  61. data/spec/dummy/tmp/cache/assets/development/sprockets/1dbfe77fba798ba3dc24571c3b6d7eed +0 -0
  62. data/spec/dummy/tmp/cache/assets/development/sprockets/1fd7477d83ec1798c2bc740be42bd6b2 +0 -0
  63. data/spec/dummy/tmp/cache/assets/development/sprockets/203471220004cb0cc667b886fb87dc46 +0 -0
  64. data/spec/dummy/tmp/cache/assets/development/sprockets/213e12fc648032455ca0b118e987cca6 +0 -0
  65. data/spec/dummy/tmp/cache/assets/development/sprockets/296bbe63b0505bc5be472fc1c8a1a5fd +0 -0
  66. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  67. data/spec/dummy/tmp/cache/assets/development/sprockets/3239b44c026d7c1646c17a10c72905bf +0 -0
  68. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  69. data/spec/dummy/tmp/cache/assets/development/sprockets/38c8fbf05056bbe66399b6923521dc20 +0 -0
  70. data/spec/dummy/tmp/cache/assets/development/sprockets/3e30c8cfdf7deeda4607e4a8298f09a5 +0 -0
  71. data/spec/dummy/tmp/cache/assets/development/sprockets/4bdd61ba53e8d9b7c19afea13c6e8985 +0 -0
  72. data/spec/dummy/tmp/cache/assets/development/sprockets/52b0b11efea48f1fe5e46eeb4aa20193 +0 -0
  73. data/spec/dummy/tmp/cache/assets/development/sprockets/5ef314d6f1af1570631d60b7f9a96d6c +0 -0
  74. data/spec/dummy/tmp/cache/assets/development/sprockets/6215f00c593e1789ef865a545b17fc14 +0 -0
  75. data/spec/dummy/tmp/cache/assets/development/sprockets/624fdd5478edd235a86af4b6168d0f75 +0 -0
  76. data/spec/dummy/tmp/cache/assets/development/sprockets/6299190ac3952cf7eee042e60c9aee89 +0 -0
  77. data/spec/dummy/tmp/cache/assets/development/sprockets/62a95a2d67ec78570de6d0b31436206a +0 -0
  78. data/spec/dummy/tmp/cache/assets/development/sprockets/65ed942dea29700b739c2292791eb65e +0 -0
  79. data/spec/dummy/tmp/cache/assets/development/sprockets/66eb709561f77a29885af4423a3eb193 +0 -0
  80. data/spec/dummy/tmp/cache/assets/development/sprockets/6f8f2c21bc49ae5ebad6e8a96cea4fe6 +0 -0
  81. data/spec/dummy/tmp/cache/assets/development/sprockets/85dab60ed9ec9625b7ee22d4342fe26c +0 -0
  82. data/spec/dummy/tmp/cache/assets/development/sprockets/86358bce0bfd5de6ac8afb1bfa9d675b +0 -0
  83. data/spec/dummy/tmp/cache/assets/development/sprockets/8b835ce894c1218dea1e7c83a9109d2d +0 -0
  84. data/spec/dummy/tmp/cache/assets/development/sprockets/8e177cc7106653a1e053bb2444bb43a5 +0 -0
  85. data/spec/dummy/tmp/cache/assets/development/sprockets/8f41435d82ae4df55ae7dfdc1e99b0bb +0 -0
  86. data/spec/dummy/tmp/cache/assets/development/sprockets/94be0a0bca76437d0766c265a9cdecda +0 -0
  87. data/spec/dummy/tmp/cache/assets/development/sprockets/9a093e6973aa150a0a4388167364593d +0 -0
  88. data/spec/dummy/tmp/cache/assets/development/sprockets/a280ac195f56a87267d2ec5d3e22ebcd +0 -0
  89. data/spec/dummy/tmp/cache/assets/development/sprockets/b13cddebc9106da6cfaf949ab3856d1f +0 -0
  90. data/spec/dummy/tmp/cache/assets/development/sprockets/b29ac216cb03ce2f30655a0d9bed77d4 +0 -0
  91. data/spec/dummy/tmp/cache/assets/development/sprockets/c39d32e3ef6cc89f9c522212e65c49e1 +0 -0
  92. data/spec/dummy/tmp/cache/assets/development/sprockets/c9910a0652952be02900dc71594d4384 +0 -0
  93. data/spec/dummy/tmp/cache/assets/development/sprockets/cb14e22baac3ab2cc947628f283e117b +0 -0
  94. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  95. data/spec/dummy/tmp/cache/assets/development/sprockets/d1475c156face9f06092c9cf89905372 +0 -0
  96. data/spec/dummy/tmp/cache/assets/development/sprockets/d22aa5a4d864d00cced2437352fe8fe4 +0 -0
  97. data/spec/dummy/tmp/cache/assets/development/sprockets/d46cc5e60d1b2a20d622cdf9bab35fad +0 -0
  98. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  99. data/spec/dummy/tmp/cache/assets/development/sprockets/d7f27a7f35278e87c69668a65683360a +0 -0
  100. data/spec/dummy/tmp/cache/assets/development/sprockets/e0080336bb31d78e9efab59b234e0d85 +0 -0
  101. data/spec/dummy/tmp/cache/assets/development/sprockets/e06104d99b055e792effca7bd66ad384 +0 -0
  102. data/spec/dummy/tmp/cache/assets/development/sprockets/e095df19da361d5f53d90f6749a38ea6 +0 -0
  103. data/spec/dummy/tmp/cache/assets/development/sprockets/e5fb97d39fdd2e383e61115ef06079fd +0 -0
  104. data/spec/dummy/tmp/cache/assets/development/sprockets/e6d1ec9817258cfda7c68499a841a9d2 +0 -0
  105. data/spec/dummy/tmp/cache/assets/development/sprockets/edec019e8f1d7e758eb45524a913fd47 +0 -0
  106. data/spec/dummy/tmp/cache/assets/development/sprockets/f37cf330dccb15bee2a195f643f3ba29 +0 -0
  107. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  108. data/spec/dummy/tmp/cache/assets/development/sprockets/fc84011813992cacde5880c6b21701de +0 -0
  109. data/spec/dummy/tmp/cache/assets/test/sprockets/061f36c32f08daef6eca93b74eaf74fd +0 -0
  110. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  111. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  112. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  113. data/spec/dummy/tmp/cache/assets/test/sprockets/38c8fbf05056bbe66399b6923521dc20 +0 -0
  114. data/spec/dummy/tmp/cache/assets/test/sprockets/3e30c8cfdf7deeda4607e4a8298f09a5 +0 -0
  115. data/spec/dummy/tmp/cache/assets/test/sprockets/52b0b11efea48f1fe5e46eeb4aa20193 +0 -0
  116. data/spec/dummy/tmp/cache/assets/test/sprockets/5ef314d6f1af1570631d60b7f9a96d6c +0 -0
  117. data/spec/dummy/tmp/cache/assets/test/sprockets/6299190ac3952cf7eee042e60c9aee89 +0 -0
  118. data/spec/dummy/tmp/cache/assets/test/sprockets/62a95a2d67ec78570de6d0b31436206a +0 -0
  119. data/spec/dummy/tmp/cache/assets/test/sprockets/65ed942dea29700b739c2292791eb65e +0 -0
  120. data/spec/dummy/tmp/cache/assets/test/sprockets/85dab60ed9ec9625b7ee22d4342fe26c +0 -0
  121. data/spec/dummy/tmp/cache/assets/test/sprockets/a280ac195f56a87267d2ec5d3e22ebcd +0 -0
  122. data/spec/dummy/tmp/cache/assets/test/sprockets/cb14e22baac3ab2cc947628f283e117b +0 -0
  123. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  124. data/spec/dummy/tmp/cache/assets/test/sprockets/d1475c156face9f06092c9cf89905372 +0 -0
  125. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  126. data/spec/dummy/tmp/cache/assets/test/sprockets/e0080336bb31d78e9efab59b234e0d85 +0 -0
  127. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  128. data/spec/dummy/tmp/pids/server.pid +1 -0
  129. data/spec/features/method_draw_spec.rb +10 -0
  130. data/spec/features/method_draw_tag_spec.rb +11 -0
  131. data/spec/lib/method_draw/method_draw_spec.rb +27 -0
  132. data/spec/lib/method_draw/method_draw_tag_spec.rb +19 -0
  133. data/spec/lib/method_draw_spec.rb +11 -0
  134. data/spec/test_helper.rb +24 -0
  135. data/vendor/assets/javascripts/method-draw-js/browser-not-supported.html +27 -0
  136. data/vendor/assets/javascripts/method-draw-js/css/font-files/Anivers-webfont.eot +0 -0
  137. data/vendor/assets/javascripts/method-draw-js/css/font-files/Anivers-webfont.ttf +0 -0
  138. data/vendor/assets/javascripts/method-draw-js/css/font-files/Anivers-webfont.woff +0 -0
  139. data/vendor/assets/javascripts/method-draw-js/css/font-files/Arvo-Regular-webfont.svg +145 -0
  140. data/vendor/assets/javascripts/method-draw-js/css/font-files/Arvo-Regular-webfont.ttf +0 -0
  141. data/vendor/assets/javascripts/method-draw-js/css/font-files/Junction-webfont.eot +0 -0
  142. data/vendor/assets/javascripts/method-draw-js/css/font-files/Junction-webfont.svg +133 -0
  143. data/vendor/assets/javascripts/method-draw-js/css/font-files/Junction-webfont.ttf +0 -0
  144. data/vendor/assets/javascripts/method-draw-js/css/font-files/Junction-webfont.woff +0 -0
  145. data/vendor/assets/javascripts/method-draw-js/css/font-files/League_Gothic-webfont.eot +0 -0
  146. data/vendor/assets/javascripts/method-draw-js/css/font-files/League_Gothic-webfont.svg +235 -0
  147. data/vendor/assets/javascripts/method-draw-js/css/font-files/League_Gothic-webfont.ttf +0 -0
  148. data/vendor/assets/javascripts/method-draw-js/css/font-files/League_Gothic-webfont.woff +0 -0
  149. data/vendor/assets/javascripts/method-draw-js/css/font-files/Museo_Slab-webfont.eot +0 -0
  150. data/vendor/assets/javascripts/method-draw-js/css/font-files/Museo_Slab-webfont.ttf +0 -0
  151. data/vendor/assets/javascripts/method-draw-js/css/font-files/Museo_Slab-webfont.woff +0 -0
  152. data/vendor/assets/javascripts/method-draw-js/css/font-files/Museo_Slab_Italic-webfont.eot +0 -0
  153. data/vendor/assets/javascripts/method-draw-js/css/font-files/Museo_Slab_Italic-webfont.ttf +0 -0
  154. data/vendor/assets/javascripts/method-draw-js/css/font-files/Museo_Slab_Italic-webfont.woff +0 -0
  155. data/vendor/assets/javascripts/method-draw-js/css/font-files/arvo-bold-webfont.woff +0 -0
  156. data/vendor/assets/javascripts/method-draw-js/css/font-files/arvo-bolditalic-webfont.woff +0 -0
  157. data/vendor/assets/javascripts/method-draw-js/css/font-files/arvo-italic-webfont.woff +0 -0
  158. data/vendor/assets/javascripts/method-draw-js/css/font-files/arvo-regular-webfont.woff +0 -0
  159. data/vendor/assets/javascripts/method-draw-js/css/font-files/euphoriascript-regular-webfont.woff +0 -0
  160. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood-webfont.eot +0 -0
  161. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood-webfont.svg +939 -0
  162. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood-webfont.ttf +0 -0
  163. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood-webfont.woff +0 -0
  164. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood_italic-webfont.eot +0 -0
  165. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood_italic-webfont.svg +682 -0
  166. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood_italic-webfont.ttf +0 -0
  167. data/vendor/assets/javascripts/method-draw-js/css/font-files/fanwood_italic-webfont.woff +0 -0
  168. data/vendor/assets/javascripts/method-draw-js/css/font-files/fertigo-webfont.eot +0 -0
  169. data/vendor/assets/javascripts/method-draw-js/css/font-files/fertigo-webfont.ttf +0 -0
  170. data/vendor/assets/javascripts/method-draw-js/css/font-files/fertigo-webfont.woff +0 -0
  171. data/vendor/assets/javascripts/method-draw-js/css/font-files/oswald-bold-webfont.woff +0 -0
  172. data/vendor/assets/javascripts/method-draw-js/css/font-files/oswald-light-webfont.woff +0 -0
  173. data/vendor/assets/javascripts/method-draw-js/css/font-files/shadowsintolight-webfont.woff +0 -0
  174. data/vendor/assets/javascripts/method-draw-js/css/font-files/simonetta-black-webfont.woff +0 -0
  175. data/vendor/assets/javascripts/method-draw-js/css/font-files/simonetta-blackitalic-webfont.woff +0 -0
  176. data/vendor/assets/javascripts/method-draw-js/css/font-files/simonetta-italic-webfont.ttf +0 -0
  177. data/vendor/assets/javascripts/method-draw-js/css/font-files/simonetta-regular-webfont.woff +0 -0
  178. data/vendor/assets/javascripts/method-draw-js/css/font-files/test.html +62 -0
  179. data/vendor/assets/javascripts/method-draw-js/css/font-files/test.svg +15 -0
  180. data/vendor/assets/javascripts/method-draw-js/css/font-files/test_ff.svg +16 -0
  181. data/vendor/assets/javascripts/method-draw-js/css/font-files/test_ffsvg.svg +13 -0
  182. data/vendor/assets/javascripts/method-draw-js/css/fonts.css +72 -0
  183. data/vendor/assets/javascripts/method-draw-js/css/method-draw.compiled.css +417 -0
  184. data/vendor/assets/javascripts/method-draw-js/css/method-draw.css +2083 -0
  185. data/vendor/assets/javascripts/method-draw-js/embedapi.html +56 -0
  186. data/vendor/assets/javascripts/method-draw-js/extensions/closepath_icons.svg +41 -0
  187. data/vendor/assets/javascripts/method-draw-js/extensions/ext-arrows.js +298 -0
  188. data/vendor/assets/javascripts/method-draw-js/extensions/ext-closepath.js +92 -0
  189. data/vendor/assets/javascripts/method-draw-js/extensions/ext-connector.js +587 -0
  190. data/vendor/assets/javascripts/method-draw-js/extensions/ext-eyedropper.js +135 -0
  191. data/vendor/assets/javascripts/method-draw-js/extensions/ext-foreignobject.js +277 -0
  192. data/vendor/assets/javascripts/method-draw-js/extensions/ext-grid.js +186 -0
  193. data/vendor/assets/javascripts/method-draw-js/extensions/ext-helloworld.js +78 -0
  194. data/vendor/assets/javascripts/method-draw-js/extensions/ext-imagelib.js +444 -0
  195. data/vendor/assets/javascripts/method-draw-js/extensions/ext-imagelib.xml +14 -0
  196. data/vendor/assets/javascripts/method-draw-js/extensions/ext-markers.js +576 -0
  197. data/vendor/assets/javascripts/method-draw-js/extensions/ext-server_moinsave.js +56 -0
  198. data/vendor/assets/javascripts/method-draw-js/extensions/ext-server_opensave.js +180 -0
  199. data/vendor/assets/javascripts/method-draw-js/extensions/ext-shapes.js +358 -0
  200. data/vendor/assets/javascripts/method-draw-js/extensions/ext-shapes.png +0 -0
  201. data/vendor/assets/javascripts/method-draw-js/extensions/ext-shapes.xml +8 -0
  202. data/vendor/assets/javascripts/method-draw-js/extensions/eyedropper-icon.xml +17 -0
  203. data/vendor/assets/javascripts/method-draw-js/extensions/eyedropper.png +0 -0
  204. data/vendor/assets/javascripts/method-draw-js/extensions/eyedropper.svg +15 -0
  205. data/vendor/assets/javascripts/method-draw-js/extensions/fileopen.php +31 -0
  206. data/vendor/assets/javascripts/method-draw-js/extensions/filesave.php +44 -0
  207. data/vendor/assets/javascripts/method-draw-js/extensions/foreignobject-icons.xml +96 -0
  208. data/vendor/assets/javascripts/method-draw-js/extensions/grid-icon.xml +30 -0
  209. data/vendor/assets/javascripts/method-draw-js/extensions/helloworld-icon.xml +21 -0
  210. data/vendor/assets/javascripts/method-draw-js/extensions/imagelib/index.html +64 -0
  211. data/vendor/assets/javascripts/method-draw-js/extensions/imagelib/smiley.svg +12 -0
  212. data/vendor/assets/javascripts/method-draw-js/extensions/markers-icons.xml +115 -0
  213. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib.png +0 -0
  214. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib.svg +10 -0
  215. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/arrow.json +40 -0
  216. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/dialog_balloon.json +14 -0
  217. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/flowchart.json +20 -0
  218. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/game.json +13 -0
  219. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/math.json +8 -0
  220. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/misc.json +6 -0
  221. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/music.json +21 -0
  222. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/nature.json +36 -0
  223. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/object.json +30 -0
  224. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/raphael.txt +12 -0
  225. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/raphael_1.json +7 -0
  226. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/social.json +21 -0
  227. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/symbol.json +35 -0
  228. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/ui.json +57 -0
  229. data/vendor/assets/javascripts/method-draw-js/extensions/shapelib/weather.json +26 -0
  230. data/vendor/assets/javascripts/method-draw-js/icons/jquery.svgicons.js +471 -0
  231. data/vendor/assets/javascripts/method-draw-js/images/AlphaBar.png +0 -0
  232. data/vendor/assets/javascripts/method-draw-js/images/Bars.png +0 -0
  233. data/vendor/assets/javascripts/method-draw-js/images/Maps.png +0 -0
  234. data/vendor/assets/javascripts/method-draw-js/images/NoColor.png +0 -0
  235. data/vendor/assets/javascripts/method-draw-js/images/README.txt +61 -0
  236. data/vendor/assets/javascripts/method-draw-js/images/align-bottom.png +0 -0
  237. data/vendor/assets/javascripts/method-draw-js/images/align-bottom.svg +1 -0
  238. data/vendor/assets/javascripts/method-draw-js/images/align-center.png +0 -0
  239. data/vendor/assets/javascripts/method-draw-js/images/align-center.svg +1 -0
  240. data/vendor/assets/javascripts/method-draw-js/images/align-left.png +0 -0
  241. data/vendor/assets/javascripts/method-draw-js/images/align-left.svg +1 -0
  242. data/vendor/assets/javascripts/method-draw-js/images/align-middle.png +0 -0
  243. data/vendor/assets/javascripts/method-draw-js/images/align-middle.svg +1 -0
  244. data/vendor/assets/javascripts/method-draw-js/images/align-right.png +0 -0
  245. data/vendor/assets/javascripts/method-draw-js/images/align-right.svg +1 -0
  246. data/vendor/assets/javascripts/method-draw-js/images/align-top.png +0 -0
  247. data/vendor/assets/javascripts/method-draw-js/images/align-top.svg +1 -0
  248. data/vendor/assets/javascripts/method-draw-js/images/bar-opacity.png +0 -0
  249. data/vendor/assets/javascripts/method-draw-js/images/bold.png +0 -0
  250. data/vendor/assets/javascripts/method-draw-js/images/cancel.png +0 -0
  251. data/vendor/assets/javascripts/method-draw-js/images/circle.png +0 -0
  252. data/vendor/assets/javascripts/method-draw-js/images/clear.png +0 -0
  253. data/vendor/assets/javascripts/method-draw-js/images/clone.png +0 -0
  254. data/vendor/assets/javascripts/method-draw-js/images/conn.svg +29 -0
  255. data/vendor/assets/javascripts/method-draw-js/images/copy.png +0 -0
  256. data/vendor/assets/javascripts/method-draw-js/images/cross.png +0 -0
  257. data/vendor/assets/javascripts/method-draw-js/images/cut.png +0 -0
  258. data/vendor/assets/javascripts/method-draw-js/images/delete.png +0 -0
  259. data/vendor/assets/javascripts/method-draw-js/images/document-properties.png +0 -0
  260. data/vendor/assets/javascripts/method-draw-js/images/drag.png +0 -0
  261. data/vendor/assets/javascripts/method-draw-js/images/dragging.png +0 -0
  262. data/vendor/assets/javascripts/method-draw-js/images/dropdown.gif +0 -0
  263. data/vendor/assets/javascripts/method-draw-js/images/ellipse.png +0 -0
  264. data/vendor/assets/javascripts/method-draw-js/images/ellipse.svg +8 -0
  265. data/vendor/assets/javascripts/method-draw-js/images/eye.png +0 -0
  266. data/vendor/assets/javascripts/method-draw-js/images/eye.svg +1 -0
  267. data/vendor/assets/javascripts/method-draw-js/images/eyedropper.png +0 -0
  268. data/vendor/assets/javascripts/method-draw-js/images/eyedropper_tool.png +0 -0
  269. data/vendor/assets/javascripts/method-draw-js/images/fhpath.png +0 -0
  270. data/vendor/assets/javascripts/method-draw-js/images/flyouth.png +0 -0
  271. data/vendor/assets/javascripts/method-draw-js/images/flyup.gif +0 -0
  272. data/vendor/assets/javascripts/method-draw-js/images/freehand-circle.png +0 -0
  273. data/vendor/assets/javascripts/method-draw-js/images/freehand-square.png +0 -0
  274. data/vendor/assets/javascripts/method-draw-js/images/go-down.png +0 -0
  275. data/vendor/assets/javascripts/method-draw-js/images/go-up.png +0 -0
  276. data/vendor/assets/javascripts/method-draw-js/images/image.png +0 -0
  277. data/vendor/assets/javascripts/method-draw-js/images/image.svg +12 -0
  278. data/vendor/assets/javascripts/method-draw-js/images/italic.png +0 -0
  279. data/vendor/assets/javascripts/method-draw-js/images/italic.svg +1 -0
  280. data/vendor/assets/javascripts/method-draw-js/images/line.png +0 -0
  281. data/vendor/assets/javascripts/method-draw-js/images/link_controls.png +0 -0
  282. data/vendor/assets/javascripts/method-draw-js/images/logo.png +0 -0
  283. data/vendor/assets/javascripts/method-draw-js/images/map-opacity.png +0 -0
  284. data/vendor/assets/javascripts/method-draw-js/images/mappoint.gif +0 -0
  285. data/vendor/assets/javascripts/method-draw-js/images/mappoint_c.png +0 -0
  286. data/vendor/assets/javascripts/method-draw-js/images/mappoint_f.png +0 -0
  287. data/vendor/assets/javascripts/method-draw-js/images/move_bottom.png +0 -0
  288. data/vendor/assets/javascripts/method-draw-js/images/move_top.png +0 -0
  289. data/vendor/assets/javascripts/method-draw-js/images/node_clone.png +0 -0
  290. data/vendor/assets/javascripts/method-draw-js/images/node_delete.png +0 -0
  291. data/vendor/assets/javascripts/method-draw-js/images/none.png +0 -0
  292. data/vendor/assets/javascripts/method-draw-js/images/open.png +0 -0
  293. data/vendor/assets/javascripts/method-draw-js/images/paste.png +0 -0
  294. data/vendor/assets/javascripts/method-draw-js/images/path.png +0 -0
  295. data/vendor/assets/javascripts/method-draw-js/images/path.svg +10 -0
  296. data/vendor/assets/javascripts/method-draw-js/images/pencil.png +0 -0
  297. data/vendor/assets/javascripts/method-draw-js/images/pencil.svg +11 -0
  298. data/vendor/assets/javascripts/method-draw-js/images/pencil_cursor.png +0 -0
  299. data/vendor/assets/javascripts/method-draw-js/images/picker.gif +0 -0
  300. data/vendor/assets/javascripts/method-draw-js/images/placeholder.svg +10 -0
  301. data/vendor/assets/javascripts/method-draw-js/images/polygon.png +0 -0
  302. data/vendor/assets/javascripts/method-draw-js/images/polygon.svg +1 -0
  303. data/vendor/assets/javascripts/method-draw-js/images/preview-opacity.png +0 -0
  304. data/vendor/assets/javascripts/method-draw-js/images/rangearrows.gif +0 -0
  305. data/vendor/assets/javascripts/method-draw-js/images/rangearrows2.gif +0 -0
  306. data/vendor/assets/javascripts/method-draw-js/images/rect.png +0 -0
  307. data/vendor/assets/javascripts/method-draw-js/images/redo.png +0 -0
  308. data/vendor/assets/javascripts/method-draw-js/images/reorient.png +0 -0
  309. data/vendor/assets/javascripts/method-draw-js/images/rotate.png +0 -0
  310. data/vendor/assets/javascripts/method-draw-js/images/save.png +0 -0
  311. data/vendor/assets/javascripts/method-draw-js/images/select.png +0 -0
  312. data/vendor/assets/javascripts/method-draw-js/images/select.svg +10 -0
  313. data/vendor/assets/javascripts/method-draw-js/images/select_node.png +0 -0
  314. data/vendor/assets/javascripts/method-draw-js/images/sep.png +0 -0
  315. data/vendor/assets/javascripts/method-draw-js/images/shape_group.png +0 -0
  316. data/vendor/assets/javascripts/method-draw-js/images/shape_ungroup.png +0 -0
  317. data/vendor/assets/javascripts/method-draw-js/images/source.png +0 -0
  318. data/vendor/assets/javascripts/method-draw-js/images/spinbtn_updn_big.png +0 -0
  319. data/vendor/assets/javascripts/method-draw-js/images/square.png +0 -0
  320. data/vendor/assets/javascripts/method-draw-js/images/svg_edit_icons.svg +455 -0
  321. data/vendor/assets/javascripts/method-draw-js/images/svg_edit_icons.svgz +0 -0
  322. data/vendor/assets/javascripts/method-draw-js/images/text.png +0 -0
  323. data/vendor/assets/javascripts/method-draw-js/images/text.svg +10 -0
  324. data/vendor/assets/javascripts/method-draw-js/images/to_path.png +0 -0
  325. data/vendor/assets/javascripts/method-draw-js/images/undo.png +0 -0
  326. data/vendor/assets/javascripts/method-draw-js/images/view-refresh.png +0 -0
  327. data/vendor/assets/javascripts/method-draw-js/images/wave.png +0 -0
  328. data/vendor/assets/javascripts/method-draw-js/images/wireframe.png +0 -0
  329. data/vendor/assets/javascripts/method-draw-js/images/zoom.png +0 -0
  330. data/vendor/assets/javascripts/method-draw-js/images/zoom.svg +12 -0
  331. data/vendor/assets/javascripts/method-draw-js/index.html +631 -0
  332. data/vendor/assets/javascripts/method-draw-js/lib/canvg/canvg.js +2620 -0
  333. data/vendor/assets/javascripts/method-draw-js/lib/canvg/rgbcolor.js +287 -0
  334. data/vendor/assets/javascripts/method-draw-js/lib/contextmenu.js +68 -0
  335. data/vendor/assets/javascripts/method-draw-js/lib/contextmenu/jquery.contextMenu.js +223 -0
  336. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/LICENSE +202 -0
  337. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/README +3 -0
  338. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/css/jPicker.css +250 -0
  339. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/css/jgraduate.css +332 -0
  340. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/AlphaBar.png +0 -0
  341. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/Bars.png +0 -0
  342. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/Maps.png +0 -0
  343. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/NoColor.png +0 -0
  344. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/bar-opacity.png +0 -0
  345. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/eyedropper.png +0 -0
  346. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/map-opacity.png +0 -0
  347. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/mappoint.gif +0 -0
  348. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/mappoint_c.png +0 -0
  349. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/mappoint_f.png +0 -0
  350. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/picker.gif +0 -0
  351. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/preview-opacity.png +0 -0
  352. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/rangearrows.gif +0 -0
  353. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/images/rangearrows2.gif +0 -0
  354. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/jpicker.min.js +2087 -0
  355. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/jquery.jgraduate.js +1175 -0
  356. data/vendor/assets/javascripts/method-draw-js/lib/jgraduate/jquery.jgraduate.min.js +37 -0
  357. data/vendor/assets/javascripts/method-draw-js/lib/jquery-draginput.js +181 -0
  358. data/vendor/assets/javascripts/method-draw-js/lib/jquery-ui/jquery-ui-1.8.17.custom.min.js +54 -0
  359. data/vendor/assets/javascripts/method-draw-js/lib/jquery-ui/jquery-ui-1.8.custom.min.js +84 -0
  360. data/vendor/assets/javascripts/method-draw-js/lib/jquery.js +2 -0
  361. data/vendor/assets/javascripts/method-draw-js/lib/jquerybbq/jquery.bbq.min.js +18 -0
  362. data/vendor/assets/javascripts/method-draw-js/lib/js-hotkeys/README.md +45 -0
  363. data/vendor/assets/javascripts/method-draw-js/lib/js-hotkeys/jquery.hotkeys.min.js +15 -0
  364. data/vendor/assets/javascripts/method-draw-js/lib/mousewheel.js +84 -0
  365. data/vendor/assets/javascripts/method-draw-js/lib/requestanimationframe.js +24 -0
  366. data/vendor/assets/javascripts/method-draw-js/lib/taphold.js +136 -0
  367. data/vendor/assets/javascripts/method-draw-js/lib/touch.js +28 -0
  368. data/vendor/assets/javascripts/method-draw-js/method-draw.compiled.css +417 -0
  369. data/vendor/assets/javascripts/method-draw-js/method-draw.compiled.js +692 -0
  370. data/vendor/assets/javascripts/method-draw-js/method-draw.manifest +121 -0
  371. data/vendor/assets/javascripts/method-draw-js/src/browser.js +181 -0
  372. data/vendor/assets/javascripts/method-draw-js/src/dialog.js +49 -0
  373. data/vendor/assets/javascripts/method-draw-js/src/dragupload.js +11 -0
  374. data/vendor/assets/javascripts/method-draw-js/src/draw.js +533 -0
  375. data/vendor/assets/javascripts/method-draw-js/src/embedapi.js +173 -0
  376. data/vendor/assets/javascripts/method-draw-js/src/history.js +601 -0
  377. data/vendor/assets/javascripts/method-draw-js/src/math.js +247 -0
  378. data/vendor/assets/javascripts/method-draw-js/src/method-draw.js +4140 -0
  379. data/vendor/assets/javascripts/method-draw-js/src/path.js +979 -0
  380. data/vendor/assets/javascripts/method-draw-js/src/sanitize.js +273 -0
  381. data/vendor/assets/javascripts/method-draw-js/src/select.js +608 -0
  382. data/vendor/assets/javascripts/method-draw-js/src/svgcanvas.js +9047 -0
  383. data/vendor/assets/javascripts/method-draw-js/src/svgtransformlist.js +291 -0
  384. data/vendor/assets/javascripts/method-draw-js/src/svgutils.js +648 -0
  385. data/vendor/assets/javascripts/method-draw-js/src/units.js +281 -0
  386. data/vendor/assets/javascripts/method-draw-js/svgedit.compiled.css +417 -0
  387. data/vendor/assets/javascripts/method-draw-js/svgedit.compiled.js +691 -0
  388. data/vendor/assets/javascripts/method-draw-js/temp.css +2665 -0
  389. metadata +619 -0
@@ -0,0 +1,291 @@
1
+ /**
2
+ * SVGTransformList
3
+ *
4
+ * Licensed under the Apache License, Version 2
5
+ *
6
+ * Copyright(c) 2010 Alexis Deveria
7
+ * Copyright(c) 2010 Jeff Schiller
8
+ */
9
+
10
+ // Dependencies:
11
+ // 1) browser.js
12
+
13
+ var svgedit = svgedit || {};
14
+
15
+ (function() {
16
+
17
+ if (!svgedit.transformlist) {
18
+ svgedit.transformlist = {};
19
+ }
20
+
21
+ var svgroot = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
22
+
23
+ // Helper function.
24
+ function transformToString(xform) {
25
+ var m = xform.matrix,
26
+ text = "";
27
+ switch(xform.type) {
28
+ case 1: // MATRIX
29
+ text = "matrix(" + [m.a,m.b,m.c,m.d,m.e,m.f].join(",") + ")";
30
+ break;
31
+ case 2: // TRANSLATE
32
+ text = "translate(" + m.e + "," + m.f + ")";
33
+ break;
34
+ case 3: // SCALE
35
+ if (m.a == m.d) text = "scale(" + m.a + ")";
36
+ else text = "scale(" + m.a + "," + m.d + ")";
37
+ break;
38
+ case 4: // ROTATE
39
+ var cx = 0, cy = 0;
40
+ // this prevents divide by zero
41
+ if (xform.angle != 0) {
42
+ var K = 1 - m.a;
43
+ cy = ( K * m.f + m.b*m.e ) / ( K*K + m.b*m.b );
44
+ cx = ( m.e - m.b * cy ) / K;
45
+ }
46
+ text = "rotate(" + xform.angle + " " + cx + "," + cy + ")";
47
+ break;
48
+ }
49
+ return text;
50
+ };
51
+
52
+
53
+ /**
54
+ * Map of SVGTransformList objects.
55
+ */
56
+ var listMap_ = {};
57
+
58
+
59
+ // **************************************************************************************
60
+ // SVGTransformList implementation for Webkit
61
+ // These methods do not currently raise any exceptions.
62
+ // These methods also do not check that transforms are being inserted. This is basically
63
+ // implementing as much of SVGTransformList that we need to get the job done.
64
+ //
65
+ // interface SVGEditTransformList {
66
+ // attribute unsigned long numberOfItems;
67
+ // void clear ( )
68
+ // SVGTransform initialize ( in SVGTransform newItem )
69
+ // SVGTransform getItem ( in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
70
+ // SVGTransform insertItemBefore ( in SVGTransform newItem, in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
71
+ // SVGTransform replaceItem ( in SVGTransform newItem, in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
72
+ // SVGTransform removeItem ( in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
73
+ // SVGTransform appendItem ( in SVGTransform newItem )
74
+ // NOT IMPLEMENTED: SVGTransform createSVGTransformFromMatrix ( in SVGMatrix matrix );
75
+ // NOT IMPLEMENTED: SVGTransform consolidate ( );
76
+ // }
77
+ // **************************************************************************************
78
+ svgedit.transformlist.SVGTransformList = function(elem) {
79
+ this._elem = elem || null;
80
+ this._xforms = [];
81
+ // TODO: how do we capture the undo-ability in the changed transform list?
82
+ this._update = function() {
83
+ var tstr = "";
84
+ var concatMatrix = svgroot.createSVGMatrix();
85
+ for (var i = 0; i < this.numberOfItems; ++i) {
86
+ var xform = this._list.getItem(i);
87
+ tstr += transformToString(xform) + " ";
88
+ }
89
+ this._elem.setAttribute("transform", tstr);
90
+ };
91
+ this._list = this;
92
+ this._init = function() {
93
+ // Transform attribute parser
94
+ var str = this._elem.getAttribute("transform");
95
+ if(!str) return;
96
+
97
+ // TODO: Add skew support in future
98
+ var re = /\s*((scale|matrix|rotate|translate)\s*\(.*?\))\s*,?\s*/;
99
+ var arr = [];
100
+ var m = true;
101
+ while(m) {
102
+ m = str.match(re);
103
+ str = str.replace(re,'');
104
+ if(m && m[1]) {
105
+ var x = m[1];
106
+ var bits = x.split(/\s*\(/);
107
+ var name = bits[0];
108
+ var val_bits = bits[1].match(/\s*(.*?)\s*\)/);
109
+ val_bits[1] = val_bits[1].replace(/(\d)-/g, "$1 -");
110
+ var val_arr = val_bits[1].split(/[, ]+/);
111
+ var letters = 'abcdef'.split('');
112
+ var mtx = svgroot.createSVGMatrix();
113
+ $.each(val_arr, function(i, item) {
114
+ val_arr[i] = parseFloat(item);
115
+ if(name == 'matrix') {
116
+ mtx[letters[i]] = val_arr[i];
117
+ }
118
+ });
119
+ var xform = svgroot.createSVGTransform();
120
+ var fname = 'set' + name.charAt(0).toUpperCase() + name.slice(1);
121
+ var values = name=='matrix'?[mtx]:val_arr;
122
+
123
+ if (name == 'scale' && values.length == 1) {
124
+ values.push(values[0]);
125
+ } else if (name == 'translate' && values.length == 1) {
126
+ values.push(0);
127
+ } else if (name == 'rotate' && values.length == 1) {
128
+ values.push(0);
129
+ values.push(0);
130
+ }
131
+ xform[fname].apply(xform, values);
132
+ this._list.appendItem(xform);
133
+ }
134
+ }
135
+ };
136
+ this._removeFromOtherLists = function(item) {
137
+ if (item) {
138
+ // Check if this transform is already in a transformlist, and
139
+ // remove it if so.
140
+ var found = false;
141
+ for (var id in listMap_) {
142
+ var tl = listMap_[id];
143
+ for (var i = 0, len = tl._xforms.length; i < len; ++i) {
144
+ if(tl._xforms[i] == item) {
145
+ found = true;
146
+ tl.removeItem(i);
147
+ break;
148
+ }
149
+ }
150
+ if (found) {
151
+ break;
152
+ }
153
+ }
154
+ }
155
+ };
156
+
157
+ this.numberOfItems = 0;
158
+ this.clear = function() {
159
+ this.numberOfItems = 0;
160
+ this._xforms = [];
161
+ };
162
+
163
+ this.initialize = function(newItem) {
164
+ this.numberOfItems = 1;
165
+ this._removeFromOtherLists(newItem);
166
+ this._xforms = [newItem];
167
+ };
168
+
169
+ this.getItem = function(index) {
170
+ if (index < this.numberOfItems && index >= 0) {
171
+ return this._xforms[index];
172
+ }
173
+ throw {code: 1}; // DOMException with code=INDEX_SIZE_ERR
174
+ };
175
+
176
+ this.insertItemBefore = function(newItem, index) {
177
+ var retValue = null;
178
+ if (index >= 0) {
179
+ if (index < this.numberOfItems) {
180
+ this._removeFromOtherLists(newItem);
181
+ var newxforms = new Array(this.numberOfItems + 1);
182
+ // TODO: use array copying and slicing
183
+ for ( var i = 0; i < index; ++i) {
184
+ newxforms[i] = this._xforms[i];
185
+ }
186
+ newxforms[i] = newItem;
187
+ for ( var j = i+1; i < this.numberOfItems; ++j, ++i) {
188
+ newxforms[j] = this._xforms[i];
189
+ }
190
+ this.numberOfItems++;
191
+ this._xforms = newxforms;
192
+ retValue = newItem;
193
+ this._list._update();
194
+ }
195
+ else {
196
+ retValue = this._list.appendItem(newItem);
197
+ }
198
+ }
199
+ return retValue;
200
+ };
201
+
202
+ this.replaceItem = function(newItem, index) {
203
+ var retValue = null;
204
+ if (index < this.numberOfItems && index >= 0) {
205
+ this._removeFromOtherLists(newItem);
206
+ this._xforms[index] = newItem;
207
+ retValue = newItem;
208
+ this._list._update();
209
+ }
210
+ return retValue;
211
+ };
212
+
213
+ this.removeItem = function(index) {
214
+ if (index < this.numberOfItems && index >= 0) {
215
+ var retValue = this._xforms[index];
216
+ var newxforms = new Array(this.numberOfItems - 1);
217
+ for (var i = 0; i < index; ++i) {
218
+ newxforms[i] = this._xforms[i];
219
+ }
220
+ for (var j = i; j < this.numberOfItems-1; ++j, ++i) {
221
+ newxforms[j] = this._xforms[i+1];
222
+ }
223
+ this.numberOfItems--;
224
+ this._xforms = newxforms;
225
+ this._list._update();
226
+ return retValue;
227
+ } else {
228
+ throw {code: 1}; // DOMException with code=INDEX_SIZE_ERR
229
+ }
230
+ };
231
+
232
+ this.appendItem = function(newItem) {
233
+ this._removeFromOtherLists(newItem);
234
+ this._xforms.push(newItem);
235
+ this.numberOfItems++;
236
+ this._list._update();
237
+ return newItem;
238
+ };
239
+ };
240
+
241
+
242
+ svgedit.transformlist.resetListMap = function() {
243
+ listMap_ = {};
244
+ };
245
+
246
+ /**
247
+ * Removes transforms of the given element from the map.
248
+ * Parameters:
249
+ * elem - a DOM Element
250
+ */
251
+ svgedit.transformlist.removeElementFromListMap = function(elem) {
252
+ if (elem.id && listMap_[elem.id]) {
253
+ delete listMap_[elem.id];
254
+ }
255
+ };
256
+
257
+ // Function: getTransformList
258
+ // Returns an object that behaves like a SVGTransformList for the given DOM element
259
+ //
260
+ // Parameters:
261
+ // elem - DOM element to get a transformlist from
262
+ svgedit.transformlist.getTransformList = function(elem) {
263
+ if (!svgedit.browser.supportsNativeTransformLists()) {
264
+ var id = elem.id;
265
+ if(!id) {
266
+ // Get unique ID for temporary element
267
+ id = 'temp';
268
+ }
269
+ var t = listMap_[id];
270
+ if (!t || id == 'temp') {
271
+ listMap_[id] = new svgedit.transformlist.SVGTransformList(elem);
272
+ listMap_[id]._init();
273
+ t = listMap_[id];
274
+ }
275
+ return t;
276
+ }
277
+ else if (elem.transform) {
278
+ return elem.transform.baseVal;
279
+ }
280
+ else if (elem.gradientTransform) {
281
+ return elem.gradientTransform.baseVal;
282
+ }
283
+ else if (elem.patternTransform) {
284
+ return elem.patternTransform.baseVal;
285
+ }
286
+
287
+ return null;
288
+ };
289
+
290
+
291
+ })();
@@ -0,0 +1,648 @@
1
+ /**
2
+ * Package: svgedit.utilities
3
+ *
4
+ * Licensed under the Apache License, Version 2
5
+ *
6
+ * Copyright(c) 2010 Alexis Deveria
7
+ * Copyright(c) 2010 Jeff Schiller
8
+ */
9
+
10
+ // Dependencies:
11
+ // 1) jQuery
12
+ // 2) browser.js
13
+ // 3) svgtransformlist.js
14
+
15
+ var svgedit = svgedit || {};
16
+
17
+ (function() {
18
+
19
+ if (!svgedit.utilities) {
20
+ svgedit.utilities = {};
21
+ }
22
+
23
+ // Constants
24
+
25
+ // String used to encode base64.
26
+ var KEYSTR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
27
+ var SVGNS = 'http://www.w3.org/2000/svg';
28
+ var XLINKNS = 'http://www.w3.org/1999/xlink';
29
+ var XMLNS = "http://www.w3.org/XML/1998/namespace";
30
+
31
+ // Much faster than running getBBox() every time
32
+ var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use';
33
+ var visElems_arr = visElems.split(',');
34
+ //var hidElems = 'clipPath,defs,desc,feGaussianBlur,filter,linearGradient,marker,mask,metadata,pattern,radialGradient,stop,switch,symbol,title,textPath';
35
+
36
+ var editorContext_ = null;
37
+ var domdoc_ = null;
38
+ var domcontainer_ = null;
39
+ var svgroot_ = null;
40
+
41
+ svgedit.utilities.init = function(editorContext) {
42
+ editorContext_ = editorContext;
43
+ domdoc_ = editorContext.getDOMDocument();
44
+ domcontainer_ = editorContext.getDOMContainer();
45
+ svgroot_ = editorContext.getSVGRoot();
46
+ };
47
+
48
+ // Function: svgedit.utilities.toXml
49
+ // Converts characters in a string to XML-friendly entities.
50
+ //
51
+ // Example: "&" becomes "&amp;"
52
+ //
53
+ // Parameters:
54
+ // str - The string to be converted
55
+ //
56
+ // Returns:
57
+ // The converted string
58
+ svgedit.utilities.toXml = function(str) {
59
+ return $('<p/>').text(str).html();
60
+ };
61
+
62
+ // Function: svgedit.utilities.fromXml
63
+ // Converts XML entities in a string to single characters.
64
+ // Example: "&amp;" becomes "&"
65
+ //
66
+ // Parameters:
67
+ // str - The string to be converted
68
+ //
69
+ // Returns:
70
+ // The converted string
71
+ svgedit.utilities.fromXml = function(str) {
72
+ return $('<p/>').html(str).text();
73
+ };
74
+
75
+ // This code was written by Tyler Akins and has been placed in the
76
+ // public domain. It would be nice if you left this header intact.
77
+ // Base64 code from Tyler Akins -- http://rumkin.com
78
+
79
+ // schiller: Removed string concatenation in favour of Array.join() optimization,
80
+ // also precalculate the size of the array needed.
81
+
82
+ // Function: svgedit.utilities.encode64
83
+ // Converts a string to base64
84
+ svgedit.utilities.encode64 = function(input) {
85
+ // base64 strings are 4/3 larger than the original string
86
+ // input = svgedit.utilities.encodeUTF8(input); // convert non-ASCII characters
87
+ input = svgedit.utilities.convertToXMLReferences(input);
88
+ if(window.btoa) return window.btoa(input); // Use native if available
89
+ var output = new Array( Math.floor( (input.length + 2) / 3 ) * 4 );
90
+ var chr1, chr2, chr3;
91
+ var enc1, enc2, enc3, enc4;
92
+ var i = 0, p = 0;
93
+
94
+ do {
95
+ chr1 = input.charCodeAt(i++);
96
+ chr2 = input.charCodeAt(i++);
97
+ chr3 = input.charCodeAt(i++);
98
+
99
+ enc1 = chr1 >> 2;
100
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
101
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
102
+ enc4 = chr3 & 63;
103
+
104
+ if (isNaN(chr2)) {
105
+ enc3 = enc4 = 64;
106
+ } else if (isNaN(chr3)) {
107
+ enc4 = 64;
108
+ }
109
+
110
+ output[p++] = KEYSTR.charAt(enc1);
111
+ output[p++] = KEYSTR.charAt(enc2);
112
+ output[p++] = KEYSTR.charAt(enc3);
113
+ output[p++] = KEYSTR.charAt(enc4);
114
+ } while (i < input.length);
115
+
116
+ return output.join('');
117
+ };
118
+
119
+ // Function: svgedit.utilities.decode64
120
+ // Converts a string from base64
121
+ svgedit.utilities.decode64 = function(input) {
122
+ if(window.atob) return window.atob(input);
123
+ var output = "";
124
+ var chr1, chr2, chr3 = "";
125
+ var enc1, enc2, enc3, enc4 = "";
126
+ var i = 0;
127
+
128
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
129
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
130
+
131
+ do {
132
+ enc1 = KEYSTR.indexOf(input.charAt(i++));
133
+ enc2 = KEYSTR.indexOf(input.charAt(i++));
134
+ enc3 = KEYSTR.indexOf(input.charAt(i++));
135
+ enc4 = KEYSTR.indexOf(input.charAt(i++));
136
+
137
+ chr1 = (enc1 << 2) | (enc2 >> 4);
138
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
139
+ chr3 = ((enc3 & 3) << 6) | enc4;
140
+
141
+ output = output + String.fromCharCode(chr1);
142
+
143
+ if (enc3 != 64) {
144
+ output = output + String.fromCharCode(chr2);
145
+ }
146
+ if (enc4 != 64) {
147
+ output = output + String.fromCharCode(chr3);
148
+ }
149
+
150
+ chr1 = chr2 = chr3 = "";
151
+ enc1 = enc2 = enc3 = enc4 = "";
152
+
153
+ } while (i < input.length);
154
+ return unescape(output);
155
+ };
156
+
157
+ // Currently not being used, so commented out for now
158
+ // based on http://phpjs.org/functions/utf8_encode:577
159
+ // codedread:does not seem to work with webkit-based browsers on OSX
160
+ // "encodeUTF8": function(input) {
161
+ // //return unescape(encodeURIComponent(input)); //may or may not work
162
+ // var output = '';
163
+ // for (var n = 0; n < input.length; n++){
164
+ // var c = input.charCodeAt(n);
165
+ // if (c < 128) {
166
+ // output += input[n];
167
+ // }
168
+ // else if (c > 127) {
169
+ // if (c < 2048){
170
+ // output += String.fromCharCode((c >> 6) | 192);
171
+ // }
172
+ // else {
173
+ // output += String.fromCharCode((c >> 12) | 224) + String.fromCharCode((c >> 6) & 63 | 128);
174
+ // }
175
+ // output += String.fromCharCode((c & 63) | 128);
176
+ // }
177
+ // }
178
+ // return output;
179
+ // },
180
+
181
+ // Function: svgedit.utilities.convertToXMLReferences
182
+ // Converts a string to use XML references
183
+ svgedit.utilities.convertToXMLReferences = function(input) {
184
+ var output = '';
185
+ for (var n = 0; n < input.length; n++){
186
+ var c = input.charCodeAt(n);
187
+ if (c < 128) {
188
+ output += input[n];
189
+ } else if(c > 127) {
190
+ output += ("&#" + c + ";");
191
+ }
192
+ }
193
+ return output;
194
+ };
195
+
196
+ // Function: svgedit.utilities.text2xml
197
+ // Cross-browser compatible method of converting a string to an XML tree
198
+ // found this function here: http://groups.google.com/group/jquery-dev/browse_thread/thread/c6d11387c580a77f
199
+ svgedit.utilities.text2xml = function(sXML) {
200
+ if(sXML.indexOf('<svg:svg') >= 0) {
201
+ sXML = sXML.replace(/<(\/?)svg:/g, '<$1').replace('xmlns:svg', 'xmlns');
202
+ }
203
+
204
+ var out;
205
+ try{
206
+ var dXML = (window.DOMParser)?new DOMParser():new ActiveXObject("Microsoft.XMLDOM");
207
+ dXML.async = false;
208
+ } catch(e){
209
+ throw new Error("XML Parser could not be instantiated");
210
+ };
211
+ try{
212
+ if(dXML.loadXML) out = (dXML.loadXML(sXML))?dXML:false;
213
+ else out = dXML.parseFromString(sXML, "text/xml");
214
+ }
215
+ catch(e){ throw new Error("Error parsing XML string"); };
216
+ return out;
217
+ };
218
+
219
+ // Function: svgedit.utilities.bboxToObj
220
+ // Converts a SVGRect into an object.
221
+ //
222
+ // Parameters:
223
+ // bbox - a SVGRect
224
+ //
225
+ // Returns:
226
+ // An object with properties names x, y, width, height.
227
+ svgedit.utilities.bboxToObj = function(bbox) {
228
+ return {
229
+ x: bbox.x,
230
+ y: bbox.y,
231
+ width: bbox.width,
232
+ height: bbox.height
233
+ }
234
+ };
235
+
236
+ // Function: svgedit.utilities.walkTree
237
+ // Walks the tree and executes the callback on each element in a top-down fashion
238
+ //
239
+ // Parameters:
240
+ // elem - DOM element to traverse
241
+ // cbFn - Callback function to run on each element
242
+ svgedit.utilities.walkTree = function(elem, cbFn){
243
+ if (elem && elem.nodeType == 1) {
244
+ cbFn(elem);
245
+ var i = elem.childNodes.length;
246
+ while (i--) {
247
+ svgedit.utilities.walkTree(elem.childNodes.item(i), cbFn);
248
+ }
249
+ }
250
+ };
251
+
252
+ // Function: svgedit.utilities.walkTreePost
253
+ // Walks the tree and executes the callback on each element in a depth-first fashion
254
+ // TODO: FIXME: Shouldn't this be calling walkTreePost?
255
+ //
256
+ // Parameters:
257
+ // elem - DOM element to traverse
258
+ // cbFn - Callback function to run on each element
259
+ svgedit.utilities.walkTreePost = function(elem, cbFn) {
260
+ if (elem && elem.nodeType == 1) {
261
+ var i = elem.childNodes.length;
262
+ while (i--) {
263
+ svgedit.utilities.walkTree(elem.childNodes.item(i), cbFn);
264
+ }
265
+ cbFn(elem);
266
+ }
267
+ };
268
+
269
+ // Function: svgedit.utilities.getUrlFromAttr
270
+ // Extracts the URL from the url(...) syntax of some attributes.
271
+ // Three variants:
272
+ // * <circle fill="url(someFile.svg#foo)" />
273
+ // * <circle fill="url('someFile.svg#foo')" />
274
+ // * <circle fill='url("someFile.svg#foo")' />
275
+ //
276
+ // Parameters:
277
+ // attrVal - The attribute value as a string
278
+ //
279
+ // Returns:
280
+ // String with just the URL, like someFile.svg#foo
281
+ svgedit.utilities.getUrlFromAttr = function(attrVal) {
282
+ if (attrVal) {
283
+ // url("#somegrad")
284
+ if (attrVal.indexOf('url("') === 0) {
285
+ return attrVal.substring(5,attrVal.indexOf('"',6));
286
+ }
287
+ // url('#somegrad')
288
+ else if (attrVal.indexOf("url('") === 0) {
289
+ return attrVal.substring(5,attrVal.indexOf("'",6));
290
+ }
291
+ else if (attrVal.indexOf("url(") === 0) {
292
+ return attrVal.substring(4,attrVal.indexOf(')'));
293
+ }
294
+ }
295
+ return null;
296
+ };
297
+
298
+ // Function: svgedit.utilities.getHref
299
+ // Returns the given element's xlink:href value
300
+ svgedit.utilities.getHref = function(elem) {
301
+ if (elem) return elem.getAttributeNS(XLINKNS, "href");
302
+ }
303
+
304
+ // Function: svgedit.utilities.setHref
305
+ // Sets the given element's xlink:href value
306
+ svgedit.utilities.setHref = function(elem, val) {
307
+ elem.setAttributeNS(XLINKNS, "xlink:href", val);
308
+ }
309
+
310
+ // Function: findDefs
311
+ // Parameters:
312
+ // svgElement - The <svg> element.
313
+ //
314
+ // Returns:
315
+ // The document's <defs> element, create it first if necessary
316
+ svgedit.utilities.findDefs = function(svgElement) {
317
+ var svgElement = editorContext_.getSVGContent().documentElement;
318
+ var defs = svgElement.getElementsByTagNameNS(SVGNS, "defs");
319
+ if (defs.length > 0) {
320
+ defs = defs[0];
321
+ }
322
+ else {
323
+ // first child is a comment, so call nextSibling
324
+ defs = svgElement.insertBefore( svgElement.ownerDocument.createElementNS(SVGNS, "defs" ), svgElement.firstChild.nextSibling);
325
+ }
326
+ return defs;
327
+ };
328
+
329
+ // TODO(codedread): Consider moving the next to functions to bbox.js
330
+
331
+ // Function: svgedit.utilities.getPathBBox
332
+ // Get correct BBox for a path in Webkit
333
+ // Converted from code found here:
334
+ // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
335
+ //
336
+ // Parameters:
337
+ // path - The path DOM element to get the BBox for
338
+ //
339
+ // Returns:
340
+ // A BBox-like object
341
+ svgedit.utilities.getPathBBox = function(path) {
342
+ var seglist = path.pathSegList;
343
+ var tot = seglist.numberOfItems;
344
+
345
+ var bounds = [[], []];
346
+ var start = seglist.getItem(0);
347
+ var P0 = [start.x, start.y];
348
+
349
+ for(var i=0; i < tot; i++) {
350
+ var seg = seglist.getItem(i);
351
+
352
+ if(typeof seg.x == 'undefined') continue;
353
+
354
+ // Add actual points to limits
355
+ bounds[0].push(P0[0]);
356
+ bounds[1].push(P0[1]);
357
+
358
+ if(seg.x1) {
359
+ var P1 = [seg.x1, seg.y1],
360
+ P2 = [seg.x2, seg.y2],
361
+ P3 = [seg.x, seg.y];
362
+
363
+ for(var j=0; j < 2; j++) {
364
+
365
+ var calc = function(t) {
366
+ return Math.pow(1-t,3) * P0[j]
367
+ + 3 * Math.pow(1-t,2) * t * P1[j]
368
+ + 3 * (1-t) * Math.pow(t,2) * P2[j]
369
+ + Math.pow(t,3) * P3[j];
370
+ };
371
+
372
+ var b = 6 * P0[j] - 12 * P1[j] + 6 * P2[j];
373
+ var a = -3 * P0[j] + 9 * P1[j] - 9 * P2[j] + 3 * P3[j];
374
+ var c = 3 * P1[j] - 3 * P0[j];
375
+
376
+ if(a == 0) {
377
+ if(b == 0) {
378
+ continue;
379
+ }
380
+ var t = -c / b;
381
+ if(0 < t && t < 1) {
382
+ bounds[j].push(calc(t));
383
+ }
384
+ continue;
385
+ }
386
+
387
+ var b2ac = Math.pow(b,2) - 4 * c * a;
388
+ if(b2ac < 0) continue;
389
+ var t1 = (-b + Math.sqrt(b2ac))/(2 * a);
390
+ if(0 < t1 && t1 < 1) bounds[j].push(calc(t1));
391
+ var t2 = (-b - Math.sqrt(b2ac))/(2 * a);
392
+ if(0 < t2 && t2 < 1) bounds[j].push(calc(t2));
393
+ }
394
+ P0 = P3;
395
+ } else {
396
+ bounds[0].push(seg.x);
397
+ bounds[1].push(seg.y);
398
+ }
399
+ }
400
+
401
+ var x = Math.min.apply(null, bounds[0]);
402
+ var w = Math.max.apply(null, bounds[0]) - x;
403
+ var y = Math.min.apply(null, bounds[1]);
404
+ var h = Math.max.apply(null, bounds[1]) - y;
405
+ return {
406
+ 'x': x,
407
+ 'y': y,
408
+ 'width': w,
409
+ 'height': h
410
+ };
411
+ };
412
+
413
+ // Function: groupBBFix
414
+ // Get the given/selected element's bounding box object, checking for
415
+ // horizontal/vertical lines (see issue 717)
416
+ // Note that performance is currently terrible, so some way to improve would
417
+ // be great.
418
+ //
419
+ // Parameters:
420
+ // selected - Container or <use> DOM element
421
+ function groupBBFix(selected) {
422
+ if(svgedit.browser.supportsHVLineContainerBBox()) {
423
+ try { return selected.getBBox();} catch(e){}
424
+ }
425
+ var ref = $.data(selected, 'ref');
426
+ var matched = null;
427
+
428
+ if(ref) {
429
+ var copy = $(ref).children().clone().attr('visibility', 'hidden');
430
+ $(svgroot_).append(copy);
431
+ matched = copy.filter('line, path');
432
+ } else {
433
+ matched = $(selected).find('line, path');
434
+ }
435
+
436
+ var issue = false;
437
+ if(matched.length) {
438
+ matched.each(function() {
439
+ var bb = this.getBBox();
440
+ if(!bb.width || !bb.height) {
441
+ issue = true;
442
+ }
443
+ });
444
+ if(issue) {
445
+ var elems = ref ? copy : $(selected).children();
446
+ ret = getStrokedBBox(elems);
447
+ } else {
448
+ ret = selected.getBBox();
449
+ }
450
+ } else {
451
+ ret = selected.getBBox();
452
+ }
453
+ if(ref) {
454
+ copy.remove();
455
+ }
456
+ return ret;
457
+ }
458
+
459
+ // Function: svgedit.utilities.getBBox
460
+ // Get the given/selected element's bounding box object, convert it to be more
461
+ // usable when necessary
462
+ //
463
+ // Parameters:
464
+ // elem - Optional DOM element to get the BBox for
465
+ svgedit.utilities.getBBox = function(elem) {
466
+ var selected = elem || editorContext_.getSelectedElements()[0];
467
+ if (elem.nodeType != 1) return null;
468
+ var ret = null;
469
+ var elname = selected.nodeName;
470
+
471
+ switch ( elname ) {
472
+ case 'text':
473
+ if(selected.textContent === '') {
474
+ selected.textContent = 'a'; // Some character needed for the selector to use.
475
+ ret = selected.getBBox();
476
+ selected.textContent = '';
477
+ } else {
478
+ try { ret = selected.getBBox();} catch(e){}
479
+ }
480
+ break;
481
+ case 'path':
482
+ if(!svgedit.browser.supportsPathBBox()) {
483
+ ret = svgedit.utilities.getPathBBox(selected);
484
+ } else {
485
+ try { ret = selected.getBBox();} catch(e){}
486
+ }
487
+ break;
488
+ case 'g':
489
+ case 'a':
490
+ ret = groupBBFix(selected);
491
+ break;
492
+ default:
493
+
494
+ if(elname === 'use') {
495
+ ret = groupBBFix(selected, true);
496
+ }
497
+
498
+ if(elname === 'use') {
499
+ if(!ret) ret = selected.getBBox();
500
+ //if(!svgedit.browser.isWebkit()) {
501
+ // var bb = {};
502
+ // bb.width = ret.width;
503
+ // bb.height = ret.height;
504
+ // bb.x = ret.x + parseFloat(selected.getAttribute('x')||0);
505
+ // bb.y = ret.y + parseFloat(selected.getAttribute('y')||0);
506
+ // ret = bb;
507
+ //}
508
+ } else if(~visElems_arr.indexOf(elname)) {
509
+ try { ret = selected.getBBox();}
510
+ catch(e) {
511
+ // Check if element is child of a foreignObject
512
+ var fo = $(selected).closest("foreignObject");
513
+ if(fo.length) {
514
+ try {
515
+ ret = fo[0].getBBox();
516
+ } catch(e) {
517
+ ret = null;
518
+ }
519
+ } else {
520
+ ret = null;
521
+ }
522
+ }
523
+ }
524
+ }
525
+
526
+ if(ret) {
527
+ ret = svgedit.utilities.bboxToObj(ret);
528
+ }
529
+
530
+ // get the bounding box from the DOM (which is in that element's coordinate system)
531
+ return ret;
532
+ };
533
+
534
+ // Function: svgedit.utilities.getRotationAngle
535
+ // Get the rotation angle of the given/selected DOM element
536
+ //
537
+ // Parameters:
538
+ // elem - Optional DOM element to get the angle for
539
+ // to_rad - Boolean that when true returns the value in radians rather than degrees
540
+ //
541
+ // Returns:
542
+ // Float with the angle in degrees or radians
543
+ svgedit.utilities.getRotationAngle = function(elem, to_rad) {
544
+ var selected = elem || editorContext_.getSelectedElements()[0];
545
+ // find the rotation transform (if any) and set it
546
+ var tlist = svgedit.transformlist.getTransformList(selected);
547
+ if(!tlist) return 0; // <svg> elements have no tlist
548
+ var N = tlist.numberOfItems;
549
+ for (var i = 0; i < N; ++i) {
550
+ var xform = tlist.getItem(i);
551
+ if (xform.type == 4) {
552
+ return to_rad ? xform.angle * Math.PI / 180.0 : xform.angle;
553
+ }
554
+ }
555
+ return 0.0;
556
+ };
557
+
558
+ // Function: getElem
559
+ // Get a DOM element by ID within the SVG root element.
560
+ //
561
+ // Parameters:
562
+ // id - String with the element's new ID
563
+ if (svgedit.browser.supportsSelectors()) {
564
+ svgedit.utilities.getElem = function(id) {
565
+ // querySelector lookup
566
+ return svgroot_.querySelector('#'+id);
567
+ };
568
+ } else if (svgedit.browser.supportsXpath()) {
569
+ svgedit.utilities.getElem = function(id) {
570
+ // xpath lookup
571
+ return domdoc_.evaluate(
572
+ 'svg:svg[@id="svgroot"]//svg:*[@id="'+id+'"]',
573
+ domcontainer_,
574
+ function() { return "http://www.w3.org/2000/svg"; },
575
+ 9,
576
+ null).singleNodeValue;
577
+ };
578
+ } else {
579
+ svgedit.utilities.getElem = function(id) {
580
+ // jQuery lookup: twice as slow as xpath in FF
581
+ return $(svgroot_).find('[id=' + id + ']')[0];
582
+ };
583
+ }
584
+
585
+ // Function: assignAttributes
586
+ // Assigns multiple attributes to an element.
587
+ //
588
+ // Parameters:
589
+ // node - DOM element to apply new attribute values to
590
+ // attrs - Object with attribute keys/values
591
+ // suspendLength - Optional integer of milliseconds to suspend redraw
592
+ // unitCheck - Boolean to indicate the need to use svgedit.units.setUnitAttr
593
+ svgedit.utilities.assignAttributes = function(node, attrs, suspendLength, unitCheck) {
594
+ if(!suspendLength) suspendLength = 0;
595
+ // Opera has a problem with suspendRedraw() apparently
596
+ var handle = null;
597
+ if (!svgedit.browser.isOpera()) svgroot_.suspendRedraw(suspendLength);
598
+
599
+ for (var i in attrs) {
600
+ var ns = (i.substr(0,4) === "xml:" ? XMLNS :
601
+ i.substr(0,6) === "xlink:" ? XLINKNS : null);
602
+
603
+ if(ns) {
604
+ node.setAttributeNS(ns, i, attrs[i]);
605
+ } else if(!unitCheck) {
606
+ node.setAttribute(i, attrs[i]);
607
+ } else {
608
+ svgedit.units.setUnitAttr(node, i, attrs[i]);
609
+ }
610
+
611
+ }
612
+
613
+ if (!svgedit.browser.isOpera()) svgroot_.unsuspendRedraw(handle);
614
+ };
615
+
616
+ // Function: cleanupElement
617
+ // Remove unneeded (default) attributes, makes resulting SVG smaller
618
+ //
619
+ // Parameters:
620
+ // element - DOM element to clean up
621
+ svgedit.utilities.cleanupElement = function(element) {
622
+ var handle = svgroot_.suspendRedraw(60);
623
+ var defaults = {
624
+ 'fill-opacity':1,
625
+ 'stop-opacity':1,
626
+ 'opacity':1,
627
+ 'stroke':'none',
628
+ 'stroke-dasharray':'none',
629
+ 'stroke-linejoin':'miter',
630
+ 'stroke-linecap':'butt',
631
+ 'stroke-opacity':1,
632
+ 'stroke-width':1,
633
+ 'rx':0,
634
+ 'ry':0
635
+ }
636
+
637
+ for(var attr in defaults) {
638
+ var val = defaults[attr];
639
+ if(element.getAttribute(attr) == val) {
640
+ element.removeAttribute(attr);
641
+ }
642
+ }
643
+
644
+ svgroot_.unsuspendRedraw(handle);
645
+ };
646
+
647
+
648
+ })();