ela 1.1.0

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 (300) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.gitlab-ci.yml +23 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +139 -0
  6. data/Guardfile +25 -0
  7. data/LICENSE.txt +205 -0
  8. data/README.de.md +195 -0
  9. data/README.md +66 -0
  10. data/Rakefile +96 -0
  11. data/app/css/screen.styl +425 -0
  12. data/app/css/vendor/stackedit.styl +140 -0
  13. data/app/fonts/Roboto-Italic-webfont.eot +0 -0
  14. data/app/fonts/Roboto-Italic-webfont.svg +642 -0
  15. data/app/fonts/Roboto-Italic-webfont.ttf +0 -0
  16. data/app/fonts/Roboto-Italic-webfont.woff +0 -0
  17. data/app/fonts/Roboto-Light-webfont.eot +0 -0
  18. data/app/fonts/Roboto-Light-webfont.svg +641 -0
  19. data/app/fonts/Roboto-Light-webfont.ttf +0 -0
  20. data/app/fonts/Roboto-Light-webfont.woff +0 -0
  21. data/app/fonts/Roboto-LightItalic-webfont.eot +0 -0
  22. data/app/fonts/Roboto-LightItalic-webfont.svg +641 -0
  23. data/app/fonts/Roboto-LightItalic-webfont.ttf +0 -0
  24. data/app/fonts/Roboto-LightItalic-webfont.woff +0 -0
  25. data/app/fonts/Roboto-Medium-webfont.eot +0 -0
  26. data/app/fonts/Roboto-Medium-webfont.svg +593 -0
  27. data/app/fonts/Roboto-Medium-webfont.ttf +0 -0
  28. data/app/fonts/Roboto-Medium-webfont.woff +0 -0
  29. data/app/fonts/Roboto-MediumItalic-webfont.eot +0 -0
  30. data/app/fonts/Roboto-MediumItalic-webfont.svg +642 -0
  31. data/app/fonts/Roboto-MediumItalic-webfont.ttf +0 -0
  32. data/app/fonts/Roboto-MediumItalic-webfont.woff +0 -0
  33. data/app/fonts/Roboto-Regular-webfont.eot +0 -0
  34. data/app/fonts/Roboto-Regular-webfont.svg +621 -0
  35. data/app/fonts/Roboto-Regular-webfont.ttf +0 -0
  36. data/app/fonts/Roboto-Regular-webfont.woff +0 -0
  37. data/app/fonts/Roboto-Thin-webfont.eot +0 -0
  38. data/app/fonts/Roboto-Thin-webfont.svg +631 -0
  39. data/app/fonts/Roboto-Thin-webfont.ttf +0 -0
  40. data/app/fonts/Roboto-Thin-webfont.woff +0 -0
  41. data/app/fonts/Roboto-ThinItalic-webfont.eot +0 -0
  42. data/app/fonts/Roboto-ThinItalic-webfont.svg +631 -0
  43. data/app/fonts/Roboto-ThinItalic-webfont.ttf +0 -0
  44. data/app/fonts/Roboto-ThinItalic-webfont.woff +0 -0
  45. data/app/fonts/droid_sans_regular.typeface.svg +1 -0
  46. data/app/fonts/fontawesome-webfont.eot +0 -0
  47. data/app/fonts/fontawesome-webfont.svg +2671 -0
  48. data/app/fonts/fontawesome-webfont.ttf +0 -0
  49. data/app/fonts/fontawesome-webfont.woff +0 -0
  50. data/app/fonts/fontawesome-webfont.woff2 +0 -0
  51. data/app/js/lib/application.coffee +83 -0
  52. data/app/js/lib/bootstrap_data.coffee +70 -0
  53. data/app/js/lib/collections/00_limited_collection.coffee +85 -0
  54. data/app/js/lib/collections/curves.coffee +3 -0
  55. data/app/js/lib/collections/named_object_collection.coffee +7 -0
  56. data/app/js/lib/mathjaxConfig.coffee +241 -0
  57. data/app/js/lib/models/app.coffee +58 -0
  58. data/app/js/lib/models/base_app.coffee +62 -0
  59. data/app/js/lib/models/base_app_model.coffee +61 -0
  60. data/app/js/lib/models/base_calculator.coffee +212 -0
  61. data/app/js/lib/models/base_subapp_container.coffee +35 -0
  62. data/app/js/lib/models/curve.coffee +179 -0
  63. data/app/js/lib/router.coffee +26 -0
  64. data/app/js/lib/views/app.coffee +56 -0
  65. data/app/js/lib/views/base_app.coffee +274 -0
  66. data/app/js/lib/views/base_aside.coffee +9 -0
  67. data/app/js/lib/views/base_graph.coffee +477 -0
  68. data/app/js/lib/views/base_subapp_container.coffee +44 -0
  69. data/app/js/lib/views/canvas.coffee +73 -0
  70. data/app/js/lib/views/curve_graph.coffee +163 -0
  71. data/app/js/lib/views/curves_aside.coffee +21 -0
  72. data/app/js/lib/views/curves_list_item.coffee +8 -0
  73. data/app/js/lib/views/grouped_parameters_aside.coffee +14 -0
  74. data/app/js/lib/views/headup.coffee +15 -0
  75. data/app/js/lib/views/help.coffee +86 -0
  76. data/app/js/lib/views/interpolated_graph.coffee +281 -0
  77. data/app/js/lib/views/legend.coffee +138 -0
  78. data/app/js/lib/views/legend_handler.coffee +51 -0
  79. data/app/js/lib/views/overview.coffee +85 -0
  80. data/app/js/lib/views/overview_tile.coffee +18 -0
  81. data/app/js/lib/views/parameters_aside.coffee +12 -0
  82. data/app/js/lib/views/three_graph.coffee +92 -0
  83. data/app/js/vendor/Markdown.Converter.js +1519 -0
  84. data/app/js/vendor/Markdown.Extra.js +874 -0
  85. data/app/js/vendor/Markdown.Toc.coffee +79 -0
  86. data/app/js/vendor/backbone-1.3.3.min.js +2 -0
  87. data/app/js/vendor/backbone-validation-0.11.5.js +8 -0
  88. data/app/js/vendor/backbone.poised/form.coffee +156 -0
  89. data/app/js/vendor/backbone.poised/form/anchor.coffee +26 -0
  90. data/app/js/vendor/backbone.poised/form/base_control.coffee +42 -0
  91. data/app/js/vendor/backbone.poised/form/linked_control.coffee +79 -0
  92. data/app/js/vendor/backbone.poised/form/linked_number_control.coffee +27 -0
  93. data/app/js/vendor/backbone.poised/form/linked_range_control.coffee +53 -0
  94. data/app/js/vendor/backbone.poised/form/linked_select_control.coffee +18 -0
  95. data/app/js/vendor/backbone.poised/form/linked_string_control.coffee +27 -0
  96. data/app/js/vendor/backbone.poised/form/number_control.coffee +25 -0
  97. data/app/js/vendor/backbone.poised/form/range_control.coffee +48 -0
  98. data/app/js/vendor/backbone.poised/form/select_control.coffee +16 -0
  99. data/app/js/vendor/backbone.poised/form/selectbox.coffee +78 -0
  100. data/app/js/vendor/backbone.poised/form/slider.coffee +109 -0
  101. data/app/js/vendor/backbone.poised/form/string_control.coffee +23 -0
  102. data/app/js/vendor/backbone.poised/form/submit_control.coffee +39 -0
  103. data/app/js/vendor/backbone.poised/form/textarea.coffee +36 -0
  104. data/app/js/vendor/backbone.poised/form/textfield.coffee +86 -0
  105. data/app/js/vendor/backbone.poised/form/value.coffee +33 -0
  106. data/app/js/vendor/backbone.poised/form/value_control.coffee +15 -0
  107. data/app/js/vendor/backbone.poised/linked_form.coffee +43 -0
  108. data/app/js/vendor/backbone.poised/list.coffee +97 -0
  109. data/app/js/vendor/backbone.poised/list/add_button.coffee +16 -0
  110. data/app/js/vendor/backbone.poised/list/anchor.coffee +32 -0
  111. data/app/js/vendor/backbone.poised/list/item.coffee +68 -0
  112. data/app/js/vendor/backbone.poised/list/searchfield.coffee +26 -0
  113. data/app/js/vendor/backbone.poised/list/selectable_item.coffee +65 -0
  114. data/app/js/vendor/backbone.poised/patches.coffee +6 -0
  115. data/app/js/vendor/backbone.poised/string_mixin.coffee +23 -0
  116. data/app/js/vendor/backbone.poised/underscore_ext.coffee +2 -0
  117. data/app/js/vendor/backbone.poised/view.coffee +59 -0
  118. data/app/js/vendor/gaussianElimination.coffee +40 -0
  119. data/app/js/vendor/hammer-2.0.8.min.js +7 -0
  120. data/app/js/vendor/jquery-3.1.1.min.js +4 -0
  121. data/app/js/vendor/jquery.after-transition.coffee +20 -0
  122. data/app/js/vendor/jquery.backbone-hammer.coffee +28 -0
  123. data/app/js/vendor/jquery.keyboard-modifiers.coffee +22 -0
  124. data/app/js/vendor/jquery.mark-5.2.3.min.js +7 -0
  125. data/app/js/vendor/jquery.scrollTo-2.1.2.min.js +7 -0
  126. data/app/js/vendor/js-yaml-3.4.3.min.js +3 -0
  127. data/app/js/vendor/markup_text.coffee +95 -0
  128. data/app/js/vendor/mathjax/MathJax.js +19 -0
  129. data/app/js/vendor/mathjax/extensions/MathEvents.js +19 -0
  130. data/app/js/vendor/mathjax/extensions/tex2jax.js +19 -0
  131. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_AMS-Regular.eot +0 -0
  132. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Bold.eot +0 -0
  133. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Caligraphic-Regular.eot +0 -0
  134. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Bold.eot +0 -0
  135. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Fraktur-Regular.eot +0 -0
  136. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Bold.eot +0 -0
  137. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Italic.eot +0 -0
  138. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot +0 -0
  139. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Math-BoldItalic.eot +0 -0
  140. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eot +0 -0
  141. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Math-Regular.eot +0 -0
  142. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Bold.eot +0 -0
  143. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Italic.eot +0 -0
  144. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_SansSerif-Regular.eot +0 -0
  145. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Script-Regular.eot +0 -0
  146. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Size1-Regular.eot +0 -0
  147. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Size2-Regular.eot +0 -0
  148. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Size3-Regular.eot +0 -0
  149. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Size4-Regular.eot +0 -0
  150. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_Typewriter-Regular.eot +0 -0
  151. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/eot/MathJax_WinIE6-Regular.eot +0 -0
  152. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_AMS-Regular.otf +0 -0
  153. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Bold.otf +0 -0
  154. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Caligraphic-Regular.otf +0 -0
  155. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Bold.otf +0 -0
  156. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Fraktur-Regular.otf +0 -0
  157. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Bold.otf +0 -0
  158. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Italic.otf +0 -0
  159. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf +0 -0
  160. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Math-BoldItalic.otf +0 -0
  161. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf +0 -0
  162. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Math-Regular.otf +0 -0
  163. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Bold.otf +0 -0
  164. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Italic.otf +0 -0
  165. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_SansSerif-Regular.otf +0 -0
  166. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Script-Regular.otf +0 -0
  167. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Size1-Regular.otf +0 -0
  168. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Size2-Regular.otf +0 -0
  169. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Size3-Regular.otf +0 -0
  170. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Size4-Regular.otf +0 -0
  171. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_Typewriter-Regular.otf +0 -0
  172. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_WinChrome-Regular.otf +0 -0
  173. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/otf/MathJax_WinIE6-Regular.otf +0 -0
  174. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_AMS-Regular.svg +765 -0
  175. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Caligraphic-Bold.svg +136 -0
  176. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Caligraphic-Regular.svg +134 -0
  177. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Fraktur-Bold.svg +319 -0
  178. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Fraktur-Regular.svg +309 -0
  179. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Main-Bold.svg +656 -0
  180. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Main-Italic.svg +374 -0
  181. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Main-Regular.svg +659 -0
  182. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Math-BoldItalic.svg +331 -0
  183. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Math-Italic.svg +331 -0
  184. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Math-Regular.svg +330 -0
  185. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_SansSerif-Bold.svg +280 -0
  186. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_SansSerif-Italic.svg +245 -0
  187. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_SansSerif-Regular.svg +211 -0
  188. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Script-Regular.svg +160 -0
  189. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Size1-Regular.svg +110 -0
  190. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Size2-Regular.svg +109 -0
  191. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Size3-Regular.svg +49 -0
  192. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Size4-Regular.svg +102 -0
  193. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_Typewriter-Regular.svg +322 -0
  194. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/svg/MathJax_WinChrome-Regular.svg +39 -0
  195. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff +0 -0
  196. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff +0 -0
  197. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Regular.woff +0 -0
  198. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Bold.woff +0 -0
  199. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Regular.woff +0 -0
  200. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Bold.woff +0 -0
  201. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Italic.woff +0 -0
  202. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff +0 -0
  203. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Math-BoldItalic.woff +0 -0
  204. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff +0 -0
  205. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Regular.woff +0 -0
  206. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Bold.woff +0 -0
  207. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Italic.woff +0 -0
  208. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff +0 -0
  209. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Script-Regular.woff +0 -0
  210. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Size1-Regular.woff +0 -0
  211. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Size2-Regular.woff +0 -0
  212. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Size3-Regular.woff +0 -0
  213. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Size4-Regular.woff +0 -0
  214. data/app/js/vendor/mathjax/fonts/HTML-CSS/TeX/woff/MathJax_Typewriter-Regular.woff +0 -0
  215. data/app/js/vendor/mathjax/jax/element/mml/jax.js +19 -0
  216. data/app/js/vendor/mathjax/jax/element/mml/optable/Arrows.js +19 -0
  217. data/app/js/vendor/mathjax/jax/element/mml/optable/BasicLatin.js +19 -0
  218. data/app/js/vendor/mathjax/jax/element/mml/optable/CombDiacritMarks.js +19 -0
  219. data/app/js/vendor/mathjax/jax/element/mml/optable/CombDiactForSymbols.js +19 -0
  220. data/app/js/vendor/mathjax/jax/element/mml/optable/Dingbats.js +19 -0
  221. data/app/js/vendor/mathjax/jax/element/mml/optable/GeneralPunctuation.js +19 -0
  222. data/app/js/vendor/mathjax/jax/element/mml/optable/GeometricShapes.js +19 -0
  223. data/app/js/vendor/mathjax/jax/element/mml/optable/GreekAndCoptic.js +19 -0
  224. data/app/js/vendor/mathjax/jax/element/mml/optable/Latin1Supplement.js +19 -0
  225. data/app/js/vendor/mathjax/jax/element/mml/optable/LetterlikeSymbols.js +19 -0
  226. data/app/js/vendor/mathjax/jax/element/mml/optable/MathOperators.js +19 -0
  227. data/app/js/vendor/mathjax/jax/element/mml/optable/MiscMathSymbolsA.js +19 -0
  228. data/app/js/vendor/mathjax/jax/element/mml/optable/MiscMathSymbolsB.js +19 -0
  229. data/app/js/vendor/mathjax/jax/element/mml/optable/MiscSymbolsAndArrows.js +19 -0
  230. data/app/js/vendor/mathjax/jax/element/mml/optable/MiscTechnical.js +19 -0
  231. data/app/js/vendor/mathjax/jax/element/mml/optable/SpacingModLetters.js +19 -0
  232. data/app/js/vendor/mathjax/jax/element/mml/optable/SuppMathOperators.js +19 -0
  233. data/app/js/vendor/mathjax/jax/element/mml/optable/SupplementalArrowsA.js +19 -0
  234. data/app/js/vendor/mathjax/jax/element/mml/optable/SupplementalArrowsB.js +19 -0
  235. data/app/js/vendor/mathjax/jax/input/TeX/config.js +19 -0
  236. data/app/js/vendor/mathjax/jax/input/TeX/jax.js +19 -0
  237. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/annotation-xml.js +19 -0
  238. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/maction.js +19 -0
  239. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/menclose.js +19 -0
  240. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/mglyph.js +19 -0
  241. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/mmultiscripts.js +19 -0
  242. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/ms.js +19 -0
  243. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/mtable.js +19 -0
  244. data/app/js/vendor/mathjax/jax/output/CommonHTML/autoload/multiline.js +19 -0
  245. data/app/js/vendor/mathjax/jax/output/CommonHTML/config.js +19 -0
  246. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js +19 -0
  247. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Caligraphic-Bold.js +19 -0
  248. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Fraktur-Bold.js +19 -0
  249. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Fraktur-Regular.js +19 -0
  250. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Main-Bold.js +19 -0
  251. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Math-BoldItalic.js +19 -0
  252. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/SansSerif-Bold.js +19 -0
  253. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/SansSerif-Italic.js +19 -0
  254. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/SansSerif-Regular.js +19 -0
  255. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Script-Regular.js +19 -0
  256. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/Typewriter-Regular.js +19 -0
  257. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/fontdata-extra.js +19 -0
  258. data/app/js/vendor/mathjax/jax/output/CommonHTML/fonts/TeX/fontdata.js +19 -0
  259. data/app/js/vendor/mathjax/jax/output/CommonHTML/jax.js +19 -0
  260. data/app/js/vendor/modernizr-custom-3.3.1.min.js +3 -0
  261. data/app/js/vendor/persistjs-git.js +1136 -0
  262. data/app/js/vendor/poised/poised.general.coffee +21 -0
  263. data/app/js/vendor/poised/poised.tabs.coffee +31 -0
  264. data/app/js/vendor/poised/utils.coffee +11 -0
  265. data/app/js/vendor/request_animation_frame.coffee +19 -0
  266. data/app/js/vendor/three-82.min.js +15 -0
  267. data/app/js/vendor/three-CanvasRenderer-82.js +1118 -0
  268. data/app/js/vendor/three-Projector-82.js +929 -0
  269. data/app/js/vendor/underscore-1.8.3.min.js +6 -0
  270. data/app/js/vendor/webfontloader-1.6.26.min.js +33 -0
  271. data/app/views/aliasing/legend.jst.hamlc +6 -0
  272. data/app/views/composites/composites_list_item_label.jst.hamlc +3 -0
  273. data/app/views/composites/import_composites_aside.jst.hamlc +6 -0
  274. data/app/views/composites/mix_preset_list_item_label.jst.hamlc +8 -0
  275. data/app/views/composites/share_aside.jst.hamlc +7 -0
  276. data/app/views/doc/airplanes_list_item_label.jst.hamlc +3 -0
  277. data/app/views/doc/import_airplanes_aside.jst.hamlc +6 -0
  278. data/app/views/doc/share_aside.jst.hamlc +7 -0
  279. data/app/views/general/app.jst.hamlc +42 -0
  280. data/app/views/general/curves_list_item_label.jst.hamlc +5 -0
  281. data/app/views/general/help.jst.hamlc +7 -0
  282. data/app/views/general/tabs.jst.hamlc +6 -0
  283. data/app/views/index.haml +24 -0
  284. data/app/views/overview/app.jst.hamlc +7 -0
  285. data/app/views/overview/tile.jst.hamlc +4 -0
  286. data/bin/console +14 -0
  287. data/bin/setup +8 -0
  288. data/ela.gemspec +50 -0
  289. data/exe/ela +59 -0
  290. data/lib/ela.rb +8 -0
  291. data/lib/ela/jasmine.rb +87 -0
  292. data/lib/ela/server.rb +136 -0
  293. data/lib/ela/utils.rb +131 -0
  294. data/lib/ela/version.rb +3 -0
  295. data/package-lock.json +899 -0
  296. data/package.json +11 -0
  297. data/support/project/Guardfile +64 -0
  298. data/support/project/jasmine.yml +3 -0
  299. data/support/server.ru +5 -0
  300. metadata +4365 -0
@@ -0,0 +1,1136 @@
1
+ /*!
2
+ * Copyright (c) 2008, 2009 Paul Duncan (paul@pablotron.org)
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in
12
+ * all copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ * THE SOFTWARE.
21
+ */
22
+
23
+ /*
24
+ * The contents of gears_init.js; we need this because Chrome supports
25
+ * Gears out of the box, but still requires this constructor. Note that
26
+ * if you include gears_init.js then this function does nothing.
27
+ */
28
+ (function() {
29
+ // We are already defined. Hooray!
30
+ if (window.google && google.gears){
31
+ return;
32
+ }
33
+
34
+ // factory
35
+ var F = null;
36
+
37
+ // Firefox
38
+ if (typeof GearsFactory != 'undefined') {
39
+ F = new GearsFactory();
40
+ } else {
41
+ // IE
42
+ try {
43
+ F = new ActiveXObject('Gears.Factory');
44
+ // privateSetGlobalObject is only required and supported on WinCE.
45
+ if (F.getBuildInfo().indexOf('ie_mobile') != -1){
46
+ F.privateSetGlobalObject(this);
47
+ }
48
+
49
+ } catch (e) {
50
+ // Safari
51
+ if ((typeof navigator.mimeTypes != 'undefined') && navigator.mimeTypes["application/x-googlegears"]) {
52
+ F = document.createElement("object");
53
+ F.style.display = "none";
54
+ F.width = 0;
55
+ F.height = 0;
56
+ F.type = "application/x-googlegears";
57
+ document.documentElement.appendChild(F);
58
+ }
59
+ }
60
+ }
61
+
62
+ // *Do not* define any objects if Gears is not installed. This mimics the
63
+ // behavior of Gears defining the objects in the future.
64
+ if (!F){
65
+ return;
66
+ }
67
+
68
+
69
+ // Now set up the objects, being careful not to overwrite anything.
70
+ //
71
+ // Note: In Internet Explorer for Windows Mobile, you can't add properties to
72
+ // the window object. However, global objects are automatically added as
73
+ // properties of the window object in all browsers.
74
+ if (!window.google){
75
+ google = {};
76
+ }
77
+
78
+ if (!google.gears){
79
+ google.gears = {factory: F};
80
+ }
81
+
82
+ })();
83
+
84
+ /**
85
+ * Persist - top-level namespace for Persist library.
86
+ * @namespace
87
+ */
88
+ Persist = (function() {
89
+ var VERSION = '0.3.1', P, B, esc, init, empty, ec;
90
+
91
+ ec = (function() {
92
+ var EPOCH = 'Thu, 01-Jan-1970 00:00:01 GMT',
93
+ // milliseconds per day
94
+ RATIO = 1000 * 60 * 60 * 24,
95
+ // keys to encode
96
+ KEYS = ['expires', 'path', 'domain'],
97
+ // wrappers for common globals
98
+ esc = escape, un = unescape, doc = document,
99
+ me;
100
+
101
+ // private methods
102
+
103
+ /*
104
+ * Get the current time.
105
+ *
106
+ * This method is private.
107
+ */
108
+ var get_now = function() {
109
+ var r = new Date();
110
+ r.setTime(r.getTime());
111
+ return r;
112
+ };
113
+
114
+ /*
115
+ * Convert the given key/value pair to a cookie.
116
+ *
117
+ * This method is private.
118
+ */
119
+ var cookify = function(c_key, c_val /*, opt */) {
120
+ var i, key, val, r = [],
121
+ opt = (arguments.length > 2) ? arguments[2] : {};
122
+
123
+ // add key and value
124
+ r.push(esc(c_key) + '=' + esc(c_val));
125
+
126
+ // iterate over option keys and check each one
127
+ for (var idx = 0; idx < KEYS.length; idx++) {
128
+ key = KEYS[idx];
129
+ val = opt[key];
130
+ if (val){
131
+ r.push(key + '=' + val);
132
+ }
133
+
134
+ }
135
+
136
+ // append secure (if specified)
137
+ if (opt.secure){
138
+ r.push('secure');
139
+ }
140
+
141
+ // build and return result string
142
+ return r.join('; ');
143
+ };
144
+
145
+ /*
146
+ * Check to see if cookies are enabled.
147
+ *
148
+ * This method is private.
149
+ */
150
+ var alive = function() {
151
+ var k = '__EC_TEST__',
152
+ v = new Date();
153
+
154
+ // generate test value
155
+ v = v.toGMTString();
156
+
157
+ // set test value
158
+ this.set(k, v);
159
+
160
+ // return cookie test
161
+ this.enabled = (this.remove(k) == v);
162
+ return this.enabled;
163
+ };
164
+
165
+ // public methods
166
+
167
+ // build return object
168
+ me = {
169
+ /*
170
+ * Set a cookie value.
171
+ *
172
+ * Examples:
173
+ *
174
+ * // simplest-case
175
+ * EasyCookie.set('test_cookie', 'test_value');
176
+ *
177
+ * // more complex example
178
+ * EasyCookie.set('test_cookie', 'test_value', {
179
+ * // expires in 13 days
180
+ * expires: 13,
181
+ *
182
+ * // restrict to given domain
183
+ * domain: 'foo.example.com',
184
+ *
185
+ * // restrict to given path
186
+ * path: '/some/path',
187
+ *
188
+ * // secure cookie only
189
+ * secure: true
190
+ * });
191
+ *
192
+ */
193
+ set: function(key, val /*, opt */) {
194
+ var opt = (arguments.length > 2) ? arguments[2] : {},
195
+ now = get_now(),
196
+ expire_at,
197
+ cfg = {};
198
+
199
+ // if expires is set, convert it from days to milliseconds
200
+ if (opt.expires) {
201
+ if(opt.expires == -1) {
202
+ cfg.expires = -1
203
+ }
204
+ else {
205
+ // Needed to assign to a temporary variable because of pass by reference issues
206
+ var expires = opt.expires * RATIO;
207
+
208
+ // set cookie expiration date
209
+ cfg.expires = new Date(now.getTime() + expires);
210
+ cfg.expires = cfg.expires.toGMTString();
211
+ }
212
+ }
213
+
214
+ // set remaining keys
215
+ var keys = ['path', 'domain', 'secure'];
216
+ for (var i = 0; i < keys.length; i++){
217
+ if (opt[keys[i]]){
218
+ cfg[keys[i]] = opt[keys[i]];
219
+ }
220
+ }
221
+
222
+ var r = cookify(key, val, cfg);
223
+ doc.cookie = r;
224
+
225
+ return val;
226
+ },
227
+
228
+ /*
229
+ * Check to see if the given cookie exists.
230
+ *
231
+ * Example:
232
+ *
233
+ * val = EasyCookie.get('test_cookie');
234
+ *
235
+ */
236
+ has: function(key) {
237
+ key = esc(key);
238
+
239
+ var c = doc.cookie,
240
+ ofs = c.indexOf(key + '='),
241
+ len = ofs + key.length + 1,
242
+ sub = c.substring(0, key.length);
243
+
244
+ // check to see if key exists
245
+ return ((!ofs && key != sub) || ofs < 0) ? false : true;
246
+ },
247
+
248
+ /*
249
+ * Get a cookie value.
250
+ *
251
+ * Example:
252
+ *
253
+ * val = EasyCookie.get('test_cookie');
254
+ *
255
+ */
256
+ get: function(key) {
257
+ key = esc(key);
258
+
259
+ var c = doc.cookie,
260
+ ofs = c.indexOf(key + '='),
261
+ len = ofs + key.length + 1,
262
+ sub = c.substring(0, key.length),
263
+ end;
264
+
265
+ // check to see if key exists
266
+ if ((!ofs && key != sub) || ofs < 0) {
267
+ return null;
268
+ }
269
+
270
+ // grab end of value
271
+ end = c.indexOf(';', len);
272
+ if (end < 0) {
273
+ end = c.length;
274
+ }
275
+
276
+ // return unescaped value
277
+ return un(c.substring(len, end));
278
+ },
279
+
280
+ /*
281
+ * Remove a preset cookie. If the cookie is already set, then
282
+ * return the value of the cookie.
283
+ *
284
+ * Example:
285
+ *
286
+ * old_val = EasyCookie.remove('test_cookie');
287
+ *
288
+ */
289
+ remove: function(k) {
290
+ var r = me.get(k),
291
+ opt = { expires: EPOCH };
292
+
293
+ // delete cookie
294
+ doc.cookie = cookify(k, '', opt);
295
+
296
+ // return value
297
+ return r;
298
+ },
299
+
300
+ /*
301
+ * Get a list of cookie names.
302
+ *
303
+ * Example:
304
+ *
305
+ * // get all cookie names
306
+ * cookie_keys = EasyCookie.keys();
307
+ *
308
+ */
309
+ keys: function() {
310
+ var c = doc.cookie,
311
+ ps = c.split('; '),
312
+ i, p, r = [];
313
+
314
+ // iterate over each key=val pair and grab the key
315
+ for (var idx = 0; idx < ps.length; idx++) {
316
+ p = ps[idx].split('=');
317
+ r.push(un(p[0]));
318
+ }
319
+
320
+ // return results
321
+ return r;
322
+ },
323
+
324
+ /*
325
+ * Get an array of all cookie key/value pairs.
326
+ *
327
+ * Example:
328
+ *
329
+ * // get all cookies
330
+ * all_cookies = EasyCookie.all();
331
+ *
332
+ */
333
+ all: function() {
334
+ var c = doc.cookie,
335
+ ps = c.split('; '),
336
+ i, p, r = [];
337
+
338
+ // iterate over each key=val pair and grab the key
339
+ for (var idx = 0; idx < ps.length; idx++) {
340
+ p = ps[idx].split('=');
341
+ r.push([un(p[0]), un(p[1])]);
342
+ }
343
+
344
+ // return results
345
+ return r;
346
+ },
347
+
348
+ /*
349
+ * Version of EasyCookie
350
+ */
351
+ version: '0.2.1',
352
+
353
+ /*
354
+ * Are cookies enabled?
355
+ *
356
+ * Example:
357
+ *
358
+ * have_cookies = EasyCookie.enabled
359
+ *
360
+ */
361
+ enabled: false
362
+ };
363
+
364
+ // set enabled attribute
365
+ me.enabled = alive.call(me);
366
+
367
+ // return self
368
+ return me;
369
+ }());
370
+
371
+ // wrapper for Array.prototype.indexOf, since IE doesn't have it
372
+ var index_of = (function() {
373
+ if (Array.prototype.indexOf){
374
+ return function(ary, val) {
375
+ return Array.prototype.indexOf.call(ary, val);
376
+ };
377
+ } else {
378
+ return function(ary, val) {
379
+ var i, l;
380
+
381
+ for (var idx = 0, len = ary.length; idx < len; idx++){
382
+ if (ary[idx] == val){
383
+ return idx;
384
+ }
385
+ }
386
+
387
+ return -1;
388
+ };
389
+ }
390
+ })();
391
+
392
+
393
+ // empty function
394
+ empty = function() { };
395
+
396
+ /**
397
+ * Escape spaces and underscores in name. Used to generate a "safe"
398
+ * key from a name.
399
+ *
400
+ * @private
401
+ */
402
+ esc = function(str) {
403
+ return 'PS' + str.replace(/_/g, '__').replace(/ /g, '_s');
404
+ };
405
+
406
+ var C = {
407
+ /*
408
+ * Backend search order.
409
+ *
410
+ * Note that the search order is significant; the backends are
411
+ * listed in order of capacity, and many browsers
412
+ * support multiple backends, so changing the search order could
413
+ * result in a browser choosing a less capable backend.
414
+ */
415
+ search_order: [
416
+ // TODO: air
417
+ 'localstorage',
418
+ 'globalstorage',
419
+ 'gears',
420
+ 'cookie',
421
+ 'ie',
422
+ 'flash'
423
+ ],
424
+
425
+ // valid name regular expression
426
+ name_re: /^[a-z][a-z0-9_ \-]+$/i,
427
+
428
+ // list of backend methods
429
+ methods: [
430
+ 'init',
431
+ 'get',
432
+ 'set',
433
+ 'remove',
434
+ 'load',
435
+ 'save',
436
+ 'iterate'
437
+ // TODO: clear method?
438
+ ],
439
+
440
+ // sql for db backends (gears and db)
441
+ sql: {
442
+ version: '1', // db schema version
443
+
444
+ // XXX: the "IF NOT EXISTS" is a sqlite-ism; fortunately all the
445
+ // known DB implementations (safari and gears) use sqlite
446
+ create: "CREATE TABLE IF NOT EXISTS persist_data (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)",
447
+ get: "SELECT v FROM persist_data WHERE k = ?",
448
+ set: "INSERT INTO persist_data(k, v) VALUES (?, ?)",
449
+ remove: "DELETE FROM persist_data WHERE k = ?",
450
+ keys: "SELECT * FROM persist_data"
451
+ },
452
+
453
+ // default flash configuration
454
+ flash: {
455
+ // ID of wrapper element
456
+ div_id: '_persist_flash_wrap',
457
+
458
+ // id of flash object/embed
459
+ id: '_persist_flash',
460
+
461
+ // default path to flash object
462
+ path: 'persist.swf',
463
+ size: { w:1, h:1 },
464
+
465
+ // arguments passed to flash object
466
+ params: {
467
+ autostart: true
468
+ }
469
+ }
470
+ };
471
+
472
+ // built-in backends
473
+ B = {
474
+ // gears db backend
475
+ // (src: http://code.google.com/apis/gears/api_database.html)
476
+ gears: {
477
+ // no known limit
478
+ size: -1,
479
+
480
+ test: function() {
481
+ // test for gears
482
+ return (window.google && window.google.gears) ? true : false;
483
+ },
484
+
485
+ methods: {
486
+
487
+ init: function() {
488
+ var db;
489
+
490
+ // create database handle (TODO: add schema version?)
491
+ db = this.db = google.gears.factory.create('beta.database');
492
+
493
+ // open database
494
+ // from gears ref:
495
+ //
496
+ // Currently the name, if supplied and of length greater than
497
+ // zero, must consist only of visible ASCII characters
498
+ // excluding the following characters:
499
+ //
500
+ // / \ : * ? " < > | ; ,
501
+ //
502
+ // (this constraint is enforced in the Store constructor)
503
+ db.open(esc(this.name));
504
+
505
+ // create table
506
+ db.execute(C.sql.create).close();
507
+ },
508
+
509
+ get: function(key) {
510
+ var r, sql = C.sql.get;
511
+ var db = this.db;
512
+ var ret;
513
+
514
+ // begin transaction
515
+ db.execute('BEGIN').close();
516
+
517
+ // exec query
518
+ r = db.execute(sql, [key]);
519
+
520
+ // check result and get value
521
+ ret = r.isValidRow() ? r.field(0) : null;
522
+
523
+ // close result set
524
+ r.close();
525
+
526
+ // commit changes
527
+ db.execute('COMMIT').close();
528
+ return ret;
529
+ },
530
+
531
+ set: function(key, val ) {
532
+ var rm_sql = C.sql.remove,
533
+ sql = C.sql.set, r;
534
+ var db = this.db;
535
+ var ret;
536
+
537
+ // begin transaction
538
+ db.execute('BEGIN').close();
539
+
540
+ // exec remove query
541
+ db.execute(rm_sql, [key]).close();
542
+
543
+ // exec set query
544
+ db.execute(sql, [key, val]).close();
545
+
546
+ // commit changes
547
+ db.execute('COMMIT').close();
548
+
549
+ return val;
550
+ },
551
+
552
+ remove: function(key) {
553
+ var get_sql = C.sql.get,
554
+ sql = C.sql.remove,
555
+ r, val = null, is_valid = false;
556
+ var db = this.db;
557
+
558
+ // begin transaction
559
+ db.execute('BEGIN').close();
560
+
561
+ // exec remove query
562
+ db.execute(sql, [key]).close();
563
+
564
+ // commit changes
565
+ db.execute('COMMIT').close();
566
+
567
+ return true;
568
+ },
569
+ iterate: function(fn,scope) {
570
+ var key_sql = C.sql.keys;
571
+ var r;
572
+ var db = this.db;
573
+
574
+ // exec keys query
575
+ r = db.execute(key_sql);
576
+ while (r.isValidRow()) {
577
+ fn.call(scope || this, r.field(0), r.field(1));
578
+ r.next();
579
+ }
580
+ r.close();
581
+ }
582
+ }
583
+ },
584
+
585
+ // globalstorage backend (globalStorage, FF2+, IE8+)
586
+ // (src: http://developer.mozilla.org/en/docs/DOM:Storage#globalStorage)
587
+ // https://developer.mozilla.org/En/DOM/Storage
588
+ //
589
+ // TODO: test to see if IE8 uses object literal semantics or
590
+ // getItem/setItem/removeItem semantics
591
+ globalstorage: {
592
+ // (5 meg limit, src: http://ejohn.org/blog/dom-storage-answers/)
593
+ size: 5 * 1024 * 1024,
594
+
595
+ test: function() {
596
+ if (window.globalStorage) {
597
+ var domain = '127.0.0.1';
598
+ if (this.o && this.o.domain) {
599
+ domain = this.o.domain;
600
+ }
601
+ try{
602
+ var dontcare = globalStorage[domain];
603
+ return true;
604
+ } catch(e) {
605
+ if (window.console && window.console.warn) {
606
+ console.warn("globalStorage exists, but couldn't use it because your browser is running on domain:", domain);
607
+ }
608
+ return false;
609
+ }
610
+ } else {
611
+ return false;
612
+ }
613
+ },
614
+
615
+ methods: {
616
+ key: function(key) {
617
+ return esc(this.name) + esc(key);
618
+ },
619
+
620
+ init: function() {
621
+ this.store = globalStorage[this.o.domain];
622
+ },
623
+
624
+ get: function(key) {
625
+ // expand key
626
+ key = this.key(key);
627
+
628
+ return this.store.getItem(key);
629
+ },
630
+
631
+ set: function(key, val ) {
632
+ // expand key
633
+ key = this.key(key);
634
+
635
+ // set value
636
+ this.store.setItem(key, val);
637
+
638
+ return val;
639
+ },
640
+
641
+ remove: function(key) {
642
+ var val;
643
+
644
+ // expand key
645
+ key = this.key(key);
646
+
647
+ // get value
648
+ val = this.store.getItem[key];
649
+
650
+ // delete value
651
+ this.store.removeItem(key);
652
+
653
+ return val;
654
+ }
655
+ }
656
+ },
657
+
658
+ // localstorage backend (globalStorage, FF2+, IE8+)
659
+ // (src: http://www.whatwg.org/specs/web-apps/current-work/#the-localstorage)
660
+ // also http://msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx#_global
661
+ localstorage: {
662
+ // (unknown?)
663
+ // ie has the remainingSpace property, see:
664
+ // http://msdn.microsoft.com/en-us/library/cc197016(VS.85).aspx
665
+ size: -1,
666
+
667
+ test: function() {
668
+ // FF: Throws a security error when cookies are disabled
669
+ try {
670
+ // Chrome: window.localStorage is available, but calling set throws a quota exceeded error
671
+ if (window.localStorage &&
672
+ window.localStorage.setItem("test", null) == undefined) {
673
+ if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
674
+ var ffVersion = RegExp.$1;
675
+
676
+ if (ffVersion >= 9) {
677
+ return true;
678
+ }
679
+
680
+ // FF: Fix for Firefox bug when protocol is file: https://bugzilla.mozilla.org/show_bug.cgi?id=507361
681
+ if (window.location.protocol == 'file:') {
682
+ return false;
683
+ }
684
+ } else {
685
+ return true;
686
+ }
687
+ } else {
688
+ return false;
689
+ }
690
+ return window.localStorage ? true : false;
691
+ } catch (e) {
692
+ return false;
693
+ }
694
+ },
695
+
696
+ methods: {
697
+ key: function(key) {
698
+ return this.name + '>' + key ;
699
+ //return esc(this.name) + esc(key);
700
+ },
701
+
702
+ init: function() {
703
+ this.store = localStorage;
704
+ },
705
+
706
+ get: function(key) {
707
+ // expand key
708
+ key = this.key(key);
709
+
710
+ return this.store.getItem(key);
711
+ },
712
+
713
+ set: function(key, val ) {
714
+ // expand key
715
+ key = this.key(key);
716
+
717
+ // set value
718
+ this.store.setItem(key, val);
719
+
720
+ return val;
721
+ },
722
+
723
+ remove: function(key) {
724
+ var val;
725
+
726
+ // expand key
727
+ key = this.key(key);
728
+
729
+ // get value
730
+ val = this.store.getItem(key);
731
+
732
+ // delete value
733
+ this.store.removeItem(key);
734
+
735
+ return val;
736
+ },
737
+
738
+ iterate: function(fn, scope) {
739
+ var l = this.store, key, keys;
740
+ for (var i=0;i<l.length;i++) {
741
+ key = l.key(i);
742
+ keys = key.split('>');
743
+ if ((keys.length == 2) && (keys[0] == this.name)) {
744
+ fn.call(scope || this,keys[1], l.getItem(key));
745
+ }
746
+ }
747
+ }
748
+ }
749
+ },
750
+
751
+ // IE backend
752
+ ie: {
753
+ prefix: '_persist_data-',
754
+ // style: 'display:none; behavior:url(#default#userdata);',
755
+
756
+ // 64k limit
757
+ size: 64 * 1024,
758
+
759
+ test: function() {
760
+ // make sure we're dealing with IE
761
+ // (src: http://javariet.dk/shared/browser_dom.htm)
762
+ return window.ActiveXObject ? true : false;
763
+ },
764
+
765
+ make_userdata: function(id) {
766
+ var el = document.createElement('div');
767
+
768
+ // set element properties
769
+ // http://msdn.microsoft.com/en-us/library/ms531424(VS.85).aspx
770
+ // http://www.webreference.com/js/column24/userdata.html
771
+ el.id = id;
772
+ el.style.display = 'none';
773
+ el.addBehavior('#default#userdata');
774
+
775
+ // append element to body
776
+ document.body.appendChild(el);
777
+
778
+ // return element
779
+ return el;
780
+ },
781
+
782
+ methods: {
783
+ init: function() {
784
+ var id = B.ie.prefix + esc(this.name);
785
+
786
+ // save element
787
+ this.el = B.ie.make_userdata(id);
788
+
789
+ // load data
790
+ if (this.o.defer){
791
+ this.load();
792
+ }
793
+ },
794
+
795
+ get: function(key) {
796
+ var val;
797
+
798
+ // expand key
799
+ key = esc(key);
800
+
801
+ // load data
802
+ if (!this.o.defer){
803
+ this.load();
804
+ }
805
+
806
+ // get value
807
+ val = this.el.getAttribute(key);
808
+
809
+ return val;
810
+ },
811
+
812
+ set: function(key, val) {
813
+ // expand key
814
+ key = esc(key);
815
+
816
+ // set attribute
817
+ this.el.setAttribute(key, val);
818
+
819
+ // save data
820
+ if (!this.o.defer){
821
+ this.save();
822
+ }
823
+
824
+ return val;
825
+ },
826
+
827
+ remove: function(key) {
828
+ var val;
829
+
830
+ // expand key
831
+ key = esc(key);
832
+
833
+ // load data
834
+ if (!this.o.defer){
835
+ this.load();
836
+ }
837
+
838
+ // get old value and remove attribute
839
+ val = this.el.getAttribute(key);
840
+ this.el.removeAttribute(key);
841
+
842
+ // save data
843
+ if (!this.o.defer){
844
+ this.save();
845
+ }
846
+
847
+ return val;
848
+ },
849
+
850
+ load: function() {
851
+ this.el.load(esc(this.name));
852
+ },
853
+
854
+ save: function() {
855
+ this.el.save(esc(this.name));
856
+ }
857
+ }
858
+ },
859
+
860
+ // cookie backend
861
+ // uses easycookie: http://pablotron.org/software/easy_cookie/
862
+ cookie: {
863
+ delim: ':',
864
+
865
+ // 4k limit (low-ball this limit to handle browser weirdness, and
866
+ // so we don't hose session cookies)
867
+ size: 4000,
868
+
869
+ test: function() {
870
+ // XXX: use easycookie to test if cookies are enabled
871
+ return P.Cookie.enabled ? true : false;
872
+ },
873
+
874
+ methods: {
875
+ key: function(key) {
876
+ return this.name + B.cookie.delim + key;
877
+ },
878
+
879
+ get: function(key, fn ) {
880
+ var val;
881
+
882
+ // expand key
883
+ key = this.key(key);
884
+
885
+ // get value
886
+ val = ec.get(key);
887
+
888
+ return val;
889
+ },
890
+
891
+ set: function(key, val, fn ) {
892
+ // expand key
893
+ key = this.key(key);
894
+
895
+ // save value
896
+ ec.set(key, val, this.o);
897
+
898
+ return val;
899
+ },
900
+
901
+ remove: function(key, val ) {
902
+ var val;
903
+
904
+ // expand key
905
+ key = this.key(key);
906
+
907
+ // remove cookie
908
+ val = ec.remove(key);
909
+
910
+ return val;
911
+ }
912
+ }
913
+ },
914
+
915
+ // flash backend (requires flash 8 or newer)
916
+ // http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_16194&sliceId=1
917
+ // http://livedocs.adobe.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002200.html
918
+ flash: {
919
+ test: function() {
920
+ // TODO: better flash detection
921
+ try {
922
+ if (!swfobject){
923
+ return false;
924
+ }
925
+ } catch (e) {
926
+ return false;
927
+ }
928
+
929
+ // get the major version
930
+ var major = swfobject.getFlashPlayerVersion().major;
931
+
932
+ // check flash version (require 8.0 or newer)
933
+ return (major >= 8) ? true : false;
934
+ },
935
+
936
+ methods: {
937
+ init: function() {
938
+ if (!B.flash.el) {
939
+ var key, el, fel, cfg = C.flash;
940
+
941
+ // create wrapper element
942
+ el = document.createElement('div');
943
+ el.id = cfg.div_id;
944
+
945
+ // create flash element
946
+ fel = document.createElement('div');
947
+ fel.id = cfg.id;
948
+
949
+ el.appendChild(fel);
950
+
951
+ // append element to body
952
+ document.body.appendChild(el);
953
+
954
+ // create new swf object
955
+ B.flash.el = swfobject.createSWF({ id: cfg.id, data: this.o.swf_path || cfg.path, width: cfg.size.w, height: cfg.size.h }, cfg.params, cfg.id);
956
+ }
957
+
958
+ this.el = B.flash.el;
959
+ },
960
+
961
+ get: function(key) {
962
+ var val;
963
+
964
+ // escape key
965
+ key = esc(key);
966
+
967
+ // get value
968
+ val = this.el.get(this.name, key);
969
+
970
+ return val;
971
+ },
972
+
973
+ set: function(key, val ) {
974
+ var old_val;
975
+
976
+ // escape key
977
+ key = esc(key);
978
+
979
+ // set value
980
+ old_val = this.el.set(this.name, key, val);
981
+
982
+ return old_val;
983
+ },
984
+
985
+ remove: function(key) {
986
+ var val;
987
+
988
+ // get key
989
+ key = esc(key);
990
+
991
+ // remove old value
992
+ val = this.el.remove(this.name, key);
993
+ return val;
994
+ }
995
+ }
996
+ }
997
+ };
998
+
999
+ /**
1000
+ * Test for available backends and pick the best one.
1001
+ * @private
1002
+ */
1003
+ init = function() {
1004
+ var i, l, b, key, fns = C.methods, keys = C.search_order;
1005
+
1006
+ // set all functions to the empty function
1007
+ for (var idx = 0, len = fns.length; idx < len; idx++) {
1008
+ P.Store.prototype[fns[idx]] = empty;
1009
+ }
1010
+
1011
+ // clear type and size
1012
+ P.type = null;
1013
+ P.size = -1;
1014
+
1015
+ // loop over all backends and test for each one
1016
+ for (var idx2 = 0, len2 = keys.length; !P.type && idx2 < len2; idx2++) {
1017
+ b = B[keys[idx2]];
1018
+
1019
+ // test for backend
1020
+ if (b.test()) {
1021
+ // found backend, save type and size
1022
+ P.type = keys[idx2];
1023
+ P.size = b.size;
1024
+ // extend store prototype with backend methods
1025
+ for (key in b.methods) {
1026
+ P.Store.prototype[key] = b.methods[key];
1027
+ }
1028
+ }
1029
+ }
1030
+
1031
+ // mark library as initialized
1032
+ P._init = true;
1033
+ };
1034
+
1035
+ // create top-level namespace
1036
+ P = {
1037
+ // version of persist library
1038
+ VERSION: VERSION,
1039
+
1040
+ // backend type and size limit
1041
+ type: null,
1042
+ size: 0,
1043
+
1044
+ // XXX: expose init function?
1045
+ // init: init,
1046
+
1047
+ add: function(o) {
1048
+ // add to backend hash
1049
+ B[o.id] = o;
1050
+
1051
+ // add backend to front of search order
1052
+ C.search_order = [o.id].concat(C.search_order);
1053
+
1054
+ // re-initialize library
1055
+ init();
1056
+ },
1057
+
1058
+ remove: function(id) {
1059
+ var ofs = index_of(C.search_order, id);
1060
+ if (ofs < 0){
1061
+ return;
1062
+ }
1063
+
1064
+ // remove from search order
1065
+ C.search_order.splice(ofs, 1);
1066
+
1067
+ // delete from lut
1068
+ delete B[id];
1069
+
1070
+ // re-initialize library
1071
+ init();
1072
+ },
1073
+
1074
+ // expose easycookie API
1075
+ Cookie: ec,
1076
+
1077
+ // store API
1078
+ Store: function(name, o) {
1079
+ // verify name
1080
+ if (!C.name_re.exec(name)){
1081
+ throw new Error("Invalid name");
1082
+ }
1083
+
1084
+ // XXX: should we lazy-load type?
1085
+ // if (!P._init)
1086
+ // init();
1087
+
1088
+ if (!P.type){
1089
+ throw new Error("No suitable storage found");
1090
+ }
1091
+
1092
+ o = o || {};
1093
+ this.name = name;
1094
+
1095
+ // get domain (XXX: does this localdomain fix work?)
1096
+ o.domain = o.domain || location.hostname || 'localhost';
1097
+
1098
+ // strip port from domain (XXX: will this break ipv6?)
1099
+ o.domain = o.domain.replace(/:\d+$/, '');
1100
+
1101
+ // Specifically for IE6 and localhost
1102
+ o.domain = (o.domain == 'localhost') ? '' : o.domain;
1103
+
1104
+ // append localdomain to domains w/o '."
1105
+ // (see https://bugzilla.mozilla.org/show_bug.cgi?id=357323)
1106
+ // (file://localhost/ works, see:
1107
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=469192)
1108
+ /*
1109
+ * if (!o.domain.match(/\./))
1110
+ * o.domain += '.localdomain';
1111
+ */
1112
+
1113
+ this.o = o;
1114
+
1115
+ // expires in 2 years
1116
+ o.expires = o.expires || 365 * 2;
1117
+
1118
+ // set path to root
1119
+ o.path = o.path || '/';
1120
+
1121
+ if (this.o.search_order) {
1122
+ C.search_order = this.o.search_order;
1123
+ init();
1124
+ }
1125
+
1126
+ // call init function
1127
+ this.init();
1128
+ }
1129
+ };
1130
+
1131
+ // init persist
1132
+ init();
1133
+
1134
+ // return top-level namespace
1135
+ return P;
1136
+ })();