sproutcore 1.7.1.beta → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. data/CHANGELOG +44 -0
  2. data/README.rdoc +20 -20
  3. data/VERSION.yml +3 -3
  4. data/lib/Buildfile +1 -1
  5. data/lib/buildtasks/build.rake +5 -0
  6. data/lib/buildtasks/manifest.rake +19 -1
  7. data/lib/frameworks/sproutcore/Buildfile +19 -17
  8. data/lib/frameworks/sproutcore/CHANGELOG.md +163 -29
  9. data/lib/frameworks/sproutcore/README.md +29 -8
  10. data/lib/frameworks/sproutcore/apps/statechart_routing/Buildfile +12 -0
  11. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/login_controller.js +11 -0
  12. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/main_controller.js +7 -0
  13. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/statechart_controller.js +17 -0
  14. data/lib/frameworks/sproutcore/apps/statechart_routing/core.js +25 -0
  15. data/lib/frameworks/sproutcore/apps/statechart_routing/main.js +15 -0
  16. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/_theme.css +18 -0
  17. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/bar_page.js +14 -0
  18. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/foo_page.js +14 -0
  19. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/loading.rhtml +9 -0
  20. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/login_page.js +61 -0
  21. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/main_page.js +46 -0
  22. data/lib/frameworks/sproutcore/apps/statechart_routing/statechart.js +76 -0
  23. data/lib/frameworks/sproutcore/apps/statechart_routing/theme.js +27 -0
  24. data/lib/frameworks/sproutcore/apps/tests/controllers/targets.js +1 -1
  25. data/lib/frameworks/sproutcore/apps/tests/states/no_targets.js +1 -1
  26. data/lib/frameworks/sproutcore/apps/tests/states/ready_detail.js +1 -1
  27. data/lib/frameworks/sproutcore/apps/tests/states/ready_empty.js +1 -1
  28. data/lib/frameworks/sproutcore/apps/tests/states/ready_list.js +1 -1
  29. data/lib/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +1 -1
  30. data/lib/frameworks/sproutcore/apps/welcome/controllers/targets.js +1 -1
  31. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +14 -1
  32. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +15 -15
  33. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +1 -1
  34. data/lib/frameworks/sproutcore/frameworks/animation/core.js +8 -5
  35. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +302 -70
  36. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +19 -14
  37. data/lib/frameworks/sproutcore/frameworks/bootstrap/tests/system/browser.js +471 -149
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +3 -3
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +42 -0
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/run_loop.js +3 -2
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +2 -2
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +3 -3
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/body_overflow.js +63 -0
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +1 -1
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +37 -2
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +28 -6
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +10 -3
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/sparse_array_delegate.js +2 -2
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +66 -2
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/builder.js +1 -1
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/cursor.js +1 -1
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +58 -57
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js.orig +445 -0
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +51 -31
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/ready.js +5 -1
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +53 -69
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/responder.js +1 -1
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +98 -72
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +37 -3
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/timer.js +7 -4
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +21 -0
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +7 -7
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +23 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/browser.js +66 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/event.js +22 -0
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/locale.js +11 -11
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/end.js +4 -4
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +41 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_className.js +1 -1
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +8 -8
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/update.js +17 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/selection_set/remove.js +1 -1
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +1 -1
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +15 -0
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +5 -5
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +50 -30
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/acceleration.js +46 -0
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +1 -43
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +8 -34
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +3 -2
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +10 -1
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +6 -5
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +22 -2
  88. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +2 -2
  89. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +1 -1
  90. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +0 -2
  91. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +35 -0
  92. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +46 -19
  93. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +23 -9
  94. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +2 -3
  95. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +1 -1
  96. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +2 -2
  97. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +294 -302
  98. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js.orig +1531 -0
  99. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +4 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +14 -11
  101. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/many_array.js +63 -0
  102. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +1 -1
  103. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +4 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +50 -10
  105. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +4 -4
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +3 -3
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +1 -1
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +1 -1
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +114 -67
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +1 -1
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +1 -1
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +54 -1
  114. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +29 -9
  115. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +1 -1
  116. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +1 -1
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +1 -1
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +1 -1
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +37 -45
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +127 -127
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +16 -0
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +42 -4
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +1 -1
  125. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -7
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +8 -0
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/resources/strings.js +2 -1
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +1 -0
  129. data/lib/frameworks/sproutcore/frameworks/debug/core.js +3 -3
  130. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +1 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +1 -1
  132. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +1 -1
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +1 -4
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +19 -6
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +30 -1
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  137. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +24 -1
  138. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +121 -28
  139. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +15 -15
  140. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +1 -1
  141. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -2
  142. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +2 -2
  143. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +39 -15
  144. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +3 -3
  145. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +2 -2
  147. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +14 -6
  148. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/popup_button.js +3 -3
  149. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +11 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +4 -3
  151. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -51
  152. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +11 -16
  153. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-error-48.png +0 -0
  154. data/lib/frameworks/sproutcore/frameworks/desktop/resources/slider.css +0 -2
  155. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +3 -3
  156. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +3 -3
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +9 -9
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/content.js +11 -11
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +1 -1
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +107 -81
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +3 -3
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +68 -60
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +57 -12
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +21 -19
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +2 -2
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +32 -3
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +12 -0
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +12 -0
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +0 -8
  172. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +77 -132
  173. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +5 -6
  174. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +16 -15
  175. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +52 -52
  176. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +1 -1
  177. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +1 -1
  178. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +147 -147
  179. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +11 -2
  180. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +2 -2
  181. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -5
  182. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +22 -12
  183. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +13 -7
  184. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +2 -2
  185. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +462 -441
  186. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +48 -62
  187. data/lib/frameworks/sproutcore/frameworks/desktop/views/segment.js +22 -2
  188. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +150 -32
  189. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +104 -45
  190. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +42 -20
  191. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +24 -24
  192. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +148 -154
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +2 -2
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +2 -2
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +8 -7
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +2 -2
  197. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  198. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/files.js +1 -1
  199. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/library.js +1 -1
  200. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/targets.js +1 -1
  201. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/view_configs.js +1 -1
  202. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/mixins/drop_down.js +1 -1
  203. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/states/ready.js +1 -1
  204. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/plist_item.js +1 -1
  205. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/web.js +1 -1
  206. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/controllers/page_design.js +2 -2
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/css/css_style_sheet.js +2 -2
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/object_designer.js +1 -1
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +2 -2
  210. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/mixins/snap_lines.js +3 -3
  211. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/designer_drop_target.js +1 -1
  212. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/drawing.js +21 -21
  213. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/page_item_view.js +1 -1
  214. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +59 -53
  215. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +2 -2
  216. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/tests/models/polymorphism/simple.js +1 -1
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +6 -6
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +2 -2
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +2 -2
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +17 -6
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +38 -14
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +5 -13
  224. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +1 -1
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +5 -3
  226. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/children.js +19 -0
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/methods.js +20 -2
  228. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/split_thumb.js +1 -1
  229. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +35 -12
  230. data/lib/frameworks/sproutcore/frameworks/formatters/README +6 -0
  231. data/lib/frameworks/sproutcore/frameworks/formatters/english.lproj/strings.js +174 -0
  232. data/lib/frameworks/sproutcore/frameworks/formatters/formatters/date_formatter.js +351 -0
  233. data/lib/frameworks/sproutcore/frameworks/formatters/tests/date_formatter.js +517 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +1 -1
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +345 -138
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +5 -3
  237. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +176 -42
  238. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +137 -105
  240. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gestureable.js +2 -2
  241. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +2 -2
  242. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +16 -1
  243. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +1 -1
  244. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +47 -47
  245. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +3 -3
  246. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +1 -1
  247. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +28 -6
  248. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +1 -1
  249. data/lib/frameworks/sproutcore/frameworks/foundation/resources/benchmark.css +0 -5
  250. data/lib/frameworks/sproutcore/frameworks/foundation/resources/bootstrap.rhtml +34 -19
  251. data/lib/frameworks/sproutcore/frameworks/foundation/resources/button_view.css +0 -2
  252. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +1 -5
  253. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +8 -9
  254. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +2 -2
  255. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +179 -47
  256. data/lib/frameworks/sproutcore/frameworks/foundation/system/task_queue.js +34 -1
  257. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +1 -1
  258. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +26 -12
  259. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/misc.js +7 -7
  260. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +12 -4
  261. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_metric_optimization.js +202 -0
  262. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/content_value_support/content.js +77 -8
  263. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +1 -0
  264. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/beginEditing.js +2 -2
  265. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/commitEditing.js +4 -3
  266. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/discardEditing.js +4 -2
  267. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/beginEditing.js +2 -2
  268. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/commitEditing.js +4 -2
  269. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/discardEditing.js +4 -2
  270. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/pointInElement.js +2 -2
  271. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +0 -8
  272. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +163 -149
  273. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +1 -1
  274. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +1 -1
  275. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
  276. data/lib/frameworks/sproutcore/frameworks/foundation/validators/password.js +1 -1
  277. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +3 -3
  278. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +16 -43
  279. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -3
  280. data/lib/frameworks/sproutcore/frameworks/foundation/views/inline_text_field.js +67 -54
  281. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +49 -38
  282. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +285 -242
  283. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +13 -13
  284. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffered.js +19 -22
  285. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-sc.js +9 -3
  286. data/lib/frameworks/sproutcore/frameworks/jquery/jquery.js +231 -186
  287. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +145 -143
  288. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +156 -154
  289. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.js +5 -5
  290. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +3 -3
  291. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js.orig +540 -0
  292. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +2 -2
  293. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +15 -8
  294. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +5 -5
  295. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +12 -0
  296. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +2 -2
  297. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +1 -1
  298. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +1 -1
  299. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +7 -7
  300. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +98 -32
  301. data/lib/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +7 -2
  302. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +14 -3
  303. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +98 -13
  304. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +8 -14
  305. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
  306. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +2 -2
  307. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +23 -6
  308. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +69 -18
  309. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +57 -31
  310. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +189 -14
  311. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +82 -22
  312. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/chained.js +20 -0
  313. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +125 -4
  314. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue.js +1 -1
  315. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +2 -2
  316. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +37 -0
  317. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +2 -2
  318. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +16 -0
  319. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +75 -4
  320. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +41 -0
  321. data/lib/frameworks/sproutcore/frameworks/statechart/mixins/statechart_delegate.js +113 -0
  322. data/lib/frameworks/sproutcore/frameworks/statechart/private/state_path_matcher.js +312 -0
  323. data/lib/frameworks/sproutcore/frameworks/statechart/system/async.js +18 -22
  324. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +508 -131
  325. data/lib/frameworks/sproutcore/frameworks/statechart/system/state_route_handler_context.js +78 -0
  326. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +265 -44
  327. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/basic/with_concurrent_states.js +16 -0
  328. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/responder_chain.js +11 -3
  329. data/lib/frameworks/sproutcore/frameworks/statechart/tests/private/state_path_matcher.js +116 -0
  330. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/add_substate.js +108 -0
  331. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/with_concurrent.js +179 -0
  332. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/without_concurrent.js +74 -0
  333. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_state.js +141 -0
  334. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_substate.js +340 -0
  335. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/route_triggered.js +161 -0
  336. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/try_to_handle_event.js +288 -0
  337. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/history_state/standard/without_concurrent_states/context.js +5 -33
  338. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/with_concurrent_states/basic.js +213 -0
  339. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/without_concurrent_states/basic.js +212 -0
  340. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/without_concurrent_states/core.js +8 -0
  341. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{state/namespacing.js → statechart/methods/get_state.js} +3 -41
  342. data/lib/frameworks/sproutcore/frameworks/statechart/tests/statechart/{invoke_state_method.js → methods/invoke_state_method.js} +1 -1
  343. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{event_handling/advanced → statechart}/respond_to_event.js +1 -1
  344. data/lib/frameworks/sproutcore/frameworks/statechart/tests/system/state_route_handler_context/methods/retry.js +64 -0
  345. data/lib/frameworks/sproutcore/frameworks/table/core.js +2 -0
  346. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/controls/button.js +0 -1
  347. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars.js +29 -5
  348. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/bind.js +4 -3
  349. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/collection.js +0 -0
  350. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/localization.js +0 -0
  351. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/view.js +0 -0
  352. data/lib/frameworks/sproutcore/frameworks/{handlebars → template_view}/handlebars.js +493 -357
  353. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/checkbox_support.js +0 -0
  354. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/text_field_support.js +13 -2
  355. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/panes/template.js +0 -0
  356. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/controls/button.js +0 -0
  357. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/checkbox_support.js +0 -0
  358. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/text_field_support.js +0 -0
  359. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/panes/template.js +0 -0
  360. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/collection.js +39 -14
  361. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/core.js +0 -0
  362. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/handlebars.js +57 -6
  363. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/bindable_span.js +21 -6
  364. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template.js +9 -3
  365. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template_collection.js +55 -26
  366. data/lib/frameworks/sproutcore/frameworks/testing/system/equiv.js +1 -1
  367. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +122 -122
  368. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +2 -2
  369. data/lib/frameworks/sproutcore/frameworks/testing/system/suite.js +4 -4
  370. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +1 -1
  371. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/reset.css +0 -1
  372. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/view.css +4 -4
  373. data/lib/frameworks/sproutcore/lib/index.rhtml +55 -32
  374. data/lib/frameworks/sproutcore/license.js +2 -4
  375. data/lib/frameworks/sproutcore/themes/ace/resources/body.css +5 -1
  376. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +2 -2
  377. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/24px/button.css +21 -13
  378. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/30px/button.css +17 -10
  379. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +4 -3
  380. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/24px/button.css +20 -12
  381. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/30px/button.css +16 -8
  382. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/jumbo/button.css +17 -0
  383. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/small/button.css +17 -0
  384. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +2 -2
  385. data/lib/frameworks/sproutcore/themes/ace/resources/master-detail/master-detail.css +2 -2
  386. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +5 -3
  387. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +1 -1
  388. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/toolbar.css +1 -1
  389. data/lib/gen/app/USAGE +17 -4
  390. data/lib/gen/language/Buildfile +4 -4
  391. data/lib/gen/language/USAGE +4 -4
  392. data/lib/gen/page/templates/pages/@target_name@/Buildfile +7 -7
  393. data/lib/gen/{html_app → statechart_app}/Buildfile +0 -0
  394. data/lib/gen/{html_app → statechart_app}/README +0 -0
  395. data/lib/gen/statechart_app/USAGE +21 -0
  396. data/lib/gen/statechart_app/templates/apps/@target_name@/Buildfile +9 -0
  397. data/lib/gen/statechart_app/templates/apps/@target_name@/core.js +24 -0
  398. data/lib/gen/statechart_app/templates/apps/@target_name@/main.js +26 -0
  399. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/_theme.css +18 -0
  400. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/loading.rhtml +9 -0
  401. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/main_page.js +21 -0
  402. data/lib/gen/statechart_app/templates/apps/@target_name@/statechart.js +8 -0
  403. data/lib/gen/statechart_app/templates/apps/@target_name@/states/ready_state.js +12 -0
  404. data/lib/gen/statechart_app/templates/apps/@target_name@/theme.js +24 -0
  405. data/lib/sproutcore/builders.rb +1 -0
  406. data/lib/sproutcore/builders/base.rb +19 -1
  407. data/lib/sproutcore/builders/chance_file.rb +6 -1
  408. data/lib/sproutcore/builders/handlebars.rb +1 -9
  409. data/lib/sproutcore/builders/javascript.rb +1 -10
  410. data/lib/sproutcore/builders/json.rb +25 -0
  411. data/lib/sproutcore/builders/less.rb +1 -1
  412. data/lib/sproutcore/builders/sass.rb +1 -1
  413. data/lib/sproutcore/builders/stylesheet.rb +1 -9
  414. data/lib/sproutcore/helpers/html5_manifest.rb +1 -1
  415. data/lib/sproutcore/helpers/static_helper.rb +42 -0
  416. data/lib/sproutcore/rack/proxy.rb +21 -3
  417. data/lib/sproutcore/rack/service.rb +3 -2
  418. data/lib/sproutcore/tools.rb +18 -25
  419. data/lib/sproutcore/tools/gen.rb +10 -3
  420. data/lib/sproutcore/tools/init.rb +11 -10
  421. data/spec/buildtasks/manifest/prepare_build_tasks/json_spec.rb +62 -0
  422. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -1
  423. data/spec/fixtures/builder_tests/apps/json_test/sc_static.json +2 -0
  424. data/spec/lib/builders/json_spec.rb +53 -0
  425. data/sproutcore.gemspec +2 -2
  426. data/vendor/chance/lib/chance/parser.rb +1 -1
  427. metadata +222 -177
  428. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/datetime.js +0 -0
  429. data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +0 -259
  430. data/lib/frameworks/sproutcore/frameworks/documentation/core.js +0 -0
  431. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +0 -69
  432. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +0 -44
  433. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +0 -64
  434. data/lib/frameworks/sproutcore/frameworks/mini/license.js +0 -30
  435. data/lib/gen/html_app/USAGE +0 -15
  436. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +0 -11
  437. data/lib/gen/html_app/templates/apps/@target_name@/resources/images/.gitkeep +0 -0
  438. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +0 -6
  439. data/lib/gen/html_app/templates/apps/@target_name@/resources/templates/@target_name@.handlebars +0 -1
  440. data/lib/gen/html_project/Buildfile +0 -45
  441. data/lib/gen/html_project/INIT +0 -3
  442. data/lib/gen/html_project/README +0 -1
  443. data/lib/gen/html_project/USAGE +0 -2
  444. data/lib/gen/html_project/templates/@filename@/Buildfile +0 -5
  445. data/lib/gen/html_project/templates/@filename@/README +0 -4
@@ -294,7 +294,7 @@ var QUnit = {
294
294
  },
295
295
 
296
296
  /**
297
- * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
297
+ * Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
298
298
  */
299
299
  expect: function(asserts) {
300
300
  config.current.expected = asserts;
@@ -322,7 +322,7 @@ var QUnit = {
322
322
  * Checks that the first two arguments are equal, with an optional message.
323
323
  * Prints out both actual and expected values.
324
324
  *
325
- * Prefered to ok( actual == expected, message )
325
+ * Preferred to ok( actual == expected, message )
326
326
  *
327
327
  * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
328
328
  *
@@ -972,7 +972,7 @@ QUnit.equiv = function () {
972
972
  // for string, boolean, number and null
973
973
  function useStrictEquality(b, a) {
974
974
  if (b instanceof a.constructor || a instanceof b.constructor) {
975
- // to catch short annotaion VS 'new' annotation of a declaration
975
+ // to catch short annotation VS 'new' annotation of a declaration
976
976
  // e.g. var i = 1;
977
977
  // var j = new Number(1);
978
978
  return a == b;
@@ -999,7 +999,7 @@ QUnit.equiv = function () {
999
999
  "regexp": function (b, a) {
1000
1000
  return QUnit.objectType(b) === "regexp" &&
1001
1001
  a.source === b.source && // the regex itself
1002
- a.global === b.global && // and its modifers (gmi) ...
1002
+ a.global === b.global && // and its modifiers (gmi) ...
1003
1003
  a.ignoreCase === b.ignoreCase &&
1004
1004
  a.multiline === b.multiline;
1005
1005
  },
@@ -1033,7 +1033,7 @@ QUnit.equiv = function () {
1033
1033
  loop = false;
1034
1034
  for(j=0;j<parents.length;j++){
1035
1035
  if(parents[j] === a[i]){
1036
- loop = true;//dont rewalk array
1036
+ loop = true;//do not rewalk array
1037
1037
  }
1038
1038
  }
1039
1039
  if (!loop && ! innerEquiv(a[i], b[i])) {
@@ -90,7 +90,7 @@ SC.routes = SC.Object.create(
90
90
 
91
91
  <base href="http://domain.tld/my_app">
92
92
 
93
- The value can also be customized before or during the exectution of the
93
+ The value can also be customized before or during the execution of the
94
94
  main() method.
95
95
 
96
96
  @see http://www.w3.org/TR/html5/semantics.html#the-base-element
@@ -219,7 +219,7 @@ SC.routes = SC.Object.create(
219
219
  }.property(),
220
220
 
221
221
  /*
222
- Works exactly like 'location' but you usee this property only when
222
+ Works exactly like 'location' but you use this property only when
223
223
  you want to just change the location w/out triggering the routes
224
224
  */
225
225
  informLocation: function(key, value){
@@ -514,7 +514,7 @@ SC.routes = SC.Object.create(
514
514
  }
515
515
  }
516
516
 
517
- // else, try to match a wilcard route
517
+ // else, try to match a wildcard route
518
518
  for (key in this.wildcardRoutes) {
519
519
  parts.unshift(part);
520
520
  params[key] = parts.join('/');
@@ -0,0 +1,540 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /**
9
+ @class
10
+
11
+ SC.routes manages the browser location. You can change the hash part of the
12
+ current location. The following code
13
+
14
+ SC.routes.set('location', 'notes/edit/4');
15
+
16
+ will change the location to http://domain.tld/my_app#notes/edit/4. Adding
17
+ routes will register a handler that will be called whenever the location
18
+ changes and matches the route:
19
+
20
+ SC.routes.add(':controller/:action/:id', MyApp, MyApp.route);
21
+
22
+ You can pass additional parameters in the location hash that will be relayed
23
+ to the route handler:
24
+
25
+ SC.routes.set('location', 'notes/show/4?format=xml&language=fr');
26
+
27
+ The syntax for the location hash is described in the location property
28
+ documentation, and the syntax for adding handlers is described in the
29
+ add method documentation.
30
+
31
+ Browsers keep track of the locations in their history, so when the user
32
+ presses the 'back' or 'forward' button, the location is changed, SC.route
33
+ catches it and calls your handler. Except for Internet Explorer versions 7
34
+ and earlier, which do not modify the history stack when the location hash
35
+ changes.
36
+
37
+ SC.routes also supports HTML5 history, which uses a '/' instead of a '#'
38
+ in the URLs, so that all your website's URLs are consistent.
39
+ */
40
+ SC.routes = SC.Object.create(
41
+ /** @scope SC.routes.prototype */{
42
+
43
+ /**
44
+ Set this property to YES if you want to use HTML5 history, if available on
45
+ the browser, instead of the location hash.
46
+
47
+ HTML 5 history uses the history.pushState method and the window's popstate
48
+ event.
49
+
50
+ By default it is NO, so your URLs will look like:
51
+
52
+ http://domain.tld/my_app#notes/edit/4
53
+
54
+ If set to YES and the browser supports pushState(), your URLs will look
55
+ like:
56
+
57
+ http://domain.tld/my_app/notes/edit/4
58
+
59
+ You will also need to make sure that baseURI is properly configured, as
60
+ well as your server so that your routes are properly pointing to your
61
+ SproutCore application.
62
+
63
+ @see http://dev.w3.org/html5/spec/history.html#the-history-interface
64
+ @property
65
+ @type {Boolean}
66
+ */
67
+ wantsHistory: NO,
68
+
69
+ /**
70
+ A read-only boolean indicating whether or not HTML5 history is used. Based
71
+ on the value of wantsHistory and the browser's support for pushState.
72
+
73
+ @see wantsHistory
74
+ @property
75
+ @type {Boolean}
76
+ */
77
+ usesHistory: null,
78
+
79
+ /**
80
+ The base URI used to resolve routes (which are relative URLs). Only used
81
+ when usesHistory is equal to YES.
82
+
83
+ The build tools automatically configure this value if you have the
84
+ html5_history option activated in the Buildfile:
85
+
86
+ config :my_app, :html5_history => true
87
+
88
+ Alternatively, it uses by default the value of the href attribute of the
89
+ <base> tag of the HTML document. For example:
90
+
91
+ <base href="http://domain.tld/my_app">
92
+ <<<<<<< HEAD
93
+
94
+ =======
95
+
96
+ >>>>>>> Fixed misspellings in comments and in a few tests
97
+ The value can also be customized before or during the execution of the
98
+ main() method.
99
+
100
+ @see http://www.w3.org/TR/html5/semantics.html#the-base-element
101
+ @property
102
+ @type {String}
103
+ */
104
+ baseURI: document.baseURI,
105
+
106
+ /** @private
107
+ A boolean value indicating whether or not the ping method has been called
108
+ to setup the SC.routes.
109
+
110
+ @property
111
+ @type {Boolean}
112
+ */
113
+ _didSetup: NO,
114
+
115
+ /** @private
116
+ Internal representation of the current location hash.
117
+
118
+ @property
119
+ @type {String}
120
+ */
121
+ _location: null,
122
+
123
+ /** @private
124
+ Routes are stored in a tree structure, this is the root node.
125
+
126
+ @property
127
+ @type {SC.routes._Route}
128
+ */
129
+ _firstRoute: null,
130
+
131
+ /** @private
132
+ Internal method used to extract and merge the parameters of a URL.
133
+
134
+ @returns {Hash}
135
+ */
136
+ _extractParametersAndRoute: function(obj) {
137
+ var params = {},
138
+ route = obj.route || '',
139
+ separator, parts, i, len, crumbs, key;
140
+
141
+ separator = (route.indexOf('?') < 0 && route.indexOf('&') >= 0) ? '&' : '?';
142
+ parts = route.split(separator);
143
+ route = parts[0];
144
+ if (parts.length === 1) {
145
+ parts = [];
146
+ } else if (parts.length === 2) {
147
+ parts = parts[1].split('&');
148
+ } else if (parts.length > 2) {
149
+ parts.shift();
150
+ }
151
+
152
+ // extract the parameters from the route string
153
+ len = parts.length;
154
+ for (i = 0; i < len; ++i) {
155
+ crumbs = parts[i].split('=');
156
+ params[crumbs[0]] = crumbs[1];
157
+ }
158
+
159
+ // overlay any parameter passed in obj
160
+ for (key in obj) {
161
+ if (obj.hasOwnProperty(key) && key !== 'route') {
162
+ params[key] = '' + obj[key];
163
+ }
164
+ }
165
+
166
+ // build the route
167
+ parts = [];
168
+ for (key in params) {
169
+ parts.push([key, params[key]].join('='));
170
+ }
171
+ params.params = separator + parts.join('&');
172
+ params.route = route;
173
+
174
+ return params;
175
+ },
176
+
177
+ /**
178
+ The current location hash. It is the part in the browser's location after
179
+ the '#' mark.
180
+
181
+ The following code
182
+
183
+ SC.routes.set('location', 'notes/edit/4');
184
+
185
+ will change the location to http://domain.tld/my_app#notes/edit/4 and call
186
+ the correct route handler if it has been registered with the add method.
187
+
188
+ You can also pass additional parameters. They will be relayed to the route
189
+ handler. For example, the following code
190
+
191
+ SC.routes.add(':controller/:action/:id', MyApp, MyApp.route);
192
+ SC.routes.set('location', 'notes/show/4?format=xml&language=fr');
193
+
194
+ will change the location to
195
+ http://domain.tld/my_app#notes/show/4?format=xml&language=fr and call the
196
+ MyApp.route method with the following argument:
197
+
198
+ { route: 'notes/show/4',
199
+ params: '?format=xml&language=fr',
200
+ controller: 'notes',
201
+ action: 'show',
202
+ id: '4',
203
+ format: 'xml',
204
+ language: 'fr' }
205
+
206
+ The location can also be set with a hash, the following code
207
+
208
+ SC.routes.set('location',
209
+ { route: 'notes/edit/4', format: 'xml', language: 'fr' });
210
+
211
+ will change the location to
212
+ http://domain.tld/my_app#notes/show/4?format=xml&language=fr.
213
+
214
+ The 'notes/show/4&format=xml&language=fr' syntax for passing parameters,
215
+ using a '&' instead of a '?', as used in SproutCore 1.0 is still supported.
216
+
217
+ @property
218
+ @type {String}
219
+ */
220
+ location: function(key, value) {
221
+ this._skipRoute = NO;
222
+ return this._extractLocation(key, value);
223
+ }.property(),
224
+
225
+ /*
226
+ <<<<<<< HEAD
227
+ Works exactly like 'location' but you use this property only when
228
+ =======
229
+ Works exactly like 'location' but you use this property only when
230
+ >>>>>>> Fixed misspellings in comments and in a few tests
231
+ you want to just change the location w/out triggering the routes
232
+ */
233
+ informLocation: function(key, value){
234
+ this._skipRoute = YES;
235
+ // This is a very special case where this property
236
+ // has a very heavy influence on the 'location' property
237
+ // this is a case where you might want to use idempotent
238
+ // but you would take a performance hit because it is possible
239
+ // call set() multiple time and we don't want to take the extra
240
+ // cost, so we just invalidate the cached set() value ourselves
241
+ // you shouldn't do this in your own code unless you REALLY
242
+ // know what you are doing.
243
+ var lsk = this.location.lastSetValueKey;
244
+ if (lsk && this._kvo_cache) this._kvo_cache[lsk] = value;
245
+ return this._extractLocation(key, value);
246
+ }.property(),
247
+
248
+ _extractLocation: function(key, value) {
249
+ var crumbs, encodedValue;
250
+
251
+ if (value !== undefined) {
252
+ if (value === null) {
253
+ value = '';
254
+ }
255
+
256
+ if (typeof(value) === 'object') {
257
+ crumbs = this._extractParametersAndRoute(value);
258
+ value = crumbs.route + crumbs.params;
259
+ }
260
+
261
+ if (!SC.empty(value) || (this._location && this._location !== value)) {
262
+ encodedValue = encodeURI(value);
263
+
264
+ if (this.usesHistory) {
265
+ if (encodedValue.length > 0) {
266
+ encodedValue = '/' + encodedValue;
267
+ }
268
+ window.history.pushState(null, null, this.get('baseURI') + encodedValue);
269
+ } else {
270
+ window.location.hash = encodedValue;
271
+ }
272
+ }
273
+
274
+ this._location = value;
275
+ }
276
+
277
+ return this._location;
278
+ },
279
+
280
+ /**
281
+ You usually don't need to call this method. It is done automatically after
282
+ the application has been initialized.
283
+
284
+ It registers for the hashchange event if available. If not, it creates a
285
+ timer that looks for location changes every 150ms.
286
+ */
287
+ ping: function() {
288
+ var that;
289
+
290
+ if (!this._didSetup) {
291
+ this._didSetup = YES;
292
+
293
+ if (this.get('wantsHistory') && SC.platform.supportsHistory) {
294
+ this.usesHistory = YES;
295
+
296
+ this.popState();
297
+ SC.Event.add(window, 'popstate', this, this.popState);
298
+
299
+ } else {
300
+ this.usesHistory = NO;
301
+
302
+ if (SC.platform.supportsHashChange) {
303
+ this.hashChange();
304
+ SC.Event.add(window, 'hashchange', this, this.hashChange);
305
+
306
+ } else {
307
+ // we don't use a SC.Timer because we don't want
308
+ // a run loop to be triggered at each ping
309
+ that = this;
310
+ this._invokeHashChange = function() {
311
+ that.hashChange();
312
+ setTimeout(that._invokeHashChange, 100);
313
+ };
314
+ this._invokeHashChange();
315
+ }
316
+ }
317
+ }
318
+ },
319
+
320
+ /**
321
+ Event handler for the hashchange event. Called automatically by the browser
322
+ if it supports the hashchange event, or by our timer if not.
323
+ */
324
+ hashChange: function(event) {
325
+ var loc = window.location.hash;
326
+
327
+ // Remove the '#' prefix
328
+ loc = (loc && loc.length > 0) ? loc.slice(1, loc.length) : '';
329
+
330
+ if (!SC.browser.isMozilla) {
331
+ // because of bug https://bugzilla.mozilla.org/show_bug.cgi?id=483304
332
+ loc = decodeURI(loc);
333
+ }
334
+
335
+ if (this.get('location') !== loc && !this._skipRoute) {
336
+ SC.run(function() {
337
+ this.set('location', loc);
338
+ }, this);
339
+ }
340
+ this._skipRoute = false;
341
+ },
342
+
343
+ popState: function(event) {
344
+ var base = this.get('baseURI'),
345
+ loc = document.location.href;
346
+
347
+ if (loc.slice(0, base.length) === base) {
348
+
349
+ // Remove the base prefix and the extra '/'
350
+ loc = loc.slice(base.length + 1, loc.length);
351
+
352
+ if (this.get('location') !== loc && !this._skipRoute) {
353
+ SC.run(function() {
354
+ this.set('location', loc);
355
+ }, this);
356
+ }
357
+ }
358
+ this._skipRoute = false;
359
+ },
360
+
361
+ /**
362
+ Adds a route handler. Routes have the following format:
363
+
364
+ - 'users/show/5' is a static route and only matches this exact string,
365
+ - ':action/:controller/:id' is a dynamic route and the handler will be
366
+ called with the 'action', 'controller' and 'id' parameters passed in a
367
+ hash,
368
+ - '*url' is a wildcard route, it matches the whole route and the handler
369
+ will be called with the 'url' parameter passed in a hash.
370
+
371
+ Route types can be combined, the following are valid routes:
372
+
373
+ - 'users/:action/:id'
374
+ - ':controller/show/:id'
375
+ - ':controller/ *url' (ignore the space, because of jslint)
376
+
377
+ @param {String} route the route to be registered
378
+ @param {Object} target the object on which the method will be called, or
379
+ directly the function to be called to handle the route
380
+ @param {Function} method the method to be called on target to handle the
381
+ route, can be a function or a string
382
+ */
383
+ add: function(route, target, method) {
384
+ if (!this._didSetup) {
385
+ this.invokeLast(this.ping);
386
+ }
387
+
388
+ if (method === undefined && SC.typeOf(target) === SC.T_FUNCTION) {
389
+ method = target;
390
+ target = null;
391
+ } else if (SC.typeOf(method) === SC.T_STRING) {
392
+ method = target[method];
393
+ }
394
+
395
+ if (!this._firstRoute) this._firstRoute = this._Route.create();
396
+ this._firstRoute.add(route.split('/'), target, method);
397
+
398
+ return this;
399
+ },
400
+
401
+ /**
402
+ Observer of the 'location' property that calls the correct route handler
403
+ when the location changes.
404
+ */
405
+ locationDidChange: function() {
406
+ this.trigger();
407
+ }.observes('location'),
408
+
409
+ /**
410
+ Triggers a route even if already in that route (does change the location, if it
411
+ is not already changed, as well).
412
+
413
+ If the location is not the same as the supplied location, this simply lets "location"
414
+ handle it (which ends up coming back to here).
415
+ */
416
+ trigger: function() {
417
+ var firstRoute = this._firstRoute,
418
+ location = this.get('location'),
419
+ params, route;
420
+
421
+ if (firstRoute) {
422
+ params = this._extractParametersAndRoute({ route: location });
423
+ location = params.route;
424
+ delete params.route;
425
+ delete params.params;
426
+ route = firstRoute.routeForParts(location.split('/'), params);
427
+ if (route && route.method) {
428
+ route.method.call(route.target || this, params);
429
+ }
430
+ }
431
+ },
432
+
433
+ /**
434
+ @private
435
+ @class
436
+
437
+ SC.routes._Route is a class used internally by SC.routes. The routes defined by your
438
+ application are stored in a tree structure, and this is the class for the
439
+ nodes.
440
+ */
441
+ _Route: SC.Object.extend(
442
+ /** @scope SC.routes._Route.prototype */ {
443
+
444
+ target: null,
445
+
446
+ method: null,
447
+
448
+ staticRoutes: null,
449
+
450
+ dynamicRoutes: null,
451
+
452
+ wildcardRoutes: null,
453
+
454
+ add: function(parts, target, method) {
455
+ var part, nextRoute;
456
+
457
+ // clone the parts array because we are going to alter it
458
+ parts = SC.clone(parts);
459
+
460
+ if (!parts || parts.length === 0) {
461
+ this.target = target;
462
+ this.method = method;
463
+
464
+ } else {
465
+ part = parts.shift();
466
+
467
+ // there are 3 types of routes
468
+ switch (part.slice(0, 1)) {
469
+
470
+ // 1. dynamic routes
471
+ case ':':
472
+ part = part.slice(1, part.length);
473
+ if (!this.dynamicRoutes) this.dynamicRoutes = {};
474
+ if (!this.dynamicRoutes[part]) this.dynamicRoutes[part] = this.constructor.create();
475
+ nextRoute = this.dynamicRoutes[part];
476
+ break;
477
+
478
+ // 2. wildcard routes
479
+ case '*':
480
+ part = part.slice(1, part.length);
481
+ if (!this.wildcardRoutes) this.wildcardRoutes = {};
482
+ nextRoute = this.wildcardRoutes[part] = this.constructor.create();
483
+ break;
484
+
485
+ // 3. static routes
486
+ default:
487
+ if (!this.staticRoutes) this.staticRoutes = {};
488
+ if (!this.staticRoutes[part]) this.staticRoutes[part] = this.constructor.create();
489
+ nextRoute = this.staticRoutes[part];
490
+ }
491
+
492
+ // recursively add the rest of the route
493
+ if (nextRoute) nextRoute.add(parts, target, method);
494
+ }
495
+ },
496
+
497
+ routeForParts: function(parts, params) {
498
+ var part, key, route;
499
+
500
+ // clone the parts array because we are going to alter it
501
+ parts = SC.clone(parts);
502
+
503
+ // if parts is empty, we are done
504
+ if (!parts || parts.length === 0) {
505
+ return this.method ? this : null;
506
+
507
+ } else {
508
+ part = parts.shift();
509
+
510
+ // try to match a static route
511
+ if (this.staticRoutes && this.staticRoutes[part]) {
512
+ return this.staticRoutes[part].routeForParts(parts, params);
513
+
514
+ } else {
515
+
516
+ // else, try to match a dynamic route
517
+ for (key in this.dynamicRoutes) {
518
+ route = this.dynamicRoutes[key].routeForParts(parts, params);
519
+ if (route) {
520
+ params[key] = part;
521
+ return route;
522
+ }
523
+ }
524
+
525
+ // else, try to match a wildcard route
526
+ for (key in this.wildcardRoutes) {
527
+ parts.unshift(part);
528
+ params[key] = parts.join('/');
529
+ return this.wildcardRoutes[key].routeForParts(null, params);
530
+ }
531
+
532
+ // if nothing was found, it means that there is no match
533
+ return null;
534
+ }
535
+ }
536
+ }
537
+
538
+ })
539
+
540
+ });