sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. data/Buildfile +4 -2
  2. data/frameworks/sproutcore/Buildfile +3 -2
  3. data/frameworks/sproutcore/README +2 -1
  4. data/frameworks/sproutcore/apps/docs/core.js +27 -0
  5. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
  6. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
  7. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
  8. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
  9. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
  10. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
  11. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
  12. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
  13. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
  14. data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
  15. data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
  16. data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
  17. data/frameworks/sproutcore/apps/docs/main.js +30 -0
  18. data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
  19. data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
  20. data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
  21. data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
  22. data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
  23. data/frameworks/sproutcore/apps/tests/core.js +114 -16
  24. data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
  25. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
  26. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
  27. data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
  28. data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
  29. data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
  30. data/frameworks/sproutcore/apps/tests/main.js +9 -20
  31. data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
  32. data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
  33. data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
  34. data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
  35. data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
  36. data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
  37. data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
  38. data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
  39. data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
  40. data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
  41. data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
  42. data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
  43. data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
  44. data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
  45. data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
  46. data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
  47. data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
  48. data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
  49. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
  50. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
  51. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
  52. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
  53. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
  54. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  55. data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
  56. data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
  57. data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
  58. data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
  59. data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
  60. data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
  61. data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
  62. data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
  63. data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
  64. data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
  65. data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
  66. data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
  67. data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
  68. data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
  69. data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
  70. data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
  71. data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
  72. data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
  73. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
  74. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
  75. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
  76. data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
  77. data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
  78. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
  79. data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
  80. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
  81. data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
  82. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
  83. data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
  84. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
  85. data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
  86. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
  87. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
  88. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
  89. data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
  90. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
  91. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
  92. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
  93. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
  94. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
  95. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
  96. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
  97. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
  98. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
  99. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
  100. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
  101. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
  102. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
  103. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
  104. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
  105. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
  106. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
  107. data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
  108. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
  109. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
  110. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
  111. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
  112. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
  113. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
  114. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
  115. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
  116. data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
  117. data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
  118. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
  119. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
  120. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
  121. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
  122. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
  123. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
  124. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
  125. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
  126. data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
  127. data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
  128. data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
  129. data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
  130. data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
  131. data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
  132. data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
  133. data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
  134. data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
  135. data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
  136. data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
  137. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
  138. data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
  139. data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
  140. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
  141. data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
  142. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
  143. data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
  144. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
  145. data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
  146. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
  147. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
  148. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
  149. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
  150. data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  151. data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
  152. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
  153. data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
  154. data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
  155. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
  156. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
  157. data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
  158. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
  159. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
  160. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
  161. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
  162. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
  163. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
  164. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
  165. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
  166. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
  167. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
  168. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
  169. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
  170. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
  171. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
  172. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
  173. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
  174. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
  175. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
  176. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
  177. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
  178. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
  179. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
  180. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
  181. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
  182. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
  183. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
  184. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
  185. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
  186. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
  187. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
  188. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
  189. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
  190. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
  191. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
  192. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
  193. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
  194. data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
  195. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
  196. data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
  197. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
  198. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
  199. data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
  200. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
  201. data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
  202. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
  203. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
  204. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
  205. data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
  206. data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
  207. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
  208. data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
  209. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
  210. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
  211. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
  212. data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
  213. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
  214. data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
  215. data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
  216. data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
  217. data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
  218. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
  219. data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
  220. data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
  221. data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
  222. data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
  223. data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
  224. data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
  225. data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
  226. data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
  227. data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
  228. data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
  229. data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
  230. data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
  231. data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
  232. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
  233. data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
  234. data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
  235. data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
  236. data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
  237. data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
  238. data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
  239. data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
  240. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
  241. data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
  242. data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
  243. data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
  244. data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
  245. data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
  246. data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
  247. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
  248. data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
  249. data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
  250. data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
  251. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
  252. data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
  253. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
  254. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
  255. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
  256. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
  257. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
  258. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
  259. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
  260. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
  261. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
  262. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
  263. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
  264. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
  265. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
  266. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
  267. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
  268. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
  269. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
  270. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
  271. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
  272. data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
  273. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
  274. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
  275. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
  276. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
  277. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
  278. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
  279. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
  280. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
  281. data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
  282. data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
  283. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
  284. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
  285. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
  286. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
  287. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
  288. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
  289. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
  290. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
  291. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
  292. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
  293. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
  294. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
  295. data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
  296. data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
  297. data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
  298. data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
  299. data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
  300. data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
  301. data/frameworks/sproutcore/frameworks/runtime/README +1 -0
  302. data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
  303. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
  304. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
  305. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
  306. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
  307. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
  308. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
  309. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
  310. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
  311. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
  312. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
  313. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
  314. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
  315. data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
  316. data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
  317. data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
  318. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
  319. data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
  320. data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
  321. data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
  322. data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
  323. data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
  324. data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
  325. data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
  326. data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
  327. data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
  328. data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
  329. data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
  330. data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
  331. data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
  332. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
  333. data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
  334. data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
  335. data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
  336. data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
  337. data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
  338. data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
  339. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
  340. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
  341. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
  342. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
  343. data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
  344. data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
  345. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
  346. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
  347. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
  348. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
  349. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
  350. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
  351. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
  352. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
  353. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
  354. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
  355. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
  356. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
  357. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
  358. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
  359. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
  360. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
  361. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
  362. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
  363. data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
  364. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
  365. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
  366. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
  367. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
  368. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
  369. data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
  370. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
  371. data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
  372. data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
  373. data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
  374. data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
  375. data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
  376. data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
  377. data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
  378. data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
  379. data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
  380. data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
  381. data/frameworks/sproutcore/lib/index.rhtml +4 -1
  382. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
  383. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
  384. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
  385. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
  386. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
  387. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
  388. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
  389. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
  390. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
  391. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
  392. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
  393. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
  394. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
  395. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
  396. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
  397. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
  398. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
  399. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
  400. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
  401. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
  402. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
  403. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
  404. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
  405. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
  406. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
  407. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
  408. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
  409. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
  410. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
  411. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
  412. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
  413. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
  414. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
  415. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
  416. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
  417. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
  418. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
  419. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
  420. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
  421. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
  422. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
  423. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
  424. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
  425. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
  426. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
  427. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
  428. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
  429. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
  430. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
  431. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
  432. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
  433. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
  434. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
  435. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
  436. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
  437. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
  438. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
  439. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
  440. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
  441. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
  442. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
  443. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
  444. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
  445. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
  446. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
  447. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
  448. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
  449. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
  450. data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
  451. data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
  452. data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
  453. data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
  454. data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
  455. data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
  456. data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
  457. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
  458. data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
  459. data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
  460. data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
  461. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
  462. data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
  463. data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
  464. data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
  465. data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
  466. data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
  467. data/lib/sproutcore/builders/minify.rb +2 -2
  468. data/lib/sproutcore/builders/test.rb +1 -1
  469. data/lib/sproutcore/buildfile.rb +1 -0
  470. data/lib/sproutcore/rack/dev.rb +1 -1
  471. data/lib/sproutcore/rack/filesystem.rb +265 -0
  472. data/lib/sproutcore/rack/proxy.rb +11 -3
  473. data/lib/sproutcore/rack/service.rb +11 -1
  474. data/lib/sproutcore/tools.rb +11 -1
  475. data/lib/sproutcore/tools/server.rb +6 -4
  476. data/vendor/jsdoc/README.txt +151 -0
  477. data/vendor/jsdoc/changes.txt +47 -0
  478. metadata +263 -308
  479. data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
  480. data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
  481. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
  482. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
  483. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
  484. data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
  485. data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
  486. data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
  487. data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
  488. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
  489. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
  490. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
  491. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
  492. data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
  493. data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
  494. data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
  495. data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
  496. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
  497. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
  498. data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
  499. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
  500. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
  501. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
  502. data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
  503. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
  504. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
  505. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
  506. data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
  507. data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
  508. data/spec/buildtasks/manifest/spec_helper.rb +0 -35
  509. data/spec/buildtasks/target_spec.rb +0 -214
  510. data/spec/fixtures/builder_tests/Buildfile +0 -15
  511. data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
  512. data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
  513. data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
  514. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
  515. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
  516. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
  517. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
  518. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
  519. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
  520. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
  521. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
  522. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
  523. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
  524. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
  525. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
  526. data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
  527. data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
  528. data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
  529. data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
  530. data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
  531. data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
  532. data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
  533. data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
  534. data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
  535. data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
  536. data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
  537. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
  538. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
  539. data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
  540. data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
  541. data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
  542. data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
  543. data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
  544. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
  545. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
  546. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
  547. data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
  548. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
  549. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
  550. data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
  551. data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
  552. data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
  553. data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
  554. data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
  555. data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
  556. data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
  557. data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
  558. data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
  559. data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
  560. data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
  561. data/spec/fixtures/entry_for_project/Buildfile +0 -1
  562. data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
  563. data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
  564. data/spec/fixtures/find_targets/custom/Buildfile +0 -8
  565. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
  566. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
  567. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
  568. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
  569. data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
  570. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
  571. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
  572. data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
  573. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
  574. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
  575. data/spec/fixtures/find_targets/nested/Buildfile +0 -8
  576. data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
  577. data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
  578. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
  579. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
  580. data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
  581. data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
  582. data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
  583. data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
  584. data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
  585. data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
  586. data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
  587. data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
  588. data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
  589. data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
  590. data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
  591. data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
  592. data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
  593. data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
  594. data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
  595. data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
  596. data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
  597. data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
  598. data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
  599. data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
  600. data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
  601. data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
  602. data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
  603. data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
  604. data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
  605. data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
  606. data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
  607. data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
  608. data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
  609. data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
  610. data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
  611. data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
  612. data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
  613. data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
  614. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
  615. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
  616. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
  617. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
  618. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
  619. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
  620. data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
  621. data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
  622. data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
  623. data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
  624. data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
  625. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
  626. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
  627. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
  628. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
  629. data/spec/fixtures/real_world/Buildfile +0 -12
  630. data/spec/fixtures/real_world/apps/account/README +0 -1
  631. data/spec/fixtures/real_world/apps/calendar/README +0 -1
  632. data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
  633. data/spec/fixtures/real_world/apps/files/README +0 -1
  634. data/spec/fixtures/real_world/apps/mail/README +0 -1
  635. data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
  636. data/spec/fixtures/real_world/apps/photos/README +0 -1
  637. data/spec/fixtures/real_world/apps/uploader/README +0 -1
  638. data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
  639. data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
  640. data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
  641. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
  642. data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
  643. data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
  644. data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
  645. data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
  646. data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
  647. data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
  648. data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
  649. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
  650. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
  651. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
  652. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
  653. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
  654. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
  655. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
  656. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
  657. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
  658. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
  659. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
  660. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
  661. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
  662. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
  663. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
  664. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
  665. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
  666. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
  667. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
  668. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
  669. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
  670. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
  671. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
  672. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
  673. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
  674. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
  675. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
  676. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
  677. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
  678. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
  679. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
  680. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
  681. data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
  682. data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
  683. data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
  684. data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
  685. data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
  686. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
  687. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
  688. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
  689. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
  690. data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
  691. data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
  692. data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
  693. data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
  694. data/spec/fixtures/recursive_project/Buildfile +0 -8
  695. data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
  696. data/spec/lib/builders/combine_spec.rb +0 -67
  697. data/spec/lib/builders/html_spec.rb +0 -577
  698. data/spec/lib/builders/javascript_spec.rb +0 -81
  699. data/spec/lib/builders/sass_spec.rb +0 -43
  700. data/spec/lib/builders/spec_helper.rb +0 -30
  701. data/spec/lib/builders/strings_spec.rb +0 -52
  702. data/spec/lib/builders/stylesheet_spec.rb +0 -63
  703. data/spec/lib/builders/test_index_spec.rb +0 -44
  704. data/spec/lib/builders/test_spec.rb +0 -135
  705. data/spec/lib/buildfile/config_for_spec.rb +0 -81
  706. data/spec/lib/buildfile/define_spec.rb +0 -59
  707. data/spec/lib/buildfile/dup_spec.rb +0 -65
  708. data/spec/lib/buildfile/invoke_spec.rb +0 -130
  709. data/spec/lib/buildfile/load_spec.rb +0 -49
  710. data/spec/lib/buildfile/task/dup_spec.rb +0 -55
  711. data/spec/lib/buildfile/task_defined_spec.rb +0 -17
  712. data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
  713. data/spec/lib/buildfile_commands/config_spec.rb +0 -97
  714. data/spec/lib/buildfile_commands/import_spec.rb +0 -17
  715. data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
  716. data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
  717. data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
  718. data/spec/lib/buildfile_commands/task_spec.rb +0 -36
  719. data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
  720. data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
  721. data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
  722. data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
  723. data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
  724. data/spec/lib/models/hash_struct/method_missing.rb +0 -41
  725. data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
  726. data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
  727. data/spec/lib/models/manifest/build_spec.rb +0 -78
  728. data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
  729. data/spec/lib/models/manifest/find_entry.rb +0 -84
  730. data/spec/lib/models/manifest/prepare_spec.rb +0 -62
  731. data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
  732. data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
  733. data/spec/lib/models/project/add_target_spec.rb +0 -44
  734. data/spec/lib/models/project/buildfile_spec.rb +0 -35
  735. data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
  736. data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
  737. data/spec/lib/models/project/target_for_spec.rb +0 -33
  738. data/spec/lib/models/project/targets_spec.rb +0 -62
  739. data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
  740. data/spec/lib/models/target/config_spec.rb +0 -30
  741. data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
  742. data/spec/lib/models/target/installed_languages_spec.rb +0 -47
  743. data/spec/lib/models/target/lproj_for_spec.rb +0 -38
  744. data/spec/lib/models/target/manifest_for_spec.rb +0 -42
  745. data/spec/lib/models/target/parent_target_spec.rb +0 -21
  746. data/spec/lib/models/target/prepare_spec.rb +0 -53
  747. data/spec/lib/models/target/required_targets_spec.rb +0 -119
  748. data/spec/lib/models/target/target_for_spec.rb +0 -56
  749. data/spec/lib/tools/build_number_spec.rb +0 -28
  750. data/spec/lib/tools/gen_spec.rb +0 -207
  751. data/spec/lib/tools/tools_spec.rb +0 -78
  752. data/spec/spec_helper.rb +0 -138
  753. data/vendor/github_gem_lint.rb +0 -22
  754. data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
@@ -31,14 +31,14 @@ SC._ChainObserver = function(property) {
31
31
  } ;
32
32
 
33
33
  // This is the primary entry point. Configures the chain.
34
- SC._ChainObserver.createChain = function(rootObject, path, target, method) {
34
+ SC._ChainObserver.createChain = function(rootObject, path, target, method, context) {
35
35
 
36
- var parts = path.split('.') ;
37
-
38
36
  // First we create the chain.
39
- var root ;
40
- var tail = root = new SC._ChainObserver(parts[0]) ;
41
- var len = parts.length;
37
+ var parts = path.split('.'),
38
+ root = new SC._ChainObserver(parts[0]),
39
+ tail = root,
40
+ len = parts.length;
41
+
42
42
  for(var idx=1;idx<len;idx++) {
43
43
  tail = tail.next = new SC._ChainObserver(parts[idx]) ;
44
44
  }
@@ -50,7 +50,7 @@ SC._ChainObserver.createChain = function(rootObject, path, target, method) {
50
50
 
51
51
  // Finally, set the target/method on the tail so that future changes will
52
52
  // trigger.
53
- tail.target = target; tail.method = method ;
53
+ tail.target = target; tail.method = method ; tail.context = context ;
54
54
 
55
55
  // and return the root to save
56
56
  return root ;
@@ -108,10 +108,16 @@ SC._ChainObserver.prototype = {
108
108
  if (this.next) this.next.objectDidChange(value) ;
109
109
 
110
110
  // if we have a target/method, call it.
111
- var target = this.target; var method = this.method;
111
+ var target = this.target,
112
+ method = this.method,
113
+ context = this.context ;
112
114
  if (target && method) {
113
- var rev = object.propertyRevision ;
114
- method.call(target, object, property, value, rev) ;
115
+ var rev = object ? object.propertyRevision : null ;
116
+ if (context) {
117
+ method.call(target, object, property, value, context, rev);
118
+ } else {
119
+ method.call(target, object, property, value, rev) ;
120
+ }
115
121
  }
116
122
  },
117
123
 
@@ -128,7 +134,7 @@ SC._ChainObserver.prototype = {
128
134
  if (this.next) this.next.destroyChain() ;
129
135
 
130
136
  // and clear left overs...
131
- this.next = this.target = this.method = this.object = null ;
137
+ this.next = this.target = this.method = this.object = this.context = null;
132
138
  return null ;
133
139
  }
134
140
 
@@ -63,24 +63,61 @@ SC.Observers = {
63
63
  }
64
64
  },
65
65
 
66
+ // Range Observers register here to indicate that they may potentially
67
+ // need to start observing.
68
+ addPendingRangeObserver: function(observer) {
69
+ var ro = this.rangeObservers;
70
+ if (!ro) ro = this.rangeObservers = SC.CoreSet.create();
71
+ ro.add(observer);
72
+ return this ;
73
+ },
74
+
75
+ _TMP_OUT: [],
76
+
66
77
  // Flush the queue. Attempt to add any saved observers.
67
- flush: function() {
78
+ flush: function(object) {
79
+
80
+ // flush any observers that we tried to setup but didn't have a path yet
68
81
  var oldQueue = this.queue ;
69
- var newQueue = (this.queue = []) ;
70
- var idx = oldQueue.length ;
71
- while(--idx >= 0) {
72
- var item = oldQueue[idx] ;
73
- if (!item) continue ;
82
+ if (oldQueue && oldQueue.length > 0) {
83
+ var newQueue = (this.queue = []) ;
84
+ var idx = oldQueue.length ;
85
+ while(--idx >= 0) {
86
+ var item = oldQueue[idx] ;
87
+ if (!item) continue ;
88
+
89
+ var tuple = SC.tupleForPropertyPath(item[0], item[3]);
90
+ if (tuple) {
91
+ tuple[0].addObserver(tuple[1], item[1], item[2]) ;
92
+ } else newQueue.push(item) ;
93
+ }
94
+ }
95
+
96
+ // if this object needsRangeObserver then see if any pending range
97
+ // observers need it.
98
+ if (object._kvo_needsRangeObserver) {
99
+ var set = this.rangeObservers,
100
+ len = set ? set.get('length') : 0,
101
+ out = this._TMP_OUT,
102
+ ro;
103
+
104
+ for(idx=0;idx<len;idx++) {
105
+ ro = set[idx]; // get the range observer
106
+ if (ro.setupPending(object)) {
107
+ out.push(ro); // save to remove later
108
+ }
109
+ }
74
110
 
75
- var tuple = SC.tupleForPropertyPath(item[0], item[3]);
76
- if (tuple) {
77
- tuple[0].addObserver(tuple[1], item[1], item[2]) ;
78
- } else newQueue.push(item) ;
111
+ // remove any that have setup
112
+ if (out.length > 0) set.removeEach(out);
113
+ out.length = 0; // reset
114
+ object._kvo_needsRangeObserver = NO ;
79
115
  }
116
+
80
117
  },
81
118
 
82
- isObserveringSuspended: 0,
83
- _pending: SC.Set.create(),
119
+ isObservingSuspended: 0,
120
+ _pending: SC.CoreSet.create(),
84
121
 
85
122
  objectHasPendingChanges: function(obj) {
86
123
  this._pending.add(obj) ; // save for later
@@ -97,10 +134,13 @@ SC.Observers = {
97
134
  var pending ;
98
135
  if(--this.isObservingSuspended <= 0) {
99
136
  pending = this._pending ;
100
- this._pending = SC.Set.create() ;
101
- while(pending.length > 0) {
102
- pending.pop()._notifyPropertyObservers() ;
137
+ this._pending = SC.CoreSet.create() ;
138
+
139
+ var idx, len = pending.length;
140
+ for(idx=0;idx<len;idx++) {
141
+ pending[idx]._notifyPropertyObservers() ;
103
142
  }
143
+ pending.clear();
104
144
  pending = null ;
105
145
  }
106
146
  }
@@ -21,19 +21,27 @@ SC._ObserverSet = {
21
21
 
22
22
  // adds the named target/method observer to the set. The method must be
23
23
  // a function, not a string..
24
- add: function(target, method) {
24
+ add: function(target, method, context) {
25
25
  var targetGuid = (target) ? SC.guidFor(target) : "__this__";
26
26
 
27
27
  // get the set of methods
28
28
  var methods = this[targetGuid] ;
29
29
  if (!methods) {
30
- methods = this[targetGuid] = SC.Set.create() ;
30
+ methods = this[targetGuid] = SC.CoreSet.create() ;
31
31
  methods.target = target ;
32
32
  methods.isTargetSet = YES ; // used for getMembers().
33
33
  this.targets++ ;
34
34
  }
35
-
36
35
  methods.add(method) ;
36
+
37
+ // context is really useful sometimes but not used that often so this
38
+ // implementation is intentionally lazy.
39
+ if (context !== undefined) {
40
+ var contexts = methods.contexts ;
41
+ if (!context) contexts = {};
42
+ contexts[SC.guidFor(method)] = context ;
43
+ }
44
+
37
45
  this._membersCacheIsValid = NO ;
38
46
  },
39
47
 
@@ -53,16 +61,21 @@ SC._ObserverSet = {
53
61
  if (methods.length <= 0) {
54
62
  methods.target = null;
55
63
  methods.isTargetSet = NO ;
64
+ methods.contexts = null ;
56
65
  delete this[targetGuid] ;
57
66
  this.targets-- ;
67
+
68
+ } else if (methods.contexts) {
69
+ delete methods.contexts[SC.guidFor(method)];
58
70
  }
59
-
71
+
60
72
  this._membersCacheIsValid = NO;
61
73
 
62
74
  return YES ;
63
75
  },
64
76
 
65
77
  // Invokes the target/method pairs in the receiver. Used by SC.RunLoop
78
+ // Note: does not support context
66
79
  invokeMethods: function() {
67
80
  // iterate through the set, look for sets.
68
81
  for(var key in this) {
@@ -93,7 +106,17 @@ SC._ObserverSet = {
93
106
  if (value && value.isTargetSet) {
94
107
  var idx = value.length;
95
108
  var target = value.target ;
96
- while(--idx>=0) ret.push([target, value[idx]]) ;
109
+
110
+ // slightly slower - only do if we have contexts
111
+ var contexts = value.contexts ;
112
+ if (contexts) {
113
+ while(--idx>=0) {
114
+ var method = value[idx] ;
115
+ ret.push([target, method, contexts[SC.guidFor(method)]]) ;
116
+ }
117
+ } else {
118
+ while(--idx>=0) ret.push([target, value[idx]]);
119
+ }
97
120
  }
98
121
  }
99
122
 
@@ -110,6 +133,7 @@ SC._ObserverSet = {
110
133
  if (oldSet && oldSet.isTargetSet) {
111
134
  newSet = oldSet.clone();
112
135
  newSet.target = oldSet.target ;
136
+ if (oldSet.contexts) newSet.contexts = SC.clone(oldSet.contexts);
113
137
  ret[key] = newSet ;
114
138
  }
115
139
  }
@@ -0,0 +1,40 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore Costello - Property Observing Library
3
+ // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2009 Apple, Inc. All rights reserved.
5
+ // License: Licened under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /**
9
+ The SC.ObservableProtocol defines optional methods you can implement on your
10
+ objects. They will be used if defined but are not required for observing to
11
+ work.
12
+ */
13
+ SC.ObservableProtocol = {
14
+
15
+ /**
16
+ Generic property observer called whenever a property on the receiver
17
+ changes.
18
+
19
+ If you need to observe a large number of properties on your object, it
20
+ is sometimes more efficient to implement this observer only and then to
21
+ handle requests yourself. Although this observer will be triggered
22
+ more often than an observer registered on a specific property, it also
23
+ does not need to be registered which can make it faster to setup your
24
+ object instance.
25
+
26
+ You will often implement this observer using a switch statement on the
27
+ key parameter, taking appropriate action.
28
+
29
+ @param observer {null} no longer used; usually null
30
+ @param target {Object} the target of the change. usually this
31
+ @param key {String} the name of the property that changed
32
+ @param value {Object} the new value of the property.
33
+ @param revision {Number} a revision you can use to quickly detect changes.
34
+ @returns {void}
35
+ */
36
+ propertyObserver: function(observer,target,key,value, revision) {
37
+
38
+ }
39
+
40
+ };
@@ -12,7 +12,7 @@ require('system/object') ;
12
12
  the console. This should be disabled in production code. Note that you
13
13
  can also enable this from the console or temporarily.
14
14
  */
15
- SC.LOG_BINDING_NOTIFICATIONS = NO ;
15
+ SC.LOG_BINDINGS = NO ;
16
16
 
17
17
  /**
18
18
  Performance paramter. This will benchmark the time spent firing each
@@ -334,6 +334,7 @@ SC.Binding = {
334
334
  if (this.isConnected) return this ;
335
335
  this.isConnected = YES ;
336
336
  this._connectionPending = YES ; // its connected but not really...
337
+ this._syncOnConnect = YES ;
337
338
  SC.Binding._connectQueue.add(this) ;
338
339
  return this;
339
340
  },
@@ -424,7 +425,7 @@ SC.Binding = {
424
425
  the binding as dirty if the value has changed.
425
426
  */
426
427
  fromPropertyDidChange: function(target, key) {
427
- var v = target.get(key) ;
428
+ var v = target ? target.get(key) : null;
428
429
 
429
430
  //console.log("fromPropertyDidChange: %@ v = %@".fmt(this, v)) ;
430
431
 
@@ -432,7 +433,7 @@ SC.Binding = {
432
433
  // schedule to register an update.
433
434
  if (v !== this._bindingValue) {
434
435
 
435
- this._setBindingValue(v) ;
436
+ this._setBindingValue(target, key) ;
436
437
  this._changePending = YES ;
437
438
  SC.Binding._changeQueue.add(this) ; // save for later.
438
439
  }
@@ -456,14 +457,32 @@ SC.Binding = {
456
457
  // if the new value is different from the current binding value, then
457
458
  // schedule to register an update.
458
459
  if (v !== this._transformedBindingValue) {
459
- this._setBindingValue(v) ;
460
+ this._setBindingValue(target, key) ;
460
461
  this._changePending = YES ;
461
462
  SC.Binding._changeQueue.add(this) ; // save for later.
462
463
  }
463
464
  },
464
465
 
465
- _setBindingValue: function(v) {
466
- this._bindingValue = v ;
466
+ /**
467
+ Saves the source location for the binding value. This will be used later
468
+ to actually update the binding value.
469
+ */
470
+ _setBindingValue: function(source, key) {
471
+ this._bindingSource = source;
472
+ this._bindingKey = key;
473
+ },
474
+
475
+ /**
476
+ Updates the binding value from the current binding source if needed. This
477
+ should be called just before using this._bindingValue.
478
+ */
479
+ _computeBindingValue: function() {
480
+ var source = this._bindingSource,
481
+ key = this._bindingKey,
482
+ v;
483
+
484
+ if (!source) return ; // nothing to do
485
+ this._bindingValue = v = source.getPath(key);
467
486
 
468
487
  // apply any transforms to get the to property value also
469
488
  var transforms = this._transforms;
@@ -482,10 +501,10 @@ SC.Binding = {
482
501
  this._transformedBindingValue = v;
483
502
  },
484
503
 
485
- _connectQueue: SC.Set.create(),
486
- _alternateConnectQueue: SC.Set.create(),
487
- _changeQueue: SC.Set.create(),
488
- _alternateChangeQueue: SC.Set.create(),
504
+ _connectQueue: SC.CoreSet.create(),
505
+ _alternateConnectQueue: SC.CoreSet.create(),
506
+ _changeQueue: SC.CoreSet.create(),
507
+ _alternateChangeQueue: SC.CoreSet.create(),
489
508
  _changePending: NO,
490
509
 
491
510
  /**
@@ -498,9 +517,10 @@ SC.Binding = {
498
517
  // don't allow flushing more than one at a time
499
518
  if (this._isFlushing) return NO;
500
519
  this._isFlushing = YES ;
520
+ SC.Observers.suspendPropertyObserving();
501
521
 
502
522
  var didFlush = NO ;
503
- var log = SC.LOG_BINDING_NOTIFICATIONS ;
523
+ var log = SC.LOG_BINDINGS ;
504
524
 
505
525
  // connect any bindings
506
526
  var queue, binding ;
@@ -534,6 +554,8 @@ SC.Binding = {
534
554
 
535
555
  // clean up
536
556
  this._isFlushing = NO ;
557
+ SC.Observers.resumePropertyObserving();
558
+
537
559
  return didFlush ;
538
560
  },
539
561
 
@@ -546,11 +568,12 @@ SC.Binding = {
546
568
 
547
569
  // compute the binding targets if needed.
548
570
  this._computeBindingTargets() ;
571
+ this._computeBindingValue();
549
572
 
550
573
  var v = this._bindingValue ;
551
574
  var tv = this._transformedBindingValue ;
552
575
  var bench = SC.BENCHMARK_BINDING_NOTIFICATIONS ;
553
- var log = SC.LOG_BINDING_NOTIFICATIONS ;
576
+ var log = SC.LOG_BINDINGS ;
554
577
 
555
578
  // the from property value will always be the binding value, update if
556
579
  // needed.
@@ -601,7 +624,7 @@ SC.Binding = {
601
624
  // if the new value is different from the current binding value, then
602
625
  // schedule to register an update.
603
626
  if (v !== this._bindingValue) {
604
- this._setBindingValue(v) ;
627
+ this._setBindingValue(target, key) ;
605
628
  this._changePending = YES ;
606
629
  SC.Binding._changeQueue.add(this) ; // save for later.
607
630
  }
@@ -773,8 +796,9 @@ SC.Binding = {
773
796
  placeholder = SC.MULTIPLE_PLACEHOLDER ;
774
797
  }
775
798
  return this.from(fromPath).transform(function(value, isForward) {
776
- if (SC.isArray(value)) {
777
- value = (value.length>1) ? placeholder : (value.length<=0) ? null : (value.objectAt ? value.objectAt(0) : value[0]);
799
+ if (value && value.isEnumerable) {
800
+ var len = value.get('length');
801
+ value = (len>1) ? placeholder : (len<=0) ? null : value.firstObject();
778
802
  }
779
803
  return value ;
780
804
  }) ;
@@ -0,0 +1,1166 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore Costello - Property Observing Library
3
+ // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2009 Apple, Inc. All rights reserved.
5
+ // License: Licened under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ sc_require('mixins/enumerable') ;
9
+ sc_require('mixins/observable') ;
10
+ sc_require('mixins/freezable');
11
+ sc_require('mixins/copyable');
12
+
13
+ /**
14
+ @class
15
+
16
+ A collection of ranges. You can use an IndexSet to keep track of non-
17
+ continuous ranges of items in a parent array. IndexSet's are used for
18
+ selection, for managing invalidation ranges and other data-propogation.
19
+
20
+ h2. Examples
21
+
22
+ {{{
23
+ var set = SC.IndexSet.create(ranges) ;
24
+ set.contains(index);
25
+ set.add(index, length);
26
+ set.remove(index, length);
27
+
28
+ // uses a backing SC.Array object to return each index
29
+ set.forEach(function(object) { .. })
30
+
31
+ // returns the index
32
+ set.forEachIndex(function(index) { ... });
33
+
34
+ // returns ranges
35
+ set.forEachRange(function(start, length) { .. });
36
+ }}}
37
+
38
+ h2. Implementation Notes
39
+
40
+ An IndexSet stores indices on the object. A positive value great than the
41
+ index tells you the end of an occupied range. A negative values tells you
42
+ the end of an empty range. A value less than the index is a search
43
+ accelerator. It tells you the start of the nearest range.
44
+
45
+ @extends Object
46
+ @extends SC.Enumerable
47
+ @extends SC.Observable
48
+ @extends SC.Copyable
49
+ @extends SC.Freezable
50
+ @since SproutCore 1.0
51
+ */
52
+ SC.IndexSet = SC.mixin({},
53
+ SC.Enumerable, SC.Observable, SC.Freezable, SC.Copyable,
54
+ /** @scope SC.IndexSet.prototype */ {
55
+
56
+ /** @private
57
+ Walks a content array and copies its contents to a new array. For large
58
+ content arrays this is faster than using slice()
59
+ */
60
+ _sc_sliceContent: function(c) {
61
+ if (c.length < 1000) return c.slice(); // use native when faster
62
+ var cur = 0, ret = [], next = c[0];
63
+ while(next !== 0) {
64
+ ret[cur] = next ;
65
+ cur = (next<0) ? (0-next) : next ;
66
+ next = c[cur];
67
+ }
68
+ ret[cur] = 0;
69
+ this._hint(0, cur, ret); // hints are not copied manually - add them
70
+ return ret ;
71
+ },
72
+
73
+ /**
74
+ To create a set, pass either a start and index or another IndexSet.
75
+ */
76
+ create: function(start, length) {
77
+ var ret = SC.beget(this);
78
+ ret.initObservable();
79
+
80
+ // optimized method to clone an index set.
81
+ if (start && start.isIndexSet) {
82
+ ret._content = this._sc_sliceContent(start._content);
83
+ ret.max = start.max;
84
+ ret.length = start.length;
85
+ ret.source = start.source ;
86
+
87
+ // otherwise just do a regular add
88
+ } else {
89
+ ret._content = [0];
90
+ if (start !== undefined) ret.add(start, length);
91
+ }
92
+ return ret ;
93
+ },
94
+
95
+ isIndexSet: YES,
96
+
97
+ HINT_SIZE: 256,
98
+
99
+ /**
100
+ Total number of indexes contained in the set
101
+
102
+ @type number
103
+ */
104
+ length: 0,
105
+
106
+ /**
107
+ One greater than the largest index currently stored in the set. This
108
+ is sometimes useful when determining the total range of items covering
109
+ the index set.
110
+ */
111
+ max: 0,
112
+
113
+ /**
114
+ The first index included in the set or -1.
115
+
116
+ @property
117
+ @type {Number}
118
+ */
119
+ min: function() {
120
+ var content = this._content,
121
+ cur = content[0];
122
+ return (cur === 0) ? -1 : (cur>0) ? 0 : Math.abs(cur);
123
+
124
+ }.property('[]').cacheable(),
125
+
126
+ firstObject: function() {
127
+ return (this.get('length')>0) ? this.get('min') : undefined;
128
+ }.property(),
129
+
130
+ /**
131
+ Returns the starting index of the nearest range for the specified
132
+ index.
133
+
134
+ @param {Number} index
135
+ @returns {Number} starting index
136
+ */
137
+ rangeStartForIndex: function(index) {
138
+ var content = this._content,
139
+ max = this.get('max'),
140
+ ret, next, accel;
141
+
142
+ // fast cases
143
+ if (index >= max) return max ;
144
+ if (Math.abs(content[index]) > index) return index ; // we hit a border
145
+
146
+ // use accelerator to find nearest content range
147
+ accel = index - (index % SC.IndexSet.HINT_SIZE);
148
+ ret = content[accel];
149
+ if (ret<0 || ret>index) ret = accel;
150
+ next = Math.abs(content[ret]);
151
+
152
+ // now step forward through ranges until we find one that includes the
153
+ // index.
154
+ while (next < index) {
155
+ ret = next ;
156
+ next = Math.abs(content[ret]);
157
+ }
158
+ return ret ;
159
+ },
160
+
161
+ /**
162
+ Returns YES if the passed index set contains the exact same indexes as
163
+ the receiver. If you pass any object other than an index set, returns NO.
164
+
165
+ @param {Object} obj another object.
166
+ @returns {Boolean}
167
+ */
168
+ isEqual: function(obj) {
169
+
170
+ // optimize for some special cases
171
+ if (obj === this) return YES ;
172
+ if (!obj || !obj.isIndexSet || (obj.max !== this.max) || (obj.length !== this.length)) return NO;
173
+
174
+ // ok, now we need to actually compare the ranges of the two.
175
+ var lcontent = this._content,
176
+ rcontent = obj._content,
177
+ cur = 0,
178
+ next = lcontent[cur];
179
+
180
+ do {
181
+ if (rcontent[cur] !== next) return NO ;
182
+ cur = Math.abs(next) ;
183
+ next = lcontent[cur];
184
+ } while (cur !== 0);
185
+ return YES ;
186
+ },
187
+
188
+ /**
189
+ Returns the first index in the set before the passed index or null if
190
+ there are no previous indexes in the set.
191
+
192
+ @param {Number} index index to check
193
+ @returns {Number} index or -1
194
+ */
195
+ indexBefore: function(index) {
196
+
197
+ if (index===0) return -1; // fast path
198
+ index--; // start with previous index
199
+
200
+ var content = this._content,
201
+ max = this.get('max'),
202
+ start = this.rangeStartForIndex(index);
203
+ if (!content) return null;
204
+
205
+ // loop backwards until we find a range that is in the set.
206
+ while((start===max) || (content[start]<0)) {
207
+ if (start === 0) return -1 ; // nothing before; just quit
208
+ index = start -1 ;
209
+ start = this.rangeStartForIndex(index);
210
+ }
211
+
212
+ return index;
213
+ },
214
+
215
+ /**
216
+ Returns the first index in the set after the passed index or null if
217
+ there are no additional indexes in the set.
218
+
219
+ @param {Number} index index to check
220
+ @returns {Number} index or -1
221
+ */
222
+ indexAfter: function(index) {
223
+ var content = this._content,
224
+ max = this.get('max'),
225
+ start, next ;
226
+ if (!content || (index>=max)) return -1; // fast path
227
+ index++; // start with next index
228
+
229
+
230
+ // loop forwards until we find a range that is in the set.
231
+ start = this.rangeStartForIndex(index);
232
+ next = content[start];
233
+ while(next<0) {
234
+ if (next === 0) return -1 ; //nothing after; just quit
235
+ index = start = Math.abs(next);
236
+ next = content[start];
237
+ }
238
+
239
+ return index;
240
+ },
241
+
242
+ /**
243
+ Returns YES if the index set contains the named index
244
+
245
+ @param {Number} start index or range
246
+ @param {Number} length optional range length
247
+ @returns {Boolean}
248
+ */
249
+ contains: function(start, length) {
250
+ var content, cur, next, rstart, rnext;
251
+
252
+ // normalize input
253
+ if (length === undefined) {
254
+ if (start === null || start === undefined) return NO ;
255
+
256
+ if (typeof start === SC.T_NUMBER) {
257
+ length = 1 ;
258
+
259
+ // if passed an index set, check each receiver range
260
+ } else if (start && start.isIndexSet) {
261
+ if (start === this) return YES ; // optimization
262
+
263
+ content = start._content ;
264
+ cur = 0 ;
265
+ next = content[cur];
266
+ while (next !== 0) {
267
+ if ((next>0) && !this.contains(cur, next-cur)) return NO ;
268
+ cur = Math.abs(next);
269
+ next = content[cur];
270
+ }
271
+ return YES ;
272
+
273
+ } else {
274
+ length = start.length;
275
+ start = start.start;
276
+ }
277
+ }
278
+
279
+ rstart = this.rangeStartForIndex(start);
280
+ rnext = this._content[rstart];
281
+
282
+ return (rnext>0) && (rstart <= start) && (rnext >= (start+length));
283
+ },
284
+
285
+ /**
286
+ Returns YES if the index set contains any of the passed indexes. You
287
+ can pass a single index, a range or an index set.
288
+
289
+ @param {Number} start index, range, or IndexSet
290
+ @param {Number} length optional range length
291
+ @returns {Boolean}
292
+ */
293
+ intersects: function(start, length) {
294
+ var content, cur, next, lim;
295
+
296
+ // normalize input
297
+ if (length === undefined) {
298
+ if (typeof start === SC.T_NUMBER) {
299
+ length = 1 ;
300
+
301
+ // if passed an index set, check each receiver range
302
+ } else if (start && start.isIndexSet) {
303
+ if (start === this) return YES ; // optimization
304
+
305
+ content = start._content ;
306
+ cur = 0 ;
307
+ next = content[cur];
308
+ while (next !== 0) {
309
+ if ((next>0) && this.intersects(cur, next-cur)) return YES ;
310
+ cur = Math.abs(next);
311
+ next = content[cur];
312
+ }
313
+ return NO ;
314
+
315
+ } else {
316
+ length = start.length;
317
+ start = start.start;
318
+ }
319
+ }
320
+
321
+ cur = this.rangeStartForIndex(start);
322
+ content = this._content;
323
+ next = content[cur];
324
+ lim = start + length;
325
+ while (cur < lim) {
326
+ if (next === 0) return NO; // no match and at end!
327
+ if ((next > 0) && (next > start)) return YES ; // found a match
328
+ cur = Math.abs(next);
329
+ next = content[cur];
330
+ }
331
+ return NO ; // no match
332
+ },
333
+
334
+ /**
335
+ Returns a new IndexSet without the passed range or indexes. This is a
336
+ convenience over simply cloning and removing. Does some optimizations.
337
+
338
+ @param {Number} start index, range, or IndexSet
339
+ @param {Number} length optional range length
340
+ @returns {SC.IndexSet} new index set
341
+ */
342
+ without: function(start, length) {
343
+ if (start === this) return SC.IndexSet.create(); // just need empty set
344
+ return this.clone().remove(start, length);
345
+ },
346
+
347
+ /**
348
+ Replace the index set's current content with the passed index set. This
349
+ is faster than clearing the index set adding the values again.
350
+
351
+ @param {Number} start index, Range, or another IndexSet
352
+ @param {Number} length optional length of range.
353
+ @returns {SC.IndexSet} receiver
354
+ */
355
+ replace: function(start, length) {
356
+
357
+ if (length === undefined) {
358
+ if (typeof start === SC.T_NUMBER) {
359
+ length = 1 ;
360
+ } else if (start && start.isIndexSet) {
361
+ this._content = this._sc_sliceContent(start._content);
362
+ this.beginPropertyChanges()
363
+ .set('max', start.max)
364
+ .set('length', start.length)
365
+ .set('source', start.source)
366
+ .enumerableContentDidChange()
367
+ .endPropertyChanges();
368
+ return this ;
369
+
370
+ } else {
371
+ length = start.length;
372
+ start = start.start;
373
+ }
374
+ }
375
+
376
+ var oldlen = this.length;
377
+ this._content.length=1;
378
+ this._content[0] = 0;
379
+ this.length = this.max = 0 ; // reset without notifying since add()
380
+ return this.add(start, length);
381
+ },
382
+
383
+ /**
384
+ Adds the specified range of indexes to the set. You can also pass another
385
+ IndexSet to union the contents of the index set with the receiver.
386
+
387
+ @param {Number} start index, Range, or another IndexSet
388
+ @param {Number} length optional length of range.
389
+ @returns {SC.IndexSet} receiver
390
+ */
391
+ add: function(start, length) {
392
+
393
+ if (this.isFrozen) throw SC.FROZEN_ERROR;
394
+
395
+ var content, cur, next;
396
+
397
+ // normalize IndexSet input
398
+ if (start && start.isIndexSet) {
399
+
400
+ content = start._content;
401
+
402
+ if (!content) return this; // nothing to do
403
+
404
+ cur = 0 ;
405
+ next = content[0];
406
+ while(next !== 0) {
407
+ if (next>0) this.add(cur, next-cur);
408
+ cur = next<0 ? 0-next : next;
409
+ next = content[cur];
410
+ }
411
+ return this ;
412
+
413
+ } else if (length === undefined) {
414
+
415
+ if (start === null || start === undefined) {
416
+ return this; // nothing to do
417
+ } else if (typeof start === SC.T_NUMBER) {
418
+ length = 1 ;
419
+ } else {
420
+ length = start.length;
421
+ start = start.start;
422
+ }
423
+ } else if (length === null) length = 1 ;
424
+
425
+ // special case - appending to end of set
426
+ var max = this.get('max'),
427
+ oldmax = max,
428
+ delta, value ;
429
+
430
+ content = this._content ;
431
+
432
+ if (start === max) {
433
+
434
+ // if adding to the end and the end is in set, merge.
435
+ if (start > 0) {
436
+ cur = this.rangeStartForIndex(start-1);
437
+ next = content[cur];
438
+
439
+ // just extend range at end
440
+ if (next > 0) {
441
+ delete content[max]; // no 0
442
+ content[cur] = max = start + length ;
443
+ start = cur ;
444
+
445
+ // previous range was not in set, just tack onto the end
446
+ } else {
447
+ content[max] = max = start + length;
448
+ }
449
+ } else {
450
+ content[start] = max = length;
451
+ }
452
+
453
+ content[max] = 0 ;
454
+ this.set('max', max);
455
+ this.set('length', this.length + length) ;
456
+ length = max - start ;
457
+
458
+ } else if (start > max) {
459
+ content[max] = 0-start; // empty!
460
+ content[start] = start+length ;
461
+ content[start+length] = 0; // set end
462
+ this.set('max', start + length) ;
463
+ this.set('length', this.length + length) ;
464
+
465
+ // affected range goes from starting range to end of content.
466
+ length = start + length - max ;
467
+ start = max ;
468
+
469
+ // otherwise, merge into existing range
470
+ } else {
471
+
472
+ // find nearest starting range. split or join that range
473
+ cur = this.rangeStartForIndex(start);
474
+ next = content[cur];
475
+ max = start + length ;
476
+ delta = 0 ;
477
+
478
+ // we are right on a boundary and we had a range or were the end, then
479
+ // go back one more.
480
+ if ((start>0) && (cur === start) && (next <= 0)) {
481
+ cur = this.rangeStartForIndex(start-1);
482
+ next = content[cur] ;
483
+ }
484
+
485
+ // previous range is not in set. splice it here
486
+ if (next < 0) {
487
+ content[cur] = 0-start ;
488
+
489
+ // if previous range extends beyond this range, splice afterwards also
490
+ if (Math.abs(next) > max) {
491
+ content[start] = 0-max;
492
+ content[max] = next ;
493
+ } else content[start] = next;
494
+
495
+ // previous range is in set. merge the ranges
496
+ } else {
497
+ start = cur ;
498
+ if (next > max) {
499
+ delta -= next - max ;
500
+ max = next ;
501
+ }
502
+ }
503
+
504
+ // at this point there should be clean starting point for the range.
505
+ // just walk the ranges, adding up the length delta and then removing
506
+ // the range until we find a range that passes last
507
+ cur = start;
508
+ while (cur < max) {
509
+ // get next boundary. splice if needed - if value is 0, we are at end
510
+ // just skip to last
511
+ value = content[cur];
512
+ if (value === 0) {
513
+ content[max] = 0;
514
+ next = max ;
515
+ delta += max - cur ;
516
+ } else {
517
+ next = Math.abs(value);
518
+ if (next > max) {
519
+ content[max] = value ;
520
+ next = max ;
521
+ }
522
+
523
+ // ok, cur range is entirely inside top range.
524
+ // add to delta if needed
525
+ if (value < 0) delta += next - cur ;
526
+ }
527
+
528
+ delete content[cur] ; // and remove range
529
+ cur = next;
530
+ }
531
+
532
+ // cur should always === last now. if the following range is in set,
533
+ // merge in also - don't adjust delta because these aren't new indexes
534
+ if ((cur = content[max]) > 0) {
535
+ delete content[max];
536
+ max = cur ;
537
+ }
538
+
539
+ // finally set my own range.
540
+ content[start] = max ;
541
+ if (max > oldmax) this.set('max', max) ;
542
+
543
+ // adjust length
544
+ this.set('length', this.get('length') + delta);
545
+
546
+ // compute hint range
547
+ length = max - start ;
548
+ }
549
+
550
+ this._hint(start, length);
551
+ if (delta !== 0) this.enumerableContentDidChange();
552
+ return this;
553
+ },
554
+
555
+ /**
556
+ Removes the specified range of indexes from the set
557
+
558
+ @param {Number} start index, Range, or IndexSet
559
+ @param {Number} length optional length of range.
560
+ @returns {SC.IndexSet} receiver
561
+ */
562
+ remove: function(start, length) {
563
+
564
+ if (this.isFrozen) throw SC.FROZEN_ERROR;
565
+
566
+ // normalize input
567
+ if (length === undefined) {
568
+ if (start === null || start === undefined) {
569
+ return this; // nothing to do
570
+
571
+ } else if (typeof start === SC.T_NUMBER) {
572
+ length = 1 ;
573
+
574
+ // if passed an index set, just add each range in the index set.
575
+ } else if (start.isIndexSet) {
576
+ start.forEachRange(this.remove, this);
577
+ return this;
578
+
579
+ } else {
580
+ length = start.length;
581
+ start = start.start;
582
+ }
583
+ }
584
+
585
+ // special case - appending to end of set
586
+ var max = this.get('max'),
587
+ oldmax = max,
588
+ content = this._content,
589
+ cur, next, delta, value, last ;
590
+
591
+ // if we're past the end, do nothing.
592
+ if (start >= max) return this;
593
+
594
+ // find nearest starting range. split or join that range
595
+ cur = this.rangeStartForIndex(start);
596
+ next = content[cur];
597
+ last = start + length ;
598
+ delta = 0 ;
599
+
600
+ // we are right on a boundary and we had a range or were the end, then
601
+ // go back one more.
602
+ if ((start>0) && (cur === start) && (next > 0)) {
603
+ cur = this.rangeStartForIndex(start-1);
604
+ next = content[cur] ;
605
+ }
606
+
607
+ // previous range is in set. splice it here
608
+ if (next > 0) {
609
+ content[cur] = start ;
610
+
611
+ // if previous range extends beyond this range, splice afterwards also
612
+ if (next > last) {
613
+ content[start] = last;
614
+ content[last] = next ;
615
+ } else content[start] = next;
616
+
617
+ // previous range is not in set. merge the ranges
618
+ } else {
619
+ start = cur ;
620
+ next = Math.abs(next);
621
+ if (next > last) {
622
+ last = next ;
623
+ }
624
+ }
625
+
626
+ // at this point there should be clean starting point for the range.
627
+ // just walk the ranges, adding up the length delta and then removing
628
+ // the range until we find a range that passes last
629
+ cur = start;
630
+ while (cur < last) {
631
+ // get next boundary. splice if needed - if value is 0, we are at end
632
+ // just skip to last
633
+ value = content[cur];
634
+ if (value === 0) {
635
+ content[last] = 0;
636
+ next = last ;
637
+
638
+ } else {
639
+ next = Math.abs(value);
640
+ if (next > last) {
641
+ content[last] = value ;
642
+ next = last ;
643
+ }
644
+
645
+ // ok, cur range is entirely inside top range.
646
+ // add to delta if needed
647
+ if (value > 0) delta += next - cur ;
648
+ }
649
+
650
+ delete content[cur] ; // and remove range
651
+ cur = next;
652
+ }
653
+
654
+ // cur should always === last now. if the following range is not in set,
655
+ // merge in also - don't adjust delta because these aren't new indexes
656
+ if ((cur = content[last]) < 0) {
657
+ delete content[last];
658
+ last = Math.abs(cur) ;
659
+ }
660
+
661
+ // set my own range - if the next item is 0, then clear it.
662
+ if (content[last] === 0) {
663
+ delete content[last];
664
+ content[start] = 0 ;
665
+ this.set('max', start); //max has changed
666
+
667
+ } else {
668
+ content[start] = 0-last ;
669
+ }
670
+
671
+ // adjust length
672
+ this.set('length', this.get('length') - delta);
673
+
674
+ // compute hint range
675
+ length = last - start ;
676
+
677
+ this._hint(start, length);
678
+ if (delta !== 0) this.enumerableContentDidChange();
679
+ return this;
680
+ },
681
+
682
+ /** @private
683
+ iterates through a named range, setting hints every HINT_SIZE indexes
684
+ pointing to the nearest range start. The passed range must start on a
685
+ range boundary. It can end anywhere.
686
+ */
687
+ _hint: function(start, length, content) {
688
+ if (content === undefined) content = this._content;
689
+
690
+ var skip = SC.IndexSet.HINT_SIZE,
691
+ next = Math.abs(content[start]), // start of next range
692
+ loc = start - (start % skip) + skip, // next hint loc
693
+ lim = start + length ; // stop
694
+
695
+ while (loc < lim) {
696
+ // make sure we are in current rnage
697
+ while ((next !== 0) && (next <= loc)) {
698
+ start = next ;
699
+ next = Math.abs(content[start]) ;
700
+ }
701
+
702
+ // past end
703
+ if (next === 0) {
704
+ delete content[loc];
705
+
706
+ // do not change if on actual boundary
707
+ } else if (loc !== start) {
708
+ content[loc] = start ; // set hint
709
+ }
710
+
711
+ loc += skip;
712
+ }
713
+ },
714
+
715
+ /**
716
+ Clears the set
717
+ */
718
+ clear: function() {
719
+ if (this.isFrozen) throw SC.FROZEN_ERROR;
720
+
721
+ var oldlen = this.length;
722
+ this._content.length=1;
723
+ this._content[0] = 0;
724
+ this.set('length', 0).set('max', 0);
725
+ if (oldlen > 0) this.enumerableContentDidChange();
726
+ },
727
+
728
+ /**
729
+ Add all the ranges in the passed array.
730
+ */
731
+ addEach: function(objects) {
732
+ if (this.isFrozen) throw SC.FROZEN_ERROR;
733
+
734
+ var idx = objects.get('length') ;
735
+ if (objects.objectAt) {
736
+ while(--idx >= 0) this.add(objects.objectAt(idx)) ;
737
+ } else {
738
+ while(--idx >= 0) this.add(objects[idx]) ;
739
+ }
740
+ return this ;
741
+ },
742
+
743
+ /**
744
+ Removes all the ranges in the passed array.
745
+ */
746
+ removeEach: function(objects) {
747
+ if (this.isFrozen) throw SC.FROZEN_ERROR;
748
+
749
+ var idx = objects.get('length') ;
750
+ if (objects.objectAt) {
751
+ while(--idx >= 0) this.remove(objects.objectAt(idx)) ;
752
+ } else {
753
+ while(--idx >= 0) this.remove(objects[idx]) ;
754
+ }
755
+ return this ;
756
+ },
757
+
758
+ /**
759
+ Clones the set into a new set.
760
+ */
761
+ clone: function() {
762
+ return SC.IndexSet.create(this);
763
+ },
764
+
765
+ /**
766
+ Returns a string describing the internal range structure. Useful for
767
+ debugging.
768
+
769
+ @returns {String}
770
+ */
771
+ inspect: function() {
772
+ var content = this._content,
773
+ len = content.length,
774
+ idx = 0,
775
+ ret = [],
776
+ item;
777
+
778
+ for(idx=0;idx<len;idx++) {
779
+ item = content[idx];
780
+ if (item !== undefined) ret.push("%@:%@".fmt(idx,item));
781
+ }
782
+ return "SC.IndexSet<%@>".fmt(ret.join(' , '));
783
+ },
784
+
785
+ /**
786
+ Invoke the callback, passing each occuppied range instead of each
787
+ index. This can be a more efficient way to iterate in some cases. The
788
+ callback should have the signature:
789
+
790
+ {{{
791
+ callback(start, length, indexSet, source) { ... }
792
+ }}}
793
+
794
+ If you pass a target as a second option, the callback will be called in
795
+ the target context.
796
+
797
+ @param {Function} callback the iterator callback
798
+ @param {Object} target the target
799
+ @returns {SC.IndexSet} receiver
800
+ */
801
+ forEachRange: function(callback, target) {
802
+ var content = this._content,
803
+ cur = 0,
804
+ next = content[cur],
805
+ source = this.source;
806
+
807
+ if (target === undefined) target = null ;
808
+ while (next !== 0) {
809
+ if (next > 0) callback.call(target, cur, next - cur, this, source);
810
+ cur = Math.abs(next);
811
+ next = content[cur];
812
+ }
813
+
814
+ return this ;
815
+ },
816
+
817
+ /**
818
+ Invokes the callback for each index within the passed start/length range.
819
+ Otherwise works just like regular forEach().
820
+
821
+ @param {Number} start starting index
822
+ @param {Number} length length of range
823
+ @param {Function} callback
824
+ @param {Object} target
825
+ @returns {SC.IndexSet} receiver
826
+ */
827
+ forEachIn: function(start, length, callback, target) {
828
+ var content = this._content,
829
+ cur = 0,
830
+ idx = 0,
831
+ lim = start + length,
832
+ source = this.source,
833
+ next = content[cur];
834
+
835
+ if (target === undefined) target = null ;
836
+ while (next !== 0) {
837
+ if (cur < start) cur = start ; // skip forward
838
+ while((cur < next) && (cur < lim)) {
839
+ callback.call(target, cur++, idx++, this, source);
840
+ }
841
+
842
+ if (cur >= lim) {
843
+ cur = next = 0 ;
844
+ } else {
845
+ cur = Math.abs(next);
846
+ next = content[cur];
847
+ }
848
+ }
849
+ return this ;
850
+ },
851
+
852
+ /**
853
+ Total number of indexes within the specified range.
854
+
855
+ @param {Number|SC.IndexSet} start index, range object or IndexSet
856
+ @param {Number} length optional range length
857
+ @returns {Number} count of indexes
858
+ */
859
+ lengthIn: function(start, length) {
860
+
861
+ var ret = 0 ;
862
+
863
+ // normalize input
864
+ if (length === undefined) {
865
+ if (start === null || start === undefined) {
866
+ return 0; // nothing to do
867
+
868
+ } else if (typeof start === SC.T_NUMBER) {
869
+ length = 1 ;
870
+
871
+ // if passed an index set, just add each range in the index set.
872
+ } else if (start.isIndexSet) {
873
+ start.forEachRange(function(start, length) {
874
+ ret += this.lengthIn(start, length);
875
+ }, this);
876
+ return ret;
877
+
878
+ } else {
879
+ length = start.length;
880
+ start = start.start;
881
+ }
882
+ }
883
+
884
+ // fast path
885
+ if (this.get('length') === 0) return 0;
886
+
887
+ var content = this._content,
888
+ cur = 0,
889
+ next = content[cur],
890
+ lim = start + length ;
891
+
892
+ while (cur<lim && next !== 0) {
893
+ if (next>0) {
894
+ ret += (next>lim) ? lim-cur : next-cur;
895
+ }
896
+ cur = Math.abs(next);
897
+ next = content[cur];
898
+ }
899
+
900
+ return ret ;
901
+ },
902
+
903
+ // ..........................................................
904
+ // OBJECT API
905
+ //
906
+
907
+ /**
908
+ Optionally set the source property on an index set and then you can
909
+ iterate over the actual object values referenced by the index set. See
910
+ indexOf(), lastIndexOf(), forEachObject(), addObject() and removeObject().
911
+ */
912
+ source: null,
913
+
914
+ /**
915
+ Returns the first index in the set that matches the passed object. You
916
+ must have a source property on the set for this to work.
917
+
918
+ @param {Object} object the object to check
919
+ @param {Number} startAt optional starting point
920
+ @returns {Number} found index or -1 if not in set
921
+ */
922
+ indexOf: function(object, startAt) {
923
+ var source = this.source;
924
+ if (!source) throw "%@.indexOf() requires source".fmt(this);
925
+
926
+ var len = source.get('length'),
927
+
928
+ // start with the first index in the set
929
+ content = this._content,
930
+ cur = content[0]<0 ? Math.abs(content[0]) : 0,
931
+ idx ;
932
+
933
+ while(cur>=0 && cur<len) {
934
+ idx = source.indexOf(object, cur);
935
+ if (idx<0) return -1 ; // not found in source
936
+ if (this.contains(idx)) return idx; // found in source and in set.
937
+ cur = idx+1;
938
+ }
939
+
940
+ return -1; // not found
941
+ },
942
+
943
+ /**
944
+ Returns the last index in the set that matches the passed object. You
945
+ must have a source property on the set for this to work.
946
+
947
+ @param {Object} object the object to check
948
+ @param {Number} startAt optional starting point
949
+ @returns {Number} found index or -1 if not in set
950
+ */
951
+ lastIndexOf: function(object, startAt) {
952
+ var source = this.source;
953
+ if (!source) throw "%@.lastIndexOf() requires source".fmt(this);
954
+
955
+ // start with the last index in the set
956
+ var len = source.get('length'),
957
+ cur = this.max-1,
958
+ idx ;
959
+
960
+ if (cur >= len) cur = len-1;
961
+ while (cur>=0) {
962
+ idx = source.lastIndexOf(object, cur);
963
+ if (idx<0) return -1 ; // not found in source
964
+ if (this.contains(idx)) return idx; // found in source and in set.
965
+ cur = idx+1;
966
+ }
967
+
968
+ return -1; // not found
969
+ },
970
+
971
+ /**
972
+ Iterates through the objects at each index location in the set. You must
973
+ have a source property on the set for this to work. The callback you pass
974
+ will be invoked for each object in the set with the following signature:
975
+
976
+ {{{
977
+ function callback(object, index, source, indexSet) { ... }
978
+ }}}
979
+
980
+ If you pass a target, it will be used when the callback is called.
981
+
982
+ @param {Function} callback function to invoke.
983
+ @param {Object} target optional content. otherwise uses window
984
+ @returns {SC.IndexSet} receiver
985
+ */
986
+ forEachObject: function(callback, target) {
987
+ var source = this.source;
988
+ if (!source) throw "%@.forEachObject() requires source".fmt(this);
989
+
990
+ var content = this._content,
991
+ cur = 0,
992
+ idx = 0,
993
+ next = content[cur];
994
+
995
+ if (target === undefined) target = null ;
996
+ while (next !== 0) {
997
+
998
+ while(cur < next) {
999
+ callback.call(target, source.objectAt(cur), cur, source, this);
1000
+ cur++;
1001
+ }
1002
+
1003
+ cur = Math.abs(next);
1004
+ next = content[cur];
1005
+ }
1006
+ return this ;
1007
+ },
1008
+
1009
+ /**
1010
+ Adds all indexes where the object appears to the set. If firstOnly is
1011
+ passed, then it will find only the first index and add it. If you know
1012
+ the object only appears in the source array one time, firstOnly may make
1013
+ this method faster.
1014
+
1015
+ Requires source to work.
1016
+
1017
+ @param {Object} object the object to add
1018
+ @returns {SC.IndexSet} receiver
1019
+ */
1020
+ addObject: function(object, firstOnly) {
1021
+ var source = this.source;
1022
+ if (!source) throw "%@.addObject() requires source".fmt(this);
1023
+
1024
+ var len = source.get('length'),
1025
+ cur = 0, idx;
1026
+
1027
+ while(cur>=0 && cur<len) {
1028
+ idx = source.indexOf(object, cur);
1029
+ if (idx >= 0) {
1030
+ this.add(idx);
1031
+ if (firstOnly) return this ;
1032
+ cur = idx++;
1033
+ } else return this ;
1034
+ }
1035
+ return this ;
1036
+ },
1037
+
1038
+ /**
1039
+ Adds any indexes matching the passed objects. If firstOnly is passed,
1040
+ then only finds the first index for each object.
1041
+
1042
+ @param {SC.Enumerable} objects the objects to add
1043
+ @returns {SC.IndexSet} receiver
1044
+ */
1045
+ addObjects: function(objects, firstOnly) {
1046
+ objects.forEach(function(object) {
1047
+ this.addObject(object, firstOnly);
1048
+ }, this);
1049
+ return this;
1050
+ },
1051
+
1052
+ /**
1053
+ Removes all indexes where the object appears to the set. If firstOnly is
1054
+ passed, then it will find only the first index and add it. If you know
1055
+ the object only appears in the source array one time, firstOnly may make
1056
+ this method faster.
1057
+
1058
+ Requires source to work.
1059
+
1060
+ @param {Object} object the object to add
1061
+ @returns {SC.IndexSet} receiver
1062
+ */
1063
+ removeObject: function(object, firstOnly) {
1064
+ var source = this.source;
1065
+ if (!source) throw "%@.removeObject() requires source".fmt(this);
1066
+
1067
+ var len = source.get('length'),
1068
+ cur = 0, idx;
1069
+
1070
+ while(cur>=0 && cur<len) {
1071
+ idx = source.indexOf(object, cur);
1072
+ if (idx >= 0) {
1073
+ this.remove(idx);
1074
+ if (firstOnly) return this ;
1075
+ cur = idx+1;
1076
+ } else return this ;
1077
+ }
1078
+ return this ;
1079
+ },
1080
+
1081
+ /**
1082
+ Removes any indexes matching the passed objects. If firstOnly is passed,
1083
+ then only finds the first index for each object.
1084
+
1085
+ @param {SC.Enumerable} objects the objects to add
1086
+ @returns {SC.IndexSet} receiver
1087
+ */
1088
+ removeObjects: function(objects, firstOnly) {
1089
+ objects.forEach(function(object) {
1090
+ this.removeObject(object, firstOnly);
1091
+ }, this);
1092
+ return this;
1093
+ },
1094
+
1095
+
1096
+ // .......................................
1097
+ // PRIVATE
1098
+ //
1099
+
1100
+ /**
1101
+ Usually observing notifications from IndexSet are not useful, so
1102
+ supress them by default.
1103
+ */
1104
+ LOG_OBSERVING: NO,
1105
+
1106
+ /** @private - optimized call to forEach() */
1107
+ forEach: function(callback, target) {
1108
+ var content = this._content,
1109
+ cur = 0,
1110
+ idx = 0,
1111
+ source = this.source,
1112
+ next = content[cur];
1113
+
1114
+ if (target === undefined) target = null ;
1115
+ while (next !== 0) {
1116
+ while(cur < next) {
1117
+ callback.call(target, cur++, idx++, this, source);
1118
+ }
1119
+ cur = Math.abs(next);
1120
+ next = content[cur];
1121
+ }
1122
+ return this ;
1123
+ },
1124
+
1125
+ /** @private - support iterators */
1126
+ nextObject: function(ignore, idx, context) {
1127
+ var content = this._content,
1128
+ next = context.next,
1129
+ max = this.get('max'); // next boundary
1130
+
1131
+ // seed.
1132
+ if (idx === null) {
1133
+ idx = next = 0 ;
1134
+
1135
+ } else if (idx >= max) {
1136
+ delete context.next; // cleanup context
1137
+ return null ; // nothing left to do
1138
+
1139
+ } else idx++; // look on next index
1140
+
1141
+ // look for next non-empty range if needed.
1142
+ if (idx === next) {
1143
+ do {
1144
+ idx = Math.abs(next);
1145
+ next = content[idx];
1146
+ } while(next < 0);
1147
+ context.next = next;
1148
+ }
1149
+
1150
+ return idx;
1151
+ },
1152
+
1153
+ toString: function() {
1154
+ var str = [];
1155
+ this.forEachRange(function(start, length) {
1156
+ str.push(length === 1 ? start : "%@..%@".fmt(start, start + length - 1));
1157
+ }, this);
1158
+ return "SC.IndexSet<%@>".fmt(str.join(',')) ;
1159
+ },
1160
+
1161
+ max: 0
1162
+
1163
+ }) ;
1164
+
1165
+ SC.IndexSet.slice = SC.IndexSet.copy = SC.IndexSet.clone ;
1166
+ SC.IndexSet.EMPTY = SC.IndexSet.create().freeze();