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,357 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ // Extensions to the Date object. Comes from JavaScript Toolbox at:
7
+ // http://www.mattkruse.com/javascript/date/source.html
8
+
9
+ // ------------------------------------------------------------------
10
+ // These functions use the same 'format' strings as the
11
+ // java.text.SimpleDateFormat class, with minor exceptions.
12
+ // The format string consists of the following abbreviations:
13
+ //
14
+ // Field | Full Form | Short Form
15
+ // -------------+--------------------+-----------------------
16
+ // Year | yyyy (4 digits) | yy (2 digits), y (2 or 4 digits)
17
+ // Month | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
18
+ // | NNN (abbr.) |
19
+ // Day of Month | dd (2 digits) | d (1 or 2 digits)
20
+ // Day of Week | EE (name) | E (abbr)
21
+ // Hour (1-12) | hh (2 digits) | h (1 or 2 digits)
22
+ // Hour (0-23) | HH (2 digits) | H (1 or 2 digits)
23
+ // Hour (0-11) | KK (2 digits) | K (1 or 2 digits)
24
+ // Hour (1-24) | kk (2 digits) | k (1 or 2 digits)
25
+ // Minute | mm (2 digits) | m (1 or 2 digits)
26
+ // Second | ss (2 digits) | s (1 or 2 digits)
27
+ // AM/PM | a |
28
+ //
29
+ // NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
30
+ // Examples:
31
+ // "MMM d, y" matches: January 01, 2000
32
+ // Dec 1, 1900
33
+ // Nov 20, 00
34
+ // "M/d/yy" matches: 01/20/00
35
+ // 9/2/00
36
+ // "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
37
+ // ------------------------------------------------------------------
38
+
39
+ var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
40
+ var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
41
+ function LZ(x) {return(x<0||x>9?"":"0")+x;}
42
+
43
+ Object.extend(Date,{
44
+
45
+ // returns the current time as an offset
46
+ now: function() {
47
+ return new Date().getTime() ;
48
+ },
49
+
50
+ // ------------------------------------------------------------------
51
+ // isDate ( date_string, format_string )
52
+ // Returns true if date string matches format of format string and
53
+ // is a valid date. Else returns false.
54
+ // It is recommended that you trim whitespace around the value before
55
+ // passing it to this function, as whitespace is NOT ignored!
56
+ // ------------------------------------------------------------------
57
+ isDate: function(val,format) {
58
+ var date = Date.getDateFromFormat(val,format);
59
+ if (date==0) { return false; }
60
+ return true;
61
+ },
62
+
63
+ // -------------------------------------------------------------------
64
+ // compareDates(date1,date1format,date2,date2format)
65
+ // Compare two date strings to see which is greater.
66
+ // Returns:
67
+ // 1 if date1 is greater than date2
68
+ // 0 if date2 is greater than date1 of if they are the same
69
+ // -1 if either of the dates is in an invalid format
70
+ // -------------------------------------------------------------------
71
+ compareDates: function(date1,dateformat1,date2,dateformat2) {
72
+ var d1= Date.getDateFromFormat(date1,dateformat1);
73
+ var d2= Date.getDateFromFormat(date2,dateformat2);
74
+ if (d1==0 || d2==0) {
75
+ return -1;
76
+ }
77
+ else if (d1 > d2) {
78
+ return 1;
79
+ }
80
+ return 0;
81
+ },
82
+
83
+ // ------------------------------------------------------------------
84
+ // getDateFromFormat( date_string , format_string )
85
+ //
86
+ // This function takes a date string and a format string. It matches
87
+ // If the date string matches the format string, it returns the
88
+ // getTime() of the date. If it does not match, it returns 0.
89
+ // ------------------------------------------------------------------
90
+ getDateFromFormat: function(val,format) {
91
+ val=val+"";
92
+ format=format+"";
93
+ var i_val=0;
94
+ var i_format=0;
95
+ var c="";
96
+ var token="";
97
+ var token2="";
98
+ var x,y;
99
+ var now=new Date();
100
+ var year=now.getYear();
101
+ var month=now.getMonth()+1;
102
+ var date=1;
103
+ var hh=now.getHours();
104
+ var mm=now.getMinutes();
105
+ var ss=now.getSeconds();
106
+ var ampm="";
107
+
108
+ while (i_format < format.length) {
109
+ // Get next token from format string
110
+ c=format.charAt(i_format);
111
+ token="";
112
+ while ((format.charAt(i_format)==c) && (i_format < format.length)) {
113
+ token += format.charAt(i_format++);
114
+ }
115
+ // Extract contents of value based on format token
116
+ if (token=="yyyy" || token=="yy" || token=="y") {
117
+ if (token=="yyyy") { x=4;y=4; }
118
+ if (token=="yy") { x=2;y=2; }
119
+ if (token=="y") { x=2;y=4; }
120
+ year=Date._getInt(val,i_val,x,y);
121
+ if (year==null) { return 0; }
122
+ i_val += year.length;
123
+ if (year.length==2) {
124
+ if (year > 70) { year=1900+(year-0); }
125
+ else { year=2000+(year-0); }
126
+ }
127
+ }
128
+ else if (token=="MMM"||token=="NNN"){
129
+ month=0;
130
+ for (var i=0; i<MONTH_NAMES.length; i++) {
131
+ var month_name=MONTH_NAMES[i];
132
+ if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
133
+ if (token=="MMM"||(token=="NNN"&&i>11)) {
134
+ month=i+1;
135
+ if (month>12) { month -= 12; }
136
+ i_val += month_name.length;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ if ((month < 1)||(month>12)){return 0;}
142
+ }
143
+ else if (token=="EE"||token=="E"){
144
+ for (var i=0; i<DAY_NAMES.length; i++) {
145
+ var day_name=DAY_NAMES[i];
146
+ if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
147
+ i_val += day_name.length;
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ else if (token=="MM"||token=="M") {
153
+ month=Date._getInt(val,i_val,token.length,2);
154
+ if(month==null||(month<1)||(month>12)){return 0;}
155
+ i_val+=month.length;}
156
+ else if (token=="dd"||token=="d") {
157
+ date=Date._getInt(val,i_val,token.length,2);
158
+ if(date==null||(date<1)||(date>31)){return 0;}
159
+ i_val+=date.length;}
160
+ else if (token=="hh"||token=="h") {
161
+ hh=Date._getInt(val,i_val,token.length,2);
162
+ if(hh==null||(hh<1)||(hh>12)){return 0;}
163
+ i_val+=hh.length;}
164
+ else if (token=="HH"||token=="H") {
165
+ hh=Date._getInt(val,i_val,token.length,2);
166
+ if(hh==null||(hh<0)||(hh>23)){return 0;}
167
+ i_val+=hh.length;}
168
+ else if (token=="KK"||token=="K") {
169
+ hh=Date._getInt(val,i_val,token.length,2);
170
+ if(hh==null||(hh<0)||(hh>11)){return 0;}
171
+ i_val+=hh.length;}
172
+ else if (token=="kk"||token=="k") {
173
+ hh=Date._getInt(val,i_val,token.length,2);
174
+ if(hh==null||(hh<1)||(hh>24)){return 0;}
175
+ i_val+=hh.length;hh--;}
176
+ else if (token=="mm"||token=="m") {
177
+ mm=Date._getInt(val,i_val,token.length,2);
178
+ if(mm==null||(mm<0)||(mm>59)){return 0;}
179
+ i_val+=mm.length;}
180
+ else if (token=="ss"||token=="s") {
181
+ ss=Date._getInt(val,i_val,token.length,2);
182
+ if(ss==null||(ss<0)||(ss>59)){return 0;}
183
+ i_val+=ss.length;}
184
+ else if (token=="a") {
185
+ if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
186
+ else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
187
+ else {return 0;}
188
+ i_val+=2;}
189
+ else {
190
+ if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
191
+ else {i_val+=token.length;}
192
+ }
193
+ }
194
+ // If there are any trailing characters left in the value, it doesn't match
195
+ if (i_val != val.length) { return 0; }
196
+ // Is date valid for month?
197
+ if (month==2) {
198
+ // Check for leap year
199
+ if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
200
+ if (date > 29){ return 0; }
201
+ }
202
+ else { if (date > 28) { return 0; } }
203
+ }
204
+ if ((month==4)||(month==6)||(month==9)||(month==11)) {
205
+ if (date > 30) { return 0; }
206
+ }
207
+ // Correct hours value
208
+ if (hh<12 && ampm=="PM") { hh=hh-0+12; }
209
+ else if (hh>11 && ampm=="AM") { hh-=12; }
210
+ var newdate=new Date(year,month-1,date,hh,mm,ss);
211
+ return newdate.getTime();
212
+ },
213
+
214
+ // ------------------------------------------------------------------
215
+ // parseDate( date_string [, prefer_euro_format] )
216
+ //
217
+ // This function takes a date string and tries to match it to a
218
+ // number of possible date formats to get the value. It will try to
219
+ // match against the following international formats, in this order:
220
+ // y-M-d MMM d, y MMM d,y y-MMM-d d-MMM-y MMM d
221
+ // M/d/y M-d-y M.d.y MMM-d M/d M-d
222
+ // d/M/y d-M-y d.M.y d-MMM d/M d-M
223
+ //
224
+ // Also understands:
225
+ //
226
+ // yesterday, today, tomorrow, now
227
+ //
228
+ // A second argument may be passed to instruct the method to search
229
+ // for formats like d/M/y (european format) before M/d/y (American).
230
+ // Returns a Date object or null if no patterns match.
231
+ // ------------------------------------------------------------------
232
+ parseDate: function(val) {
233
+ var preferEuro=(arguments.length==2)?arguments[1]:false;
234
+ generalFormats=new Array('E NNN dd HH:mm:ss UTC yyyy','y-M-d','y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d','d MMM y','d.MMM.y','y MMM d','y.MMM.d');
235
+ monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
236
+ dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
237
+ var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
238
+ var d=null;
239
+
240
+ // first look for natural language
241
+ d = 0 ; var now = new Date().getTime() ;
242
+ switch(val.toLowerCase()) {
243
+ case 'yesterday'.loc():
244
+ d = now - (24*60*60*1000) ;
245
+ break ;
246
+ case 'today'.loc():
247
+ case 'now'.loc():
248
+ d = now ;
249
+ break ;
250
+ case 'tomorrow'.loc():
251
+ d = now + (24*60*60*1000) ;
252
+ break;
253
+ }
254
+ if (d>0) return new Date(d) ;
255
+
256
+ for (var i=0; i<checkList.length; i++) {
257
+ var l=window[checkList[i]];
258
+ for (var j=0; j<l.length; j++) {
259
+ d=Date.getDateFromFormat(val,l[j]);
260
+ if (d==0) d = Date.getDateFromFormat(val,l[j] + ' H:m:s') ;
261
+ if (d==0) d = Date.getDateFromFormat(val,l[j] + ' h:m:s a') ;
262
+ if (d!=0) return new Date(d);
263
+ }
264
+ }
265
+ return null;
266
+ },
267
+
268
+ // ------------------------------------------------------------------
269
+ // Utility functions for parsing in getDateFromFormat()
270
+ // ------------------------------------------------------------------
271
+ _isInteger: function(val) {
272
+ var digits="1234567890";
273
+ for (var i=0; i < val.length; i++) {
274
+ if (digits.indexOf(val.charAt(i))==-1) { return false; }
275
+ }
276
+ return true;
277
+ },
278
+
279
+ _getInt: function(str,i,minlength,maxlength) {
280
+ for (var x=maxlength; x>=minlength; x--) {
281
+ var token=str.substring(i,i+x);
282
+ if (token.length < minlength) { return null; }
283
+ if (Date._isInteger(token)) { return token; }
284
+ }
285
+ return null;
286
+ }
287
+
288
+ }) ;
289
+
290
+ Object.extend(Date.prototype, {
291
+
292
+ // ------------------------------------------------------------------
293
+ // formatDate (date_object, format, naturalLanguage)
294
+ // Returns a date in the output format specified.
295
+ // The format string uses the same abbreviations as in getDateFromFormat()
296
+ //
297
+ // ------------------------------------------------------------------
298
+ format: function(format) {
299
+ format=format+"";
300
+ var date = this ;
301
+ var result="";
302
+ var i_format=0;
303
+ var c="";
304
+ var token="";
305
+ var y=date.getYear()+"";
306
+ var M=date.getMonth()+1;
307
+ var d=date.getDate();
308
+ var E=date.getDay();
309
+ var H=date.getHours();
310
+ var m=date.getMinutes();
311
+ var s=date.getSeconds();
312
+ var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
313
+ // Convert real date parts into formatted versions
314
+ var value=new Object();
315
+ if (y.length < 4) {y=""+(y-0+1900);}
316
+ value["y"]=""+y;
317
+ value["yyyy"]=y;
318
+ value["yy"]=y.substring(2,4);
319
+ value["M"]=M;
320
+ value["MM"]=LZ(M);
321
+ value["MMM"]=MONTH_NAMES[M-1];
322
+ value["NNN"]=MONTH_NAMES[M+11];
323
+ value["d"]=d;
324
+ value["dd"]=LZ(d);
325
+ value["E"]=DAY_NAMES[E+7];
326
+ value["EE"]=DAY_NAMES[E];
327
+ value["H"]=H;
328
+ value["HH"]=LZ(H);
329
+ if (H==0){value["h"]=12;}
330
+ else if (H>12){value["h"]=H-12;}
331
+ else {value["h"]=H;}
332
+ value["hh"]=LZ(value["h"]);
333
+ if (H>11){value["K"]=H-12;} else {value["K"]=H;}
334
+ value["k"]=H+1;
335
+ value["KK"]=LZ(value["K"]);
336
+ value["kk"]=LZ(value["k"]);
337
+ if (H > 11) { value["a"]="PM"; }
338
+ else { value["a"]="AM"; }
339
+ value["m"]=m;
340
+ value["mm"]=LZ(m);
341
+ value["s"]=s;
342
+ value["ss"]=LZ(s);
343
+ while (i_format < format.length) {
344
+ c=format.charAt(i_format);
345
+ token="";
346
+ while ((format.charAt(i_format)==c) && (i_format < format.length)) {
347
+ token += format.charAt(i_format++);
348
+ }
349
+ if (value[token] != null) { result=result + value[token]; }
350
+ else { result=result + token; }
351
+ }
352
+ return result;
353
+ },
354
+
355
+ utcFormat: function() { return (new Date(this.getTime() + (this.getTimezoneOffset() * 60 * 1000))).format('E NNN dd HH:mm:ss UTC yyyy'); }
356
+
357
+ }) ;
@@ -0,0 +1,39 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('foundation/object');
7
+
8
+ // Error is used to communicate errors throughout the app.
9
+ SC.Error = SC.Object.extend({
10
+ code: -1, // error code. Used to designate type.
11
+ description: '', // human readable dscriptions.
12
+ label: null // optionally set to human readable the name of the item with the error.
13
+ }) ;
14
+
15
+ // this will create a new instance of the receiver with the passed
16
+ // description, etc.
17
+ SC.Error.desc = function(description, label, code) {
18
+ var opts = { description: description } ;
19
+ if (label !== undefined) opts.label = label ;
20
+ if (code !== undefined) opts.code = code ;
21
+ return this.create(opts) ;
22
+ } ;
23
+
24
+ // returns an error object.
25
+ function $error(description, label, c) {
26
+ return SC.Error.desc(description,label, c);
27
+ } ;
28
+
29
+
30
+ // returns true if the return value is not false or an error.
31
+ function $ok(ret) {
32
+ return (ret !== false) && ($type(ret) != T_ERROR) ;
33
+ }
34
+
35
+
36
+ // STANDARD ERROR OBJECTS
37
+
38
+ // Used by objects that do not support multiple values.
39
+ SC.Error.HAS_MULTIPLE_VALUES = -100 ;
@@ -0,0 +1,153 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('Core') ;
7
+ require('foundation/object') ;
8
+
9
+ // An InputManager knows how to convert incoming keyboard events and convert
10
+ // them into actions on a responder. The default version should provide the
11
+ // correct behavior for most people. However, if you want some special
12
+ // behavior, you can always write your own.
13
+ //
14
+ // An instance of this input manager is created as a property of
15
+ // SC.Responder. To overide the inputManager used for all responders, replace
16
+ // this property with your own instance. To override the inputManager used
17
+ // only for one responder, set the inputManager property on your specific
18
+ // instance.
19
+ //
20
+ // Note that generally you do not want to write your own inputManager. They
21
+ // are tricky to get right. Instead, you should implement the various handler
22
+ // methods on the responder.
23
+ SC.InputManager = SC.Object.extend({
24
+
25
+ // The is the primary entry point for the inputManager. If you override
26
+ // the input manager, have this method process the key event and invoke
27
+ // methods on the responder.
28
+ interpretKeyEvents: function(event, responder)
29
+ {
30
+ var codes = this.codesForEvent(event) ;
31
+ var cmd = codes[0]; var chr = codes[1];
32
+ if (!cmd && !chr) return false ; //nothing to do.
33
+
34
+ // if this is a command key, try to do something about it.
35
+ if (cmd)
36
+ {
37
+ var methodName = SC.MODIFIED_COMMAND_MAP[cmd] || SC.BASE_COMMAND_MAP[cmd.split('_').last()];
38
+ if (methodName && responder.respondsTo(methodName))
39
+ {
40
+ // the responder has a method matching the keybinding... call it.
41
+ return responder[methodName]( event );
42
+ }
43
+ }
44
+ if (chr && responder.respondsTo('insertText'))
45
+ {
46
+ // if we haven't returned yet and there is plain text, then do an insert of the text.
47
+ return responder.insertText(chr);
48
+ }
49
+
50
+ return false ; //nothing to do.
51
+ },
52
+
53
+ // this will get a standardized command code for the event. It returns
54
+ // null if the event is plain text, not a command code.
55
+ codesForEvent: function(e) {
56
+ var code = e.keyCode ;
57
+ var ret = null ; var key = null ;
58
+ var modifiers = '' ;
59
+
60
+ // handle function keys.
61
+ if (code) {
62
+ ret = SC.FUNCTION_KEYS[code] ;
63
+ if (!ret && (e.altKey || e.ctrlKey)) ret = SC.PRINTABLE_KEYS[code] ;
64
+ if (ret) {
65
+ if (e.altKey) modifiers += 'alt_' ;
66
+ if (e.ctrlKey) modifiers += 'ctrl_' ;
67
+ if (e.shiftKey) modifiers += 'shift_' ;
68
+ }
69
+ }
70
+
71
+ // otherwise just go get the right key.
72
+ if (!ret) {
73
+ var code = e.charCode || e.keyCode ;
74
+ key = ret = String.fromCharCode(code) ;
75
+ var lowercase = ret.toLowerCase() ;
76
+ if (ret != lowercase) {
77
+ modifiers = 'shift_' ;
78
+ ret = lowercase ;
79
+ } else ret = null ;
80
+ }
81
+
82
+ if (ret) ret = modifiers + ret ;
83
+ return [ret, key] ;
84
+ }
85
+
86
+ });
87
+
88
+ SC.MODIFIED_COMMAND_MAP = {
89
+ 'ctrl_.': 'cancel',
90
+ 'shift_tab': 'insertBacktab',
91
+ 'shift_left': 'moveLeftAndModifySelection',
92
+ 'shift_right': 'moveRightAndModifySelection',
93
+ 'shift_up': 'moveUpAndModifySelection',
94
+ 'shift_down': 'moveDownAndModifySelection',
95
+ 'alt_left': 'moveLeftAndModifySelection',
96
+ 'alt_right': 'moveRightAndModifySelection',
97
+ 'alt_up': 'moveUpAndModifySelection',
98
+ 'alt_down': 'moveDownAndModifySelection',
99
+ 'ctrl_a': 'selectAll'
100
+ } ;
101
+
102
+ SC.BASE_COMMAND_MAP = {
103
+ 'escape': 'cancel',
104
+ 'backspace': 'deleteBackward',
105
+ 'delete': 'deleteForward',
106
+ 'return': 'insertNewline',
107
+ 'tab': 'insertTab',
108
+ 'left': 'moveLeft',
109
+ 'right': 'moveRight',
110
+ 'up': 'moveUp',
111
+ 'down': 'moveDown',
112
+ 'home': 'moveToBeginningOfDocument',
113
+ 'end': 'moveToEndOfDocument',
114
+ 'pagedown': 'pageDown',
115
+ 'pageup': 'pageUp'
116
+ } ;
117
+
118
+ SC.MODIFIER_KEYS = {
119
+ 16:'shift', 17:'ctrl', 18: 'alt'
120
+ };
121
+
122
+ SC.FUNCTION_KEYS = {
123
+ 8: 'backspace', 9: 'tab', 13: 'return', 19: 'pause', 27: 'escape',
124
+ 32: 'space', 33: 'pageup', 34: 'pagedown', 35: 'end', 36: 'home',
125
+ 37: 'left', 38: 'up', 39: 'right', 40: 'down', 44: 'printscreen',
126
+ 45: 'insert', 46: 'delete', 112: 'f1', 113: 'f2', 114: 'f3', 115: 'f4',
127
+ 116: 'f5', 117: 'f7', 119: 'f8', 120: 'f9', 121: 'f10', 122: 'f11',
128
+ 123: 'f12', 144: 'numlock', 145: 'scrolllock'
129
+ } ;
130
+
131
+ SC.PRINTABLE_KEYS = {
132
+ 48:"0", 49:"1", 50:"2", 51:"3", 52:"4", 53:"5", 54:"6", 55:"7", 56:"8",
133
+ 57:"9", 59:";", 61:"=", 65:"a", 66:"b", 67:"c", 68:"d", 69:"e", 70:"f",
134
+ 71:"g", 72:"h", 73:"i", 74:"j", 75:"k", 76:"l", 77:"m", 78:"n", 79:"o",
135
+ 80:"p", 81:"q", 82:"r", 83:"s", 84:"t", 85:"u", 86:"v", 87:"w", 88:"x",
136
+ 89:"y", 90:"z", 107:"+", 109:"-", 110:".", 188:",", 190:".", 191:"/",
137
+ 192:"`", 219:"[", 220:"\\", 221:"]", 222:"\""
138
+ } ;
139
+
140
+ // make reverse keycode lookup for using in unit tests...
141
+ SC.KEY_CODES = {};
142
+ for (var i=0, n=256; i < n; i++)
143
+ {
144
+ if (SC.MODIFIER_KEYS[i] !== undefined) {
145
+ SC.KEY_CODES[ SC.MODIFIER_KEYS[i] ] = i;
146
+ } else if (SC.FUNCTION_KEYS[i] !== undefined) {
147
+ SC.KEY_CODES[ SC.FUNCTION_KEYS[i] ] = i;
148
+ } else if (SC.PRINTABLE_KEYS[i] !== undefined) {
149
+ SC.KEY_CODES[ SC.PRINTABLE_KEYS[i] ] = i;
150
+ }
151
+ }
152
+
153
+