method_draw 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,273 @@
1
+ /**
2
+ * Package: svgedit.sanitize
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
+ // 2) svgutils.js
13
+
14
+ var svgedit = svgedit || {};
15
+
16
+ (function() {
17
+
18
+ if (!svgedit.sanitize) {
19
+ svgedit.sanitize = {};
20
+ }
21
+
22
+ // Namespace constants
23
+ var svgns = "http://www.w3.org/2000/svg",
24
+ xlinkns = "http://www.w3.org/1999/xlink",
25
+ xmlns = "http://www.w3.org/XML/1998/namespace",
26
+ xmlnsns = "http://www.w3.org/2000/xmlns/", // see http://www.w3.org/TR/REC-xml-names/#xmlReserved
27
+ se_ns = "http://svg-edit.googlecode.com",
28
+ htmlns = "http://www.w3.org/1999/xhtml",
29
+ mathns = "http://www.w3.org/1998/Math/MathML";
30
+
31
+ // map namespace URIs to prefixes
32
+ var nsMap_ = {};
33
+ nsMap_[xlinkns] = 'xlink';
34
+ nsMap_[xmlns] = 'xml';
35
+ nsMap_[xmlnsns] = 'xmlns';
36
+ nsMap_[se_ns] = 'se';
37
+ nsMap_[htmlns] = 'xhtml';
38
+ nsMap_[mathns] = 'mathml';
39
+
40
+ // map prefixes to namespace URIs
41
+ var nsRevMap_ = {};
42
+ $.each(nsMap_, function(key,value){
43
+ nsRevMap_[value] = key;
44
+ });
45
+
46
+ // this defines which elements and attributes that we support
47
+ var svgWhiteList_ = {
48
+ // SVG Elements
49
+ "a": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "xlink:href", "xlink:title"],
50
+ "circle": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "r", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
51
+ "clipPath": ["class", "clipPathUnits", "id"],
52
+ "defs": [],
53
+ "style" : ["type"],
54
+ "desc": [],
55
+ "ellipse": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
56
+ "feGaussianBlur": ["class", "color-interpolation-filters", "id", "requiredFeatures", "stdDeviation"],
57
+ "filter": ["class", "color-interpolation-filters", "filterRes", "filterUnits", "height", "id", "primitiveUnits", "requiredFeatures", "width", "x", "xlink:href", "y"],
58
+ "foreignObject": ["class", "font-size", "height", "id", "opacity", "requiredFeatures", "style", "transform", "width", "x", "y"],
59
+ "g": ["class", "clip-path", "clip-rule", "id", "display", "fill", "fill-opacity", "fill-rule", "filter", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "font-family", "font-size", "font-style", "font-weight", "text-anchor", "data-locked"],
60
+ "image": ["class", "clip-path", "clip-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "style", "systemLanguage", "transform", "width", "x", "xlink:href", "xlink:title", "y"],
61
+ "line": ["shape-rendering", "class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "x1", "x2", "y1", "y2"],
62
+ "linearGradient": ["class", "id", "gradientTransform", "gradientUnits", "requiredFeatures", "spreadMethod", "systemLanguage", "x1", "x2", "xlink:href", "y1", "y2"],
63
+ "marker": ["id", "class", "markerHeight", "markerUnits", "markerWidth", "orient", "preserveAspectRatio", "refX", "refY", "systemLanguage", "viewBox"],
64
+ "mask": ["class", "height", "id", "maskContentUnits", "maskUnits", "width", "x", "y"],
65
+ "metadata": ["class", "id"],
66
+ "path": ["class", "clip-path", "clip-rule", "d", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
67
+ "pattern": ["class", "height", "id", "patternContentUnits", "patternTransform", "patternUnits", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xlink:href", "y"],
68
+ "polygon": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "id", "class", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
69
+ "polyline": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
70
+ "radialGradient": ["class", "cx", "cy", "fx", "fy", "gradientTransform", "gradientUnits", "id", "r", "requiredFeatures", "spreadMethod", "systemLanguage", "xlink:href"],
71
+ "rect": ["shape-rendering", "class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "width", "x", "y"],
72
+ "stop": ["class", "id", "offset", "requiredFeatures", "stop-color", "stop-opacity", "style", "systemLanguage"],
73
+ "svg": ["class", "clip-path", "clip-rule", "filter", "id", "height", "mask", "preserveAspectRatio", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xmlns", "xmlns:se", "xmlns:xlink", "y"],
74
+ "switch": ["class", "id", "requiredFeatures", "systemLanguage"],
75
+ "symbol": ["class", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "opacity", "preserveAspectRatio", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "viewBox"],
76
+ "text": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "transform", "x", "xml:space", "y"],
77
+ "textPath": ["class", "id", "method", "requiredFeatures", "spacing", "startOffset", "style", "systemLanguage", "transform", "xlink:href"],
78
+ "title": [],
79
+ "tspan": ["class", "clip-path", "clip-rule", "dx", "dy", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "rotate", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "textLength", "transform", "x", "xml:space", "y"],
80
+ "use": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "transform", "width", "x", "xlink:href", "y"],
81
+
82
+ // MathML Elements
83
+ "annotation": ["encoding"],
84
+ "annotation-xml": ["encoding"],
85
+ "maction": ["actiontype", "other", "selection"],
86
+ "math": ["class", "id", "display", "xmlns"],
87
+ "menclose": ["notation"],
88
+ "merror": [],
89
+ "mfrac": ["linethickness"],
90
+ "mi": ["mathvariant"],
91
+ "mmultiscripts": [],
92
+ "mn": [],
93
+ "mo": ["fence", "lspace", "maxsize", "minsize", "rspace", "stretchy"],
94
+ "mover": [],
95
+ "mpadded": ["lspace", "width", "height", "depth", "voffset"],
96
+ "mphantom": [],
97
+ "mprescripts": [],
98
+ "mroot": [],
99
+ "mrow": ["xlink:href", "xlink:type", "xmlns:xlink"],
100
+ "mspace": ["depth", "height", "width"],
101
+ "msqrt": [],
102
+ "mstyle": ["displaystyle", "mathbackground", "mathcolor", "mathvariant", "scriptlevel"],
103
+ "msub": [],
104
+ "msubsup": [],
105
+ "msup": [],
106
+ "mtable": ["align", "columnalign", "columnlines", "columnspacing", "displaystyle", "equalcolumns", "equalrows", "frame", "rowalign", "rowlines", "rowspacing", "width"],
107
+ "mtd": ["columnalign", "columnspan", "rowalign", "rowspan"],
108
+ "mtext": [],
109
+ "mtr": ["columnalign", "rowalign"],
110
+ "munder": [],
111
+ "munderover": [],
112
+ "none": [],
113
+ "semantics": []
114
+ };
115
+
116
+ // Produce a Namespace-aware version of svgWhitelist
117
+ var svgWhiteListNS_ = {};
118
+ $.each(svgWhiteList_, function(elt,atts){
119
+ var attNS = {};
120
+ $.each(atts, function(i, att){
121
+ if (att.indexOf(':') >= 0) {
122
+ var v = att.split(':');
123
+ attNS[v[1]] = nsRevMap_[v[0]];
124
+ } else {
125
+ attNS[att] = att == 'xmlns' ? xmlnsns : null;
126
+ }
127
+ });
128
+ svgWhiteListNS_[elt] = attNS;
129
+ });
130
+
131
+ // temporarily expose these
132
+ svgedit.sanitize.getNSMap = function() { return nsMap_; }
133
+
134
+ // Function: svgedit.sanitize.sanitizeSvg
135
+ // Sanitizes the input node and its children
136
+ // It only keeps what is allowed from our whitelist defined above
137
+ //
138
+ // Parameters:
139
+ // node - The DOM element to be checked, will also check its children
140
+ svgedit.sanitize.sanitizeSvg = function(node) {
141
+ // we only care about element nodes
142
+ // automatically return for all comment, etc nodes
143
+ // for text, we do a whitespace trim
144
+ if (node.nodeType == 3) {
145
+ node.nodeValue = node.nodeValue.replace(/^\s+|\s+$/g, "");
146
+ // Remove empty text nodes
147
+ if(!node.nodeValue.length) node.parentNode.removeChild(node);
148
+ }
149
+ if (node.nodeType != 1) return;
150
+ var doc = node.ownerDocument;
151
+ var parent = node.parentNode;
152
+ // can parent ever be null here? I think the root node's parent is the document...
153
+ if (!doc || !parent) return;
154
+
155
+ var allowedAttrs = svgWhiteList_[node.nodeName];
156
+ var allowedAttrsNS = svgWhiteListNS_[node.nodeName];
157
+
158
+ // if this element is allowed
159
+ if (allowedAttrs != undefined) {
160
+
161
+ var se_attrs = [];
162
+
163
+ var i = node.attributes.length;
164
+ while (i--) {
165
+ // if the attribute is not in our whitelist, then remove it
166
+ // could use jQuery's inArray(), but I don't know if that's any better
167
+ var attr = node.attributes.item(i);
168
+ var attrName = attr.nodeName;
169
+ var attrLocalName = attr.localName;
170
+ var attrNsURI = attr.namespaceURI;
171
+ // Check that an attribute with the correct localName in the correct namespace is on
172
+ // our whitelist or is a namespace declaration for one of our allowed namespaces
173
+ if (!(allowedAttrsNS.hasOwnProperty(attrLocalName) && attrNsURI == allowedAttrsNS[attrLocalName] && attrNsURI != xmlnsns) &&
174
+ !(attrNsURI == xmlnsns && nsMap_[attr.nodeValue]) )
175
+ {
176
+ // TODO(codedread): Programmatically add the se: attributes to the NS-aware whitelist.
177
+ // Bypassing the whitelist to allow se: prefixes. Is there
178
+ // a more appropriate way to do this?
179
+ if(attrName.indexOf('se:') == 0) {
180
+ se_attrs.push([attrName, attr.nodeValue]);
181
+ }
182
+ node.removeAttributeNS(attrNsURI, attrLocalName);
183
+ }
184
+
185
+ // Add spaces before negative signs where necessary
186
+ if(svgedit.browser.isGecko()) {
187
+ switch ( attrName ) {
188
+ case "transform":
189
+ case "gradientTransform":
190
+ case "patternTransform":
191
+ var val = attr.nodeValue.replace(/(\d)-/g, "$1 -");
192
+ node.setAttribute(attrName, val);
193
+ }
194
+ }
195
+
196
+ // for the style attribute, rewrite it in terms of XML presentational attributes
197
+ if (attrName == "style") {
198
+ var props = attr.nodeValue.split(";"),
199
+ p = props.length;
200
+ while(p--) {
201
+ var nv = props[p].split(":");
202
+ // now check that this attribute is supported
203
+ if (allowedAttrs.indexOf(nv[0]) >= 0) {
204
+ node.setAttribute(nv[0],nv[1]);
205
+ }
206
+ }
207
+ node.removeAttribute('style');
208
+ }
209
+ }
210
+
211
+ $.each(se_attrs, function(i, attr) {
212
+ node.setAttributeNS(se_ns, attr[0], attr[1]);
213
+ });
214
+
215
+ // for some elements that have a xlink:href, ensure the URI refers to a local element
216
+ // (but not for links)
217
+ var href = svgedit.utilities.getHref(node);
218
+ if(href &&
219
+ ["filter", "linearGradient", "pattern",
220
+ "radialGradient", "textPath", "use"].indexOf(node.nodeName) >= 0)
221
+ {
222
+ // TODO: we simply check if the first character is a #, is this bullet-proof?
223
+ if (href[0] != "#") {
224
+ // remove the attribute (but keep the element)
225
+ svgedit.utilities.setHref(node, "");
226
+ node.removeAttributeNS(xlinkns, "href");
227
+ }
228
+ }
229
+
230
+ // Safari crashes on a <use> without a xlink:href, so we just remove the node here
231
+ if (node.nodeName == "use" && !svgedit.utilities.getHref(node)) {
232
+ parent.removeChild(node);
233
+ return;
234
+ }
235
+ // if the element has attributes pointing to a non-local reference,
236
+ // need to remove the attribute
237
+ $.each(["clip-path", "fill", "filter", "marker-end", "marker-mid", "marker-start", "mask", "stroke"],function(i,attr) {
238
+ var val = node.getAttribute(attr);
239
+ if (val) {
240
+ val = svgedit.utilities.getUrlFromAttr(val);
241
+ // simply check for first character being a '#'
242
+ if (val && val[0] !== "#") {
243
+ node.setAttribute(attr, "");
244
+ node.removeAttribute(attr);
245
+ }
246
+ }
247
+ });
248
+
249
+ // recurse to children
250
+ i = node.childNodes.length;
251
+ while (i--) { svgedit.sanitize.sanitizeSvg(node.childNodes.item(i)); }
252
+ }
253
+ // else, remove this element
254
+ else {
255
+ // remove all children from this node and insert them before this node
256
+ // FIXME: in the case of animation elements this will hardly ever be correct
257
+ var children = [];
258
+ while (node.hasChildNodes()) {
259
+ children.push(parent.insertBefore(node.firstChild, node));
260
+ }
261
+
262
+ // remove this node from the document altogether
263
+ parent.removeChild(node);
264
+
265
+ // call sanitizeSvg on each of those children
266
+ var i = children.length;
267
+ while (i--) { svgedit.sanitize.sanitizeSvg(children[i]); }
268
+
269
+ }
270
+ };
271
+
272
+ })();
273
+
@@ -0,0 +1,608 @@
1
+ /**
2
+ * Package: svedit.select
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) math.js
14
+ // 4) svgutils.js
15
+
16
+ var svgedit = svgedit || {};
17
+
18
+ (function() {
19
+
20
+ if (!svgedit.select) {
21
+ svgedit.select = {};
22
+ }
23
+
24
+ var svgFactory_;
25
+ var config_;
26
+ var selectorManager_; // A Singleton
27
+
28
+ // Class: svgedit.select.Selector
29
+ // Private class for DOM element selection boxes
30
+ //
31
+ // Parameters:
32
+ // id - integer to internally indentify the selector
33
+ // elem - DOM element associated with this selector
34
+ svgedit.select.Selector = function(id, elem) {
35
+ // this is the selector's unique number
36
+ this.id = id;
37
+
38
+ // this holds a reference to the element for which this selector is being used
39
+ this.selectedElement = elem;
40
+
41
+ // this is a flag used internally to track whether the selector is being used or not
42
+ this.locked = true;
43
+
44
+ // this holds a reference to the <g> element that holds all visual elements of the selector
45
+ this.selectorGroup = svgFactory_.createSVGElement({
46
+ 'element': 'g',
47
+ 'attr': {'id': ('selectorGroup' + this.id)}
48
+ });
49
+
50
+ // this holds a reference to the path rect
51
+ this.selectorRect = this.selectorGroup.appendChild(
52
+ svgFactory_.createSVGElement({
53
+ 'element': 'path',
54
+ 'attr': {
55
+ 'id': ('selectedBox' + this.id),
56
+ 'fill': 'none',
57
+ 'stroke': '#4F80FF',
58
+ 'stroke-width': '1',
59
+ 'shape-rendering': 'crispEdges',
60
+ 'style': 'pointer-events:none'
61
+ }
62
+ })
63
+ );
64
+
65
+ if (svgedit.browser.isTouch()) {
66
+ this.selectorRect.setAttribute("stroke-opacity", 0.3);
67
+ }
68
+
69
+ // this holds a reference to the grip coordinates for this selector
70
+ this.gripCoords = {
71
+ 'nw': null,
72
+ 'n' : null,
73
+ 'ne': null,
74
+ 'e' : null,
75
+ 'se': null,
76
+ 's' : null,
77
+ 'sw': null,
78
+ 'w' : null
79
+ };
80
+
81
+ this.reset(this.selectedElement);
82
+ };
83
+
84
+
85
+ // Function: svgedit.select.Selector.reset
86
+ // Used to reset the id and element that the selector is attached to
87
+ //
88
+ // Parameters:
89
+ // e - DOM element associated with this selector
90
+ svgedit.select.Selector.prototype.reset = function(e) {
91
+ this.locked = true;
92
+ this.selectedElement = e;
93
+ this.resize();
94
+ this.selectorGroup.setAttribute('display', 'inline');
95
+ };
96
+
97
+ // Function: svgedit.select.Selector.updateGripCursors
98
+ // Updates cursors for corner grips on rotation so arrows point the right way
99
+ //
100
+ // Parameters:
101
+ // angle - Float indicating current rotation angle in degrees
102
+ svgedit.select.Selector.prototype.updateGripCursors = function(angle) {
103
+ var dir_arr = [];
104
+ var steps = Math.round(angle / 45);
105
+ if(steps < 0) steps += 8;
106
+ for (var dir in selectorManager_.selectorGrips) {
107
+ dir_arr.push(dir);
108
+ }
109
+ while(steps > 0) {
110
+ dir_arr.push(dir_arr.shift());
111
+ steps--;
112
+ }
113
+ var i = 0;
114
+ for (var dir in selectorManager_.selectorGrips) {
115
+ selectorManager_.selectorGrips[dir].setAttribute('style', ('cursor:' + dir_arr[i] + '-resize'));
116
+ i++;
117
+ };
118
+ };
119
+
120
+ // Function: svgedit.select.Selector.showGrips
121
+ // Show the resize grips of this selector
122
+ //
123
+ // Parameters:
124
+ // show - boolean indicating whether grips should be shown or not
125
+ svgedit.select.Selector.prototype.showGrips = function(show) {
126
+ // TODO: use suspendRedraw() here
127
+ var bShow = show ? 'inline' : 'none';
128
+ selectorManager_.selectorGripsGroup.setAttribute('display', bShow);
129
+ var elem = this.selectedElement;
130
+ this.hasGrips = show;
131
+ if(elem && show) {
132
+ this.selectorGroup.appendChild(selectorManager_.selectorGripsGroup);
133
+ this.updateGripCursors(svgedit.utilities.getRotationAngle(elem));
134
+ }
135
+ };
136
+
137
+ // Function: svgedit.select.Selector.resize
138
+ // Updates the selector to match the element's size
139
+ svgedit.select.Selector.prototype.resize = function() {
140
+ var selectedBox = this.selectorRect,
141
+ mgr = selectorManager_,
142
+ selectedGrips = mgr.selectorGrips,
143
+ selected = this.selectedElement,
144
+ sw = selected.getAttribute('stroke-width'),
145
+ current_zoom = svgFactory_.currentZoom();
146
+ var offset = 1/current_zoom;
147
+ if (selected.getAttribute('stroke') !== 'none' && !isNaN(sw)) {
148
+ offset += (sw/2);
149
+ }
150
+
151
+ var tagName = selected.tagName;
152
+ if (tagName === 'text') {
153
+ offset += 2/current_zoom;
154
+ }
155
+
156
+ // loop and transform our bounding box until we reach our first rotation
157
+ var tlist = svgedit.transformlist.getTransformList(selected);
158
+ var m = svgedit.math.transformListToTransform(tlist).matrix;
159
+
160
+ // This should probably be handled somewhere else, but for now
161
+ // it keeps the selection box correctly positioned when zoomed
162
+ m.e *= current_zoom;
163
+ m.f *= current_zoom;
164
+
165
+ var bbox = svgedit.utilities.getBBox(selected);
166
+ if(tagName === 'g' && !$.data(selected, 'gsvg')) {
167
+ // The bbox for a group does not include stroke vals, so we
168
+ // get the bbox based on its children.
169
+ var stroked_bbox = svgFactory_.getStrokedBBox(selected.childNodes);
170
+ if(stroked_bbox) {
171
+ bbox = stroked_bbox;
172
+ }
173
+ }
174
+
175
+ // apply the transforms
176
+ var l=bbox.x, t=bbox.y, w=bbox.width, h=bbox.height,
177
+ bbox = {x:l, y:t, width:w, height:h};
178
+
179
+ // we need to handle temporary transforms too
180
+ // if skewed, get its transformed box, then find its axis-aligned bbox
181
+
182
+ //*
183
+ offset *= current_zoom;
184
+
185
+ var nbox = svgedit.math.transformBox(l*current_zoom, t*current_zoom, w*current_zoom, h*current_zoom, m),
186
+ aabox = nbox.aabox,
187
+ nbax = aabox.x - offset,
188
+ nbay = aabox.y - offset,
189
+ nbaw = aabox.width + (offset * 2),
190
+ nbah = aabox.height + (offset * 2);
191
+
192
+ // now if the shape is rotated, un-rotate it
193
+ var cx = nbax + nbaw/2,
194
+ cy = nbay + nbah/2;
195
+
196
+ var angle = svgedit.utilities.getRotationAngle(selected);
197
+ if (angle) {
198
+ var rot = svgFactory_.svgRoot().createSVGTransform();
199
+ rot.setRotate(-angle,cx,cy);
200
+ var rotm = rot.matrix;
201
+ nbox.tl = svgedit.math.transformPoint(nbox.tl.x,nbox.tl.y,rotm);
202
+ nbox.tr = svgedit.math.transformPoint(nbox.tr.x,nbox.tr.y,rotm);
203
+ nbox.bl = svgedit.math.transformPoint(nbox.bl.x,nbox.bl.y,rotm);
204
+ nbox.br = svgedit.math.transformPoint(nbox.br.x,nbox.br.y,rotm);
205
+
206
+ // calculate the axis-aligned bbox
207
+ var tl = nbox.tl;
208
+ var minx = tl.x,
209
+ miny = tl.y,
210
+ maxx = tl.x,
211
+ maxy = tl.y;
212
+
213
+ var Min = Math.min, Max = Math.max;
214
+
215
+ minx = Min(minx, Min(nbox.tr.x, Min(nbox.bl.x, nbox.br.x) ) ) - offset;
216
+ miny = Min(miny, Min(nbox.tr.y, Min(nbox.bl.y, nbox.br.y) ) ) - offset;
217
+ maxx = Max(maxx, Max(nbox.tr.x, Max(nbox.bl.x, nbox.br.x) ) ) + offset;
218
+ maxy = Max(maxy, Max(nbox.tr.y, Max(nbox.bl.y, nbox.br.y) ) ) + offset;
219
+
220
+ nbax = minx;
221
+ nbay = miny;
222
+ nbaw = (maxx-minx);
223
+ nbah = (maxy-miny);
224
+ }
225
+ var sr_handle = svgFactory_.svgRoot().suspendRedraw(100);
226
+
227
+ var dstr = 'M' + nbax + ',' + nbay
228
+ + ' L' + (nbax+nbaw) + ',' + nbay
229
+ + ' ' + (nbax+nbaw) + ',' + (nbay+nbah)
230
+ + ' ' + nbax + ',' + (nbay+nbah) + 'z';
231
+ selectedBox.setAttribute('d', dstr);
232
+
233
+ var xform = angle ? 'rotate(' + [angle,cx,cy].join(',') + ')' : '';
234
+ this.selectorGroup.setAttribute('transform', xform);
235
+
236
+ if(svgedit.browser.isTouch()) {
237
+ nbax -= 15.75;
238
+ nbay -= 15.75;
239
+ }
240
+ else {
241
+ nbax -= 4;
242
+ nbay -= 4;
243
+ }
244
+ this.gripCoords = {
245
+ 'nw': [nbax, nbay].map(Math.round),
246
+ 'ne': [nbax+nbaw, nbay].map(Math.round),
247
+ 'sw': [nbax, nbay+nbah].map(Math.round),
248
+ 'se': [nbax+nbaw, nbay+nbah].map(Math.round),
249
+ 'n': [nbax + (nbaw)/2, nbay].map(Math.round),
250
+ 'w': [nbax, nbay + (nbah)/2].map(Math.round),
251
+ 'e': [nbax + nbaw, nbay + (nbah)/2].map(Math.round),
252
+ 's': [nbax + (nbaw)/2, nbay + nbah].map(Math.round)
253
+ };
254
+
255
+ for(var dir in this.gripCoords) {
256
+ var coords = this.gripCoords[dir];
257
+ selectedGrips[dir].setAttribute('x', coords[0]);
258
+ selectedGrips[dir].setAttribute('y', coords[1]);
259
+ };
260
+
261
+ this.rotateCoords = {
262
+ 'nw': [nbax, nbay],
263
+ 'ne': [nbax+nbaw+8, nbay],
264
+ 'sw': [nbax, nbay+nbah+8],
265
+ 'se': [nbax+nbaw+8, nbay+nbah+8]
266
+ };
267
+
268
+ for(var dir in this.rotateCoords) {
269
+ var coords = this.rotateCoords[dir];
270
+ mgr.rotateGrips[dir].setAttribute('cx', coords[0]);
271
+ mgr.rotateGrips[dir].setAttribute('cy', coords[1]);
272
+ }
273
+
274
+ svgFactory_.svgRoot().unsuspendRedraw(sr_handle);
275
+ };
276
+
277
+
278
+ // Class: svgedit.select.SelectorManager
279
+ svgedit.select.SelectorManager = function() {
280
+ // this will hold the <g> element that contains all selector rects/grips
281
+ this.selectorParentGroup = null;
282
+
283
+ // this is a special rect that is used for multi-select
284
+ this.rubberBandBox = null;
285
+
286
+ // this will hold objects of type svgedit.select.Selector (see above)
287
+ this.selectors = [];
288
+
289
+ // this holds a map of SVG elements to their Selector object
290
+ this.selectorMap = {};
291
+
292
+ // this holds a reference to the grip elements
293
+ this.selectorGrips = {
294
+ 'nw': null,
295
+ 'n' : null,
296
+ 'ne': null,
297
+ 'e' : null,
298
+ 'se': null,
299
+ 's' : null,
300
+ 'sw': null,
301
+ 'w' : null
302
+ };
303
+
304
+ this.selectorGripsGroup = null;
305
+ //this.rotateGripConnector = null;
306
+ this.rotateGrips = {
307
+ 'nw': null,
308
+ 'ne': null,
309
+ 'se': null,
310
+ 'sw': null
311
+ };
312
+
313
+ this.initGroup();
314
+ };
315
+
316
+ // Function: svgedit.select.SelectorManager.initGroup
317
+ // Resets the parent selector group element
318
+ svgedit.select.SelectorManager.prototype.initGroup = function() {
319
+ // remove old selector parent group if it existed
320
+ if (this.selectorParentGroup && this.selectorParentGroup.parentNode) {
321
+ this.selectorParentGroup.parentNode.removeChild(this.selectorParentGroup);
322
+ }
323
+
324
+ // create parent selector group and add it to svgroot
325
+ this.selectorParentGroup = svgFactory_.createSVGElement({
326
+ 'element': 'g',
327
+ 'attr': {'id': 'selectorParentGroup'}
328
+ });
329
+ this.selectorGripsGroup = svgFactory_.createSVGElement({
330
+ 'element': 'g',
331
+ 'attr': {'display': 'none'}
332
+ });
333
+ this.selectorParentGroup.appendChild(this.selectorGripsGroup);
334
+ svgFactory_.svgRoot().appendChild(this.selectorParentGroup);
335
+
336
+ this.selectorMap = {};
337
+ this.selectors = [];
338
+ this.rubberBandBox = null;
339
+
340
+ for (var dir in this.rotateGrips) {
341
+ var grip = svgFactory_.createSVGElement({
342
+ 'element': 'circle',
343
+ 'attr': {
344
+ 'id': 'selectorGrip_rotate_' + dir,
345
+ 'fill': '#000',
346
+ 'r': 8,
347
+ 'stroke': '#000',
348
+ "fill-opacity": 0,
349
+ "stroke-opacity": 0,
350
+ 'stroke-width': 0,
351
+ 'style': 'cursor:url(' + config_.imgPath + 'rotate.png) 12 12, auto;'
352
+ }
353
+ })
354
+ $.data(grip, 'dir', dir);
355
+ $.data(grip, 'type', 'rotate');
356
+ this.rotateGrips[dir] = this.selectorGripsGroup.appendChild(grip);
357
+ }
358
+
359
+ // add the corner grips
360
+ for (var dir in this.selectorGrips) {
361
+ var grip = svgFactory_.createSVGElement({
362
+ 'element': 'rect',
363
+ 'attr': {
364
+ 'id': ('selectorGrip_resize_' + dir),
365
+ 'width': 8,
366
+ 'height': 8,
367
+ 'fill': "#4F80FF",
368
+ 'stroke': "rgba(0,0,0,0)",
369
+ 'stroke-width': 1,
370
+ 'style': ('cursor:' + dir + '-resize'),
371
+ 'pointer-events': 'all'
372
+ }
373
+ });
374
+ if (svgedit.browser.isTouch()) {
375
+
376
+ grip.setAttribute("width", 30.5)
377
+ grip.setAttribute("height", 30.5)
378
+ grip.setAttribute("fill-opacity", 0.3)
379
+ }
380
+
381
+ $.data(grip, 'dir', dir);
382
+ $.data(grip, 'type', 'resize');
383
+ this.selectorGrips[dir] = this.selectorGripsGroup.appendChild(grip);
384
+ }
385
+
386
+ if($('#canvasBackground').length) return;
387
+
388
+ var dims = config_.dimensions;
389
+ var canvasbg = svgFactory_.createSVGElement({
390
+ 'element': 'svg',
391
+ 'attr': {
392
+ 'id': 'canvasBackground',
393
+ 'width': dims[0],
394
+ 'height': dims[1],
395
+ 'x': 0,
396
+ 'y': 0,
397
+ 'overflow': (svgedit.browser.isWebkit() ? 'none' : 'visible'), // Chrome 7 has a problem with this when zooming out
398
+ 'style': 'pointer-events:none'
399
+ }
400
+ });
401
+
402
+ var defs = svgFactory_.createSVGElement({
403
+ 'element': 'defs',
404
+ 'attr': {
405
+ 'id': 'placeholder_defs'
406
+ }
407
+ })
408
+
409
+ var pattern = svgFactory_.createSVGElement({
410
+ 'element': 'pattern',
411
+ 'attr': {
412
+ 'id': 'checkerPattern',
413
+ 'patternUnits': 'userSpaceOnUse',
414
+ 'x': 0,
415
+ 'y': 0,
416
+ 'width': 20,
417
+ 'height': 20,
418
+ 'viewBox': '0 0 10 10'
419
+ }
420
+ })
421
+
422
+ var pattern_bg = svgFactory_.createSVGElement({
423
+ 'element': 'rect',
424
+ 'attr': {
425
+ 'x': 0,
426
+ 'y': 0,
427
+ 'width': 10,
428
+ 'height': 10,
429
+ 'fill': "#fff"
430
+ }
431
+ })
432
+
433
+ var pattern_square1 = svgFactory_.createSVGElement({
434
+ 'element': 'rect',
435
+ 'attr': {
436
+ 'x': 0,
437
+ 'y': 0,
438
+ 'width': 5,
439
+ 'height': 5,
440
+ 'fill': "#eee"
441
+ }
442
+ })
443
+
444
+ var pattern_square2 = svgFactory_.createSVGElement({
445
+ 'element': 'rect',
446
+ 'attr': {
447
+ 'x': 5,
448
+ 'y': 5,
449
+ 'width': 5,
450
+ 'height': 5,
451
+ 'fill': "#eee"
452
+ }
453
+ })
454
+
455
+ var rect = svgFactory_.createSVGElement({
456
+ 'element': 'rect',
457
+ 'attr': {
458
+ 'width': '100%',
459
+ 'height': '100%',
460
+ 'x': 0,
461
+ 'y': 0,
462
+ 'stroke-width': 1,
463
+ 'stroke': '#000',
464
+ 'fill': 'url(#checkerPattern)',
465
+ 'style': 'pointer-events:none'
466
+ }
467
+ });
468
+
469
+ // Both Firefox and WebKit are too slow with this filter region (especially at higher
470
+ // zoom levels) and Opera has at least one bug
471
+ // if (!svgedit.browser.isOpera()) rect.setAttribute('filter', 'url(#canvashadow)');
472
+ canvasbg.appendChild(defs);
473
+ defs.appendChild(pattern);
474
+ pattern.appendChild(pattern_bg);
475
+ pattern.appendChild(pattern_square1);
476
+ pattern.appendChild(pattern_square2);
477
+ canvasbg.appendChild(rect);
478
+
479
+ svgFactory_.svgRoot().insertBefore(canvasbg, svgFactory_.svgContent());
480
+ };
481
+
482
+ // Function: svgedit.select.SelectorManager.requestSelector
483
+ // Returns the selector based on the given element
484
+ //
485
+ // Parameters:
486
+ // elem - DOM element to get the selector for
487
+ svgedit.select.SelectorManager.prototype.requestSelector = function(elem) {
488
+ if (elem == null) return null;
489
+ var N = this.selectors.length;
490
+ // If we've already acquired one for this element, return it.
491
+ if (typeof(this.selectorMap[elem.id]) == 'object') {
492
+ this.selectorMap[elem.id].locked = true;
493
+ return this.selectorMap[elem.id];
494
+ }
495
+ for (var i = 0; i < N; ++i) {
496
+ if (this.selectors[i] && !this.selectors[i].locked) {
497
+ this.selectors[i].locked = true;
498
+ this.selectors[i].reset(elem);
499
+ this.selectorMap[elem.id] = this.selectors[i];
500
+ return this.selectors[i];
501
+ }
502
+ }
503
+ // if we reached here, no available selectors were found, we create one
504
+ this.selectors[N] = new svgedit.select.Selector(N, elem);
505
+ this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup);
506
+ this.selectorMap[elem.id] = this.selectors[N];
507
+ return this.selectors[N];
508
+ };
509
+
510
+ // Function: svgedit.select.SelectorManager.releaseSelector
511
+ // Removes the selector of the given element (hides selection box)
512
+ //
513
+ // Parameters:
514
+ // elem - DOM element to remove the selector for
515
+ svgedit.select.SelectorManager.prototype.releaseSelector = function(elem) {
516
+ if (elem == null) return;
517
+ var N = this.selectors.length,
518
+ sel = this.selectorMap[elem.id];
519
+ for (var i = 0; i < N; ++i) {
520
+ if (this.selectors[i] && this.selectors[i] == sel) {
521
+ if (sel.locked == false) {
522
+ // TODO(codedread): Ensure this exists in this module.
523
+ console.log('WARNING! selector was released but was already unlocked');
524
+ }
525
+ delete this.selectorMap[elem.id];
526
+ sel.locked = false;
527
+ sel.selectedElement = null;
528
+ sel.showGrips(false);
529
+
530
+ // remove from DOM and store reference in JS but only if it exists in the DOM
531
+ try {
532
+ sel.selectorGroup.setAttribute('display', 'none');
533
+ } catch(e) { }
534
+
535
+ break;
536
+ }
537
+ }
538
+ };
539
+
540
+ // Function: svgedit.select.SelectorManager.getRubberBandBox
541
+ // Returns the rubberBandBox DOM element. This is the rectangle drawn by the user for selecting/zooming
542
+ svgedit.select.SelectorManager.prototype.getRubberBandBox = function() {
543
+ if (!this.rubberBandBox) {
544
+ this.rubberBandBox = this.selectorParentGroup.appendChild(
545
+ svgFactory_.createSVGElement({
546
+ 'element': 'rect',
547
+ 'attr': {
548
+ 'id': 'selectorRubberBand',
549
+ 'fill': 'none',
550
+ 'stroke': '#666',
551
+ 'stroke-width': 1,
552
+ 'stroke-dasharray': '3,2',
553
+ 'display': 'none',
554
+ 'style': 'pointer-events:none'
555
+ }
556
+ })
557
+ );
558
+ }
559
+ return this.rubberBandBox;
560
+ };
561
+
562
+
563
+ /**
564
+ * Interface: svgedit.select.SVGFactory
565
+ * An object that creates SVG elements for the canvas.
566
+ *
567
+ * interface svgedit.select.SVGFactory {
568
+ * SVGElement createSVGElement(jsonMap);
569
+ * SVGSVGElement svgRoot();
570
+ * SVGSVGElement svgContent();
571
+ *
572
+ * Number currentZoom();
573
+ * Object getStrokedBBox(Element[]); // TODO(codedread): Remove when getStrokedBBox() has been put into svgutils.js
574
+ * }
575
+ */
576
+
577
+ /**
578
+ * Function: svgedit.select.init()
579
+ * Initializes this module.
580
+ *
581
+ * Parameters:
582
+ * config - an object containing configurable parameters (imgPath)
583
+ * svgFactory - an object implementing the SVGFactory interface (see above).
584
+ */
585
+ svgedit.select.init = function(config, svgFactory) {
586
+ config_ = config;
587
+ svgFactory_ = svgFactory;
588
+ selectorManager_ = new svgedit.select.SelectorManager();
589
+ //for hovering elements
590
+ svgFactory_.createSVGElement({
591
+ 'element': 'g',
592
+ 'attr': {
593
+ 'id': 'hover_group'
594
+ }
595
+ })
596
+ };
597
+
598
+ /**
599
+ * Function: svgedit.select.getSelectorManager
600
+ *
601
+ * Returns:
602
+ * The SelectorManager instance.
603
+ */
604
+ svgedit.select.getSelectorManager = function() {
605
+ return selectorManager_;
606
+ };
607
+
608
+ })();