spade 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1990) hide show
  1. data/.gitignore +14 -0
  2. data/.gitmodules +15 -0
  3. data/.rspec +1 -0
  4. data/Buildfile +18 -0
  5. data/Gemfile +19 -0
  6. data/Gemfile.lock +34 -0
  7. data/README.md +148 -0
  8. data/Rakefile +9 -0
  9. data/bin/spade +7 -0
  10. data/examples/format-app/lib/hello.coffee +1 -0
  11. data/examples/format-app/lib/main.js +6 -0
  12. data/examples/format-app/package.json +10 -0
  13. data/examples/format-app/resources/README.txt +1 -0
  14. data/examples/format-app/resources/config.json +3 -0
  15. data/examples/path-test/lib/hello.js +1 -0
  16. data/examples/path-test/lib/main.js +1 -0
  17. data/examples/path-test/package.json +5 -0
  18. data/examples/sc-app/index.html +13 -0
  19. data/examples/sc-app/lib/main.js +24 -0
  20. data/examples/sc-app/package.json +8 -0
  21. data/examples/single-file.js +22 -0
  22. data/examples/todos/index.html +11 -0
  23. data/examples/todos/lib/main.js +10 -0
  24. data/examples/todos/lib/todos.js +93 -0
  25. data/examples/todos/package.json +10 -0
  26. data/examples/todos/resources/stylesheets/todos.css +162 -0
  27. data/examples/todos/resources/templates/todos.handlebars +31 -0
  28. data/examples/web-app/README.md +83 -0
  29. data/examples/web-app/index.html +12 -0
  30. data/examples/web-app/lib/main.js +3 -0
  31. data/examples/web-app/package.json +6 -0
  32. data/examples/web-app/tests.html +12 -0
  33. data/examples/web-app/tests/ct-example-test.js +39 -0
  34. data/examples/web-app/tests/qunit-test.js +23 -0
  35. data/lib/index.js +14 -0
  36. data/lib/node/loader.js +145 -0
  37. data/lib/node/sandbox.js +34 -0
  38. data/lib/spade.js +1099 -0
  39. data/lib/spade.rb +52 -0
  40. data/lib/spade/bundle.rb +156 -0
  41. data/lib/spade/cli.rb +14 -0
  42. data/lib/spade/cli/base.rb +325 -0
  43. data/lib/spade/cli/owner.rb +45 -0
  44. data/lib/spade/compiler.rb +34 -0
  45. data/lib/spade/console.rb +39 -0
  46. data/lib/spade/context.rb +116 -0
  47. data/lib/spade/credentials.rb +36 -0
  48. data/lib/spade/environment.rb +35 -0
  49. data/lib/spade/exports.rb +71 -0
  50. data/lib/spade/loader.rb +243 -0
  51. data/lib/spade/local.rb +53 -0
  52. data/lib/spade/package.rb +143 -0
  53. data/lib/spade/reactor.rb +159 -0
  54. data/lib/spade/remote.rb +75 -0
  55. data/lib/spade/repository.rb +18 -0
  56. data/lib/spade/server.rb +54 -0
  57. data/lib/spade/shell.rb +36 -0
  58. data/lib/spade/version.rb +3 -0
  59. data/package.json +27 -0
  60. data/packages/coffee-script/.gitignore +8 -0
  61. data/packages/coffee-script/.npmignore +11 -0
  62. data/packages/coffee-script/Cakefile +229 -0
  63. data/packages/coffee-script/LICENSE +22 -0
  64. data/packages/coffee-script/README +47 -0
  65. data/packages/coffee-script/Rakefile +78 -0
  66. data/packages/coffee-script/bin/cake +7 -0
  67. data/packages/coffee-script/bin/coffee +7 -0
  68. data/packages/coffee-script/documentation/coffee/aliases.coffee +11 -0
  69. data/packages/coffee-script/documentation/coffee/array_comprehensions.coffee +2 -0
  70. data/packages/coffee-script/documentation/coffee/block_comment.coffee +6 -0
  71. data/packages/coffee-script/documentation/coffee/cake_tasks.coffee +9 -0
  72. data/packages/coffee-script/documentation/coffee/classes.coffee +25 -0
  73. data/packages/coffee-script/documentation/coffee/comparisons.coffee +5 -0
  74. data/packages/coffee-script/documentation/coffee/conditionals.coffee +13 -0
  75. data/packages/coffee-script/documentation/coffee/default_args.coffee +8 -0
  76. data/packages/coffee-script/documentation/coffee/do.coffee +4 -0
  77. data/packages/coffee-script/documentation/coffee/embedded.coffee +5 -0
  78. data/packages/coffee-script/documentation/coffee/existence.coffee +10 -0
  79. data/packages/coffee-script/documentation/coffee/expressions.coffee +9 -0
  80. data/packages/coffee-script/documentation/coffee/expressions_assignment.coffee +3 -0
  81. data/packages/coffee-script/documentation/coffee/expressions_comprehension.coffee +3 -0
  82. data/packages/coffee-script/documentation/coffee/expressions_try.coffee +7 -0
  83. data/packages/coffee-script/documentation/coffee/fat_arrow.coffee +6 -0
  84. data/packages/coffee-script/documentation/coffee/functions.coffee +2 -0
  85. data/packages/coffee-script/documentation/coffee/heredocs.coffee +7 -0
  86. data/packages/coffee-script/documentation/coffee/heregexes.coffee +11 -0
  87. data/packages/coffee-script/documentation/coffee/interpolation.coffee +6 -0
  88. data/packages/coffee-script/documentation/coffee/multiple_return_values.coffee +7 -0
  89. data/packages/coffee-script/documentation/coffee/object_comprehensions.coffee +4 -0
  90. data/packages/coffee-script/documentation/coffee/object_extraction.coffee +13 -0
  91. data/packages/coffee-script/documentation/coffee/objects_and_arrays.coffee +19 -0
  92. data/packages/coffee-script/documentation/coffee/objects_reserved.coffee +5 -0
  93. data/packages/coffee-script/documentation/coffee/overview.coffee +28 -0
  94. data/packages/coffee-script/documentation/coffee/parallel_assignment.coffee +6 -0
  95. data/packages/coffee-script/documentation/coffee/patterns_and_splats.coffee +7 -0
  96. data/packages/coffee-script/documentation/coffee/prototypes.coffee +3 -0
  97. data/packages/coffee-script/documentation/coffee/range_comprehensions.coffee +2 -0
  98. data/packages/coffee-script/documentation/coffee/scope.coffee +5 -0
  99. data/packages/coffee-script/documentation/coffee/slices.coffee +7 -0
  100. data/packages/coffee-script/documentation/coffee/soaks.coffee +1 -0
  101. data/packages/coffee-script/documentation/coffee/splats.coffee +27 -0
  102. data/packages/coffee-script/documentation/coffee/splices.coffee +5 -0
  103. data/packages/coffee-script/documentation/coffee/strings.coffee +8 -0
  104. data/packages/coffee-script/documentation/coffee/switch.coffee +10 -0
  105. data/packages/coffee-script/documentation/coffee/try.coffee +8 -0
  106. data/packages/coffee-script/documentation/coffee/while.coffee +10 -0
  107. data/packages/coffee-script/documentation/css/docs.css +374 -0
  108. data/packages/coffee-script/documentation/css/idle.css +64 -0
  109. data/packages/coffee-script/documentation/docs/browser.html +25 -0
  110. data/packages/coffee-script/documentation/docs/cake.html +43 -0
  111. data/packages/coffee-script/documentation/docs/coffee-script.html +51 -0
  112. data/packages/coffee-script/documentation/docs/command.html +161 -0
  113. data/packages/coffee-script/documentation/docs/docco.css +186 -0
  114. data/packages/coffee-script/documentation/docs/grammar.html +399 -0
  115. data/packages/coffee-script/documentation/docs/helpers.html +31 -0
  116. data/packages/coffee-script/documentation/docs/index.html +3 -0
  117. data/packages/coffee-script/documentation/docs/lexer.html +490 -0
  118. data/packages/coffee-script/documentation/docs/nodes.html +1338 -0
  119. data/packages/coffee-script/documentation/docs/optparse.html +78 -0
  120. data/packages/coffee-script/documentation/docs/repl.html +24 -0
  121. data/packages/coffee-script/documentation/docs/rewriter.html +251 -0
  122. data/packages/coffee-script/documentation/docs/scope.html +54 -0
  123. data/packages/coffee-script/documentation/docs/underscore.html +295 -0
  124. data/packages/coffee-script/documentation/images/background.png +0 -0
  125. data/packages/coffee-script/documentation/images/banding.png +0 -0
  126. data/packages/coffee-script/documentation/images/button_bg.png +0 -0
  127. data/packages/coffee-script/documentation/images/button_bg_dark.gif +0 -0
  128. data/packages/coffee-script/documentation/images/button_bg_green.gif +0 -0
  129. data/packages/coffee-script/documentation/images/favicon.ico +0 -0
  130. data/packages/coffee-script/documentation/images/logo.png +0 -0
  131. data/packages/coffee-script/documentation/images/screenshadow.png +0 -0
  132. data/packages/coffee-script/documentation/index.html.erb +1607 -0
  133. data/packages/coffee-script/documentation/js/aliases.js +17 -0
  134. data/packages/coffee-script/documentation/js/array_comprehensions.js +6 -0
  135. data/packages/coffee-script/documentation/js/block_comment.js +4 -0
  136. data/packages/coffee-script/documentation/js/cake_tasks.js +10 -0
  137. data/packages/coffee-script/documentation/js/classes.js +44 -0
  138. data/packages/coffee-script/documentation/js/comparisons.js +3 -0
  139. data/packages/coffee-script/documentation/js/conditionals.js +12 -0
  140. data/packages/coffee-script/documentation/js/default_args.js +7 -0
  141. data/packages/coffee-script/documentation/js/do.js +10 -0
  142. data/packages/coffee-script/documentation/js/embedded.js +4 -0
  143. data/packages/coffee-script/documentation/js/existence.js +6 -0
  144. data/packages/coffee-script/documentation/js/expressions.js +15 -0
  145. data/packages/coffee-script/documentation/js/expressions_assignment.js +2 -0
  146. data/packages/coffee-script/documentation/js/expressions_comprehension.js +9 -0
  147. data/packages/coffee-script/documentation/js/expressions_try.js +7 -0
  148. data/packages/coffee-script/documentation/js/fat_arrow.js +9 -0
  149. data/packages/coffee-script/documentation/js/functions.js +7 -0
  150. data/packages/coffee-script/documentation/js/heredocs.js +2 -0
  151. data/packages/coffee-script/documentation/js/heregexes.js +2 -0
  152. data/packages/coffee-script/documentation/js/interpolation.js +4 -0
  153. data/packages/coffee-script/documentation/js/multiple_return_values.js +5 -0
  154. data/packages/coffee-script/documentation/js/object_comprehensions.js +15 -0
  155. data/packages/coffee-script/documentation/js/object_extraction.js +10 -0
  156. data/packages/coffee-script/documentation/js/objects_and_arrays.js +17 -0
  157. data/packages/coffee-script/documentation/js/objects_reserved.js +4 -0
  158. data/packages/coffee-script/documentation/js/overview.js +35 -0
  159. data/packages/coffee-script/documentation/js/parallel_assignment.js +4 -0
  160. data/packages/coffee-script/documentation/js/patterns_and_splats.js +4 -0
  161. data/packages/coffee-script/documentation/js/prototypes.js +3 -0
  162. data/packages/coffee-script/documentation/js/range_comprehensions.js +9 -0
  163. data/packages/coffee-script/documentation/js/scope.js +8 -0
  164. data/packages/coffee-script/documentation/js/slices.js +4 -0
  165. data/packages/coffee-script/documentation/js/soaks.js +2 -0
  166. data/packages/coffee-script/documentation/js/splats.js +15 -0
  167. data/packages/coffee-script/documentation/js/splices.js +3 -0
  168. data/packages/coffee-script/documentation/js/strings.js +2 -0
  169. data/packages/coffee-script/documentation/js/switch.js +23 -0
  170. data/packages/coffee-script/documentation/js/try.js +8 -0
  171. data/packages/coffee-script/documentation/js/while.js +18 -0
  172. data/packages/coffee-script/documentation/vendor/jquery-1.4.2.js +6240 -0
  173. data/packages/coffee-script/examples/beautiful_code/binary_search.coffee +16 -0
  174. data/packages/coffee-script/examples/beautiful_code/quicksort_runtime.coffee +13 -0
  175. data/packages/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee +34 -0
  176. data/packages/coffee-script/examples/blocks.coffee +54 -0
  177. data/packages/coffee-script/examples/code.coffee +167 -0
  178. data/packages/coffee-script/examples/computer_science/README +4 -0
  179. data/packages/coffee-script/examples/computer_science/binary_search.coffee +25 -0
  180. data/packages/coffee-script/examples/computer_science/bubble_sort.coffee +11 -0
  181. data/packages/coffee-script/examples/computer_science/linked_list.coffee +108 -0
  182. data/packages/coffee-script/examples/computer_science/luhn_algorithm.coffee +36 -0
  183. data/packages/coffee-script/examples/computer_science/merge_sort.coffee +19 -0
  184. data/packages/coffee-script/examples/computer_science/selection_sort.coffee +23 -0
  185. data/packages/coffee-script/examples/poignant.coffee +181 -0
  186. data/packages/coffee-script/examples/potion.coffee +206 -0
  187. data/packages/coffee-script/examples/underscore.coffee +682 -0
  188. data/packages/coffee-script/examples/web_server.coffee +12 -0
  189. data/packages/coffee-script/extras/EXTRAS +7 -0
  190. data/packages/coffee-script/extras/coffee-script.js +8 -0
  191. data/packages/coffee-script/extras/jsl.conf +44 -0
  192. data/packages/coffee-script/index.html +2515 -0
  193. data/packages/coffee-script/lib/browser.js +52 -0
  194. data/packages/coffee-script/lib/cake.js +76 -0
  195. data/packages/coffee-script/lib/coffee-script.js +82 -0
  196. data/packages/coffee-script/lib/command.js +263 -0
  197. data/packages/coffee-script/lib/grammar.js +581 -0
  198. data/packages/coffee-script/lib/helpers.js +66 -0
  199. data/packages/coffee-script/lib/index.js +8 -0
  200. data/packages/coffee-script/lib/lexer.js +633 -0
  201. data/packages/coffee-script/lib/nodes.js +2165 -0
  202. data/packages/coffee-script/lib/optparse.js +111 -0
  203. data/packages/coffee-script/lib/parser.js +649 -0
  204. data/packages/coffee-script/lib/repl.js +42 -0
  205. data/packages/coffee-script/lib/rewriter.js +353 -0
  206. data/packages/coffee-script/lib/scope.js +120 -0
  207. data/packages/coffee-script/lib/spade-format.js +45 -0
  208. data/packages/coffee-script/package.json +26 -0
  209. data/packages/coffee-script/src/browser.coffee +43 -0
  210. data/packages/coffee-script/src/cake.coffee +69 -0
  211. data/packages/coffee-script/src/coffee-script.coffee +92 -0
  212. data/packages/coffee-script/src/command.coffee +214 -0
  213. data/packages/coffee-script/src/grammar.coffee +590 -0
  214. data/packages/coffee-script/src/helpers.coffee +56 -0
  215. data/packages/coffee-script/src/index.coffee +2 -0
  216. data/packages/coffee-script/src/lexer.coffee +653 -0
  217. data/packages/coffee-script/src/nodes.coffee +1754 -0
  218. data/packages/coffee-script/src/optparse.coffee +99 -0
  219. data/packages/coffee-script/src/repl.coffee +42 -0
  220. data/packages/coffee-script/src/rewriter.coffee +326 -0
  221. data/packages/coffee-script/src/scope.coffee +94 -0
  222. data/packages/coffee-script/test/arguments.coffee +127 -0
  223. data/packages/coffee-script/test/assignment.coffee +98 -0
  224. data/packages/coffee-script/test/break.coffee +18 -0
  225. data/packages/coffee-script/test/comments.coffee +201 -0
  226. data/packages/coffee-script/test/conditionals.coffee +181 -0
  227. data/packages/coffee-script/test/exception_handling.coffee +90 -0
  228. data/packages/coffee-script/test/helpers.coffee +96 -0
  229. data/packages/coffee-script/test/importing.coffee +18 -0
  230. data/packages/coffee-script/test/operators.coffee +225 -0
  231. data/packages/coffee-script/test/ranges_slices_and_splices.coffee +186 -0
  232. data/packages/coffee-script/test/regular_expressions.coffee +56 -0
  233. data/packages/coffee-script/test/test.html +123 -0
  234. data/packages/coffee-script/test/test_chaining.coffee +77 -0
  235. data/packages/coffee-script/test/test_classes.coffee +372 -0
  236. data/packages/coffee-script/test/test_compilation.coffee +26 -0
  237. data/packages/coffee-script/test/test_comprehensions.coffee +318 -0
  238. data/packages/coffee-script/test/test_existence.coffee +165 -0
  239. data/packages/coffee-script/test/test_functions.coffee +379 -0
  240. data/packages/coffee-script/test/test_heredocs.coffee +111 -0
  241. data/packages/coffee-script/test/test_literals.coffee +270 -0
  242. data/packages/coffee-script/test/test_option_parser.coffee +27 -0
  243. data/packages/coffee-script/test/test_pattern_matching.coffee +162 -0
  244. data/packages/coffee-script/test/test_returns.coffee +63 -0
  245. data/packages/coffee-script/test/test_splats.coffee +102 -0
  246. data/packages/coffee-script/test/test_strings.coffee +118 -0
  247. data/packages/coffee-script/test/test_switch.coffee +103 -0
  248. data/packages/coffee-script/test/test_while.coffee +71 -0
  249. data/packages/core-test/.gitignore +2 -0
  250. data/packages/core-test/Buildfile +15 -0
  251. data/packages/core-test/CHANGELOG.md +24 -0
  252. data/packages/core-test/__preamble__.js +34 -0
  253. data/packages/core-test/bin/cot +3 -0
  254. data/packages/core-test/lib/assert.js +306 -0
  255. data/packages/core-test/lib/cli.js +258 -0
  256. data/packages/core-test/lib/core.js +311 -0
  257. data/packages/core-test/lib/loggers/browser.js +390 -0
  258. data/packages/core-test/lib/loggers/console.js +235 -0
  259. data/packages/core-test/lib/loggers/default.js +272 -0
  260. data/packages/core-test/lib/loggers/dummy.js +168 -0
  261. data/packages/core-test/lib/main.js +22 -0
  262. data/packages/core-test/lib/private/jquery.js +6079 -0
  263. data/packages/core-test/lib/qunit.js +159 -0
  264. data/packages/core-test/lib/runner.js +65 -0
  265. data/packages/core-test/lib/spec.js +302 -0
  266. data/packages/core-test/lib/sync.js +64 -0
  267. data/packages/core-test/lib/system/dump.js +208 -0
  268. data/packages/core-test/lib/system/equiv.js +199 -0
  269. data/packages/core-test/lib/system/ext.js +62 -0
  270. data/packages/core-test/lib/system/module.js +162 -0
  271. data/packages/core-test/lib/system/plan.js +223 -0
  272. data/packages/core-test/lib/system/stub.js +98 -0
  273. data/packages/core-test/lib/system/test.js +373 -0
  274. data/packages/core-test/lib/test.js +69 -0
  275. data/packages/core-test/lib/utils.js +256 -0
  276. data/packages/core-test/package.json +10 -0
  277. data/packages/core-test/resources/additions.css +8 -0
  278. data/packages/core-test/resources/runner.css +177 -0
  279. data/packages/core-test/tests/apis/commonjs-test.js +102 -0
  280. data/packages/core-test/tests/apis/core-test.js +154 -0
  281. data/packages/core-test/tests/apis/qunit-test.js +244 -0
  282. data/packages/core-test/tests/apis/spec-test.js +344 -0
  283. data/packages/core-test/tests/system/equiv/qunit-test.js +1400 -0
  284. data/packages/core-test/tests/system/test/assert-test.js +86 -0
  285. data/packages/core-test/tests/system/test/error-test.js +62 -0
  286. data/packages/core-test/tests/system/test/schedule-test.js +210 -0
  287. data/packages/core-test/tests/utils/fmt-test.js +24 -0
  288. data/packages/handlebars/Gemfile +4 -0
  289. data/packages/handlebars/README.markdown +205 -0
  290. data/packages/handlebars/Rakefile +65 -0
  291. data/packages/handlebars/lib/handlebars.js +19 -0
  292. data/packages/handlebars/lib/handlebars/ast.js +88 -0
  293. data/packages/handlebars/lib/handlebars/compiler.js +116 -0
  294. data/packages/handlebars/lib/handlebars/debug.js +25 -0
  295. data/packages/handlebars/lib/handlebars/printer.js +114 -0
  296. data/packages/handlebars/lib/handlebars/runtime.js +280 -0
  297. data/packages/handlebars/lib/handlebars/utils.js +61 -0
  298. data/packages/handlebars/lib/handlebars/visitor.js +14 -0
  299. data/packages/handlebars/lib/handlebars/vm.js +634 -0
  300. data/packages/handlebars/spec/acceptance_spec.rb +100 -0
  301. data/packages/handlebars/spec/parser_spec.rb +181 -0
  302. data/packages/handlebars/spec/qunit_spec.js +497 -0
  303. data/packages/handlebars/spec/spec_helper.rb +107 -0
  304. data/packages/handlebars/spec/tokenizer_spec.rb +145 -0
  305. data/packages/handlebars/src/handlebars.l +27 -0
  306. data/packages/handlebars/src/handlebars.yy +79 -0
  307. data/packages/handlebars/test.js +56 -0
  308. data/packages/ivory/LICENSE.txt +1 -0
  309. data/packages/ivory/README.md +19 -0
  310. data/packages/ivory/lib/buffer.js +111 -0
  311. data/packages/ivory/lib/events.js +137 -0
  312. data/packages/ivory/lib/fs.js +266 -0
  313. data/packages/ivory/lib/main.js +13 -0
  314. data/packages/ivory/lib/path.js +158 -0
  315. data/packages/ivory/lib/ruby/buffer.rb +145 -0
  316. data/packages/ivory/lib/ruby/constants.rb +585 -0
  317. data/packages/ivory/lib/ruby/events.rb +32 -0
  318. data/packages/ivory/lib/ruby/fs.rb +245 -0
  319. data/packages/ivory/lib/ruby/process.rb +28 -0
  320. data/packages/ivory/lib/stream.js +115 -0
  321. data/packages/ivory/lib/util.js +414 -0
  322. data/packages/ivory/package.json +11 -0
  323. data/packages/jquery-core/lib/main.js +897 -0
  324. data/packages/jquery-core/package.json +9 -0
  325. data/packages/jquery/main.js +7179 -0
  326. data/packages/jquery/package.json +10 -0
  327. data/packages/json/lib/main.js +14 -0
  328. data/packages/json/package.json +8 -0
  329. data/packages/lproj/README.md +77 -0
  330. data/packages/lproj/examples/demo-app/en.lproj/localized.strings +2 -0
  331. data/packages/lproj/examples/demo-app/fr.lproj/localized.strings +3 -0
  332. data/packages/lproj/examples/demo-app/index.html +8 -0
  333. data/packages/lproj/examples/demo-app/lib/main.js +7 -0
  334. data/packages/lproj/examples/demo-app/package.json +9 -0
  335. data/packages/lproj/lib/main.js +78 -0
  336. data/packages/lproj/lib/strings-format.js +6 -0
  337. data/packages/lproj/package.json +9 -0
  338. data/packages/optparse/README.md +161 -0
  339. data/packages/optparse/TODO +1 -0
  340. data/packages/optparse/examples/browser-test.html +75 -0
  341. data/packages/optparse/examples/nodejs-test.js +90 -0
  342. data/packages/optparse/lib/optparse.js +309 -0
  343. data/packages/optparse/package.json +13 -0
  344. data/packages/optparse/seed.yml +5 -0
  345. data/packages/sproutcore-bootstrap/lib/main.js +11 -0
  346. data/packages/sproutcore-bootstrap/package.json +15 -0
  347. data/packages/sproutcore-corefoundation/lib/main.js +66 -0
  348. data/packages/sproutcore-corefoundation/lib/tests.js +74 -0
  349. data/packages/sproutcore-corefoundation/package.json +27 -0
  350. data/packages/sproutcore-corefoundation/tests.html +12 -0
  351. data/packages/sproutcore-datastore/lib/main.js +23 -0
  352. data/packages/sproutcore-datastore/package.json +16 -0
  353. data/packages/sproutcore-datetime/lib/main.js +6 -0
  354. data/packages/sproutcore-datetime/package.json +16 -0
  355. data/packages/sproutcore-handlebars/lib/handlebars.js +5 -0
  356. data/packages/sproutcore-handlebars/lib/main.js +15 -0
  357. data/packages/sproutcore-handlebars/package.json +17 -0
  358. data/packages/sproutcore-jquery/lib/main.js +10 -0
  359. data/packages/sproutcore-jquery/package.json +12 -0
  360. data/packages/sproutcore-preprocessor/bin/chance +64 -0
  361. data/packages/sproutcore-preprocessor/lib/css.js +21 -0
  362. data/packages/sproutcore-preprocessor/lib/main.js +1 -0
  363. data/packages/sproutcore-preprocessor/lib/preprocessor.js +12 -0
  364. data/packages/sproutcore-preprocessor/lib/sc_static.js +9 -0
  365. data/packages/sproutcore-preprocessor/package.json +18 -0
  366. data/packages/sproutcore-runtime/lib/main.js +37 -0
  367. data/packages/sproutcore-runtime/package.json +21 -0
  368. data/packages/text/lib/main.js +8 -0
  369. data/packages/text/package.json +9 -0
  370. data/packages/web-file/README.md +7 -0
  371. data/packages/web-file/lib/errors.js +32 -0
  372. data/packages/web-file/lib/file-reader.js +10 -0
  373. data/packages/web-file/lib/file-system.js +234 -0
  374. data/packages/web-file/lib/file-writer.js +10 -0
  375. data/packages/web-file/lib/file.js +9 -0
  376. data/packages/web-file/lib/main.js +34 -0
  377. data/packages/web-file/lib/platform.js +25 -0
  378. data/packages/web-file/lib/ruby/file.rb +252 -0
  379. data/packages/web-file/lib/ruby/file_reader.rb +69 -0
  380. data/packages/web-file/lib/ruby/file_system.rb +134 -0
  381. data/packages/web-file/lib/ruby/file_writer.rb +78 -0
  382. data/packages/web-file/package.json +12 -0
  383. data/packages/web-typed-array/README.md +7 -0
  384. data/packages/web-typed-array/lib/array-buffer-view.js +9 -0
  385. data/packages/web-typed-array/lib/array-buffer.js +7 -0
  386. data/packages/web-typed-array/lib/main.js +33 -0
  387. data/packages/web-typed-array/lib/platform.js +20 -0
  388. data/packages/web-typed-array/lib/ruby/array_buffer.rb +31 -0
  389. data/packages/web-typed-array/lib/ruby/array_buffer_view.rb +130 -0
  390. data/packages/web-typed-array/lib/ruby/typed_array.rb +133 -0
  391. data/packages/web-typed-array/lib/typed-array.js +26 -0
  392. data/packages/web-typed-array/package.json +9 -0
  393. data/spade.gemspec +30 -0
  394. data/spec/cli/build_spec.rb +59 -0
  395. data/spec/cli/install_spec.rb +106 -0
  396. data/spec/cli/installed_spec.rb +55 -0
  397. data/spec/cli/list_spec.rb +75 -0
  398. data/spec/cli/login_spec.rb +76 -0
  399. data/spec/cli/owner_spec.rb +115 -0
  400. data/spec/cli/push_spec.rb +74 -0
  401. data/spec/cli/uninstall_spec.rb +58 -0
  402. data/spec/cli/unpack_spec.rb +73 -0
  403. data/spec/credentials_spec.rb +24 -0
  404. data/spec/fixtures/coffee/bin/cake +0 -0
  405. data/spec/fixtures/coffee/bin/coffee +0 -0
  406. data/spec/fixtures/coffee/lib/coffee.js +0 -0
  407. data/spec/fixtures/coffee/lib/coffee.png +0 -0
  408. data/spec/fixtures/coffee/lib/coffee/base.js +0 -0
  409. data/spec/fixtures/coffee/lib/coffee/mocha/chai.js +0 -0
  410. data/spec/fixtures/coffee/qunit/coffee/test.js +0 -0
  411. data/spec/fixtures/coffee/qunit/test.js +0 -0
  412. data/spec/fixtures/coffee/qunit/test.log +0 -0
  413. data/spec/fixtures/package.json +25 -0
  414. data/spec/gauntlet_spec.rb +30 -0
  415. data/spec/javascript/async-test.js +123 -0
  416. data/spec/javascript/compiler/javascript.js +13 -0
  417. data/spec/javascript/compiler/ruby.js +14 -0
  418. data/spec/javascript/loader-test.js +64 -0
  419. data/spec/javascript/normalize-test.js +59 -0
  420. data/spec/javascript/packages-test.js +44 -0
  421. data/spec/javascript/relative-require-test.js +72 -0
  422. data/spec/javascript/require-test.js +56 -0
  423. data/spec/javascript/sandbox/compile.js +37 -0
  424. data/spec/javascript/sandbox/creation.js +44 -0
  425. data/spec/javascript/sandbox/format.js +79 -0
  426. data/spec/javascript/sandbox/misc.js +57 -0
  427. data/spec/javascript/sandbox/preprocessor.js +81 -0
  428. data/spec/javascript/sandbox/require.js +48 -0
  429. data/spec/javascript/sandbox/run-command.js +21 -0
  430. data/spec/javascript/spade/externs.js +14 -0
  431. data/spec/javascript/spade/load-factory.js +15 -0
  432. data/spec/javascript/spade/misc.js +23 -0
  433. data/spec/javascript/spade/ready.js +12 -0
  434. data/spec/javascript/spade/register.js +13 -0
  435. data/spec/javascript_spec.rb +7 -0
  436. data/spec/package_spec.rb +257 -0
  437. data/spec/spec_helper.rb +30 -0
  438. data/spec/support/cli.rb +94 -0
  439. data/spec/support/core_test.rb +52 -0
  440. data/spec/support/fake.rb +42 -0
  441. data/spec/support/fake_gem_server.rb +50 -0
  442. data/spec/support/fake_gemcutter.rb +29 -0
  443. data/spec/support/matchers.rb +31 -0
  444. data/spec/support/path.rb +54 -0
  445. data/sproutcore/.gitignore +13 -0
  446. data/sproutcore/Buildfile +112 -0
  447. data/sproutcore/CHANGELOG.md +232 -0
  448. data/sproutcore/README.md +68 -0
  449. data/sproutcore/apps/docs/core.js +27 -0
  450. data/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
  451. data/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
  452. data/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
  453. data/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
  454. data/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
  455. data/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
  456. data/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
  457. data/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
  458. data/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
  459. data/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
  460. data/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
  461. data/sproutcore/apps/docs/english.lproj/strings.js +15 -0
  462. data/sproutcore/apps/docs/main.js +30 -0
  463. data/sproutcore/apps/greenhouse/README +18 -0
  464. data/sproutcore/apps/greenhouse/TODO +56 -0
  465. data/sproutcore/apps/greenhouse/beautify.js +1058 -0
  466. data/sproutcore/apps/greenhouse/controllers/design.js +20 -0
  467. data/sproutcore/apps/greenhouse/controllers/file.js +35 -0
  468. data/sproutcore/apps/greenhouse/controllers/files.js +40 -0
  469. data/sproutcore/apps/greenhouse/controllers/layout.js +53 -0
  470. data/sproutcore/apps/greenhouse/controllers/library.js +194 -0
  471. data/sproutcore/apps/greenhouse/controllers/page.js +18 -0
  472. data/sproutcore/apps/greenhouse/controllers/property.js +19 -0
  473. data/sproutcore/apps/greenhouse/controllers/property_editor.js +17 -0
  474. data/sproutcore/apps/greenhouse/controllers/target.js +20 -0
  475. data/sproutcore/apps/greenhouse/controllers/targets.js +43 -0
  476. data/sproutcore/apps/greenhouse/controllers/view_configs.js +100 -0
  477. data/sproutcore/apps/greenhouse/core.js +65 -0
  478. data/sproutcore/apps/greenhouse/core_file.js +124 -0
  479. data/sproutcore/apps/greenhouse/data_source.js +250 -0
  480. data/sproutcore/apps/greenhouse/english.lproj/app_page.js +399 -0
  481. data/sproutcore/apps/greenhouse/english.lproj/css/app-selector.css +107 -0
  482. data/sproutcore/apps/greenhouse/english.lproj/css/button.css +314 -0
  483. data/sproutcore/apps/greenhouse/english.lproj/css/dock.css +90 -0
  484. data/sproutcore/apps/greenhouse/english.lproj/css/general.css +51 -0
  485. data/sproutcore/apps/greenhouse/english.lproj/css/main-page.css +93 -0
  486. data/sproutcore/apps/greenhouse/english.lproj/css/menu.css +49 -0
  487. data/sproutcore/apps/greenhouse/english.lproj/css/modal.css +41 -0
  488. data/sproutcore/apps/greenhouse/english.lproj/css/picker.css +195 -0
  489. data/sproutcore/apps/greenhouse/english.lproj/css/search.css +60 -0
  490. data/sproutcore/apps/greenhouse/english.lproj/css/text-field.css +67 -0
  491. data/sproutcore/apps/greenhouse/english.lproj/dialogs.js +303 -0
  492. data/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500.eot +0 -0
  493. data/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500.otf +0 -0
  494. data/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500.woff +0 -0
  495. data/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500_italic.eot +0 -0
  496. data/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500_italic.otf +0 -0
  497. data/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500_italic.woff +0 -0
  498. data/sproutcore/apps/greenhouse/english.lproj/images/app-selector/choose-app.png +0 -0
  499. data/sproutcore/apps/greenhouse/english.lproj/images/app-selector/list-item-sel.png +0 -0
  500. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/active-l.png +0 -0
  501. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/active-m.png +0 -0
  502. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/active-r.png +0 -0
  503. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/regular-l.png +0 -0
  504. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/regular-m.png +0 -0
  505. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/regular-r.png +0 -0
  506. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/active-l.png +0 -0
  507. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/active-r.png +0 -0
  508. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/disabled-l.png +0 -0
  509. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/disabled-r.png +0 -0
  510. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/regular-l.png +0 -0
  511. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/regular-r.png +0 -0
  512. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-active-l.png +0 -0
  513. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-active-r.png +0 -0
  514. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-disabled-l.png +0 -0
  515. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-disabled-r.png +0 -0
  516. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-l.png +0 -0
  517. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-r.png +0 -0
  518. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/active-l.png +0 -0
  519. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/active-m.png +0 -0
  520. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/active-r.png +0 -0
  521. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-active-l.png +0 -0
  522. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-active-r.png +0 -0
  523. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-l.png +0 -0
  524. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-r.png +0 -0
  525. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-active-l.png +0 -0
  526. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-active-r.png +0 -0
  527. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-l.png +0 -0
  528. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-r.png +0 -0
  529. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/disabled-l.png +0 -0
  530. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/disabled-m.png +0 -0
  531. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/disabled-r.png +0 -0
  532. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/regular-l.png +0 -0
  533. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/regular-m.png +0 -0
  534. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/regular-r.png +0 -0
  535. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-active-l.png +0 -0
  536. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-active-m.png +0 -0
  537. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-active-r.png +0 -0
  538. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-disabled-l.png +0 -0
  539. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-disabled-m.png +0 -0
  540. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-disabled-r.png +0 -0
  541. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-l.png +0 -0
  542. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-m.png +0 -0
  543. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-r.png +0 -0
  544. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/active-m.png +0 -0
  545. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/disabled-m.png +0 -0
  546. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/regular-m.png +0 -0
  547. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/sel-active-m.png +0 -0
  548. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/sel-disabled-m.png +0 -0
  549. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/sel-m.png +0 -0
  550. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/active-l.png +0 -0
  551. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/active-r.png +0 -0
  552. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/disabled-l.png +0 -0
  553. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/disabled-r.png +0 -0
  554. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/regular-l.png +0 -0
  555. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/regular-r.png +0 -0
  556. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-active-l.png +0 -0
  557. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-active-r.png +0 -0
  558. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-disabled-l.png +0 -0
  559. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-disabled-r.png +0 -0
  560. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-l.png +0 -0
  561. data/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-r.png +0 -0
  562. data/sproutcore/apps/greenhouse/english.lproj/images/icons/actions-active.png +0 -0
  563. data/sproutcore/apps/greenhouse/english.lproj/images/icons/actions.png +0 -0
  564. data/sproutcore/apps/greenhouse/english.lproj/images/icons/inspector-active.png +0 -0
  565. data/sproutcore/apps/greenhouse/english.lproj/images/icons/inspector.png +0 -0
  566. data/sproutcore/apps/greenhouse/english.lproj/images/icons/library-active.png +0 -0
  567. data/sproutcore/apps/greenhouse/english.lproj/images/icons/library.png +0 -0
  568. data/sproutcore/apps/greenhouse/english.lproj/images/icons/projects-active.png +0 -0
  569. data/sproutcore/apps/greenhouse/english.lproj/images/icons/projects.png +0 -0
  570. data/sproutcore/apps/greenhouse/english.lproj/images/icons/run-active.png +0 -0
  571. data/sproutcore/apps/greenhouse/english.lproj/images/icons/run.png +0 -0
  572. data/sproutcore/apps/greenhouse/english.lproj/images/icons/save-active.png +0 -0
  573. data/sproutcore/apps/greenhouse/english.lproj/images/icons/save.png +0 -0
  574. data/sproutcore/apps/greenhouse/english.lproj/images/logos/greenhouse-l.png +0 -0
  575. data/sproutcore/apps/greenhouse/english.lproj/images/logos/greenhouse-s.png +0 -0
  576. data/sproutcore/apps/greenhouse/english.lproj/images/logos/sproutcore.png +0 -0
  577. data/sproutcore/apps/greenhouse/english.lproj/images/main-bg.png +0 -0
  578. data/sproutcore/apps/greenhouse/english.lproj/images/picker/bottom-left.png +0 -0
  579. data/sproutcore/apps/greenhouse/english.lproj/images/picker/bottom-right.png +0 -0
  580. data/sproutcore/apps/greenhouse/english.lproj/images/picker/bottom.png +0 -0
  581. data/sproutcore/apps/greenhouse/english.lproj/images/picker/close-active.png +0 -0
  582. data/sproutcore/apps/greenhouse/english.lproj/images/picker/close.png +0 -0
  583. data/sproutcore/apps/greenhouse/english.lproj/images/picker/left.png +0 -0
  584. data/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-bottom.png +0 -0
  585. data/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-left.png +0 -0
  586. data/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-right.png +0 -0
  587. data/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-top.png +0 -0
  588. data/sproutcore/apps/greenhouse/english.lproj/images/picker/right.png +0 -0
  589. data/sproutcore/apps/greenhouse/english.lproj/images/picker/search-active.png +0 -0
  590. data/sproutcore/apps/greenhouse/english.lproj/images/picker/search.png +0 -0
  591. data/sproutcore/apps/greenhouse/english.lproj/images/picker/top-left.png +0 -0
  592. data/sproutcore/apps/greenhouse/english.lproj/images/picker/top-right.png +0 -0
  593. data/sproutcore/apps/greenhouse/english.lproj/images/picker/top.png +0 -0
  594. data/sproutcore/apps/greenhouse/english.lproj/images/toolbar-bg.png +0 -0
  595. data/sproutcore/apps/greenhouse/english.lproj/inspectors.js +365 -0
  596. data/sproutcore/apps/greenhouse/english.lproj/loading.rhtml +9 -0
  597. data/sproutcore/apps/greenhouse/english.lproj/main_page.js +95 -0
  598. data/sproutcore/apps/greenhouse/english.lproj/strings.js +93 -0
  599. data/sproutcore/apps/greenhouse/fixtures/file.js +35 -0
  600. data/sproutcore/apps/greenhouse/main.js +28 -0
  601. data/sproutcore/apps/greenhouse/mixins/drop_down.js +97 -0
  602. data/sproutcore/apps/greenhouse/models/design.js +26 -0
  603. data/sproutcore/apps/greenhouse/models/dir.js +93 -0
  604. data/sproutcore/apps/greenhouse/models/file.js +51 -0
  605. data/sproutcore/apps/greenhouse/models/target.js +82 -0
  606. data/sproutcore/apps/greenhouse/models/view_config.js +49 -0
  607. data/sproutcore/apps/greenhouse/resources/test_page.js +37 -0
  608. data/sproutcore/apps/greenhouse/states/inspector.js +152 -0
  609. data/sproutcore/apps/greenhouse/states/library.js +142 -0
  610. data/sproutcore/apps/greenhouse/states/main.js +283 -0
  611. data/sproutcore/apps/greenhouse/states/modals.js +299 -0
  612. data/sproutcore/apps/greenhouse/states/ready.js +235 -0
  613. data/sproutcore/apps/greenhouse/tests/controllers/design.js +15 -0
  614. data/sproutcore/apps/greenhouse/tests/controllers/designs.js +15 -0
  615. data/sproutcore/apps/greenhouse/tests/controllers/file.js +15 -0
  616. data/sproutcore/apps/greenhouse/tests/controllers/files.js +15 -0
  617. data/sproutcore/apps/greenhouse/tests/models/file.js +15 -0
  618. data/sproutcore/apps/greenhouse/tests/models/view_config.js +15 -0
  619. data/sproutcore/apps/greenhouse/tests/views/list_item.js +16 -0
  620. data/sproutcore/apps/greenhouse/tests/views/plist_item.js +20 -0
  621. data/sproutcore/apps/greenhouse/theme.js +25 -0
  622. data/sproutcore/apps/greenhouse/views/anchor.js +277 -0
  623. data/sproutcore/apps/greenhouse/views/application_list_item.js +19 -0
  624. data/sproutcore/apps/greenhouse/views/event_blocker.js +32 -0
  625. data/sproutcore/apps/greenhouse/views/label_designer.js +16 -0
  626. data/sproutcore/apps/greenhouse/views/list_item.js +42 -0
  627. data/sproutcore/apps/greenhouse/views/plist_item.js +178 -0
  628. data/sproutcore/apps/greenhouse/views/simple_button.js +157 -0
  629. data/sproutcore/apps/greenhouse/views/tear_off_picker.js +56 -0
  630. data/sproutcore/apps/greenhouse/views/web.js +44 -0
  631. data/sproutcore/apps/test_controls/Buildfile +0 -0
  632. data/sproutcore/apps/test_controls/controllers/buttons.js +21 -0
  633. data/sproutcore/apps/test_controls/controllers/categories.js +108 -0
  634. data/sproutcore/apps/test_controls/controllers/category.js +36 -0
  635. data/sproutcore/apps/test_controls/core.js +29 -0
  636. data/sproutcore/apps/test_controls/main.js +14 -0
  637. data/sproutcore/apps/test_controls/resources/buttons_page.js +142 -0
  638. data/sproutcore/apps/test_controls/resources/checkboxes_page.js +45 -0
  639. data/sproutcore/apps/test_controls/resources/flow_layout_page.js +84 -0
  640. data/sproutcore/apps/test_controls/resources/list_page.js +40 -0
  641. data/sproutcore/apps/test_controls/resources/loading.rhtml +9 -0
  642. data/sproutcore/apps/test_controls/resources/main_page.css +60 -0
  643. data/sproutcore/apps/test_controls/resources/main_page.js +145 -0
  644. data/sproutcore/apps/test_controls/resources/progress_page.js +32 -0
  645. data/sproutcore/apps/test_controls/resources/radio_page.js +48 -0
  646. data/sproutcore/apps/test_controls/resources/scroll_page.js +76 -0
  647. data/sproutcore/apps/test_controls/resources/segmented_page.js +98 -0
  648. data/sproutcore/apps/test_controls/resources/select_page.js +60 -0
  649. data/sproutcore/apps/test_controls/resources/sliders_page.js +53 -0
  650. data/sproutcore/apps/test_controls/resources/strings.js +50 -0
  651. data/sproutcore/apps/test_controls/resources/tab_page.js +44 -0
  652. data/sproutcore/apps/test_controls/resources/text_field_page.js +41 -0
  653. data/sproutcore/apps/test_controls/theme.js +34 -0
  654. data/sproutcore/apps/tests/controllers/detail.js +25 -0
  655. data/sproutcore/apps/tests/controllers/source.js +29 -0
  656. data/sproutcore/apps/tests/controllers/target.js +26 -0
  657. data/sproutcore/apps/tests/controllers/targets.js +86 -0
  658. data/sproutcore/apps/tests/controllers/tests.js +33 -0
  659. data/sproutcore/apps/tests/core.js +133 -0
  660. data/sproutcore/apps/tests/english.lproj/loading.rhtml +9 -0
  661. data/sproutcore/apps/tests/english.lproj/main_page.css +48 -0
  662. data/sproutcore/apps/tests/english.lproj/main_page.js +233 -0
  663. data/sproutcore/apps/tests/english.lproj/strings.js +26 -0
  664. data/sproutcore/apps/tests/main.js +27 -0
  665. data/sproutcore/apps/tests/states/no_targets.js +26 -0
  666. data/sproutcore/apps/tests/states/ready.js +56 -0
  667. data/sproutcore/apps/tests/states/ready_detail.js +41 -0
  668. data/sproutcore/apps/tests/states/ready_empty.js +48 -0
  669. data/sproutcore/apps/tests/states/ready_list.js +41 -0
  670. data/sproutcore/apps/tests/states/ready_loading.js +44 -0
  671. data/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
  672. data/sproutcore/apps/tests/states/start.js +39 -0
  673. data/sproutcore/apps/tests/tests/controllers/detail.js +15 -0
  674. data/sproutcore/apps/tests/tests/controllers/source.js +15 -0
  675. data/sproutcore/apps/tests/tests/controllers/target.js +15 -0
  676. data/sproutcore/apps/tests/tests/controllers/targets.js +15 -0
  677. data/sproutcore/apps/tests/tests/controllers/tests.js +15 -0
  678. data/sproutcore/apps/tests/tests/models/target.js +15 -0
  679. data/sproutcore/apps/tests/tests/models/test.js +15 -0
  680. data/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
  681. data/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
  682. data/sproutcore/apps/welcome/controllers/targets.js +56 -0
  683. data/sproutcore/apps/welcome/core.js +30 -0
  684. data/sproutcore/apps/welcome/english.lproj/images/main-bg.png +0 -0
  685. data/sproutcore/apps/welcome/english.lproj/loading.rhtml +10 -0
  686. data/sproutcore/apps/welcome/english.lproj/main_page.css +25 -0
  687. data/sproutcore/apps/welcome/english.lproj/main_page.js +67 -0
  688. data/sproutcore/apps/welcome/english.lproj/strings.js +15 -0
  689. data/sproutcore/apps/welcome/main.js +19 -0
  690. data/sproutcore/apps/welcome/tests/controllers/targets.js +15 -0
  691. data/sproutcore/design/CollectionView State Charts.graffle +4848 -0
  692. data/sproutcore/design/Design Charts.graffle +16845 -0
  693. data/sproutcore/design/Record State Table.numbers +0 -0
  694. data/sproutcore/design/SproutCore Datastore Design.graffle/QuickLook/Preview.pdf +0 -0
  695. data/sproutcore/design/SproutCore Datastore Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  696. data/sproutcore/design/SproutCore Datastore Design.graffle/data.plist +19588 -0
  697. data/sproutcore/design/SproutCore Datastore Design.graffle/image8.png +0 -0
  698. data/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
  699. data/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
  700. data/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
  701. data/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
  702. data/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
  703. data/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  704. data/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
  705. data/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
  706. data/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
  707. data/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
  708. data/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
  709. data/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
  710. data/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
  711. data/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
  712. data/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
  713. data/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
  714. data/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
  715. data/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
  716. data/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
  717. data/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
  718. data/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
  719. data/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
  720. data/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
  721. data/sproutcore/design/greenhouse-statechart.graffle +9025 -0
  722. data/sproutcore/design/greenhouse-statechart.pdf +0 -0
  723. data/sproutcore/design/iphone-webapp-loading.psd +0 -0
  724. data/sproutcore/frameworks/animation/Buildfile +3 -0
  725. data/sproutcore/frameworks/animation/LICENSE +25 -0
  726. data/sproutcore/frameworks/animation/README.md +79 -0
  727. data/sproutcore/frameworks/animation/core.js +1206 -0
  728. data/sproutcore/frameworks/animation/tests/core.js +152 -0
  729. data/sproutcore/frameworks/bootstrap/README +9 -0
  730. data/sproutcore/frameworks/bootstrap/core.js +7 -0
  731. data/sproutcore/frameworks/bootstrap/setup_body_class_names.js +10 -0
  732. data/sproutcore/frameworks/bootstrap/system/bench.js +14 -0
  733. data/sproutcore/frameworks/bootstrap/system/browser.js +65 -0
  734. data/sproutcore/frameworks/bootstrap/system/loader.js +50 -0
  735. data/sproutcore/frameworks/bootstrap/tests/system/browser.js +187 -0
  736. data/sproutcore/frameworks/core_foundation/.greenhouseconf +33 -0
  737. data/sproutcore/frameworks/core_foundation/controllers/array.js +498 -0
  738. data/sproutcore/frameworks/core_foundation/controllers/controller.js +44 -0
  739. data/sproutcore/frameworks/core_foundation/controllers/object.js +342 -0
  740. data/sproutcore/frameworks/core_foundation/core.js +201 -0
  741. data/sproutcore/frameworks/core_foundation/ext/object.js +83 -0
  742. data/sproutcore/frameworks/core_foundation/ext/run_loop.js +163 -0
  743. data/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +110 -0
  744. data/sproutcore/frameworks/core_foundation/mixins/responder_context.js +269 -0
  745. data/sproutcore/frameworks/core_foundation/mixins/selection_support.js +250 -0
  746. data/sproutcore/frameworks/core_foundation/mixins/string.js +163 -0
  747. data/sproutcore/frameworks/core_foundation/panes/keyboard.js +68 -0
  748. data/sproutcore/frameworks/core_foundation/panes/layout.js +108 -0
  749. data/sproutcore/frameworks/core_foundation/panes/main.js +52 -0
  750. data/sproutcore/frameworks/core_foundation/panes/manipulation.js +27 -0
  751. data/sproutcore/frameworks/core_foundation/panes/pane.js +672 -0
  752. data/sproutcore/frameworks/core_foundation/panes/template.js +24 -0
  753. data/sproutcore/frameworks/core_foundation/panes/visibility.js +11 -0
  754. data/sproutcore/frameworks/core_foundation/protocols/observable_protocol.js +40 -0
  755. data/sproutcore/frameworks/core_foundation/protocols/sparse_array_delegate.js +131 -0
  756. data/sproutcore/frameworks/core_foundation/resources/core.css +371 -0
  757. data/sproutcore/frameworks/core_foundation/resources/view.css +57 -0
  758. data/sproutcore/frameworks/core_foundation/system/application.js +35 -0
  759. data/sproutcore/frameworks/core_foundation/system/browser.js +36 -0
  760. data/sproutcore/frameworks/core_foundation/system/builder.js +210 -0
  761. data/sproutcore/frameworks/core_foundation/system/core_query.js +141 -0
  762. data/sproutcore/frameworks/core_foundation/system/cursor.js +131 -0
  763. data/sproutcore/frameworks/core_foundation/system/device.js +210 -0
  764. data/sproutcore/frameworks/core_foundation/system/event.js +914 -0
  765. data/sproutcore/frameworks/core_foundation/system/json.js +515 -0
  766. data/sproutcore/frameworks/core_foundation/system/locale.js +293 -0
  767. data/sproutcore/frameworks/core_foundation/system/page.js +108 -0
  768. data/sproutcore/frameworks/core_foundation/system/platform.js +399 -0
  769. data/sproutcore/frameworks/core_foundation/system/ready.js +77 -0
  770. data/sproutcore/frameworks/core_foundation/system/render_context.js +1063 -0
  771. data/sproutcore/frameworks/core_foundation/system/responder.js +124 -0
  772. data/sproutcore/frameworks/core_foundation/system/root_responder.js +2173 -0
  773. data/sproutcore/frameworks/core_foundation/system/selection_set.js +695 -0
  774. data/sproutcore/frameworks/core_foundation/system/sparse_array.js +393 -0
  775. data/sproutcore/frameworks/core_foundation/system/theme.js +316 -0
  776. data/sproutcore/frameworks/core_foundation/system/timer.js +553 -0
  777. data/sproutcore/frameworks/core_foundation/system/utils.js +151 -0
  778. data/sproutcore/frameworks/core_foundation/system/utils/rect.js +98 -0
  779. data/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +218 -0
  780. data/sproutcore/frameworks/core_foundation/tests/controllers/array/enum_case.js +206 -0
  781. data/sproutcore/frameworks/core_foundation/tests/controllers/array/null_case.js +64 -0
  782. data/sproutcore/frameworks/core_foundation/tests/controllers/array/selection_support.js +344 -0
  783. data/sproutcore/frameworks/core_foundation/tests/controllers/array/single_case.js +136 -0
  784. data/sproutcore/frameworks/core_foundation/tests/controllers/object/empty_case.js +82 -0
  785. data/sproutcore/frameworks/core_foundation/tests/controllers/object/multiple_case.js +111 -0
  786. data/sproutcore/frameworks/core_foundation/tests/controllers/object/single_case.js +193 -0
  787. data/sproutcore/frameworks/core_foundation/tests/controllers/object/single_enumerable_case.js +265 -0
  788. data/sproutcore/frameworks/core_foundation/tests/mixins/responder_context.js +75 -0
  789. data/sproutcore/frameworks/core_foundation/tests/mixins/string.js +55 -0
  790. data/sproutcore/frameworks/core_foundation/tests/panes/template.js +14 -0
  791. data/sproutcore/frameworks/core_foundation/tests/system/builder.js +42 -0
  792. data/sproutcore/frameworks/core_foundation/tests/system/core_query/within.js +65 -0
  793. data/sproutcore/frameworks/core_foundation/tests/system/json.js +14 -0
  794. data/sproutcore/frameworks/core_foundation/tests/system/locale.js +134 -0
  795. data/sproutcore/frameworks/core_foundation/tests/system/ready/done.js +32 -0
  796. data/sproutcore/frameworks/core_foundation/tests/system/render_context/begin.js +47 -0
  797. data/sproutcore/frameworks/core_foundation/tests/system/render_context/element.js +44 -0
  798. data/sproutcore/frameworks/core_foundation/tests/system/render_context/end.js +124 -0
  799. data/sproutcore/frameworks/core_foundation/tests/system/render_context/get.js +51 -0
  800. data/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_attr.js +50 -0
  801. data/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_basic.js +28 -0
  802. data/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_className.js +177 -0
  803. data/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +109 -0
  804. data/sproutcore/frameworks/core_foundation/tests/system/render_context/init.js +55 -0
  805. data/sproutcore/frameworks/core_foundation/tests/system/render_context/join.js +28 -0
  806. data/sproutcore/frameworks/core_foundation/tests/system/render_context/push_text.js +74 -0
  807. data/sproutcore/frameworks/core_foundation/tests/system/render_context/tag.js +46 -0
  808. data/sproutcore/frameworks/core_foundation/tests/system/render_context/update.js +218 -0
  809. data/sproutcore/frameworks/core_foundation/tests/system/root_responder/makeKeyPane.js +124 -0
  810. data/sproutcore/frameworks/core_foundation/tests/system/root_responder/makeMainPane.js +68 -0
  811. data/sproutcore/frameworks/core_foundation/tests/system/root_responder/makeMenuPane.js +48 -0
  812. data/sproutcore/frameworks/core_foundation/tests/system/root_responder/root_responder.js +101 -0
  813. data/sproutcore/frameworks/core_foundation/tests/system/root_responder/targetForAction.js +288 -0
  814. data/sproutcore/frameworks/core_foundation/tests/system/selection_set/add.js +92 -0
  815. data/sproutcore/frameworks/core_foundation/tests/system/selection_set/copy.js +17 -0
  816. data/sproutcore/frameworks/core_foundation/tests/system/selection_set/indexSetForSource.js +98 -0
  817. data/sproutcore/frameworks/core_foundation/tests/system/selection_set/isEqual.js +60 -0
  818. data/sproutcore/frameworks/core_foundation/tests/system/selection_set/remove.js +111 -0
  819. data/sproutcore/frameworks/core_foundation/tests/system/sparse_array.js +194 -0
  820. data/sproutcore/frameworks/core_foundation/tests/system/theme.js +77 -0
  821. data/sproutcore/frameworks/core_foundation/tests/system/timer/invalidate.js +38 -0
  822. data/sproutcore/frameworks/core_foundation/tests/system/timer/invokeLater.js +203 -0
  823. data/sproutcore/frameworks/core_foundation/tests/system/timer/isPaused.js +71 -0
  824. data/sproutcore/frameworks/core_foundation/tests/system/timer/performAction.js +69 -0
  825. data/sproutcore/frameworks/core_foundation/tests/system/timer/schedule.js +170 -0
  826. data/sproutcore/frameworks/core_foundation/tests/system/utils/normalizeURL.js +18 -0
  827. data/sproutcore/frameworks/core_foundation/tests/system/utils/offset.js +271 -0
  828. data/sproutcore/frameworks/core_foundation/tests/system/utils/rect.js +99 -0
  829. data/sproutcore/frameworks/core_foundation/tests/views/main_pane.js +43 -0
  830. data/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +218 -0
  831. data/sproutcore/frameworks/core_foundation/tests/views/pane/child_view.js +20 -0
  832. data/sproutcore/frameworks/core_foundation/tests/views/pane/firstResponder.js +148 -0
  833. data/sproutcore/frameworks/core_foundation/tests/views/pane/keyPane.js +133 -0
  834. data/sproutcore/frameworks/core_foundation/tests/views/pane/layout.js +31 -0
  835. data/sproutcore/frameworks/core_foundation/tests/views/pane/sendEvent.js +206 -0
  836. data/sproutcore/frameworks/core_foundation/tests/views/template/checkbox_support.js +32 -0
  837. data/sproutcore/frameworks/core_foundation/tests/views/template/text_field_support.js +73 -0
  838. data/sproutcore/frameworks/core_foundation/tests/views/template_view/collection.js +111 -0
  839. data/sproutcore/frameworks/core_foundation/tests/views/template_view/core.js +100 -0
  840. data/sproutcore/frameworks/core_foundation/tests/views/template_view/handlebars.js +580 -0
  841. data/sproutcore/frameworks/core_foundation/tests/views/view/animation.js +376 -0
  842. data/sproutcore/frameworks/core_foundation/tests/views/view/build.js +85 -0
  843. data/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +89 -0
  844. data/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +117 -0
  845. data/sproutcore/frameworks/core_foundation/tests/views/view/convertFrames.js +248 -0
  846. data/sproutcore/frameworks/core_foundation/tests/views/view/convertLayouts.js +145 -0
  847. data/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +132 -0
  848. data/sproutcore/frameworks/core_foundation/tests/views/view/createLayer.js +97 -0
  849. data/sproutcore/frameworks/core_foundation/tests/views/view/destroyLayer.js +83 -0
  850. data/sproutcore/frameworks/core_foundation/tests/views/view/didAppendToDocument.js +51 -0
  851. data/sproutcore/frameworks/core_foundation/tests/views/view/findLayerInParentLayer.js +50 -0
  852. data/sproutcore/frameworks/core_foundation/tests/views/view/init.js +50 -0
  853. data/sproutcore/frameworks/core_foundation/tests/views/view/insertBefore.js +217 -0
  854. data/sproutcore/frameworks/core_foundation/tests/views/view/isVisible.js +79 -0
  855. data/sproutcore/frameworks/core_foundation/tests/views/view/isVisibleInWindow.js +116 -0
  856. data/sproutcore/frameworks/core_foundation/tests/views/view/keyboard.js +22 -0
  857. data/sproutcore/frameworks/core_foundation/tests/views/view/layer.js +150 -0
  858. data/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +162 -0
  859. data/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +180 -0
  860. data/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +735 -0
  861. data/sproutcore/frameworks/core_foundation/tests/views/view/parentViewDidChange.js +67 -0
  862. data/sproutcore/frameworks/core_foundation/tests/views/view/prepareContext.js +203 -0
  863. data/sproutcore/frameworks/core_foundation/tests/views/view/removeChild.js +189 -0
  864. data/sproutcore/frameworks/core_foundation/tests/views/view/render.js +125 -0
  865. data/sproutcore/frameworks/core_foundation/tests/views/view/render_delegate_support.js +163 -0
  866. data/sproutcore/frameworks/core_foundation/tests/views/view/replaceChild.js +29 -0
  867. data/sproutcore/frameworks/core_foundation/tests/views/view/static_layout.js +21 -0
  868. data/sproutcore/frameworks/core_foundation/tests/views/view/theme.js +43 -0
  869. data/sproutcore/frameworks/core_foundation/tests/views/view/updateLayer.js +148 -0
  870. data/sproutcore/frameworks/core_foundation/tests/views/view/updateLayerLocation.js +213 -0
  871. data/sproutcore/frameworks/core_foundation/tests/views/view/view.js +64 -0
  872. data/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +202 -0
  873. data/sproutcore/frameworks/core_foundation/views/template.js +77 -0
  874. data/sproutcore/frameworks/core_foundation/views/template/checkbox_support.js +20 -0
  875. data/sproutcore/frameworks/core_foundation/views/template/collection.js +106 -0
  876. data/sproutcore/frameworks/core_foundation/views/template/text_field_support.js +35 -0
  877. data/sproutcore/frameworks/core_foundation/views/view.js +1458 -0
  878. data/sproutcore/frameworks/core_foundation/views/view/animation.js +181 -0
  879. data/sproutcore/frameworks/core_foundation/views/view/base.js +1 -0
  880. data/sproutcore/frameworks/core_foundation/views/view/cursor.js +48 -0
  881. data/sproutcore/frameworks/core_foundation/views/view/enabled.js +57 -0
  882. data/sproutcore/frameworks/core_foundation/views/view/keyboard.js +223 -0
  883. data/sproutcore/frameworks/core_foundation/views/view/layout.js +1087 -0
  884. data/sproutcore/frameworks/core_foundation/views/view/layout_style.js +618 -0
  885. data/sproutcore/frameworks/core_foundation/views/view/manipulation.js +426 -0
  886. data/sproutcore/frameworks/core_foundation/views/view/theming.js +362 -0
  887. data/sproutcore/frameworks/core_foundation/views/view/touch.js +67 -0
  888. data/sproutcore/frameworks/core_foundation/views/view/visibility.js +118 -0
  889. data/sproutcore/frameworks/core_tools/core.js +20 -0
  890. data/sproutcore/frameworks/core_tools/data_source.js +99 -0
  891. data/sproutcore/frameworks/core_tools/english.lproj/strings.js +15 -0
  892. data/sproutcore/frameworks/core_tools/fixtures/target.js +87 -0
  893. data/sproutcore/frameworks/core_tools/fixtures/test.js +44 -0
  894. data/sproutcore/frameworks/core_tools/models/target.js +108 -0
  895. data/sproutcore/frameworks/core_tools/models/test.js +48 -0
  896. data/sproutcore/frameworks/datastore/core.js +8 -0
  897. data/sproutcore/frameworks/datastore/data_sources/cascade.js +180 -0
  898. data/sproutcore/frameworks/datastore/data_sources/data_source.js +583 -0
  899. data/sproutcore/frameworks/datastore/data_sources/fixtures.js +393 -0
  900. data/sproutcore/frameworks/datastore/debug/json.js +71 -0
  901. data/sproutcore/frameworks/datastore/debug/standard_setup.js +96 -0
  902. data/sproutcore/frameworks/datastore/fixtures/author_fixtures.js +2503 -0
  903. data/sproutcore/frameworks/datastore/fixtures/sample.js +17 -0
  904. data/sproutcore/frameworks/datastore/models/child_attribute.js +96 -0
  905. data/sproutcore/frameworks/datastore/models/children_attribute.js +75 -0
  906. data/sproutcore/frameworks/datastore/models/fetched_attribute.js +100 -0
  907. data/sproutcore/frameworks/datastore/models/many_attribute.js +154 -0
  908. data/sproutcore/frameworks/datastore/models/record.js +1318 -0
  909. data/sproutcore/frameworks/datastore/models/record_attribute.js +567 -0
  910. data/sproutcore/frameworks/datastore/models/single_attribute.js +159 -0
  911. data/sproutcore/frameworks/datastore/system/child_array.js +222 -0
  912. data/sproutcore/frameworks/datastore/system/many_array.js +418 -0
  913. data/sproutcore/frameworks/datastore/system/nested_store.js +609 -0
  914. data/sproutcore/frameworks/datastore/system/query.js +1599 -0
  915. data/sproutcore/frameworks/datastore/system/record_array.js +710 -0
  916. data/sproutcore/frameworks/datastore/system/store.js +2860 -0
  917. data/sproutcore/frameworks/datastore/tests/data_sources/cascade.js +133 -0
  918. data/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +122 -0
  919. data/sproutcore/frameworks/datastore/tests/integration/contact_model.js +131 -0
  920. data/sproutcore/frameworks/datastore/tests/integration/cyclical_relationship.js +119 -0
  921. data/sproutcore/frameworks/datastore/tests/integration/mail_model.js +91 -0
  922. data/sproutcore/frameworks/datastore/tests/integration/test_runner_model.js +56 -0
  923. data/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +73 -0
  924. data/sproutcore/frameworks/datastore/tests/models/many_attribute.js +423 -0
  925. data/sproutcore/frameworks/datastore/tests/models/nested_records/data_store.js +180 -0
  926. data/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +309 -0
  927. data/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +363 -0
  928. data/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +421 -0
  929. data/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +304 -0
  930. data/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +55 -0
  931. data/sproutcore/frameworks/datastore/tests/models/record/destroy.js +92 -0
  932. data/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +56 -0
  933. data/sproutcore/frameworks/datastore/tests/models/record/normalize.js +336 -0
  934. data/sproutcore/frameworks/datastore/tests/models/record/readAttribute.js +53 -0
  935. data/sproutcore/frameworks/datastore/tests/models/record/refresh.js +48 -0
  936. data/sproutcore/frameworks/datastore/tests/models/record/storeDidChangeProperties.js +170 -0
  937. data/sproutcore/frameworks/datastore/tests/models/record/unknownProperty.js +66 -0
  938. data/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +112 -0
  939. data/sproutcore/frameworks/datastore/tests/models/record_attribute.js +252 -0
  940. data/sproutcore/frameworks/datastore/tests/models/single_attribute.js +284 -0
  941. data/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +204 -0
  942. data/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +180 -0
  943. data/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +173 -0
  944. data/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +158 -0
  945. data/sproutcore/frameworks/datastore/tests/system/nested_store/core_methods.js +70 -0
  946. data/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +113 -0
  947. data/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +102 -0
  948. data/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +180 -0
  949. data/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +126 -0
  950. data/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +163 -0
  951. data/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +166 -0
  952. data/sproutcore/frameworks/datastore/tests/system/query/builders.js +219 -0
  953. data/sproutcore/frameworks/datastore/tests/system/query/compare.js +144 -0
  954. data/sproutcore/frameworks/datastore/tests/system/query/contains.js +131 -0
  955. data/sproutcore/frameworks/datastore/tests/system/query/containsRecordTypes.js +81 -0
  956. data/sproutcore/frameworks/datastore/tests/system/query/copy.js +30 -0
  957. data/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +197 -0
  958. data/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +92 -0
  959. data/sproutcore/frameworks/datastore/tests/system/query/expandedRecordTypes.js +64 -0
  960. data/sproutcore/frameworks/datastore/tests/system/query/parse.js +216 -0
  961. data/sproutcore/frameworks/datastore/tests/system/query/queryWithScope.js +57 -0
  962. data/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +47 -0
  963. data/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +70 -0
  964. data/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +71 -0
  965. data/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +177 -0
  966. data/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +50 -0
  967. data/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +214 -0
  968. data/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +54 -0
  969. data/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +137 -0
  970. data/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +221 -0
  971. data/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +156 -0
  972. data/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +76 -0
  973. data/sproutcore/frameworks/datastore/tests/system/store/dataHashDidChange.js +157 -0
  974. data/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +278 -0
  975. data/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +110 -0
  976. data/sproutcore/frameworks/datastore/tests/system/store/error_methods.js +62 -0
  977. data/sproutcore/frameworks/datastore/tests/system/store/find.js +530 -0
  978. data/sproutcore/frameworks/datastore/tests/system/store/init.js +23 -0
  979. data/sproutcore/frameworks/datastore/tests/system/store/loadRecord.js +64 -0
  980. data/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +61 -0
  981. data/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +74 -0
  982. data/sproutcore/frameworks/datastore/tests/system/store/readEditableDataHash.js +74 -0
  983. data/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +76 -0
  984. data/sproutcore/frameworks/datastore/tests/system/store/removeDataHash.js +144 -0
  985. data/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +200 -0
  986. data/sproutcore/frameworks/datastore/tests/system/store/unloadRecords.js +41 -0
  987. data/sproutcore/frameworks/datastore/tests/system/store/writeDataHash.js +125 -0
  988. data/sproutcore/frameworks/datetime/resources/strings.js +14 -0
  989. data/sproutcore/frameworks/datetime/system/datetime.js +1111 -0
  990. data/sproutcore/frameworks/datetime/tests/system/datetime.js +383 -0
  991. data/sproutcore/frameworks/debug/core.js +114 -0
  992. data/sproutcore/frameworks/debug/invoke_once_last_debugging.js +259 -0
  993. data/sproutcore/frameworks/designer/coders/design.js +20 -0
  994. data/sproutcore/frameworks/designer/coders/object.js +347 -0
  995. data/sproutcore/frameworks/designer/controllers/controllers.js +16 -0
  996. data/sproutcore/frameworks/designer/controllers/design.js +37 -0
  997. data/sproutcore/frameworks/designer/controllers/designs.js +133 -0
  998. data/sproutcore/frameworks/designer/controllers/page_design.js +170 -0
  999. data/sproutcore/frameworks/designer/controllers/page_files.js +22 -0
  1000. data/sproutcore/frameworks/designer/core.js +26 -0
  1001. data/sproutcore/frameworks/designer/css/css_rule.js +22 -0
  1002. data/sproutcore/frameworks/designer/css/css_style.js +29 -0
  1003. data/sproutcore/frameworks/designer/css/css_style_sheet.js +201 -0
  1004. data/sproutcore/frameworks/designer/designers/button.js +21 -0
  1005. data/sproutcore/frameworks/designer/designers/label.js +16 -0
  1006. data/sproutcore/frameworks/designer/designers/object_designer.js +296 -0
  1007. data/sproutcore/frameworks/designer/designers/tab.js +18 -0
  1008. data/sproutcore/frameworks/designer/designers/text_field.js +15 -0
  1009. data/sproutcore/frameworks/designer/designers/view_designer.js +1267 -0
  1010. data/sproutcore/frameworks/designer/english.lproj/css/designer.css +96 -0
  1011. data/sproutcore/frameworks/designer/english.lproj/design_page.js +55 -0
  1012. data/sproutcore/frameworks/designer/english.lproj/high_light.css +10 -0
  1013. data/sproutcore/frameworks/designer/english.lproj/images/controller.png +0 -0
  1014. data/sproutcore/frameworks/designer/english.lproj/images/dock-bg.png +0 -0
  1015. data/sproutcore/frameworks/designer/english.lproj/images/dock-item-bg.png +0 -0
  1016. data/sproutcore/frameworks/designer/english.lproj/images/dock-item-divider.png +0 -0
  1017. data/sproutcore/frameworks/designer/english.lproj/images/dock-item-sel-bg.png +0 -0
  1018. data/sproutcore/frameworks/designer/english.lproj/images/dock-item-sel-divider.png +0 -0
  1019. data/sproutcore/frameworks/designer/english.lproj/images/main-bg.png +0 -0
  1020. data/sproutcore/frameworks/designer/english.lproj/images/page.png +0 -0
  1021. data/sproutcore/frameworks/designer/english.lproj/images/pane.png +0 -0
  1022. data/sproutcore/frameworks/designer/english.lproj/images/view.png +0 -0
  1023. data/sproutcore/frameworks/designer/english.lproj/selection_handles.css +58 -0
  1024. data/sproutcore/frameworks/designer/ext/binding.js +33 -0
  1025. data/sproutcore/frameworks/designer/ext/object.js +26 -0
  1026. data/sproutcore/frameworks/designer/ext/page.js +58 -0
  1027. data/sproutcore/frameworks/designer/ext/view.js +27 -0
  1028. data/sproutcore/frameworks/designer/mixins/button.js +11 -0
  1029. data/sproutcore/frameworks/designer/mixins/snap_lines.js +221 -0
  1030. data/sproutcore/frameworks/designer/tests/coders/page.js +54 -0
  1031. data/sproutcore/frameworks/designer/tests/designers/view_designer.js +47 -0
  1032. data/sproutcore/frameworks/designer/views/designer_drop_target.js +144 -0
  1033. data/sproutcore/frameworks/designer/views/drawing.js +219 -0
  1034. data/sproutcore/frameworks/designer/views/high_light.js +66 -0
  1035. data/sproutcore/frameworks/designer/views/page_item_view.js +130 -0
  1036. data/sproutcore/frameworks/designer/views/selection_handles.js +78 -0
  1037. data/sproutcore/frameworks/desktop/.greenhouseconf +218 -0
  1038. data/sproutcore/frameworks/desktop/core.js +18 -0
  1039. data/sproutcore/frameworks/desktop/debug/drag.js +41 -0
  1040. data/sproutcore/frameworks/desktop/english.lproj/alert.css +56 -0
  1041. data/sproutcore/frameworks/desktop/english.lproj/debug/a_sample_image.jpg +0 -0
  1042. data/sproutcore/frameworks/desktop/english.lproj/debug/apple-logo1.jpeg +0 -0
  1043. data/sproutcore/frameworks/desktop/english.lproj/debug/iframe.html +23 -0
  1044. data/sproutcore/frameworks/desktop/english.lproj/disclosure.css +74 -0
  1045. data/sproutcore/frameworks/desktop/english.lproj/drag.css +7 -0
  1046. data/sproutcore/frameworks/desktop/english.lproj/icons.css +943 -0
  1047. data/sproutcore/frameworks/desktop/english.lproj/images/cap.png +0 -0
  1048. data/sproutcore/frameworks/desktop/english.lproj/images/downbutton.png +0 -0
  1049. data/sproutcore/frameworks/desktop/english.lproj/images/icons/shared.png +0 -0
  1050. data/sproutcore/frameworks/desktop/english.lproj/images/thumb-bottom.png +0 -0
  1051. data/sproutcore/frameworks/desktop/english.lproj/images/thumb-center.png +0 -0
  1052. data/sproutcore/frameworks/desktop/english.lproj/images/thumb-top.png +0 -0
  1053. data/sproutcore/frameworks/desktop/english.lproj/images/track.png +0 -0
  1054. data/sproutcore/frameworks/desktop/english.lproj/images/upbutton.png +0 -0
  1055. data/sproutcore/frameworks/desktop/english.lproj/list_item.css +185 -0
  1056. data/sproutcore/frameworks/desktop/english.lproj/menu.css +12 -0
  1057. data/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +109 -0
  1058. data/sproutcore/frameworks/desktop/english.lproj/modal.css +9 -0
  1059. data/sproutcore/frameworks/desktop/english.lproj/panel.css +91 -0
  1060. data/sproutcore/frameworks/desktop/english.lproj/picker.css +35 -0
  1061. data/sproutcore/frameworks/desktop/english.lproj/progress.css +33 -0
  1062. data/sproutcore/frameworks/desktop/english.lproj/radio.css +10 -0
  1063. data/sproutcore/frameworks/desktop/english.lproj/segmented.css +132 -0
  1064. data/sproutcore/frameworks/desktop/english.lproj/separator.css +19 -0
  1065. data/sproutcore/frameworks/desktop/english.lproj/slider.css +66 -0
  1066. data/sproutcore/frameworks/desktop/english.lproj/split.css +0 -0
  1067. data/sproutcore/frameworks/desktop/english.lproj/split_divider.css +6 -0
  1068. data/sproutcore/frameworks/desktop/english.lproj/strings.js +14 -0
  1069. data/sproutcore/frameworks/desktop/english.lproj/tab.css +7 -0
  1070. data/sproutcore/frameworks/desktop/english.lproj/toolbar.css +5 -0
  1071. data/sproutcore/frameworks/desktop/english.lproj/touch-scroller.css +196 -0
  1072. data/sproutcore/frameworks/desktop/english.lproj/well.css +71 -0
  1073. data/sproutcore/frameworks/desktop/mixins/border.js +151 -0
  1074. data/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +694 -0
  1075. data/sproutcore/frameworks/desktop/mixins/collection_group.js +22 -0
  1076. data/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +95 -0
  1077. data/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +295 -0
  1078. data/sproutcore/frameworks/desktop/mixins/navigation_builder.js +130 -0
  1079. data/sproutcore/frameworks/desktop/mixins/scrollable.js +253 -0
  1080. data/sproutcore/frameworks/desktop/panes/alert.js +457 -0
  1081. data/sproutcore/frameworks/desktop/panes/menu.js +1141 -0
  1082. data/sproutcore/frameworks/desktop/panes/modal.js +71 -0
  1083. data/sproutcore/frameworks/desktop/panes/palette.js +74 -0
  1084. data/sproutcore/frameworks/desktop/panes/panel.js +207 -0
  1085. data/sproutcore/frameworks/desktop/panes/picker.js +796 -0
  1086. data/sproutcore/frameworks/desktop/panes/select_button.js +895 -0
  1087. data/sproutcore/frameworks/desktop/panes/sheet.js +214 -0
  1088. data/sproutcore/frameworks/desktop/protocols/drag_data_source.js +39 -0
  1089. data/sproutcore/frameworks/desktop/protocols/drag_source.js +81 -0
  1090. data/sproutcore/frameworks/desktop/protocols/drop_target.js +175 -0
  1091. data/sproutcore/frameworks/desktop/protocols/responder.js +299 -0
  1092. data/sproutcore/frameworks/desktop/render_delegates/button.js +105 -0
  1093. data/sproutcore/frameworks/desktop/render_delegates/checkbox.js +100 -0
  1094. data/sproutcore/frameworks/desktop/render_delegates/collection.js +24 -0
  1095. data/sproutcore/frameworks/desktop/render_delegates/disclosure.js +69 -0
  1096. data/sproutcore/frameworks/desktop/render_delegates/helpers/slicing.js +34 -0
  1097. data/sproutcore/frameworks/desktop/render_delegates/image_button.js +30 -0
  1098. data/sproutcore/frameworks/desktop/render_delegates/master_detail.js +28 -0
  1099. data/sproutcore/frameworks/desktop/render_delegates/menu.js +47 -0
  1100. data/sproutcore/frameworks/desktop/render_delegates/panel.js +28 -0
  1101. data/sproutcore/frameworks/desktop/render_delegates/picker.js +43 -0
  1102. data/sproutcore/frameworks/desktop/render_delegates/progress.js +187 -0
  1103. data/sproutcore/frameworks/desktop/render_delegates/radio.js +95 -0
  1104. data/sproutcore/frameworks/desktop/render_delegates/radio_group.js +109 -0
  1105. data/sproutcore/frameworks/desktop/render_delegates/segment.js +55 -0
  1106. data/sproutcore/frameworks/desktop/render_delegates/segmented.js +77 -0
  1107. data/sproutcore/frameworks/desktop/render_delegates/slider.js +58 -0
  1108. data/sproutcore/frameworks/desktop/render_delegates/source_list.js +8 -0
  1109. data/sproutcore/frameworks/desktop/render_delegates/toolbar.js +18 -0
  1110. data/sproutcore/frameworks/desktop/render_delegates/well.js +27 -0
  1111. data/sproutcore/frameworks/desktop/render_delegates/workspace.js +18 -0
  1112. data/sproutcore/frameworks/desktop/system/drag.js +974 -0
  1113. data/sproutcore/frameworks/desktop/system/key_bindings.js +40 -0
  1114. data/sproutcore/frameworks/desktop/system/undo_manager.js +187 -0
  1115. data/sproutcore/frameworks/desktop/tests/integration/dialog.js +48 -0
  1116. data/sproutcore/frameworks/desktop/tests/mixins/border.js +97 -0
  1117. data/sproutcore/frameworks/desktop/tests/panes/alert/methods.js +10 -0
  1118. data/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +158 -0
  1119. data/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +135 -0
  1120. data/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +258 -0
  1121. data/sproutcore/frameworks/desktop/tests/panes/palette/methods.js +10 -0
  1122. data/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +35 -0
  1123. data/sproutcore/frameworks/desktop/tests/panes/pane_page.js +41 -0
  1124. data/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +10 -0
  1125. data/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +83 -0
  1126. data/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +10 -0
  1127. data/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +92 -0
  1128. data/sproutcore/frameworks/desktop/tests/panes/select_button/methods.js +194 -0
  1129. data/sproutcore/frameworks/desktop/tests/panes/select_button/ui.js +220 -0
  1130. data/sproutcore/frameworks/desktop/tests/panes/sheet/methods.js +10 -0
  1131. data/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +44 -0
  1132. data/sproutcore/frameworks/desktop/tests/views/button/methods.js +166 -0
  1133. data/sproutcore/frameworks/desktop/tests/views/button/ui.js +236 -0
  1134. data/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +126 -0
  1135. data/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +124 -0
  1136. data/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
  1137. data/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
  1138. data/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +215 -0
  1139. data/sproutcore/frameworks/desktop/tests/views/collection/displayProperties.js +31 -0
  1140. data/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +300 -0
  1141. data/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
  1142. data/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
  1143. data/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +240 -0
  1144. data/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
  1145. data/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
  1146. data/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
  1147. data/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +205 -0
  1148. data/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +211 -0
  1149. data/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
  1150. data/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +188 -0
  1151. data/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +76 -0
  1152. data/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +456 -0
  1153. data/sproutcore/frameworks/desktop/tests/views/disclosure/methods.js +10 -0
  1154. data/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +104 -0
  1155. data/sproutcore/frameworks/desktop/tests/views/grid/methods.js +10 -0
  1156. data/sproutcore/frameworks/desktop/tests/views/grid/ui.js +10 -0
  1157. data/sproutcore/frameworks/desktop/tests/views/image_button/ui.js +25 -0
  1158. data/sproutcore/frameworks/desktop/tests/views/list/render.js +92 -0
  1159. data/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
  1160. data/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
  1161. data/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +131 -0
  1162. data/sproutcore/frameworks/desktop/tests/views/list/ui_alternatingrows.js +130 -0
  1163. data/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
  1164. data/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +205 -0
  1165. data/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
  1166. data/sproutcore/frameworks/desktop/tests/views/list_item.js +396 -0
  1167. data/sproutcore/frameworks/desktop/tests/views/menu_item/methods.js +10 -0
  1168. data/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +46 -0
  1169. data/sproutcore/frameworks/desktop/tests/views/progress/methods.js +128 -0
  1170. data/sproutcore/frameworks/desktop/tests/views/progress/ui.js +421 -0
  1171. data/sproutcore/frameworks/desktop/tests/views/radio/methods.js +119 -0
  1172. data/sproutcore/frameworks/desktop/tests/views/radio/ui.js +349 -0
  1173. data/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +143 -0
  1174. data/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +162 -0
  1175. data/sproutcore/frameworks/desktop/tests/views/scroller.js +118 -0
  1176. data/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +108 -0
  1177. data/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +457 -0
  1178. data/sproutcore/frameworks/desktop/tests/views/select/methods.js +144 -0
  1179. data/sproutcore/frameworks/desktop/tests/views/select/ui.js +224 -0
  1180. data/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +163 -0
  1181. data/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +117 -0
  1182. data/sproutcore/frameworks/desktop/tests/views/separator.js +44 -0
  1183. data/sproutcore/frameworks/desktop/tests/views/source_list/methods.js +10 -0
  1184. data/sproutcore/frameworks/desktop/tests/views/source_list/ui.js +10 -0
  1185. data/sproutcore/frameworks/desktop/tests/views/split/methods.js +60 -0
  1186. data/sproutcore/frameworks/desktop/tests/views/split/ui.js +59 -0
  1187. data/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +238 -0
  1188. data/sproutcore/frameworks/desktop/tests/views/static_content.js +46 -0
  1189. data/sproutcore/frameworks/desktop/tests/views/tab/methods.js +54 -0
  1190. data/sproutcore/frameworks/desktop/tests/views/tab/ui.js +92 -0
  1191. data/sproutcore/frameworks/desktop/tests/views/toolbar/method.js +33 -0
  1192. data/sproutcore/frameworks/desktop/tests/views/toolbar/ui.js +29 -0
  1193. data/sproutcore/frameworks/desktop/tests/views/web/methods.js +10 -0
  1194. data/sproutcore/frameworks/desktop/tests/views/web/ui.js +110 -0
  1195. data/sproutcore/frameworks/desktop/tests/views/well/ui.js +54 -0
  1196. data/sproutcore/frameworks/desktop/views/button.js +564 -0
  1197. data/sproutcore/frameworks/desktop/views/checkbox.js +110 -0
  1198. data/sproutcore/frameworks/desktop/views/collection.js +3090 -0
  1199. data/sproutcore/frameworks/desktop/views/date_field.js +319 -0
  1200. data/sproutcore/frameworks/desktop/views/disclosure.js +68 -0
  1201. data/sproutcore/frameworks/desktop/views/file.js +112 -0
  1202. data/sproutcore/frameworks/desktop/views/grid.js +207 -0
  1203. data/sproutcore/frameworks/desktop/views/image_button.js +74 -0
  1204. data/sproutcore/frameworks/desktop/views/list.js +637 -0
  1205. data/sproutcore/frameworks/desktop/views/list_item.js +923 -0
  1206. data/sproutcore/frameworks/desktop/views/master_detail.js +257 -0
  1207. data/sproutcore/frameworks/desktop/views/menu_item.js +704 -0
  1208. data/sproutcore/frameworks/desktop/views/menu_scroll.js +615 -0
  1209. data/sproutcore/frameworks/desktop/views/navigation.js +237 -0
  1210. data/sproutcore/frameworks/desktop/views/navigation_bar.js +181 -0
  1211. data/sproutcore/frameworks/desktop/views/popup_button.js +299 -0
  1212. data/sproutcore/frameworks/desktop/views/progress.js +197 -0
  1213. data/sproutcore/frameworks/desktop/views/radio.js +347 -0
  1214. data/sproutcore/frameworks/desktop/views/scene.js +204 -0
  1215. data/sproutcore/frameworks/desktop/views/scroll.js +1824 -0
  1216. data/sproutcore/frameworks/desktop/views/scroller.js +917 -0
  1217. data/sproutcore/frameworks/desktop/views/segment.js +104 -0
  1218. data/sproutcore/frameworks/desktop/views/segmented.js +1002 -0
  1219. data/sproutcore/frameworks/desktop/views/select.js +809 -0
  1220. data/sproutcore/frameworks/desktop/views/select_field.js +344 -0
  1221. data/sproutcore/frameworks/desktop/views/separator.js +36 -0
  1222. data/sproutcore/frameworks/desktop/views/slider.js +291 -0
  1223. data/sproutcore/frameworks/desktop/views/source_list.js +49 -0
  1224. data/sproutcore/frameworks/desktop/views/source_list_group.js +169 -0
  1225. data/sproutcore/frameworks/desktop/views/split.js +891 -0
  1226. data/sproutcore/frameworks/desktop/views/split_divider.js +52 -0
  1227. data/sproutcore/frameworks/desktop/views/stacked.js +110 -0
  1228. data/sproutcore/frameworks/desktop/views/static_content.js +134 -0
  1229. data/sproutcore/frameworks/desktop/views/tab.js +186 -0
  1230. data/sproutcore/frameworks/desktop/views/thumb.js +53 -0
  1231. data/sproutcore/frameworks/desktop/views/toolbar.js +88 -0
  1232. data/sproutcore/frameworks/desktop/views/web.js +87 -0
  1233. data/sproutcore/frameworks/desktop/views/well.js +65 -0
  1234. data/sproutcore/frameworks/desktop/views/workspace.js +251 -0
  1235. data/sproutcore/frameworks/documentation/core.js +0 -0
  1236. data/sproutcore/frameworks/experimental/README.md +23 -0
  1237. data/sproutcore/frameworks/experimental/frameworks/device_motion/README.md +11 -0
  1238. data/sproutcore/frameworks/experimental/frameworks/device_motion/device.js +215 -0
  1239. data/sproutcore/frameworks/experimental/frameworks/device_motion/platform.js +67 -0
  1240. data/sproutcore/frameworks/experimental/frameworks/polymorphism/README.md +34 -0
  1241. data/sproutcore/frameworks/experimental/frameworks/polymorphism/models/polymorphic_single_attribute.js +183 -0
  1242. data/sproutcore/frameworks/experimental/frameworks/polymorphism/models/record.js +23 -0
  1243. data/sproutcore/frameworks/experimental/frameworks/polymorphism/tests/models/polymorphic/single.js +124 -0
  1244. data/sproutcore/frameworks/forms/english.lproj/default_styles.css +5 -0
  1245. data/sproutcore/frameworks/forms/english.lproj/strings.js +15 -0
  1246. data/sproutcore/frameworks/forms/mixins/edit_mode.js +43 -0
  1247. data/sproutcore/frameworks/forms/mixins/emptiness.js +95 -0
  1248. data/sproutcore/frameworks/forms/renderer_delegates/form.js +22 -0
  1249. data/sproutcore/frameworks/forms/renderer_delegates/form_row.js +21 -0
  1250. data/sproutcore/frameworks/forms/tests/views/form.js +15 -0
  1251. data/sproutcore/frameworks/forms/tests/views/form_checkbox_field.js +15 -0
  1252. data/sproutcore/frameworks/forms/tests/views/form_field.js +15 -0
  1253. data/sproutcore/frameworks/forms/tests/views/form_label.js +15 -0
  1254. data/sproutcore/frameworks/forms/tests/views/form_radio_field.js +15 -0
  1255. data/sproutcore/frameworks/forms/tests/views/form_row.js +15 -0
  1256. data/sproutcore/frameworks/forms/tests/views/form_text_field.js +15 -0
  1257. data/sproutcore/frameworks/forms/views/form.js +282 -0
  1258. data/sproutcore/frameworks/forms/views/form_row.js +183 -0
  1259. data/sproutcore/frameworks/foundation/.greenhouseconf +35 -0
  1260. data/sproutcore/frameworks/foundation/TESTING +46 -0
  1261. data/sproutcore/frameworks/foundation/controllers/tree.js +127 -0
  1262. data/sproutcore/frameworks/foundation/core.js +0 -0
  1263. data/sproutcore/frameworks/foundation/debug/control_test_pane.js +191 -0
  1264. data/sproutcore/frameworks/foundation/english.lproj/benchmark.css +146 -0
  1265. data/sproutcore/frameworks/foundation/english.lproj/blank.gif +0 -0
  1266. data/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +67 -0
  1267. data/sproutcore/frameworks/foundation/english.lproj/button_view.css +40 -0
  1268. data/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +9 -0
  1269. data/sproutcore/frameworks/foundation/english.lproj/images/favicon.ico +0 -0
  1270. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-logo.png +0 -0
  1271. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-landscape.jpg +0 -0
  1272. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-landscape.png +0 -0
  1273. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-portrait.jpg +0 -0
  1274. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-portrait.png +0 -0
  1275. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup.png +0 -0
  1276. data/sproutcore/frameworks/foundation/english.lproj/images/sproutcore.png +0 -0
  1277. data/sproutcore/frameworks/foundation/english.lproj/inline_editor.css +12 -0
  1278. data/sproutcore/frameworks/foundation/english.lproj/label.css +47 -0
  1279. data/sproutcore/frameworks/foundation/english.lproj/static_layout.css +5 -0
  1280. data/sproutcore/frameworks/foundation/english.lproj/text_field.css +146 -0
  1281. data/sproutcore/frameworks/foundation/fixtures/file_exists.json +1 -0
  1282. data/sproutcore/frameworks/foundation/fixtures/malformed.json +11 -0
  1283. data/sproutcore/frameworks/foundation/gestures/pinch.js +81 -0
  1284. data/sproutcore/frameworks/foundation/gestures/swipe.js +144 -0
  1285. data/sproutcore/frameworks/foundation/gestures/tap.js +113 -0
  1286. data/sproutcore/frameworks/foundation/license.js +28 -0
  1287. data/sproutcore/frameworks/foundation/mixins/auto_mixin.js +39 -0
  1288. data/sproutcore/frameworks/foundation/mixins/auto_resize.js +233 -0
  1289. data/sproutcore/frameworks/foundation/mixins/button.js +360 -0
  1290. data/sproutcore/frameworks/foundation/mixins/collection_content.js +178 -0
  1291. data/sproutcore/frameworks/foundation/mixins/content_display.js +114 -0
  1292. data/sproutcore/frameworks/foundation/mixins/control.js +422 -0
  1293. data/sproutcore/frameworks/foundation/mixins/editable.js +158 -0
  1294. data/sproutcore/frameworks/foundation/mixins/flowed_layout.js +628 -0
  1295. data/sproutcore/frameworks/foundation/mixins/gestureable.js +214 -0
  1296. data/sproutcore/frameworks/foundation/mixins/inline_editable.js +89 -0
  1297. data/sproutcore/frameworks/foundation/mixins/inline_editor_delegate.js +139 -0
  1298. data/sproutcore/frameworks/foundation/mixins/inline_text_field.js +589 -0
  1299. data/sproutcore/frameworks/foundation/mixins/inner_frame.js +184 -0
  1300. data/sproutcore/frameworks/foundation/mixins/static_layout.js +77 -0
  1301. data/sproutcore/frameworks/foundation/mixins/string.js +391 -0
  1302. data/sproutcore/frameworks/foundation/mixins/tree_item_content.js +160 -0
  1303. data/sproutcore/frameworks/foundation/mixins/validatable.js +189 -0
  1304. data/sproutcore/frameworks/foundation/private/tree_item_observer.js +914 -0
  1305. data/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +110 -0
  1306. data/sproutcore/frameworks/foundation/render_delegates/container.js +18 -0
  1307. data/sproutcore/frameworks/foundation/render_delegates/image.js +97 -0
  1308. data/sproutcore/frameworks/foundation/render_delegates/label.js +139 -0
  1309. data/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +17 -0
  1310. data/sproutcore/frameworks/foundation/system/benchmark.js +718 -0
  1311. data/sproutcore/frameworks/foundation/system/chance.js +64 -0
  1312. data/sproutcore/frameworks/foundation/system/cookie.js +171 -0
  1313. data/sproutcore/frameworks/foundation/system/core_query.js +56 -0
  1314. data/sproutcore/frameworks/foundation/system/exception_handler.js +88 -0
  1315. data/sproutcore/frameworks/foundation/system/gesture.js +363 -0
  1316. data/sproutcore/frameworks/foundation/system/image_queue.js +433 -0
  1317. data/sproutcore/frameworks/foundation/system/math.js +57 -0
  1318. data/sproutcore/frameworks/foundation/system/module.js +583 -0
  1319. data/sproutcore/frameworks/foundation/system/request.js +596 -0
  1320. data/sproutcore/frameworks/foundation/system/response.js +550 -0
  1321. data/sproutcore/frameworks/foundation/system/routes.js +519 -0
  1322. data/sproutcore/frameworks/foundation/system/staticqueue.js +53 -0
  1323. data/sproutcore/frameworks/foundation/system/task_queue.js +153 -0
  1324. data/sproutcore/frameworks/foundation/system/text_selection.js +103 -0
  1325. data/sproutcore/frameworks/foundation/system/time.js +473 -0
  1326. data/sproutcore/frameworks/foundation/system/user_defaults.js +392 -0
  1327. data/sproutcore/frameworks/foundation/system/utils/colors.js +80 -0
  1328. data/sproutcore/frameworks/foundation/system/utils/misc.js +137 -0
  1329. data/sproutcore/frameworks/foundation/system/utils/range.js +64 -0
  1330. data/sproutcore/frameworks/foundation/system/utils/string_measurement.js +247 -0
  1331. data/sproutcore/frameworks/foundation/tasks/preload_bundle.js +41 -0
  1332. data/sproutcore/frameworks/foundation/tasks/task.js +17 -0
  1333. data/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
  1334. data/sproutcore/frameworks/foundation/tests/controllers/tree/selection_support.js +340 -0
  1335. data/sproutcore/frameworks/foundation/tests/debug/control_test_pane/methods.js +10 -0
  1336. data/sproutcore/frameworks/foundation/tests/debug/control_test_pane/ui.js +113 -0
  1337. data/sproutcore/frameworks/foundation/tests/integration/creating_views.js +118 -0
  1338. data/sproutcore/frameworks/foundation/tests/mixins/button/content.js +195 -0
  1339. data/sproutcore/frameworks/foundation/tests/mixins/button/displayProperties.js +89 -0
  1340. data/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +57 -0
  1341. data/sproutcore/frameworks/foundation/tests/mixins/button/ui.js +69 -0
  1342. data/sproutcore/frameworks/foundation/tests/mixins/content_display.js +51 -0
  1343. data/sproutcore/frameworks/foundation/tests/mixins/control/content.js +168 -0
  1344. data/sproutcore/frameworks/foundation/tests/mixins/control/displayProperties.js +89 -0
  1345. data/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +44 -0
  1346. data/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/api.js +52 -0
  1347. data/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js +238 -0
  1348. data/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +64 -0
  1349. data/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +144 -0
  1350. data/sproutcore/frameworks/foundation/tests/mixins/string.js +28 -0
  1351. data/sproutcore/frameworks/foundation/tests/mixins/validatable/ui.js +74 -0
  1352. data/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
  1353. data/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
  1354. data/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
  1355. data/sproutcore/frameworks/foundation/tests/system/cookie.js +179 -0
  1356. data/sproutcore/frameworks/foundation/tests/system/core_query/setClass.js +59 -0
  1357. data/sproutcore/frameworks/foundation/tests/system/math.js +39 -0
  1358. data/sproutcore/frameworks/foundation/tests/system/request.js +273 -0
  1359. data/sproutcore/frameworks/foundation/tests/system/routes.js +356 -0
  1360. data/sproutcore/frameworks/foundation/tests/system/task_queue.js +43 -0
  1361. data/sproutcore/frameworks/foundation/tests/system/user_defaults.js +24 -0
  1362. data/sproutcore/frameworks/foundation/tests/system/utils/pointInElement.js +235 -0
  1363. data/sproutcore/frameworks/foundation/tests/system/utils/range.js +62 -0
  1364. data/sproutcore/frameworks/foundation/tests/validators/credit_card.js +35 -0
  1365. data/sproutcore/frameworks/foundation/tests/validators/date.js +26 -0
  1366. data/sproutcore/frameworks/foundation/tests/validators/not_empty.js +56 -0
  1367. data/sproutcore/frameworks/foundation/tests/validators/number.js +47 -0
  1368. data/sproutcore/frameworks/foundation/tests/validators/password.js +13 -0
  1369. data/sproutcore/frameworks/foundation/tests/validators/validator.js +20 -0
  1370. data/sproutcore/frameworks/foundation/tests/views/container/methods.js +18 -0
  1371. data/sproutcore/frameworks/foundation/tests/views/container/ui.js +145 -0
  1372. data/sproutcore/frameworks/foundation/tests/views/image/ui.js +492 -0
  1373. data/sproutcore/frameworks/foundation/tests/views/label/ui.js +179 -0
  1374. data/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +87 -0
  1375. data/sproutcore/frameworks/foundation/tests/views/text_field/nextValidKeyView.js +110 -0
  1376. data/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +577 -0
  1377. data/sproutcore/frameworks/foundation/validators/credit_card.js +125 -0
  1378. data/sproutcore/frameworks/foundation/validators/date.js +52 -0
  1379. data/sproutcore/frameworks/foundation/validators/date_time.js +48 -0
  1380. data/sproutcore/frameworks/foundation/validators/email.js +45 -0
  1381. data/sproutcore/frameworks/foundation/validators/not_empty.js +37 -0
  1382. data/sproutcore/frameworks/foundation/validators/number.js +99 -0
  1383. data/sproutcore/frameworks/foundation/validators/password.js +86 -0
  1384. data/sproutcore/frameworks/foundation/validators/positive_integer.js +84 -0
  1385. data/sproutcore/frameworks/foundation/validators/validator.js +326 -0
  1386. data/sproutcore/frameworks/foundation/views/container.js +140 -0
  1387. data/sproutcore/frameworks/foundation/views/field.js +337 -0
  1388. data/sproutcore/frameworks/foundation/views/image.js +381 -0
  1389. data/sproutcore/frameworks/foundation/views/label.js +219 -0
  1390. data/sproutcore/frameworks/foundation/views/text_field.js +1073 -0
  1391. data/sproutcore/frameworks/handlebars/extensions.js +44 -0
  1392. data/sproutcore/frameworks/handlebars/extensions/bind.js +156 -0
  1393. data/sproutcore/frameworks/handlebars/extensions/collection.js +75 -0
  1394. data/sproutcore/frameworks/handlebars/extensions/localization.js +5 -0
  1395. data/sproutcore/frameworks/handlebars/extensions/view.js +115 -0
  1396. data/sproutcore/frameworks/handlebars/handlebars.js +1401 -0
  1397. data/sproutcore/frameworks/jquery/jquery-buffer.js +376 -0
  1398. data/sproutcore/frameworks/jquery/jquery-buffered.js +205 -0
  1399. data/sproutcore/frameworks/jquery/jquery-sc.js +7 -0
  1400. data/sproutcore/frameworks/jquery/jquery.js +7179 -0
  1401. data/sproutcore/frameworks/media/.greenhouseconf +29 -0
  1402. data/sproutcore/frameworks/media/resources/controls.png +0 -0
  1403. data/sproutcore/frameworks/media/resources/playeras3.fla +0 -0
  1404. data/sproutcore/frameworks/media/resources/video.css +124 -0
  1405. data/sproutcore/frameworks/media/resources/videoCanvas.swf +0 -0
  1406. data/sproutcore/frameworks/media/views/audio.js +741 -0
  1407. data/sproutcore/frameworks/media/views/controls.js +88 -0
  1408. data/sproutcore/frameworks/media/views/media_slider.js +243 -0
  1409. data/sproutcore/frameworks/media/views/mini_controls.js +63 -0
  1410. data/sproutcore/frameworks/media/views/simple_controls.js +54 -0
  1411. data/sproutcore/frameworks/media/views/video.js +832 -0
  1412. data/sproutcore/frameworks/mini/license.js +29 -0
  1413. data/sproutcore/frameworks/runtime/README +12 -0
  1414. data/sproutcore/frameworks/runtime/core.js +1102 -0
  1415. data/sproutcore/frameworks/runtime/debug/test_suites/array.js +14 -0
  1416. data/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +397 -0
  1417. data/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
  1418. data/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
  1419. data/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
  1420. data/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
  1421. data/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
  1422. data/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
  1423. data/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
  1424. data/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
  1425. data/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
  1426. data/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
  1427. data/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
  1428. data/sproutcore/frameworks/runtime/license.js +29 -0
  1429. data/sproutcore/frameworks/runtime/mixins/array.js +658 -0
  1430. data/sproutcore/frameworks/runtime/mixins/comparable.js +45 -0
  1431. data/sproutcore/frameworks/runtime/mixins/copyable.js +72 -0
  1432. data/sproutcore/frameworks/runtime/mixins/enumerable.js +1426 -0
  1433. data/sproutcore/frameworks/runtime/mixins/freezable.js +110 -0
  1434. data/sproutcore/frameworks/runtime/mixins/observable.js +1408 -0
  1435. data/sproutcore/frameworks/runtime/private/chain_observer.js +178 -0
  1436. data/sproutcore/frameworks/runtime/private/observer_queue.js +178 -0
  1437. data/sproutcore/frameworks/runtime/private/observer_set.js +123 -0
  1438. data/sproutcore/frameworks/runtime/system/binding.js +1000 -0
  1439. data/sproutcore/frameworks/runtime/system/enumerator.js +107 -0
  1440. data/sproutcore/frameworks/runtime/system/error.js +157 -0
  1441. data/sproutcore/frameworks/runtime/system/index_set.js +1199 -0
  1442. data/sproutcore/frameworks/runtime/system/logger.js +1582 -0
  1443. data/sproutcore/frameworks/runtime/system/object.js +947 -0
  1444. data/sproutcore/frameworks/runtime/system/range_observer.js +270 -0
  1445. data/sproutcore/frameworks/runtime/system/run_loop.js +308 -0
  1446. data/sproutcore/frameworks/runtime/system/set.js +536 -0
  1447. data/sproutcore/frameworks/runtime/tests/core/IsEqual.js +30 -0
  1448. data/sproutcore/frameworks/runtime/tests/core/beget.js +23 -0
  1449. data/sproutcore/frameworks/runtime/tests/core/clone.js +108 -0
  1450. data/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
  1451. data/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
  1452. data/sproutcore/frameworks/runtime/tests/core/guidFor.js +109 -0
  1453. data/sproutcore/frameworks/runtime/tests/core/inspect.js +27 -0
  1454. data/sproutcore/frameworks/runtime/tests/core/itemType.js +71 -0
  1455. data/sproutcore/frameworks/runtime/tests/core/keys.js +20 -0
  1456. data/sproutcore/frameworks/runtime/tests/core/makeArray.js +44 -0
  1457. data/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +19 -0
  1458. data/sproutcore/frameworks/runtime/tests/core/tupleForPropertyPath.js +37 -0
  1459. data/sproutcore/frameworks/runtime/tests/mixins/array.js +59 -0
  1460. data/sproutcore/frameworks/runtime/tests/mixins/comparable.js +44 -0
  1461. data/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +658 -0
  1462. data/sproutcore/frameworks/runtime/tests/mixins/observable/chained.js +37 -0
  1463. data/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +733 -0
  1464. data/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +155 -0
  1465. data/sproutcore/frameworks/runtime/tests/mixins/observable/registerDependentKeys.js +79 -0
  1466. data/sproutcore/frameworks/runtime/tests/mixins/propertyChanges.js +81 -0
  1467. data/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
  1468. data/sproutcore/frameworks/runtime/tests/system/binding.js +395 -0
  1469. data/sproutcore/frameworks/runtime/tests/system/error.js +53 -0
  1470. data/sproutcore/frameworks/runtime/tests/system/index_set/add.js +212 -0
  1471. data/sproutcore/frameworks/runtime/tests/system/index_set/addEach.js +49 -0
  1472. data/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
  1473. data/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
  1474. data/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
  1475. data/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
  1476. data/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
  1477. data/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
  1478. data/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
  1479. data/sproutcore/frameworks/runtime/tests/system/index_set/min.js +50 -0
  1480. data/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
  1481. data/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
  1482. data/sproutcore/frameworks/runtime/tests/system/index_set/removeEach.js +49 -0
  1483. data/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
  1484. data/sproutcore/frameworks/runtime/tests/system/logger.js +260 -0
  1485. data/sproutcore/frameworks/runtime/tests/system/object/base.js +195 -0
  1486. data/sproutcore/frameworks/runtime/tests/system/object/bindings.js +374 -0
  1487. data/sproutcore/frameworks/runtime/tests/system/object/concatenated_properties.js +71 -0
  1488. data/sproutcore/frameworks/runtime/tests/system/object/enhance.js +177 -0
  1489. data/sproutcore/frameworks/runtime/tests/system/observer_set.js +50 -0
  1490. data/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
  1491. data/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
  1492. data/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
  1493. data/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
  1494. data/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
  1495. data/sproutcore/frameworks/runtime/tests/system/run_loop.js +120 -0
  1496. data/sproutcore/frameworks/runtime/tests/system/set.js +318 -0
  1497. data/sproutcore/frameworks/statechart/core.js +5 -0
  1498. data/sproutcore/frameworks/statechart/debug/monitor.js +136 -0
  1499. data/sproutcore/frameworks/statechart/system/state.js +713 -0
  1500. data/sproutcore/frameworks/statechart/system/statechart.js +951 -0
  1501. data/sproutcore/frameworks/statechart/tests/async.js +94 -0
  1502. data/sproutcore/frameworks/statechart/tests/event_handling/advanced_event_handling.js +310 -0
  1503. data/sproutcore/frameworks/statechart/tests/namespace/access_substates.js +252 -0
  1504. data/sproutcore/frameworks/statechart/tests/state/is_current_state.js +64 -0
  1505. data/sproutcore/frameworks/statechart/tests/with_concurrent_states/goto_history_state.js +88 -0
  1506. data/sproutcore/frameworks/statechart/tests/with_concurrent_states/goto_state_advanced.js +234 -0
  1507. data/sproutcore/frameworks/statechart/tests/with_concurrent_states/goto_state_async.js +123 -0
  1508. data/sproutcore/frameworks/statechart/tests/with_concurrent_states/goto_state_basic.js +139 -0
  1509. data/sproutcore/frameworks/statechart/tests/with_concurrent_states/goto_state_intermediate.js +119 -0
  1510. data/sproutcore/frameworks/statechart/tests/with_concurrent_states/send_event.js +183 -0
  1511. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/default_responder.js +90 -0
  1512. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/goto_history_state.js +200 -0
  1513. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/goto_state.js +256 -0
  1514. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/goto_state_async.js +187 -0
  1515. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/send_event.js +122 -0
  1516. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/state_plugin.js +99 -0
  1517. data/sproutcore/frameworks/statechart/tests/without_concurrent_states/transient.js +162 -0
  1518. data/sproutcore/frameworks/table/mixins/table_delegate.js +41 -0
  1519. data/sproutcore/frameworks/table/system/table_column.js +125 -0
  1520. data/sproutcore/frameworks/table/views/table.js +440 -0
  1521. data/sproutcore/frameworks/table/views/table_cell.js +63 -0
  1522. data/sproutcore/frameworks/table/views/table_head.js +158 -0
  1523. data/sproutcore/frameworks/table/views/table_header.js +214 -0
  1524. data/sproutcore/frameworks/table/views/table_row.js +155 -0
  1525. data/sproutcore/frameworks/testing/core.js +196 -0
  1526. data/sproutcore/frameworks/testing/english.lproj/additions.css +8 -0
  1527. data/sproutcore/frameworks/testing/english.lproj/runner.css +128 -0
  1528. data/sproutcore/frameworks/testing/english.lproj/testsuite.css +136 -0
  1529. data/sproutcore/frameworks/testing/extras.js +17 -0
  1530. data/sproutcore/frameworks/testing/jquery.js +3559 -0
  1531. data/sproutcore/frameworks/testing/qunit.js +827 -0
  1532. data/sproutcore/frameworks/testing/system/dump.js +205 -0
  1533. data/sproutcore/frameworks/testing/system/equiv.js +201 -0
  1534. data/sproutcore/frameworks/testing/system/plan.js +703 -0
  1535. data/sproutcore/frameworks/testing/system/runner.js +220 -0
  1536. data/sproutcore/frameworks/testing/system/suite.js +228 -0
  1537. data/sproutcore/frameworks/testing/utils.js +62 -0
  1538. data/sproutcore/lib/index.rhtml +164 -0
  1539. data/sproutcore/license.js +31 -0
  1540. data/sproutcore/themes/ace/designs/dark.png +0 -0
  1541. data/sproutcore/themes/ace/designs/dark.psd +0 -0
  1542. data/sproutcore/themes/ace/designs/light.png +0 -0
  1543. data/sproutcore/themes/ace/designs/light.psd +0 -0
  1544. data/sproutcore/themes/ace/designs/psds/button/ace/18px/active_button.psd +0 -0
  1545. data/sproutcore/themes/ace/designs/psds/button/ace/18px/normal_button.psd +0 -0
  1546. data/sproutcore/themes/ace/designs/psds/button/ace/18px/selected_active_button.psd +0 -0
  1547. data/sproutcore/themes/ace/designs/psds/button/ace/18px/selected_button.psd +0 -0
  1548. data/sproutcore/themes/ace/designs/psds/button/ace/24px/active_button.psd +0 -0
  1549. data/sproutcore/themes/ace/designs/psds/button/ace/24px/active_button_capsule.psd +0 -0
  1550. data/sproutcore/themes/ace/designs/psds/button/ace/24px/active_button_pointer.psd +0 -0
  1551. data/sproutcore/themes/ace/designs/psds/button/ace/24px/normal_button.psd +0 -0
  1552. data/sproutcore/themes/ace/designs/psds/button/ace/24px/normal_button_capsule.psd +0 -0
  1553. data/sproutcore/themes/ace/designs/psds/button/ace/24px/normal_button_pointer.psd +0 -0
  1554. data/sproutcore/themes/ace/designs/psds/button/ace/24px/selected_active_button.psd +0 -0
  1555. data/sproutcore/themes/ace/designs/psds/button/ace/24px/selected_active_button_capsule.psd +0 -0
  1556. data/sproutcore/themes/ace/designs/psds/button/ace/24px/selected_active_button_pointer.psd +0 -0
  1557. data/sproutcore/themes/ace/designs/psds/button/ace/24px/selected_button.psd +0 -0
  1558. data/sproutcore/themes/ace/designs/psds/button/ace/24px/selected_button_capsule.psd +0 -0
  1559. data/sproutcore/themes/ace/designs/psds/button/ace/24px/selected_button_pointer.psd +0 -0
  1560. data/sproutcore/themes/ace/designs/psds/button/ace/30px/active_button.psd +0 -0
  1561. data/sproutcore/themes/ace/designs/psds/button/ace/30px/active_button_pointer.psd +0 -0
  1562. data/sproutcore/themes/ace/designs/psds/button/ace/30px/normal_button.psd +0 -0
  1563. data/sproutcore/themes/ace/designs/psds/button/ace/30px/normal_button_pointer.psd +0 -0
  1564. data/sproutcore/themes/ace/designs/psds/button/ace/30px/selected_active_button.psd +0 -0
  1565. data/sproutcore/themes/ace/designs/psds/button/ace/30px/selected_active_button_pointer.psd +0 -0
  1566. data/sproutcore/themes/ace/designs/psds/button/ace/30px/selected_button.psd +0 -0
  1567. data/sproutcore/themes/ace/designs/psds/button/ace/30px/selected_button_pointer.psd +0 -0
  1568. data/sproutcore/themes/ace/designs/psds/button/ace/44px/active_button.psd +0 -0
  1569. data/sproutcore/themes/ace/designs/psds/button/ace/44px/normal_button.psd +0 -0
  1570. data/sproutcore/themes/ace/designs/psds/button/ace/44px/selected_active_button.psd +0 -0
  1571. data/sproutcore/themes/ace/designs/psds/button/ace/44px/selected_button.psd +0 -0
  1572. data/sproutcore/themes/ace/designs/psds/button/dark/24px/active_button.psd +0 -0
  1573. data/sproutcore/themes/ace/designs/psds/button/dark/24px/active_button_capsule.psd +0 -0
  1574. data/sproutcore/themes/ace/designs/psds/button/dark/24px/active_button_pointer.psd +0 -0
  1575. data/sproutcore/themes/ace/designs/psds/button/dark/24px/normal_button.psd +0 -0
  1576. data/sproutcore/themes/ace/designs/psds/button/dark/24px/normal_button_capsule.psd +0 -0
  1577. data/sproutcore/themes/ace/designs/psds/button/dark/24px/normal_button_pointer.psd +0 -0
  1578. data/sproutcore/themes/ace/designs/psds/button/dark/24px/selected_active_button.psd +0 -0
  1579. data/sproutcore/themes/ace/designs/psds/button/dark/24px/selected_active_button_capsule.psd +0 -0
  1580. data/sproutcore/themes/ace/designs/psds/button/dark/24px/selected_active_button_pointer.psd +0 -0
  1581. data/sproutcore/themes/ace/designs/psds/button/dark/24px/selected_button.psd +0 -0
  1582. data/sproutcore/themes/ace/designs/psds/button/dark/24px/selected_button_capsule.psd +0 -0
  1583. data/sproutcore/themes/ace/designs/psds/button/dark/24px/selected_button_pointer.psd +0 -0
  1584. data/sproutcore/themes/ace/designs/psds/button/dark/30px/active_button.psd +0 -0
  1585. data/sproutcore/themes/ace/designs/psds/button/dark/30px/active_button_pointer.psd +0 -0
  1586. data/sproutcore/themes/ace/designs/psds/button/dark/30px/normal_button.psd +0 -0
  1587. data/sproutcore/themes/ace/designs/psds/button/dark/30px/normal_button_pointer.psd +0 -0
  1588. data/sproutcore/themes/ace/designs/psds/button/dark/30px/selected_active_button.psd +0 -0
  1589. data/sproutcore/themes/ace/designs/psds/button/dark/30px/selected_active_button_pointer.psd +0 -0
  1590. data/sproutcore/themes/ace/designs/psds/button/dark/30px/selected_button.psd +0 -0
  1591. data/sproutcore/themes/ace/designs/psds/button/dark/30px/selected_button_pointer.psd +0 -0
  1592. data/sproutcore/themes/ace/designs/psds/button/popup/active_select.psd +0 -0
  1593. data/sproutcore/themes/ace/designs/psds/button/popup/normal_select.psd +0 -0
  1594. data/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_checked.psd +0 -0
  1595. data/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_checked_active.psd +0 -0
  1596. data/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_mixed.psd +0 -0
  1597. data/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_mixed_active.psd +0 -0
  1598. data/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_unchecked.psd +0 -0
  1599. data/sproutcore/themes/ace/designs/psds/checkbox/ace/14px/checkbox_unchecked_active.psd +0 -0
  1600. data/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_checked.psd +0 -0
  1601. data/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_checked_active.psd +0 -0
  1602. data/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_mixed.psd +0 -0
  1603. data/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_mixed_active.psd +0 -0
  1604. data/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_unchecked.psd +0 -0
  1605. data/sproutcore/themes/ace/designs/psds/checkbox/ace/16px/checkbox_unchecked_active.psd +0 -0
  1606. data/sproutcore/themes/ace/designs/psds/collection/source-list/selection.psd +0 -0
  1607. data/sproutcore/themes/ace/designs/psds/disclosure/ace/disclosure_closed.psd +0 -0
  1608. data/sproutcore/themes/ace/designs/psds/disclosure/ace/disclosure_closed_active.psd +0 -0
  1609. data/sproutcore/themes/ace/designs/psds/disclosure/ace/disclosure_open.psd +0 -0
  1610. data/sproutcore/themes/ace/designs/psds/disclosure/ace/disclosure_open_active.psd +0 -0
  1611. data/sproutcore/themes/ace/designs/psds/menu/checkmark.psd +0 -0
  1612. data/sproutcore/themes/ace/designs/psds/menu/checkmark_active.psd +0 -0
  1613. data/sproutcore/themes/ace/designs/psds/menu/down.psd +0 -0
  1614. data/sproutcore/themes/ace/designs/psds/menu/menu.psd +0 -0
  1615. data/sproutcore/themes/ace/designs/psds/menu/menu_item.psd +0 -0
  1616. data/sproutcore/themes/ace/designs/psds/menu/up.psd +0 -0
  1617. data/sproutcore/themes/ace/designs/psds/panel/panel.psd +0 -0
  1618. data/sproutcore/themes/ace/designs/psds/panel/pointers.psd +0 -0
  1619. data/sproutcore/themes/ace/designs/psds/picker/popover/popover.psd +0 -0
  1620. data/sproutcore/themes/ace/designs/psds/picker/popover/popover_empty.psd +0 -0
  1621. data/sproutcore/themes/ace/designs/psds/picker/popover/popover_notoolbar.psd +0 -0
  1622. data/sproutcore/themes/ace/designs/psds/picker/popover/popover_pointers.psd +0 -0
  1623. data/sproutcore/themes/ace/designs/psds/picker/popover/popover_pointers_notoolbar.psd +0 -0
  1624. data/sproutcore/themes/ace/designs/psds/progress/ace/progress_view_content.psd +0 -0
  1625. data/sproutcore/themes/ace/designs/psds/progress/ace/progress_view_indeterminate_content.psd +0 -0
  1626. data/sproutcore/themes/ace/designs/psds/progress/ace/progress_view_track.psd +0 -0
  1627. data/sproutcore/themes/ace/designs/psds/radio/radio_active.psd +0 -0
  1628. data/sproutcore/themes/ace/designs/psds/radio/radio_mixed.psd +0 -0
  1629. data/sproutcore/themes/ace/designs/psds/radio/radio_mixed_active.psd +0 -0
  1630. data/sproutcore/themes/ace/designs/psds/radio/radio_selected.psd +0 -0
  1631. data/sproutcore/themes/ace/designs/psds/radio/radio_selected_active.psd +0 -0
  1632. data/sproutcore/themes/ace/designs/psds/radio/radio_unselected.psd +0 -0
  1633. data/sproutcore/themes/ace/designs/psds/scroller/horizontal/thumb.psd +0 -0
  1634. data/sproutcore/themes/ace/designs/psds/scroller/horizontal/track_and_arrows.psd +0 -0
  1635. data/sproutcore/themes/ace/designs/psds/scroller/horizontal/track_and_arrows_active.psd +0 -0
  1636. data/sproutcore/themes/ace/designs/psds/scroller/vertical/thumb.psd +0 -0
  1637. data/sproutcore/themes/ace/designs/psds/scroller/vertical/track_and_arrows.psd +0 -0
  1638. data/sproutcore/themes/ace/designs/psds/scroller/vertical/track_and_arrows_active.psd +0 -0
  1639. data/sproutcore/themes/ace/designs/psds/segmented/18px/segmented_active.psd +0 -0
  1640. data/sproutcore/themes/ace/designs/psds/segmented/18px/segmented_normal.psd +0 -0
  1641. data/sproutcore/themes/ace/designs/psds/segmented/18px/segmented_selected.psd +0 -0
  1642. data/sproutcore/themes/ace/designs/psds/segmented/18px/segmented_selected_active.psd +0 -0
  1643. data/sproutcore/themes/ace/designs/psds/segmented/24px/segmented_active.psd +0 -0
  1644. data/sproutcore/themes/ace/designs/psds/segmented/24px/segmented_normal.psd +0 -0
  1645. data/sproutcore/themes/ace/designs/psds/segmented/24px/segmented_selected.psd +0 -0
  1646. data/sproutcore/themes/ace/designs/psds/segmented/24px/segmented_selected_active.psd +0 -0
  1647. data/sproutcore/themes/ace/designs/psds/segmented/30px/segmented_active.psd +0 -0
  1648. data/sproutcore/themes/ace/designs/psds/segmented/30px/segmented_normal.psd +0 -0
  1649. data/sproutcore/themes/ace/designs/psds/segmented/30px/segmented_selected.psd +0 -0
  1650. data/sproutcore/themes/ace/designs/psds/segmented/30px/segmented_selected_active.psd +0 -0
  1651. data/sproutcore/themes/ace/designs/psds/segmented/44px/segmented_active.psd +0 -0
  1652. data/sproutcore/themes/ace/designs/psds/segmented/44px/segmented_normal.psd +0 -0
  1653. data/sproutcore/themes/ace/designs/psds/segmented/44px/segmented_selected.psd +0 -0
  1654. data/sproutcore/themes/ace/designs/psds/segmented/44px/segmented_selected_active.psd +0 -0
  1655. data/sproutcore/themes/ace/designs/psds/slider/ace/14px/knob.psd +0 -0
  1656. data/sproutcore/themes/ace/designs/psds/slider/ace/14px/knob_active.psd +0 -0
  1657. data/sproutcore/themes/ace/designs/psds/slider/ace/16px/knob.psd +0 -0
  1658. data/sproutcore/themes/ace/designs/psds/slider/ace/16px/knob_active.psd +0 -0
  1659. data/sproutcore/themes/ace/designs/psds/slider/ace/22px/knob.psd +0 -0
  1660. data/sproutcore/themes/ace/designs/psds/slider/ace/22px/knob_active.psd +0 -0
  1661. data/sproutcore/themes/ace/designs/psds/slider/ace/22px/track.psd +0 -0
  1662. data/sproutcore/themes/ace/designs/psds/slider/ace/track.psd +0 -0
  1663. data/sproutcore/themes/ace/designs/psds/toolbar/toolbar.psd +0 -0
  1664. data/sproutcore/themes/ace/designs/switch/switch.psd +0 -0
  1665. data/sproutcore/themes/ace/designs/switch/switch_handle.png +0 -0
  1666. data/sproutcore/themes/ace/designs/switch/switch_handle.psd +0 -0
  1667. data/sproutcore/themes/ace/designs/switch/switch_off.png +0 -0
  1668. data/sproutcore/themes/ace/designs/switch/switch_off.psd +0 -0
  1669. data/sproutcore/themes/ace/designs/switch/switch_on.png +0 -0
  1670. data/sproutcore/themes/ace/designs/switch/switch_on.psd +0 -0
  1671. data/sproutcore/themes/ace/resources/body.css +13 -0
  1672. data/sproutcore/themes/ace/resources/button/ace/18px/active_button.png +0 -0
  1673. data/sproutcore/themes/ace/resources/button/ace/18px/button.css +33 -0
  1674. data/sproutcore/themes/ace/resources/button/ace/18px/normal_button.png +0 -0
  1675. data/sproutcore/themes/ace/resources/button/ace/18px/selected_active_button.png +0 -0
  1676. data/sproutcore/themes/ace/resources/button/ace/18px/selected_button.png +0 -0
  1677. data/sproutcore/themes/ace/resources/button/ace/24px/active_button.png +0 -0
  1678. data/sproutcore/themes/ace/resources/button/ace/24px/active_button_capsule.png +0 -0
  1679. data/sproutcore/themes/ace/resources/button/ace/24px/active_button_pointer.png +0 -0
  1680. data/sproutcore/themes/ace/resources/button/ace/24px/button.css +98 -0
  1681. data/sproutcore/themes/ace/resources/button/ace/24px/normal_button.png +0 -0
  1682. data/sproutcore/themes/ace/resources/button/ace/24px/normal_button_capsule.png +0 -0
  1683. data/sproutcore/themes/ace/resources/button/ace/24px/normal_button_pointer.png +0 -0
  1684. data/sproutcore/themes/ace/resources/button/ace/24px/selected_active_button.png +0 -0
  1685. data/sproutcore/themes/ace/resources/button/ace/24px/selected_active_button_capsule.png +0 -0
  1686. data/sproutcore/themes/ace/resources/button/ace/24px/selected_active_button_pointer.png +0 -0
  1687. data/sproutcore/themes/ace/resources/button/ace/24px/selected_button.png +0 -0
  1688. data/sproutcore/themes/ace/resources/button/ace/24px/selected_button_capsule.png +0 -0
  1689. data/sproutcore/themes/ace/resources/button/ace/24px/selected_button_pointer.png +0 -0
  1690. data/sproutcore/themes/ace/resources/button/ace/30px/active_button.png +0 -0
  1691. data/sproutcore/themes/ace/resources/button/ace/30px/active_button_pointer.png +0 -0
  1692. data/sproutcore/themes/ace/resources/button/ace/30px/button.css +78 -0
  1693. data/sproutcore/themes/ace/resources/button/ace/30px/normal_button.png +0 -0
  1694. data/sproutcore/themes/ace/resources/button/ace/30px/normal_button_pointer.png +0 -0
  1695. data/sproutcore/themes/ace/resources/button/ace/30px/selected_active_button.png +0 -0
  1696. data/sproutcore/themes/ace/resources/button/ace/30px/selected_active_button_pointer.png +0 -0
  1697. data/sproutcore/themes/ace/resources/button/ace/30px/selected_button.png +0 -0
  1698. data/sproutcore/themes/ace/resources/button/ace/30px/selected_button_pointer.png +0 -0
  1699. data/sproutcore/themes/ace/resources/button/ace/44px/active_button.png +0 -0
  1700. data/sproutcore/themes/ace/resources/button/ace/44px/button.css +39 -0
  1701. data/sproutcore/themes/ace/resources/button/ace/44px/normal_button.png +0 -0
  1702. data/sproutcore/themes/ace/resources/button/ace/44px/selected_active_button.png +0 -0
  1703. data/sproutcore/themes/ace/resources/button/ace/44px/selected_button.png +0 -0
  1704. data/sproutcore/themes/ace/resources/button/ace/button.css +36 -0
  1705. data/sproutcore/themes/ace/resources/button/button.js +75 -0
  1706. data/sproutcore/themes/ace/resources/button/dark/24px/active_button.png +0 -0
  1707. data/sproutcore/themes/ace/resources/button/dark/24px/active_button_capsule.png +0 -0
  1708. data/sproutcore/themes/ace/resources/button/dark/24px/active_button_pointer.png +0 -0
  1709. data/sproutcore/themes/ace/resources/button/dark/24px/button.css +93 -0
  1710. data/sproutcore/themes/ace/resources/button/dark/24px/normal_button.png +0 -0
  1711. data/sproutcore/themes/ace/resources/button/dark/24px/normal_button_capsule.png +0 -0
  1712. data/sproutcore/themes/ace/resources/button/dark/24px/normal_button_pointer.png +0 -0
  1713. data/sproutcore/themes/ace/resources/button/dark/24px/selected_active_button.png +0 -0
  1714. data/sproutcore/themes/ace/resources/button/dark/24px/selected_active_button_capsule.png +0 -0
  1715. data/sproutcore/themes/ace/resources/button/dark/24px/selected_active_button_pointer.png +0 -0
  1716. data/sproutcore/themes/ace/resources/button/dark/24px/selected_button.png +0 -0
  1717. data/sproutcore/themes/ace/resources/button/dark/24px/selected_button_capsule.png +0 -0
  1718. data/sproutcore/themes/ace/resources/button/dark/24px/selected_button_pointer.png +0 -0
  1719. data/sproutcore/themes/ace/resources/button/dark/30px/active_button.png +0 -0
  1720. data/sproutcore/themes/ace/resources/button/dark/30px/active_button_pointer.png +0 -0
  1721. data/sproutcore/themes/ace/resources/button/dark/30px/button.css +72 -0
  1722. data/sproutcore/themes/ace/resources/button/dark/30px/normal_button.png +0 -0
  1723. data/sproutcore/themes/ace/resources/button/dark/30px/normal_button_pointer.png +0 -0
  1724. data/sproutcore/themes/ace/resources/button/dark/30px/selected_active_button.png +0 -0
  1725. data/sproutcore/themes/ace/resources/button/dark/30px/selected_active_button_pointer.png +0 -0
  1726. data/sproutcore/themes/ace/resources/button/dark/30px/selected_button.png +0 -0
  1727. data/sproutcore/themes/ace/resources/button/dark/30px/selected_button_pointer.png +0 -0
  1728. data/sproutcore/themes/ace/resources/button/dark/button.css +17 -0
  1729. data/sproutcore/themes/ace/resources/button/dark/button.js +3 -0
  1730. data/sproutcore/themes/ace/resources/button/popup/active_select.png +0 -0
  1731. data/sproutcore/themes/ace/resources/button/popup/normal_select.png +0 -0
  1732. data/sproutcore/themes/ace/resources/button/popup/select.css +20 -0
  1733. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox.css +40 -0
  1734. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_checked.png +0 -0
  1735. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_checked_active.png +0 -0
  1736. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_mixed.png +0 -0
  1737. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_mixed_active.png +0 -0
  1738. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_unchecked.png +0 -0
  1739. data/sproutcore/themes/ace/resources/checkbox/ace/14px/checkbox_unchecked_active.png +0 -0
  1740. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox.css +40 -0
  1741. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_checked.png +0 -0
  1742. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_checked_active.png +0 -0
  1743. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_mixed.png +0 -0
  1744. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_mixed_active.png +0 -0
  1745. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_unchecked.png +0 -0
  1746. data/sproutcore/themes/ace/resources/checkbox/ace/16px/checkbox_unchecked_active.png +0 -0
  1747. data/sproutcore/themes/ace/resources/checkbox/ace/checkbox.css +7 -0
  1748. data/sproutcore/themes/ace/resources/collection/normal/list.css +4 -0
  1749. data/sproutcore/themes/ace/resources/collection/normal/list_item.css +17 -0
  1750. data/sproutcore/themes/ace/resources/collection/source-list/selection.png +0 -0
  1751. data/sproutcore/themes/ace/resources/collection/source-list/source-list.js +3 -0
  1752. data/sproutcore/themes/ace/resources/collection/source-list/source_list_view.css +36 -0
  1753. data/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +24 -0
  1754. data/sproutcore/themes/ace/resources/disclosure/ace/disclosure_closed.png +0 -0
  1755. data/sproutcore/themes/ace/resources/disclosure/ace/disclosure_closed_active.png +0 -0
  1756. data/sproutcore/themes/ace/resources/disclosure/ace/disclosure_open.png +0 -0
  1757. data/sproutcore/themes/ace/resources/disclosure/ace/disclosure_open_active.png +0 -0
  1758. data/sproutcore/themes/ace/resources/imagebutton/ace/imagebutton.css +11 -0
  1759. data/sproutcore/themes/ace/resources/loading.css +50 -0
  1760. data/sproutcore/themes/ace/resources/master-detail/master-detail.css +27 -0
  1761. data/sproutcore/themes/ace/resources/menu/checkmark.png +0 -0
  1762. data/sproutcore/themes/ace/resources/menu/checkmark_active.png +0 -0
  1763. data/sproutcore/themes/ace/resources/menu/down.png +0 -0
  1764. data/sproutcore/themes/ace/resources/menu/menu.css +75 -0
  1765. data/sproutcore/themes/ace/resources/menu/menu.png +0 -0
  1766. data/sproutcore/themes/ace/resources/menu/menu_item.png +0 -0
  1767. data/sproutcore/themes/ace/resources/menu/up.png +0 -0
  1768. data/sproutcore/themes/ace/resources/pane/pane.css +3 -0
  1769. data/sproutcore/themes/ace/resources/panel/panel.css +13 -0
  1770. data/sproutcore/themes/ace/resources/panel/panel.js +20 -0
  1771. data/sproutcore/themes/ace/resources/panel/panel.png +0 -0
  1772. data/sproutcore/themes/ace/resources/picker/ace/panel.png +0 -0
  1773. data/sproutcore/themes/ace/resources/picker/ace/picker.css +41 -0
  1774. data/sproutcore/themes/ace/resources/picker/ace/picker.js +0 -0
  1775. data/sproutcore/themes/ace/resources/picker/ace/pointers.png +0 -0
  1776. data/sproutcore/themes/ace/resources/picker/popover/picker.js +32 -0
  1777. data/sproutcore/themes/ace/resources/picker/popover/popover.css +111 -0
  1778. data/sproutcore/themes/ace/resources/picker/popover/popover.js +12 -0
  1779. data/sproutcore/themes/ace/resources/picker/popover/popover.png +0 -0
  1780. data/sproutcore/themes/ace/resources/picker/popover/popover_empty.png +0 -0
  1781. data/sproutcore/themes/ace/resources/picker/popover/popover_notoolbar.png +0 -0
  1782. data/sproutcore/themes/ace/resources/picker/popover/popover_pointers.png +0 -0
  1783. data/sproutcore/themes/ace/resources/picker/popover/popover_pointers_notoolbar.png +0 -0
  1784. data/sproutcore/themes/ace/resources/picker/popover/workspace.js +28 -0
  1785. data/sproutcore/themes/ace/resources/progress/ace/progress.css +27 -0
  1786. data/sproutcore/themes/ace/resources/progress/ace/progress_view_content.png +0 -0
  1787. data/sproutcore/themes/ace/resources/progress/ace/progress_view_track.png +0 -0
  1788. data/sproutcore/themes/ace/resources/progress/progress.js +78 -0
  1789. data/sproutcore/themes/ace/resources/radio/radio.css +63 -0
  1790. data/sproutcore/themes/ace/resources/radio/radio_active.png +0 -0
  1791. data/sproutcore/themes/ace/resources/radio/radio_mixed.png +0 -0
  1792. data/sproutcore/themes/ace/resources/radio/radio_mixed_active.png +0 -0
  1793. data/sproutcore/themes/ace/resources/radio/radio_selected.png +0 -0
  1794. data/sproutcore/themes/ace/resources/radio/radio_selected_active.png +0 -0
  1795. data/sproutcore/themes/ace/resources/radio/radio_unselected.png +0 -0
  1796. data/sproutcore/themes/ace/resources/scroller/horizontal/horizontal.css +78 -0
  1797. data/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_touch.css +91 -0
  1798. data/sproutcore/themes/ace/resources/scroller/horizontal/thumb.png +0 -0
  1799. data/sproutcore/themes/ace/resources/scroller/horizontal/track_and_arrows.png +0 -0
  1800. data/sproutcore/themes/ace/resources/scroller/horizontal/track_and_arrows_active.png +0 -0
  1801. data/sproutcore/themes/ace/resources/scroller/vertical/thumb.png +0 -0
  1802. data/sproutcore/themes/ace/resources/scroller/vertical/track_and_arrows.png +0 -0
  1803. data/sproutcore/themes/ace/resources/scroller/vertical/track_and_arrows_active.png +0 -0
  1804. data/sproutcore/themes/ace/resources/scroller/vertical/vertical.css +80 -0
  1805. data/sproutcore/themes/ace/resources/scroller/vertical/vertical_touch.css +92 -0
  1806. data/sproutcore/themes/ace/resources/segmented/18px/segmented.css +91 -0
  1807. data/sproutcore/themes/ace/resources/segmented/18px/segmented_active.png +0 -0
  1808. data/sproutcore/themes/ace/resources/segmented/18px/segmented_normal.png +0 -0
  1809. data/sproutcore/themes/ace/resources/segmented/18px/segmented_selected.png +0 -0
  1810. data/sproutcore/themes/ace/resources/segmented/18px/segmented_selected_active.png +0 -0
  1811. data/sproutcore/themes/ace/resources/segmented/24px/segmented.css +91 -0
  1812. data/sproutcore/themes/ace/resources/segmented/24px/segmented_active.png +0 -0
  1813. data/sproutcore/themes/ace/resources/segmented/24px/segmented_normal.png +0 -0
  1814. data/sproutcore/themes/ace/resources/segmented/24px/segmented_selected.png +0 -0
  1815. data/sproutcore/themes/ace/resources/segmented/24px/segmented_selected_active.png +0 -0
  1816. data/sproutcore/themes/ace/resources/segmented/30px/segmented.css +91 -0
  1817. data/sproutcore/themes/ace/resources/segmented/30px/segmented_active.png +0 -0
  1818. data/sproutcore/themes/ace/resources/segmented/30px/segmented_normal.png +0 -0
  1819. data/sproutcore/themes/ace/resources/segmented/30px/segmented_selected.png +0 -0
  1820. data/sproutcore/themes/ace/resources/segmented/30px/segmented_selected_active.png +0 -0
  1821. data/sproutcore/themes/ace/resources/segmented/44px/segmented.css +95 -0
  1822. data/sproutcore/themes/ace/resources/segmented/44px/segmented_active.png +0 -0
  1823. data/sproutcore/themes/ace/resources/segmented/44px/segmented_normal.png +0 -0
  1824. data/sproutcore/themes/ace/resources/segmented/44px/segmented_selected.png +0 -0
  1825. data/sproutcore/themes/ace/resources/segmented/44px/segmented_selected_active.png +0 -0
  1826. data/sproutcore/themes/ace/resources/segmented/segmented.css +83 -0
  1827. data/sproutcore/themes/ace/resources/slider/ace/14px/knob.png +0 -0
  1828. data/sproutcore/themes/ace/resources/slider/ace/14px/knob_active.png +0 -0
  1829. data/sproutcore/themes/ace/resources/slider/ace/14px/slider.css +27 -0
  1830. data/sproutcore/themes/ace/resources/slider/ace/16px/knob.png +0 -0
  1831. data/sproutcore/themes/ace/resources/slider/ace/16px/knob_active.png +0 -0
  1832. data/sproutcore/themes/ace/resources/slider/ace/16px/slider.css +27 -0
  1833. data/sproutcore/themes/ace/resources/slider/ace/22px/knob.png +0 -0
  1834. data/sproutcore/themes/ace/resources/slider/ace/22px/knob_active.png +0 -0
  1835. data/sproutcore/themes/ace/resources/slider/ace/22px/slider.css +27 -0
  1836. data/sproutcore/themes/ace/resources/slider/ace/22px/track.png +0 -0
  1837. data/sproutcore/themes/ace/resources/slider/ace/slider.css +7 -0
  1838. data/sproutcore/themes/ace/resources/slider/ace/slider.js +56 -0
  1839. data/sproutcore/themes/ace/resources/slider/ace/track.png +0 -0
  1840. data/sproutcore/themes/ace/resources/split/split.css +5 -0
  1841. data/sproutcore/themes/ace/resources/tab/tab.css +3 -0
  1842. data/sproutcore/themes/ace/resources/toolbar/toolbar.css +8 -0
  1843. data/sproutcore/themes/ace/resources/toolbar/toolbar.png +0 -0
  1844. data/sproutcore/themes/ace/resources/well/well.css +7 -0
  1845. data/sproutcore/themes/ace/resources/well/well.js +17 -0
  1846. data/sproutcore/themes/ace/theme.js +14 -0
  1847. data/sproutcore/themes/empty_theme/tests/mini_icons.rhtml +69 -0
  1848. data/sproutcore/themes/empty_theme/theme.js +16 -0
  1849. data/sproutcore/themes/iphone_theme/english.lproj/button.css +41 -0
  1850. data/sproutcore/themes/iphone_theme/english.lproj/core.css +8 -0
  1851. data/sproutcore/themes/iphone_theme/english.lproj/images/backButton.png +0 -0
  1852. data/sproutcore/themes/iphone_theme/english.lproj/images/blueButton.png +0 -0
  1853. data/sproutcore/themes/iphone_theme/english.lproj/images/cancel.png +0 -0
  1854. data/sproutcore/themes/iphone_theme/english.lproj/images/grayButton.png +0 -0
  1855. data/sproutcore/themes/iphone_theme/english.lproj/images/leftButton.png +0 -0
  1856. data/sproutcore/themes/iphone_theme/english.lproj/images/listArrow.png +0 -0
  1857. data/sproutcore/themes/iphone_theme/english.lproj/images/listArrowSel.png +0 -0
  1858. data/sproutcore/themes/iphone_theme/english.lproj/images/listGroup.png +0 -0
  1859. data/sproutcore/themes/iphone_theme/english.lproj/images/loading.gif +0 -0
  1860. data/sproutcore/themes/iphone_theme/english.lproj/images/pinstripes.png +0 -0
  1861. data/sproutcore/themes/iphone_theme/english.lproj/images/rightButton.png +0 -0
  1862. data/sproutcore/themes/iphone_theme/english.lproj/images/selection.png +0 -0
  1863. data/sproutcore/themes/iphone_theme/english.lproj/images/thumb.png +0 -0
  1864. data/sproutcore/themes/iphone_theme/english.lproj/images/toggle.png +0 -0
  1865. data/sproutcore/themes/iphone_theme/english.lproj/images/toggleOn.png +0 -0
  1866. data/sproutcore/themes/iphone_theme/english.lproj/images/toolButton.png +0 -0
  1867. data/sproutcore/themes/iphone_theme/english.lproj/images/toolbar.png +0 -0
  1868. data/sproutcore/themes/iphone_theme/english.lproj/images/whiteButton.png +0 -0
  1869. data/sproutcore/themes/iphone_theme/english.lproj/strings.js +15 -0
  1870. data/sproutcore/themes/standard_theme/Source/Panel.drawit/Data +0 -0
  1871. data/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Preview.jpg +0 -0
  1872. data/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Thumbnail.jpg +0 -0
  1873. data/sproutcore/themes/standard_theme/Source/SproutCore Theme Buttons.psd +0 -0
  1874. data/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/Data +0 -0
  1875. data/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Preview.jpg +0 -0
  1876. data/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Thumbnail.jpg +0 -0
  1877. data/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
  1878. data/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
  1879. data/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
  1880. data/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
  1881. data/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
  1882. data/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
  1883. data/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
  1884. data/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
  1885. data/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
  1886. data/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
  1887. data/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
  1888. data/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
  1889. data/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
  1890. data/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
  1891. data/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
  1892. data/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
  1893. data/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
  1894. data/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
  1895. data/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
  1896. data/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
  1897. data/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
  1898. data/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
  1899. data/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
  1900. data/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
  1901. data/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
  1902. data/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
  1903. data/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
  1904. data/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
  1905. data/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
  1906. data/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
  1907. data/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
  1908. data/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
  1909. data/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
  1910. data/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
  1911. data/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
  1912. data/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
  1913. data/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
  1914. data/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
  1915. data/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
  1916. data/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
  1917. data/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
  1918. data/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
  1919. data/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
  1920. data/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
  1921. data/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
  1922. data/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
  1923. data/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
  1924. data/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
  1925. data/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
  1926. data/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
  1927. data/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
  1928. data/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
  1929. data/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
  1930. data/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
  1931. data/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
  1932. data/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
  1933. data/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
  1934. data/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
  1935. data/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
  1936. data/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
  1937. data/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
  1938. data/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
  1939. data/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
  1940. data/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
  1941. data/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/Data +0 -0
  1942. data/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Preview.jpg +0 -0
  1943. data/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Thumbnail.jpg +0 -0
  1944. data/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/Data +0 -0
  1945. data/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Preview.jpg +0 -0
  1946. data/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Thumbnail.jpg +0 -0
  1947. data/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
  1948. data/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
  1949. data/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
  1950. data/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
  1951. data/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
  1952. data/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
  1953. data/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
  1954. data/sproutcore/themes/standard_theme/english.lproj/button.css +399 -0
  1955. data/sproutcore/themes/standard_theme/english.lproj/checkbox.css +78 -0
  1956. data/sproutcore/themes/standard_theme/english.lproj/collection.css +135 -0
  1957. data/sproutcore/themes/standard_theme/english.lproj/core.css +76 -0
  1958. data/sproutcore/themes/standard_theme/english.lproj/disclosure.css +57 -0
  1959. data/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_222222.png +0 -0
  1960. data/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_454545.png +0 -0
  1961. data/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_888888.png +0 -0
  1962. data/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_ffffff.png +0 -0
  1963. data/sproutcore/themes/standard_theme/english.lproj/images/panels/sprite-x.png +0 -0
  1964. data/sproutcore/themes/standard_theme/english.lproj/images/panels/sprite-y.png +0 -0
  1965. data/sproutcore/themes/standard_theme/english.lproj/images/sc-scroller-repeat-x.png +0 -0
  1966. data/sproutcore/themes/standard_theme/english.lproj/images/sc-scroller-repeat-y.png +0 -0
  1967. data/sproutcore/themes/standard_theme/english.lproj/images/sc-scroller-sprite.png +0 -0
  1968. data/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
  1969. data/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-ysprite.png +0 -0
  1970. data/sproutcore/themes/standard_theme/english.lproj/images/sc-toolbar-view.png +0 -0
  1971. data/sproutcore/themes/standard_theme/english.lproj/label.css +11 -0
  1972. data/sproutcore/themes/standard_theme/english.lproj/list_item.css +82 -0
  1973. data/sproutcore/themes/standard_theme/english.lproj/menu.css +20 -0
  1974. data/sproutcore/themes/standard_theme/english.lproj/menu_item_view.css +36 -0
  1975. data/sproutcore/themes/standard_theme/english.lproj/pane.css +18 -0
  1976. data/sproutcore/themes/standard_theme/english.lproj/panel.css +33 -0
  1977. data/sproutcore/themes/standard_theme/english.lproj/picker.css +17 -0
  1978. data/sproutcore/themes/standard_theme/english.lproj/progress.css +27 -0
  1979. data/sproutcore/themes/standard_theme/english.lproj/radio.css +125 -0
  1980. data/sproutcore/themes/standard_theme/english.lproj/scroller.css +159 -0
  1981. data/sproutcore/themes/standard_theme/english.lproj/segmented.css +270 -0
  1982. data/sproutcore/themes/standard_theme/english.lproj/slider.css +94 -0
  1983. data/sproutcore/themes/standard_theme/english.lproj/split_view.css +11 -0
  1984. data/sproutcore/themes/standard_theme/english.lproj/tab.css +14 -0
  1985. data/sproutcore/themes/standard_theme/english.lproj/table.css +14 -0
  1986. data/sproutcore/themes/standard_theme/english.lproj/text_field.css +5 -0
  1987. data/sproutcore/themes/standard_theme/english.lproj/toolbar.css +7 -0
  1988. data/sproutcore/themes/standard_theme/english.lproj/well.css +36 -0
  1989. data/test-spade.html +8 -0
  1990. metadata +2111 -0
@@ -0,0 +1,204 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2010 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /** @class
9
+
10
+ Displays several views as scenes that can slide on and off the screen. The
11
+ scene view is a nice way to provide a simple effect of moving from a
12
+ higher level screen to a more detailed level screen. You will be able to
13
+ optionally choose the kind of animation used to transition the two scenes
14
+ as well if supported on the web browser.
15
+
16
+ h1. Using The View
17
+
18
+ To setup the scene view, you should define the 'scenes' property with an
19
+ array of scene names. These will be the properties on the scene view that
20
+ you can shift in an out of view as needed. You can edit the scenes property
21
+ at any time. It will only be used when you start to transition from one
22
+ scene to another.
23
+
24
+ Next you should set your nowShowing property to the name of the scene you
25
+ would like to display. This will cause the view to transition scenes if it
26
+ is visible on screen. Otherwise, it will simply make the new scene view
27
+ the current content view and that's it.
28
+
29
+ @extends SC.View
30
+ @since SproutCore 1.0
31
+ */
32
+ SC.SceneView = SC.ContainerView.extend(
33
+ /** @scope SC.SceneView.prototype */ {
34
+
35
+ /**
36
+ Array of scene names. Scenes will slide on and off screen in the order
37
+ that you specifiy them here. That is, if you shift from a scene at index
38
+ 2 to a scene at index 1, the scenes will animation backwards. If you
39
+ shift to a scene at index 3, the scenes will animate forwards.
40
+
41
+ The default scenes defined are 'master' and 'detail'. You can replace or
42
+ augment this array as you like.
43
+
44
+ @property {Array}
45
+ */
46
+ scenes: ['master', 'detail'],
47
+
48
+ /**
49
+ The currently showing scene. Changing this property will cause the
50
+ scene view to transition to the new scene. If you set this property to
51
+ null, an empty string, or a non-existant scene, then the scene will appear
52
+ empty.
53
+ */
54
+ nowShowing: null,
55
+
56
+ /**
57
+ Speed of transition. Should be expressed in msec.
58
+ */
59
+ transitionDuration: 200,
60
+
61
+ _state: 'NO_VIEW', // no view
62
+
63
+ /** @private
64
+
65
+ Whenever called to change the content, save the nowShowing state and
66
+ then animate in by adjusting the layout.
67
+
68
+ */
69
+ replaceContent: function(content) {
70
+ if (content && this._state===this.READY) this.animateScene(content);
71
+ else this.replaceScene(content);
72
+ return this ;
73
+ },
74
+
75
+ /** @private
76
+
77
+ Invoked whenever we just need to swap the scenes without playing an
78
+ animation.
79
+ */
80
+ replaceScene: function(newContent) {
81
+ var oldContent = this._targetView,
82
+ layout = this.STANDARD_LAYOUT,
83
+ scenes = this.get('scenes'),
84
+ idx = scenes ? scenes.indexOf(this.get('nowShowing')) : -1;
85
+
86
+ // cleanup animation here too..
87
+ this._targetView = newContent ;
88
+ this._targetIndex = idx;
89
+
90
+ if (this._timer) this._timer.invalidate();
91
+ this._leftView = this._rightView = this._start = this._end = null;
92
+ this._timer = null;
93
+
94
+
95
+ this.removeAllChildren();
96
+
97
+ if (oldContent) oldContent.set('layout', layout);
98
+ if (newContent) newContent.set('layout', layout);
99
+
100
+ if (newContent) this.appendChild(newContent);
101
+ this._state = newContent ? this.READY : this.NO_VIEW ;
102
+ },
103
+
104
+ /** @private
105
+
106
+ Invoked whenever we need to animate in the new scene.
107
+ */
108
+ animateScene: function(newContent) {
109
+ var oldContent = this._targetView,
110
+ outIdx = this._targetIndex,
111
+ scenes = this.get('scenes'),
112
+ inIdx = scenes ? scenes.indexOf(this.get('nowShowing')) : -1,
113
+ layout;
114
+
115
+ if (outIdx<0 || inIdx<0 || outIdx===inIdx) {
116
+ return this.replaceScene(newContent);
117
+ }
118
+
119
+ this._targetView = newContent ;
120
+ this._targetIndex = inIdx;
121
+
122
+ // save some info needed for animation
123
+ if (inIdx > outIdx) {
124
+ this._leftView = oldContent;
125
+ this._rightView = newContent;
126
+ this._target = -1;
127
+ } else {
128
+ this._leftView = newContent ;
129
+ this._rightView = oldContent ;
130
+ this._target = 1 ;
131
+ }
132
+
133
+ // setup views
134
+ this.removeAllChildren();
135
+
136
+ if (oldContent) this.appendChild(oldContent)
137
+ if (newContent) this.appendChild(newContent);
138
+
139
+ // setup other general state
140
+ this._start = Date.now();
141
+ this._end = this._start + this.get('transitionDuration');
142
+ this._state = this.ANIMATING;
143
+ this.tick();
144
+ },
145
+
146
+ /** @private - called while the animation runs. Compute the new layout for
147
+ the left and right views based on the portion completed. When we finish
148
+ call replaceScene().
149
+ */
150
+ tick: function() {
151
+ this._timer = null ; // clear out
152
+
153
+ var now = Date.now(),
154
+ pct = (now-this._start)/(this._end-this._start),
155
+ target = this._target,
156
+ left = this._leftView,
157
+ right = this._rightView,
158
+ layout, adjust;
159
+
160
+ if (pct<0) pct = 0;
161
+
162
+ // if we're done or the view is no longer visible, just replace the
163
+ // scene.
164
+ if (!this.get('isVisibleInWindow') || (pct>=1)) {
165
+ return this.replaceScene(this._targetView);
166
+ }
167
+
168
+ // ok, now let's compute the new layouts for the two views and set them
169
+ layout = SC.clone(this.get('frame'));
170
+ adjust = Math.floor(layout.width * pct);
171
+
172
+ // set the layout for the views, depending on the direction
173
+ if (target>0) {
174
+ layout.left = 0-(layout.width-adjust);
175
+ left.set('layout', layout);
176
+
177
+ layout = SC.clone(layout);
178
+ layout.left = adjust ;
179
+ right.set('layout', layout);
180
+
181
+ } else {
182
+ layout.left = 0-adjust ;
183
+ left.set('layout', layout);
184
+
185
+ layout = SC.clone(layout);
186
+ layout.left = layout.width-adjust;
187
+ right.set('layout', layout);
188
+ }
189
+
190
+ this._timer = this.invokeLater(this.tick, 20);
191
+ return this;
192
+ },
193
+
194
+
195
+ // states for view animation
196
+ NO_VIEW: 'NO_VIEW',
197
+ ANIMATING: 'ANIMATING',
198
+ READY: 'READY',
199
+
200
+ /** @private - standard layout assigned to views at rest */
201
+ STANDARD_LAYOUT: { top: 0, left: 0, bottom: 0, right: 0 }
202
+
203
+
204
+ });
@@ -0,0 +1,1824 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2010 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ sc_require('views/scroller');
9
+ sc_require('mixins/border');
10
+
11
+ SC.NORMAL_SCROLL_DECELERATION = 0.95;
12
+ SC.FAST_SCROLL_DECELERATION = 0.85;
13
+
14
+ /** @class
15
+
16
+ Implements a complete scroll view. This class uses a manual implementation
17
+ of scrollers in order to properly support clipping frames.
18
+
19
+ Important Events:
20
+
21
+ - contentView frame size changes (to autoshow/hide scrollbar - adjust scrollbar size)
22
+ - horizontalScrollOffset change
23
+ - verticalScrollOffsetChanges
24
+ - scroll wheel events
25
+
26
+ @extends SC.View
27
+ @since SproutCore 1.0
28
+ */
29
+ SC.ScrollView = SC.View.extend(SC.Border, {
30
+ /** @scope SC.ScrollView.prototype */
31
+ classNames: ['sc-scroll-view'],
32
+
33
+ // ..........................................................
34
+ // PROPERTIES
35
+ //
36
+
37
+ isScrollable: YES,
38
+
39
+ /**
40
+ The content view you want the scroll view to manage. This will be assigned to the contentView of the clipView also.
41
+ */
42
+ contentView: null,
43
+
44
+ /**
45
+ The horizontal alignment for non-filling content inside of the ScrollView.
46
+ */
47
+ horizontalAlign: SC.ALIGN_LEFT,
48
+
49
+ /**
50
+ The vertical alignment for non-filling content inside of the ScrollView.
51
+ */
52
+ verticalAlign: SC.ALIGN_TOP,
53
+
54
+ /**
55
+ The current horizontal scroll offset. Changing this value will update both the contentView and the horizontal scroller, if there is one.
56
+ */
57
+ horizontalScrollOffset: function(key, value) {
58
+ if (value !== undefined) {
59
+ var minOffset = this.minimumHorizontalScrollOffset(),
60
+ maxOffset = this.get('maximumHorizontalScrollOffset');
61
+ this._scroll_horizontalScrollOffset = Math.max(minOffset,Math.min(maxOffset, value)) ;
62
+ }
63
+
64
+ return this._scroll_horizontalScrollOffset||0;
65
+ }.property().cacheable(),
66
+
67
+ /**
68
+ The current vertical scroll offset. Changing this value will update both the contentView and the vertical scroller, if there is one.
69
+ */
70
+ verticalScrollOffset: function(key, value) {
71
+ if (value !== undefined) {
72
+ var minOffset = this.get('minimumVerticalScrollOffset'),
73
+ maxOffset = this.get('maximumVerticalScrollOffset');
74
+ this._scroll_verticalScrollOffset = Math.max(minOffset,Math.min(maxOffset, value)) ;
75
+ }
76
+
77
+ return this._scroll_verticalScrollOffset||0;
78
+ }.property().cacheable(),
79
+
80
+ /**
81
+ @private
82
+ Calculates the maximum offset given content and container sizes, and the
83
+ alignment.
84
+ */
85
+ maximumScrollOffset: function(contentSize, containerSize, align) {
86
+ // if our content size is larger than or the same size as the container, it's quite
87
+ // simple to calculate the answer. Otherwise, we need to do some fancy-pants
88
+ // alignment logic (read: simple math)
89
+ if (contentSize >= containerSize) return contentSize - containerSize;
90
+
91
+ // alignment, yeah
92
+ if (align === SC.ALIGN_LEFT || align === SC.ALIGN_TOP) {
93
+ // if we left-align something, and it is smaller than the view, does that not mean
94
+ // that it's maximum (and minimum) offset is 0, because it should be positioned at 0?
95
+ return 0;
96
+ } else if (align === SC.ALIGN_MIDDLE || align === SC.ALIGN_CENTER) {
97
+ // middle align means the difference divided by two, because we want equal parts on each side.
98
+ return 0 - Math.round((containerSize - contentSize) / 2);
99
+ } else {
100
+ // right align means the entire difference, because we want all that space on the left
101
+ return 0 - (containerSize - contentSize);
102
+ }
103
+ },
104
+
105
+ /**
106
+ @private
107
+ Calculates the minimum offset given content and container sizes, and the
108
+ alignment.
109
+ */
110
+ minimumScrollOffset: function(contentSize, containerSize, align) {
111
+ // if the content is larger than the container, we have no need to change the minimum
112
+ // away from the natural 0 position.
113
+ if (contentSize > containerSize) return 0;
114
+
115
+ // alignment, yeah
116
+ if (align === SC.ALIGN_LEFT || align === SC.ALIGN_TOP) {
117
+ // if we left-align something, and it is smaller than the view, does that not mean
118
+ // that it's maximum (and minimum) offset is 0, because it should be positioned at 0?
119
+ return 0;
120
+ } else if (align === SC.ALIGN_MIDDLE || align === SC.ALIGN_CENTER) {
121
+ // middle align means the difference divided by two, because we want equal parts on each side.
122
+ return 0 - Math.round((containerSize - contentSize) / 2);
123
+ } else {
124
+ // right align means the entire difference, because we want all that space on the left
125
+ return 0 - (containerSize - contentSize);
126
+ }
127
+ },
128
+
129
+ /**
130
+ The maximum horizontal scroll offset allowed given the current contentView
131
+ size and the size of the scroll view. If horizontal scrolling is
132
+ disabled, this will always return 0.
133
+
134
+ @property {Number}
135
+ */
136
+ maximumHorizontalScrollOffset: function() {
137
+ var view = this.get('contentView') ;
138
+ var contentWidth = view ? view.get('frame').width : 0,
139
+ calculatedWidth = view ? view.get('calculatedWidth') : 0;
140
+
141
+ // The following code checks if there is a calculatedWidth (collections)
142
+ // to avoid looking at the incorrect value calculated by frame.
143
+ if (calculatedWidth) {
144
+ contentWidth = view.calculatedWidth;
145
+ }
146
+ contentWidth *= this._scale;
147
+
148
+ var containerWidth = this.get('containerView').get('frame').width ;
149
+
150
+ // we still must go through minimumScrollOffset even if we can't scroll
151
+ // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
152
+ if (!this.get('canScrollHorizontal')) contentWidth = Math.min(contentWidth, containerWidth);
153
+ return this.maximumScrollOffset(contentWidth, containerWidth, this.get("horizontalAlign"));
154
+ }.property(),
155
+
156
+ /**
157
+ The maximum vertical scroll offset allowed given the current contentView
158
+ size and the size of the scroll view. If vertical scrolling is disabled,
159
+ this will always return 0 (or whatever alignment dictates).
160
+
161
+ @property {Number}
162
+ */
163
+ maximumVerticalScrollOffset: function() {
164
+ var view = this.get('contentView'),
165
+ contentHeight = (view && view.get('frame')) ? view.get('frame').height : 0,
166
+ calculatedHeight = view ? view.get('calculatedHeight') : 0;
167
+
168
+ // The following code checks if there is a calculatedWidth (collections)
169
+ // to avoid looking at the incorrect value calculated by frame.
170
+ if(calculatedHeight){
171
+ contentHeight = calculatedHeight;
172
+ }
173
+ contentHeight *= this._scale;
174
+
175
+ var containerHeight = this.get('containerView').get('frame').height ;
176
+
177
+ // we still must go through minimumScrollOffset even if we can't scroll
178
+ // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
179
+ if (!this.get('canScrollVertical')) contentHeight = Math.min(contentHeight, containerHeight);
180
+ return this.maximumScrollOffset(contentHeight, containerHeight, this.get("verticalAlign"));
181
+ }.property(),
182
+
183
+
184
+ /**
185
+ The minimum horizontal scroll offset allowed given the current contentView
186
+ size and the size of the scroll view. If horizontal scrolling is
187
+ disabled, this will always return 0 (or whatever alignment dictates).
188
+
189
+ @property {Number}
190
+ */
191
+ minimumHorizontalScrollOffset: function() {
192
+ var view = this.get('contentView') ;
193
+ var contentWidth = view ? view.get('frame').width : 0,
194
+ calculatedWidth = view ? view.get('calculatedWidth') : 0;
195
+ // The following code checks if there is a calculatedWidth (collections)
196
+ // to avoid looking at the incorrect value calculated by frame.
197
+ if(calculatedWidth){
198
+ contentWidth = calculatedWidth;
199
+ }
200
+ contentWidth *= this._scale;
201
+
202
+ var containerWidth = this.get('containerView').get('frame').width ;
203
+
204
+ // we still must go through minimumScrollOffset even if we can't scroll
205
+ // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
206
+ if (!this.get('canScrollHorizontal')) contentWidth = Math.min(contentWidth, containerWidth);
207
+ return this.minimumScrollOffset(contentWidth, containerWidth, this.get("horizontalAlign"));
208
+ }.property(),
209
+
210
+ /**
211
+ The minimum vertical scroll offset allowed given the current contentView
212
+ size and the size of the scroll view. If vertical scrolling is disabled,
213
+ this will always return 0 (or whatever alignment dictates).
214
+
215
+ @property {Number}
216
+ */
217
+ minimumVerticalScrollOffset: function() {
218
+ var view = this.get('contentView') ;
219
+ var contentHeight = (view && view.get('frame')) ? view.get('frame').height : 0,
220
+ calculatedHeight = view ? view.get('calculatedHeight') : 0;
221
+
222
+ // The following code checks if there is a calculatedWidth (collections)
223
+ // to avoid looking at the incorrect value calculated by frame.
224
+ if(calculatedHeight){
225
+ contentHeight = view.calculatedHeight;
226
+ }
227
+ contentHeight *= this._scale;
228
+
229
+ var containerHeight = this.get('containerView').get('frame').height ;
230
+
231
+ // we still must go through minimumScrollOffset even if we can't scroll
232
+ // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
233
+ if (!this.get('canScrollVertical')) contentHeight = Math.min(contentHeight, containerHeight);
234
+ return this.minimumScrollOffset(contentHeight, containerHeight, this.get("verticalAlign"));
235
+ }.property(),
236
+
237
+
238
+
239
+ /**
240
+ Amount to scroll one vertical line.
241
+
242
+ Used by the default implementation of scrollDownLine() and scrollUpLine().
243
+ Defaults to 20px.
244
+ */
245
+ verticalLineScroll: 20,
246
+
247
+ /**
248
+ Amount to scroll one horizontal line.
249
+
250
+ Used by the default implementation of scrollLeftLine() and
251
+ scrollRightLine(). Defaults to 20px.
252
+ */
253
+ horizontalLineScroll: 20,
254
+
255
+ /**
256
+ Amount to scroll one vertical page.
257
+
258
+ Used by the default implementation of scrollUpPage() and scrollDownPage().
259
+ Defaults to current frame height.
260
+ */
261
+ verticalPageScroll: function() {
262
+ return this.get('frame').height ;
263
+ }.property('frame'),
264
+
265
+ /**
266
+ Amount to scroll one horizontal page.
267
+
268
+ Used by the default implementation of scrollLeftPage() and
269
+ scrollRightPage(). Defaults to current innerFrame width.
270
+ */
271
+ horizontalPageScroll: function() {
272
+ return this.get('frame').width ;
273
+ }.property('frame'),
274
+
275
+ // ..........................................................
276
+ // SCROLLERS
277
+ //
278
+
279
+ /**
280
+ YES if the view should maintain a horizontal scroller. This property
281
+ must be set when the view is created.
282
+
283
+ @property {Boolean}
284
+ */
285
+ hasHorizontalScroller: YES,
286
+
287
+ /**
288
+ The horizontal scroller view class. This will be replaced with a view
289
+ instance when the ScrollView is created unless hasHorizontalScroller is
290
+ NO.
291
+
292
+ @property {SC.View}
293
+ */
294
+ horizontalScrollerView: SC.ScrollerView,
295
+
296
+ /**
297
+ The horizontal scroller view for touch. This will be replaced with a view
298
+ instance when touch is enabled when the ScrollView is created unless
299
+ hasHorizontalScroller is NO.
300
+ */
301
+ horizontalTouchScrollerView: SC.TouchScrollerView,
302
+
303
+ /**
304
+ YES if the horizontal scroller should be visible. You can change this
305
+ property value anytime to show or hide the horizontal scroller. If you
306
+ do not want to use a horizontal scroller at all, you should instead set
307
+ hasHorizontalScroller to NO to avoid creating a scroller view in the
308
+ first place.
309
+
310
+ @property {Boolean}
311
+ */
312
+ isHorizontalScrollerVisible: YES,
313
+
314
+ /**
315
+ Returns YES if the view both has a horizontal scroller, the scroller is
316
+ visible.
317
+
318
+ @property {Boolean}
319
+ */
320
+ canScrollHorizontal: function() {
321
+ return !!(this.get('hasHorizontalScroller') &&
322
+ this.get('horizontalScrollerView') &&
323
+ this.get('isHorizontalScrollerVisible')) ;
324
+ }.property('isHorizontalScrollerVisible').cacheable(),
325
+
326
+ /**
327
+ If YES, the horizontal scroller will autohide if the contentView is
328
+ smaller than the visible area. You must set hasHorizontalScroller to YES
329
+ for this property to have any effect.
330
+ */
331
+ autohidesHorizontalScroller: YES,
332
+
333
+ /**
334
+ YES if the view shuld maintain a vertical scroller. This property must
335
+ be set when the view is created.
336
+
337
+ @property {Boolean}
338
+ */
339
+ hasVerticalScroller: YES,
340
+
341
+ /**
342
+ The vertical scroller view class. This will be replaced with a view
343
+ instance when the ScrollView is created unless hasVerticalScroller is NO.
344
+
345
+ @property {SC.View}
346
+ */
347
+ verticalScrollerView: SC.ScrollerView,
348
+
349
+ /**
350
+ The vertical touch scroller view class. This will be replaced with a view
351
+ instance when the ScrollView is created.
352
+ */
353
+ verticalTouchScrollerView: SC.TouchScrollerView,
354
+
355
+ /**
356
+ YES if the vertical scroller should be visible. You can change this
357
+ property value anytime to show or hide the vertical scroller. If you do
358
+ not want to use a vertical scroller at all, you should instead set
359
+ hasVerticalScroller to NO to avoid creating a scroller view in the first
360
+ place.
361
+
362
+ @property {Boolean}
363
+ */
364
+ isVerticalScrollerVisible: YES,
365
+
366
+ /**
367
+ Returns YES if the view both has a horizontal scroller, the scroller is
368
+ visible.
369
+
370
+ @property {Boolean}
371
+ */
372
+ canScrollVertical: function() {
373
+ return !!(this.get('hasVerticalScroller') &&
374
+ this.get('verticalScrollerView') &&
375
+ this.get('isVerticalScrollerVisible')) ;
376
+ }.property('isVerticalScrollerVisible').cacheable(),
377
+
378
+ /**
379
+ If YES, the vertical scroller will autohide if the contentView is
380
+ smaller than the visible area. You must set hasVerticalScroller to YES
381
+ for this property to have any effect.
382
+ */
383
+ autohidesVerticalScroller: YES,
384
+
385
+ /**
386
+ Use this property to set the 'bottom' offset of your vertical scroller,
387
+ to make room for a thumb view or other accessory view. Default is 0.
388
+
389
+ @property {Number}
390
+ */
391
+ verticalScrollerBottom: 0,
392
+
393
+ /**
394
+ Use this to overlay the vertical scroller.
395
+
396
+ This ensures that the container frame will not resize to accomodate the
397
+ vertical scroller, hence overlaying the scroller on top of
398
+ the container.
399
+
400
+ @property {Boolean}
401
+ */
402
+ verticalOverlay: function() {
403
+ if (SC.platform.touch) return YES;
404
+ return NO;
405
+ }.property().cacheable(),
406
+
407
+ /**
408
+ Use this to overlay the horizontal scroller.
409
+
410
+ This ensures that the container frame will not resize to accomodate the
411
+ horizontal scroller, hence overlaying the scroller on top of
412
+ the container
413
+
414
+ @property {Boolean}
415
+ */
416
+ horizontalOverlay: function() {
417
+ if (SC.platform.touch) return YES;
418
+ return NO;
419
+ }.property().cacheable(),
420
+
421
+ /**
422
+ Use to control the positioning of the vertical scroller. If you do not
423
+ set 'verticalOverlay' to YES, then the content view will be automatically
424
+ sized to meet the left edge of the vertical scroller, wherever it may be.
425
+ This allows you to easily, for example, have “one pixel higher and one
426
+ pixel lower” scroll bars that blend into their parent views.
427
+
428
+ If you do set 'verticalOverlay' to YES, then the scroller view will
429
+ “float on top” of the content view.
430
+
431
+ Example: { top: -1, bottom: -1, right: 0 }
432
+ */
433
+ verticalScrollerLayout: null,
434
+
435
+ /**
436
+ Use to control the positioning of the horizontal scroller. If you do not
437
+ set 'horizontalOverlay' to YES, then the content view will be
438
+ automatically sized to meet the top edge of the horizontal scroller,
439
+ wherever it may be.
440
+
441
+ If you do set 'horizontalOverlay' to YES, then the scroller view will
442
+ “float on top” of the content view.
443
+
444
+ Example: { left: 0, bottom: 0, right: 0 }
445
+ */
446
+ horizontalScrollerLayout: null,
447
+
448
+ // ..........................................................
449
+ // CUSTOM VIEWS
450
+ //
451
+
452
+ /**
453
+ The container view that will contain your main content view. You can
454
+ replace this property with your own custom subclass if you prefer.
455
+
456
+ @type {SC.ContainerView}
457
+ */
458
+ containerView: SC.ContainerView.extend({
459
+
460
+ }),
461
+
462
+ // ..........................................................
463
+ // METHODS
464
+ //
465
+
466
+ /**
467
+ Scrolls the receiver to the specified x,y coordinate. This should be the
468
+ offset into the contentView you want to appear at the top-left corner of
469
+ the scroll view.
470
+
471
+ This method will contrain the actual scroll based on whether the view
472
+ can scroll in the named direction and the maximum distance it can
473
+ scroll.
474
+
475
+ If you only want to scroll in one direction, pass null for the other
476
+ direction. You can also optionally pass a Hash for the first parameter
477
+ with x and y coordinates.
478
+
479
+ @param x {Number} the x scroll location
480
+ @param y {Number} the y scroll location
481
+ @returns {SC.ScrollView} receiver
482
+ */
483
+ scrollTo: function(x,y) {
484
+ // normalize params
485
+ if (y===undefined && SC.typeOf(x) === SC.T_HASH) {
486
+ y = x.y; x = x.x;
487
+ }
488
+
489
+ if (!SC.none(x)) {
490
+ x = Math.max(this.get('minimumHorizontalScrollOffset'),Math.min(this.get('maximumHorizontalScrollOffset'), x)) ;
491
+ this.set('horizontalScrollOffset', x) ;
492
+ }
493
+
494
+ if (!SC.none(y)) {
495
+ y = Math.max(this.get('minimumVerticalScrollOffset'),Math.min(this.get('maximumVerticalScrollOffset'), y)) ;
496
+ this.set('verticalScrollOffset', y) ;
497
+ }
498
+
499
+ return this ;
500
+ },
501
+
502
+ /**
503
+ Scrolls the receiver in the horizontal and vertical directions by the
504
+ amount specified, if allowed. The actual scroll amount will be
505
+ constrained by the current scroll view settings.
506
+
507
+ If you only want to scroll in one direction, pass null or 0 for the other
508
+ direction. You can also optionally pass a Hash for the first parameter
509
+ with x and y coordinates.
510
+
511
+ @param x {Number} change in the x direction (or hash)
512
+ @param y {Number} change in the y direction
513
+ @returns {SC.ScrollView} receiver
514
+ */
515
+ scrollBy: function(x , y) {
516
+ // normalize params
517
+ if (y===undefined && SC.typeOf(x) === SC.T_HASH) {
518
+ y = x.y; x = x.x;
519
+ }
520
+
521
+ // if null, undefined, or 0, pass null; otherwise just add current offset
522
+ x = (x) ? this.get('horizontalScrollOffset')+x : null ;
523
+ y = (y) ? this.get('verticalScrollOffset')+y : null ;
524
+ return this.scrollTo(x,y) ;
525
+ },
526
+
527
+ /**
528
+ Scroll the view to make the view's frame visible. For this to make sense,
529
+ the view should be a subview of the contentView. Otherwise the results
530
+ will be undefined.
531
+
532
+ @param {SC.View} view view to scroll or null to scroll receiver visible
533
+ @returns {Boolean} YES if scroll position was changed
534
+ */
535
+ scrollToVisible: function(view) {
536
+
537
+ // if no view is passed, do default
538
+ if (arguments.length === 0) return sc_super();
539
+
540
+ var contentView = this.get('contentView') ;
541
+ if (!contentView) return NO; // nothing to do if no contentView.
542
+
543
+ // get the frame for the view - should work even for views with static
544
+ // layout, assuming it has been added to the screen.
545
+ var vf = view.get('frame');
546
+ if (!vf) return NO; // nothing to do
547
+
548
+ // convert view's frame to an offset from the contentView origin. This
549
+ // will become the new scroll offset after some adjustment.
550
+ vf = contentView.convertFrameFromView(vf, view.get('parentView')) ;
551
+
552
+ return this.scrollToRect(vf);
553
+ },
554
+
555
+ /**
556
+ Scroll to the supplied rectangle.
557
+ @param {rect} Rectangle to scroll to.
558
+ @returns {Boolean} YES if scroll position was changed.
559
+ */
560
+ scrollToRect: function(rect) {
561
+ // find current visible frame.
562
+ var vo = SC.cloneRect(this.get('containerView').get('frame')) ;
563
+
564
+ vo.x = this.get('horizontalScrollOffset') ;
565
+ vo.y = this.get('verticalScrollOffset') ;
566
+
567
+ var origX = vo.x, origY = vo.y;
568
+
569
+ // if top edge is not visible, shift origin
570
+ vo.y -= Math.max(0, SC.minY(vo) - SC.minY(rect)) ;
571
+ vo.x -= Math.max(0, SC.minX(vo) - SC.minX(rect)) ;
572
+
573
+ // if bottom edge is not visible, shift origin
574
+ vo.y += Math.max(0, SC.maxY(rect) - SC.maxY(vo)) ;
575
+ vo.x += Math.max(0, SC.maxX(rect) - SC.maxX(vo)) ;
576
+
577
+ // scroll to that origin.
578
+ if ((origX !== vo.x) || (origY !== vo.y)) {
579
+ this.scrollTo(vo.x, vo.y);
580
+ return YES ;
581
+ } else return NO;
582
+ },
583
+
584
+
585
+ /**
586
+ Scrolls the receiver down one or more lines if allowed. If number of
587
+ lines is not specified, scrolls one line.
588
+
589
+ @param lines {Number} options number of lines
590
+ @returns {SC.ScrollView} receiver
591
+ */
592
+ scrollDownLine: function(lines) {
593
+ if (lines === undefined) lines = 1 ;
594
+ return this.scrollBy(null, this.get('verticalLineScroll')*lines) ;
595
+ },
596
+
597
+ /**
598
+ Scrolls the receiver up one or more lines if allowed. If number of
599
+ lines is not specified, scrolls one line.
600
+
601
+ @param lines {Number} options number of lines
602
+ @returns {SC.ScrollView} receiver
603
+ */
604
+ scrollUpLine: function(lines) {
605
+ if (lines === undefined) lines = 1 ;
606
+ return this.scrollBy(null, 0-this.get('verticalLineScroll')*lines) ;
607
+ },
608
+
609
+ /**
610
+ Scrolls the receiver right one or more lines if allowed. If number of
611
+ lines is not specified, scrolls one line.
612
+
613
+ @param lines {Number} options number of lines
614
+ @returns {SC.ScrollView} receiver
615
+ */
616
+ scrollRightLine: function(lines) {
617
+ if (lines === undefined) lines = 1 ;
618
+ return this.scrollTo(this.get('horizontalLineScroll')*lines, null) ;
619
+ },
620
+
621
+ /**
622
+ Scrolls the receiver left one or more lines if allowed. If number of
623
+ lines is not specified, scrolls one line.
624
+
625
+ @param lines {Number} options number of lines
626
+ @returns {SC.ScrollView} receiver
627
+ */
628
+ scrollLeftLine: function(lines) {
629
+ if (lines === undefined) lines = 1 ;
630
+ return this.scrollTo(0-this.get('horizontalLineScroll')*lines, null) ;
631
+ },
632
+
633
+ /**
634
+ Scrolls the receiver down one or more page if allowed. If number of
635
+ pages is not specified, scrolls one page. The page size is determined by
636
+ the verticalPageScroll value. By default this is the size of the current
637
+ scrollable area.
638
+
639
+ @param pages {Number} options number of pages
640
+ @returns {SC.ScrollView} receiver
641
+ */
642
+ scrollDownPage: function(pages) {
643
+ if (pages === undefined) pages = 1 ;
644
+ return this.scrollBy(null, this.get('verticalPageScroll')*pages) ;
645
+ },
646
+
647
+ /**
648
+ Scrolls the receiver up one or more page if allowed. If number of
649
+ pages is not specified, scrolls one page. The page size is determined by
650
+ the verticalPageScroll value. By default this is the size of the current
651
+ scrollable area.
652
+
653
+ @param pages {Number} options number of pages
654
+ @returns {SC.ScrollView} receiver
655
+ */
656
+ scrollUpPage: function(pages) {
657
+ if (pages === undefined) pages = 1 ;
658
+ return this.scrollBy(null, 0-(this.get('verticalPageScroll')*pages)) ;
659
+ },
660
+
661
+ /**
662
+ Scrolls the receiver right one or more page if allowed. If number of
663
+ pages is not specified, scrolls one page. The page size is determined by
664
+ the verticalPageScroll value. By default this is the size of the current
665
+ scrollable area.
666
+
667
+ @param pages {Number} options number of pages
668
+ @returns {SC.ScrollView} receiver
669
+ */
670
+ scrollRightPage: function(pages) {
671
+ if (pages === undefined) pages = 1 ;
672
+ return this.scrollBy(this.get('horizontalPageScroll')*pages, null) ;
673
+ },
674
+
675
+ /**
676
+ Scrolls the receiver left one or more page if allowed. If number of
677
+ pages is not specified, scrolls one page. The page size is determined by
678
+ the verticalPageScroll value. By default this is the size of the current
679
+ scrollable area.
680
+
681
+ @param pages {Number} options number of pages
682
+ @returns {SC.ScrollView} receiver
683
+ */
684
+ scrollLeftPage: function(pages) {
685
+ if (pages === undefined) pages = 1 ;
686
+ return this.scrollBy(0-(this.get('horizontalPageScroll')*pages), null) ;
687
+ },
688
+
689
+ /**
690
+ Adjusts the layout for the various internal views. This method is called
691
+ once when the scroll view is first configured and then anytime a scroller
692
+ is shown or hidden. You can call this method yourself as well to retile.
693
+
694
+ You may also want to override this method to handle layout for any
695
+ additional controls you have added to the view.
696
+ */
697
+ tile: function() {
698
+ // get horizontal scroller/determine if we should have a scroller
699
+ var hscroll = this.get('hasHorizontalScroller') ? this.get('horizontalScrollerView') : null ;
700
+ var hasHorizontal = hscroll && this.get('isHorizontalScrollerVisible');
701
+
702
+ // get vertical scroller/determine if we should have a scroller
703
+ var vscroll = this.get('hasVerticalScroller') ? this.get('verticalScrollerView') : null ;
704
+ var hasVertical = vscroll && this.get('isVerticalScrollerVisible') ;
705
+
706
+ // get the containerView
707
+ var clip = this.get('containerView') ;
708
+ var clipLayout = { left: 0, top: 0 } ;
709
+ var t, layout, vo, ho, vl, hl;
710
+
711
+ var ht = ((hasHorizontal) ? hscroll.get('scrollbarThickness') : 0) ;
712
+ var vt = (hasVertical) ? vscroll.get('scrollbarThickness') : 0 ;
713
+
714
+ if (hasHorizontal) {
715
+ hl = this.get('horizontalScrollerLayout');
716
+ layout = {
717
+ left: (hl ? hl.left : 0),
718
+ bottom: (hl ? hl.bottom : 0),
719
+ right: (hl ? hl.right + vt-1 : vt-1),
720
+ height: ht
721
+ };
722
+ hscroll.set('layout', layout) ;
723
+ ho = this.get('horizontalOverlay');
724
+ clipLayout.bottom = ho ? 0 : (layout.bottom + ht) ;
725
+ } else {
726
+ clipLayout.bottom = 0 ;
727
+ }
728
+ if (hscroll) hscroll.set('isVisible', hasHorizontal) ;
729
+
730
+ if (hasVertical) {
731
+ ht = ht + this.get('verticalScrollerBottom') ;
732
+ vl = this.get('verticalScrollerLayout');
733
+ layout = {
734
+ top: (vl ? vl.top : 0),
735
+ bottom: (vl ? vl.bottom + ht : ht),
736
+ right: (vl ? vl.right : 0),
737
+ width: vt
738
+ };
739
+ vscroll.set('layout', layout) ;
740
+ vo = this.get('verticalOverlay');
741
+ clipLayout.right = vo ? 0 : (layout.right + vt) ;
742
+ } else {
743
+ clipLayout.right = 0 ;
744
+ }
745
+ if (vscroll) vscroll.set('isVisible', hasVertical) ;
746
+
747
+ clip.adjust(clipLayout) ;
748
+ },
749
+
750
+ /** @private
751
+ Called whenever a scroller visibility changes. Calls the tile() method.
752
+ */
753
+ scrollerVisibilityDidChange: function() {
754
+ this.tile();
755
+ }.observes('isVerticalScrollerVisible', 'isHorizontalScrollerVisible'),
756
+
757
+ // ..........................................................
758
+ // SCROLL WHEEL SUPPORT
759
+ //
760
+
761
+ /** @private */ _scroll_wheelDeltaX: 0,
762
+ /** @private */ _scroll_wheelDeltaY: 0,
763
+
764
+ // save adjustment and then invoke the actual scroll code later. This will
765
+ // keep the view feeling smooth.
766
+ mouseWheel: function(evt) {
767
+ var deltaAdjust = (SC.browser.webkit && SC.browser.version > 533.0) ? 120 : 1;
768
+
769
+ this._scroll_wheelDeltaX += evt.wheelDeltaX / deltaAdjust;
770
+ this._scroll_wheelDeltaY += evt.wheelDeltaY / deltaAdjust;
771
+ this.invokeLater(this._scroll_mouseWheel, 10) ;
772
+ return this.get('canScrollHorizontal') || this.get('canScrollVertical') ;
773
+ },
774
+
775
+ /** @private */
776
+ _scroll_mouseWheel: function() {
777
+ this.scrollBy(this._scroll_wheelDeltaX, this._scroll_wheelDeltaY);
778
+ if (SC.WHEEL_MOMENTUM && this._scroll_wheelDeltaY > 0) {
779
+ this._scroll_wheelDeltaY = Math.floor(this._scroll_wheelDeltaY*0.950);
780
+ this._scroll_wheelDeltaY = Math.max(this._scroll_wheelDeltaY, 0);
781
+ this.invokeLater(this._scroll_mouseWheel, 10) ;
782
+ } else if (SC.WHEEL_MOMENTUM && this._scroll_wheelDeltaY < 0){
783
+ this._scroll_wheelDeltaY = Math.ceil(this._scroll_wheelDeltaY*0.950);
784
+ this._scroll_wheelDeltaY = Math.min(this._scroll_wheelDeltaY, 0);
785
+ this.invokeLater(this._scroll_mouseWheel, 10) ;
786
+ } else {
787
+ this._scroll_wheelDeltaY = 0;
788
+ this._scroll_wheelDeltaX = 0;
789
+ }
790
+ },
791
+
792
+ /*..............................................
793
+ SCALING SUPPORT
794
+ */
795
+
796
+ /**
797
+ Determines whether scaling is allowed.
798
+ */
799
+ canScale: NO,
800
+
801
+ /**
802
+ The current scale.
803
+ */
804
+ _scale: 1.0,
805
+ scale: function(key, value) {
806
+ if (value !== undefined) {
807
+ this._scale = Math.min(Math.max(this.get("minimumScale"), value), this.get("maximumScale"));
808
+ }
809
+ return this._scale;
810
+ }.property().cacheable(),
811
+
812
+ /**
813
+ The minimum scale.
814
+ */
815
+ minimumScale: 0.25,
816
+
817
+ /**
818
+ The maximum scale.
819
+ */
820
+ maximumScale: 2.0,
821
+
822
+ /**
823
+ Whether to automatically determine the scale range based on the size of the content.
824
+ */
825
+ autoScaleRange: NO,
826
+
827
+ _scale_css: "",
828
+
829
+ updateScale: function(scale) {
830
+ var contentView = this.get("contentView");
831
+ if (!contentView) return;
832
+
833
+ if (contentView.isScalable) {
834
+ this.get("contentView").applyScale(scale);
835
+ this._scale_css = "";
836
+ } else {
837
+ this._scale_css = "scale3d(" + scale + ", " + scale + ", 1)";
838
+ }
839
+ },
840
+
841
+ /*..............................................
842
+ TOUCH SUPPORT
843
+ */
844
+ acceptsMultitouch: YES,
845
+
846
+ /**
847
+ The scroll deceleration rate.
848
+ */
849
+ decelerationRate: SC.NORMAL_SCROLL_DECELERATION,
850
+
851
+ /**
852
+ If YES, bouncing will always be enabled in the horizontal direction, even if the content
853
+ is smaller or the same size as the view. NO by default.
854
+ */
855
+ alwaysBounceHorizontal: NO,
856
+
857
+ /**
858
+ If NO, bouncing will not be enabled in the vertical direction when the content is smaller
859
+ or the same size as the scroll view. YES by default.
860
+ */
861
+ alwaysBounceVertical: YES,
862
+
863
+ /**
864
+ Whether to delay touches from passing through to the content.
865
+ */
866
+ delaysContentTouches: YES,
867
+
868
+ /**
869
+ @private
870
+ If the view supports it, this
871
+ */
872
+ _touchScrollDidChange: function() {
873
+ if (this.get("contentView").touchScrollDidChange) {
874
+ this.get("contentView").touchScrollDidChange(
875
+ this._scroll_horizontalScrollOffset,
876
+ this._scroll_verticalScrollOffset
877
+ );
878
+ }
879
+
880
+ // tell scrollers
881
+ if (this.verticalScrollerView && this.verticalScrollerView.touchScrollDidChange) {
882
+ this.verticalScrollerView.touchScrollDidChange(this._scroll_verticalScrollOffset);
883
+ }
884
+
885
+ if (this.horizontalScrollerView && this.horizontalScrollerView.touchScrollDidChange) {
886
+ this.horizontalScrollerView.touchScrollDidChange(this._scroll_horizontalScrollOffset);
887
+ }
888
+ },
889
+
890
+ _touchScrollDidStart: function() {
891
+ if (this.get("contentView").touchScrollDidStart) {
892
+ this.get("contentView").touchScrollDidStart(this._scroll_horizontalScrollOffset, this._scroll_verticalScrollOffset);
893
+ }
894
+
895
+ // tell scrollers
896
+ if (this.verticalScrollerView && this.verticalScrollerView.touchScrollDidStart) {
897
+ this.verticalScrollerView.touchScrollDidStart(this._touch_verticalScrollOffset);
898
+ }
899
+ if (this.horizontalScrollerView && this.horizontalScrollerView.touchScrollDidStart) {
900
+ this.horizontalScrollerView.touchScrollDidStart(this._touch_horizontalScrollOffset);
901
+ }
902
+ },
903
+
904
+ _touchScrollDidEnd: function() {
905
+ if (this.get("contentView").touchScrollDidEnd) {
906
+ this.get("contentView").touchScrollDidEnd(this._scroll_horizontalScrollOffset, this._scroll_verticalScrollOffset);
907
+ }
908
+
909
+ // tell scrollers
910
+ if (this.verticalScrollerView && this.verticalScrollerView.touchScrollDidEnd) {
911
+ this.verticalScrollerView.touchScrollDidEnd(this._touch_verticalScrollOffset);
912
+ }
913
+
914
+ if (this.horizontalScrollerView && this.horizontalScrollerView.touchScrollDidEnd) {
915
+ this.horizontalScrollerView.touchScrollDidEnd(this._touch_horizontalScrollOffset);
916
+ }
917
+ },
918
+
919
+ _applyCSSTransforms: function(layer) {
920
+ var transform = "";
921
+ this.updateScale(this._scale);
922
+ transform += 'translate3d('+ -this._scroll_horizontalScrollOffset +'px, '+ -Math.round(this._scroll_verticalScrollOffset)+'px,0) ';
923
+ transform += this._scale_css;
924
+ if (layer) {
925
+ layer.style.webkitTransform = transform;
926
+ layer.style.webkitTransformOrigin = "top left";
927
+ }
928
+ },
929
+
930
+ captureTouch: function(touch) {
931
+ return YES;
932
+ },
933
+
934
+ touchGeneration: 0,
935
+ touchStart: function(touch) {
936
+ var generation = ++this.touchGeneration;
937
+ if (!this.tracking && this.get("delaysContentTouches")) {
938
+ this.invokeLater(this.beginTouchesInContent, 150, generation);
939
+ } else if (!this.tracking) {
940
+ // NOTE: We still have to delay because we don't want to call touchStart
941
+ // while touchStart is itself being called...
942
+ this.invokeLater(this.beginTouchesInContent, 1, generation);
943
+ }
944
+ this.beginTouchTracking(touch, YES);
945
+ return YES;
946
+ },
947
+
948
+ beginTouchesInContent: function(gen) {
949
+ if (gen !== this.touchGeneration) return;
950
+
951
+ var touch = this.touch, itemView;
952
+ if (touch && this.tracking && !this.dragging && !touch.touch.scrollHasEnded) {
953
+ // try to capture the touch
954
+ touch.touch.captureTouch(this, YES);
955
+
956
+ if (!touch.touch.touchResponder) {
957
+ // if it DIDN'T WORK!!!!!
958
+ // then we need to take possession again.
959
+ touch.touch.makeTouchResponder(this);
960
+ } else {
961
+ // Otherwise, it did work, and if we had a pending scroll end, we must do it now
962
+ if (touch.needsScrollEnd) {
963
+ this._touchScrollDidEnd();
964
+ }
965
+ }
966
+ }
967
+ },
968
+
969
+ /**
970
+ Initializes the start state of the gesture.
971
+
972
+ We keep information about the initial location of the touch so we can
973
+ disambiguate between a tap and a drag.
974
+
975
+ @param {Event} evt
976
+ */
977
+ beginTouchTracking: function(touch, starting) {
978
+ var avg = touch.averagedTouchesForView(this, starting);
979
+
980
+ var verticalScrollOffset = this._scroll_verticalScrollOffset || 0,
981
+ horizontalScrollOffset = this._scroll_horizontalScrollOffset || 0,
982
+ startClipOffsetX = horizontalScrollOffset,
983
+ startClipOffsetY = verticalScrollOffset,
984
+ needsScrollEnd = NO;
985
+
986
+ if (this.touch && this.touch.timeout) {
987
+ // clear the timeout
988
+ clearTimeout(this.touch.timeout);
989
+ this.touch.timeout = null;
990
+
991
+ // get the scroll offsets
992
+ startClipOffsetX = this.touch.startClipOffset.x;
993
+ startClipOffsetY = this.touch.startClipOffset.y;
994
+ needsScrollEnd = YES;
995
+ }
996
+
997
+ // calculate container+content width/height
998
+ var view = this.get('contentView') ;
999
+ var contentWidth = view ? view.get('frame').width : 0,
1000
+ contentHeight = view ? view.get('frame').height : 0;
1001
+
1002
+ if(view.calculatedWidth && view.calculatedWidth!==0) contentWidth = view.calculatedWidth;
1003
+ if (view.calculatedHeight && view.calculatedHeight !==0) contentHeight = view.calculatedHeight;
1004
+
1005
+ var containerWidth = this.get('containerView').get('frame').width,
1006
+ containerHeight = this.get('containerView').get('frame').height;
1007
+
1008
+
1009
+ // calculate position in content
1010
+ var globalFrame = this.convertFrameToView(this.get("frame"), null),
1011
+ positionInContentX = (horizontalScrollOffset + (avg.x - globalFrame.x)) / this._scale,
1012
+ positionInContentY = (verticalScrollOffset + (avg.y - globalFrame.y)) / this._scale;
1013
+
1014
+ this.touch = {
1015
+ startTime: touch.timeStamp,
1016
+ notCalculated: YES,
1017
+
1018
+ enableScrolling: {
1019
+ x: contentWidth * this._scale > containerWidth || this.get("alwaysBounceHorizontal"),
1020
+ y: contentHeight * this._scale > containerHeight || this.get("alwaysBounceVertical")
1021
+ },
1022
+ scrolling: { x: NO, y: NO },
1023
+
1024
+ enableBouncing: SC.platform.bounceOnScroll,
1025
+
1026
+ // offsets and velocities
1027
+ startClipOffset: { x: startClipOffsetX, y: startClipOffsetY },
1028
+ lastScrollOffset: { x: horizontalScrollOffset, y: verticalScrollOffset },
1029
+ startTouchOffset: { x: avg.x, y: avg.y },
1030
+ scrollVelocity: { x: 0, y: 0 },
1031
+
1032
+ startTouchOffsetInContent: { x: positionInContentX, y: positionInContentY },
1033
+
1034
+ containerSize: { width: containerWidth, height: containerHeight },
1035
+ contentSize: { width: contentWidth, height: contentHeight },
1036
+
1037
+ startScale: this._scale,
1038
+ startDistance: avg.d,
1039
+ canScale: this.get("canScale") && SC.platform.pinchToZoom,
1040
+ minimumScale: this.get("minimumScale"),
1041
+ maximumScale: this.get("maximumScale"),
1042
+
1043
+ globalFrame: globalFrame,
1044
+
1045
+ // cache some things
1046
+ layer: this.get("contentView").get('layer'),
1047
+
1048
+ // some constants
1049
+ resistanceCoefficient: 0.998,
1050
+ resistanceAsymptote: 320,
1051
+ decelerationFromEdge: 0.05,
1052
+ accelerationToEdge: 0.1,
1053
+
1054
+ // how much percent of the other drag direction you must drag to start dragging that direction too.
1055
+ scrollTolerance: { x: 15, y: 15 },
1056
+ scaleTolerance: 5,
1057
+ secondaryScrollTolerance: 30,
1058
+ scrollLock: 500,
1059
+
1060
+ decelerationRate: this.get("decelerationRate"),
1061
+
1062
+ // general status
1063
+ lastEventTime: touch.timeStamp,
1064
+
1065
+ // the touch used
1066
+ touch: (starting ? touch : (this.touch ? this.touch.touch : null)),
1067
+
1068
+ // needsScrollEnd will cause a scrollDidEnd even if this particular touch does not start a scroll.
1069
+ // the reason for this is because we don't want to say we've stopped scrolling just because we got
1070
+ // another touch, but simultaneously, we still need to send a touch end eventually.
1071
+ // there are two cases in which this will be used:
1072
+ //
1073
+ // 1. If the touch was sent to content touches (in which case we will not be scrolling)
1074
+ // 2. If the touch ends before scrolling starts (no scrolling then, either)
1075
+ needsScrollEnd: needsScrollEnd
1076
+ };
1077
+
1078
+ if (!this.tracking) {
1079
+ this.tracking = YES;
1080
+ this.dragging = NO;
1081
+ }
1082
+ },
1083
+
1084
+ _adjustForEdgeResistance: function(offset, minOffset, maxOffset, resistanceCoefficient, asymptote) {
1085
+ var distanceFromEdge;
1086
+
1087
+ // find distance from edge
1088
+ if (offset < minOffset) distanceFromEdge = offset - minOffset;
1089
+ else if (offset > maxOffset) distanceFromEdge = maxOffset - offset;
1090
+ else return offset;
1091
+
1092
+ // manipulate logarithmically
1093
+ distanceFromEdge = Math.pow(resistanceCoefficient, Math.abs(distanceFromEdge)) * asymptote;
1094
+
1095
+ // adjust mathematically
1096
+ if (offset < minOffset) distanceFromEdge = distanceFromEdge - asymptote;
1097
+ else distanceFromEdge = -distanceFromEdge + asymptote;
1098
+
1099
+ // generate final value
1100
+ return Math.min(Math.max(minOffset, offset), maxOffset) + distanceFromEdge;
1101
+ },
1102
+
1103
+ touchesDragged: function(evt, touches) {
1104
+ var avg = evt.averagedTouchesForView(this);
1105
+ this.updateTouchScroll(avg.x, avg.y, avg.d, evt.timeStamp);
1106
+ },
1107
+
1108
+ updateTouchScroll: function(touchX, touchY, distance, timeStamp) {
1109
+ // get some vars
1110
+ var touch = this.touch,
1111
+ touchXInFrame = touchX - touch.globalFrame.x,
1112
+ touchYInFrame = touchY - touch.globalFrame.y,
1113
+ offsetY,
1114
+ maxOffsetY,
1115
+ offsetX,
1116
+ maxOffsetX,
1117
+ minOffsetX, minOffsetY;
1118
+
1119
+ // calculate new position in content
1120
+ var positionInContentX = ((this._scroll_horizontalScrollOffset||0) + touchXInFrame) / this._scale,
1121
+ positionInContentY = ((this._scroll_verticalScrollOffset||0) + touchYInFrame) / this._scale;
1122
+
1123
+ // calculate deltas
1124
+ var deltaX = positionInContentX - touch.startTouchOffset.x,
1125
+ deltaY = positionInContentY - touch.startTouchOffset.y;
1126
+
1127
+ var isDragging = touch.dragging;
1128
+ if (!touch.scrolling.x && Math.abs(deltaX) > touch.scrollTolerance.x && touch.enableScrolling.x) {
1129
+ // say we are scrolling
1130
+ isDragging = YES;
1131
+ touch.scrolling.x = YES;
1132
+ touch.scrollTolerance.y = touch.secondaryScrollTolerance;
1133
+
1134
+ // reset position
1135
+ touch.startTouchOffset.x = touchX;
1136
+ deltaX = 0;
1137
+ }
1138
+ if (!touch.scrolling.y && Math.abs(deltaY) > touch.scrollTolerance.y && touch.enableScrolling.y) {
1139
+ // say we are scrolling
1140
+ isDragging = YES;
1141
+ touch.scrolling.y = YES;
1142
+ touch.scrollTolerance.x = touch.secondaryScrollTolerance;
1143
+
1144
+ // reset position
1145
+ touch.startTouchOffset.y = touchY;
1146
+ deltaY = 0;
1147
+ }
1148
+
1149
+ // handle scroll start
1150
+ if (isDragging && !touch.dragging) {
1151
+ touch.dragging = YES;
1152
+ this.dragging = YES;
1153
+ this._touchScrollDidStart();
1154
+ }
1155
+
1156
+ // calculate new offset
1157
+ if (!touch.scrolling.x && !touch.scrolling.y && !touch.canScale) return;
1158
+ if (touch.scrolling.x && !touch.scrolling.y) {
1159
+ if (deltaX > touch.scrollLock && !touch.scrolling.y) touch.enableScrolling.y = NO;
1160
+ }
1161
+ if (touch.scrolling.y && !touch.scrolling.x) {
1162
+ if (deltaY > touch.scrollLock && !touch.scrolling.x) touch.enableScrolling.x = NO;
1163
+ }
1164
+
1165
+ // handle scaling through pinch gesture
1166
+ if (touch.canScale) {
1167
+
1168
+ var startDistance = touch.startDistance, dd = distance - startDistance;
1169
+ if (Math.abs(dd) > touch.scaleTolerance) {
1170
+ touch.scrolling.y = YES; // if you scale, you can scroll.
1171
+ touch.scrolling.x = YES;
1172
+
1173
+ // we want to say something that was the startDistance away from each other should now be
1174
+ // distance away. So, if we are twice as far away as we started...
1175
+ var scale = touch.startScale * (distance / Math.max(startDistance, 50));
1176
+
1177
+ var newScale = this._adjustForEdgeResistance(scale, touch.minimumScale, touch.maximumScale, touch.resistanceCoefficient, touch.resistanceAsymptote);
1178
+ this.dragging = YES;
1179
+ this._scale = newScale;
1180
+ var newPositionInContentX = positionInContentX * this._scale,
1181
+ newPositionInContentY = positionInContentY * this._scale;
1182
+ }
1183
+ }
1184
+
1185
+ // these do exactly what they sound like. So, this comment is just to
1186
+ // block off the code a bit
1187
+ // In english, these calculate the minimum X/Y offsets
1188
+ minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1189
+ minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1190
+
1191
+ // and now, maximum...
1192
+ maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1193
+ maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1194
+
1195
+
1196
+ // So, the following is the completely written out algebra:
1197
+ // (offsetY + touchYInFrame) / this._scale = touch.startTouchOffsetInContent.y
1198
+ // offsetY + touchYInFrame = touch.startTouchOffsetInContent.y * this._scale;
1199
+ // offsetY = touch.startTouchOffset * this._scale - touchYInFrame
1200
+
1201
+ // and the result applied:
1202
+ offsetX = touch.startTouchOffsetInContent.x * this._scale - touchXInFrame;
1203
+ offsetY = touch.startTouchOffsetInContent.y * this._scale - touchYInFrame;
1204
+
1205
+
1206
+ // we need to adjust for edge resistance, or, if bouncing is disabled, just stop flat.
1207
+ if (touch.enableBouncing) {
1208
+ offsetX = this._adjustForEdgeResistance(offsetX, minOffsetX, maxOffsetX, touch.resistanceCoefficient, touch.resistanceAsymptote);
1209
+ offsetY = this._adjustForEdgeResistance(offsetY, minOffsetY, maxOffsetY, touch.resistanceCoefficient, touch.resistanceAsymptote);
1210
+ } else {
1211
+ offsetX = Math.max(minOffsetX, Math.min(maxOffsetX, offsetX));
1212
+ offsetY = Math.max(minOffsetY, Math.min(maxOffsetY, offsetY));
1213
+ }
1214
+
1215
+ // and now, _if_ scrolling is enabled, set the new coordinates
1216
+ if (touch.scrolling.x) this._scroll_horizontalScrollOffset = offsetX;
1217
+ if (touch.scrolling.y) this._scroll_verticalScrollOffset = offsetY;
1218
+
1219
+ // and apply the CSS transforms.
1220
+ this._applyCSSTransforms(touch.layer);
1221
+ this._touchScrollDidChange();
1222
+
1223
+
1224
+ // now we must prepare for momentum scrolling by calculating the momentum.
1225
+ if (timeStamp - touch.lastEventTime >= 1 || touch.notCalculated) {
1226
+ touch.notCalculated = NO;
1227
+ var horizontalOffset = this._scroll_horizontalScrollOffset;
1228
+ var verticalOffset = this._scroll_verticalScrollOffset;
1229
+
1230
+ touch.scrollVelocity.x = ((horizontalOffset - touch.lastScrollOffset.x) / Math.max(1, timeStamp - touch.lastEventTime)); // in px per ms
1231
+ touch.scrollVelocity.y = ((verticalOffset - touch.lastScrollOffset.y) / Math.max(1, timeStamp - touch.lastEventTime)); // in px per ms
1232
+ touch.lastScrollOffset.x = horizontalOffset;
1233
+ touch.lastScrollOffset.y = verticalOffset;
1234
+ touch.lastEventTime = timeStamp;
1235
+ }
1236
+ },
1237
+
1238
+ touchEnd: function(touch) {
1239
+ var touchStatus = this.touch,
1240
+ avg = touch.averagedTouchesForView(this);
1241
+
1242
+ touch.scrollHasEnded = YES;
1243
+ if (avg.touchCount > 0) {
1244
+ this.beginTouchTracking(touch, NO);
1245
+ } else {
1246
+ if (this.dragging) {
1247
+ touchStatus.dragging = NO;
1248
+
1249
+ // reset last event time
1250
+ touchStatus.lastEventTime = touch.timeStamp;
1251
+
1252
+ this.startDecelerationAnimation();
1253
+ } else {
1254
+ // well. The scrolling stopped. Let us tell everyone if there was a pending one that this non-drag op interrupted.
1255
+ if (touchStatus.needsScrollEnd) this._touchScrollDidEnd();
1256
+
1257
+ // this part looks weird, but it is actually quite simple.
1258
+ // First, we send the touch off for capture+starting again, but telling it to return to us
1259
+ // if nothing is found or if it is released.
1260
+ touch.captureTouch(this, YES);
1261
+
1262
+ // if we went anywhere, did anything, etc., call end()
1263
+ if (touch.touchResponder && touch.touchResponder !== this) {
1264
+ touch.end();
1265
+ } else if (!touch.touchResponder || touch.touchResponder === this) {
1266
+ // if it was released to us or stayed with us the whole time, or is for some
1267
+ // wacky reason empty (in which case it is ours still). If so, and there is a next responder,
1268
+ // relay to that.
1269
+
1270
+ if (touch.nextTouchResponder) touch.makeTouchResponder(touch.nextTouchResponder);
1271
+ } else {
1272
+ // in this case, the view that captured it and changed responder should have handled
1273
+ // everything for us.
1274
+ }
1275
+
1276
+ this.touch = null;
1277
+ }
1278
+
1279
+ this.tracking = NO;
1280
+ this.dragging = NO;
1281
+ }
1282
+ },
1283
+
1284
+ touchCancelled: function(touch) {
1285
+ var touchStatus = this.touch,
1286
+ avg = touch.averagedTouchesForView(this);
1287
+
1288
+ // if we are decelerating, we don't want to stop that. That would be bad. Because there's no point.
1289
+ if (!this.touch || !this.touch.timeout) {
1290
+ this.beginPropertyChanges();
1291
+ this.set("scale", this._scale);
1292
+ this.set("verticalScrollOffset", this._scroll_verticalScrollOffset);
1293
+ this.set("horizontalScrollOffset", this._scroll_horizontalScrollOffset);
1294
+ this.endPropertyChanges();
1295
+ this.tracking = NO;
1296
+
1297
+ if (this.dragging) {
1298
+ this._touchScrollDidEnd();
1299
+ }
1300
+
1301
+ this.dragging = NO;
1302
+ this.touch = null;
1303
+ }
1304
+ },
1305
+
1306
+ startDecelerationAnimation: function(evt) {
1307
+ var touch = this.touch;
1308
+ touch.decelerationVelocity = {
1309
+ x: touch.scrollVelocity.x * 10,
1310
+ y: touch.scrollVelocity.y * 10
1311
+ };
1312
+
1313
+ this.decelerateAnimation();
1314
+ },
1315
+
1316
+ /**
1317
+ @private
1318
+ Does bounce calculations, adjusting velocity.
1319
+
1320
+ Bouncing is fun. Functions that handle it should have fun names,
1321
+ don'tcha think?
1322
+
1323
+ P.S.: should this be named "bouncityBounce" instead?
1324
+ */
1325
+ bouncyBounce: function(velocity, value, minValue, maxValue, de, ac, additionalAcceleration) {
1326
+ // we have 4 possible paths. On a higher level, we have two leaf paths that can be applied
1327
+ // for either of two super-paths.
1328
+ //
1329
+ // The first path is if we are decelerating past an edge: in this case, this function must
1330
+ // must enhance that deceleration. In this case, our math boils down to taking the amount
1331
+ // by which we are past the edge, multiplying it by our deceleration factor, and reducing
1332
+ // velocity by that amount.
1333
+ //
1334
+ // The second path is if we are not decelerating, but are still past the edge. In this case,
1335
+ // we must start acceleration back _to_ the edge. The math here takes the distance we are from
1336
+ // the edge, multiplies by the acceleration factor, and then performs two additional things:
1337
+ // First, it speeds up the acceleration artificially with additionalAcceleration; this will
1338
+ // make the stop feel more sudden, as it will still have this additional acceleration when it reaches
1339
+ // the edge. Second, it ensures the result does not go past the final value, so we don't end up
1340
+ // bouncing back and forth all crazy-like.
1341
+ if (value < minValue) {
1342
+ if (velocity < 0) velocity = velocity + ((minValue - value) * de);
1343
+ else {
1344
+ velocity = Math.min((minValue-value) * ac + additionalAcceleration, minValue - value - 0.01);
1345
+ }
1346
+ } else if (value > maxValue) {
1347
+ if (velocity > 0) velocity = velocity - ((value - maxValue) * de);
1348
+ else {
1349
+ velocity = -Math.min((value - maxValue) * ac + additionalAcceleration, value - maxValue - 0.01);
1350
+ }
1351
+ }
1352
+ return velocity;
1353
+ },
1354
+
1355
+ decelerateAnimation: function() {
1356
+ // get a bunch of properties. They are named well, so not much explanation of what they are...
1357
+ // However, note maxOffsetX/Y takes into account the scale;
1358
+ // also, newX/Y adds in the current deceleration velocity (the deceleration velocity will
1359
+ // be changed later in this function).
1360
+ var touch = this.touch,
1361
+ scale = this._scale,
1362
+ minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign")),
1363
+ minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign")),
1364
+ maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign")),
1365
+ maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign")),
1366
+
1367
+ now = Date.now(),
1368
+ t = Math.max(now - touch.lastEventTime, 1),
1369
+
1370
+ newX = this._scroll_horizontalScrollOffset + touch.decelerationVelocity.x * (t/10),
1371
+ newY = this._scroll_verticalScrollOffset + touch.decelerationVelocity.y * (t/10);
1372
+
1373
+ var de = touch.decelerationFromEdge, ac = touch.accelerationToEdge;
1374
+
1375
+ // under a few circumstances, we may want to force a valid X/Y position.
1376
+ // For instance, if bouncing is disabled, or if position was okay before
1377
+ // adjusting scale.
1378
+ var forceValidXPosition = !touch.enableBouncing, forceValidYPosition = !touch.enableBouncing;
1379
+
1380
+ // determine if position was okay before adjusting scale (which we do, in
1381
+ // a lovely, animated way, for the scaled out/in too far bounce-back).
1382
+ // if the position was okay, then we are going to make sure that we keep the
1383
+ // position okay when adjusting the scale.
1384
+ //
1385
+ // Position OKness, here, referring to if the position is valid (within
1386
+ // minimum and maximum scroll offsets)
1387
+ if (newX >= minOffsetX && newX <= maxOffsetX) forceValidXPosition = YES;
1388
+ if (newY >= minOffsetY && newY <= maxOffsetY) forceValidYPosition = YES;
1389
+
1390
+ // We are going to change scale in a moment, but the position should stay the
1391
+ // same, if possible (unless it would be more jarring, as described above, in
1392
+ // the case of starting with a valid position and ending with an invalid one).
1393
+ //
1394
+ // Because we are changing the scale, we need to make the position scale-neutral.
1395
+ // we'll make it non-scale-neutral after applying scale.
1396
+ //
1397
+ // Question: might it be better to save the center position instead, so scaling
1398
+ // bounces back around the center of the screen?
1399
+ newX /= this._scale;
1400
+ newY /= this._scale;
1401
+
1402
+ // scale velocity (amount to change) starts out at 0 each time, because
1403
+ // it is calculated by how far out of bounds it is, rather than by the
1404
+ // previous such velocity.
1405
+ var sv = 0;
1406
+
1407
+ // do said calculation; we'll use the same bouncyBounce method used for everything
1408
+ // else, but our adjustor that gives a minimum amount to change by and (which, as we'll
1409
+ // discuss, is to make the stop feel slightly more like a stop), we'll leave at 0
1410
+ // (scale doesn't really need it as much; if you disagree, at least come up with
1411
+ // numbers more appropriate for scale than the ones for X/Y)
1412
+ sv = this.bouncyBounce(sv, scale, touch.minimumScale, touch.maximumScale, de, ac, 0);
1413
+
1414
+ // add the amount to scale. This is linear, rather than multiplicative. If you think
1415
+ // it should be multiplicative (or however you say that), come up with a new formula.
1416
+ this._scale = scale = scale + sv;
1417
+
1418
+ // now we can convert newX/Y back to scale-specific coordinates...
1419
+ newX *= this._scale;
1420
+ newY *= this._scale;
1421
+
1422
+ // It looks very weird if the content started in-bounds, but the scale animation
1423
+ // made it not be in bounds; it causes the position to animate snapping back, and,
1424
+ // well, it looks very weird. It is more proper to just make sure it stays in a valid
1425
+ // position. So, we'll determine the new maximum/minimum offsets, and then, if it was
1426
+ // originally a valid position, we'll adjust the new position to a valid position as well.
1427
+
1428
+
1429
+ // determine new max offset
1430
+ minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1431
+ minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1432
+ maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1433
+ maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1434
+
1435
+ // see if scaling messed up the X position (but ignore if 'tweren't right to begin with).
1436
+ if (forceValidXPosition && (newX < minOffsetX || newX > maxOffsetX)) {
1437
+ // Correct the position
1438
+ newX = Math.max(minOffsetX, Math.min(newX, maxOffsetX));
1439
+
1440
+ // also, make the velocity be ZERO; it is obviously not needed...
1441
+ touch.decelerationVelocity.x = 0;
1442
+ }
1443
+
1444
+ // now the y
1445
+ if (forceValidYPosition && (newY < minOffsetY || newY > maxOffsetY)) {
1446
+ // again, correct it...
1447
+ newY = Math.max(minOffsetY, Math.min(newY, maxOffsetY));
1448
+
1449
+ // also, make the velocity be ZERO; it is obviously not needed...
1450
+ touch.decelerationVelocity.y = 0;
1451
+ }
1452
+
1453
+
1454
+ // now that we are done modifying the position, we may update the actual scroll
1455
+ this._scroll_horizontalScrollOffset = newX;
1456
+ this._scroll_verticalScrollOffset = newY;
1457
+
1458
+ this._applyCSSTransforms(touch.layer); // <- Does what it sounds like.
1459
+
1460
+ this._touchScrollDidChange();
1461
+
1462
+ // Now we have to adjust the velocities. The velocities are simple x and y numbers that
1463
+ // get added to the scroll X/Y positions each frame.
1464
+ // The default decay rate is .950 per frame. To achieve some semblance of accuracy, we
1465
+ // make it to the power of the elapsed number of frames. This is not fully accurate,
1466
+ // as this is applying the elapsed time between this frame and the previous time to
1467
+ // modify the velocity for the next frame. My mind goes blank when I try to figure out
1468
+ // a way to fix this (given that we don't want to change the velocity on the first frame),
1469
+ // and as it seems to work great as-is, I'm just leaving it.
1470
+ var decay = touch.decelerationRate;
1471
+ touch.decelerationVelocity.y *= Math.pow(decay, (t / 10));
1472
+ touch.decelerationVelocity.x *= Math.pow(decay, (t / 10));
1473
+
1474
+ // We have a bouncyBounce method that adjusts the velocity for bounce. That is, if it is
1475
+ // out of range and still going, it will slow it down. This step is decelerationFromEdge.
1476
+ // If it is not moving (or has come to a stop from decelerating), but is still out of range,
1477
+ // it will start it moving back into range (accelerationToEdge)
1478
+ // we supply de and ac as these properties.
1479
+ // The .3 artificially increases the acceleration by .3; this is actually to make the final
1480
+ // stop a bit more abrupt.
1481
+ touch.decelerationVelocity.x = this.bouncyBounce(touch.decelerationVelocity.x, newX, minOffsetX, maxOffsetX, de, ac, 0.3);
1482
+ touch.decelerationVelocity.y = this.bouncyBounce(touch.decelerationVelocity.y, newY, minOffsetY, maxOffsetY, de, ac, 0.3);
1483
+
1484
+ // if we ain't got no velocity... then we must be finished, as there is no where else to go.
1485
+ // to determine our velocity, we take the absolue value, and use that; if it is less than .01, we
1486
+ // must be done. Note that we check scale's most recent velocity, calculated above using bouncyBounce,
1487
+ // as well.
1488
+ var absXVelocity = Math.abs(touch.decelerationVelocity.x);
1489
+ var absYVelocity = Math.abs(touch.decelerationVelocity.y);
1490
+ if (absYVelocity < 0.05 && absXVelocity < 0.05 && Math.abs(sv) < 0.05) {
1491
+ // we can reset the timeout, as it will no longer be required, and we don't want to re-cancel it later.
1492
+ touch.timeout = null;
1493
+ this.touch = null;
1494
+
1495
+ // trigger scroll end
1496
+ this._touchScrollDidEnd();
1497
+
1498
+ // set the scale, vertical, and horizontal offsets to what they technically already are,
1499
+ // but don't know they are yet. This will finally update things like, say, the clipping frame.
1500
+ this.beginPropertyChanges();
1501
+ this.set("scale", this._scale);
1502
+ this.set("verticalScrollOffset", this._scroll_verticalScrollOffset);
1503
+ this.set("horizontalScrollOffset", this._scroll_horizontalScrollOffset);
1504
+ this.endPropertyChanges();
1505
+
1506
+ return;
1507
+ }
1508
+
1509
+ // We now set up the next round. We are doing this as raw as we possibly can, not touching the
1510
+ // run loop at all. This speeds up performance drastically--keep in mind, we're on comparatively
1511
+ // slow devices, here. So, we'll just make a closure, saving "this" into "self" and calling
1512
+ // 10ms later (or however long it takes). Note also that we save both the last event time
1513
+ // (so we may calculate elapsed time) and the timeout we are creating, so we may cancel it in future.
1514
+ var self = this;
1515
+ touch.lastEventTime = Date.now();
1516
+ this.touch.timeout = setTimeout(function(){
1517
+ SC.run(self.decelerateAnimation(), self);
1518
+ }, 10);
1519
+ },
1520
+
1521
+ // ..........................................................
1522
+ // INTERNAL SUPPORT
1523
+ //
1524
+
1525
+ /** @private
1526
+ Instantiate scrollers & container views as needed. Replace their classes
1527
+ in the regular properties.
1528
+ */
1529
+ createChildViews: function() {
1530
+ var childViews = [] , view;
1531
+
1532
+ // create the containerView. We must always have a container view.
1533
+ // also, setup the contentView as the child of the containerView...
1534
+ if (SC.none(view = this.containerView)) view = SC.ContainerView;
1535
+
1536
+ childViews.push(this.containerView = this.createChildView(view, {
1537
+ contentView: this.contentView,
1538
+ isScrollContainer: YES
1539
+ }));
1540
+
1541
+ // and replace our own contentView...
1542
+ this.contentView = this.containerView.get('contentView');
1543
+
1544
+ // create a horizontal scroller view if needed...
1545
+ view = SC.platform.touch ? this.get("horizontalTouchScrollerView") : this.get("horizontalScrollerView");
1546
+ if (view) {
1547
+ if (this.get('hasHorizontalScroller')) {
1548
+ view = this.horizontalScrollerView = this.createChildView(view, {
1549
+ layoutDirection: SC.LAYOUT_HORIZONTAL,
1550
+ valueBinding: '*owner.horizontalScrollOffset'
1551
+ }) ;
1552
+ childViews.push(view);
1553
+ } else this.horizontalScrollerView = null ;
1554
+ }
1555
+
1556
+ // create a vertical scroller view if needed...
1557
+ view = SC.platform.touch ? this.get("verticalTouchScrollerView") : this.get("verticalScrollerView");
1558
+ if (view) {
1559
+ if (this.get('hasVerticalScroller')) {
1560
+ view = this.verticalScrollerView = this.createChildView(view, {
1561
+ layoutDirection: SC.LAYOUT_VERTICAL,
1562
+ valueBinding: '*owner.verticalScrollOffset'
1563
+ }) ;
1564
+ childViews.push(view);
1565
+ } else this.verticalScrollerView = null ;
1566
+ }
1567
+
1568
+ // set childViews array.
1569
+ this.childViews = childViews ;
1570
+
1571
+ this.contentViewDidChange() ; // setup initial display...
1572
+ this.tile() ; // set up initial tiling
1573
+ },
1574
+
1575
+ init: function() {
1576
+ sc_super();
1577
+
1578
+ // start observing initial content view. The content view's frame has
1579
+ // already been setup in prepareDisplay so we don't need to call
1580
+ // viewFrameDidChange...
1581
+ this._scroll_contentView = this.get('contentView') ;
1582
+ var contentView = this._scroll_contentView ;
1583
+
1584
+ if (contentView) {
1585
+ contentView.addObserver('frame', this, this.contentViewFrameDidChange);
1586
+ contentView.addObserver('calculatedWidth', this, this.contentViewFrameDidChange);
1587
+ contentView.addObserver('calculatedHeight', this, this.contentViewFrameDidChange);
1588
+ }
1589
+
1590
+ if (this.get('isVisibleInWindow')) this._scsv_registerAutoscroll() ;
1591
+ },
1592
+
1593
+ /** @private Registers/deregisters view with SC.Drag for autoscrolling */
1594
+ _scsv_registerAutoscroll: function() {
1595
+ if (this.get('isVisibleInWindow')) SC.Drag.addScrollableView(this);
1596
+ else SC.Drag.removeScrollableView(this);
1597
+ }.observes('isVisibleInWindow'),
1598
+
1599
+ /** @private
1600
+ Whenever the contentView is changed, we need to observe the content view's
1601
+ frame to be notified whenever it's size changes.
1602
+ */
1603
+ contentViewDidChange: function() {
1604
+ var newView = this.get('contentView'),
1605
+ oldView = this._scroll_contentView,
1606
+ frameObserver = this.contentViewFrameDidChange,
1607
+ layerObserver = this.contentViewLayerDidChange;
1608
+
1609
+ if (newView !== oldView) {
1610
+
1611
+ // stop observing old content view
1612
+ if (oldView) {
1613
+ oldView.removeObserver('calculatedWidth', this, this.contentViewFrameDidChange);
1614
+ oldView.removeObserver('calculatedHeight', this, this.contentViewFrameDidChange);
1615
+ oldView.removeObserver('frame', this, frameObserver);
1616
+ oldView.removeObserver('layer', this, layerObserver);
1617
+ }
1618
+
1619
+ // update cache
1620
+ this._scroll_contentView = newView;
1621
+ if (newView) {
1622
+ newView.addObserver('frame', this, frameObserver);
1623
+ newView.addObserver('calculatedWidth', this, this.contentViewFrameDidChange);
1624
+ newView.addObserver('calculatedHeight', this, this.contentViewFrameDidChange);
1625
+ newView.addObserver('layer', this, layerObserver);
1626
+ }
1627
+
1628
+ // replace container
1629
+ this.containerView.set('contentView', newView);
1630
+
1631
+ this.contentViewFrameDidChange();
1632
+ }
1633
+ }.observes('contentView'),
1634
+
1635
+ /** @private
1636
+ If we redraw after the initial render, we need to make sure that we reset
1637
+ the scrollTop/scrollLeft properties on the content view. This ensures
1638
+ that, for example, the scroll views displays correctly when switching
1639
+ views out in a ContainerView.
1640
+ */
1641
+ render: function(context, firstTime) {
1642
+ this.invokeLast(this.adjustElementScroll);
1643
+
1644
+ if (firstTime) {
1645
+ context.push('<div class="corner"></div>');
1646
+ }
1647
+ return sc_super();
1648
+ },
1649
+
1650
+ /** @private
1651
+ Invoked whenever the contentView's frame changes. This will update the
1652
+ scroller maxmimum and optionally update the scroller visibility if the
1653
+ size of the contentView changes. We don't care about the origin since
1654
+ that is tracked separately from the offset values.
1655
+
1656
+ @param {Boolean} force (optional) Re-calculate everything even if the contentView’s frame didn’t change size
1657
+ */
1658
+
1659
+ oldMaxHOffset: 0,
1660
+ oldMaxVOffset: 0,
1661
+
1662
+ contentViewFrameDidChange: function(force) {
1663
+ var view = this.get('contentView'),
1664
+ f = (view) ? view.get('frame') : null,
1665
+ scale = this._scale,
1666
+ width = 0,
1667
+ height = 0,
1668
+ dim, dimWidth, dimHeight;
1669
+
1670
+ if (view) {
1671
+ width = view.get('calculatedWidth') || f.width || 0;
1672
+ height = view.get('calculatedHeight') || f.height || 0;
1673
+ }
1674
+
1675
+ width *= scale;
1676
+ height *= scale;
1677
+
1678
+ // cache out scroll settings...
1679
+ if (!force && (width === this._scroll_contentWidth) && (height === this._scroll_contentHeight)) return ;
1680
+ this._scroll_contentWidth = width;
1681
+ this._scroll_contentHeight = height;
1682
+
1683
+ dim = this.getPath('containerView.frame');
1684
+ dimWidth = dim.width;
1685
+ dimHeight = dim.height;
1686
+
1687
+ if (this.get('hasHorizontalScroller') && (view = this.get('horizontalScrollerView'))) {
1688
+ // decide if it should be visible or not
1689
+ if (this.get('autohidesHorizontalScroller')) {
1690
+ this.set('isHorizontalScrollerVisible', width > dimWidth);
1691
+ }
1692
+ view.setIfChanged('maximum', width-dimWidth) ;
1693
+ view.setIfChanged('proportion', dimWidth/width);
1694
+ }
1695
+
1696
+ if (this.get('hasVerticalScroller') && (view = this.get('verticalScrollerView'))) {
1697
+ // decide if it should be visible or not
1698
+ if (this.get('autohidesVerticalScroller')) {
1699
+ this.set('isVerticalScrollerVisible', height > dimHeight);
1700
+ }
1701
+ view.setIfChanged('maximum', height-dimHeight) ;
1702
+ view.setIfChanged('proportion', dimHeight/height);
1703
+ }
1704
+
1705
+ // If there is no vertical scroller and auto hiding is on, make
1706
+ // sure we are at the top if not already there
1707
+ if (!this.get('isVerticalScrollerVisible') && (this.get('verticalScrollOffset') !== 0) &&
1708
+ this.get('autohidesVerticalScroller')) {
1709
+ this.set('verticalScrollOffset', 0);
1710
+ }
1711
+
1712
+ // Same thing for horizontal scrolling.
1713
+ if (!this.get('isHorizontalScrollerVisible') && (this.get('horizontalScrollOffset') !== 0) &&
1714
+ this.get('autohidesHorizontalScroller')) {
1715
+ this.set('horizontalScrollOffset', 0);
1716
+ }
1717
+
1718
+ // This forces to recalculate the height of the frame when is at the bottom
1719
+ // of the scroll and the content dimension are smaller that the previous one
1720
+ var mxVOffSet = this.get('maximumVerticalScrollOffset'),
1721
+ vOffSet = this.get('verticalScrollOffset'),
1722
+ mxHOffSet = this.get('maximumHorizontalScrollOffset'),
1723
+ hOffSet = this.get('horizontalScrollOffset'),
1724
+ forceHeight = mxVOffSet < vOffSet,
1725
+ forceWidth = mxHOffSet < hOffSet;
1726
+ if (forceHeight || forceWidth) {
1727
+ this.forceDimensionsRecalculation(forceWidth, forceHeight, vOffSet, hOffSet);
1728
+ }
1729
+ },
1730
+
1731
+ /** @private
1732
+ If our frame changes, then we need to re-calculate the visiblility of our
1733
+ scrollers, etc.
1734
+ */
1735
+ frameDidChange: function() {
1736
+ this.contentViewFrameDidChange(YES);
1737
+ }.observes('frame'),
1738
+
1739
+ /** @private
1740
+ If the layer of the content view changes, we need to readjust the
1741
+ scrollTop and scrollLeft properties on the new DOM element.
1742
+ */
1743
+ contentViewLayerDidChange: function() {
1744
+ // Invalidate these cached values, as they're no longer valid
1745
+ if (this._verticalScrollOffset !== 0) this._verticalScrollOffset = -1;
1746
+ if (this._horizontalScrollOffset !== 0) this._horizontalScrollOffset = -1;
1747
+ this.invokeLast(this.adjustElementScroll);
1748
+ },
1749
+
1750
+ /** @private
1751
+ Whenever the horizontal scroll offset changes, update the scrollers and
1752
+ edit the location of the contentView.
1753
+ */
1754
+ _scroll_horizontalScrollOffsetDidChange: function() {
1755
+ this.invokeLast(this.adjustElementScroll);
1756
+ }.observes('horizontalScrollOffset'),
1757
+
1758
+ /** @private
1759
+ Whenever the vertical scroll offset changes, update the scrollers and
1760
+ edit the location of the contentView.
1761
+ */
1762
+ _scroll_verticalScrollOffsetDidChange: function() {
1763
+ this.invokeLast(this.adjustElementScroll);
1764
+ }.observes('verticalScrollOffset'),
1765
+
1766
+ /** @private
1767
+ Called at the end of the run loop to actually adjust the scrollTop
1768
+ and scrollLeft properties of the container view.
1769
+ */
1770
+ adjustElementScroll: function() {
1771
+ var container = this.get('containerView'),
1772
+ content = this.get('contentView'),
1773
+ verticalScrollOffset = this.get('verticalScrollOffset'),
1774
+ horizontalScrollOffset = this.get('horizontalScrollOffset');
1775
+
1776
+ // We notify the content view that its frame property has changed
1777
+ // before we actually update the scrollTop/scrollLeft properties.
1778
+ // This gives views that use incremental rendering a chance to render
1779
+ // newly-appearing elements before they come into view.
1780
+ if (content) {
1781
+ content._viewFrameDidChange();
1782
+
1783
+ // Use accelerated drawing if the browser supports it
1784
+ if (SC.platform.touch) {
1785
+ this._applyCSSTransforms(content.get('layer'));
1786
+ }
1787
+ }
1788
+
1789
+ if (container && !SC.platform.touch) {
1790
+ container = container.$()[0];
1791
+
1792
+ if (container) {
1793
+ if (verticalScrollOffset !== this._verticalScrollOffset) {
1794
+ container.scrollTop = verticalScrollOffset;
1795
+ this._verticalScrollOffset = verticalScrollOffset;
1796
+ }
1797
+
1798
+ if (horizontalScrollOffset !== this._horizontalScrollOffset) {
1799
+ container.scrollLeft = horizontalScrollOffset;
1800
+ this._horizontalScrollOffset = horizontalScrollOffset;
1801
+ }
1802
+ }
1803
+ }
1804
+ },
1805
+
1806
+ forceDimensionsRecalculation: function (forceWidth, forceHeight, vOffSet, hOffSet) {
1807
+ var oldScrollHOffset = hOffSet;
1808
+ var oldScrollVOffset = vOffSet;
1809
+ this.scrollTo(0,0);
1810
+ if(forceWidth && forceHeight){
1811
+ this.scrollTo(this.get('maximumHorizontalScrollOffset'), this.get('maximumVerticalScrollOffset'));
1812
+ }
1813
+ if(forceWidth && !forceHeight){
1814
+ this.scrollTo(this.get('maximumHorizontalScrollOffset'), oldScrollVOffset);
1815
+ }
1816
+ if(!forceWidth && forceHeight){
1817
+ this.scrollTo(oldScrollHOffset ,this.get('maximumVerticalScrollOffset'));
1818
+ }
1819
+ },
1820
+
1821
+ _scroll_verticalScrollOffset: 0,
1822
+ _scroll_horizontalScrollOffset: 0
1823
+
1824
+ });