sproutcore 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ });