sproutcore 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +269 -0
  4. data/README.txt +67 -0
  5. data/Rakefile +4 -0
  6. data/app_generators/sproutcore/USAGE +5 -0
  7. data/app_generators/sproutcore/sproutcore_generator.rb +66 -0
  8. data/app_generators/sproutcore/templates/README +77 -0
  9. data/app_generators/sproutcore/templates/environment.yml +4 -0
  10. data/bin/sc-build +145 -0
  11. data/bin/sc-gen +24 -0
  12. data/bin/sc-server +63 -0
  13. data/bin/sproutcore +21 -0
  14. data/clients/sc_docs/controllers/docs.js +118 -0
  15. data/clients/sc_docs/core.js +19 -0
  16. data/clients/sc_docs/english.lproj/body.css +159 -0
  17. data/clients/sc_docs/english.lproj/body.rhtml +33 -0
  18. data/clients/sc_docs/english.lproj/controls.css +0 -0
  19. data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
  20. data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
  21. data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
  22. data/clients/sc_docs/english.lproj/images/indicator.gif +0 -0
  23. data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
  24. data/clients/sc_docs/english.lproj/no_docs.rhtml +7 -0
  25. data/clients/sc_docs/english.lproj/strings.js +14 -0
  26. data/clients/sc_docs/english.lproj/warning.rhtml +6 -0
  27. data/clients/sc_docs/fixtures/doc.js +11 -0
  28. data/clients/sc_docs/main.js +21 -0
  29. data/clients/sc_docs/models/doc.js +9 -0
  30. data/clients/sc_docs/tests/controllers/docs.rhtml +21 -0
  31. data/clients/sc_docs/tests/models/doc.rhtml +21 -0
  32. data/clients/sc_docs/tests/views/doc_frame.rhtml +21 -0
  33. data/clients/sc_docs/tests/views/doc_label_view.rhtml +21 -0
  34. data/clients/sc_docs/views/doc_frame.js +33 -0
  35. data/clients/sc_docs/views/doc_label.js +20 -0
  36. data/clients/sc_test_runner/controllers/runner.js +175 -0
  37. data/clients/sc_test_runner/core.js +19 -0
  38. data/clients/sc_test_runner/english.lproj/body.css +151 -0
  39. data/clients/sc_test_runner/english.lproj/body.rhtml +35 -0
  40. data/clients/sc_test_runner/english.lproj/controls.css +0 -0
  41. data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
  42. data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
  43. data/clients/sc_test_runner/english.lproj/images/gradients.png +0 -0
  44. data/clients/sc_test_runner/english.lproj/images/indicator.gif +0 -0
  45. data/clients/sc_test_runner/english.lproj/images/toolbar.png +0 -0
  46. data/clients/sc_test_runner/english.lproj/no_tests.rhtml +6 -0
  47. data/clients/sc_test_runner/english.lproj/strings.js +14 -0
  48. data/clients/sc_test_runner/english.lproj/warning.rhtml +6 -0
  49. data/clients/sc_test_runner/fixtures/test.js +12 -0
  50. data/clients/sc_test_runner/main.js +26 -0
  51. data/clients/sc_test_runner/models/test.js +11 -0
  52. data/clients/sc_test_runner/views/runner_frame.js +72 -0
  53. data/clients/sc_test_runner/views/test_label.js +20 -0
  54. data/config/hoe.rb +70 -0
  55. data/config/requirements.rb +17 -0
  56. data/environment.yml +9 -0
  57. data/frameworks/prototype/prototype.js +4186 -0
  58. data/frameworks/sproutcore/Core.js +378 -0
  59. data/frameworks/sproutcore/README +3 -0
  60. data/frameworks/sproutcore/controllers/array.js +236 -0
  61. data/frameworks/sproutcore/controllers/collection.js +305 -0
  62. data/frameworks/sproutcore/controllers/controller.js +323 -0
  63. data/frameworks/sproutcore/controllers/object.js +372 -0
  64. data/frameworks/sproutcore/drag/drag.js +549 -0
  65. data/frameworks/sproutcore/drag/drag_data_source.js +32 -0
  66. data/frameworks/sproutcore/drag/drag_source.js +64 -0
  67. data/frameworks/sproutcore/drag/drop_target.js +153 -0
  68. data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
  69. data/frameworks/sproutcore/english.lproj/buttons.css +589 -0
  70. data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
  71. data/frameworks/sproutcore/english.lproj/inline_text_editor.css +21 -0
  72. data/frameworks/sproutcore/english.lproj/menu.css +121 -0
  73. data/frameworks/sproutcore/english.lproj/panels/background-fat.jpg +0 -0
  74. data/frameworks/sproutcore/english.lproj/panels/background-thin.jpg +0 -0
  75. data/frameworks/sproutcore/english.lproj/panels/bottom-edge.png +0 -0
  76. data/frameworks/sproutcore/english.lproj/panels/bottom-left-corner.png +0 -0
  77. data/frameworks/sproutcore/english.lproj/panels/bottom-right-corner.png +0 -0
  78. data/frameworks/sproutcore/english.lproj/panels/left-edge.png +0 -0
  79. data/frameworks/sproutcore/english.lproj/panels/overlay.png +0 -0
  80. data/frameworks/sproutcore/english.lproj/panels/right-edge.png +0 -0
  81. data/frameworks/sproutcore/english.lproj/panels/top-edge.png +0 -0
  82. data/frameworks/sproutcore/english.lproj/panels/top-left-corner.png +0 -0
  83. data/frameworks/sproutcore/english.lproj/panels/top-right-corner.png +0 -0
  84. data/frameworks/sproutcore/english.lproj/panes.css +155 -0
  85. data/frameworks/sproutcore/english.lproj/picker.css +22 -0
  86. data/frameworks/sproutcore/english.lproj/strings.js +15 -0
  87. data/frameworks/sproutcore/english.lproj/tab.css +23 -0
  88. data/frameworks/sproutcore/english.lproj/tests.css +67 -0
  89. data/frameworks/sproutcore/english.lproj/theme.css +77 -0
  90. data/frameworks/sproutcore/foundation/animator.js +670 -0
  91. data/frameworks/sproutcore/foundation/application.js +199 -0
  92. data/frameworks/sproutcore/foundation/array.js +348 -0
  93. data/frameworks/sproutcore/foundation/benchmark.js +211 -0
  94. data/frameworks/sproutcore/foundation/binding.js +384 -0
  95. data/frameworks/sproutcore/foundation/date.js +357 -0
  96. data/frameworks/sproutcore/foundation/error.js +39 -0
  97. data/frameworks/sproutcore/foundation/input_manager.js +153 -0
  98. data/frameworks/sproutcore/foundation/json.js +296 -0
  99. data/frameworks/sproutcore/foundation/mock.js +42 -0
  100. data/frameworks/sproutcore/foundation/node_descriptor.js +56 -0
  101. data/frameworks/sproutcore/foundation/object.js +777 -0
  102. data/frameworks/sproutcore/foundation/observable.js +451 -0
  103. data/frameworks/sproutcore/foundation/page.js +63 -0
  104. data/frameworks/sproutcore/foundation/path_module.js +413 -0
  105. data/frameworks/sproutcore/foundation/responder.js +310 -0
  106. data/frameworks/sproutcore/foundation/routes.js +371 -0
  107. data/frameworks/sproutcore/foundation/run_loop.js +21 -0
  108. data/frameworks/sproutcore/foundation/server.js +491 -0
  109. data/frameworks/sproutcore/foundation/set.js +96 -0
  110. data/frameworks/sproutcore/foundation/string.js +149 -0
  111. data/frameworks/sproutcore/foundation/undo_manager.js +186 -0
  112. data/frameworks/sproutcore/foundation/unittest.js +622 -0
  113. data/frameworks/sproutcore/foundation/utils.js +61 -0
  114. data/frameworks/sproutcore/globals/panels.js +182 -0
  115. data/frameworks/sproutcore/globals/popups.js +60 -0
  116. data/frameworks/sproutcore/globals/window.js +381 -0
  117. data/frameworks/sproutcore/lib/index.rhtml +66 -0
  118. data/frameworks/sproutcore/models/collection.js +395 -0
  119. data/frameworks/sproutcore/models/record.js +622 -0
  120. data/frameworks/sproutcore/models/store.js +295 -0
  121. data/frameworks/sproutcore/panes/dialog.js +16 -0
  122. data/frameworks/sproutcore/panes/manager.js +164 -0
  123. data/frameworks/sproutcore/panes/menu.js +45 -0
  124. data/frameworks/sproutcore/panes/overlay.js +231 -0
  125. data/frameworks/sproutcore/panes/pane.js +90 -0
  126. data/frameworks/sproutcore/panes/panel.js +19 -0
  127. data/frameworks/sproutcore/panes/picker.js +45 -0
  128. data/frameworks/sproutcore/tests/controllers/array.rhtml +86 -0
  129. data/frameworks/sproutcore/tests/controllers/controller.rhtml +273 -0
  130. data/frameworks/sproutcore/tests/controllers/object.rhtml +327 -0
  131. data/frameworks/sproutcore/tests/foundation/application.rhtml +125 -0
  132. data/frameworks/sproutcore/tests/foundation/array.rhtml +221 -0
  133. data/frameworks/sproutcore/tests/foundation/object.rhtml +69 -0
  134. data/frameworks/sproutcore/tests/globals/window.rhtml +45 -0
  135. data/frameworks/sproutcore/tests/panes/pane.rhtml +88 -0
  136. data/frameworks/sproutcore/tests/views/collection.rhtml +137 -0
  137. data/frameworks/sproutcore/tests/views/popup_button.rhtml +115 -0
  138. data/frameworks/sproutcore/tests/views/text_field.rhtml +37 -0
  139. data/frameworks/sproutcore/validators/credit_card.js +92 -0
  140. data/frameworks/sproutcore/validators/date.js +36 -0
  141. data/frameworks/sproutcore/validators/email.js +29 -0
  142. data/frameworks/sproutcore/validators/not_empty.js +24 -0
  143. data/frameworks/sproutcore/validators/number.js +55 -0
  144. data/frameworks/sproutcore/validators/password.js +78 -0
  145. data/frameworks/sproutcore/validators/validator.js +304 -0
  146. data/frameworks/sproutcore/views/button.js +425 -0
  147. data/frameworks/sproutcore/views/checkbox_field.js +30 -0
  148. data/frameworks/sproutcore/views/collection.js +1521 -0
  149. data/frameworks/sproutcore/views/container.js +62 -0
  150. data/frameworks/sproutcore/views/error_explanation.js +45 -0
  151. data/frameworks/sproutcore/views/field.js +214 -0
  152. data/frameworks/sproutcore/views/filter_button.js +29 -0
  153. data/frameworks/sproutcore/views/form.js +591 -0
  154. data/frameworks/sproutcore/views/image.js +141 -0
  155. data/frameworks/sproutcore/views/inline_text_editor.js +96 -0
  156. data/frameworks/sproutcore/views/label.js +176 -0
  157. data/frameworks/sproutcore/views/menu_item.js +90 -0
  158. data/frameworks/sproutcore/views/pagination.js +54 -0
  159. data/frameworks/sproutcore/views/popup_button.js +86 -0
  160. data/frameworks/sproutcore/views/popup_menu.js +137 -0
  161. data/frameworks/sproutcore/views/progress.js +100 -0
  162. data/frameworks/sproutcore/views/radio_field.js +107 -0
  163. data/frameworks/sproutcore/views/radio_group.js +48 -0
  164. data/frameworks/sproutcore/views/segmented.js +80 -0
  165. data/frameworks/sproutcore/views/select_field.js +272 -0
  166. data/frameworks/sproutcore/views/spinner.js +11 -0
  167. data/frameworks/sproutcore/views/tab.js +126 -0
  168. data/frameworks/sproutcore/views/text_field.js +179 -0
  169. data/frameworks/sproutcore/views/textarea_field.js +14 -0
  170. data/frameworks/sproutcore/views/toolbar.js +29 -0
  171. data/frameworks/sproutcore/views/view.js +1389 -0
  172. data/frameworks/sproutcore/views/workspace.js +170 -0
  173. data/generators/client/README +3 -0
  174. data/generators/client/USAGE +12 -0
  175. data/generators/client/client_generator.rb +53 -0
  176. data/generators/client/templates/core.js +19 -0
  177. data/generators/client/templates/english.lproj/body.css +0 -0
  178. data/generators/client/templates/english.lproj/body.rhtml +3 -0
  179. data/generators/client/templates/english.lproj/controls.css +0 -0
  180. data/generators/client/templates/english.lproj/strings.js +14 -0
  181. data/generators/client/templates/main.js +37 -0
  182. data/generators/controller/USAGE +16 -0
  183. data/generators/controller/controller_generator.rb +51 -0
  184. data/generators/controller/templates/controller.js +21 -0
  185. data/generators/controller/templates/test.rhtml +21 -0
  186. data/generators/framework/README +7 -0
  187. data/generators/framework/USAGE +12 -0
  188. data/generators/framework/framework_generator.rb +53 -0
  189. data/generators/framework/templates/core.js +20 -0
  190. data/generators/framework/templates/english.lproj/body.css +0 -0
  191. data/generators/framework/templates/english.lproj/body.rhtml +3 -0
  192. data/generators/framework/templates/english.lproj/controls.css +0 -0
  193. data/generators/framework/templates/english.lproj/strings.js +14 -0
  194. data/generators/language/USAGE +16 -0
  195. data/generators/language/language_generator.rb +47 -0
  196. data/generators/language/templates/strings.js +10 -0
  197. data/generators/model/USAGE +24 -0
  198. data/generators/model/model_generator.rb +55 -0
  199. data/generators/model/templates/fixture.js +11 -0
  200. data/generators/model/templates/model.js +20 -0
  201. data/generators/model/templates/test.rhtml +21 -0
  202. data/generators/test/USAGE +16 -0
  203. data/generators/test/templates/test.rhtml +21 -0
  204. data/generators/test/test_generator.rb +47 -0
  205. data/generators/view/USAGE +16 -0
  206. data/generators/view/templates/test.rhtml +21 -0
  207. data/generators/view/templates/view.js +20 -0
  208. data/generators/view/view_generator.rb +51 -0
  209. data/jsdoc/README.txt +119 -0
  210. data/jsdoc/app/DocFile.js +137 -0
  211. data/jsdoc/app/DocTag.js +110 -0
  212. data/jsdoc/app/Doclet.js +63 -0
  213. data/jsdoc/app/Dumper.js +143 -0
  214. data/jsdoc/app/JsDoc.js +103 -0
  215. data/jsdoc/app/JsHilite.js +45 -0
  216. data/jsdoc/app/JsIO.js +163 -0
  217. data/jsdoc/app/JsParse.js +385 -0
  218. data/jsdoc/app/JsPlate.js +130 -0
  219. data/jsdoc/app/JsTestrun.js +129 -0
  220. data/jsdoc/app/JsToke.js +564 -0
  221. data/jsdoc/app/Symbol.js +298 -0
  222. data/jsdoc/app/Transformer.js +14 -0
  223. data/jsdoc/app/Util.js +97 -0
  224. data/jsdoc/app/js.jar +0 -0
  225. data/jsdoc/app/run.js +144 -0
  226. data/jsdoc/plugins/min.js +316 -0
  227. data/jsdoc/plugins/strip.js +20 -0
  228. data/jsdoc/templates/sproutcore/class.tmpl +438 -0
  229. data/jsdoc/templates/sproutcore/default.css +241 -0
  230. data/jsdoc/templates/sproutcore/index.html +13 -0
  231. data/jsdoc/templates/sproutcore/index.tmpl +21 -0
  232. data/jsdoc/templates/sproutcore/prototype.js +4186 -0
  233. data/jsdoc/templates/sproutcore/publish.js +236 -0
  234. data/jsdoc/templates/sproutcore/splash.html +7 -0
  235. data/lib/sproutcore/build_tools/html_builder.rb +88 -0
  236. data/lib/sproutcore/build_tools/resource_builder.rb +194 -0
  237. data/lib/sproutcore/build_tools.rb +44 -0
  238. data/lib/sproutcore/bundle.rb +517 -0
  239. data/lib/sproutcore/bundle_manifest.rb +397 -0
  240. data/lib/sproutcore/generator_helper.rb +170 -0
  241. data/lib/sproutcore/helpers/capture_helper.rb +42 -0
  242. data/lib/sproutcore/helpers/static_helper.rb +80 -0
  243. data/lib/sproutcore/helpers/tag_helper.rb +110 -0
  244. data/lib/sproutcore/helpers/text_helper.rb +336 -0
  245. data/lib/sproutcore/helpers.rb +3 -0
  246. data/lib/sproutcore/jsdoc.rb +40 -0
  247. data/lib/sproutcore/jsmin.rb +247 -0
  248. data/lib/sproutcore/library.rb +258 -0
  249. data/lib/sproutcore/merb/bundle_controller.rb +179 -0
  250. data/lib/sproutcore/merb/router.rb +43 -0
  251. data/lib/sproutcore/merb.rb +27 -0
  252. data/lib/sproutcore/version.rb +9 -0
  253. data/lib/sproutcore/view_helpers/button_views.rb +302 -0
  254. data/lib/sproutcore/view_helpers/core_views.rb +284 -0
  255. data/lib/sproutcore/view_helpers/form_views.rb +258 -0
  256. data/lib/sproutcore/view_helpers/menu_views.rb +94 -0
  257. data/lib/sproutcore/view_helpers.rb +628 -0
  258. data/lib/sproutcore.rb +30 -0
  259. data/script/destroy +14 -0
  260. data/script/generate +14 -0
  261. data/script/txt2html +74 -0
  262. data/setup.rb +1585 -0
  263. data/spec/spec.opts +1 -0
  264. data/spec/spec_helper.rb +7 -0
  265. data/spec/sproutcore_spec.rb +11 -0
  266. data/tasks/deployment.rake +34 -0
  267. data/tasks/environment.rake +7 -0
  268. data/tasks/rspec.rake +21 -0
  269. data/tasks/website.rake +17 -0
  270. metadata +365 -0
@@ -0,0 +1,378 @@
1
+ //@license
2
+ // ==========================================================================
3
+ // SproutCore -- JavaScript Application Framework
4
+ // copyright 2006-2007, Sprout Systems, Inc. and contributors.
5
+ //
6
+ // Permission is hereby granted, free of charge, to any person obtaining a
7
+ // copy of this software and associated documentation files (the "Software"),
8
+ // to deal in the Software without restriction, including without limitation
9
+ // the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
+ // and/or sell copies of the Software, and to permit persons to whom the
11
+ // Software is furnished to do so, subject to the following conditions:
12
+ //
13
+ // The above copyright notice and this permission notice shall be included in
14
+ // all copies or substantial portions of the Software.
15
+ //
16
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
+ // DEALINGS IN THE SOFTWARE.
23
+ //
24
+ // For more information about SproutCore, visit http://www.sproutcore.com
25
+ //
26
+ //
27
+ // ==========================================================================
28
+ //@license
29
+
30
+ // ==========================================================================
31
+ // Utility Classes
32
+ // Author: Charles Jolley
33
+ // copyright 2006, Sprout Systems, Inc.
34
+ //
35
+ // This file contains a number of utility methods and classes used throughout
36
+ // SproutCore. This should be loaded after your load Prototype but before you
37
+ // load any other SproutCore objects. In general, this is the only
38
+ // dependency most SproutCore objects will have.
39
+ //
40
+ // ==========================================================================
41
+
42
+ // All objects live in the SproutCore namespace, which is also availabe in the
43
+ // abreviation SC.
44
+ SproutCore = {} ; SC = SproutCore ;
45
+
46
+ // this makes for some nicer to read code
47
+ var YES = true ; var NO = false ;
48
+
49
+ // this is used by the JavascriptCompile class on the server side. You can
50
+ // use this to automatically determine the order javascript files need to be
51
+ // included in. On the client side, this is a NOP.
52
+ function require(file) { return null ; }
53
+
54
+ // implement window.console.log() for IE.
55
+ if (!window.console) {
56
+ window.console = {
57
+ _output: [],
58
+ log: function(str) { this._output.push(str) ; },
59
+ tail: function(lines) {
60
+ if (!lines) lines = 1 ;
61
+ var loc = this._output.length - lines ;
62
+ if (loc < 0) loc = 0 ;
63
+ var ret = [] ;
64
+ while(loc < this._output.length) {
65
+ ret.push(this._output[loc]) ; loc++ ;
66
+ }
67
+ return ret.join("\n");
68
+ }
69
+ } ;
70
+ }
71
+ window.logCount = 0 ;
72
+
73
+ // ........................................
74
+ // GENERAL UTILITIES
75
+ //
76
+
77
+ Object.extend(SC,{
78
+
79
+ _downloadFrames: 0, // count of download frames inserted into document
80
+
81
+ download: function(path) {
82
+ var tempDLIFrame=document.createElement('iframe');
83
+ var frameId = 'DownloadFrame_' + this._downloadFrames;
84
+ tempDLIFrame.setAttribute('id',frameId);
85
+ tempDLIFrame.style.border='10px';
86
+ tempDLIFrame.style.width='0px';
87
+ tempDLIFrame.style.height='0px';
88
+ tempDLIFrame.style.position='absolute';
89
+ tempDLIFrame.style.top='-10000px';
90
+ tempDLIFrame.style.left='-10000px';
91
+ // Don't set the iFrame content yet if this is Safari
92
+ if (!(SC.isSafari())) {
93
+ tempDLIFrame.setAttribute('src',path);
94
+ }
95
+ document.getElementsByTagName('body')[0].appendChild(tempDLIFrame);
96
+ if (SC.isSafari()) {
97
+ tempDLIFrame.setAttribute('src',path);
98
+ }
99
+ this._downloadFrames = this._downloadFrames + 1;
100
+ if (!(SC.isSafari())) {
101
+ var r = function() {
102
+ document.body.removeChild(document.getElementById(frameId));
103
+ } ;
104
+ var t = setTimeout(r,2000);
105
+ }
106
+ },
107
+
108
+ // Call this method during setup of your app to queue up methods to be
109
+ // called once the entire document has finished loading. If you call this
110
+ // method once the document has already loaded, then the function will be
111
+ // called immediately.
112
+ callOnLoad: function(func) {
113
+ if (SC._onloadQueueFlushed) func.call(document);
114
+ var queue = SC._onloadQueue || [] ;
115
+ queue.push(func) ; SC._onloadQueue = queue ;
116
+ },
117
+
118
+ // To flush the callOnLoad queue, you need to set window.onload=SC.didLoad
119
+ didLoad: function() {
120
+
121
+ SC.app = SC.Application.create();
122
+ SC.app.run();
123
+
124
+ // set the current language
125
+ var b = $tag('body');
126
+ Element.addClassName(b, String.currentLanguage().toLowerCase()) ;
127
+
128
+ // call the onloadQueue.
129
+ var queue ;
130
+ if (window.callOnLoad) {
131
+ if (window.callOnLoad instanceof Array) {
132
+ queue = window.callOnLoad ;
133
+ } else if (window.callOnLoad instanceof Function) {
134
+ queue = [window.callOnLoad] ;
135
+ }
136
+ } else queue = [] ;
137
+ queue = queue.concat(SC._onloadQueue) ;
138
+ var func = null ;
139
+ while(func = queue.shift()) func.call(document) ;
140
+ SC._onloadQueueFlushed = true ;
141
+
142
+ // start the app; call main.
143
+ if (window.main && (main instanceof Function)) main() ; // start app.
144
+
145
+ // finally handle any routes if any.
146
+ if (typeof Routes != 'undefined') {
147
+ Routes.doRoutes() ; // old style.
148
+ } else if (typeof SC.Routes != 'undefined') {
149
+ SC.Routes.ping() ; // handle routes, if modules is installed.
150
+ }
151
+
152
+ },
153
+
154
+ // this will take a URL of any type and convert it to a fully qualified URL.
155
+ normalizeURL: function(url) {
156
+ if (url.slice(0,1) == '/') {
157
+ url = window.location.protocol + '//' + window.location.host + url ;
158
+ } else if ((url.slice(0,5) == 'http:') || (url.slice(0,6) == 'https:')) {
159
+ // no change
160
+ } else {
161
+ url = window.location + '/' + url ;
162
+ }
163
+ return url ;
164
+ },
165
+
166
+ // use this instead of typeOf() to get the type of item. The return values
167
+ // are: 'string', 'number', 'function', 'class', 'object', 'hash', 'null',
168
+ // 'undefined', 'boolean'.
169
+ // 'object' will be returned for any items inheriting from SC.Object. 'hash'
170
+ // is any other type of object.
171
+ typeOf: function(item) {
172
+ if (item === undefined) return T_UNDEFINED ;
173
+ if (item === null) return T_NULL ;
174
+ var ret = typeof(item) ;
175
+ if (ret == "object") {
176
+ if (item instanceof Array) {
177
+ ret = T_ARRAY ;
178
+ } else if (item instanceof Function) {
179
+ ret = (item.isClass) ? T_CLASS : T_FUNCTION ;
180
+ } else if (item instanceof SC.Error) {
181
+ ret = T_ERROR ;
182
+ } else if (item.isObject == true) {
183
+ ret = T_OBJECT ;
184
+ } else ret = T_HASH ;
185
+ } else if (ret == T_FUNCTION) ret = (item.isClass) ? T_CLASS : T_FUNCTION;
186
+ return ret ;
187
+ },
188
+
189
+ // this will compare two values to see if they are equal. If you have two
190
+ // values of unknown type, this is faster across all browsers than ===.
191
+ isEqual: function(a,b) {
192
+ if (a === null) {
193
+ return b === null ;
194
+ } else if (a === undefined) {
195
+ return b === undefined ;
196
+ } else if (typeof(a) == typeof(b)) {
197
+ return a == b ;
198
+ }
199
+ },
200
+
201
+ isArray: function( obj )
202
+ {
203
+ return ($type(obj) == T_ARRAY) || (obj && obj.objectAt);
204
+ },
205
+
206
+ _nextGUID: 0,
207
+ getGUID: function( obj )
208
+ {
209
+ if (obj == null) return 0 ;
210
+ return obj._guid ? obj._guid : (obj._guid = SC._nextGUID++);
211
+ },
212
+
213
+ /** Browser and Platform info. */
214
+ Platform: {
215
+
216
+ /** The current IE version number or 0 if not IE. */
217
+ IE: function() {
218
+ if (Prototype.Browser.IE) {
219
+ return (navigator.appVersion.match(/\bMSIE.*7\.\b/)) ? 7 : 6 ;
220
+ } else return 0 ;
221
+ }(),
222
+
223
+ /** The current Safari major version number of 0 if not Safari */
224
+ Safari: function() {
225
+ if (Prototype.Browser.WebKit) {
226
+ var vers = parseInt(navigator.appVersion.replace(/^.*?AppleWebKit\/(\d+).*?$/,'$1'),0) ;
227
+ return (vers > 420) ? 3 : 2 ;
228
+ } return 0 ;
229
+ }(),
230
+
231
+ /** The current Firefox major version number or 0 if not Firefox */
232
+ Firefox: function() {
233
+ if (Prototype.Browser.Gecko) {
234
+ var ret = parseFloat((navigator.userAgent.match(/Firefox\/(.)/)[1]) || 0);
235
+ if (ret < 1) ret = 1;
236
+ return ret ;
237
+ } else return 0 ;
238
+ }(),
239
+
240
+ isWindows: function() {
241
+ return !!(navigator.appVersion.match(/(Windows)/)) ;
242
+ }(),
243
+
244
+ isMac: function() {
245
+ if(Prototype.Browser.Gecko) {
246
+ return !!(navigator.appVersion.match(/(Macintosh)/));
247
+ } else {
248
+ return !!(navigator.appVersion.match(/(Mac OS X)/)) ;
249
+ }
250
+ }()
251
+
252
+ },
253
+
254
+ // DEPRECATED. here for compatibility only.
255
+ /** @private */
256
+ isIE: function() {
257
+ return SC.Platform.IE > 0 ;
258
+ },
259
+
260
+ /** @private */
261
+ isSafari: function() {
262
+ return SC.Platform.Safari > 0 ;
263
+ },
264
+
265
+ /** @private */
266
+ isSafari3: function() {
267
+ return SC.Platform.Safari >= 3 ;
268
+ },
269
+
270
+ /** @private */
271
+ isIE7: function() {
272
+ return SC.Platform.IE >= 7 ;
273
+ },
274
+
275
+ /** @private */
276
+ isIE6: function() {
277
+ return (SC.Platform.IE >= 6) && (SC.Platform.IE < 7) ;
278
+ },
279
+
280
+ /** @private */
281
+ isWindows: function() {
282
+ return SC.Platform.isWindows;
283
+ },
284
+
285
+ /** @private */
286
+ isMacOSX: function() {
287
+ return SC.Platform.isMac ;
288
+ },
289
+
290
+ /** @private */
291
+ isFireFox: function() {
292
+ return SC.Platform.Firefox > 0 ;
293
+ },
294
+
295
+ /** @private */
296
+ isFireFox2: function() {
297
+ return SC.Platform.Firefox >= 2 ;
298
+ }
299
+
300
+ });
301
+
302
+ // Save the Platform.Browser name.
303
+ SC.Platform.Browser = function() {
304
+ if (SC.Platform.IE >0) {
305
+ return 'IE';
306
+ } else if (SC.Platform.Safari > 0) {
307
+ return 'Safari';
308
+ } else if (SC.Platform.Firefox >0) {
309
+ return 'Firefox';
310
+ }
311
+ }() ;
312
+
313
+ T_ERROR = 'error' ;
314
+ T_OBJECT = 'object' ;
315
+ T_NULL = 'null';
316
+ T_CLASS = 'class' ;
317
+ T_HASH = 'hash' ;
318
+ T_FUNCTION = 'function' ;
319
+ T_UNDEFINED = 'undefined' ;
320
+ T_NUMBER = 'number' ;
321
+ T_BOOL = 'boolean' ;
322
+ T_ARRAY = 'array' ;
323
+ T_STRING = 'string' ;
324
+
325
+ $type = function(item) { return SC.typeOf(item); };
326
+
327
+ Object.extend(Object,{
328
+
329
+ // this will serialize a general JSON object into a URI.
330
+ serialize: function(obj) {
331
+ var ret = [] ;
332
+ for(var key in obj) {
333
+ var value = obj[key] ;
334
+ if (typeof value == 'number') { value = '' + value ; }
335
+ if (!(typeof value == 'string')) { value = value.join(','); }
336
+ ret.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)) ;
337
+ }
338
+ return ret.join('&') ;
339
+ }
340
+
341
+ }) ;
342
+
343
+
344
+ // This will add or remove the class name based on the flag, allowing you to
345
+ // treat it like a bool setting. Simplifies the common case where you need
346
+ // to make a class name match a bool.
347
+ Element.setClassName = function(element,className,flag) {
348
+ if (flag) {
349
+ element.addClassName(className);
350
+ } else {
351
+ element.removeClassName(className) ;
352
+ }
353
+ } ;
354
+
355
+ // ........................................
356
+ // EVENT EXTENSIONS
357
+ //
358
+ Object.extend(Event,{
359
+ // get the character code for key pressed events.
360
+ getCharCode: function(e) {
361
+ return (e.keyCode) ? e.keyCode : ((e.which)?e.which:0) ;
362
+ },
363
+
364
+ // get the pressed char as a string.
365
+ getCharString: function(e) {
366
+ return String.fromCharCode(Event.getCharCode(e)) ;
367
+ },
368
+
369
+ pointerLocation: function(e) {
370
+ return { x: Event.pointerX(e), y: Event.pointerY(e) };
371
+ },
372
+
373
+ ALT_KEY: '_ALT',
374
+ CTRL_KEY: '_CTRL',
375
+ SHIFT_KEY: '_SHIFT'
376
+
377
+ });
378
+
@@ -0,0 +1,3 @@
1
+ SproutCore is a framework for building JavaScript applications. It contains a number of components you can use to enable traditional desktop-like functions using only javascript. SproutCore relies on Prototype and works with Scriptaculous.
2
+
3
+
@@ -0,0 +1,236 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('controllers/controller') ;
7
+ require('foundation/array') ;
8
+
9
+ /** @class
10
+
11
+ An Array Controller provides a way to project the contents of an array
12
+ out to a view. You can use this object any place you might use an
13
+ array. Changes to the array will not propogate to the content array
14
+ until you call commitChanges().
15
+
16
+ @extends SC.Controller
17
+ @extends SC.Array
18
+
19
+ */
20
+ SC.ArrayController = SC.Controller.extend(SC.Array,
21
+ /** @scope SC.ArrayController.prototype */
22
+ {
23
+ /**
24
+ * The array content that is being managed by the controller.
25
+ * @property
26
+ * @type {Array}
27
+ */
28
+ content: function( key, value )
29
+ {
30
+ if (!this._content) this._content = [];
31
+ if (value !== undefined)
32
+ {
33
+ // only allow arrays... or array-like objects...
34
+ this._content = ($type(value) == T_ARRAY) || (value && value.objectAt) ? value : [];
35
+ }
36
+ return this._content;
37
+ }.property(),
38
+
39
+ /**
40
+ * Watches changes to the content property updates the contentClone.
41
+ * @private
42
+ * @observes content
43
+ **/
44
+ _contentObserver: function()
45
+ {
46
+ this.contentCloneReset();
47
+ }.observes('content'),
48
+
49
+
50
+ /**
51
+ * A log of calls to the replace method that will be played back to the content property on commit.
52
+ * @private
53
+ * @property
54
+ * @type {SC.Array}
55
+ */
56
+ changelog: function( key, value )
57
+ {
58
+ if (!this._changelog) this._changelog = [];
59
+ if (value !== undefined) this._changelog = value;
60
+ return this._changelog;
61
+ }.property(),
62
+
63
+ /**
64
+ * A collection of all the objects that have been removed using removeObject.
65
+ * On commit, they are deleted.
66
+ * @private
67
+ * @property
68
+ * @type {SC.Array}
69
+ */
70
+ deletions: function( key, value )
71
+ {
72
+ if (!this._deletions) this._deletions = [];
73
+ if (value !== undefined) this._deletions = value;
74
+ return this._deletions;
75
+ }.property(),
76
+
77
+ /**
78
+ * The array content that (when committed) will be merged back into the content property.
79
+ * All array methods will take place on this object.
80
+ * @private
81
+ * @property
82
+ * @type {SC.Array}
83
+ */
84
+ contentClone: function( key, value )
85
+ {
86
+ if (value !== undefined)
87
+ {
88
+ this._contentClone = value;
89
+ this.arrayContentDidChange();
90
+ }
91
+ return this._contentClone;
92
+ }.property(),
93
+
94
+ /**
95
+ * Clones the content property into the contentClone property.
96
+ * @private
97
+ **/
98
+ contentCloneReset: function()
99
+ {
100
+ this.set('changelog', []);
101
+ this.set('deletions', []);
102
+ this.set('contentClone', null);
103
+ },
104
+
105
+ /**
106
+ * SC.Array interface implimentation.
107
+ *
108
+ * @param {Number} idx
109
+ * Starting index in the array to replace. If idx >= length, then append to
110
+ * the end of the array.
111
+ *
112
+ * @param {Number} amt
113
+ * Number of elements that should be removed from the array, starting at
114
+ * *idx*.
115
+ *
116
+ * @param {Array} objects
117
+ * An array of zero or more objects that should be inserted into the array at
118
+ * *idx*
119
+ */
120
+ replace: function(idx, amt, objects)
121
+ {
122
+ if (this.get('contentClone') == undefined) this.set('contentClone', this.get('content').clone());
123
+
124
+ for (var i=0; i < amt; i++)
125
+ {
126
+ this.get('deletions').push( this._getSourceContent().objectAt(idx + i) );
127
+ }
128
+
129
+ this.get('changelog').push({ idx: idx, amt: amt, objects: objects });
130
+ this.get('contentClone').replace(idx, amt, objects);
131
+
132
+ for (var i=idx, n=idx+amt; i < n; i++)
133
+ {
134
+ if ( this._objControllers && this._objControllers[i] )
135
+ {
136
+ this._objControllers[i] = null;
137
+ }
138
+ }
139
+
140
+ this.editorDidChange() ;
141
+ this.arrayContentDidChange();
142
+
143
+ return this;
144
+ },
145
+ /**
146
+ * SC.Array interface implimentation.
147
+ *
148
+ * @param {Number} idx
149
+ * The index of the item to return. If idx exceeds the current length,
150
+ * return null.
151
+ */
152
+ objectAt: function(idx)
153
+ {
154
+ var obj = this._getSourceContent().objectAt(idx);
155
+
156
+ if ( !this._objControllers ) this._objControllers = [];
157
+ if ( !this._objControllers[idx] ) this._objControllers[idx] = this.controllerForValue(obj);
158
+
159
+ return this._objControllers[idx];
160
+ },
161
+ /**
162
+ * SC.Array interface implimentation.
163
+ * @property
164
+ * @type {integer}
165
+ */
166
+ length: function( key, value )
167
+ {
168
+ return this._getSourceContent().get('length');
169
+ }.property(),
170
+
171
+ indexOf: function( obj )
172
+ {
173
+ return this._getSourceContent().indexOf(obj);
174
+ },
175
+ _getSourceContent: function()
176
+ {
177
+ return this.get('contentClone') || this.get('content');
178
+ },
179
+
180
+
181
+
182
+
183
+ /**
184
+ * @private
185
+ */
186
+ performCommitChanges: function()
187
+ {
188
+ var content = this.get('content');
189
+ var ret = true;
190
+
191
+ // cannot commit changes to null content. Return an error.
192
+ if (!content)
193
+ {
194
+ return $error("No Content");
195
+ }
196
+
197
+ if (content.beginPropertyChanges) content.beginPropertyChanges();
198
+
199
+
200
+ // apply all the changes made to the clone
201
+ this.get('changelog').each(function(change)
202
+ {
203
+ content.replace( change.idx, change.amt, change.objects );
204
+ });
205
+ this.get('deletions').each(function(obj)
206
+ {
207
+ if (obj.instanceOf(SC.ObjectController)) obj = obj.get('content');
208
+ if (obj && obj.destroy)
209
+ {
210
+ obj.destroy();
211
+ }
212
+ });
213
+
214
+
215
+ if (content.endPropertyChanges) content.endPropertyChanges();
216
+ if (content.commitChanges) ret = content.commitChanges();
217
+
218
+ if ($ok(ret))
219
+ {
220
+ this.contentCloneReset();
221
+ this.editorDidClearChanges();
222
+ }
223
+
224
+ return ret;
225
+ },
226
+ /**
227
+ * @private
228
+ */
229
+ performDiscardChanges: function()
230
+ {
231
+ this.contentCloneReset();
232
+ this.editorDidClearChanges();
233
+ return true;
234
+ }
235
+
236
+ });