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
@@ -39,8 +39,11 @@ SC.platform = SC.Object.create({
39
39
 
40
40
  /*
41
41
  NOTES
42
- - A development version of Chrome 9 incorrectly reported supporting touch
43
- - Android is assumed to support touch, but incorrectly reports that it does not
42
+ - Chrome would incorrectly indicate support for touch events. This has been fixed:
43
+ http://code.google.com/p/chromium/issues/detail?id=36415
44
+ - Android is assumed to support touch, but incorrectly reports that it does not.
45
+ - See: https://github.com/Modernizr/Modernizr/issues/84 for a discussion on detecting
46
+ touch capability.
44
47
  */
45
48
  /**
46
49
  YES if the current device supports touch events, NO otherwise.
@@ -50,11 +53,25 @@ SC.platform = SC.Object.create({
50
53
 
51
54
  @property {Boolean}
52
55
  */
53
- touch: (('createTouch' in document) && SC.browser.chrome < 9) || SC.browser.android,
54
-
55
- bounceOnScroll: SC.browser.iOS,
56
- pinchToZoom: SC.browser.iOS,
56
+ touch: 'ontouchstart' in window || SC.browser.name === SC.BROWSER.android,
57
57
 
58
+ /**
59
+ YES if the current browser supports bounce on scroll.
60
+
61
+ @property {Boolean}
62
+ */
63
+ bounceOnScroll: SC.browser.os === SC.OS.ios,
64
+
65
+ /**
66
+ YES if the current browser supports pinch to zoom.
67
+
68
+ @property {Boolean}
69
+ */
70
+ pinchToZoom: SC.browser.os === SC.OS.ios,
71
+
72
+ /**
73
+ YES if the current browser supports the `placeholder` attribute in `input` elements.
74
+ */
58
75
  input: {
59
76
  placeholder: ('placeholder' in document.createElement('input'))
60
77
  },
@@ -98,7 +115,7 @@ SC.platform = SC.Object.create({
98
115
  cssPrefix: null,
99
116
 
100
117
  /**
101
- Prefix for browsew specific CSS attributes when used in the DOM. Calculated later.
118
+ Prefix for browser specific CSS attributes when used in the DOM. Calculated later.
102
119
  */
103
120
  domCSSPrefix: null,
104
121
 
@@ -116,7 +133,7 @@ SC.platform = SC.Object.create({
116
133
  // @endif
117
134
  return;
118
135
  }
119
-
136
+
120
137
  SC.Logger.log("Simulating touch events");
121
138
 
122
139
  // Tell the app that we now "speak" touch
@@ -171,7 +188,7 @@ SC.platform = SC.Object.create({
171
188
  When simulating touch events, this method is called when mousemove events
172
189
  are received.
173
190
 
174
- If the altKey is depresed and pinch center not yet established, we will capture the mouse position.
191
+ If the altKey is depressed and pinch center not yet established, we will capture the mouse position.
175
192
  */
176
193
  _simtouch_mousemove: function(evt) {
177
194
  if (!this._mousedown) {
@@ -179,7 +196,7 @@ SC.platform = SC.Object.create({
179
196
  we need to capture when was the first spot that the altKey was pressed and use it as
180
197
  the center point of a pinch
181
198
  */
182
- if(evt.altKey && this._pinchCenter == null) {
199
+ if(evt.altKey && this._pinchCenter === null) {
183
200
  this._pinchCenter = {
184
201
  pageX: evt.pageX,
185
202
  pageY: evt.pageY,
@@ -188,7 +205,7 @@ SC.platform = SC.Object.create({
188
205
  clientX: evt.clientX,
189
206
  clientY: evt.clientY
190
207
  };
191
- } else if(!evt.altKey && this._pinchCenter != null){
208
+ } else if(!evt.altKey && this._pinchCenter !== null){
192
209
  this._pinchCenter = null;
193
210
  }
194
211
  return NO;
@@ -256,7 +273,7 @@ SC.platform = SC.Object.create({
256
273
  /*
257
274
  simulate pinch gesture
258
275
  */
259
- if(evt.altKey && this._pinchCenter != null)
276
+ if(evt.altKey && this._pinchCenter !== null)
260
277
  {
261
278
  //calculate the mirror position of the virtual touch
262
279
  var pageX = this._pinchCenter.pageX + this._pinchCenter.pageX - evt.pageX ,
@@ -316,37 +333,37 @@ SC.platform = SC.Object.create({
316
333
  supportsAcceleratedLayers: NO,
317
334
 
318
335
  /**
319
- Wether the browser supports the hashchange event.
336
+ Whether the browser supports the hashchange event.
320
337
  */
321
338
  supportsHashChange: function() {
322
339
  // Code copied from Modernizr which copied code from YUI (MIT licenses)
323
340
  // documentMode logic from YUI to filter out IE8 Compat Mode which false positives
324
341
  return ('onhashchange' in window) && (document.documentMode === undefined || document.documentMode > 7);
325
342
  }(),
326
-
343
+
327
344
  /**
328
- Wether the browser supports HTML5 history.
345
+ Whether the browser supports HTML5 history.
329
346
  */
330
347
  supportsHistory: function() {
331
348
  return !!(window.history && window.history.pushState);
332
349
  }(),
333
-
350
+
334
351
  supportsCanvas: function() {
335
352
  return !!document.createElement('canvas').getContext;
336
353
  }(),
337
-
354
+
338
355
  supportsOrientationChange: ('onorientationchange' in window),
339
-
356
+
340
357
  /**
341
358
  Because iOS is slow to dispatch the window.onorientationchange event,
342
359
  we use the window size to determine the orientation on iOS devices
343
360
  and desktop environments when SC.platform.touch is YES (ie. when
344
361
  SC.platform.simulateTouchEvents has been called)
345
-
362
+
346
363
  @property {Boolean}
347
364
  @default NO
348
365
  */
349
- windowSizeDeterminesOrientation: SC.browser.iOS || !('onorientationchange' in window)
366
+ windowSizeDeterminesOrientation: SC.browser.os === SC.OS.ios || !('onorientationchange' in window)
350
367
 
351
368
  });
352
369
 
@@ -376,26 +393,29 @@ SC.platform = SC.Object.create({
376
393
  var el = document.createElement("div");
377
394
 
378
395
  // the css and javascript to test
379
- var css_browsers = ["-moz-", "-moz-", "-o-", "-ms-", "-webkit-"];
380
- var test_browsers = ["moz", "Moz", "o", "ms", "webkit"];
396
+ var css_browsers = ["-moz-", "-moz-", "-o-", "-ms-", "-webkit-"],
397
+ test_browsers = ["moz", "Moz", "o", "ms", "webkit"];
381
398
 
382
399
  // prepare css
383
- var css = "", i = null;
384
- for (i = 0; i < css_browsers.length; i++) {
385
- css += css_browsers[i] + "transition:all 1s linear;";
386
- css += css_browsers[i] + "transform: translate(1px, 1px);";
387
- css += css_browsers[i] + "perspective: 500px;";
400
+ var css = "", i = null, cssBrowser, iLen;
401
+ for (i = 0, iLen = css_browsers.length; i < iLen; i++) {
402
+ cssBrowser = css_browsers[i];
403
+ css += cssBrowser + "transition:all 1s linear;";
404
+ css += cssBrowser + "transform: translate(1px, 1px);";
405
+ css += cssBrowser + "perspective: 500px;";
388
406
  }
389
407
 
390
408
  // set css text
391
409
  el.style.cssText = css;
392
410
 
393
411
  // test
394
- for (i = 0; i < test_browsers.length; i++)
412
+ var testBrowser;
413
+ for (i = 0, iLen=test_browsers.length; i < iLen; i++)
395
414
  {
396
- if (el.style[test_browsers[i] + "TransitionProperty"] !== undefined) SC.platform.supportsCSSTransitions = YES;
397
- if (el.style[test_browsers[i] + "Transform"] !== undefined) SC.platform.supportsCSSTransforms = YES;
398
- if (el.style[test_browsers[i] + "Perspective"] !== undefined || el.style[test_browsers[i] + "PerspectiveProperty"] !== undefined) {
415
+ testBrowser = test_browsers[i];
416
+ if (el.style[testBrowser + "TransitionProperty"] !== undefined) SC.platform.supportsCSSTransitions = YES;
417
+ if (el.style[testBrowser + "Transform"] !== undefined) SC.platform.supportsCSSTransforms = YES;
418
+ if (el.style[testBrowser + "Perspective"] !== undefined || el.style[testBrowser + "PerspectiveProperty"] !== undefined) {
399
419
  SC.platform.understandsCSS3DTransforms = YES;
400
420
  SC.platform.supportsCSS3DTransforms = YES;
401
421
  }
@@ -67,12 +67,16 @@ SC.mixin({
67
67
  onReady: {
68
68
  done: function() {
69
69
  if(SC.isReady) return;
70
+
70
71
  SC.isReady = true;
71
72
 
72
73
  SC.RunLoop.begin();
73
74
 
74
75
  SC.Locale.createCurrentLocale();
75
- jQuery("body").addClass(SC.Locale.currentLanguage.toLowerCase());
76
+ var loc = SC.Locale.currentLanguage.toLowerCase();
77
+ jQuery("body").addClass(loc);
78
+
79
+ jQuery("html").attr("lang", loc);
76
80
 
77
81
  jQuery("#loading").remove();
78
82
 
@@ -152,7 +152,7 @@ SC.RenderContext = SC.Builder.create(
152
152
  managed code (such as in CollectionView) can append or prepend content
153
153
  instead.
154
154
 
155
- You probably do not want to change this propery unless you know what you
155
+ You probably do not want to change this property unless you know what you
156
156
  are doing.
157
157
 
158
158
  @property {String}
@@ -307,10 +307,6 @@ SC.RenderContext = SC.Builder.create(
307
307
 
308
308
  cq = this.$();
309
309
 
310
- // console.log('%@#update() called'.fmt(this));
311
- // if (this.length>0) console.log(this.join());
312
- // else console.log('<no length>');
313
-
314
310
  // replace innerHTML
315
311
  if (this.length>0) {
316
312
  this._innerHTMLReplaced = YES;
@@ -329,7 +325,7 @@ SC.RenderContext = SC.Builder.create(
329
325
  }
330
326
  }
331
327
 
332
- // attributes, styles, and class naems will already have been set.
328
+ // attributes, styles, and class names will already have been set.
333
329
 
334
330
  // id="foo"
335
331
  if (this._idDidChange && (value = this._id)) {
@@ -347,9 +343,6 @@ SC.RenderContext = SC.Builder.create(
347
343
 
348
344
  // these are temporary objects are reused by end() to avoid memory allocs.
349
345
  _DEFAULT_ATTRS: {},
350
- _TAG_ARRAY: [],
351
- _JOIN_ARRAY: [],
352
- _STYLE_PAIR_ARRAY: [],
353
346
 
354
347
  /**
355
348
  Ends the current tag editing context. This will generate the tag string
@@ -371,48 +364,41 @@ SC.RenderContext = SC.Builder.create(
371
364
  // generate opening tag.
372
365
 
373
366
  // get attributes first. Copy in className + styles...
374
- var tag = this._TAG_ARRAY, pair, joined, key , value,
367
+ var tag = '', styleStr='', pair, joined, key , value,
375
368
  attrs = this._attrs, className = this._classNames,
376
- id = this._id, styles = this._styles;
369
+ id = this._id, styles = this._styles, strings, selfClosing;
377
370
 
378
371
  // add tag to tag array
379
- tag[0] = '<'; tag[1] = this._tagName ;
372
+ tag = '<' + this._tagName ;
380
373
 
381
374
  // add any attributes...
382
375
  if (attrs || className || styles || id) {
383
376
  if (!attrs) attrs = this._DEFAULT_ATTRS ;
384
377
  if (id) attrs.id = id ;
378
+ // old versions of safari (5.0)!!!! throw an error if we access
379
+ // attrs.class. meh...
385
380
  if (className) attrs['class'] = className.join(' ');
386
381
 
387
382
  // add in styles. note how we avoid memory allocs here to keep things
388
383
  // fast...
389
384
  if (styles) {
390
- joined = this._JOIN_ARRAY ;
391
- pair = this._STYLE_PAIR_ARRAY;
392
385
  for(key in styles) {
393
386
  if(!styles.hasOwnProperty(key)) continue ;
394
387
  value = styles[key];
395
388
  if (value === null) continue; // skip empty styles
396
389
  if (typeof value === SC.T_NUMBER && !SC.NON_PIXEL_PROPERTIES.contains(key)) value += "px";
397
-
398
- pair[0] = this._dasherizeStyleName(key);
399
- pair[1] = value;
400
- joined.push(pair.join(': '));
390
+ styleStr = styleStr + this._dasherizeStyleName(key)+": "+value + "; ";
401
391
  }
402
- attrs.style = joined.join('; ') ;
403
-
404
- // reset temporary object. pair does not need to be reset since it
405
- // is always overwritten
406
- joined.length = 0;
392
+ attrs.style = styleStr;
407
393
  }
408
394
 
409
395
  // now convert attrs hash to tag array...
410
- tag.push(' '); // add space for joining0
396
+ tag = tag + ' '; // add space for joining0
411
397
  for(key in attrs) {
412
398
  if (!attrs.hasOwnProperty(key)) continue ;
413
399
  value = attrs[key];
414
400
  if (value === null) continue ; // skip empty attrs
415
- tag.push(key, '="', value, '" ');
401
+ tag = tag + key + '="' + value + '" ';
416
402
  }
417
403
 
418
404
  // if we are using the DEFAULT_ATTRS temporary object, make sure we
@@ -425,25 +411,20 @@ SC.RenderContext = SC.Builder.create(
425
411
 
426
412
  // this is self closing if there is no content in between and selfClosing
427
413
  // is not set to false.
428
- var strings = this.strings;
429
- var selfClosing = (this._selfClosing === NO) ? NO : (this.length === 1) ;
430
- tag.push(selfClosing ? ' />' : '>') ;
414
+ strings = this.strings;
415
+ selfClosing = (this._selfClosing === NO) ? NO : (this.length === 1) ;
416
+ tag = tag + (selfClosing ? ' />' : '>') ;
431
417
 
432
418
  // console.log('selfClosing == %@'.fmt(selfClosing));
433
- strings[this.offset] = tag.join('');
434
- tag.length = 0 ; // reset temporary object
419
+ strings[this.offset] = tag;
435
420
 
436
421
  // now generate closing tag if needed...
437
422
  if (!selfClosing) {
438
- tag[0] = '</' ;
439
- tag[1] = this._tagName;
440
- tag[2] = '>';
441
- strings.push(tag.join(''));
423
+ strings.push('</' + this._tagName + '>');
442
424
 
443
425
  // increase length of receiver and all parents
444
426
  var c = this;
445
427
  while(c) { c.length++; c = c.prevObject; }
446
- tag.length = 0; // reset temporary object again
447
428
  }
448
429
 
449
430
  // if there was a source element, cleanup to avoid memory leaks
@@ -748,7 +729,8 @@ SC.RenderContext = SC.Builder.create(
748
729
  attr = this.$().attr('style');
749
730
 
750
731
  if (attr && (attr = attr.toString()).length>0) {
751
- if(SC.browser.msie){
732
+ // Ensure attributes are lower case for IE
733
+ if(SC.browser.name === SC.BROWSER.ie) {
752
734
  attr = attr.toLowerCase();
753
735
  }
754
736
  styles = {};
@@ -791,13 +773,14 @@ SC.RenderContext = SC.Builder.create(
791
773
 
792
774
  _deleteComboStyles: function(styles, key) {
793
775
  var comboStyles = SC.COMBO_STYLES[key],
794
- didChange = NO;
776
+ didChange = NO, tmp;
795
777
 
796
778
  if (comboStyles) {
797
- var idx;
798
- for (idx=0; idx < comboStyles.length; idx++) {
799
- if (styles[comboStyles[idx]]) {
800
- delete styles[comboStyles[idx]];
779
+
780
+ for (var idx=0, idxLen = comboStyles.length; idx < idxLen; idx++) {
781
+ tmp = comboStyles[idx];
782
+ if (styles[tmp]) {
783
+ delete styles[tmp];
801
784
  didChange = YES;
802
785
  }
803
786
  }
@@ -941,6 +924,22 @@ SC.RenderContext = SC.Builder.create(
941
924
  return this ;
942
925
  },
943
926
 
927
+ /**
928
+ Sets the named attribute on the tag. Note that if you set the 'class'
929
+ attribute or the 'styles' attribute, it will be ignored. Use the
930
+ relevant class name and style methods instead.
931
+
932
+ @param {String|Hash} nameOrAttrs the attr name or hash of attrs.
933
+ @param {String} value attribute value if attribute name was passed
934
+ @returns {SC.RenderContext} receiver
935
+ */
936
+ removeAttr: function(name) {
937
+ if (this._elem) {
938
+ this.$().removeAttr(name);
939
+ return this;
940
+ }
941
+ },
942
+
944
943
  //
945
944
  // COREQUERY SUPPORT
946
945
  //
@@ -985,7 +984,7 @@ SC.RenderContext = SC.Builder.create(
985
984
  });
986
985
 
987
986
  /**
988
- html is an alias for push(). Makes thie object more CoreQuery like
987
+ html is an alias for push(). Makes the object more CoreQuery like
989
988
  */
990
989
  SC.RenderContext.fn.html = SC.RenderContext.fn.push;
991
990
 
@@ -994,38 +993,23 @@ SC.RenderContext.fn.html = SC.RenderContext.fn.push;
994
993
  */
995
994
  SC.RenderContext.fn.css = SC.RenderContext.fn.addStyle;
996
995
 
996
+ (function() {
997
+ var _escapeHTMLRegex = /[&<>]/g, _escapeHTMLMethod = function(match) {
998
+ switch(match) {
999
+ case '&': return '&amp;';
1000
+ case '<': return '&lt;';
1001
+ case '>': return '&gt;';
1002
+ }
1003
+ };
1004
+
997
1005
  /**
998
1006
  Helper method escapes the passed string to ensure HTML is displayed as
999
1007
  plain text. You should make sure you pass all user-entered data through
1000
1008
  this method to avoid errors. You can also do this with the text() helper
1001
1009
  method on a render context.
1002
1010
  */
1003
-
1004
-
1005
- if (!SC.browser.isSafari || parseInt(SC.browser.version, 10) < 526) {
1006
- SC.RenderContext._safari3 = YES;
1007
- }
1008
-
1009
1011
  SC.RenderContext.escapeHTML = function(text) {
1010
- var elem, node, ret ;
1011
-
1012
- if (SC.none(text)) { return text; } // ignore empty
1013
-
1014
- elem = this.escapeHTMLElement;
1015
- if (!elem) { elem = this.escapeHTMLElement = document.createElement('div'); }
1016
-
1017
- node = this.escapeTextNode;
1018
- if (!node) {
1019
- node = this.escapeTextNode = document.createTextNode('');
1020
- elem.appendChild(node);
1021
- }
1022
-
1023
- node.data = text ;
1024
- ret = elem.innerHTML ;
1025
-
1026
- // Safari 3 does not escape the '>' character
1027
- if (SC.RenderContext._safari3) { ret = ret.replace(/>/g, '&gt;'); }
1028
-
1029
- node = elem = null;
1030
- return ret ;
1012
+ if (!text) return '';
1013
+ return text.replace(_escapeHTMLRegex, _escapeHTMLMethod);
1031
1014
  };
1015
+ })();
@@ -59,7 +59,7 @@ SC.Responder = SC.Object.extend( /** @scope SC.Responder.prototype */ {
59
59
  hasFirstResponder: NO,
60
60
 
61
61
  /** @property
62
- Set to YES if your view is willing to accept first responder status. This is used when calculcating key responder loop.
62
+ Set to YES if your view is willing to accept first responder status. This is used when calculating key responder loop.
63
63
  */
64
64
  acceptsFirstResponder: YES,
65
65
 
@@ -52,7 +52,7 @@ SC.RootResponder = SC.Object.extend(
52
52
  /** @scope SC.RootResponder.prototype */{
53
53
 
54
54
  /**
55
- Contains a list of all panes currently visible on screen. Everytime a
55
+ Contains a list of all panes currently visible on screen. Every time a
56
56
  pane attaches or detaches, it will update itself in this array.
57
57
  */
58
58
  panes: null,
@@ -224,8 +224,9 @@ SC.RootResponder = SC.Object.extend(
224
224
  previousKeyPanes = this.get('previousKeyPanes') ;
225
225
 
226
226
  newKeyPane = null ;
227
+ var candidate;
227
228
  while (previousKeyPanes.length > 0) {
228
- var candidate = previousKeyPanes.pop();
229
+ candidate = previousKeyPanes.pop();
229
230
  if (candidate.get('isPaneAttached') && candidate.get('acceptsKeyPane')) {
230
231
  newKeyPane = candidate ;
231
232
  break ;
@@ -343,17 +344,19 @@ SC.RootResponder = SC.Object.extend(
343
344
  Handle window focus. Change hasFocus and add sc-focus CSS class
344
345
  (removing sc-blur). Also notify panes.
345
346
  */
346
- focus: function() {
347
+ focus: function(evt) {
347
348
 
348
349
  if (!this.get('hasFocus')) {
349
350
  SC.$('body').addClass('sc-focus').removeClass('sc-blur');
350
351
 
351
352
  // If the app is getting focus again set the first responder to the first
352
353
  // valid firstResponder view in the view's tree
353
- if(!SC.TABBING_ONLY_INSIDE_DOCUMENT){
354
- var mainPane = this.get('mainPane'),
355
- nextValidKeyView = mainPane ? mainPane.get('nextValidKeyView') : null;
356
- if (nextValidKeyView) mainPane.makeFirstResponder(nextValidKeyView);
354
+ if(!SC.TABBING_ONLY_INSIDE_DOCUMENT && !SC.browser.isIE8OrLower){
355
+ var keyPane = SC.RootResponder.responder.get('keyPane');
356
+ if (keyPane) {
357
+ var nextValidKeyView = keyPane.get('nextValidKeyView');
358
+ if (nextValidKeyView) keyPane.makeFirstResponder(nextValidKeyView);
359
+ }
357
360
  }
358
361
 
359
362
  SC.run(function() {
@@ -365,20 +368,22 @@ SC.RootResponder = SC.Object.extend(
365
368
 
366
369
  /**
367
370
  Handle window focus event for IE. Listening to the focus event is not
368
- reliable as per every focus event you receive you inmediately get a blur
371
+ reliable as per every focus event you receive you immediately get a blur
369
372
  event (Only on IE of course ;)
370
373
  */
371
- focusin: function() {
372
- this.focus();
374
+ focusin: function(evt) {
375
+ if(this._focusTimeout) clearTimeout(this._focusTimeout);
376
+ this.focus(evt);
373
377
  },
374
378
 
375
379
  /**
376
380
  Handle window blur event for IE. Listening to the focus event is not
377
- reliable as per every focus event you receive you inmediately get a blur
381
+ reliable as per every focus event you receive you immediately get a blur
378
382
  event (Only on IE of course ;)
379
383
  */
380
- focusout: function() {
381
- this.blur();
384
+ focusout: function(evt) {
385
+ var that = this;
386
+ this._focusTimeout = setTimeout(function(){that.blur(evt);}, 300);
382
387
  },
383
388
 
384
389
 
@@ -386,7 +391,7 @@ SC.RootResponder = SC.Object.extend(
386
391
  Handle window focus. Change hasFocus and add sc-focus CSS class (removing
387
392
  sc-blur). Also notify panes.
388
393
  */
389
- blur: function() {
394
+ blur: function(evt) {
390
395
  if (this.get('hasFocus')) {
391
396
  SC.$('body').addClass('sc-blur').removeClass('sc-focus');
392
397
 
@@ -631,7 +636,7 @@ SC.RootResponder = SC.Object.extend(
631
636
  this.listenFor(['keydown', 'keyup', 'beforedeactivate', 'mousedown', 'mouseup', 'click', 'dblclick', 'mousemove', 'selectstart', 'contextmenu'], document)
632
637
  .listenFor(['resize'], window);
633
638
 
634
- if(SC.browser.msie) this.listenFor('focusin focusout'.w(), document);
639
+ if(SC.browser.isIE8OrLower) this.listenFor(['focusin', 'focusout'], document);
635
640
  else this.listenFor(['focus', 'blur'], window);
636
641
 
637
642
  // handle animation events
@@ -642,26 +647,27 @@ SC.RootResponder = SC.Object.extend(
642
647
  this.listenFor(['transitionend', SC.platform.cssPrefix+'TransitionEnd'], document);
643
648
  }
644
649
 
645
- // handle special case for keypress- you can't use normal listener to block the backspace key on Mozilla
650
+ // handle special case for keypress- you can't use normal listener to block
651
+ // the backspace key on Mozilla
646
652
  if (this.keypress) {
647
- if (SC.CAPTURE_BACKSPACE_KEY && SC.browser.mozilla) {
653
+ if (SC.CAPTURE_BACKSPACE_KEY && SC.browser.isMozilla) {
648
654
  var responder = this ;
649
655
  document.onkeypress = function(e) {
650
656
  e = SC.Event.normalizeEvent(e);
651
657
  return responder.keypress.call(responder, e);
652
658
  };
653
659
 
654
- // SC.Event.add(window, 'unload', this, function() { document.onkeypress = null; }); // be sure to cleanup memory leaks
655
-
656
660
  // Otherwise, just add a normal event handler.
657
- } else SC.Event.add(document, 'keypress', this, this.keypress);
661
+ } else {
662
+ SC.Event.add(document, 'keypress', this, this.keypress);
663
+ }
658
664
  }
659
665
 
660
666
  // handle these two events specially in IE
661
667
  ['drag', 'selectstart'].forEach(function(keyName) {
662
668
  var method = this[keyName] ;
663
669
  if (method) {
664
- if (SC.browser.msie) {
670
+ if (SC.browser.isIE) {
665
671
  var responder = this ;
666
672
  document.body['on' + keyName] = function(e) {
667
673
  // return method.call(responder, SC.Event.normalizeEvent(e));
@@ -682,9 +688,9 @@ SC.RootResponder = SC.Object.extend(
682
688
  var mousewheel = 'mousewheel';
683
689
 
684
690
  // Firefox emits different mousewheel events than other browsers
685
- if (SC.browser.mozilla) {
686
- // For Firefox <3.5, subscribe to DOMMouseScroll events
687
- if (SC.browser.compareVersion(1,9,1) < 0) {
691
+ if (SC.browser.isMozilla) {
692
+ // For Firefox < 3.5, subscribe to DOMMouseScroll events
693
+ if (SC.browser.compare(SC.browser.engineVersion, '1.9.1') < 0) {
688
694
  mousewheel = 'DOMMouseScroll';
689
695
 
690
696
  // For Firefox 3.5 and greater, we can listen for MozMousePixelScroll,
@@ -699,7 +705,8 @@ SC.RootResponder = SC.Object.extend(
699
705
  // do some initial set
700
706
  this.set('currentWindowSize', this.computeWindowSize()) ;
701
707
 
702
- if (SC.browser.mobileSafari) {
708
+ // TODO: Is this workaround still valid?
709
+ if (SC.browser.os === SC.OS.ios && SC.browser.name === SC.BROWSER.safari) {
703
710
 
704
711
  // If the browser is identifying itself as a touch-enabled browser, but
705
712
  // touch events are not present, assume this is a desktop browser doing
@@ -757,28 +764,7 @@ SC.RootResponder = SC.Object.extend(
757
764
  // move element back into document...
758
765
  pen.appendChild(target);
759
766
 
760
- // // In MobileSafari, our target can sometimes
761
- // // be a text node, so make sure we handle that case.
762
- // textNode = (target.nodeType === 3);
763
- //
764
- // if (textNode && target.parentElement) {
765
- // // Hide the text node's parent element if it has one
766
- // target = target.parentElement;
767
- // target.style.display = 'none';
768
- // } else if (textNode) {
769
- // // We have a text node with no containing element,
770
- // // so just erase its text content.
771
- // target.nodeValue = '';
772
- // } else {
773
- // // Standard Element, just toggle its display off.
774
- // target.style.display = 'none';
775
- // }
776
- //
777
- // // Now move the captured and hidden element back to the DOM.
778
- // document.body.appendChild(target);
779
-
780
- // ...and save the element to be garbage collected on
781
- // touchEnd.
767
+ // ...and save the element to be garbage collected on touchEnd.
782
768
  touches[touch]._rescuedElement = target;
783
769
  }
784
770
  }
@@ -788,17 +774,14 @@ SC.RootResponder = SC.Object.extend(
788
774
  }
789
775
  },
790
776
 
791
- // ................................................................................
777
+ // ...........................................................................
792
778
  // TOUCH SUPPORT
793
779
  //
794
780
  /*
795
- This touch support is written to meet the following specifications. They are actually
796
- simple, but I decided to write out in great detail all of the rules so there would
797
- be no confusion.
781
+ There are three events: touchStart, touchEnd and touchesDragged.
798
782
 
799
- There are three events: touchStart, touchEnd, touchDragged. touchStart and End are called
800
- individually for each touch. touchDragged events are sent to whatever view owns the touch
801
- event
783
+ The touchStart and touchEnd events are called individually for each touch.
784
+ The touchesDragged events are sent to whichever view owns the touch event.
802
785
  */
803
786
 
804
787
  /**
@@ -1266,6 +1249,11 @@ SC.RootResponder = SC.Object.extend(
1266
1249
  @returns {Boolean}
1267
1250
  */
1268
1251
  touchstart: function(evt) {
1252
+ // Starting iOS5 touch events are handled by textfields.
1253
+ // As a workaround just let the browser to use the default behavior.
1254
+ if(this.ignoreTouchHandle(evt)) return YES;
1255
+
1256
+
1269
1257
  var hidingTouchIntercept = NO;
1270
1258
 
1271
1259
  SC.run(function() {
@@ -1329,6 +1317,10 @@ SC.RootResponder = SC.Object.extend(
1329
1317
  used to keep track of when a specific type of touch event was last handled, to see if it needs to be re-handled
1330
1318
  */
1331
1319
  touchmove: function(evt) {
1320
+ // Starting iOS5 touch events are handled by textfields.
1321
+ // As a workaround just let the browser to use the default behavior.
1322
+ if(this.ignoreTouchHandle(evt)) return YES;
1323
+
1332
1324
  SC.run(function() {
1333
1325
  // pretty much all we gotta do is update touches, and figure out which views need updating.
1334
1326
  var touches = evt.changedTouches, touch, touchEntry,
@@ -1423,6 +1415,10 @@ SC.RootResponder = SC.Object.extend(
1423
1415
  touchend: function(evt) {
1424
1416
  var hidesTouchIntercept = NO;
1425
1417
 
1418
+ // Starting iOS5 touch events are handled by textfields.
1419
+ // As a workaround just let the browser to use the default behavior.
1420
+ if(this.ignoreTouchHandle(evt)) return YES;
1421
+
1426
1422
  SC.run(function() {
1427
1423
  var touches = evt.changedTouches, touch, touchEntry,
1428
1424
  idx, len = touches.length,
@@ -1485,6 +1481,21 @@ SC.RootResponder = SC.Object.extend(
1485
1481
  this.touchend(evt);
1486
1482
  },
1487
1483
 
1484
+ /** @private
1485
+ Ignore Touch events on textfields and links. starting iOS 5 textfields
1486
+ get touch events. Textfields just need to get the default focus action.
1487
+ */
1488
+ ignoreTouchHandle: function(evt) {
1489
+ if(SC.browser.isMobileSafari){
1490
+ var tag = evt.target.tagName;
1491
+ if(tag==="INPUT" || tag==="A"){
1492
+ evt.allowDefault();
1493
+ return YES;
1494
+ }
1495
+ }
1496
+ return NO;
1497
+ },
1498
+
1488
1499
  // ..........................................................
1489
1500
  // KEYBOARD HANDLING
1490
1501
  //
@@ -1578,11 +1589,16 @@ SC.RootResponder = SC.Object.extend(
1578
1589
 
1579
1590
  All actions that might cause an actual insertion of text are handled in
1580
1591
  the keypress event.
1592
+
1593
+ References:
1594
+ http://www.quirksmode.org/js/keys.html
1595
+ https://developer.mozilla.org/en/DOM/KeyboardEvent
1596
+ http://msdn.microsoft.com/library/ff974342.aspx
1581
1597
  */
1582
1598
  keydown: function(evt) {
1583
1599
  if (SC.none(evt)) return YES;
1584
1600
  var keyCode = evt.keyCode;
1585
- if(SC.browser.mozilla && evt.keyCode===9){
1601
+ if(SC.browser.isMozilla && evt.keyCode===9){
1586
1602
  this.keydownCounter=1;
1587
1603
  }
1588
1604
  // Fix for IME input (japanese, mandarin).
@@ -1603,7 +1619,7 @@ SC.RootResponder = SC.Object.extend(
1603
1619
  }
1604
1620
 
1605
1621
  // Firefox does NOT handle delete here...
1606
- if (SC.browser.mozilla && (evt.which === 8)) return true ;
1622
+ if (SC.browser.isMozilla && (evt.which === 8)) return true ;
1607
1623
 
1608
1624
  // modifier keys are handled separately by the 'flagsChanged' event
1609
1625
  // send event for modifier key changes, but only stop processing if this
@@ -1624,7 +1640,7 @@ SC.RootResponder = SC.Object.extend(
1624
1640
  // processing.
1625
1641
 
1626
1642
  // Arrow keys are handled in keypress for firefox
1627
- if (keyCode>=37 && keyCode<=40 && SC.browser.mozilla) return YES;
1643
+ if (keyCode>=37 && keyCode<=40 && SC.browser.isMozilla) return YES;
1628
1644
 
1629
1645
 
1630
1646
  ret = this.sendEvent('keyDown', evt) ;
@@ -1652,9 +1668,9 @@ SC.RootResponder = SC.Object.extend(
1652
1668
  keypress: function(evt) {
1653
1669
  var ret,
1654
1670
  keyCode = evt.keyCode,
1655
- isFirefox = !!SC.browser.mozilla;
1671
+ isFirefox = SC.browser.isMozilla;
1656
1672
 
1657
- if(SC.browser.mozilla && evt.keyCode===9){
1673
+ if(isFirefox && evt.keyCode===9){
1658
1674
  this.keydownCounter++;
1659
1675
  if(this.keydownCounter==2) return YES;
1660
1676
  }
@@ -1672,7 +1688,10 @@ SC.RootResponder = SC.Object.extend(
1672
1688
  charCode = evt.charCode;
1673
1689
  if ((charCode !== undefined && charCode === 0 && evt.keyCode!==9) && !isFirefoxArrowKeys) return YES;
1674
1690
  if (isFirefoxArrowKeys) evt.which = keyCode;
1675
- return this.sendEvent('keyDown', evt) ? evt.hasCustomEventHandling:YES;
1691
+
1692
+ // we only want to rethrow if this is a printable key so that we don't
1693
+ // duplicate the event sent in keydown when a modifier key is pressed
1694
+ if(isFirefoxArrowKeys || !this._isFunctionOrNonPrintableKey(evt)) return this.sendEvent('keyDown', evt) ? evt.hasCustomEventHandling:YES;
1676
1695
  }
1677
1696
  },
1678
1697
 
@@ -1698,7 +1717,7 @@ SC.RootResponder = SC.Object.extend(
1698
1717
  IE's default behavior to blur textfields and other controls can only be
1699
1718
  blocked by returning NO to this event. However we don't want to block
1700
1719
  its default behavior otherwise textfields won't lose focus by clicking on
1701
- an empty area as it's expected. If you want to block IE from bluring another
1720
+ an empty area as it's expected. If you want to block IE from blurring another
1702
1721
  control set blockIEDeactivate to true on the specific view in which you
1703
1722
  want to avoid this. Think of an autocomplete menu, you want to click on
1704
1723
  the menu but don't loose focus.
@@ -1707,7 +1726,7 @@ SC.RootResponder = SC.Object.extend(
1707
1726
  var toElement = evt.toElement;
1708
1727
  if (toElement && toElement.tagName && toElement.tagName!=="IFRAME") {
1709
1728
  var view = SC.$(toElement).view()[0];
1710
- //The following line is neccesary to allow/block text selection for IE,
1729
+ //The following line is necessary to allow/block text selection for IE,
1711
1730
  // in combination with the selectstart event.
1712
1731
  if (view && view.get('blocksIEDeactivate')) return NO;
1713
1732
  }
@@ -1719,6 +1738,8 @@ SC.RootResponder = SC.Object.extend(
1719
1738
  //
1720
1739
 
1721
1740
  mousedown: function(evt) {
1741
+ var fr;
1742
+
1722
1743
  if (SC.platform.touch) {
1723
1744
  evt.allowDefault();
1724
1745
  this._lastMouseDownCustomHandling = YES;
@@ -1742,7 +1763,7 @@ SC.RootResponder = SC.Object.extend(
1742
1763
  this._lastMouseDownX = evt.clientX ;
1743
1764
  this._lastMouseDownY = evt.clientY ;
1744
1765
 
1745
- var fr, view = this.targetViewForEvent(evt) ;
1766
+ var view = this.targetViewForEvent(evt);
1746
1767
 
1747
1768
  // InlineTextField needs to loose firstResponder whenever you click outside
1748
1769
  // the view. This is a special case as textfields are not supposed to loose
@@ -1751,10 +1772,12 @@ SC.RootResponder = SC.Object.extend(
1751
1772
 
1752
1773
  if(view) fr=view.getPath('pane.firstResponder');
1753
1774
 
1754
- if(fr && fr.kindOf(SC.InlineTextFieldView) && fr!==view){
1755
- fr.resignFirstResponder();
1775
+ // some fields like SC.InlineTextFieldView need to blur on any click, even
1776
+ // if it's not on a control that can be focused
1777
+ // TODO: remove this when focus behavior is improved
1778
+ if(fr && fr.get('blurOnMouseDown') && fr!==view){
1779
+ fr.resignFirstResponder(evt);
1756
1780
  }
1757
-
1758
1781
  view = this._mouseDownView = this.sendEvent('mouseDown', evt, view) ;
1759
1782
  if (view && view.respondsTo('mouseDragged')) this._mouseCanDrag = YES ;
1760
1783
 
@@ -1775,6 +1798,7 @@ SC.RootResponder = SC.Object.extend(
1775
1798
  sent.
1776
1799
  */
1777
1800
  mouseup: function(evt) {
1801
+ var clickOrDoubleClickDidTrigger=NO;
1778
1802
  if (SC.platform.touch) {
1779
1803
  evt.allowDefault();
1780
1804
  this._lastMouseUpCustomHandling = YES;
@@ -1800,16 +1824,18 @@ SC.RootResponder = SC.Object.extend(
1800
1824
  // try doubleClick
1801
1825
  if (!handler && (this._clickCount === 2)) {
1802
1826
  handler = this.sendEvent('doubleClick', evt, view) ;
1827
+ clickOrDoubleClickDidTrigger = YES;
1803
1828
  }
1804
1829
 
1805
1830
  // try single click
1806
1831
  if (!handler) {
1807
1832
  handler = this.sendEvent('click', evt, view) ;
1833
+ clickOrDoubleClickDidTrigger = YES;
1808
1834
  }
1809
1835
  }
1810
1836
 
1811
1837
  // try whoever's under the mouse if we haven't handle the mouse up yet
1812
- if (!handler) {
1838
+ if (!handler && !clickOrDoubleClickDidTrigger) {
1813
1839
 
1814
1840
  // try doubleClick
1815
1841
  if (this._clickCount === 2) {
@@ -1859,7 +1885,7 @@ SC.RootResponder = SC.Object.extend(
1859
1885
  },
1860
1886
 
1861
1887
  dblclick: function(evt){
1862
- if (SC.browser.isIE) {
1888
+ if (SC.browser.isIE8OrLower) {
1863
1889
  this._clickCount = 2;
1864
1890
  // this._onmouseup(evt);
1865
1891
  this.mouseup(evt);
@@ -1890,7 +1916,7 @@ SC.RootResponder = SC.Object.extend(
1890
1916
  return YES;
1891
1917
  }
1892
1918
 
1893
- if (SC.browser.msie) {
1919
+ if (SC.browser.isIE) {
1894
1920
  if (this._lastMoveX === evt.clientX && this._lastMoveY === evt.clientY) return;
1895
1921
  }
1896
1922
 
@@ -1900,14 +1926,14 @@ SC.RootResponder = SC.Object.extend(
1900
1926
  this._lastMoveY = evt.clientY;
1901
1927
 
1902
1928
  SC.run(function() {
1903
- // make sure the view gets focus no matter what. FF is inconsistant
1929
+ // make sure the view gets focus no matter what. FF is inconsistent
1904
1930
  // about this.
1905
1931
  // this.focus();
1906
1932
  // only do mouse[Moved|Entered|Exited|Dragged] if not in a drag session
1907
1933
  // drags send their own events, e.g. drag[Moved|Entered|Exited]
1908
1934
  if (this._drag) {
1909
1935
  //IE triggers mousemove at the same time as mousedown
1910
- if(SC.browser.msie){
1936
+ if(SC.browser.isIE){
1911
1937
  if (this._lastMouseDownX !== evt.clientX || this._lastMouseDownY !== evt.clientY) {
1912
1938
  this._drag.tryToPerform('mouseDragged', evt);
1913
1939
  }
@@ -1954,7 +1980,7 @@ SC.RootResponder = SC.Object.extend(
1954
1980
  // also, if a mouseDownView exists, call the mouseDragged action, if
1955
1981
  // it exists.
1956
1982
  if (this._mouseDownView) {
1957
- if(SC.browser.msie){
1983
+ if(SC.browser.isIE){
1958
1984
  if (this._lastMouseDownX !== evt.clientX && this._lastMouseDownY !== evt.clientY) {
1959
1985
  this._mouseDownView.tryToPerform('mouseDragged', evt);
1960
1986
  }