sproutcore 1.8.2.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. data/VERSION.yml +2 -2
  2. data/lib/buildtasks/helpers/file_rule_list.rb +3 -3
  3. data/lib/frameworks/sproutcore/Buildfile +1 -1
  4. data/lib/frameworks/sproutcore/CHANGELOG.md +235 -16
  5. data/lib/frameworks/sproutcore/apps/media_examples/Buildfile +13 -0
  6. data/lib/frameworks/sproutcore/apps/media_examples/core.js +35 -0
  7. data/lib/frameworks/sproutcore/apps/media_examples/resources/loading.rhtml +3 -0
  8. data/lib/frameworks/sproutcore/apps/media_examples/resources/main_page.js +53 -0
  9. data/lib/frameworks/sproutcore/apps/media_examples/views/audio_view.js +100 -0
  10. data/lib/frameworks/sproutcore/apps/media_examples/views/camera_view.js +39 -0
  11. data/lib/frameworks/sproutcore/apps/media_examples/views/capabilities_view.js +116 -0
  12. data/lib/frameworks/sproutcore/apps/media_examples/views/microphone_view.js +40 -0
  13. data/lib/frameworks/sproutcore/apps/media_examples/views/video_view.js +107 -0
  14. data/lib/frameworks/sproutcore/apps/showcase/Buildfile +11 -0
  15. data/lib/frameworks/sproutcore/apps/showcase/README +15 -0
  16. data/lib/frameworks/sproutcore/apps/showcase/controllers/source_controller.js +15 -0
  17. data/lib/frameworks/sproutcore/apps/showcase/controllers/source_tree_controller.js +212 -0
  18. data/lib/frameworks/sproutcore/apps/showcase/core.js +170 -0
  19. data/lib/frameworks/sproutcore/apps/showcase/main.js +27 -0
  20. data/lib/frameworks/sproutcore/apps/showcase/resources/_theme.css +18 -0
  21. data/lib/frameworks/sproutcore/apps/showcase/resources/api.css +80 -0
  22. data/lib/frameworks/sproutcore/apps/showcase/resources/favicon.ico +0 -0
  23. data/lib/frameworks/sproutcore/apps/showcase/resources/images/alarm-clock.png +0 -0
  24. data/lib/frameworks/sproutcore/apps/showcase/resources/images/balloon-facebook.png +0 -0
  25. data/lib/frameworks/sproutcore/apps/showcase/resources/images/balloon-twitter.png +0 -0
  26. data/lib/frameworks/sproutcore/apps/showcase/resources/images/balloon.png +0 -0
  27. data/lib/frameworks/sproutcore/apps/showcase/resources/images/bullet.png +0 -0
  28. data/lib/frameworks/sproutcore/apps/showcase/resources/images/calendar-insert.png +0 -0
  29. data/lib/frameworks/sproutcore/apps/showcase/resources/images/cross.png +0 -0
  30. data/lib/frameworks/sproutcore/apps/showcase/resources/images/example-box-bg.png +0 -0
  31. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit-grape.png +0 -0
  32. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit-lime.png +0 -0
  33. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit-orange.png +0 -0
  34. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit.png +0 -0
  35. data/lib/frameworks/sproutcore/apps/showcase/resources/images/glow.png +0 -0
  36. data/lib/frameworks/sproutcore/apps/showcase/resources/images/green-dot.png +0 -0
  37. data/lib/frameworks/sproutcore/apps/showcase/resources/images/grey-dot.png +0 -0
  38. data/lib/frameworks/sproutcore/apps/showcase/resources/images/logo.png +0 -0
  39. data/lib/frameworks/sproutcore/apps/showcase/resources/images/pixels.png +0 -0
  40. data/lib/frameworks/sproutcore/apps/showcase/resources/images/red-dot.png +0 -0
  41. data/lib/frameworks/sproutcore/apps/showcase/resources/images/sproutcore-logo.png +0 -0
  42. data/lib/frameworks/sproutcore/apps/showcase/resources/images/sproutcore-startup-landscape.jpg +0 -0
  43. data/lib/frameworks/sproutcore/apps/{test_controls → showcase}/resources/loading.rhtml +1 -1
  44. data/lib/frameworks/sproutcore/apps/showcase/resources/main_page.js +61 -0
  45. data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +365 -0
  46. data/lib/frameworks/sproutcore/apps/showcase/resources/views_page.js +64 -0
  47. data/lib/frameworks/sproutcore/apps/showcase/system/views_item_content.js +59 -0
  48. data/lib/frameworks/sproutcore/apps/showcase/theme.js +27 -0
  49. data/lib/frameworks/sproutcore/apps/showcase/views/button_views.js +55 -0
  50. data/lib/frameworks/sproutcore/apps/showcase/views/checkbox_views.js +34 -0
  51. data/lib/frameworks/sproutcore/apps/showcase/views/container_views.js +29 -0
  52. data/lib/frameworks/sproutcore/apps/showcase/views/date_field_views.js +30 -0
  53. data/lib/frameworks/sproutcore/apps/showcase/views/disclosure_views.js +22 -0
  54. data/lib/frameworks/sproutcore/apps/showcase/views/grid_views.js +28 -0
  55. data/lib/frameworks/sproutcore/apps/showcase/views/image_button_views.js +22 -0
  56. data/lib/frameworks/sproutcore/apps/showcase/views/image_views.js +51 -0
  57. data/lib/frameworks/sproutcore/apps/showcase/views/label_views.js +53 -0
  58. data/lib/frameworks/sproutcore/apps/showcase/views/list_views.js +31 -0
  59. data/lib/frameworks/sproutcore/apps/showcase/views/popup_button_views.js +24 -0
  60. data/lib/frameworks/sproutcore/apps/showcase/views/progress_views.js +26 -0
  61. data/lib/frameworks/sproutcore/apps/showcase/views/radio_views.js +30 -0
  62. data/lib/frameworks/sproutcore/apps/showcase/views/scroll_views.js +40 -0
  63. data/lib/frameworks/sproutcore/apps/showcase/views/segmented_views.js +90 -0
  64. data/lib/frameworks/sproutcore/apps/showcase/views/select_views.js +64 -0
  65. data/lib/frameworks/sproutcore/apps/showcase/views/slider_views.js +46 -0
  66. data/lib/frameworks/sproutcore/apps/showcase/views/source_list_views.js +23 -0
  67. data/lib/frameworks/sproutcore/apps/showcase/views/split_views.js +22 -0
  68. data/lib/frameworks/sproutcore/apps/showcase/views/stacked_views.js +23 -0
  69. data/lib/frameworks/sproutcore/apps/showcase/views/static_content_views.js +23 -0
  70. data/lib/frameworks/sproutcore/apps/showcase/views/tab_views.js +51 -0
  71. data/lib/frameworks/sproutcore/apps/showcase/views/text_field_views.js +52 -0
  72. data/lib/frameworks/sproutcore/apps/showcase/views/toolbar_views.js +23 -0
  73. data/lib/frameworks/sproutcore/apps/showcase/views/views_item_view.js +91 -0
  74. data/lib/frameworks/sproutcore/apps/showcase/views/views_list_view.js +67 -0
  75. data/lib/frameworks/sproutcore/apps/showcase/views/web_views.js +32 -0
  76. data/lib/frameworks/sproutcore/apps/showcase/views/well_views.js +29 -0
  77. data/lib/frameworks/sproutcore/apps/showcase/views/workspace_views.js +23 -0
  78. data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +2 -1
  79. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +91 -51
  80. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +93 -27
  81. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +196 -15
  82. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +1 -1
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +26 -10
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/object.js +90 -92
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +69 -39
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +769 -0
  88. data/lib/frameworks/sproutcore/frameworks/{desktop → core_foundation}/system/key_bindings.js +0 -0
  89. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +4 -4
  90. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/req_anim_frame.js +31 -0
  91. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +7 -1
  92. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils.js +8 -6
  93. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +49 -0
  94. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/selection_support.js +1 -1
  95. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/ext/object_test.js +106 -0
  96. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/color.js +448 -0
  97. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +8 -1
  98. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/timer/invokeLater.js +24 -24
  99. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/utils/offset.js +5 -5
  100. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/animation.js +90 -30
  101. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +14 -6
  102. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/touch.js +113 -0
  103. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +64 -8
  104. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +20 -4
  105. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +58 -38
  106. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/touch.js +32 -39
  107. data/lib/frameworks/sproutcore/frameworks/core_tools/models/target.js +20 -15
  108. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +19 -15
  109. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_record.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +16 -16
  111. data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +32 -32
  112. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +53 -38
  113. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +9 -8
  114. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +26 -26
  115. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +1 -3
  116. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +4 -3
  117. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +0 -4
  118. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +96 -8
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +22 -4
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/data_store.js +24 -24
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +376 -37
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +51 -53
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +108 -66
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +33 -35
  125. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +6 -4
  126. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +33 -3
  127. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +181 -15
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +6 -0
  129. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/border.js +3 -1
  130. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +2 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +153 -6
  132. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +39 -18
  133. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -1
  134. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +6 -7
  135. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +139 -50
  136. data/lib/frameworks/sproutcore/frameworks/{foundation → desktop}/resources/button_view.css +3 -3
  137. data/lib/frameworks/sproutcore/frameworks/{foundation → desktop}/resources/checkbox_view.css +4 -0
  138. data/lib/frameworks/sproutcore/frameworks/desktop/resources/disclosure.css +2 -2
  139. data/lib/frameworks/sproutcore/frameworks/{foundation → desktop}/resources/radio_view.css +0 -0
  140. data/lib/frameworks/sproutcore/frameworks/desktop/resources/segmented.css +23 -17
  141. data/lib/frameworks/sproutcore/frameworks/desktop/resources/web.css +5 -0
  142. data/lib/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +4 -5
  143. data/lib/frameworks/sproutcore/frameworks/desktop/tests/mixins/border.js +3 -12
  144. data/lib/frameworks/sproutcore/frameworks/desktop/tests/mixins/collection_fast_path.js +58 -0
  145. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +79 -12
  147. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +13 -0
  148. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +2 -2
  149. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/drag_and_drop.js +147 -0
  150. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +123 -2
  151. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/drag_and_drop.js +150 -0
  152. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +58 -44
  153. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/methods.js +9 -80
  154. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +54 -130
  155. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/observers.js +78 -0
  156. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +64 -9
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/methods.js +11 -11
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +28 -2
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/methods.js +74 -0
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/ui.js +141 -0
  161. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +4 -1
  162. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +69 -36
  163. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +27 -11
  164. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +41 -25
  165. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +51 -89
  166. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +59 -34
  167. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +59 -49
  168. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +1 -1
  169. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +4 -1
  170. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +14 -14
  171. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +8 -8
  172. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +13 -1
  173. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +4 -1
  174. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/colors.js +21 -22
  175. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/selection_support.js +26 -0
  176. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js +4 -5
  177. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/image_queue.js +68 -44
  178. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +10 -0
  179. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/methods.js +0 -10
  180. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +24 -59
  181. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +47 -34
  182. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +96 -12
  183. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +38 -0
  184. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +38 -50
  185. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +6 -2
  186. data/lib/frameworks/sproutcore/frameworks/media/media_capabilities.js +211 -0
  187. data/lib/frameworks/sproutcore/frameworks/media/render_delegates/media_slider.js +77 -0
  188. data/lib/frameworks/sproutcore/frameworks/media/resources/playeras3.fla +0 -0
  189. data/lib/frameworks/sproutcore/frameworks/media/resources/video.css +129 -115
  190. data/lib/frameworks/sproutcore/frameworks/media/resources/videoCanvas.swf +0 -0
  191. data/lib/frameworks/sproutcore/frameworks/media/tests/media_capabilities.js +194 -0
  192. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +56 -173
  193. data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +15 -18
  194. data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +63 -219
  195. data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +4 -2
  196. data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +4 -8
  197. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +51 -160
  198. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +138 -102
  199. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +8 -0
  200. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
  201. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +8 -2
  202. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +32 -12
  203. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +28 -24
  204. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +0 -2
  205. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +111 -12
  206. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +9 -7
  207. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +8 -2
  208. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable.js +160 -115
  209. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/enhance.js +64 -19
  210. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/mixin.js +83 -0
  211. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/bind.js +3 -0
  212. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/collection.js +13 -0
  213. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/handlebars.js +4 -2
  214. data/lib/frameworks/sproutcore/frameworks/template_view/views/template_collection.js +5 -5
  215. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +5 -1
  216. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +13 -12
  217. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list.css +9 -2
  218. data/lib/frameworks/sproutcore/themes/ace/resources/progress/ace/progress.css +105 -5
  219. data/lib/frameworks/sproutcore/themes/ace/resources/progress/ace/progress_view_indeterminate_content.png +0 -0
  220. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/18px/segmented.css +19 -15
  221. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented.css +93 -21
  222. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_active.png +0 -0
  223. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_normal.png +0 -0
  224. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_selected.png +0 -0
  225. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_selected_active.png +0 -0
  226. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented.css +91 -15
  227. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_active.png +0 -0
  228. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_normal.png +0 -0
  229. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_selected.png +0 -0
  230. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_selected_active.png +0 -0
  231. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/44px/segmented.css +21 -17
  232. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/segmented.css +26 -25
  233. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/menu_item_view.css +2 -4
  234. data/lib/sproutcore/helpers/minifier.rb +5 -5
  235. data/lib/sproutcore/tools/build.rb +1 -1
  236. data/sproutcore.gemspec +6 -1
  237. data/vendor/chance/lib/chance/instance/slicing.rb +2 -2
  238. metadata +143 -60
  239. data/lib/frameworks/sproutcore/apps/test_controls/Buildfile +0 -0
  240. data/lib/frameworks/sproutcore/apps/test_controls/controllers/alert.js +0 -39
  241. data/lib/frameworks/sproutcore/apps/test_controls/controllers/buttons.js +0 -21
  242. data/lib/frameworks/sproutcore/apps/test_controls/controllers/categories.js +0 -125
  243. data/lib/frameworks/sproutcore/apps/test_controls/controllers/category.js +0 -36
  244. data/lib/frameworks/sproutcore/apps/test_controls/controllers/select.js +0 -12
  245. data/lib/frameworks/sproutcore/apps/test_controls/controllers/split.js +0 -74
  246. data/lib/frameworks/sproutcore/apps/test_controls/core.js +0 -29
  247. data/lib/frameworks/sproutcore/apps/test_controls/main.js +0 -14
  248. data/lib/frameworks/sproutcore/apps/test_controls/resources/buttons_page.js +0 -158
  249. data/lib/frameworks/sproutcore/apps/test_controls/resources/checkboxes_page.js +0 -53
  250. data/lib/frameworks/sproutcore/apps/test_controls/resources/flow_layout_page.js +0 -85
  251. data/lib/frameworks/sproutcore/apps/test_controls/resources/list_page.js +0 -40
  252. data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.css +0 -60
  253. data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.js +0 -151
  254. data/lib/frameworks/sproutcore/apps/test_controls/resources/panels_page.js +0 -62
  255. data/lib/frameworks/sproutcore/apps/test_controls/resources/progress_page.js +0 -33
  256. data/lib/frameworks/sproutcore/apps/test_controls/resources/radio_page.js +0 -55
  257. data/lib/frameworks/sproutcore/apps/test_controls/resources/scroll_page.js +0 -77
  258. data/lib/frameworks/sproutcore/apps/test_controls/resources/segmented_page.js +0 -99
  259. data/lib/frameworks/sproutcore/apps/test_controls/resources/select_page.js +0 -75
  260. data/lib/frameworks/sproutcore/apps/test_controls/resources/sliders_page.js +0 -54
  261. data/lib/frameworks/sproutcore/apps/test_controls/resources/split_page.js +0 -141
  262. data/lib/frameworks/sproutcore/apps/test_controls/resources/strings.js +0 -50
  263. data/lib/frameworks/sproutcore/apps/test_controls/resources/tab_page.js +0 -53
  264. data/lib/frameworks/sproutcore/apps/test_controls/resources/text_field_page.js +0 -65
  265. data/lib/frameworks/sproutcore/apps/test_controls/theme.js +0 -34
  266. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/detail.js +0 -15
  267. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/source.js +0 -15
  268. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/target.js +0 -15
  269. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +0 -15
  270. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/tests.js +0 -15
  271. data/lib/frameworks/sproutcore/apps/tests/tests/models/target.js +0 -15
  272. data/lib/frameworks/sproutcore/apps/tests/tests/models/test.js +0 -15
  273. data/lib/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +0 -15
  274. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +0 -21
@@ -193,6 +193,12 @@ SC.Scanner = SC.Object.extend(
193
193
 
194
194
  is true, since they are technically the same position in time.
195
195
 
196
+ You can also use SC.DateTime as a record attribute on a data model.
197
+
198
+ SC.Record.attr(SC.DateTime); // Default format is ISO8601. See `SC.DateTime.recordFormat`
199
+ SC.Record.attr(SC.DateTime, { format: '%d/%m/%Y' }); // Attribute stored as a string in '%d/%m/%Y' format
200
+ SC.Record.attr(SC.DateTime, { useUnixTime: YES }); // Attribute stored as a number in Unix time
201
+
196
202
  @extends SC.Object
197
203
  @extends SC.Freezable
198
204
  @extends SC.Copyable
@@ -109,7 +109,9 @@ SC.Border = {
109
109
 
110
110
  /** @private */
111
111
  initMixin: function() {
112
- console.warn("SC.Border is deprecated, please set border in your layout");
112
+ //@if(debug)
113
+ SC.warn("Developer Warning: SC.Border is deprecated, please set border in your layout");
114
+ //@endif
113
115
  this._sc_border_borderStyleDidChange();
114
116
  this._sc_border_borderDimensionsDidChange();
115
117
  },
@@ -18,6 +18,7 @@ SC.CollectionFastPath = {
18
18
  //
19
19
  initMixin: function() {
20
20
  this._indexMap = {};
21
+ this._viewMap = {};
21
22
  },
22
23
 
23
24
  /**
@@ -340,7 +341,7 @@ SC.CollectionFastPath = {
340
341
  */
341
342
  remapItemViews: function(nowShowing) {
342
343
  // reset the view map, but keep the old for removing
343
- var oldMap = this._viewMap || {},
344
+ var oldMap = this._viewMap,
344
345
  newMap = (this._viewMap = {}),
345
346
  indexMap = (this._indexMap = {}),
346
347
  mayExist = [],
@@ -381,10 +381,10 @@ SC.MenuPane = SC.PickerPane.extend(
381
381
  separator.
382
382
 
383
383
  @type String
384
- @default "separator"
384
+ @default "isSeparator"
385
385
  @commonTask Menu Item Properties
386
386
  */
387
- itemSeparatorKey: 'separator',
387
+ itemSeparatorKey: 'isSeparator',
388
388
 
389
389
  /**
390
390
  The name of the property that contains the target for the action that is
@@ -543,7 +543,7 @@ SC.MenuPane = SC.PickerPane.extend(
543
543
  createChildViews: function() {
544
544
  var scroll, menuView, menuItemViews;
545
545
 
546
- scroll = this.createChildView(SC.MenuScrollView, {
546
+ scroll = this._menuScrollView = this.createChildView(SC.MenuScrollView, {
547
547
  borderStyle: SC.BORDER_NONE,
548
548
  controlSize: this.get('controlSize')
549
549
  });
@@ -552,12 +552,12 @@ SC.MenuPane = SC.PickerPane.extend(
552
552
  parentViewDidResize: function() {
553
553
  this.notifyPropertyChange('frame');
554
554
  },
555
-
555
+
556
556
  viewDidResize: function() {
557
-
557
+
558
558
  }
559
559
  });
560
-
560
+
561
561
  menuItemViews = this.get('menuItemViews');
562
562
  menuView.set('layout', { top: 0, left: 0, height : this.get('menuHeight')});
563
563
  menuView.replaceAllChildren(menuItemViews);
@@ -674,6 +674,17 @@ SC.MenuPane = SC.PickerPane.extend(
674
674
  height = item.get(heightKey);
675
675
  if (!height) {
676
676
  height = item.get(separatorKey) ? separatorHeight : defaultHeight;
677
+ //@if(debug)
678
+ // TODO: Remove in 1.10 and 2.0
679
+ // Help the developer if they were relying on the previously misleading
680
+ // default value of itemSeparatorKey. We need to ensure that the change
681
+ // is backwards compatible with apps prior to 1.9.
682
+ if (separatorKey === 'isSeparator' && SC.none(item.get('isSeparator')) && item.get('separator')) {
683
+ SC.warn("Developer Warning: the default value of itemSeparatorKey has been changed from 'separator' to 'isSeparator' to match the documentation. Please update your menu item properties to 'isSeparator: YES' to remove this warning.");
684
+ height = separatorHeight;
685
+ item.set('isSeparator', YES);
686
+ }
687
+ //@endif
677
688
  }
678
689
 
679
690
  propertiesHash = {
@@ -1020,6 +1031,142 @@ SC.MenuPane = SC.PickerPane.extend(
1020
1031
  return YES;
1021
1032
  },
1022
1033
 
1034
+ /**
1035
+ Selects the first enabled menu item when the home key is pressed.
1036
+
1037
+ @private
1038
+ */
1039
+ moveToBeginningOfDocument: function() {
1040
+ var items = this.get('menuItemViews'),
1041
+ len = items.get('length'),
1042
+ idx = 0;
1043
+
1044
+ while (idx < len) {
1045
+ if (items[idx].get('isEnabled')) {
1046
+ this.set('currentMenuItem', items[idx]);
1047
+ items[idx].becomeFirstResponder();
1048
+ break;
1049
+ }
1050
+ ++idx;
1051
+ }
1052
+
1053
+ return YES;
1054
+ },
1055
+
1056
+ /**
1057
+ Selects the last enabled menu item when the end key is pressed.
1058
+
1059
+ @private
1060
+ */
1061
+ moveToEndOfDocument: function() {
1062
+ var items = this.get('menuItemViews'),
1063
+ len = items.get('length'),
1064
+ idx = len - 1;
1065
+
1066
+ while (idx >= 0) {
1067
+ if (items[idx].get('isEnabled')) {
1068
+ this.set('currentMenuItem', items[idx]);
1069
+ items[idx].becomeFirstResponder();
1070
+ break;
1071
+ }
1072
+ --idx;
1073
+ }
1074
+
1075
+ return YES;
1076
+ },
1077
+
1078
+ /**
1079
+ Selects the next item one page down. If that is not enabled,
1080
+ continues to move down until it finds an enabled item.
1081
+
1082
+ @private
1083
+ */
1084
+ pageDown: function() {
1085
+ var currentMenuItem = this.get('currentMenuItem'),
1086
+ item, items = this.get('menuItemViews'),
1087
+ len = items.get('length'),
1088
+ idx = 0,
1089
+ foundItemIdx,
1090
+ verticalOffset = 0,
1091
+ verticalPageScroll;
1092
+
1093
+ if (this._menuScrollView && this._menuScrollView.verticalScrollerView2) {
1094
+
1095
+ if (currentMenuItem) {
1096
+ idx = currentMenuItem.getPath('content.contentIndex');
1097
+ }
1098
+
1099
+ foundItemIdx = idx;
1100
+ verticalPageScroll = this._menuScrollView.get('verticalPageScroll');
1101
+ for (idx; idx < len; idx++) {
1102
+ item = items[idx];
1103
+ verticalOffset += item.get('layout').height;
1104
+
1105
+ if (verticalOffset > verticalPageScroll) {
1106
+ // We've gone further than an entire page scroll, so stop.
1107
+ break;
1108
+ } else {
1109
+ // Only accept enabled items (which also excludes separators).
1110
+ if (item.get('isEnabled')) { foundItemIdx = idx; }
1111
+ }
1112
+ }
1113
+
1114
+ item = items[foundItemIdx];
1115
+ this.set('currentMenuItem', item);
1116
+ item.becomeFirstResponder();
1117
+ } else {
1118
+ this.moveToEndOfDocument();
1119
+ }
1120
+
1121
+ return YES;
1122
+ },
1123
+
1124
+ /**
1125
+ Selects the previous item one page up. If that is not enabled,
1126
+ continues to move up until it finds an enabled item.
1127
+
1128
+ @private
1129
+ */
1130
+ pageUp: function() {
1131
+ var currentMenuItem = this.get('currentMenuItem'),
1132
+ item, items = this.get('menuItemViews'),
1133
+ len = items.get('length'),
1134
+ idx = len - 1,
1135
+ foundItemIdx,
1136
+ verticalOffset = 0,
1137
+ verticalPageScroll;
1138
+
1139
+ if (this._menuScrollView && this._menuScrollView.verticalScrollerView) {
1140
+
1141
+ if (currentMenuItem) {
1142
+ idx = currentMenuItem.getPath('content.contentIndex');
1143
+ }
1144
+
1145
+ foundItemIdx = idx;
1146
+ verticalPageScroll = this._menuScrollView.get('verticalPageScroll');
1147
+ for (idx; idx >= 0; idx--) {
1148
+ item = items[idx];
1149
+ verticalOffset += item.get('layout').height;
1150
+
1151
+ if (verticalOffset > verticalPageScroll) {
1152
+ // We've gone further than an entire page scroll, so stop.
1153
+ break;
1154
+ } else {
1155
+ // Only accept enabled items (which also excludes separators).
1156
+ if (item.get('isEnabled')) { foundItemIdx = idx; }
1157
+ }
1158
+ }
1159
+
1160
+ item = items[foundItemIdx];
1161
+ this.set('currentMenuItem', item);
1162
+ item.becomeFirstResponder();
1163
+ } else {
1164
+ this.moveToBeginningOfDocument();
1165
+ }
1166
+
1167
+ return YES;
1168
+ },
1169
+
1023
1170
  insertText: function(chr, evt) {
1024
1171
  var timer = this._timer, keyBuffer = this._keyBuffer;
1025
1172
 
@@ -9,35 +9,35 @@
9
9
  /** @class
10
10
 
11
11
  A modal pane is used to capture mouse events inside a pane that is modal.
12
- You normally will not work with modal panes directly, though you may set
13
- the modalPane property to a subclass of this pane when designing custom
12
+ You normally will not work with modal panes directly, though you may set
13
+ the modalPane property to a subclass of this pane when designing custom
14
14
  panes.
15
-
15
+
16
16
  A modal pane is automatically appended when a pane with isModal set to
17
17
  `YES` is made visible and removed when the same pane is hidden. The only
18
18
  purpose of the `ModalPane` is to absorb mouse events so that they cannot
19
19
  filter through to the underlying content.
20
-
20
+
21
21
  @extends SC.Pane
22
22
  @since SproutCore 1.0
23
23
  */
24
24
  SC.ModalPane = SC.Pane.extend(
25
25
  /** @scope SC.ModalPane.prototype */{
26
-
26
+
27
27
  /**
28
28
  @type Array
29
29
  @default ['sc-modal']
30
30
  @see SC.View#classNames
31
31
  */
32
32
  classNames: 'sc-modal',
33
-
33
+
34
34
  /** @private */
35
35
  _openPaneCount: 0,
36
-
36
+
37
37
  /** @private
38
38
  Called by a pane just before it appends itself. The modal pane can
39
39
  make itself visible first if needed.
40
-
40
+
41
41
  @param {SC.Pane} pane the pane
42
42
  @returns {SC.ModalPane} receiver
43
43
  */
@@ -53,18 +53,18 @@ SC.ModalPane = SC.Pane.extend(
53
53
  this._hideShowTextfields(_tmpPane, NO);
54
54
  }
55
55
  }
56
- return this ;
57
- },
58
-
56
+ return this ;
57
+ },
58
+
59
59
  /** @private
60
60
  Called by a pane just after it removes itself. The modal pane can remove
61
- itself if needed. Modal panes only remove themselves when an equal
61
+ itself if needed. Modal panes only remove themselves when an equal
62
62
  number of `paneWillAppend()` and `paneDidRemove()` calls are received.
63
-
63
+
64
64
  @param {SC.Pane} pane the pane
65
65
  @returns {SC.ModalPane} receiver
66
66
  */
67
- paneDidRemove: function(pane) {
67
+ paneDidRemove: function(pane) {
68
68
  var _tmpPane;
69
69
  this._openPaneCount--;
70
70
  var panes = SC.RootResponder.responder.panes;
@@ -80,24 +80,45 @@ SC.ModalPane = SC.Pane.extend(
80
80
  if (this.get('isVisibleInWindow')) this.remove();
81
81
  }
82
82
  },
83
-
84
- /** @private */
83
+
84
+ /** @private
85
+ If `focusable` is NO all SC.TextFieldViews not belonging to the given
86
+ pane will have isBrowserFocusable set to NO. If `focusable` is YES, then
87
+ all SC.TextFieldViews not belonging to the given pane will have
88
+ isBrowserFocusable set to YES, unless they previously had it set explictly
89
+ to NO.
90
+ */
85
91
  _hideShowTextfields: function(pane, focusable){
86
92
  var view;
87
93
  for(view in SC.View.views){
88
94
  view = SC.View.views[view];
89
95
  if (view!==pane && view.get('pane')===pane && view.get('isTextField')){
96
+ if (focusable) {
97
+ // Setting isBrowserFocusable back to YES. If we cached the previous
98
+ // value, use that instead.
99
+ if (view._scmp_isBrowserFocusable !== undefined) {
100
+ focusable = view._scmp_isBrowserFocusable;
101
+
102
+ // Clean up entirely.
103
+ delete view._scmp_isBrowserFocusable;
104
+ }
105
+ } else {
106
+ // Cache the value of isBrowserFocusable. If the text field
107
+ // already had isBrowserFocusable: NO, we don't want to
108
+ // set it back to YES.
109
+ view._scmp_isBrowserFocusable = view.get('isBrowserFocusable');
110
+ }
90
111
  view.set('isBrowserFocusable', focusable);
91
112
  }
92
113
  }
93
114
  },
94
-
115
+
95
116
  /** @private */
96
117
  mouseDown: function(evt) {
97
118
  var owner = this.get('owner');
98
119
  if (owner && owner.modalPaneDidClick) owner.modalPaneDidClick(evt);
99
120
  },
100
-
121
+
101
122
  /** @private */
102
123
  touchStart: function(evt) {
103
124
  this.mouseDown(evt);
@@ -137,11 +137,12 @@ SC.DropTarget = {
137
137
  @param {SC.Drag} drag The current drag object
138
138
  @param {SC.Event} evt The most recent mouse move event. Use to get
139
139
  location
140
+ @param {DragOp} op The proposed drag operation. A drag constant
140
141
 
141
142
  @returns {DragOps} A mask of all the drag operations allowed or
142
143
  SC.DRAG_NONE
143
144
  */
144
- computeDragOperations: function(drag, evt) {
145
+ computeDragOperations: function(drag, evt, op) {
145
146
  return SC.DRAG_NONE;
146
147
  },
147
148
 
@@ -14,7 +14,7 @@ SC.BaseTheme.disclosureRenderDelegate = SC.RenderDelegate.create({
14
14
 
15
15
  var theme = dataSource.get('theme'),
16
16
  value = dataSource.get('value'),
17
- title = dataSource.get('title');
17
+ labelClassNames = ['sc-button-label', 'sc-disclosure-label'];
18
18
 
19
19
  var labelId = SC.guidFor(dataSource) + "-label";
20
20
 
@@ -29,8 +29,8 @@ SC.BaseTheme.disclosureRenderDelegate = SC.RenderDelegate.create({
29
29
  if (dataSource.get('isActive')) state += ' active';
30
30
 
31
31
  context.push('<img src = "' + SC.BLANK_IMAGE_URL + '" class = "disclosure button ' + state + '" />');
32
-
33
- context = context.begin('span').addClass('sc-button-label').id(labelId);
32
+
33
+ context = context.begin('span').addClass(labelClassNames).id(labelId);
34
34
  theme.labelRenderDelegate.render(dataSource, context);
35
35
  context = context.end();
36
36
  },
@@ -39,8 +39,7 @@ SC.BaseTheme.disclosureRenderDelegate = SC.RenderDelegate.create({
39
39
  this.updateSizeClassName(dataSource, jquery);
40
40
 
41
41
  var theme = dataSource.get('theme'),
42
- value = dataSource.get('value'),
43
- title = dataSource.get('title');
42
+ value = dataSource.get('value');
44
43
 
45
44
  //addressing accessibility
46
45
  jquery.attr('aria-expanded', value);
@@ -52,8 +51,8 @@ SC.BaseTheme.disclosureRenderDelegate = SC.RenderDelegate.create({
52
51
  closed: !dataSource.get('isSelected'),
53
52
  active: dataSource.get('isActive')
54
53
  });
55
-
56
- theme.labelRenderDelegate.update(dataSource, jquery.find('span.sc-button-label'));
54
+
55
+ theme.labelRenderDelegate.update(dataSource, jquery.find('span.sc-disclosure-label'));
57
56
  }
58
57
  });
59
58
 
@@ -5,37 +5,42 @@
5
5
  // License: Licensed under MIT license (see license.js)
6
6
  // ==========================================================================
7
7
 
8
+ SC.BaseTheme.PROGRESS_OFFSET = 0.5;
9
+ SC.BaseTheme.PROGRESS_OFFSET_RANGE = 42;
10
+
8
11
  /**
9
- Renders and updates DOM representations of progress bars.
10
-
11
- Parameters
12
- --------------------------
13
- Expects these properties on the data source:
14
-
15
- - `isIndeterminate`
16
- - `isRunning`
17
- - `isEnabled`
18
- - `value`
19
-
20
- Theme Constants
21
- -------------------------------------
22
- Ace's `progressRenderDelegate`'s rendering process is not affected by
23
- any theme constants.
24
- */
12
+ Renders and updates DOM representations of progress bars.
13
+
14
+ Parameters
15
+ --------------------------
16
+ Expects these properties on the data source:
17
+
18
+ - `isIndeterminate`
19
+ - `isRunning`
20
+ - `isEnabled`
21
+ - `isVisibleInWindow`
22
+ - `value`
23
+
24
+ Theme Constants
25
+ -------------------------------------
26
+ Ace's `progressRenderDelegate`'s rendering process is not affected by
27
+ any theme constants.
28
+ */
25
29
  SC.BaseTheme.progressRenderDelegate = SC.RenderDelegate.create({
26
- className: 'progress',
30
+ className:'progress',
27
31
 
28
- render: function(dataSource, context) {
32
+ render:function (dataSource, context) {
29
33
  this.addSizeClassName(dataSource, context);
30
34
 
31
- var theme = dataSource.get('theme'),
32
- valueMax = dataSource.get('maximum'),
33
- valueMin = dataSource.get('minimum'),
34
- valueNow = dataSource.get('ariaValue');
35
+ var isIndeterminate = dataSource.get('isIndeterminate'),
36
+ theme = dataSource.get('theme'),
37
+ valueMax = dataSource.get('maximum'),
38
+ valueMin = dataSource.get('minimum'),
39
+ valueNow = dataSource.get('ariaValue');
35
40
 
36
41
  var value;
37
- if (dataSource.get('isIndeterminate')) {
38
- value = 120;
42
+ if (isIndeterminate) {
43
+ value = 1;
39
44
  } else {
40
45
  value = dataSource.get('value');
41
46
  }
@@ -46,13 +51,12 @@ SC.BaseTheme.progressRenderDelegate = SC.RenderDelegate.create({
46
51
  context.attr('aria-valuenow', valueNow);
47
52
  context.attr('aria-valuetext', valueNow);
48
53
 
49
-
50
54
  context.setClass({
51
- indeterminate: dataSource.get('isIndeterminate'),
52
- running: dataSource.get('isRunning'),
53
- disabled: !dataSource.get('isEnabled'),
54
- 'sc-empty': (value <= 0),
55
- 'sc-complete': (value >= 1)
55
+ indeterminate:isIndeterminate,
56
+ running:dataSource.get('isRunning') && isIndeterminate,
57
+ disabled:!dataSource.get('isEnabled'),
58
+ 'sc-empty':(value <= 0),
59
+ 'sc-complete':(value >= 1 && !isIndeterminate)
56
60
  });
57
61
 
58
62
  context = context.begin('div').addClass('track');
@@ -65,36 +69,121 @@ SC.BaseTheme.progressRenderDelegate = SC.RenderDelegate.create({
65
69
  context = context.end();
66
70
  },
67
71
 
68
- update: function(dataSource, $) {
69
- this.updateSizeClassName(dataSource, $);
72
+ update:function (dataSource, context) {
73
+ this.updateSizeClassName(dataSource, context);
70
74
 
71
75
  var theme = dataSource.get('theme'),
72
- valueMax = dataSource.get('maximum'),
73
- valueMin = dataSource.get('minimum'),
74
- valueNow = dataSource.get('ariaValue');
76
+ value,
77
+ valueMax = dataSource.get('maximum'),
78
+ valueMin = dataSource.get('minimum'),
79
+ valueNow = dataSource.get('ariaValue'),
80
+ isIndeterminate = dataSource.get('isIndeterminate'),
81
+ isRunning = dataSource.get('isRunning'),
82
+ isEnabled = dataSource.get('isEnabled'),
83
+ isVisibleInWindow = dataSource.get('isVisibleInWindow');
75
84
 
76
85
  // make accessible
77
- $.attr('aria-valuemax', valueMax);
78
- $.attr('aria-valuemin', valueMin);
79
- $.attr('aria-valuenow', valueNow);
80
- $.attr('aria-valuetext', valueNow);
81
-
86
+ context.attr('aria-valuemax', valueMax);
87
+ context.attr('aria-valuemin', valueMin);
88
+ context.attr('aria-valuenow', valueNow);
89
+ context.attr('aria-valuetext', valueNow);
82
90
 
83
- var value;
84
- if (dataSource.get('isIndeterminate')) {
85
- value = 120;
91
+ if (isIndeterminate) {
92
+ value = 1;
86
93
  } else {
87
94
  value = dataSource.get('value');
88
95
  }
89
96
 
90
- $.setClass({
91
- indeterminate: dataSource.get('isIndeterminate'),
92
- running: dataSource.get('isRunning'),
93
- disabled: !dataSource.get('isEnabled'),
94
- 'sc-empty': (value <= 0),
95
- 'sc-complete': (value >= 1)
97
+ context.setClass({
98
+ indeterminate:isIndeterminate,
99
+ running:isRunning && isIndeterminate,
100
+ disabled:!isEnabled,
101
+ 'sc-empty':(value <= 0),
102
+ 'sc-complete':(value >= 1 && !isIndeterminate)
96
103
  });
97
104
 
98
- $.find('.content').css('width', (value * 100) + "%");
105
+ context.find('.content').css('width', (value * 100) + "%");
106
+
107
+ // fallback for browsers that don't support css transitions
108
+ if(!SC.platform.supportsCSSTransitions) {
109
+ if (!this._queue[context[0].id]) {
110
+ this._queue[context[0].id] = {
111
+ offset:0,
112
+ element:SC.$(context).find('.content .middle'),
113
+ shouldAnimate:false
114
+ };
115
+ }
116
+
117
+ if (isIndeterminate && isRunning && isVisibleInWindow) {
118
+ // save offset in the queue and request animation
119
+ this._queue[context[0].id].shouldAnimate = true;
120
+ this.animate(dataSource);
121
+ } else if (!isIndeterminate) {
122
+ // Clear out our custom background-position when isIndeterminate toggles.
123
+ this._queue[context[0].id].element.css('background-position', '');
124
+ } else {
125
+ this._queue[context[0].id].shouldAnimate = false;
126
+ }
127
+ }
128
+ },
129
+
130
+ /** @private Queue of objects to animate: { id, offset, element } */
131
+ _queue: {},
132
+
133
+ /** @private Catch double calls to _animate */
134
+ _animating: false,
135
+
136
+ /**
137
+ Animates the indeterminate progress view's middle background using
138
+ JavaScript and requestAnimationFrame().
139
+ */
140
+ animate: function (dataSource) {
141
+ var self = this;
142
+
143
+ // avoid invoking the animation code multiple times if more than
144
+ // one progress bar needs animating *and* one has already started the loop
145
+ if (this._animating) {
146
+ return;
147
+ }
148
+
149
+ function _animate() {
150
+ var offset,
151
+ lastOffset,
152
+ roundedOffset,
153
+ viewsToAnimate = self._queue,
154
+ animations = 0,
155
+ params;
156
+
157
+ var id;
158
+ for (id in viewsToAnimate) {
159
+ if (viewsToAnimate.hasOwnProperty(id)) {
160
+ params=viewsToAnimate[id];
161
+ if (params.shouldAnimate) {
162
+ self._animating = true;
163
+ animations++;
164
+ lastOffset = params.offset || 0;
165
+ offset = (lastOffset + SC.BaseTheme.PROGRESS_OFFSET) % SC.BaseTheme.PROGRESS_OFFSET_RANGE;
166
+
167
+ // Only update the style when the offset changes (this avoids making
168
+ // the browser recalculate style in each frame).
169
+ roundedOffset = Math.round(offset);
170
+ if (roundedOffset > Math.round(lastOffset)) {
171
+ params.element.css('background-position', roundedOffset + "px 0px");
172
+ }
173
+
174
+ params.offset = offset;
175
+ }
176
+ }
177
+ }
178
+
179
+ if (animations === 0) {
180
+ self._animating = false;
181
+ } else {
182
+ window.requestAnimationFrame(_animate);
183
+ }
184
+ }
185
+
186
+ // Start the animation.
187
+ _animate();
99
188
  }
100
189
  });