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.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +269 -0
- data/README.txt +67 -0
- data/Rakefile +4 -0
- data/app_generators/sproutcore/USAGE +5 -0
- data/app_generators/sproutcore/sproutcore_generator.rb +66 -0
- data/app_generators/sproutcore/templates/README +77 -0
- data/app_generators/sproutcore/templates/environment.yml +4 -0
- data/bin/sc-build +145 -0
- data/bin/sc-gen +24 -0
- data/bin/sc-server +63 -0
- data/bin/sproutcore +21 -0
- data/clients/sc_docs/controllers/docs.js +118 -0
- data/clients/sc_docs/core.js +19 -0
- data/clients/sc_docs/english.lproj/body.css +159 -0
- data/clients/sc_docs/english.lproj/body.rhtml +33 -0
- data/clients/sc_docs/english.lproj/controls.css +0 -0
- data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
- data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
- data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
- data/clients/sc_docs/english.lproj/images/indicator.gif +0 -0
- data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
- data/clients/sc_docs/english.lproj/no_docs.rhtml +7 -0
- data/clients/sc_docs/english.lproj/strings.js +14 -0
- data/clients/sc_docs/english.lproj/warning.rhtml +6 -0
- data/clients/sc_docs/fixtures/doc.js +11 -0
- data/clients/sc_docs/main.js +21 -0
- data/clients/sc_docs/models/doc.js +9 -0
- data/clients/sc_docs/tests/controllers/docs.rhtml +21 -0
- data/clients/sc_docs/tests/models/doc.rhtml +21 -0
- data/clients/sc_docs/tests/views/doc_frame.rhtml +21 -0
- data/clients/sc_docs/tests/views/doc_label_view.rhtml +21 -0
- data/clients/sc_docs/views/doc_frame.js +33 -0
- data/clients/sc_docs/views/doc_label.js +20 -0
- data/clients/sc_test_runner/controllers/runner.js +175 -0
- data/clients/sc_test_runner/core.js +19 -0
- data/clients/sc_test_runner/english.lproj/body.css +151 -0
- data/clients/sc_test_runner/english.lproj/body.rhtml +35 -0
- data/clients/sc_test_runner/english.lproj/controls.css +0 -0
- data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
- data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
- data/clients/sc_test_runner/english.lproj/images/gradients.png +0 -0
- data/clients/sc_test_runner/english.lproj/images/indicator.gif +0 -0
- data/clients/sc_test_runner/english.lproj/images/toolbar.png +0 -0
- data/clients/sc_test_runner/english.lproj/no_tests.rhtml +6 -0
- data/clients/sc_test_runner/english.lproj/strings.js +14 -0
- data/clients/sc_test_runner/english.lproj/warning.rhtml +6 -0
- data/clients/sc_test_runner/fixtures/test.js +12 -0
- data/clients/sc_test_runner/main.js +26 -0
- data/clients/sc_test_runner/models/test.js +11 -0
- data/clients/sc_test_runner/views/runner_frame.js +72 -0
- data/clients/sc_test_runner/views/test_label.js +20 -0
- data/config/hoe.rb +70 -0
- data/config/requirements.rb +17 -0
- data/environment.yml +9 -0
- data/frameworks/prototype/prototype.js +4186 -0
- data/frameworks/sproutcore/Core.js +378 -0
- data/frameworks/sproutcore/README +3 -0
- data/frameworks/sproutcore/controllers/array.js +236 -0
- data/frameworks/sproutcore/controllers/collection.js +305 -0
- data/frameworks/sproutcore/controllers/controller.js +323 -0
- data/frameworks/sproutcore/controllers/object.js +372 -0
- data/frameworks/sproutcore/drag/drag.js +549 -0
- data/frameworks/sproutcore/drag/drag_data_source.js +32 -0
- data/frameworks/sproutcore/drag/drag_source.js +64 -0
- data/frameworks/sproutcore/drag/drop_target.js +153 -0
- data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
- data/frameworks/sproutcore/english.lproj/buttons.css +589 -0
- data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
- data/frameworks/sproutcore/english.lproj/inline_text_editor.css +21 -0
- data/frameworks/sproutcore/english.lproj/menu.css +121 -0
- data/frameworks/sproutcore/english.lproj/panels/background-fat.jpg +0 -0
- data/frameworks/sproutcore/english.lproj/panels/background-thin.jpg +0 -0
- data/frameworks/sproutcore/english.lproj/panels/bottom-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/bottom-left-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/bottom-right-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/left-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/overlay.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/right-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/top-edge.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/top-left-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panels/top-right-corner.png +0 -0
- data/frameworks/sproutcore/english.lproj/panes.css +155 -0
- data/frameworks/sproutcore/english.lproj/picker.css +22 -0
- data/frameworks/sproutcore/english.lproj/strings.js +15 -0
- data/frameworks/sproutcore/english.lproj/tab.css +23 -0
- data/frameworks/sproutcore/english.lproj/tests.css +67 -0
- data/frameworks/sproutcore/english.lproj/theme.css +77 -0
- data/frameworks/sproutcore/foundation/animator.js +670 -0
- data/frameworks/sproutcore/foundation/application.js +199 -0
- data/frameworks/sproutcore/foundation/array.js +348 -0
- data/frameworks/sproutcore/foundation/benchmark.js +211 -0
- data/frameworks/sproutcore/foundation/binding.js +384 -0
- data/frameworks/sproutcore/foundation/date.js +357 -0
- data/frameworks/sproutcore/foundation/error.js +39 -0
- data/frameworks/sproutcore/foundation/input_manager.js +153 -0
- data/frameworks/sproutcore/foundation/json.js +296 -0
- data/frameworks/sproutcore/foundation/mock.js +42 -0
- data/frameworks/sproutcore/foundation/node_descriptor.js +56 -0
- data/frameworks/sproutcore/foundation/object.js +777 -0
- data/frameworks/sproutcore/foundation/observable.js +451 -0
- data/frameworks/sproutcore/foundation/page.js +63 -0
- data/frameworks/sproutcore/foundation/path_module.js +413 -0
- data/frameworks/sproutcore/foundation/responder.js +310 -0
- data/frameworks/sproutcore/foundation/routes.js +371 -0
- data/frameworks/sproutcore/foundation/run_loop.js +21 -0
- data/frameworks/sproutcore/foundation/server.js +491 -0
- data/frameworks/sproutcore/foundation/set.js +96 -0
- data/frameworks/sproutcore/foundation/string.js +149 -0
- data/frameworks/sproutcore/foundation/undo_manager.js +186 -0
- data/frameworks/sproutcore/foundation/unittest.js +622 -0
- data/frameworks/sproutcore/foundation/utils.js +61 -0
- data/frameworks/sproutcore/globals/panels.js +182 -0
- data/frameworks/sproutcore/globals/popups.js +60 -0
- data/frameworks/sproutcore/globals/window.js +381 -0
- data/frameworks/sproutcore/lib/index.rhtml +66 -0
- data/frameworks/sproutcore/models/collection.js +395 -0
- data/frameworks/sproutcore/models/record.js +622 -0
- data/frameworks/sproutcore/models/store.js +295 -0
- data/frameworks/sproutcore/panes/dialog.js +16 -0
- data/frameworks/sproutcore/panes/manager.js +164 -0
- data/frameworks/sproutcore/panes/menu.js +45 -0
- data/frameworks/sproutcore/panes/overlay.js +231 -0
- data/frameworks/sproutcore/panes/pane.js +90 -0
- data/frameworks/sproutcore/panes/panel.js +19 -0
- data/frameworks/sproutcore/panes/picker.js +45 -0
- data/frameworks/sproutcore/tests/controllers/array.rhtml +86 -0
- data/frameworks/sproutcore/tests/controllers/controller.rhtml +273 -0
- data/frameworks/sproutcore/tests/controllers/object.rhtml +327 -0
- data/frameworks/sproutcore/tests/foundation/application.rhtml +125 -0
- data/frameworks/sproutcore/tests/foundation/array.rhtml +221 -0
- data/frameworks/sproutcore/tests/foundation/object.rhtml +69 -0
- data/frameworks/sproutcore/tests/globals/window.rhtml +45 -0
- data/frameworks/sproutcore/tests/panes/pane.rhtml +88 -0
- data/frameworks/sproutcore/tests/views/collection.rhtml +137 -0
- data/frameworks/sproutcore/tests/views/popup_button.rhtml +115 -0
- data/frameworks/sproutcore/tests/views/text_field.rhtml +37 -0
- data/frameworks/sproutcore/validators/credit_card.js +92 -0
- data/frameworks/sproutcore/validators/date.js +36 -0
- data/frameworks/sproutcore/validators/email.js +29 -0
- data/frameworks/sproutcore/validators/not_empty.js +24 -0
- data/frameworks/sproutcore/validators/number.js +55 -0
- data/frameworks/sproutcore/validators/password.js +78 -0
- data/frameworks/sproutcore/validators/validator.js +304 -0
- data/frameworks/sproutcore/views/button.js +425 -0
- data/frameworks/sproutcore/views/checkbox_field.js +30 -0
- data/frameworks/sproutcore/views/collection.js +1521 -0
- data/frameworks/sproutcore/views/container.js +62 -0
- data/frameworks/sproutcore/views/error_explanation.js +45 -0
- data/frameworks/sproutcore/views/field.js +214 -0
- data/frameworks/sproutcore/views/filter_button.js +29 -0
- data/frameworks/sproutcore/views/form.js +591 -0
- data/frameworks/sproutcore/views/image.js +141 -0
- data/frameworks/sproutcore/views/inline_text_editor.js +96 -0
- data/frameworks/sproutcore/views/label.js +176 -0
- data/frameworks/sproutcore/views/menu_item.js +90 -0
- data/frameworks/sproutcore/views/pagination.js +54 -0
- data/frameworks/sproutcore/views/popup_button.js +86 -0
- data/frameworks/sproutcore/views/popup_menu.js +137 -0
- data/frameworks/sproutcore/views/progress.js +100 -0
- data/frameworks/sproutcore/views/radio_field.js +107 -0
- data/frameworks/sproutcore/views/radio_group.js +48 -0
- data/frameworks/sproutcore/views/segmented.js +80 -0
- data/frameworks/sproutcore/views/select_field.js +272 -0
- data/frameworks/sproutcore/views/spinner.js +11 -0
- data/frameworks/sproutcore/views/tab.js +126 -0
- data/frameworks/sproutcore/views/text_field.js +179 -0
- data/frameworks/sproutcore/views/textarea_field.js +14 -0
- data/frameworks/sproutcore/views/toolbar.js +29 -0
- data/frameworks/sproutcore/views/view.js +1389 -0
- data/frameworks/sproutcore/views/workspace.js +170 -0
- data/generators/client/README +3 -0
- data/generators/client/USAGE +12 -0
- data/generators/client/client_generator.rb +53 -0
- data/generators/client/templates/core.js +19 -0
- data/generators/client/templates/english.lproj/body.css +0 -0
- data/generators/client/templates/english.lproj/body.rhtml +3 -0
- data/generators/client/templates/english.lproj/controls.css +0 -0
- data/generators/client/templates/english.lproj/strings.js +14 -0
- data/generators/client/templates/main.js +37 -0
- data/generators/controller/USAGE +16 -0
- data/generators/controller/controller_generator.rb +51 -0
- data/generators/controller/templates/controller.js +21 -0
- data/generators/controller/templates/test.rhtml +21 -0
- data/generators/framework/README +7 -0
- data/generators/framework/USAGE +12 -0
- data/generators/framework/framework_generator.rb +53 -0
- data/generators/framework/templates/core.js +20 -0
- data/generators/framework/templates/english.lproj/body.css +0 -0
- data/generators/framework/templates/english.lproj/body.rhtml +3 -0
- data/generators/framework/templates/english.lproj/controls.css +0 -0
- data/generators/framework/templates/english.lproj/strings.js +14 -0
- data/generators/language/USAGE +16 -0
- data/generators/language/language_generator.rb +47 -0
- data/generators/language/templates/strings.js +10 -0
- data/generators/model/USAGE +24 -0
- data/generators/model/model_generator.rb +55 -0
- data/generators/model/templates/fixture.js +11 -0
- data/generators/model/templates/model.js +20 -0
- data/generators/model/templates/test.rhtml +21 -0
- data/generators/test/USAGE +16 -0
- data/generators/test/templates/test.rhtml +21 -0
- data/generators/test/test_generator.rb +47 -0
- data/generators/view/USAGE +16 -0
- data/generators/view/templates/test.rhtml +21 -0
- data/generators/view/templates/view.js +20 -0
- data/generators/view/view_generator.rb +51 -0
- data/jsdoc/README.txt +119 -0
- data/jsdoc/app/DocFile.js +137 -0
- data/jsdoc/app/DocTag.js +110 -0
- data/jsdoc/app/Doclet.js +63 -0
- data/jsdoc/app/Dumper.js +143 -0
- data/jsdoc/app/JsDoc.js +103 -0
- data/jsdoc/app/JsHilite.js +45 -0
- data/jsdoc/app/JsIO.js +163 -0
- data/jsdoc/app/JsParse.js +385 -0
- data/jsdoc/app/JsPlate.js +130 -0
- data/jsdoc/app/JsTestrun.js +129 -0
- data/jsdoc/app/JsToke.js +564 -0
- data/jsdoc/app/Symbol.js +298 -0
- data/jsdoc/app/Transformer.js +14 -0
- data/jsdoc/app/Util.js +97 -0
- data/jsdoc/app/js.jar +0 -0
- data/jsdoc/app/run.js +144 -0
- data/jsdoc/plugins/min.js +316 -0
- data/jsdoc/plugins/strip.js +20 -0
- data/jsdoc/templates/sproutcore/class.tmpl +438 -0
- data/jsdoc/templates/sproutcore/default.css +241 -0
- data/jsdoc/templates/sproutcore/index.html +13 -0
- data/jsdoc/templates/sproutcore/index.tmpl +21 -0
- data/jsdoc/templates/sproutcore/prototype.js +4186 -0
- data/jsdoc/templates/sproutcore/publish.js +236 -0
- data/jsdoc/templates/sproutcore/splash.html +7 -0
- data/lib/sproutcore/build_tools/html_builder.rb +88 -0
- data/lib/sproutcore/build_tools/resource_builder.rb +194 -0
- data/lib/sproutcore/build_tools.rb +44 -0
- data/lib/sproutcore/bundle.rb +517 -0
- data/lib/sproutcore/bundle_manifest.rb +397 -0
- data/lib/sproutcore/generator_helper.rb +170 -0
- data/lib/sproutcore/helpers/capture_helper.rb +42 -0
- data/lib/sproutcore/helpers/static_helper.rb +80 -0
- data/lib/sproutcore/helpers/tag_helper.rb +110 -0
- data/lib/sproutcore/helpers/text_helper.rb +336 -0
- data/lib/sproutcore/helpers.rb +3 -0
- data/lib/sproutcore/jsdoc.rb +40 -0
- data/lib/sproutcore/jsmin.rb +247 -0
- data/lib/sproutcore/library.rb +258 -0
- data/lib/sproutcore/merb/bundle_controller.rb +179 -0
- data/lib/sproutcore/merb/router.rb +43 -0
- data/lib/sproutcore/merb.rb +27 -0
- data/lib/sproutcore/version.rb +9 -0
- data/lib/sproutcore/view_helpers/button_views.rb +302 -0
- data/lib/sproutcore/view_helpers/core_views.rb +284 -0
- data/lib/sproutcore/view_helpers/form_views.rb +258 -0
- data/lib/sproutcore/view_helpers/menu_views.rb +94 -0
- data/lib/sproutcore/view_helpers.rb +628 -0
- data/lib/sproutcore.rb +30 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/sproutcore_spec.rb +11 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +17 -0
- 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,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
|
+
});
|