sketchily 0.0.2

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 (284) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +39 -0
  3. data/Rakefile +40 -0
  4. data/app/helpers/sketchily.rb~ +10 -0
  5. data/app/helpers/sketchily_helper.rb +10 -0
  6. data/app/views/sketchily/_embed.html.erb +28 -0
  7. data/app/views/sketchily/_embed.html.erb~ +28 -0
  8. data/app/views/sketchily/_embed.js.erb +50 -0
  9. data/app/views/sketchily/_embed.js.erb~ +50 -0
  10. data/app/views/sketchily/_sketchily.html.erb +23 -0
  11. data/app/views/sketchily/_sketchily.html.erb~ +23 -0
  12. data/app/views/sketchily/_sketchily_tag.html.erb +21 -0
  13. data/app/views/sketchily/_sketchily_tag.html.erb~ +21 -0
  14. data/app/views/sketchily/_svg_edit_tag.html.erb~ +51 -0
  15. data/app/views/sketchily/svg_edit_tag_.html~ +35 -0
  16. data/lib/sketchily.rb +15 -0
  17. data/lib/sketchily.rb~ +16 -0
  18. data/lib/sketchily/engine.rb +4 -0
  19. data/lib/sketchily/sketchily.rb +28 -0
  20. data/lib/sketchily/sketchily_show.rb~ +13 -0
  21. data/lib/sketchily/sketchily_tag.rb +15 -0
  22. data/lib/sketchily/svg_edit_tag.rb~ +9 -0
  23. data/lib/sketchily/version.rb +3 -0
  24. data/lib/sketchily/version.rb~ +3 -0
  25. data/spec/dummy/README.rdoc +261 -0
  26. data/spec/dummy/Rakefile +7 -0
  27. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  28. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  29. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  30. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  31. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  32. data/spec/dummy/config.ru +4 -0
  33. data/spec/dummy/config/application.rb +59 -0
  34. data/spec/dummy/config/boot.rb +10 -0
  35. data/spec/dummy/config/database.yml +25 -0
  36. data/spec/dummy/config/environment.rb +5 -0
  37. data/spec/dummy/config/environments/development.rb +37 -0
  38. data/spec/dummy/config/environments/production.rb +67 -0
  39. data/spec/dummy/config/environments/test.rb +37 -0
  40. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  41. data/spec/dummy/config/initializers/inflections.rb +15 -0
  42. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  43. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  44. data/spec/dummy/config/initializers/session_store.rb +8 -0
  45. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  46. data/spec/dummy/config/locales/en.yml +5 -0
  47. data/spec/dummy/config/routes.rb +58 -0
  48. data/spec/dummy/public/404.html +26 -0
  49. data/spec/dummy/public/422.html +26 -0
  50. data/spec/dummy/public/500.html +25 -0
  51. data/spec/dummy/public/favicon.ico +0 -0
  52. data/spec/dummy/script/rails +6 -0
  53. data/spec/lib/sketchily_spec.rb +0 -0
  54. data/spec/spec_helper.rb +11 -0
  55. data/vendor/assets/svg-edit-2.6/browser-not-supported.html +27 -0
  56. data/vendor/assets/svg-edit-2.6/browser.js +180 -0
  57. data/vendor/assets/svg-edit-2.6/canvg/canvg.js +2620 -0
  58. data/vendor/assets/svg-edit-2.6/canvg/rgbcolor.js +287 -0
  59. data/vendor/assets/svg-edit-2.6/contextmenu.js +67 -0
  60. data/vendor/assets/svg-edit-2.6/contextmenu/jquery.contextMenu.js +203 -0
  61. data/vendor/assets/svg-edit-2.6/draw.js +528 -0
  62. data/vendor/assets/svg-edit-2.6/embedapi.html +56 -0
  63. data/vendor/assets/svg-edit-2.6/embedapi.js +173 -0
  64. data/vendor/assets/svg-edit-2.6/extensions/closepath_icons.svg +41 -0
  65. data/vendor/assets/svg-edit-2.6/extensions/ext-arrows.js +298 -0
  66. data/vendor/assets/svg-edit-2.6/extensions/ext-closepath.js +92 -0
  67. data/vendor/assets/svg-edit-2.6/extensions/ext-connector.js +587 -0
  68. data/vendor/assets/svg-edit-2.6/extensions/ext-eyedropper.js +109 -0
  69. data/vendor/assets/svg-edit-2.6/extensions/ext-foreignobject.js +277 -0
  70. data/vendor/assets/svg-edit-2.6/extensions/ext-grid.js +184 -0
  71. data/vendor/assets/svg-edit-2.6/extensions/ext-helloworld.js +78 -0
  72. data/vendor/assets/svg-edit-2.6/extensions/ext-imagelib.js +453 -0
  73. data/vendor/assets/svg-edit-2.6/extensions/ext-imagelib.xml +14 -0
  74. data/vendor/assets/svg-edit-2.6/extensions/ext-markers.js +572 -0
  75. data/vendor/assets/svg-edit-2.6/extensions/ext-server_moinsave.js +56 -0
  76. data/vendor/assets/svg-edit-2.6/extensions/ext-server_opensave.js +180 -0
  77. data/vendor/assets/svg-edit-2.6/extensions/ext-shapes.js +387 -0
  78. data/vendor/assets/svg-edit-2.6/extensions/ext-shapes.xml +10 -0
  79. data/vendor/assets/svg-edit-2.6/extensions/eyedropper-icon.xml +34 -0
  80. data/vendor/assets/svg-edit-2.6/extensions/eyedropper.png +0 -0
  81. data/vendor/assets/svg-edit-2.6/extensions/fileopen.php +31 -0
  82. data/vendor/assets/svg-edit-2.6/extensions/filesave.php +44 -0
  83. data/vendor/assets/svg-edit-2.6/extensions/foreignobject-icons.xml +96 -0
  84. data/vendor/assets/svg-edit-2.6/extensions/grid-icon.xml +30 -0
  85. data/vendor/assets/svg-edit-2.6/extensions/helloworld-icon.xml +21 -0
  86. data/vendor/assets/svg-edit-2.6/extensions/imagelib/index.html +64 -0
  87. data/vendor/assets/svg-edit-2.6/extensions/imagelib/smiley.svg +12 -0
  88. data/vendor/assets/svg-edit-2.6/extensions/markers-icons.xml +115 -0
  89. data/vendor/assets/svg-edit-2.6/extensions/shapelib/animal.json +21 -0
  90. data/vendor/assets/svg-edit-2.6/extensions/shapelib/arrow.json +28 -0
  91. data/vendor/assets/svg-edit-2.6/extensions/shapelib/dialog_balloon.json +9 -0
  92. data/vendor/assets/svg-edit-2.6/extensions/shapelib/electronics.json +20 -0
  93. data/vendor/assets/svg-edit-2.6/extensions/shapelib/flowchart.json +25 -0
  94. data/vendor/assets/svg-edit-2.6/extensions/shapelib/game.json +13 -0
  95. data/vendor/assets/svg-edit-2.6/extensions/shapelib/math.json +9 -0
  96. data/vendor/assets/svg-edit-2.6/extensions/shapelib/misc.json +37 -0
  97. data/vendor/assets/svg-edit-2.6/extensions/shapelib/music.json +21 -0
  98. data/vendor/assets/svg-edit-2.6/extensions/shapelib/object.json +19 -0
  99. data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael.txt +12 -0
  100. data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael_1.json +67 -0
  101. data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael_2.json +64 -0
  102. data/vendor/assets/svg-edit-2.6/extensions/shapelib/symbol.json +28 -0
  103. data/vendor/assets/svg-edit-2.6/history.js +601 -0
  104. data/vendor/assets/svg-edit-2.6/images/README.txt +61 -0
  105. data/vendor/assets/svg-edit-2.6/images/align-bottom.png +0 -0
  106. data/vendor/assets/svg-edit-2.6/images/align-bottom.svg +277 -0
  107. data/vendor/assets/svg-edit-2.6/images/align-center.png +0 -0
  108. data/vendor/assets/svg-edit-2.6/images/align-center.svg +252 -0
  109. data/vendor/assets/svg-edit-2.6/images/align-left.png +0 -0
  110. data/vendor/assets/svg-edit-2.6/images/align-left.svg +235 -0
  111. data/vendor/assets/svg-edit-2.6/images/align-middle.png +0 -0
  112. data/vendor/assets/svg-edit-2.6/images/align-middle.svg +250 -0
  113. data/vendor/assets/svg-edit-2.6/images/align-right.png +0 -0
  114. data/vendor/assets/svg-edit-2.6/images/align-right.svg +233 -0
  115. data/vendor/assets/svg-edit-2.6/images/align-top.png +0 -0
  116. data/vendor/assets/svg-edit-2.6/images/align-top.svg +233 -0
  117. data/vendor/assets/svg-edit-2.6/images/bold.png +0 -0
  118. data/vendor/assets/svg-edit-2.6/images/cancel.png +0 -0
  119. data/vendor/assets/svg-edit-2.6/images/circle.png +0 -0
  120. data/vendor/assets/svg-edit-2.6/images/clear.png +0 -0
  121. data/vendor/assets/svg-edit-2.6/images/clone.png +0 -0
  122. data/vendor/assets/svg-edit-2.6/images/conn.svg +29 -0
  123. data/vendor/assets/svg-edit-2.6/images/copy.png +0 -0
  124. data/vendor/assets/svg-edit-2.6/images/cut.png +0 -0
  125. data/vendor/assets/svg-edit-2.6/images/delete.png +0 -0
  126. data/vendor/assets/svg-edit-2.6/images/document-properties.png +0 -0
  127. data/vendor/assets/svg-edit-2.6/images/dropdown.gif +0 -0
  128. data/vendor/assets/svg-edit-2.6/images/ellipse.png +0 -0
  129. data/vendor/assets/svg-edit-2.6/images/eye.png +0 -0
  130. data/vendor/assets/svg-edit-2.6/images/fhpath.png +0 -0
  131. data/vendor/assets/svg-edit-2.6/images/flyouth.png +0 -0
  132. data/vendor/assets/svg-edit-2.6/images/flyup.gif +0 -0
  133. data/vendor/assets/svg-edit-2.6/images/freehand-circle.png +0 -0
  134. data/vendor/assets/svg-edit-2.6/images/freehand-square.png +0 -0
  135. data/vendor/assets/svg-edit-2.6/images/go-down.png +0 -0
  136. data/vendor/assets/svg-edit-2.6/images/go-up.png +0 -0
  137. data/vendor/assets/svg-edit-2.6/images/image.png +0 -0
  138. data/vendor/assets/svg-edit-2.6/images/italic.png +0 -0
  139. data/vendor/assets/svg-edit-2.6/images/line.png +0 -0
  140. data/vendor/assets/svg-edit-2.6/images/link_controls.png +0 -0
  141. data/vendor/assets/svg-edit-2.6/images/logo.png +0 -0
  142. data/vendor/assets/svg-edit-2.6/images/logo.svg +32 -0
  143. data/vendor/assets/svg-edit-2.6/images/move_bottom.png +0 -0
  144. data/vendor/assets/svg-edit-2.6/images/move_top.png +0 -0
  145. data/vendor/assets/svg-edit-2.6/images/node_clone.png +0 -0
  146. data/vendor/assets/svg-edit-2.6/images/node_delete.png +0 -0
  147. data/vendor/assets/svg-edit-2.6/images/none.png +0 -0
  148. data/vendor/assets/svg-edit-2.6/images/open.png +0 -0
  149. data/vendor/assets/svg-edit-2.6/images/paste.png +0 -0
  150. data/vendor/assets/svg-edit-2.6/images/path.png +0 -0
  151. data/vendor/assets/svg-edit-2.6/images/polygon.png +0 -0
  152. data/vendor/assets/svg-edit-2.6/images/polygon.svg +219 -0
  153. data/vendor/assets/svg-edit-2.6/images/rect.png +0 -0
  154. data/vendor/assets/svg-edit-2.6/images/redo.png +0 -0
  155. data/vendor/assets/svg-edit-2.6/images/reorient.png +0 -0
  156. data/vendor/assets/svg-edit-2.6/images/rotate.png +0 -0
  157. data/vendor/assets/svg-edit-2.6/images/save.png +0 -0
  158. data/vendor/assets/svg-edit-2.6/images/select.png +0 -0
  159. data/vendor/assets/svg-edit-2.6/images/select_node.png +0 -0
  160. data/vendor/assets/svg-edit-2.6/images/sep.png +0 -0
  161. data/vendor/assets/svg-edit-2.6/images/shape_group.png +0 -0
  162. data/vendor/assets/svg-edit-2.6/images/shape_ungroup.png +0 -0
  163. data/vendor/assets/svg-edit-2.6/images/source.png +0 -0
  164. data/vendor/assets/svg-edit-2.6/images/spinbtn_updn_big.png +0 -0
  165. data/vendor/assets/svg-edit-2.6/images/square.png +0 -0
  166. data/vendor/assets/svg-edit-2.6/images/svg_edit_icons.svg +1034 -0
  167. data/vendor/assets/svg-edit-2.6/images/svg_edit_icons.svgz +0 -0
  168. data/vendor/assets/svg-edit-2.6/images/text.png +0 -0
  169. data/vendor/assets/svg-edit-2.6/images/text.svg +157 -0
  170. data/vendor/assets/svg-edit-2.6/images/to_path.png +0 -0
  171. data/vendor/assets/svg-edit-2.6/images/undo.png +0 -0
  172. data/vendor/assets/svg-edit-2.6/images/view-refresh.png +0 -0
  173. data/vendor/assets/svg-edit-2.6/images/wave.png +0 -0
  174. data/vendor/assets/svg-edit-2.6/images/wireframe.png +0 -0
  175. data/vendor/assets/svg-edit-2.6/images/zoom.png +0 -0
  176. data/vendor/assets/svg-edit-2.6/jgraduate/LICENSE +202 -0
  177. data/vendor/assets/svg-edit-2.6/jgraduate/README +3 -0
  178. data/vendor/assets/svg-edit-2.6/jgraduate/css/jPicker.css +1 -0
  179. data/vendor/assets/svg-edit-2.6/jgraduate/css/jgraduate.css +351 -0
  180. data/vendor/assets/svg-edit-2.6/jgraduate/images/AlphaBar.png +0 -0
  181. data/vendor/assets/svg-edit-2.6/jgraduate/images/Bars.png +0 -0
  182. data/vendor/assets/svg-edit-2.6/jgraduate/images/Maps.png +0 -0
  183. data/vendor/assets/svg-edit-2.6/jgraduate/images/NoColor.png +0 -0
  184. data/vendor/assets/svg-edit-2.6/jgraduate/images/bar-opacity.png +0 -0
  185. data/vendor/assets/svg-edit-2.6/jgraduate/images/map-opacity.png +0 -0
  186. data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint.gif +0 -0
  187. data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint_c.png +0 -0
  188. data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint_f.png +0 -0
  189. data/vendor/assets/svg-edit-2.6/jgraduate/images/picker.gif +0 -0
  190. data/vendor/assets/svg-edit-2.6/jgraduate/images/preview-opacity.png +0 -0
  191. data/vendor/assets/svg-edit-2.6/jgraduate/images/rangearrows.gif +0 -0
  192. data/vendor/assets/svg-edit-2.6/jgraduate/images/rangearrows2.gif +0 -0
  193. data/vendor/assets/svg-edit-2.6/jgraduate/jpicker.js +2091 -0
  194. data/vendor/assets/svg-edit-2.6/jgraduate/jpicker.min.js +1 -0
  195. data/vendor/assets/svg-edit-2.6/jgraduate/jquery.jgraduate.js +1175 -0
  196. data/vendor/assets/svg-edit-2.6/jgraduate/jquery.jgraduate.min.js +37 -0
  197. data/vendor/assets/svg-edit-2.6/jquery-ui/jquery-ui-1.8.17.custom.min.js +54 -0
  198. data/vendor/assets/svg-edit-2.6/jquery-ui/jquery-ui-1.8.custom.min.js +84 -0
  199. data/vendor/assets/svg-edit-2.6/jquery.js +4 -0
  200. data/vendor/assets/svg-edit-2.6/jquerybbq/jquery.bbq.min.js +18 -0
  201. data/vendor/assets/svg-edit-2.6/js-hotkeys/README.md +45 -0
  202. data/vendor/assets/svg-edit-2.6/js-hotkeys/jquery.hotkeys.min.js +15 -0
  203. data/vendor/assets/svg-edit-2.6/locale/README.txt +17 -0
  204. data/vendor/assets/svg-edit-2.6/locale/lang.af.js +234 -0
  205. data/vendor/assets/svg-edit-2.6/locale/lang.ar.js +234 -0
  206. data/vendor/assets/svg-edit-2.6/locale/lang.az.js +234 -0
  207. data/vendor/assets/svg-edit-2.6/locale/lang.be.js +234 -0
  208. data/vendor/assets/svg-edit-2.6/locale/lang.bg.js +234 -0
  209. data/vendor/assets/svg-edit-2.6/locale/lang.ca.js +234 -0
  210. data/vendor/assets/svg-edit-2.6/locale/lang.cs.js +234 -0
  211. data/vendor/assets/svg-edit-2.6/locale/lang.cy.js +234 -0
  212. data/vendor/assets/svg-edit-2.6/locale/lang.da.js +234 -0
  213. data/vendor/assets/svg-edit-2.6/locale/lang.de.js +234 -0
  214. data/vendor/assets/svg-edit-2.6/locale/lang.el.js +234 -0
  215. data/vendor/assets/svg-edit-2.6/locale/lang.en.js +234 -0
  216. data/vendor/assets/svg-edit-2.6/locale/lang.es.js +234 -0
  217. data/vendor/assets/svg-edit-2.6/locale/lang.et.js +234 -0
  218. data/vendor/assets/svg-edit-2.6/locale/lang.fa.js +234 -0
  219. data/vendor/assets/svg-edit-2.6/locale/lang.fi.js +234 -0
  220. data/vendor/assets/svg-edit-2.6/locale/lang.fr.js +234 -0
  221. data/vendor/assets/svg-edit-2.6/locale/lang.fy.js +234 -0
  222. data/vendor/assets/svg-edit-2.6/locale/lang.ga.js +234 -0
  223. data/vendor/assets/svg-edit-2.6/locale/lang.gl.js +234 -0
  224. data/vendor/assets/svg-edit-2.6/locale/lang.he.js +234 -0
  225. data/vendor/assets/svg-edit-2.6/locale/lang.hi.js +234 -0
  226. data/vendor/assets/svg-edit-2.6/locale/lang.hr.js +234 -0
  227. data/vendor/assets/svg-edit-2.6/locale/lang.hu.js +234 -0
  228. data/vendor/assets/svg-edit-2.6/locale/lang.hy.js +234 -0
  229. data/vendor/assets/svg-edit-2.6/locale/lang.id.js +234 -0
  230. data/vendor/assets/svg-edit-2.6/locale/lang.is.js +234 -0
  231. data/vendor/assets/svg-edit-2.6/locale/lang.it.js +234 -0
  232. data/vendor/assets/svg-edit-2.6/locale/lang.ja.js +234 -0
  233. data/vendor/assets/svg-edit-2.6/locale/lang.ko.js +234 -0
  234. data/vendor/assets/svg-edit-2.6/locale/lang.lt.js +234 -0
  235. data/vendor/assets/svg-edit-2.6/locale/lang.lv.js +234 -0
  236. data/vendor/assets/svg-edit-2.6/locale/lang.mk.js +234 -0
  237. data/vendor/assets/svg-edit-2.6/locale/lang.ms.js +234 -0
  238. data/vendor/assets/svg-edit-2.6/locale/lang.mt.js +234 -0
  239. data/vendor/assets/svg-edit-2.6/locale/lang.nl.js +234 -0
  240. data/vendor/assets/svg-edit-2.6/locale/lang.no.js +234 -0
  241. data/vendor/assets/svg-edit-2.6/locale/lang.pl.js +234 -0
  242. data/vendor/assets/svg-edit-2.6/locale/lang.pt-BR.js +234 -0
  243. data/vendor/assets/svg-edit-2.6/locale/lang.pt-PT.js +234 -0
  244. data/vendor/assets/svg-edit-2.6/locale/lang.ro.js +234 -0
  245. data/vendor/assets/svg-edit-2.6/locale/lang.ru.js +234 -0
  246. data/vendor/assets/svg-edit-2.6/locale/lang.sk.js +234 -0
  247. data/vendor/assets/svg-edit-2.6/locale/lang.sl.js +234 -0
  248. data/vendor/assets/svg-edit-2.6/locale/lang.sq.js +234 -0
  249. data/vendor/assets/svg-edit-2.6/locale/lang.sr.js +234 -0
  250. data/vendor/assets/svg-edit-2.6/locale/lang.sv.js +234 -0
  251. data/vendor/assets/svg-edit-2.6/locale/lang.sw.js +234 -0
  252. data/vendor/assets/svg-edit-2.6/locale/lang.test.js +234 -0
  253. data/vendor/assets/svg-edit-2.6/locale/lang.th.js +234 -0
  254. data/vendor/assets/svg-edit-2.6/locale/lang.tl.js +234 -0
  255. data/vendor/assets/svg-edit-2.6/locale/lang.tr.js +234 -0
  256. data/vendor/assets/svg-edit-2.6/locale/lang.uk.js +234 -0
  257. data/vendor/assets/svg-edit-2.6/locale/lang.vi.js +234 -0
  258. data/vendor/assets/svg-edit-2.6/locale/lang.yi.js +234 -0
  259. data/vendor/assets/svg-edit-2.6/locale/lang.zh-CN.js +234 -0
  260. data/vendor/assets/svg-edit-2.6/locale/lang.zh-HK.js +234 -0
  261. data/vendor/assets/svg-edit-2.6/locale/lang.zh-TW.js +234 -0
  262. data/vendor/assets/svg-edit-2.6/locale/locale.js +320 -0
  263. data/vendor/assets/svg-edit-2.6/math.js +246 -0
  264. data/vendor/assets/svg-edit-2.6/path.js +980 -0
  265. data/vendor/assets/svg-edit-2.6/sanitize.js +273 -0
  266. data/vendor/assets/svg-edit-2.6/select.js +532 -0
  267. data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.css +41 -0
  268. data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.js +266 -0
  269. data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.min.js +7 -0
  270. data/vendor/assets/svg-edit-2.6/spinbtn/spinbtn_updn.png +0 -0
  271. data/vendor/assets/svg-edit-2.6/svg-editor.css +1495 -0
  272. data/vendor/assets/svg-edit-2.6/svg-editor.css~ +1500 -0
  273. data/vendor/assets/svg-edit-2.6/svg-editor.html +788 -0
  274. data/vendor/assets/svg-edit-2.6/svg-editor.html~ +788 -0
  275. data/vendor/assets/svg-edit-2.6/svg-editor.js +4969 -0
  276. data/vendor/assets/svg-edit-2.6/svg-editor.manifest +121 -0
  277. data/vendor/assets/svg-edit-2.6/svgcanvas.js +8775 -0
  278. data/vendor/assets/svg-edit-2.6/svgedit.compiled.js +465 -0
  279. data/vendor/assets/svg-edit-2.6/svgicons/jquery.svgicons.js +486 -0
  280. data/vendor/assets/svg-edit-2.6/svgtransformlist.js +291 -0
  281. data/vendor/assets/svg-edit-2.6/svgutils.js +651 -0
  282. data/vendor/assets/svg-edit-2.6/touch.js +30 -0
  283. data/vendor/assets/svg-edit-2.6/units.js +281 -0
  284. metadata +407 -0
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Package: svgedit.sanitize
3
+ *
4
+ * Licensed under the MIT License
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"],
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": ["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": ["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,532 @@
1
+ /**
2
+ * Package: svedit.select
3
+ *
4
+ * Licensed under the MIT License
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
+ var gripRadius;
29
+ svgedit.browser.isTouch() ? gripRadius = 10 : gripRadius = 4;
30
+
31
+ // Class: svgedit.select.Selector
32
+ // Private class for DOM element selection boxes
33
+ //
34
+ // Parameters:
35
+ // id - integer to internally indentify the selector
36
+ // elem - DOM element associated with this selector
37
+ svgedit.select.Selector = function(id, elem) {
38
+ // this is the selector's unique number
39
+ this.id = id;
40
+
41
+ // this holds a reference to the element for which this selector is being used
42
+ this.selectedElement = elem;
43
+
44
+ // this is a flag used internally to track whether the selector is being used or not
45
+ this.locked = true;
46
+
47
+ // this holds a reference to the <g> element that holds all visual elements of the selector
48
+ this.selectorGroup = svgFactory_.createSVGElement({
49
+ 'element': 'g',
50
+ 'attr': {'id': ('selectorGroup' + this.id)}
51
+ });
52
+
53
+ // this holds a reference to the path rect
54
+ this.selectorRect = this.selectorGroup.appendChild(
55
+ svgFactory_.createSVGElement({
56
+ 'element': 'path',
57
+ 'attr': {
58
+ 'id': ('selectedBox' + this.id),
59
+ 'fill': 'none',
60
+ 'stroke': '#22C',
61
+ 'stroke-width': '1',
62
+ 'stroke-dasharray': '5,5',
63
+ // need to specify this so that the rect is not selectable
64
+ 'style': 'pointer-events:none'
65
+ }
66
+ })
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
+ // TODO(codedread): Is this if needed?
237
+ // if(selected === selectedElements[0]) {
238
+ this.gripCoords = {
239
+ 'nw': [nbax, nbay],
240
+ 'ne': [nbax+nbaw, nbay],
241
+ 'sw': [nbax, nbay+nbah],
242
+ 'se': [nbax+nbaw, nbay+nbah],
243
+ 'n': [nbax + (nbaw)/2, nbay],
244
+ 'w': [nbax, nbay + (nbah)/2],
245
+ 'e': [nbax + nbaw, nbay + (nbah)/2],
246
+ 's': [nbax + (nbaw)/2, nbay + nbah]
247
+ };
248
+
249
+ for(var dir in this.gripCoords) {
250
+ var coords = this.gripCoords[dir];
251
+ selectedGrips[dir].setAttribute('cx', coords[0]);
252
+ selectedGrips[dir].setAttribute('cy', coords[1]);
253
+ };
254
+
255
+ // we want to go 20 pixels in the negative transformed y direction, ignoring scale
256
+ mgr.rotateGripConnector.setAttribute('x1', nbax + (nbaw)/2);
257
+ mgr.rotateGripConnector.setAttribute('y1', nbay);
258
+ mgr.rotateGripConnector.setAttribute('x2', nbax + (nbaw)/2);
259
+ mgr.rotateGripConnector.setAttribute('y2', nbay - (gripRadius*5));
260
+
261
+ mgr.rotateGrip.setAttribute('cx', nbax + (nbaw)/2);
262
+ mgr.rotateGrip.setAttribute('cy', nbay - (gripRadius*5));
263
+ // }
264
+
265
+ svgFactory_.svgRoot().unsuspendRedraw(sr_handle);
266
+ };
267
+
268
+
269
+ // Class: svgedit.select.SelectorManager
270
+ svgedit.select.SelectorManager = function() {
271
+ // this will hold the <g> element that contains all selector rects/grips
272
+ this.selectorParentGroup = null;
273
+
274
+ // this is a special rect that is used for multi-select
275
+ this.rubberBandBox = null;
276
+
277
+ // this will hold objects of type svgedit.select.Selector (see above)
278
+ this.selectors = [];
279
+
280
+ // this holds a map of SVG elements to their Selector object
281
+ this.selectorMap = {};
282
+
283
+ // this holds a reference to the grip elements
284
+ this.selectorGrips = {
285
+ 'nw': null,
286
+ 'n' : null,
287
+ 'ne': null,
288
+ 'e' : null,
289
+ 'se': null,
290
+ 's' : null,
291
+ 'sw': null,
292
+ 'w' : null
293
+ };
294
+
295
+ this.selectorGripsGroup = null;
296
+ this.rotateGripConnector = null;
297
+ this.rotateGrip = null;
298
+
299
+ this.initGroup();
300
+ };
301
+
302
+ // Function: svgedit.select.SelectorManager.initGroup
303
+ // Resets the parent selector group element
304
+ svgedit.select.SelectorManager.prototype.initGroup = function() {
305
+ // remove old selector parent group if it existed
306
+ if (this.selectorParentGroup && this.selectorParentGroup.parentNode) {
307
+ this.selectorParentGroup.parentNode.removeChild(this.selectorParentGroup);
308
+ }
309
+
310
+ // create parent selector group and add it to svgroot
311
+ this.selectorParentGroup = svgFactory_.createSVGElement({
312
+ 'element': 'g',
313
+ 'attr': {'id': 'selectorParentGroup'}
314
+ });
315
+ this.selectorGripsGroup = svgFactory_.createSVGElement({
316
+ 'element': 'g',
317
+ 'attr': {'display': 'none'}
318
+ });
319
+ this.selectorParentGroup.appendChild(this.selectorGripsGroup);
320
+ svgFactory_.svgRoot().appendChild(this.selectorParentGroup);
321
+
322
+ this.selectorMap = {};
323
+ this.selectors = [];
324
+ this.rubberBandBox = null;
325
+
326
+ // add the corner grips
327
+ for (var dir in this.selectorGrips) {
328
+ var grip = svgFactory_.createSVGElement({
329
+ 'element': 'circle',
330
+ 'attr': {
331
+ 'id': ('selectorGrip_resize_' + dir),
332
+ 'fill': '#22C',
333
+ 'r': gripRadius,
334
+ 'style': ('cursor:' + dir + '-resize'),
335
+ // This expands the mouse-able area of the grips making them
336
+ // easier to grab with the mouse.
337
+ // This works in Opera and WebKit, but does not work in Firefox
338
+ // see https://bugzilla.mozilla.org/show_bug.cgi?id=500174
339
+ 'stroke-width': 2,
340
+ 'pointer-events': 'all'
341
+ }
342
+ });
343
+
344
+ $.data(grip, 'dir', dir);
345
+ $.data(grip, 'type', 'resize');
346
+ this.selectorGrips[dir] = this.selectorGripsGroup.appendChild(grip);
347
+ }
348
+
349
+ // add rotator elems
350
+ this.rotateGripConnector = this.selectorGripsGroup.appendChild(
351
+ svgFactory_.createSVGElement({
352
+ 'element': 'line',
353
+ 'attr': {
354
+ 'id': ('selectorGrip_rotateconnector'),
355
+ 'stroke': '#22C',
356
+ 'stroke-width': '1'
357
+ }
358
+ })
359
+ );
360
+
361
+ this.rotateGrip = this.selectorGripsGroup.appendChild(
362
+ svgFactory_.createSVGElement({
363
+ 'element': 'circle',
364
+ 'attr': {
365
+ 'id': 'selectorGrip_rotate',
366
+ 'fill': 'lime',
367
+ 'r': gripRadius,
368
+ 'stroke': '#22C',
369
+ 'stroke-width': 2,
370
+ 'style': 'cursor:url(' + config_.imgPath + 'rotate.png) 12 12, auto;'
371
+ }
372
+ })
373
+ );
374
+ $.data(this.rotateGrip, 'type', 'rotate');
375
+
376
+ if($('#canvasBackground').length) return;
377
+
378
+ var dims = config_.dimensions;
379
+ var canvasbg = svgFactory_.createSVGElement({
380
+ 'element': 'svg',
381
+ 'attr': {
382
+ 'id': 'canvasBackground',
383
+ 'width': dims[0],
384
+ 'height': dims[1],
385
+ 'x': 0,
386
+ 'y': 0,
387
+ 'overflow': (svgedit.browser.isWebkit() ? 'none' : 'visible'), // Chrome 7 has a problem with this when zooming out
388
+ 'style': 'pointer-events:none'
389
+ }
390
+ });
391
+
392
+ var rect = svgFactory_.createSVGElement({
393
+ 'element': 'rect',
394
+ 'attr': {
395
+ 'width': '100%',
396
+ 'height': '100%',
397
+ 'x': 0,
398
+ 'y': 0,
399
+ 'stroke-width': 1,
400
+ 'stroke': '#000',
401
+ 'fill': '#FFF',
402
+ 'style': 'pointer-events:none'
403
+ }
404
+ });
405
+
406
+ // Both Firefox and WebKit are too slow with this filter region (especially at higher
407
+ // zoom levels) and Opera has at least one bug
408
+ // if (!svgedit.browser.isOpera()) rect.setAttribute('filter', 'url(#canvashadow)');
409
+ canvasbg.appendChild(rect);
410
+ svgFactory_.svgRoot().insertBefore(canvasbg, svgFactory_.svgContent());
411
+ };
412
+
413
+ // Function: svgedit.select.SelectorManager.requestSelector
414
+ // Returns the selector based on the given element
415
+ //
416
+ // Parameters:
417
+ // elem - DOM element to get the selector for
418
+ svgedit.select.SelectorManager.prototype.requestSelector = function(elem) {
419
+ if (elem == null) return null;
420
+ var N = this.selectors.length;
421
+ // If we've already acquired one for this element, return it.
422
+ if (typeof(this.selectorMap[elem.id]) == 'object') {
423
+ this.selectorMap[elem.id].locked = true;
424
+ return this.selectorMap[elem.id];
425
+ }
426
+ for (var i = 0; i < N; ++i) {
427
+ if (this.selectors[i] && !this.selectors[i].locked) {
428
+ this.selectors[i].locked = true;
429
+ this.selectors[i].reset(elem);
430
+ this.selectorMap[elem.id] = this.selectors[i];
431
+ return this.selectors[i];
432
+ }
433
+ }
434
+ // if we reached here, no available selectors were found, we create one
435
+ this.selectors[N] = new svgedit.select.Selector(N, elem);
436
+ this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup);
437
+ this.selectorMap[elem.id] = this.selectors[N];
438
+ return this.selectors[N];
439
+ };
440
+
441
+ // Function: svgedit.select.SelectorManager.releaseSelector
442
+ // Removes the selector of the given element (hides selection box)
443
+ //
444
+ // Parameters:
445
+ // elem - DOM element to remove the selector for
446
+ svgedit.select.SelectorManager.prototype.releaseSelector = function(elem) {
447
+ if (elem == null) return;
448
+ var N = this.selectors.length,
449
+ sel = this.selectorMap[elem.id];
450
+ for (var i = 0; i < N; ++i) {
451
+ if (this.selectors[i] && this.selectors[i] == sel) {
452
+ if (sel.locked == false) {
453
+ // TODO(codedread): Ensure this exists in this module.
454
+ console.log('WARNING! selector was released but was already unlocked');
455
+ }
456
+ delete this.selectorMap[elem.id];
457
+ sel.locked = false;
458
+ sel.selectedElement = null;
459
+ sel.showGrips(false);
460
+
461
+ // remove from DOM and store reference in JS but only if it exists in the DOM
462
+ try {
463
+ sel.selectorGroup.setAttribute('display', 'none');
464
+ } catch(e) { }
465
+
466
+ break;
467
+ }
468
+ }
469
+ };
470
+
471
+ // Function: svgedit.select.SelectorManager.getRubberBandBox
472
+ // Returns the rubberBandBox DOM element. This is the rectangle drawn by the user for selecting/zooming
473
+ svgedit.select.SelectorManager.prototype.getRubberBandBox = function() {
474
+ if (!this.rubberBandBox) {
475
+ this.rubberBandBox = this.selectorParentGroup.appendChild(
476
+ svgFactory_.createSVGElement({
477
+ 'element': 'rect',
478
+ 'attr': {
479
+ 'id': 'selectorRubberBand',
480
+ 'fill': '#22C',
481
+ 'fill-opacity': 0.15,
482
+ 'stroke': '#22C',
483
+ 'stroke-width': 0.5,
484
+ 'display': 'none',
485
+ 'style': 'pointer-events:none'
486
+ }
487
+ })
488
+ );
489
+ }
490
+ return this.rubberBandBox;
491
+ };
492
+
493
+
494
+ /**
495
+ * Interface: svgedit.select.SVGFactory
496
+ * An object that creates SVG elements for the canvas.
497
+ *
498
+ * interface svgedit.select.SVGFactory {
499
+ * SVGElement createSVGElement(jsonMap);
500
+ * SVGSVGElement svgRoot();
501
+ * SVGSVGElement svgContent();
502
+ *
503
+ * Number currentZoom();
504
+ * Object getStrokedBBox(Element[]); // TODO(codedread): Remove when getStrokedBBox() has been put into svgutils.js
505
+ * }
506
+ */
507
+
508
+ /**
509
+ * Function: svgedit.select.init()
510
+ * Initializes this module.
511
+ *
512
+ * Parameters:
513
+ * config - an object containing configurable parameters (imgPath)
514
+ * svgFactory - an object implementing the SVGFactory interface (see above).
515
+ */
516
+ svgedit.select.init = function(config, svgFactory) {
517
+ config_ = config;
518
+ svgFactory_ = svgFactory;
519
+ selectorManager_ = new svgedit.select.SelectorManager();
520
+ };
521
+
522
+ /**
523
+ * Function: svgedit.select.getSelectorManager
524
+ *
525
+ * Returns:
526
+ * The SelectorManager instance.
527
+ */
528
+ svgedit.select.getSelectorManager = function() {
529
+ return selectorManager_;
530
+ };
531
+
532
+ })();