sproutcore 1.7.1.beta → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -250,6 +250,15 @@ SC.ListItemView = SC.View.extend(SC.InlineEditable, SC.Control,
250
250
  */
251
251
  validator: null,
252
252
 
253
+ contentKeys: {
254
+ contentValueKey: 'title',
255
+ contentCheckboxKey: 'checkbox',
256
+ contentIconKey: 'icon',
257
+ contentRightIconKey: 'rightIcon',
258
+ contentUnreadCountKey: 'count',
259
+ contentIsBranchKey: 'branch'
260
+ },
261
+
253
262
  /** @private */
254
263
  contentPropertyDidChange: function() {
255
264
  //if (this.get('isEditing')) this.discardEditing() ;
@@ -292,7 +301,7 @@ SC.ListItemView = SC.View.extend(SC.InlineEditable, SC.Control,
292
301
  },
293
302
 
294
303
  /** @private
295
- Determines if the event occured inside an element with the specified
304
+ Determines if the event occurred inside an element with the specified
296
305
  classname or not.
297
306
  */
298
307
  _isInsideElementWithClassName: function(className, evt) {
@@ -393,7 +402,7 @@ SC.ListItemView = SC.View.extend(SC.InlineEditable, SC.Control,
393
402
  this._removeCheckboxActiveState() ;
394
403
  ret = YES ;
395
404
 
396
- // if mouse as down on disclosure -- handle mosue up. otherwise pass on
405
+ // if mouse as down on disclosure -- handle mouse up. otherwise pass on
397
406
  // to parent.
398
407
  } else if (this._isMouseDownOnDisclosure) {
399
408
  if (this._isInsideDisclosure(evt)) {
@@ -56,7 +56,7 @@ SC.MenuItemView = SC.View.extend(SC.ContentDisplay,
56
56
  acceptsFirstResponder: YES,
57
57
 
58
58
  /**
59
- IE only attribute to block bluring of other controls
59
+ IE only attribute to block blurring of other controls
60
60
 
61
61
  @type Boolean
62
62
  @default YES
@@ -289,7 +289,7 @@ SC.MenuItemView = SC.View.extend(SC.ContentDisplay,
289
289
 
290
290
  /**
291
291
  This method will check whether the current Menu Item is still
292
- selected and then create a submenu accordignly.
292
+ selected and then create a submenu accordingly.
293
293
  */
294
294
  showSubMenu: function() {
295
295
  var subMenu = this.get('subMenu') ;
@@ -189,7 +189,7 @@ SC.MenuScrollerView = SC.ScrollerView.extend(
189
189
  /**
190
190
  This function overrides the default function in SC.Scroller.
191
191
  SC.MenuScroller and SC.MenuScroll use valueBinding so this function is
192
- not neccesary.
192
+ not necessary.
193
193
  */
194
194
  _sc_scroller_valueDidChange: function() {}.observes('value'),
195
195
 
@@ -258,7 +258,7 @@ SC.MenuScrollerView = SC.ScrollerView.extend(
258
258
  _invokeScrollOnMouseOver: function(){
259
259
  this._scrollMenu();
260
260
  if(this.get('isMouseOver')){
261
- this.invokeLater(this._invokeScrollOnMouseOver, 100);
261
+ this.invokeLater(this._invokeScrollOnMouseOver, 50);
262
262
  }
263
263
  }
264
264
 
@@ -394,7 +394,7 @@ SC.MenuScrollView = SC.ScrollView.extend(
394
394
  autohidesHorizontalScroller: NO,
395
395
 
396
396
  /**
397
- YES if the view shuld maintain a vertical scroller. This property must
397
+ YES if the view should maintain a vertical scroller. This property must
398
398
  be set when the view is created.
399
399
 
400
400
  @type Boolean
@@ -647,7 +647,7 @@ SC.MenuScrollView = SC.ScrollView.extend(
647
647
 
648
648
  /** @private
649
649
  Invoked whenever the contentView's frame changes. This will update the
650
- scroller maxmimum and optionally update the scroller visibility if the
650
+ scroller maximum and optionally update the scroller visibility if the
651
651
  size of the contentView changes. We don't care about the origin since
652
652
  that is tracked separately from the offset values.
653
653
  */
@@ -695,7 +695,7 @@ SC.MenuScrollView = SC.ScrollView.extend(
695
695
 
696
696
  // update the offset for the contentView...
697
697
  var contentView = this.get('contentView');
698
- if (contentView) contentView.adjust('top', 0-offset) ;
698
+ if (contentView) contentView.$().css('top', (0-offset) + "px");
699
699
 
700
700
  }.observes('verticalScrollOffset')
701
701
 
@@ -188,28 +188,34 @@ SC.PopupButtonView = SC.ButtonView.extend(
188
188
 
189
189
  this._action() ;
190
190
 
191
- // Store the current timestamp. We register the timestamp at the end of
192
- // the runloop so that the menu has been rendered, in case that operation
191
+ // Store the current timestamp. We register the timestamp after a setTimeout
192
+ // so that the menu has been rendered, in case that operation
193
193
  // takes more than a few hundred milliseconds.
194
194
 
195
195
  // One mouseUp, we'll use this value to determine how long the mouse was
196
196
  // pressed.
197
- this.invokeLast(this._recordMouseDownTimestamp);
197
+
198
+ // we need to keep track that we opened it just now in case we get the
199
+ // mouseUp before render finishes. If it is 0, then we know we have not
200
+ // waited long enough.
201
+ this._menuRenderedTimestamp = 0;
202
+
203
+ var self = this;
204
+
205
+ // setTimeout guarantees that all rendering is done. The browser will even
206
+ // have rendered by this point.
207
+ setTimeout(function() {
208
+ SC.run(function(){
209
+ // a run loop might be overkill here but what if Date.now fails?
210
+ self._menuRenderedTimestamp = Date.now();
211
+ });
212
+ }, 1);
198
213
 
199
214
  this.becomeFirstResponder();
200
215
 
201
216
  return YES ;
202
217
  },
203
218
 
204
- /** @private
205
- Records the current timestamp. This is invoked at the end of the runloop
206
- by mouseDown. We use this value to determine the delay between mouseDown
207
- and mouseUp.
208
- */
209
- _recordMouseDownTimestamp: function() {
210
- this._menuRenderedTimestamp = new Date().getTime();
211
- },
212
-
213
219
  /** @private
214
220
  Because we responded YES to the mouseDown event, we have responsibility
215
221
  for handling the corresponding mouseUp event.
@@ -232,6 +238,10 @@ SC.PopupButtonView = SC.ButtonView.extend(
232
238
  menu = this.get('instantiatedMenu'),
233
239
  touch = SC.platform.touch,
234
240
  targetMenuItem;
241
+
242
+ // normalize the previousTimestamp: if it is 0, it might as well be now.
243
+ // 0 means that we have not even triggered the nearly-immediate saving of timestamp.
244
+ if (previousTimestamp === 0) previousTimestamp = Date.now();
235
245
 
236
246
  if (menu) {
237
247
  // Get the menu item the user is currently hovering their mouse over
@@ -180,7 +180,7 @@ SC.RadioView = SC.View.extend(SC.Control,
180
180
  /**
181
181
  If items property is a hash, specify which property will function as
182
182
  the item width with this itemWidthKey property. This is only used when
183
- layoutDirection is set to SC.LAYOUT_HORIONZTAL and can be used to override
183
+ layoutDirection is set to SC.LAYOUT_HORIZONTAL and can be used to override
184
184
  the default value provided by the framework or theme CSS.
185
185
 
186
186
  @type String
@@ -304,7 +304,7 @@ SC.RadioView = SC.View.extend(SC.Control,
304
304
  ariaLabel = item.get ? item.get(ariaLabelKey) : item[ariaLabelKey];
305
305
  } else ariaLabel = null;
306
306
 
307
- // if item is nil, use somedefaults...
307
+ // if item is nil, use some defaults...
308
308
  } else {
309
309
  title = value = icon = null;
310
310
  isEnabled = NO;
@@ -356,8 +356,11 @@ SC.RadioView = SC.View.extend(SC.Control,
356
356
  this._activeRadioButton = index;
357
357
 
358
358
  if (index !== undefined) {
359
- this.get('displayItems')[index].set('isActive', YES);
360
- delegate.updateRadioAtIndex(proxy, elem, index);
359
+ var item = this.get('displayItems')[index];
360
+ if (item.get('isEnabled')) {
361
+ item.set('isActive', YES);
362
+ delegate.updateRadioAtIndex(proxy, elem, index);
363
+ }
361
364
  }
362
365
 
363
366
  // even if radiobuttons are not set to get firstResponder, allow default
@@ -387,9 +390,12 @@ SC.RadioView = SC.View.extend(SC.Control,
387
390
  this._activeRadioButton = undefined;
388
391
 
389
392
  if (index !== undefined) {
390
- displayItems[index].set('isActive', NO);
391
- delegate.updateRadioAtIndex(proxy, elem, index);
392
- this.set('value', displayItems[index].value);
393
+ var item = this.get('displayItems')[index];
394
+ if (item.get('isEnabled')) {
395
+ item.set('isActive', NO);
396
+ delegate.updateRadioAtIndex(proxy, elem, index);
397
+ this.set('value', item.value);
398
+ }
393
399
  }
394
400
 
395
401
  evt.allowDefault();
@@ -34,7 +34,7 @@ SC.SceneView = SC.ContainerView.extend(
34
34
 
35
35
  /**
36
36
  Array of scene names. Scenes will slide on and off screen in the order
37
- that you specifiy them here. That is, if you shift from a scene at index
37
+ that you specify them here. That is, if you shift from a scene at index
38
38
  2 to a scene at index 1, the scenes will animation backwards. If you
39
39
  shift to a scene at index 3, the scenes will animate forwards.
40
40
 
@@ -46,7 +46,7 @@ SC.SceneView = SC.ContainerView.extend(
46
46
  /**
47
47
  The currently showing scene. Changing this property will cause the
48
48
  scene view to transition to the new scene. If you set this property to
49
- null, an empty string, or a non-existant scene, then the scene will appear
49
+ null, an empty string, or a non-existent scene, then the scene will appear
50
50
  empty.
51
51
 
52
52
  @type String
@@ -24,14 +24,14 @@ SC.FAST_SCROLL_DECELERATION = 0.85;
24
24
  /** @class
25
25
  Implements a complete scroll view. This class uses a manual implementation
26
26
  of scrollers in order to properly support clipping frames.
27
-
27
+
28
28
  Important Events:
29
-
29
+
30
30
  - contentView frame size changes (to autoshow/hide scrollbar - adjust scrollbar size)
31
31
  - horizontalScrollOffset change
32
32
  - verticalScrollOffsetChanges
33
33
  - scroll wheel events
34
-
34
+
35
35
  @extends SC.View
36
36
  @since SproutCore 1.0
37
37
  */
@@ -47,44 +47,44 @@ SC.ScrollView = SC.View.extend({
47
47
 
48
48
  // ..........................................................
49
49
  // PROPERTIES
50
- //
51
-
50
+ //
51
+
52
52
  /**
53
53
  Walk like a duck
54
-
54
+
55
55
  @type Boolean
56
56
  @default YES
57
57
  @readOnly
58
58
  */
59
59
  isScrollable: YES,
60
-
61
- /**
60
+
61
+ /**
62
62
  The content view you want the scroll view to manage. This will be assigned to the contentView of the clipView also.
63
-
63
+
64
64
  @type SC.View
65
65
  @default null
66
66
  */
67
67
  contentView: null,
68
-
68
+
69
69
  /**
70
70
  The horizontal alignment for non-filling content inside of the ScrollView. Possible values:
71
-
71
+
72
72
  - SC.ALIGN_LEFT
73
73
  - SC.ALIGN_RIGHT
74
74
  - SC.ALIGN_CENTER
75
-
75
+
76
76
  @type String
77
77
  @default SC.ALIGN_LEFT
78
78
  */
79
79
  horizontalAlign: SC.ALIGN_LEFT,
80
-
80
+
81
81
  /**
82
82
  The vertical alignment for non-filling content inside of the ScrollView. Possible values:
83
-
83
+
84
84
  - SC.ALIGN_TOP
85
85
  - SC.ALIGN_BOTTOM
86
86
  - SC.ALIGN_MIDDLE
87
-
87
+
88
88
  @type String
89
89
  @default SC.ALIGN_TOP
90
90
  */
@@ -92,7 +92,7 @@ SC.ScrollView = SC.View.extend({
92
92
 
93
93
  /**
94
94
  The current horizontal scroll offset. Changing this value will update both the contentView and the horizontal scroller, if there is one.
95
-
95
+
96
96
  @field
97
97
  @type Number
98
98
  @default 0
@@ -106,10 +106,10 @@ SC.ScrollView = SC.View.extend({
106
106
 
107
107
  return this._scroll_horizontalScrollOffset||0;
108
108
  }.property().cacheable(),
109
-
109
+
110
110
  /**
111
111
  The current vertical scroll offset. Changing this value will update both the contentView and the vertical scroller, if there is one.
112
-
112
+
113
113
  @field
114
114
  @type Number
115
115
  @default 0
@@ -123,7 +123,7 @@ SC.ScrollView = SC.View.extend({
123
123
 
124
124
  return this._scroll_verticalScrollOffset||0;
125
125
  }.property().cacheable(),
126
-
126
+
127
127
  /** @private
128
128
  Calculates the maximum offset given content and container sizes, and the
129
129
  alignment.
@@ -133,7 +133,7 @@ SC.ScrollView = SC.View.extend({
133
133
  // simple to calculate the answer. Otherwise, we need to do some fancy-pants
134
134
  // alignment logic (read: simple math)
135
135
  if (contentSize >= containerSize) return contentSize - containerSize;
136
-
136
+
137
137
  // alignment, yeah
138
138
  if (align === SC.ALIGN_LEFT || align === SC.ALIGN_TOP) {
139
139
  // if we left-align something, and it is smaller than the view, does that not mean
@@ -147,7 +147,7 @@ SC.ScrollView = SC.View.extend({
147
147
  return 0 - (containerSize - contentSize);
148
148
  }
149
149
  },
150
-
150
+
151
151
  /** @private
152
152
  Calculates the minimum offset given content and container sizes, and the
153
153
  alignment.
@@ -156,7 +156,7 @@ SC.ScrollView = SC.View.extend({
156
156
  // if the content is larger than the container, we have no need to change the minimum
157
157
  // away from the natural 0 position.
158
158
  if (contentSize > containerSize) return 0;
159
-
159
+
160
160
  // alignment, yeah
161
161
  if (align === SC.ALIGN_LEFT || align === SC.ALIGN_TOP) {
162
162
  // if we left-align something, and it is smaller than the view, does that not mean
@@ -170,12 +170,12 @@ SC.ScrollView = SC.View.extend({
170
170
  return 0 - (containerSize - contentSize);
171
171
  }
172
172
  },
173
-
173
+
174
174
  /**
175
- The maximum horizontal scroll offset allowed given the current contentView
176
- size and the size of the scroll view. If horizontal scrolling is
175
+ The maximum horizontal scroll offset allowed given the current contentView
176
+ size and the size of the scroll view. If horizontal scrolling is
177
177
  disabled, this will always return 0.
178
-
178
+
179
179
  @field
180
180
  @type Number
181
181
  @default 0
@@ -184,27 +184,27 @@ SC.ScrollView = SC.View.extend({
184
184
  var view = this.get('contentView') ;
185
185
  var contentWidth = view ? view.get('frame').width : 0,
186
186
  calculatedWidth = view ? view.get('calculatedWidth') : 0;
187
-
187
+
188
188
  // The following code checks if there is a calculatedWidth (collections)
189
189
  // to avoid looking at the incorrect value calculated by frame.
190
190
  if (calculatedWidth) {
191
- contentWidth = view.calculatedWidth;
191
+ contentWidth = view.calculatedWidth;
192
192
  }
193
193
  contentWidth *= this._scale;
194
-
194
+
195
195
  var containerWidth = this.get('containerView').get('frame').width ;
196
-
196
+
197
197
  // we still must go through minimumScrollOffset even if we can't scroll
198
198
  // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
199
199
  if (!this.get('canScrollHorizontal')) contentWidth = Math.min(contentWidth, containerWidth);
200
200
  return this.maximumScrollOffset(contentWidth, containerWidth, this.get("horizontalAlign"));
201
201
  }.property(),
202
-
202
+
203
203
  /**
204
- The maximum vertical scroll offset allowed given the current contentView
204
+ The maximum vertical scroll offset allowed given the current contentView
205
205
  size and the size of the scroll view. If vertical scrolling is disabled,
206
206
  this will always return 0 (or whatever alignment dictates).
207
-
207
+
208
208
  @field
209
209
  @type Number
210
210
  @default 0
@@ -213,28 +213,28 @@ SC.ScrollView = SC.View.extend({
213
213
  var view = this.get('contentView'),
214
214
  contentHeight = (view && view.get('frame')) ? view.get('frame').height : 0,
215
215
  calculatedHeight = view ? view.get('calculatedHeight') : 0;
216
-
216
+
217
217
  // The following code checks if there is a calculatedWidth (collections)
218
218
  // to avoid looking at the incorrect value calculated by frame.
219
219
  if(calculatedHeight){
220
- contentHeight = calculatedHeight;
220
+ contentHeight = calculatedHeight;
221
221
  }
222
222
  contentHeight *= this._scale;
223
-
223
+
224
224
  var containerHeight = this.get('containerView').get('frame').height ;
225
-
225
+
226
226
  // we still must go through minimumScrollOffset even if we can't scroll
227
227
  // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
228
228
  if (!this.get('canScrollVertical')) contentHeight = Math.min(contentHeight, containerHeight);
229
229
  return this.maximumScrollOffset(contentHeight, containerHeight, this.get("verticalAlign"));
230
230
  }.property(),
231
-
232
-
231
+
232
+
233
233
  /**
234
- The minimum horizontal scroll offset allowed given the current contentView
235
- size and the size of the scroll view. If horizontal scrolling is
234
+ The minimum horizontal scroll offset allowed given the current contentView
235
+ size and the size of the scroll view. If horizontal scrolling is
236
236
  disabled, this will always return 0 (or whatever alignment dictates).
237
-
237
+
238
238
  @field
239
239
  @type Number
240
240
  @default 0
@@ -246,23 +246,23 @@ SC.ScrollView = SC.View.extend({
246
246
  // The following code checks if there is a calculatedWidth (collections)
247
247
  // to avoid looking at the incorrect value calculated by frame.
248
248
  if(calculatedWidth){
249
- contentWidth = calculatedWidth;
249
+ contentWidth = calculatedWidth;
250
250
  }
251
251
  contentWidth *= this._scale;
252
-
252
+
253
253
  var containerWidth = this.get('containerView').get('frame').width ;
254
-
254
+
255
255
  // we still must go through minimumScrollOffset even if we can't scroll
256
256
  // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
257
257
  if (!this.get('canScrollHorizontal')) contentWidth = Math.min(contentWidth, containerWidth);
258
258
  return this.minimumScrollOffset(contentWidth, containerWidth, this.get("horizontalAlign"));
259
259
  }.property(),
260
-
260
+
261
261
  /**
262
- The minimum vertical scroll offset allowed given the current contentView
262
+ The minimum vertical scroll offset allowed given the current contentView
263
263
  size and the size of the scroll view. If vertical scrolling is disabled,
264
264
  this will always return 0 (or whatever alignment dictates).
265
-
265
+
266
266
  @field
267
267
  @type Number
268
268
  @default 0
@@ -271,49 +271,49 @@ SC.ScrollView = SC.View.extend({
271
271
  var view = this.get('contentView') ;
272
272
  var contentHeight = (view && view.get('frame')) ? view.get('frame').height : 0,
273
273
  calculatedHeight = view ? view.get('calculatedHeight') : 0;
274
-
274
+
275
275
  // The following code checks if there is a calculatedWidth (collections)
276
276
  // to avoid looking at the incorrect value calculated by frame.
277
277
  if(calculatedHeight){
278
- contentHeight = view.calculatedHeight;
278
+ contentHeight = view.calculatedHeight;
279
279
  }
280
280
  contentHeight *= this._scale;
281
-
281
+
282
282
  var containerHeight = this.get('containerView').get('frame').height ;
283
-
283
+
284
284
  // we still must go through minimumScrollOffset even if we can't scroll
285
285
  // because we need to adjust for alignment. So, just make sure it won't allow scrolling.
286
286
  if (!this.get('canScrollVertical')) contentHeight = Math.min(contentHeight, containerHeight);
287
287
  return this.minimumScrollOffset(contentHeight, containerHeight, this.get("verticalAlign"));
288
288
  }.property(),
289
-
290
-
291
- /**
289
+
290
+
291
+ /**
292
292
  Amount to scroll one vertical line.
293
-
293
+
294
294
  Used by the default implementation of scrollDownLine() and scrollUpLine().
295
-
295
+
296
296
  @type Number
297
297
  @default 20
298
298
  */
299
299
  verticalLineScroll: 20,
300
-
300
+
301
301
  /**
302
302
  Amount to scroll one horizontal line.
303
-
304
- Used by the default implementation of scrollLeftLine() and
303
+
304
+ Used by the default implementation of scrollLeftLine() and
305
305
  scrollRightLine().
306
-
306
+
307
307
  @type Number
308
308
  @default 20
309
309
  */
310
310
  horizontalLineScroll: 20,
311
-
311
+
312
312
  /**
313
313
  Amount to scroll one vertical page.
314
-
314
+
315
315
  Used by the default implementation of scrollUpPage() and scrollDownPage().
316
-
316
+
317
317
  @field
318
318
  @type Number
319
319
  @default value of frame.height
@@ -322,13 +322,13 @@ SC.ScrollView = SC.View.extend({
322
322
  verticalPageScroll: function() {
323
323
  return this.get('frame').height;
324
324
  }.property('frame'),
325
-
325
+
326
326
  /**
327
327
  Amount to scroll one horizontal page.
328
-
329
- Used by the default implementation of scrollLeftPage() and
328
+
329
+ Used by the default implementation of scrollLeftPage() and
330
330
  scrollRightPage().
331
-
331
+
332
332
  @field
333
333
  @type Number
334
334
  @default value of frame.width
@@ -337,48 +337,48 @@ SC.ScrollView = SC.View.extend({
337
337
  horizontalPageScroll: function() {
338
338
  return this.get('frame').width;
339
339
  }.property('frame'),
340
-
341
-
340
+
341
+
342
342
  // ..........................................................
343
343
  // SCROLLERS
344
- //
345
-
346
- /**
347
- YES if the view should maintain a horizontal scroller. This property
344
+ //
345
+
346
+ /**
347
+ YES if the view should maintain a horizontal scroller. This property
348
348
  must be set when the view is created.
349
-
349
+
350
350
  @type Boolean
351
351
  @default YES
352
352
  */
353
353
  hasHorizontalScroller: YES,
354
-
354
+
355
355
  /**
356
- The horizontal scroller view class. This will be replaced with a view
357
- instance when the ScrollView is created unless hasHorizontalScroller is
356
+ The horizontal scroller view class. This will be replaced with a view
357
+ instance when the ScrollView is created unless hasHorizontalScroller is
358
358
  NO.
359
-
359
+
360
360
  @type SC.View
361
361
  @default SC.ScrollerView
362
362
  */
363
363
  horizontalScrollerView: SC.ScrollerView,
364
-
364
+
365
365
  /**
366
366
  The horizontal scroller view for touch. This will be replaced with a view
367
- instance when touch is enabled when the ScrollView is created unless
367
+ instance when touch is enabled when the ScrollView is created unless
368
368
  hasHorizontalScroller is NO.
369
-
369
+
370
370
  @type SC.View
371
371
  @default SC.TouchScrollerView
372
372
  */
373
373
  horizontalTouchScrollerView: SC.TouchScrollerView,
374
-
374
+
375
375
  /**
376
- YES if the horizontal scroller should be visible. You can change this
377
- property value anytime to show or hide the horizontal scroller. If you
378
- do not want to use a horizontal scroller at all, you should instead set
379
- hasHorizontalScroller to NO to avoid creating a scroller view in the
376
+ YES if the horizontal scroller should be visible. You can change this
377
+ property value anytime to show or hide the horizontal scroller. If you
378
+ do not want to use a horizontal scroller at all, you should instead set
379
+ hasHorizontalScroller to NO to avoid creating a scroller view in the
380
380
  first place.
381
-
381
+
382
382
  @type Boolean
383
383
  @default YES
384
384
  */
@@ -387,61 +387,61 @@ SC.ScrollView = SC.View.extend({
387
387
  /**
388
388
  Returns YES if the view both has a horizontal scroller, the scroller is
389
389
  visible.
390
-
390
+
391
391
  @field
392
392
  @type Boolean
393
393
  @default YES
394
394
  */
395
395
  canScrollHorizontal: function() {
396
- return !!(this.get('hasHorizontalScroller') &&
397
- this.get('horizontalScrollerView') &&
396
+ return !!(this.get('hasHorizontalScroller') &&
397
+ this.get('horizontalScrollerView') &&
398
398
  this.get('isHorizontalScrollerVisible')) ;
399
399
  }.property('isHorizontalScrollerVisible').cacheable(),
400
-
400
+
401
401
  /**
402
402
  If YES, the horizontal scroller will autohide if the contentView is
403
- smaller than the visible area. You must set hasHorizontalScroller to YES
403
+ smaller than the visible area. You must set hasHorizontalScroller to YES
404
404
  for this property to have any effect.
405
-
405
+
406
406
  @type Boolean
407
407
  @default YES
408
408
  */
409
409
  autohidesHorizontalScroller: YES,
410
-
411
- /**
412
- YES if the view shuld maintain a vertical scroller. This property must
410
+
411
+ /**
412
+ YES if the view should maintain a vertical scroller. This property must
413
413
  be set when the view is created.
414
-
414
+
415
415
  @type Boolean
416
416
  @default YES
417
417
  */
418
418
  hasVerticalScroller: YES,
419
-
419
+
420
420
  /**
421
- The vertical scroller view class. This will be replaced with a view
421
+ The vertical scroller view class. This will be replaced with a view
422
422
  instance when the ScrollView is created unless hasVerticalScroller is NO.
423
-
423
+
424
424
  @type SC.View
425
425
  @default SC.ScrollerView
426
426
  */
427
427
  verticalScrollerView: SC.ScrollerView,
428
-
428
+
429
429
  /**
430
430
  The vertical touch scroller view class. This will be replaced with a view
431
431
  instance when the ScrollView is created.
432
-
432
+
433
433
  @type SC.View
434
434
  @default SC.TouchScrollerView
435
435
  */
436
436
  verticalTouchScrollerView: SC.TouchScrollerView,
437
-
437
+
438
438
  /**
439
- YES if the vertical scroller should be visible. You can change this
440
- property value anytime to show or hide the vertical scroller. If you do
441
- not want to use a vertical scroller at all, you should instead set
442
- hasVerticalScroller to NO to avoid creating a scroller view in the first
439
+ YES if the vertical scroller should be visible. You can change this
440
+ property value anytime to show or hide the vertical scroller. If you do
441
+ not want to use a vertical scroller at all, you should instead set
442
+ hasVerticalScroller to NO to avoid creating a scroller view in the first
443
443
  place.
444
-
444
+
445
445
  @type Boolean
446
446
  @default YES
447
447
  */
@@ -450,43 +450,43 @@ SC.ScrollView = SC.View.extend({
450
450
  /**
451
451
  Returns YES if the view both has a horizontal scroller, the scroller is
452
452
  visible.
453
-
453
+
454
454
  @field
455
455
  @type Boolean
456
456
  @default YES
457
457
  */
458
458
  canScrollVertical: function() {
459
- return !!(this.get('hasVerticalScroller') &&
460
- this.get('verticalScrollerView') &&
459
+ return !!(this.get('hasVerticalScroller') &&
460
+ this.get('verticalScrollerView') &&
461
461
  this.get('isVerticalScrollerVisible')) ;
462
462
  }.property('isVerticalScrollerVisible').cacheable(),
463
463
 
464
464
  /**
465
465
  If YES, the vertical scroller will autohide if the contentView is
466
- smaller than the visible area. You must set hasVerticalScroller to YES
466
+ smaller than the visible area. You must set hasVerticalScroller to YES
467
467
  for this property to have any effect.
468
-
468
+
469
469
  @type Boolean
470
470
  @default YES
471
471
  */
472
472
  autohidesVerticalScroller: YES,
473
-
473
+
474
474
  /**
475
- Use this property to set the 'bottom' offset of your vertical scroller,
475
+ Use this property to set the 'bottom' offset of your vertical scroller,
476
476
  to make room for a thumb view or other accessory view. Default is 0.
477
-
477
+
478
478
  @type Number
479
479
  @default 0
480
480
  */
481
481
  verticalScrollerBottom: 0,
482
-
482
+
483
483
  /**
484
484
  Use this to overlay the vertical scroller.
485
-
486
- This ensures that the container frame will not resize to accomodate the
487
- vertical scroller, hence overlaying the scroller on top of
485
+
486
+ This ensures that the container frame will not resize to accommodate the
487
+ vertical scroller, hence overlaying the scroller on top of
488
488
  the container.
489
-
489
+
490
490
  @field
491
491
  @type Boolean
492
492
  @default NO
@@ -495,14 +495,14 @@ SC.ScrollView = SC.View.extend({
495
495
  if (SC.platform.touch) return YES;
496
496
  return NO;
497
497
  }.property().cacheable(),
498
-
498
+
499
499
  /**
500
500
  Use this to overlay the horizontal scroller.
501
-
502
- This ensures that the container frame will not resize to accomodate the
503
- horizontal scroller, hence overlaying the scroller on top of
501
+
502
+ This ensures that the container frame will not resize to accommodate the
503
+ horizontal scroller, hence overlaying the scroller on top of
504
504
  the container
505
-
505
+
506
506
  @field
507
507
  @type Boolean
508
508
  @default NO
@@ -511,71 +511,71 @@ SC.ScrollView = SC.View.extend({
511
511
  if (SC.platform.touch) return YES;
512
512
  return NO;
513
513
  }.property().cacheable(),
514
-
514
+
515
515
  /**
516
516
  Use to control the positioning of the vertical scroller. If you do not
517
517
  set 'verticalOverlay' to YES, then the content view will be automatically
518
518
  sized to meet the left edge of the vertical scroller, wherever it may be.
519
519
  This allows you to easily, for example, have “one pixel higher and one
520
520
  pixel lower” scroll bars that blend into their parent views.
521
-
521
+
522
522
  If you do set 'verticalOverlay' to YES, then the scroller view will
523
523
  “float on top” of the content view.
524
-
524
+
525
525
  Example: { top: -1, bottom: -1, right: 0 }
526
-
526
+
527
527
  @type Hash
528
528
  @default null
529
529
  */
530
530
  verticalScrollerLayout: null,
531
-
531
+
532
532
  /**
533
533
  Use to control the positioning of the horizontal scroller. If you do not
534
534
  set 'horizontalOverlay' to YES, then the content view will be
535
535
  automatically sized to meet the top edge of the horizontal scroller,
536
536
  wherever it may be.
537
-
537
+
538
538
  If you do set 'horizontalOverlay' to YES, then the scroller view will
539
539
  “float on top” of the content view.
540
-
540
+
541
541
  Example: { left: 0, bottom: 0, right: 0 }
542
-
542
+
543
543
  @type Hash
544
544
  @default null
545
545
  */
546
546
  horizontalScrollerLayout: null,
547
-
547
+
548
548
  // ..........................................................
549
549
  // CUSTOM VIEWS
550
- //
551
-
550
+ //
551
+
552
552
  /**
553
- The container view that will contain your main content view. You can
553
+ The container view that will contain your main content view. You can
554
554
  replace this property with your own custom subclass if you prefer.
555
-
555
+
556
556
  @type SC.ContainerView
557
557
  @default SC.ConainerView
558
558
  */
559
559
  containerView: SC.ContainerView.extend({}),
560
-
561
-
560
+
561
+
562
562
  // ..........................................................
563
563
  // METHODS
564
- //
565
-
564
+ //
565
+
566
566
  /**
567
567
  Scrolls the receiver to the specified x,y coordinate. This should be the
568
568
  offset into the contentView you want to appear at the top-left corner of
569
569
  the scroll view.
570
-
571
- This method will contrain the actual scroll based on whether the view
570
+
571
+ This method will contain the actual scroll based on whether the view
572
572
  can scroll in the named direction and the maximum distance it can
573
573
  scroll.
574
-
575
- If you only want to scroll in one direction, pass null for the other
576
- direction. You can also optionally pass a Hash for the first parameter
574
+
575
+ If you only want to scroll in one direction, pass null for the other
576
+ direction. You can also optionally pass a Hash for the first parameter
577
577
  with x and y coordinates.
578
-
578
+
579
579
  @param {Number} x the x scroll location
580
580
  @param {Number} y the y scroll location
581
581
  @returns {SC.ScrollView} receiver
@@ -585,27 +585,27 @@ SC.ScrollView = SC.View.extend({
585
585
  if (y===undefined && SC.typeOf(x) === SC.T_HASH) {
586
586
  y = x.y; x = x.x;
587
587
  }
588
-
588
+
589
589
  if (!SC.none(x)) {
590
590
  this.set('horizontalScrollOffset', x) ;
591
591
  }
592
-
592
+
593
593
  if (!SC.none(y)) {
594
594
  this.set('verticalScrollOffset', y) ;
595
595
  }
596
-
596
+
597
597
  return this ;
598
598
  },
599
-
599
+
600
600
  /**
601
- Scrolls the receiver in the horizontal and vertical directions by the
602
- amount specified, if allowed. The actual scroll amount will be
601
+ Scrolls the receiver in the horizontal and vertical directions by the
602
+ amount specified, if allowed. The actual scroll amount will be
603
603
  constrained by the current scroll view settings.
604
-
605
- If you only want to scroll in one direction, pass null or 0 for the other
606
- direction. You can also optionally pass a Hash for the first parameter
604
+
605
+ If you only want to scroll in one direction, pass null or 0 for the other
606
+ direction. You can also optionally pass a Hash for the first parameter
607
607
  with x and y coordinates.
608
-
608
+
609
609
  @param {Number} x change in the x direction (or hash)
610
610
  @param {Number} y change in the y direction
611
611
  @returns {SC.ScrollView} receiver
@@ -615,41 +615,41 @@ SC.ScrollView = SC.View.extend({
615
615
  if (y===undefined && SC.typeOf(x) === SC.T_HASH) {
616
616
  y = x.y; x = x.x;
617
617
  }
618
-
618
+
619
619
  // if null, undefined, or 0, pass null; otherwise just add current offset
620
620
  x = (x) ? this.get('horizontalScrollOffset')+x : null ;
621
621
  y = (y) ? this.get('verticalScrollOffset')+y : null ;
622
622
  return this.scrollTo(x,y) ;
623
623
  },
624
-
624
+
625
625
  /**
626
626
  Scroll the view to make the view's frame visible. For this to make sense,
627
627
  the view should be a subview of the contentView. Otherwise the results
628
628
  will be undefined.
629
-
629
+
630
630
  @param {SC.View} view view to scroll or null to scroll receiver visible
631
631
  @returns {Boolean} YES if scroll position was changed
632
632
  */
633
633
  scrollToVisible: function(view) {
634
-
634
+
635
635
  // if no view is passed, do default
636
- if (arguments.length === 0) return sc_super();
637
-
636
+ if (arguments.length === 0) return sc_super();
637
+
638
638
  var contentView = this.get('contentView') ;
639
639
  if (!contentView) return NO; // nothing to do if no contentView.
640
640
 
641
- // get the frame for the view - should work even for views with static
641
+ // get the frame for the view - should work even for views with static
642
642
  // layout, assuming it has been added to the screen.
643
643
  var vf = view.get('frame');
644
644
  if (!vf) return NO; // nothing to do
645
-
645
+
646
646
  // convert view's frame to an offset from the contentView origin. This
647
647
  // will become the new scroll offset after some adjustment.
648
648
  vf = contentView.convertFrameFromView(vf, view.get('parentView')) ;
649
-
649
+
650
650
  return this.scrollToRect(vf);
651
651
  },
652
-
652
+
653
653
  /**
654
654
  Scroll to the supplied rectangle.
655
655
  @param {Rect} rect Rectangle to scroll to.
@@ -658,32 +658,32 @@ SC.ScrollView = SC.View.extend({
658
658
  scrollToRect: function(rect) {
659
659
  // find current visible frame.
660
660
  var vo = SC.cloneRect(this.get('containerView').get('frame')) ;
661
-
661
+
662
662
  vo.x = this.get('horizontalScrollOffset') ;
663
663
  vo.y = this.get('verticalScrollOffset') ;
664
664
 
665
665
  var origX = vo.x, origY = vo.y;
666
-
666
+
667
667
  // if top edge is not visible, shift origin
668
668
  vo.y -= Math.max(0, SC.minY(vo) - SC.minY(rect)) ;
669
669
  vo.x -= Math.max(0, SC.minX(vo) - SC.minX(rect)) ;
670
-
670
+
671
671
  // if bottom edge is not visible, shift origin
672
672
  vo.y += Math.max(0, SC.maxY(rect) - SC.maxY(vo)) ;
673
673
  vo.x += Math.max(0, SC.maxX(rect) - SC.maxX(vo)) ;
674
-
674
+
675
675
  // scroll to that origin.
676
676
  if ((origX !== vo.x) || (origY !== vo.y)) {
677
677
  this.scrollTo(vo.x, vo.y);
678
678
  return YES ;
679
679
  } else return NO;
680
680
  },
681
-
682
-
681
+
682
+
683
683
  /**
684
684
  Scrolls the receiver down one or more lines if allowed. If number of
685
685
  lines is not specified, scrolls one line.
686
-
686
+
687
687
  @param {Number} lines number of lines
688
688
  @returns {SC.ScrollView} receiver
689
689
  */
@@ -691,11 +691,11 @@ SC.ScrollView = SC.View.extend({
691
691
  if (lines === undefined) lines = 1 ;
692
692
  return this.scrollBy(null, this.get('verticalLineScroll')*lines) ;
693
693
  },
694
-
694
+
695
695
  /**
696
696
  Scrolls the receiver up one or more lines if allowed. If number of
697
697
  lines is not specified, scrolls one line.
698
-
698
+
699
699
  @param {Number} lines number of lines
700
700
  @returns {SC.ScrollView} receiver
701
701
  */
@@ -703,11 +703,11 @@ SC.ScrollView = SC.View.extend({
703
703
  if (lines === undefined) lines = 1 ;
704
704
  return this.scrollBy(null, 0-this.get('verticalLineScroll')*lines) ;
705
705
  },
706
-
706
+
707
707
  /**
708
708
  Scrolls the receiver right one or more lines if allowed. If number of
709
709
  lines is not specified, scrolls one line.
710
-
710
+
711
711
  @param {Number} lines number of lines
712
712
  @returns {SC.ScrollView} receiver
713
713
  */
@@ -715,11 +715,11 @@ SC.ScrollView = SC.View.extend({
715
715
  if (lines === undefined) lines = 1 ;
716
716
  return this.scrollTo(this.get('horizontalLineScroll')*lines, null) ;
717
717
  },
718
-
718
+
719
719
  /**
720
720
  Scrolls the receiver left one or more lines if allowed. If number of
721
721
  lines is not specified, scrolls one line.
722
-
722
+
723
723
  @param {Number} lines number of lines
724
724
  @returns {SC.ScrollView} receiver
725
725
  */
@@ -727,13 +727,13 @@ SC.ScrollView = SC.View.extend({
727
727
  if (lines === undefined) lines = 1 ;
728
728
  return this.scrollTo(0-this.get('horizontalLineScroll')*lines, null) ;
729
729
  },
730
-
730
+
731
731
  /**
732
732
  Scrolls the receiver down one or more page if allowed. If number of
733
733
  pages is not specified, scrolls one page. The page size is determined by
734
734
  the verticalPageScroll value. By default this is the size of the current
735
735
  scrollable area.
736
-
736
+
737
737
  @param {Number} pages number of lines
738
738
  @returns {SC.ScrollView} receiver
739
739
  */
@@ -741,13 +741,13 @@ SC.ScrollView = SC.View.extend({
741
741
  if (pages === undefined) pages = 1 ;
742
742
  return this.scrollBy(null, this.get('verticalPageScroll')*pages) ;
743
743
  },
744
-
744
+
745
745
  /**
746
746
  Scrolls the receiver up one or more page if allowed. If number of
747
747
  pages is not specified, scrolls one page. The page size is determined by
748
748
  the verticalPageScroll value. By default this is the size of the current
749
749
  scrollable area.
750
-
750
+
751
751
  @param {Number} pages number of lines
752
752
  @returns {SC.ScrollView} receiver
753
753
  */
@@ -755,13 +755,13 @@ SC.ScrollView = SC.View.extend({
755
755
  if (pages === undefined) pages = 1 ;
756
756
  return this.scrollBy(null, 0-(this.get('verticalPageScroll')*pages)) ;
757
757
  },
758
-
758
+
759
759
  /**
760
760
  Scrolls the receiver right one or more page if allowed. If number of
761
761
  pages is not specified, scrolls one page. The page size is determined by
762
762
  the verticalPageScroll value. By default this is the size of the current
763
763
  scrollable area.
764
-
764
+
765
765
  @param {Number} pages number of lines
766
766
  @returns {SC.ScrollView} receiver
767
767
  */
@@ -769,13 +769,13 @@ SC.ScrollView = SC.View.extend({
769
769
  if (pages === undefined) pages = 1 ;
770
770
  return this.scrollBy(this.get('horizontalPageScroll')*pages, null) ;
771
771
  },
772
-
772
+
773
773
  /**
774
774
  Scrolls the receiver left one or more page if allowed. If number of
775
775
  pages is not specified, scrolls one page. The page size is determined by
776
776
  the verticalPageScroll value. By default this is the size of the current
777
777
  scrollable area.
778
-
778
+
779
779
  @param {Number} pages number of lines
780
780
  @returns {SC.ScrollView} receiver
781
781
  */
@@ -783,12 +783,12 @@ SC.ScrollView = SC.View.extend({
783
783
  if (pages === undefined) pages = 1 ;
784
784
  return this.scrollBy(0-(this.get('horizontalPageScroll')*pages), null) ;
785
785
  },
786
-
786
+
787
787
  /** @private
788
788
  Adjusts the layout for the various internal views. This method is called
789
789
  once when the scroll view is first configured and then anytime a scroller
790
790
  is shown or hidden. You can call this method yourself as well to retile.
791
-
791
+
792
792
  You may also want to override this method to handle layout for any
793
793
  additional controls you have added to the view.
794
794
  */
@@ -796,26 +796,26 @@ SC.ScrollView = SC.View.extend({
796
796
  // get horizontal scroller/determine if we should have a scroller
797
797
  var hscroll = this.get('hasHorizontalScroller') ? this.get('horizontalScrollerView') : null ;
798
798
  var hasHorizontal = hscroll && this.get('isHorizontalScrollerVisible');
799
-
799
+
800
800
  // get vertical scroller/determine if we should have a scroller
801
801
  var vscroll = this.get('hasVerticalScroller') ? this.get('verticalScrollerView') : null ;
802
802
  var hasVertical = vscroll && this.get('isVerticalScrollerVisible') ;
803
-
803
+
804
804
  // get the containerView
805
805
  var clip = this.get('containerView') ;
806
806
  var clipLayout = { left: 0, top: 0 } ;
807
807
  var t, layout, vo, ho, vl, hl;
808
-
808
+
809
809
  var ht = ((hasHorizontal) ? hscroll.get('scrollbarThickness') : 0) ;
810
810
  var vt = (hasVertical) ? vscroll.get('scrollbarThickness') : 0 ;
811
-
811
+
812
812
  if (hasHorizontal) {
813
813
  hl = this.get('horizontalScrollerLayout');
814
- layout = {
815
- left: (hl ? hl.left : 0),
816
- bottom: (hl ? hl.bottom : 0),
817
- right: (hl ? hl.right + vt-1 : vt-1),
818
- height: ht
814
+ layout = {
815
+ left: (hl ? hl.left : 0),
816
+ bottom: (hl ? hl.bottom : 0),
817
+ right: (hl ? hl.right + vt-1 : vt-1),
818
+ height: ht
819
819
  };
820
820
  hscroll.set('layout', layout) ;
821
821
  ho = this.get('horizontalOverlay');
@@ -824,15 +824,15 @@ SC.ScrollView = SC.View.extend({
824
824
  clipLayout.bottom = 0 ;
825
825
  }
826
826
  if (hscroll) hscroll.set('isVisible', hasHorizontal) ;
827
-
827
+
828
828
  if (hasVertical) {
829
829
  ht = ht + this.get('verticalScrollerBottom') ;
830
830
  vl = this.get('verticalScrollerLayout');
831
- layout = {
832
- top: (vl ? vl.top : 0),
833
- bottom: (vl ? vl.bottom + ht : ht),
834
- right: (vl ? vl.right : 0),
835
- width: vt
831
+ layout = {
832
+ top: (vl ? vl.top : 0),
833
+ bottom: (vl ? vl.bottom + ht : ht),
834
+ right: (vl ? vl.right : 0),
835
+ width: vt
836
836
  };
837
837
  vscroll.set('layout', layout) ;
838
838
  vo = this.get('verticalOverlay');
@@ -844,32 +844,31 @@ SC.ScrollView = SC.View.extend({
844
844
 
845
845
  clip.adjust(clipLayout) ;
846
846
  },
847
-
847
+
848
848
  /** @private
849
849
  Called whenever a scroller visibility changes. Calls the tile() method.
850
850
  */
851
851
  scrollerVisibilityDidChange: function() {
852
852
  this.tile();
853
853
  }.observes('isVerticalScrollerVisible', 'isHorizontalScrollerVisible'),
854
-
854
+
855
855
  // ..........................................................
856
856
  // SCROLL WHEEL SUPPORT
857
- //
858
-
857
+ //
858
+
859
859
  /** @private */
860
860
  _scroll_wheelDeltaX: 0,
861
-
861
+
862
862
  /** @private */
863
863
  _scroll_wheelDeltaY: 0,
864
-
864
+
865
865
  /** @private */
866
866
  mouseWheel: function(evt) {
867
- var deltaAdjust = (SC.browser.webkit && SC.browser.version > 533.0) ? 120 : 1;
868
-
869
- this._scroll_wheelDeltaX += evt.wheelDeltaX / deltaAdjust;
870
- this._scroll_wheelDeltaY += evt.wheelDeltaY / deltaAdjust;
867
+ this._scroll_wheelDeltaX += evt.wheelDeltaX;
868
+ this._scroll_wheelDeltaY += evt.wheelDeltaY;
869
+
871
870
  this.invokeLater(this._scroll_mouseWheel, 10) ;
872
- return this.get('canScrollHorizontal') || this.get('canScrollVertical') ;
871
+ return this.get('canScrollHorizontal') || this.get('canScrollVertical') ;
873
872
  },
874
873
 
875
874
  /** @private */
@@ -888,24 +887,24 @@ SC.ScrollView = SC.View.extend({
888
887
  this._scroll_wheelDeltaX = 0;
889
888
  }
890
889
  },
891
-
890
+
892
891
  /*..............................................
893
892
  SCALING SUPPORT
894
893
  */
895
-
894
+
896
895
  /**
897
896
  Determines whether scaling is allowed.
898
-
897
+
899
898
  @type Boolean
900
899
  @default NO
901
900
  */
902
901
  canScale: NO,
903
-
902
+
904
903
  /** @private
905
904
  The current scale.
906
905
  */
907
906
  _scale: 1.0,
908
-
907
+
909
908
  /**
910
909
  @field
911
910
  @type Number
@@ -917,39 +916,39 @@ SC.ScrollView = SC.View.extend({
917
916
  }
918
917
  return this._scale;
919
918
  }.property().cacheable(),
920
-
919
+
921
920
  /**
922
921
  The minimum scale.
923
-
922
+
924
923
  @type Number
925
924
  @default 0.25
926
925
  */
927
926
  minimumScale: 0.25,
928
-
927
+
929
928
  /**
930
929
  The maximum scale.
931
-
930
+
932
931
  @type Number
933
932
  @default 2.0
934
933
  */
935
934
  maximumScale: 2.0,
936
-
935
+
937
936
  /**
938
937
  Whether to automatically determine the scale range based on the size of the content.
939
-
938
+
940
939
  @type Boolean
941
940
  @default NO
942
941
  */
943
942
  autoScaleRange: NO,
944
-
943
+
945
944
  /** @private */
946
945
  _scale_css: "",
947
-
946
+
948
947
  /** @private */
949
948
  updateScale: function(scale) {
950
949
  var contentView = this.get("contentView");
951
950
  if (!contentView) return;
952
-
951
+
953
952
  if (contentView.isScalable) {
954
953
  this.get("contentView").applyScale(scale);
955
954
  this._scale_css = "";
@@ -957,55 +956,55 @@ SC.ScrollView = SC.View.extend({
957
956
  this._scale_css = "scale3d(" + scale + ", " + scale + ", 1)";
958
957
  }
959
958
  },
960
-
961
-
959
+
960
+
962
961
  // ..........................................................
963
962
  // Touch Support
964
- //
965
-
963
+ //
964
+
966
965
  /**
967
966
  @type Boolean
968
967
  @default YES
969
968
  @readOnly
970
969
  */
971
970
  acceptsMultitouch: YES,
972
-
971
+
973
972
  /**
974
973
  The scroll deceleration rate.
975
-
974
+
976
975
  @type Number
977
976
  @default SC.NORMAL_SCROLL_DECELERATION
978
977
  */
979
978
  decelerationRate: SC.NORMAL_SCROLL_DECELERATION,
980
-
979
+
981
980
  /**
982
981
  If YES, bouncing will always be enabled in the horizontal direction, even if the content
983
982
  is smaller or the same size as the view.
984
-
983
+
985
984
  @type Boolean
986
985
  @default NO
987
986
  */
988
987
  alwaysBounceHorizontal: NO,
989
-
988
+
990
989
  /**
991
990
  If NO, bouncing will not be enabled in the vertical direction when the content is smaller
992
991
  or the same size as the scroll view.
993
-
992
+
994
993
  @type Boolean
995
994
  @default YES
996
995
  */
997
996
  alwaysBounceVertical: YES,
998
-
997
+
999
998
  /**
1000
999
  Whether to delay touches from passing through to the content.
1001
-
1000
+
1002
1001
  @type Boolean
1003
1002
  @default YES
1004
1003
  */
1005
1004
  delaysContentTouches: YES,
1006
-
1005
+
1007
1006
  /** @private
1008
- If the view supports it, this
1007
+ If the view supports it, this
1009
1008
  */
1010
1009
  _touchScrollDidChange: function() {
1011
1010
  if (this.get("contentView").touchScrollDidChange) {
@@ -1014,23 +1013,23 @@ SC.ScrollView = SC.View.extend({
1014
1013
  this._scroll_verticalScrollOffset
1015
1014
  );
1016
1015
  }
1017
-
1016
+
1018
1017
  // tell scrollers
1019
1018
  if (this.verticalScrollerView && this.verticalScrollerView.touchScrollDidChange) {
1020
1019
  this.verticalScrollerView.touchScrollDidChange(this._scroll_verticalScrollOffset);
1021
1020
  }
1022
-
1021
+
1023
1022
  if (this.horizontalScrollerView && this.horizontalScrollerView.touchScrollDidChange) {
1024
1023
  this.horizontalScrollerView.touchScrollDidChange(this._scroll_horizontalScrollOffset);
1025
1024
  }
1026
1025
  },
1027
-
1026
+
1028
1027
  /** @private */
1029
1028
  _touchScrollDidStart: function() {
1030
1029
  if (this.get("contentView").touchScrollDidStart) {
1031
1030
  this.get("contentView").touchScrollDidStart(this._scroll_horizontalScrollOffset, this._scroll_verticalScrollOffset);
1032
1031
  }
1033
-
1032
+
1034
1033
  // tell scrollers
1035
1034
  if (this.verticalScrollerView && this.verticalScrollerView.touchScrollDidStart) {
1036
1035
  this.verticalScrollerView.touchScrollDidStart(this._touch_verticalScrollOffset);
@@ -1039,23 +1038,23 @@ SC.ScrollView = SC.View.extend({
1039
1038
  this.horizontalScrollerView.touchScrollDidStart(this._touch_horizontalScrollOffset);
1040
1039
  }
1041
1040
  },
1042
-
1041
+
1043
1042
  /** @private */
1044
1043
  _touchScrollDidEnd: function() {
1045
1044
  if (this.get("contentView").touchScrollDidEnd) {
1046
1045
  this.get("contentView").touchScrollDidEnd(this._scroll_horizontalScrollOffset, this._scroll_verticalScrollOffset);
1047
1046
  }
1048
-
1047
+
1049
1048
  // tell scrollers
1050
1049
  if (this.verticalScrollerView && this.verticalScrollerView.touchScrollDidEnd) {
1051
1050
  this.verticalScrollerView.touchScrollDidEnd(this._touch_verticalScrollOffset);
1052
1051
  }
1053
-
1052
+
1054
1053
  if (this.horizontalScrollerView && this.horizontalScrollerView.touchScrollDidEnd) {
1055
1054
  this.horizontalScrollerView.touchScrollDidEnd(this._touch_horizontalScrollOffset);
1056
1055
  }
1057
1056
  },
1058
-
1057
+
1059
1058
  /** @private */
1060
1059
  _applyCSSTransforms: function(layer) {
1061
1060
  var transform = "";
@@ -1063,19 +1062,20 @@ SC.ScrollView = SC.View.extend({
1063
1062
  transform += 'translate3d('+ -this._scroll_horizontalScrollOffset +'px, '+ -Math.round(this._scroll_verticalScrollOffset)+'px,0) ';
1064
1063
  transform += this._scale_css;
1065
1064
  if (layer) {
1066
- layer.style.webkitTransform = transform;
1067
- layer.style.webkitTransformOrigin = "top left";
1065
+ var style = layer.style;
1066
+ style.webkitTransform = transform;
1067
+ style.webkitTransformOrigin = "top left";
1068
1068
  }
1069
1069
  },
1070
-
1070
+
1071
1071
  /** @private */
1072
1072
  captureTouch: function(touch) {
1073
1073
  return YES;
1074
1074
  },
1075
-
1075
+
1076
1076
  /** @private */
1077
1077
  touchGeneration: 0,
1078
-
1078
+
1079
1079
  /** @private */
1080
1080
  touchStart: function(touch) {
1081
1081
  var generation = ++this.touchGeneration;
@@ -1093,21 +1093,21 @@ SC.ScrollView = SC.View.extend({
1093
1093
  /** @private */
1094
1094
  beginTouchesInContent: function(gen) {
1095
1095
  if (gen !== this.touchGeneration) return;
1096
-
1096
+
1097
1097
  var touch = this.touch, itemView;
1098
-
1098
+
1099
1099
  // NOTE! On iPad it is possible that the timer set in touchStart() will not have yet fired and that touchEnd() will
1100
- // come in in the same Run Loop as the one that started with the call to touchStart(). The bad thing that happens is that
1100
+ // come in in the same Run Loop as the one that started with the call to touchStart(). The bad thing that happens is that
1101
1101
  // even though we cleared this.touch, occasionally if touchEnd() comes in right at the end of the Run Loop and
1102
1102
  // then the timer expires and starts a new Run Loop to call beginTouchesInContent(), that this.touch will STILL exist
1103
1103
  // here. There's no explanation for it, and it's not 100% reproducible, but what happens is that if we try to capture
1104
1104
  // the touch that has already ended, assignTouch() in RootResponder will check touch.hasEnded and throw an exception.
1105
-
1105
+
1106
1106
  // Therefore, don't capture a touch if the touch still exists and hasEnded
1107
1107
  if (touch && this.tracking && !this.dragging && !touch.touch.scrollHasEnded && !touch.touch.hasEnded) {
1108
1108
  // try to capture the touch
1109
1109
  touch.touch.captureTouch(this, YES);
1110
-
1110
+
1111
1111
  if (!touch.touch.touchResponder) {
1112
1112
  // if it DIDN'T WORK!!!!!
1113
1113
  // then we need to take possession again.
@@ -1131,35 +1131,44 @@ SC.ScrollView = SC.View.extend({
1131
1131
  */
1132
1132
  beginTouchTracking: function(touch, starting) {
1133
1133
  var avg = touch.averagedTouchesForView(this, starting);
1134
-
1134
+
1135
1135
  var verticalScrollOffset = this._scroll_verticalScrollOffset || 0,
1136
1136
  horizontalScrollOffset = this._scroll_horizontalScrollOffset || 0,
1137
1137
  startClipOffsetX = horizontalScrollOffset,
1138
1138
  startClipOffsetY = verticalScrollOffset,
1139
- needsScrollEnd = NO;
1140
-
1139
+ needsScrollEnd = NO,
1140
+ contentWidth = 0,
1141
+ contentHeight = 0,
1142
+ viewFrame,
1143
+ view;
1144
+
1141
1145
  if (this.touch && this.touch.timeout) {
1142
1146
  // clear the timeout
1143
1147
  clearTimeout(this.touch.timeout);
1144
1148
  this.touch.timeout = null;
1145
-
1149
+
1146
1150
  // get the scroll offsets
1147
1151
  startClipOffsetX = this.touch.startClipOffset.x;
1148
1152
  startClipOffsetY = this.touch.startClipOffset.y;
1149
1153
  needsScrollEnd = YES;
1150
1154
  }
1151
-
1155
+
1152
1156
  // calculate container+content width/height
1153
- var view = this.get('contentView') ;
1154
- var contentWidth = view ? view.get('frame').width : 0,
1155
- contentHeight = view ? view.get('frame').height : 0;
1156
-
1157
+ view = this.get('contentView') ;
1158
+
1159
+ if(view){
1160
+ viewFrame = view.get('frame');
1161
+ contentWidth = viewFrame.width;
1162
+ contentHeight = viewFrame.height;
1163
+ }
1164
+
1157
1165
  if(view.calculatedWidth && view.calculatedWidth!==0) contentWidth = view.calculatedWidth;
1158
1166
  if (view.calculatedHeight && view.calculatedHeight !==0) contentHeight = view.calculatedHeight;
1159
-
1160
- var containerWidth = this.get('containerView').get('frame').width,
1161
- containerHeight = this.get('containerView').get('frame').height;
1162
-
1167
+
1168
+ var containerFrame = this.get('containerView').get('frame'),
1169
+ containerWidth = containerFrame.width,
1170
+ containerHeight = containerFrame.height;
1171
+
1163
1172
 
1164
1173
  // calculate position in content
1165
1174
  var globalFrame = this.convertFrameToView(this.get("frame"), null),
@@ -1169,62 +1178,62 @@ SC.ScrollView = SC.View.extend({
1169
1178
  this.touch = {
1170
1179
  startTime: touch.timeStamp,
1171
1180
  notCalculated: YES,
1172
-
1173
- enableScrolling: {
1174
- x: contentWidth * this._scale > containerWidth || this.get("alwaysBounceHorizontal"),
1175
- y: contentHeight * this._scale > containerHeight || this.get("alwaysBounceVertical")
1181
+
1182
+ enableScrolling: {
1183
+ x: contentWidth * this._scale > containerWidth || this.get("alwaysBounceHorizontal"),
1184
+ y: contentHeight * this._scale > containerHeight || this.get("alwaysBounceVertical")
1176
1185
  },
1177
1186
  scrolling: { x: NO, y: NO },
1178
-
1187
+
1179
1188
  enableBouncing: SC.platform.bounceOnScroll,
1180
-
1189
+
1181
1190
  // offsets and velocities
1182
1191
  startClipOffset: { x: startClipOffsetX, y: startClipOffsetY },
1183
1192
  lastScrollOffset: { x: horizontalScrollOffset, y: verticalScrollOffset },
1184
1193
  startTouchOffset: { x: avg.x, y: avg.y },
1185
1194
  scrollVelocity: { x: 0, y: 0 },
1186
-
1195
+
1187
1196
  startTouchOffsetInContent: { x: positionInContentX, y: positionInContentY },
1188
-
1197
+
1189
1198
  containerSize: { width: containerWidth, height: containerHeight },
1190
1199
  contentSize: { width: contentWidth, height: contentHeight },
1191
-
1200
+
1192
1201
  startScale: this._scale,
1193
1202
  startDistance: avg.d,
1194
1203
  canScale: this.get("canScale") && SC.platform.pinchToZoom,
1195
1204
  minimumScale: this.get("minimumScale"),
1196
1205
  maximumScale: this.get("maximumScale"),
1197
-
1206
+
1198
1207
  globalFrame: globalFrame,
1199
-
1208
+
1200
1209
  // cache some things
1201
- layer: this.get("contentView").get('layer'),
1210
+ layer: view.get('layer'), //contentView
1202
1211
 
1203
1212
  // some constants
1204
1213
  resistanceCoefficient: 0.998,
1205
1214
  resistanceAsymptote: 320,
1206
1215
  decelerationFromEdge: 0.05,
1207
1216
  accelerationToEdge: 0.1,
1208
-
1217
+
1209
1218
  // how much percent of the other drag direction you must drag to start dragging that direction too.
1210
1219
  scrollTolerance: { x: 15, y: 15 },
1211
1220
  scaleTolerance: 5,
1212
1221
  secondaryScrollTolerance: 30,
1213
1222
  scrollLock: 500,
1214
-
1223
+
1215
1224
  decelerationRate: this.get("decelerationRate"),
1216
1225
 
1217
1226
  // general status
1218
- lastEventTime: touch.timeStamp,
1219
-
1227
+ lastEventTime: touch.timeStamp,
1228
+
1220
1229
  // the touch used
1221
1230
  touch: (starting ? touch : (this.touch ? this.touch.touch : null)),
1222
-
1231
+
1223
1232
  // needsScrollEnd will cause a scrollDidEnd even if this particular touch does not start a scroll.
1224
1233
  // the reason for this is because we don't want to say we've stopped scrolling just because we got
1225
1234
  // another touch, but simultaneously, we still need to send a touch end eventually.
1226
1235
  // there are two cases in which this will be used:
1227
- //
1236
+ //
1228
1237
  // 1. If the touch was sent to content touches (in which case we will not be scrolling)
1229
1238
  // 2. If the touch ends before scrolling starts (no scrolling then, either)
1230
1239
  needsScrollEnd: needsScrollEnd
@@ -1235,33 +1244,33 @@ SC.ScrollView = SC.View.extend({
1235
1244
  this.dragging = NO;
1236
1245
  }
1237
1246
  },
1238
-
1247
+
1239
1248
  /** @private */
1240
1249
  _adjustForEdgeResistance: function(offset, minOffset, maxOffset, resistanceCoefficient, asymptote) {
1241
1250
  var distanceFromEdge;
1242
-
1251
+
1243
1252
  // find distance from edge
1244
1253
  if (offset < minOffset) distanceFromEdge = offset - minOffset;
1245
1254
  else if (offset > maxOffset) distanceFromEdge = maxOffset - offset;
1246
1255
  else return offset;
1247
-
1256
+
1248
1257
  // manipulate logarithmically
1249
1258
  distanceFromEdge = Math.pow(resistanceCoefficient, Math.abs(distanceFromEdge)) * asymptote;
1250
-
1259
+
1251
1260
  // adjust mathematically
1252
1261
  if (offset < minOffset) distanceFromEdge = distanceFromEdge - asymptote;
1253
1262
  else distanceFromEdge = -distanceFromEdge + asymptote;
1254
-
1263
+
1255
1264
  // generate final value
1256
1265
  return Math.min(Math.max(minOffset, offset), maxOffset) + distanceFromEdge;
1257
1266
  },
1258
-
1267
+
1259
1268
  /** @private */
1260
1269
  touchesDragged: function(evt, touches) {
1261
1270
  var avg = evt.averagedTouchesForView(this);
1262
1271
  this.updateTouchScroll(avg.x, avg.y, avg.d, evt.timeStamp);
1263
1272
  },
1264
-
1273
+
1265
1274
  /** @private */
1266
1275
  updateTouchScroll: function(touchX, touchY, distance, timeStamp) {
1267
1276
  // get some vars
@@ -1272,62 +1281,65 @@ SC.ScrollView = SC.View.extend({
1272
1281
  maxOffsetY,
1273
1282
  offsetX,
1274
1283
  maxOffsetX,
1275
- minOffsetX, minOffsetY;
1276
-
1284
+ minOffsetX, minOffsetY,
1285
+ touchScroll = touch.scrolling,
1286
+ hAlign = this.get("horizontalAlign"),
1287
+ vAlign = this.get("verticalAlign");
1288
+
1277
1289
  // calculate new position in content
1278
1290
  var positionInContentX = ((this._scroll_horizontalScrollOffset||0) + touchXInFrame) / this._scale,
1279
1291
  positionInContentY = ((this._scroll_verticalScrollOffset||0) + touchYInFrame) / this._scale;
1280
-
1292
+
1281
1293
  // calculate deltas
1282
1294
  var deltaX = positionInContentX - touch.startTouchOffsetInContent.x,
1283
1295
  deltaY = positionInContentY - touch.startTouchOffsetInContent.y;
1284
-
1296
+
1285
1297
  var isDragging = touch.dragging;
1286
- if (!touch.scrolling.x && Math.abs(deltaX) > touch.scrollTolerance.x && touch.enableScrolling.x) {
1298
+ if (!touchScroll.x && Math.abs(deltaX) > touch.scrollTolerance.x && touch.enableScrolling.x) {
1287
1299
  // say we are scrolling
1288
1300
  isDragging = YES;
1289
- touch.scrolling.x = YES;
1301
+ touchScroll.x = YES;
1290
1302
  touch.scrollTolerance.y = touch.secondaryScrollTolerance;
1291
-
1303
+
1292
1304
  // reset position
1293
1305
  touch.startTouchOffset.x = touchX;
1294
1306
  deltaX = 0;
1295
1307
  }
1296
- if (!touch.scrolling.y && Math.abs(deltaY) > touch.scrollTolerance.y && touch.enableScrolling.y) {
1308
+ if (!touchScroll.y && Math.abs(deltaY) > touch.scrollTolerance.y && touch.enableScrolling.y) {
1297
1309
  // say we are scrolling
1298
1310
  isDragging = YES;
1299
- touch.scrolling.y = YES;
1311
+ touchScroll.y = YES;
1300
1312
  touch.scrollTolerance.x = touch.secondaryScrollTolerance;
1301
-
1313
+
1302
1314
  // reset position
1303
1315
  touch.startTouchOffset.y = touchY;
1304
1316
  deltaY = 0;
1305
1317
  }
1306
-
1318
+
1307
1319
  // handle scroll start
1308
1320
  if (isDragging && !touch.dragging) {
1309
1321
  touch.dragging = YES;
1310
1322
  this.dragging = YES;
1311
1323
  this._touchScrollDidStart();
1312
1324
  }
1313
-
1325
+
1314
1326
  // calculate new offset
1315
- if (!touch.scrolling.x && !touch.scrolling.y && !touch.canScale) return;
1316
- if (touch.scrolling.x && !touch.scrolling.y) {
1317
- if (deltaX > touch.scrollLock && !touch.scrolling.y) touch.enableScrolling.y = NO;
1327
+ if (!touchScroll.x && !touchScroll.y && !touch.canScale) return;
1328
+ if (touchScroll.x && !touchScroll.y) {
1329
+ if (deltaX > touch.scrollLock && !touchScroll.y) touch.enableScrolling.y = NO;
1318
1330
  }
1319
- if (touch.scrolling.y && !touch.scrolling.x) {
1320
- if (deltaY > touch.scrollLock && !touch.scrolling.x) touch.enableScrolling.x = NO;
1331
+ if (touchScroll.y && !touchScroll.x) {
1332
+ if (deltaY > touch.scrollLock && !touchScroll.x) touch.enableScrolling.x = NO;
1321
1333
  }
1322
-
1334
+
1323
1335
  // handle scaling through pinch gesture
1324
1336
  if (touch.canScale) {
1325
-
1337
+
1326
1338
  var startDistance = touch.startDistance, dd = distance - startDistance;
1327
1339
  if (Math.abs(dd) > touch.scaleTolerance) {
1328
- touch.scrolling.y = YES; // if you scale, you can scroll.
1329
- touch.scrolling.x = YES;
1330
-
1340
+ touchScroll.y = YES; // if you scale, you can scroll.
1341
+ touchScroll.x = YES;
1342
+
1331
1343
  // we want to say something that was the startDistance away from each other should now be
1332
1344
  // distance away. So, if we are twice as far away as we started...
1333
1345
  var scale = touch.startScale * (distance / Math.max(startDistance, 50));
@@ -1339,28 +1351,28 @@ SC.ScrollView = SC.View.extend({
1339
1351
  newPositionInContentY = positionInContentY * this._scale;
1340
1352
  }
1341
1353
  }
1342
-
1354
+
1343
1355
  // these do exactly what they sound like. So, this comment is just to
1344
1356
  // block off the code a bit
1345
1357
  // In english, these calculate the minimum X/Y offsets
1346
- minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1347
- minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1348
-
1358
+ minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, hAlign);
1359
+ minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, vAlign);
1360
+
1349
1361
  // and now, maximum...
1350
- maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1351
- maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1352
-
1353
-
1362
+ maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, hAlign);
1363
+ maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, vAlign);
1364
+
1365
+
1354
1366
  // So, the following is the completely written out algebra:
1355
1367
  // (offsetY + touchYInFrame) / this._scale = touch.startTouchOffsetInContent.y
1356
1368
  // offsetY + touchYInFrame = touch.startTouchOffsetInContent.y * this._scale;
1357
1369
  // offsetY = touch.startTouchOffset * this._scale - touchYInFrame
1358
-
1370
+
1359
1371
  // and the result applied:
1360
1372
  offsetX = touch.startTouchOffsetInContent.x * this._scale - touchXInFrame;
1361
1373
  offsetY = touch.startTouchOffsetInContent.y * this._scale - touchYInFrame;
1362
-
1363
-
1374
+
1375
+
1364
1376
  // we need to adjust for edge resistance, or, if bouncing is disabled, just stop flat.
1365
1377
  if (touch.enableBouncing) {
1366
1378
  offsetX = this._adjustForEdgeResistance(offsetX, minOffsetX, maxOffsetX, touch.resistanceCoefficient, touch.resistanceAsymptote);
@@ -1369,22 +1381,22 @@ SC.ScrollView = SC.View.extend({
1369
1381
  offsetX = Math.max(minOffsetX, Math.min(maxOffsetX, offsetX));
1370
1382
  offsetY = Math.max(minOffsetY, Math.min(maxOffsetY, offsetY));
1371
1383
  }
1372
-
1384
+
1373
1385
  // and now, _if_ scrolling is enabled, set the new coordinates
1374
- if (touch.scrolling.x) this._scroll_horizontalScrollOffset = offsetX;
1375
- if (touch.scrolling.y) this._scroll_verticalScrollOffset = offsetY;
1376
-
1386
+ if (touchScroll.x) this._scroll_horizontalScrollOffset = offsetX;
1387
+ if (touchScroll.y) this._scroll_verticalScrollOffset = offsetY;
1388
+
1377
1389
  // and apply the CSS transforms.
1378
1390
  this._applyCSSTransforms(touch.layer);
1379
1391
  this._touchScrollDidChange();
1380
-
1381
-
1392
+
1393
+
1382
1394
  // now we must prepare for momentum scrolling by calculating the momentum.
1383
1395
  if (timeStamp - touch.lastEventTime >= 1 || touch.notCalculated) {
1384
1396
  touch.notCalculated = NO;
1385
1397
  var horizontalOffset = this._scroll_horizontalScrollOffset;
1386
1398
  var verticalOffset = this._scroll_verticalScrollOffset;
1387
-
1399
+
1388
1400
  touch.scrollVelocity.x = ((horizontalOffset - touch.lastScrollOffset.x) / Math.max(1, timeStamp - touch.lastEventTime)); // in px per ms
1389
1401
  touch.scrollVelocity.y = ((verticalOffset - touch.lastScrollOffset.y) / Math.max(1, timeStamp - touch.lastEventTime)); // in px per ms
1390
1402
  touch.lastScrollOffset.x = horizontalOffset;
@@ -1397,7 +1409,7 @@ SC.ScrollView = SC.View.extend({
1397
1409
  touchEnd: function(touch) {
1398
1410
  var touchStatus = this.touch,
1399
1411
  avg = touch.averagedTouchesForView(this);
1400
-
1412
+
1401
1413
  touch.scrollHasEnded = YES;
1402
1414
  if (avg.touchCount > 0) {
1403
1415
  this.beginTouchTracking(touch, NO);
@@ -1412,12 +1424,12 @@ SC.ScrollView = SC.View.extend({
1412
1424
  } else {
1413
1425
  // well. The scrolling stopped. Let us tell everyone if there was a pending one that this non-drag op interrupted.
1414
1426
  if (touchStatus.needsScrollEnd) this._touchScrollDidEnd();
1415
-
1427
+
1416
1428
  // this part looks weird, but it is actually quite simple.
1417
1429
  // First, we send the touch off for capture+starting again, but telling it to return to us
1418
1430
  // if nothing is found or if it is released.
1419
1431
  touch.captureTouch(this, YES);
1420
-
1432
+
1421
1433
  // if we went anywhere, did anything, etc., call end()
1422
1434
  if (touch.touchResponder && touch.touchResponder !== this) {
1423
1435
  touch.end();
@@ -1425,26 +1437,26 @@ SC.ScrollView = SC.View.extend({
1425
1437
  // if it was released to us or stayed with us the whole time, or is for some
1426
1438
  // wacky reason empty (in which case it is ours still). If so, and there is a next responder,
1427
1439
  // relay to that.
1428
-
1440
+
1429
1441
  if (touch.nextTouchResponder) touch.makeTouchResponder(touch.nextTouchResponder);
1430
1442
  } else {
1431
1443
  // in this case, the view that captured it and changed responder should have handled
1432
1444
  // everything for us.
1433
1445
  }
1434
-
1446
+
1435
1447
  this.touch = null;
1436
1448
  }
1437
-
1449
+
1438
1450
  this.tracking = NO;
1439
1451
  this.dragging = NO;
1440
1452
  }
1441
1453
  },
1442
-
1454
+
1443
1455
  /** @private */
1444
1456
  touchCancelled: function(touch) {
1445
1457
  var touchStatus = this.touch,
1446
1458
  avg = touch.averagedTouchesForView(this);
1447
-
1459
+
1448
1460
  // if we are decelerating, we don't want to stop that. That would be bad. Because there's no point.
1449
1461
  if (!this.touch || !this.touch.timeout) {
1450
1462
  this.beginPropertyChanges();
@@ -1453,11 +1465,11 @@ SC.ScrollView = SC.View.extend({
1453
1465
  this.set("horizontalScrollOffset", this._scroll_horizontalScrollOffset);
1454
1466
  this.endPropertyChanges();
1455
1467
  this.tracking = NO;
1456
-
1468
+
1457
1469
  if (this.dragging) {
1458
1470
  this._touchScrollDidEnd();
1459
1471
  }
1460
-
1472
+
1461
1473
  this.dragging = NO;
1462
1474
  this.touch = null;
1463
1475
  }
@@ -1470,16 +1482,16 @@ SC.ScrollView = SC.View.extend({
1470
1482
  x: touch.scrollVelocity.x * 10,
1471
1483
  y: touch.scrollVelocity.y * 10
1472
1484
  };
1473
-
1485
+
1474
1486
  this.decelerateAnimation();
1475
1487
  },
1476
-
1488
+
1477
1489
  /** @private
1478
1490
  Does bounce calculations, adjusting velocity.
1479
-
1491
+
1480
1492
  Bouncing is fun. Functions that handle it should have fun names,
1481
1493
  don'tcha think?
1482
-
1494
+
1483
1495
  P.S.: should this be named "bouncityBounce" instead?
1484
1496
  */
1485
1497
  bouncyBounce: function(velocity, value, minValue, maxValue, de, ac, additionalAcceleration) {
@@ -1520,24 +1532,28 @@ SC.ScrollView = SC.View.extend({
1520
1532
  // be changed later in this function).
1521
1533
  var touch = this.touch,
1522
1534
  scale = this._scale,
1523
- minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign")),
1524
- minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign")),
1525
- maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign")),
1526
- maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign")),
1527
-
1535
+ touchDim = touch.contentSize,
1536
+ touchContainerDim = touch.containerSize,
1537
+ hAlign = this.get("horizontalAlign"),
1538
+ vAlign = this.get("verticalAlign"),
1539
+ minOffsetX = this.minimumScrollOffset(touchDim.width * this._scale, touchContainerDim.width, hAlign),
1540
+ minOffsetY = this.minimumScrollOffset(touchDim.height * this._scale, touchContainerDim.height, vAlign),
1541
+ maxOffsetX = this.maximumScrollOffset(touchDim.width * this._scale, touchContainerDim.width, hAlign),
1542
+ maxOffsetY = this.maximumScrollOffset(touchDim.height * this._scale, touchContainerDim.height, vAlign),
1543
+
1528
1544
  now = Date.now(),
1529
1545
  t = Math.max(now - touch.lastEventTime, 1),
1530
-
1546
+
1531
1547
  newX = this._scroll_horizontalScrollOffset + touch.decelerationVelocity.x * (t/10),
1532
1548
  newY = this._scroll_verticalScrollOffset + touch.decelerationVelocity.y * (t/10);
1533
-
1549
+
1534
1550
  var de = touch.decelerationFromEdge, ac = touch.accelerationToEdge;
1535
-
1551
+
1536
1552
  // under a few circumstances, we may want to force a valid X/Y position.
1537
1553
  // For instance, if bouncing is disabled, or if position was okay before
1538
1554
  // adjusting scale.
1539
1555
  var forceValidXPosition = !touch.enableBouncing, forceValidYPosition = !touch.enableBouncing;
1540
-
1556
+
1541
1557
  // determine if position was okay before adjusting scale (which we do, in
1542
1558
  // a lovely, animated way, for the scaled out/in too far bounce-back).
1543
1559
  // if the position was okay, then we are going to make sure that we keep the
@@ -1547,7 +1563,7 @@ SC.ScrollView = SC.View.extend({
1547
1563
  // minimum and maximum scroll offsets)
1548
1564
  if (newX >= minOffsetX && newX <= maxOffsetX) forceValidXPosition = YES;
1549
1565
  if (newY >= minOffsetY && newY <= maxOffsetY) forceValidYPosition = YES;
1550
-
1566
+
1551
1567
  // We are going to change scale in a moment, but the position should stay the
1552
1568
  // same, if possible (unless it would be more jarring, as described above, in
1553
1569
  // the case of starting with a valid position and ending with an invalid one).
@@ -1559,67 +1575,67 @@ SC.ScrollView = SC.View.extend({
1559
1575
  // bounces back around the center of the screen?
1560
1576
  newX /= this._scale;
1561
1577
  newY /= this._scale;
1562
-
1563
- // scale velocity (amount to change) starts out at 0 each time, because
1578
+
1579
+ // scale velocity (amount to change) starts out at 0 each time, because
1564
1580
  // it is calculated by how far out of bounds it is, rather than by the
1565
1581
  // previous such velocity.
1566
1582
  var sv = 0;
1567
-
1583
+
1568
1584
  // do said calculation; we'll use the same bouncyBounce method used for everything
1569
1585
  // else, but our adjustor that gives a minimum amount to change by and (which, as we'll
1570
- // discuss, is to make the stop feel slightly more like a stop), we'll leave at 0
1571
- // (scale doesn't really need it as much; if you disagree, at least come up with
1586
+ // discuss, is to make the stop feel slightly more like a stop), we'll leave at 0
1587
+ // (scale doesn't really need it as much; if you disagree, at least come up with
1572
1588
  // numbers more appropriate for scale than the ones for X/Y)
1573
1589
  sv = this.bouncyBounce(sv, scale, touch.minimumScale, touch.maximumScale, de, ac, 0);
1574
-
1590
+
1575
1591
  // add the amount to scale. This is linear, rather than multiplicative. If you think
1576
1592
  // it should be multiplicative (or however you say that), come up with a new formula.
1577
1593
  this._scale = scale = scale + sv;
1578
-
1594
+
1579
1595
  // now we can convert newX/Y back to scale-specific coordinates...
1580
1596
  newX *= this._scale;
1581
1597
  newY *= this._scale;
1582
-
1598
+
1583
1599
  // It looks very weird if the content started in-bounds, but the scale animation
1584
1600
  // made it not be in bounds; it causes the position to animate snapping back, and,
1585
1601
  // well, it looks very weird. It is more proper to just make sure it stays in a valid
1586
1602
  // position. So, we'll determine the new maximum/minimum offsets, and then, if it was
1587
1603
  // originally a valid position, we'll adjust the new position to a valid position as well.
1588
-
1589
-
1604
+
1605
+
1590
1606
  // determine new max offset
1591
- minOffsetX = this.minimumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1592
- minOffsetY = this.minimumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1593
- maxOffsetX = this.maximumScrollOffset(touch.contentSize.width * this._scale, touch.containerSize.width, this.get("horizontalAlign"));
1594
- maxOffsetY = this.maximumScrollOffset(touch.contentSize.height * this._scale, touch.containerSize.height, this.get("verticalAlign"));
1595
-
1607
+ minOffsetX = this.minimumScrollOffset(touchDim.width * this._scale, touchContainerDim.width, hAlign);
1608
+ minOffsetY = this.minimumScrollOffset(touchDim.height * this._scale, touchContainerDim.height, vAlign);
1609
+ maxOffsetX = this.maximumScrollOffset(touchDim.width * this._scale, touchContainerDim.width, hAlign);
1610
+ maxOffsetY = this.maximumScrollOffset(touchDim.height * this._scale, touchContainerDim.height, vAlign);
1611
+
1596
1612
  // see if scaling messed up the X position (but ignore if 'tweren't right to begin with).
1597
1613
  if (forceValidXPosition && (newX < minOffsetX || newX > maxOffsetX)) {
1598
1614
  // Correct the position
1599
1615
  newX = Math.max(minOffsetX, Math.min(newX, maxOffsetX));
1600
-
1616
+
1601
1617
  // also, make the velocity be ZERO; it is obviously not needed...
1602
1618
  touch.decelerationVelocity.x = 0;
1603
1619
  }
1604
-
1620
+
1605
1621
  // now the y
1606
1622
  if (forceValidYPosition && (newY < minOffsetY || newY > maxOffsetY)) {
1607
1623
  // again, correct it...
1608
1624
  newY = Math.max(minOffsetY, Math.min(newY, maxOffsetY));
1609
-
1625
+
1610
1626
  // also, make the velocity be ZERO; it is obviously not needed...
1611
1627
  touch.decelerationVelocity.y = 0;
1612
1628
  }
1613
-
1614
-
1629
+
1630
+
1615
1631
  // now that we are done modifying the position, we may update the actual scroll
1616
1632
  this._scroll_horizontalScrollOffset = newX;
1617
1633
  this._scroll_verticalScrollOffset = newY;
1618
-
1634
+
1619
1635
  this._applyCSSTransforms(touch.layer); // <- Does what it sounds like.
1620
1636
 
1621
1637
  this._touchScrollDidChange();
1622
-
1638
+
1623
1639
  // Now we have to adjust the velocities. The velocities are simple x and y numbers that
1624
1640
  // get added to the scroll X/Y positions each frame.
1625
1641
  // The default decay rate is .950 per frame. To achieve some semblance of accuracy, we
@@ -1628,34 +1644,35 @@ SC.ScrollView = SC.View.extend({
1628
1644
  // modify the velocity for the next frame. My mind goes blank when I try to figure out
1629
1645
  // a way to fix this (given that we don't want to change the velocity on the first frame),
1630
1646
  // and as it seems to work great as-is, I'm just leaving it.
1631
- var decay = touch.decelerationRate;
1632
- touch.decelerationVelocity.y *= Math.pow(decay, (t / 10));
1633
- touch.decelerationVelocity.x *= Math.pow(decay, (t / 10));
1634
-
1647
+ var decay = touch.decelerationRate,
1648
+ decayXtime = Math.pow(decay, (t / 10));
1649
+ touch.decelerationVelocity.y *= decayXtime;
1650
+ touch.decelerationVelocity.x *= decayXtime;
1651
+
1635
1652
  // We have a bouncyBounce method that adjusts the velocity for bounce. That is, if it is
1636
1653
  // out of range and still going, it will slow it down. This step is decelerationFromEdge.
1637
- // If it is not moving (or has come to a stop from decelerating), but is still out of range,
1654
+ // If it is not moving (or has come to a stop from decelerating), but is still out of range,
1638
1655
  // it will start it moving back into range (accelerationToEdge)
1639
1656
  // we supply de and ac as these properties.
1640
1657
  // The .3 artificially increases the acceleration by .3; this is actually to make the final
1641
1658
  // stop a bit more abrupt.
1642
1659
  touch.decelerationVelocity.x = this.bouncyBounce(touch.decelerationVelocity.x, newX, minOffsetX, maxOffsetX, de, ac, 0.3);
1643
1660
  touch.decelerationVelocity.y = this.bouncyBounce(touch.decelerationVelocity.y, newY, minOffsetY, maxOffsetY, de, ac, 0.3);
1644
-
1661
+
1645
1662
  // if we ain't got no velocity... then we must be finished, as there is no where else to go.
1646
1663
  // to determine our velocity, we take the absolue value, and use that; if it is less than .01, we
1647
1664
  // must be done. Note that we check scale's most recent velocity, calculated above using bouncyBounce,
1648
1665
  // as well.
1649
- var absXVelocity = Math.abs(touch.decelerationVelocity.x);
1650
- var absYVelocity = Math.abs(touch.decelerationVelocity.y);
1666
+ var absXVelocity = Math.abs(touch.decelerationVelocity.x),
1667
+ absYVelocity = Math.abs(touch.decelerationVelocity.y);
1651
1668
  if (absYVelocity < 0.05 && absXVelocity < 0.05 && Math.abs(sv) < 0.05) {
1652
1669
  // we can reset the timeout, as it will no longer be required, and we don't want to re-cancel it later.
1653
1670
  touch.timeout = null;
1654
1671
  this.touch = null;
1655
-
1672
+
1656
1673
  // trigger scroll end
1657
1674
  this._touchScrollDidEnd();
1658
-
1675
+
1659
1676
  // set the scale, vertical, and horizontal offsets to what they technically already are,
1660
1677
  // but don't know they are yet. This will finally update things like, say, the clipping frame.
1661
1678
  this.beginPropertyChanges();
@@ -1663,10 +1680,10 @@ SC.ScrollView = SC.View.extend({
1663
1680
  this.set("verticalScrollOffset", this._scroll_verticalScrollOffset);
1664
1681
  this.set("horizontalScrollOffset", this._scroll_horizontalScrollOffset);
1665
1682
  this.endPropertyChanges();
1666
-
1683
+
1667
1684
  return;
1668
1685
  }
1669
-
1686
+
1670
1687
  // We now set up the next round. We are doing this as raw as we possibly can, not touching the
1671
1688
  // run loop at all. This speeds up performance drastically--keep in mind, we're on comparatively
1672
1689
  // slow devices, here. So, we'll just make a closure, saving "this" into "self" and calling
@@ -1676,32 +1693,32 @@ SC.ScrollView = SC.View.extend({
1676
1693
  touch.lastEventTime = Date.now();
1677
1694
  this.touch.timeout = setTimeout(function(){
1678
1695
  SC.run(self.decelerateAnimation(), self);
1679
- }, 10);
1696
+ }, 30);
1680
1697
  },
1681
-
1698
+
1682
1699
  // ..........................................................
1683
1700
  // INTERNAL SUPPORT
1684
- //
1685
-
1701
+ //
1702
+
1686
1703
  /** @private
1687
1704
  Instantiate scrollers & container views as needed. Replace their classes
1688
1705
  in the regular properties.
1689
1706
  */
1690
1707
  createChildViews: function() {
1691
- var childViews = [] , view;
1692
-
1693
- // create the containerView. We must always have a container view.
1708
+ var childViews = [] , view;
1709
+
1710
+ // create the containerView. We must always have a container view.
1694
1711
  // also, setup the contentView as the child of the containerView...
1695
1712
  if (SC.none(view = this.containerView)) view = SC.ContainerView;
1696
-
1713
+
1697
1714
  childViews.push(this.containerView = this.createChildView(view, {
1698
1715
  contentView: this.contentView,
1699
1716
  isScrollContainer: YES
1700
1717
  }));
1701
-
1718
+
1702
1719
  // and replace our own contentView...
1703
1720
  this.contentView = this.containerView.get('contentView');
1704
-
1721
+
1705
1722
  // create a horizontal scroller view if needed...
1706
1723
  view = SC.platform.touch ? this.get("horizontalTouchScrollerView") : this.get("horizontalScrollerView");
1707
1724
  if (view) {
@@ -1713,7 +1730,7 @@ SC.ScrollView = SC.View.extend({
1713
1730
  childViews.push(view);
1714
1731
  } else this.horizontalScrollerView = null ;
1715
1732
  }
1716
-
1733
+
1717
1734
  // create a vertical scroller view if needed...
1718
1735
  view = SC.platform.touch ? this.get("verticalTouchScrollerView") : this.get("verticalScrollerView");
1719
1736
  if (view) {
@@ -1725,20 +1742,20 @@ SC.ScrollView = SC.View.extend({
1725
1742
  childViews.push(view);
1726
1743
  } else this.verticalScrollerView = null ;
1727
1744
  }
1728
-
1745
+
1729
1746
  // set childViews array.
1730
1747
  this.childViews = childViews ;
1731
-
1748
+
1732
1749
  this.contentViewDidChange() ; // setup initial display...
1733
1750
  this.tile() ; // set up initial tiling
1734
1751
  },
1735
-
1752
+
1736
1753
  /** @private */
1737
1754
  init: function() {
1738
1755
  sc_super();
1739
-
1756
+
1740
1757
  // start observing initial content view. The content view's frame has
1741
- // already been setup in prepareDisplay so we don't need to call
1758
+ // already been setup in prepareDisplay so we don't need to call
1742
1759
  // viewFrameDidChange...
1743
1760
  this._scroll_contentView = this.get('contentView') ;
1744
1761
  var contentView = this._scroll_contentView ;
@@ -1751,7 +1768,7 @@ SC.ScrollView = SC.View.extend({
1751
1768
 
1752
1769
  if (this.get('isVisibleInWindow')) this._scsv_registerAutoscroll() ;
1753
1770
  },
1754
-
1771
+
1755
1772
  /** @private
1756
1773
  Registers/deregisters view with SC.Drag for autoscrolling
1757
1774
  */
@@ -1759,7 +1776,7 @@ SC.ScrollView = SC.View.extend({
1759
1776
  if (this.get('isVisibleInWindow')) SC.Drag.addScrollableView(this);
1760
1777
  else SC.Drag.removeScrollableView(this);
1761
1778
  }.observes('isVisibleInWindow'),
1762
-
1779
+
1763
1780
  /** @private
1764
1781
  Whenever the contentView is changed, we need to observe the content view's
1765
1782
  frame to be notified whenever it's size changes.
@@ -1771,7 +1788,7 @@ SC.ScrollView = SC.View.extend({
1771
1788
  layerObserver = this.contentViewLayerDidChange;
1772
1789
 
1773
1790
  if (newView !== oldView) {
1774
-
1791
+
1775
1792
  // stop observing old content view
1776
1793
  if (oldView) {
1777
1794
  oldView.removeObserver('calculatedWidth', this, this.contentViewFrameDidChange);
@@ -1779,7 +1796,7 @@ SC.ScrollView = SC.View.extend({
1779
1796
  oldView.removeObserver('frame', this, frameObserver);
1780
1797
  oldView.removeObserver('layer', this, layerObserver);
1781
1798
  }
1782
-
1799
+
1783
1800
  // update cache
1784
1801
  this._scroll_contentView = newView;
1785
1802
  if (newView) {
@@ -1788,10 +1805,10 @@ SC.ScrollView = SC.View.extend({
1788
1805
  newView.addObserver('calculatedHeight', this, this.contentViewFrameDidChange);
1789
1806
  newView.addObserver('layer', this, layerObserver);
1790
1807
  }
1791
-
1808
+
1792
1809
  // replace container
1793
1810
  this.containerView.set('contentView', newView);
1794
-
1811
+
1795
1812
  this.contentViewFrameDidChange();
1796
1813
  }
1797
1814
  }.observes('contentView'),
@@ -1813,20 +1830,20 @@ SC.ScrollView = SC.View.extend({
1813
1830
 
1814
1831
  /** @private */
1815
1832
  oldMaxHOffset: 0,
1816
-
1833
+
1817
1834
  /** @private */
1818
1835
  oldMaxVOffset: 0,
1819
1836
 
1820
1837
  /** @private
1821
- Invoked whenever the contentView's frame changes. This will update the
1822
- scroller maxmimum and optionally update the scroller visibility if the
1838
+ Invoked whenever the contentView's frame changes. This will update the
1839
+ scroller maximum and optionally update the scroller visibility if the
1823
1840
  size of the contentView changes. We don't care about the origin since
1824
1841
  that is tracked separately from the offset values.
1825
1842
 
1826
1843
  @param {Boolean} force (optional) Re-calculate everything even if the contentView’s frame didn’t change size
1827
1844
  */
1828
1845
  contentViewFrameDidChange: function(force) {
1829
- var view = this.get('contentView'),
1846
+ var view = this.get('contentView'),
1830
1847
  f = (view) ? view.get('frame') : null,
1831
1848
  scale = this._scale,
1832
1849
  width = 0,
@@ -1851,7 +1868,7 @@ SC.ScrollView = SC.View.extend({
1851
1868
  dim = this.getPath('containerView.frame');
1852
1869
  dimWidth = dim.width;
1853
1870
  dimHeight = dim.height;
1854
-
1871
+
1855
1872
  if (this.get('hasHorizontalScroller') && (view = this.get('horizontalScrollerView'))) {
1856
1873
  // decide if it should be visible or not
1857
1874
  if (this.get('autohidesHorizontalScroller')) {
@@ -1860,7 +1877,7 @@ SC.ScrollView = SC.View.extend({
1860
1877
  view.setIfChanged('maximum', width-dimWidth) ;
1861
1878
  view.setIfChanged('proportion', dimWidth/width);
1862
1879
  }
1863
-
1880
+
1864
1881
  if (this.get('hasVerticalScroller') && (view = this.get('verticalScrollerView'))) {
1865
1882
  // decide if it should be visible or not
1866
1883
  if (this.get('autohidesVerticalScroller')) {
@@ -1869,20 +1886,20 @@ SC.ScrollView = SC.View.extend({
1869
1886
  view.setIfChanged('maximum', height-dimHeight) ;
1870
1887
  view.setIfChanged('proportion', dimHeight/height);
1871
1888
  }
1872
-
1889
+
1873
1890
  // If there is no vertical scroller and auto hiding is on, make
1874
1891
  // sure we are at the top if not already there
1875
- if (!this.get('isVerticalScrollerVisible') && (this.get('verticalScrollOffset') !== 0) &&
1892
+ if (!this.get('isVerticalScrollerVisible') && (this.get('verticalScrollOffset') !== 0) &&
1876
1893
  this.get('autohidesVerticalScroller')) {
1877
1894
  this.set('verticalScrollOffset', 0);
1878
1895
  }
1879
-
1896
+
1880
1897
  // Same thing for horizontal scrolling.
1881
- if (!this.get('isHorizontalScrollerVisible') && (this.get('horizontalScrollOffset') !== 0) &&
1898
+ if (!this.get('isHorizontalScrollerVisible') && (this.get('horizontalScrollOffset') !== 0) &&
1882
1899
  this.get('autohidesHorizontalScroller')) {
1883
1900
  this.set('horizontalScrollOffset', 0);
1884
1901
  }
1885
-
1902
+
1886
1903
  // This forces to recalculate the height of the frame when is at the bottom
1887
1904
  // of the scroll and the content dimension are smaller that the previous one
1888
1905
  var mxVOffSet = this.get('maximumVerticalScrollOffset'),
@@ -1894,10 +1911,14 @@ SC.ScrollView = SC.View.extend({
1894
1911
  if (forceHeight || forceWidth) {
1895
1912
  this.forceDimensionsRecalculation(forceWidth, forceHeight, vOffSet, hOffSet);
1896
1913
  }
1914
+
1915
+ // send change notifications since they don't invalidate automatically
1916
+ this.notifyPropertyChange('maximumVerticalScrollOffset');
1917
+ this.notifyPropertyChange('maximumHorizontalScrollOffset');
1897
1918
  },
1898
1919
 
1899
1920
  /** @private
1900
- If our frame changes, then we need to re-calculate the visiblility of our
1921
+ If our frame changes, then we need to re-calculate the visibility of our
1901
1922
  scrollers, etc.
1902
1923
  */
1903
1924
  frameDidChange: function() {
@@ -1916,15 +1937,15 @@ SC.ScrollView = SC.View.extend({
1916
1937
  },
1917
1938
 
1918
1939
  /** @private
1919
- Whenever the horizontal scroll offset changes, update the scrollers and
1940
+ Whenever the horizontal scroll offset changes, update the scrollers and
1920
1941
  edit the location of the contentView.
1921
1942
  */
1922
1943
  _scroll_horizontalScrollOffsetDidChange: function() {
1923
1944
  this.invokeLast(this.adjustElementScroll);
1924
1945
  }.observes('horizontalScrollOffset'),
1925
-
1946
+
1926
1947
  /** @private
1927
- Whenever the vertical scroll offset changes, update the scrollers and
1948
+ Whenever the vertical scroll offset changes, update the scrollers and
1928
1949
  edit the location of the contentView.
1929
1950
  */
1930
1951
  _scroll_verticalScrollOffsetDidChange: function() {
@@ -1956,7 +1977,7 @@ SC.ScrollView = SC.View.extend({
1956
1977
 
1957
1978
  if (container && !SC.platform.touch) {
1958
1979
  container = container.$()[0];
1959
-
1980
+
1960
1981
  if (container) {
1961
1982
  if (verticalScrollOffset !== this._verticalScrollOffset) {
1962
1983
  container.scrollTop = verticalScrollOffset;
@@ -1989,8 +2010,8 @@ SC.ScrollView = SC.View.extend({
1989
2010
 
1990
2011
  /** @private */
1991
2012
  _scroll_verticalScrollOffset: 0,
1992
-
2013
+
1993
2014
  /** @private */
1994
2015
  _scroll_horizontalScrollOffset: 0
1995
-
2016
+
1996
2017
  });