sproutcore 1.6.0.1-java → 1.7.1.beta-java
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/CHANGELOG +21 -0
 - data/Gemfile +5 -0
 - data/Rakefile +26 -13
 - data/VERSION.yml +2 -2
 - data/lib/Buildfile +43 -4
 - data/lib/buildtasks/build.rake +10 -0
 - data/lib/buildtasks/helpers/file_rule.rb +22 -0
 - data/lib/buildtasks/helpers/file_rule_list.rb +137 -0
 - data/lib/buildtasks/manifest.rake +133 -122
 - data/lib/frameworks/sproutcore/CHANGELOG.md +69 -2
 - data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +1 -0
 - data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +28 -22
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +9 -5
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +1 -1
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +18 -13
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +5 -3
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +2 -0
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +80 -0
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +84 -116
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +8 -5
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +157 -157
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +5 -3
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +6 -6
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +10 -7
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +106 -0
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +18 -0
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +71 -1
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/attribute_bindings_test.js +38 -0
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +47 -0
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +18 -18
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +42 -10
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +26 -1
 - data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
 - data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +15 -2
 - data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +108 -108
 - data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
 - data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -4
 - data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +2 -2
 - data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +26 -0
 - data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +7 -0
 - data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +1 -1
 - data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +4 -1
 - data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +6 -0
 - data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +26 -5
 - data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +97 -96
 - data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -3
 - data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +17 -4
 - data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +7 -7
 - data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +7 -5
 - data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +12 -3
 - data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +23 -14
 - data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +5 -1
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +28 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +235 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +363 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +250 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +92 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +25 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +33 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +76 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +50 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +143 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +258 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +1164 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +332 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +236 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +347 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +15 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +10 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +804 -0
 - data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +133 -0
 - data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +3 -3
 - data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +3 -1
 - data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +3 -3
 - data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +2 -1
 - data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +2 -1
 - data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +2 -4
 - data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +2 -4
 - data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +2 -4
 - data/lib/frameworks/sproutcore/frameworks/media/views/video.js +2 -2
 - data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +29 -3
 - data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
 - data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +1 -1
 - data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -1
 - data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +3 -3
 - data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -2
 - data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
 - data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
 - data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/segmented.css +1 -1
 - data/lib/gen/app/templates/apps/@target_name@/Buildfile +3 -5
 - data/lib/gen/app/templates/apps/@target_name@/resources/_theme.css +18 -0
 - data/lib/gen/project/templates/@filename@/Buildfile +2 -2
 - data/lib/sproutcore.rb +30 -5
 - data/lib/sproutcore/builders.rb +1 -0
 - data/lib/sproutcore/builders/chance_file.rb +9 -16
 - data/lib/sproutcore/builders/html.rb +2 -1
 - data/lib/sproutcore/builders/minify.rb +4 -35
 - data/lib/sproutcore/builders/module.rb +38 -1
 - data/lib/sproutcore/builders/split.rb +63 -0
 - data/lib/sproutcore/builders/strings.rb +7 -1
 - data/lib/sproutcore/helpers.rb +1 -1
 - data/lib/sproutcore/helpers/css_split.rb +190 -0
 - data/lib/sproutcore/helpers/entry_sorter.rb +2 -0
 - data/lib/sproutcore/helpers/minifier.rb +40 -16
 - data/lib/sproutcore/helpers/static_helper.rb +35 -17
 - data/lib/sproutcore/models/manifest.rb +26 -0
 - data/lib/sproutcore/models/target.rb +12 -1
 - data/lib/sproutcore/rack.rb +1 -0
 - data/lib/sproutcore/rack/proxy.rb +244 -225
 - data/lib/sproutcore/rack/restrict_ip.rb +67 -0
 - data/lib/sproutcore/rack/service.rb +8 -2
 - data/lib/sproutcore/tools.rb +102 -46
 - data/lib/sproutcore/tools/build.rb +91 -43
 - data/lib/sproutcore/tools/gen.rb +2 -3
 - data/lib/sproutcore/tools/manifest.rb +22 -16
 - data/lib/sproutcore/tools/server.rb +21 -0
 - data/spec/buildtasks/helpers/accept_list +22 -0
 - data/spec/buildtasks/helpers/accept_list.rb +128 -0
 - data/spec/buildtasks/helpers/list.json +11 -0
 - data/spec/buildtasks/manifest/prepare_build_tasks/chance_2x_spec.rb +1 -39
 - data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +0 -38
 - data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +4 -4
 - data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +2 -2
 - data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_indirect_spec.rb +7 -16
 - data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_spec.rb +7 -17
 - data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +11 -6
 - data/spec/fixtures/builder_tests/Buildfile +2 -1
 - data/spec/fixtures/builder_tests/apps/module_test/modules/required_module/core.js +0 -0
 - data/spec/lib/builders/module_spec.rb +1 -1
 - data/spec/spec_helper.rb +1 -0
 - data/sproutcore.gemspec +4 -9
 - data/vendor/chance/lib/chance.rb +25 -6
 - data/vendor/chance/lib/chance/factory.rb +45 -0
 - data/vendor/chance/lib/chance/instance.rb +173 -28
 - data/vendor/chance/lib/chance/instance/data_url.rb +0 -29
 - data/vendor/chance/lib/chance/instance/slicing.rb +57 -4
 - data/vendor/chance/lib/chance/instance/spriting.rb +112 -21
 - data/vendor/chance/lib/chance/parser.rb +80 -52
 - data/vendor/sproutcore/SCCompiler.jar +0 -0
 - data/vendor/sproutcore/lib/args4j-2.0.12.jar +0 -0
 - data/vendor/sproutcore/lib/yuicompressor-2.4.2.jar +0 -0
 - metadata +84 -25
 
| 
         @@ -22,37 +22,37 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       22 
22 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       23 
23 
     | 
    
         
             
              */
         
     | 
| 
       24 
24 
     | 
    
         
             
              browser.windows = browser.isWindows = !!/windows/.test(userAgent);
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       26 
26 
     | 
    
         
             
              /**
         
     | 
| 
       27 
27 
     | 
    
         
             
                @name SC.browser.isMac
         
     | 
| 
       28 
28 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       29 
29 
     | 
    
         
             
              */
         
     | 
| 
       30 
30 
     | 
    
         
             
              browser.mac = browser.isMac = !!/macintosh/.test(userAgent) || (/mac os x/.test(userAgent) && !/like mac os x/.test(userAgent));
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       32 
32 
     | 
    
         
             
              /**
         
     | 
| 
       33 
33 
     | 
    
         
             
                @name SC.browser.isiPhone
         
     | 
| 
       34 
34 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       35 
35 
     | 
    
         
             
              */
         
     | 
| 
       36 
36 
     | 
    
         
             
              browser.iPhone = browser.isiPhone = !!/iphone/.test(userAgent);
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       38 
38 
     | 
    
         
             
              /**
         
     | 
| 
       39 
39 
     | 
    
         
             
                @name SC.browser.isiPod
         
     | 
| 
       40 
40 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       41 
41 
     | 
    
         
             
              */
         
     | 
| 
       42 
42 
     | 
    
         
             
              browser.iPod = browser.isiPod = !!/ipod/.test(userAgent);
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
       44 
44 
     | 
    
         
             
              /**
         
     | 
| 
       45 
45 
     | 
    
         
             
                @name SC.browser.isiPad
         
     | 
| 
       46 
46 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       47 
47 
     | 
    
         
             
              */
         
     | 
| 
       48 
48 
     | 
    
         
             
              browser.iPad = browser.isiPad = !!/ipad/.test(userAgent);
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
       50 
50 
     | 
    
         
             
              /**
         
     | 
| 
       51 
51 
     | 
    
         
             
                @name SC.browser.isiOS
         
     | 
| 
       52 
52 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       53 
53 
     | 
    
         
             
              */
         
     | 
| 
       54 
54 
     | 
    
         
             
              browser.iOS = browser.isiOS = browser.iPhone || browser.iPod || browser.iPad;
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
       56 
56 
     | 
    
         
             
              /**
         
     | 
| 
       57 
57 
     | 
    
         
             
                @name SC.browser.isAndroid
         
     | 
| 
       58 
58 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -64,7 +64,7 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       64 
64 
     | 
    
         
             
                @type String
         
     | 
| 
       65 
65 
     | 
    
         
             
              */
         
     | 
| 
       66 
66 
     | 
    
         
             
              browser.opera = /opera/.test(userAgent) ? version : 0;
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
       68 
68 
     | 
    
         
             
              /**
         
     | 
| 
       69 
69 
     | 
    
         
             
                @name SC.browser.isOpera
         
     | 
| 
       70 
70 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -76,13 +76,13 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       76 
76 
     | 
    
         
             
                @type String
         
     | 
| 
       77 
77 
     | 
    
         
             
              */
         
     | 
| 
       78 
78 
     | 
    
         
             
              browser.msie = /msie/.test(userAgent) && !browser.opera ? version : 0;
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
       80 
80 
     | 
    
         
             
              /**
         
     | 
| 
       81 
81 
     | 
    
         
             
                @name SC.browser.isIE
         
     | 
| 
       82 
82 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       83 
83 
     | 
    
         
             
              */
         
     | 
| 
       84 
84 
     | 
    
         
             
              browser.isIE = !!browser.msie;
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
       86 
86 
     | 
    
         
             
              /**
         
     | 
| 
       87 
87 
     | 
    
         
             
                @name SC.browser.isIE8OrLower
         
     | 
| 
       88 
88 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -94,7 +94,7 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       94 
94 
     | 
    
         
             
                @type String
         
     | 
| 
       95 
95 
     | 
    
         
             
              */
         
     | 
| 
       96 
96 
     | 
    
         
             
              browser.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit|msie)/.test(userAgent) ? version : 0;
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
       98 
98 
     | 
    
         
             
              /**
         
     | 
| 
       99 
99 
     | 
    
         
             
                @name SC.browser.isMozilla
         
     | 
| 
       100 
100 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -106,7 +106,7 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       106 
106 
     | 
    
         
             
                @type String
         
     | 
| 
       107 
107 
     | 
    
         
             
              */
         
     | 
| 
       108 
108 
     | 
    
         
             
              browser.webkit = /webkit/.test(userAgent) ? webkitVersion : 0;
         
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
       110 
110 
     | 
    
         
             
              /**
         
     | 
| 
       111 
111 
     | 
    
         
             
                @name SC.browser.isWebkit
         
     | 
| 
       112 
112 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -118,7 +118,7 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       118 
118 
     | 
    
         
             
                @type String
         
     | 
| 
       119 
119 
     | 
    
         
             
              */
         
     | 
| 
       120 
120 
     | 
    
         
             
              browser.chrome = /chrome/.test(userAgent) ? version: 0;
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
       122 
122 
     | 
    
         
             
              /**
         
     | 
| 
       123 
123 
     | 
    
         
             
                @name SC.browser.isChrome
         
     | 
| 
       124 
124 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -129,8 +129,8 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       129 
129 
     | 
    
         
             
                @name SC.browser.mobileSafari
         
     | 
| 
       130 
130 
     | 
    
         
             
                @type String
         
     | 
| 
       131 
131 
     | 
    
         
             
              */
         
     | 
| 
       132 
     | 
    
         
            -
              browser.mobileSafari = /apple.*mobile 
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
      
 132 
     | 
    
         
            +
              browser.mobileSafari = /apple.*mobile/.test(userAgent) && browser.iOS ? webkitVersion : 0;
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
       134 
134 
     | 
    
         
             
              /**
         
     | 
| 
       135 
135 
     | 
    
         
             
                @name SC.browser.isMobileSafari
         
     | 
| 
       136 
136 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -142,7 +142,7 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       142 
142 
     | 
    
         
             
                @type String
         
     | 
| 
       143 
143 
     | 
    
         
             
              */
         
     | 
| 
       144 
144 
     | 
    
         
             
              browser.iPadSafari = browser.iPad && browser.isMobileSafari ? webkitVersion : 0;
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
       146 
146 
     | 
    
         
             
              /**
         
     | 
| 
       147 
147 
     | 
    
         
             
                @name SC.browser.isiPadSafari
         
     | 
| 
       148 
148 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -154,7 +154,7 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       154 
154 
     | 
    
         
             
                @type String
         
     | 
| 
       155 
155 
     | 
    
         
             
              */
         
     | 
| 
       156 
156 
     | 
    
         
             
              browser.iPhoneSafari = browser.iPhone && browser.isMobileSafari ? webkitVersion : 0;
         
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
       158 
158 
     | 
    
         
             
              /**
         
     | 
| 
       159 
159 
     | 
    
         
             
                @name SC.browser.isiPhoneSafari
         
     | 
| 
       160 
160 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -166,19 +166,25 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       166 
166 
     | 
    
         
             
                @type String
         
     | 
| 
       167 
167 
     | 
    
         
             
              */
         
     | 
| 
       168 
168 
     | 
    
         
             
              browser.iPodSafari = browser.iPod && browser.isMobileSafari ? webkitVersion : 0;
         
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
       170 
170 
     | 
    
         
             
              /**
         
     | 
| 
       171 
171 
     | 
    
         
             
                @name SC.browser.isiPodSafari
         
     | 
| 
       172 
172 
     | 
    
         
             
                @type Boolean
         
     | 
| 
       173 
173 
     | 
    
         
             
              */
         
     | 
| 
       174 
174 
     | 
    
         
             
              browser.isiPodSafari = !!browser.iPodSafari;
         
     | 
| 
       175 
175 
     | 
    
         | 
| 
      
 176 
     | 
    
         
            +
              /**
         
     | 
| 
      
 177 
     | 
    
         
            +
                @name SC.browser.isiOSHomeScreen
         
     | 
| 
      
 178 
     | 
    
         
            +
                @type Boolean
         
     | 
| 
      
 179 
     | 
    
         
            +
              */
         
     | 
| 
      
 180 
     | 
    
         
            +
              browser.isiOSHomeScreen = browser.isMobileSafari && !/apple.*mobile.*safari/.test(userAgent);
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
       176 
182 
     | 
    
         
             
              /**
         
     | 
| 
       177 
183 
     | 
    
         
             
                @name SC.browser.safari
         
     | 
| 
       178 
184 
     | 
    
         
             
                @type String
         
     | 
| 
       179 
185 
     | 
    
         
             
              */
         
     | 
| 
       180 
186 
     | 
    
         
             
              browser.safari = browser.webkit && !browser.chrome && !browser.iOS && !browser.android ? webkitVersion : 0;
         
     | 
| 
       181 
     | 
    
         
            -
             
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
       182 
188 
     | 
    
         
             
              /**
         
     | 
| 
       183 
189 
     | 
    
         
             
                @name SC.browser.isSafari
         
     | 
| 
       184 
190 
     | 
    
         
             
                @type Boolean
         
     | 
| 
         @@ -190,10 +196,10 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       190 
196 
     | 
    
         
             
                @type String
         
     | 
| 
       191 
197 
     | 
    
         
             
              */
         
     | 
| 
       192 
198 
     | 
    
         
             
              browser.language = language.split('-', 1)[0];
         
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
       194 
200 
     | 
    
         
             
              /**
         
     | 
| 
       195 
201 
     | 
    
         
             
                Possible values:
         
     | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
      
 202 
     | 
    
         
            +
             
     | 
| 
       197 
203 
     | 
    
         
             
                  - 'msie'
         
     | 
| 
       198 
204 
     | 
    
         
             
                  - 'mozilla'
         
     | 
| 
       199 
205 
     | 
    
         
             
                  - 'chrome'
         
     | 
| 
         @@ -212,14 +218,14 @@ SC._detectBrowser = function(userAgent, language) { 
     | 
|
| 
       212 
218 
     | 
    
         | 
| 
       213 
219 
     | 
    
         | 
| 
       214 
220 
     | 
    
         
             
            /** @class
         
     | 
| 
       215 
     | 
    
         
            -
             
     | 
| 
      
 221 
     | 
    
         
            +
             
     | 
| 
       216 
222 
     | 
    
         
             
              Contains information about the browser environment that SproutCore
         
     | 
| 
       217 
223 
     | 
    
         
             
              is running in. String properties, such as `SC.browser.webkit` or
         
     | 
| 
       218 
224 
     | 
    
         
             
              `SC.browser.msie`, will have a value that represents the browser build
         
     | 
| 
       219 
225 
     | 
    
         
             
              number if that browser is being used. Otherwise, they will have a
         
     | 
| 
       220 
226 
     | 
    
         
             
              falsey value. For convenience, Boolean counterparts for all of the
         
     | 
| 
       221 
227 
     | 
    
         
             
              versioned properties are provided.
         
     | 
| 
       222 
     | 
    
         
            -
             
     | 
| 
      
 228 
     | 
    
         
            +
             
     | 
| 
       223 
229 
     | 
    
         
             
              @since SproutCore 1.0
         
     | 
| 
       224 
230 
     | 
    
         
             
            */
         
     | 
| 
       225 
231 
     | 
    
         
             
            SC.browser = SC._detectBrowser();
         
     | 
| 
         @@ -77,7 +77,7 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport, 
     | 
|
| 
       77 
77 
     | 
    
         
             
                step.  You can use this orderBy property, however, for displaying smaller
         
     | 
| 
       78 
78 
     | 
    
         
             
                arrays of content.
         
     | 
| 
       79 
79 
     | 
    
         | 
| 
       80 
     | 
    
         
            -
                Note that you can only  
     | 
| 
      
 80 
     | 
    
         
            +
                Note that you can only use addObject() to insert new objects into an
         
     | 
| 
       81 
81 
     | 
    
         
             
                array that is ordered.  You cannot manually reorder or insert new objects
         
     | 
| 
       82 
82 
     | 
    
         
             
                into specific locations because the order is managed by this property
         
     | 
| 
       83 
83 
     | 
    
         
             
                instead.
         
     | 
| 
         @@ -403,15 +403,19 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport, 
     | 
|
| 
       403 
403 
     | 
    
         | 
| 
       404 
404 
     | 
    
         
             
              _scac_arrayContentWillChange: function(start, removed, added) {
         
     | 
| 
       405 
405 
     | 
    
         
             
                this.arrayContentWillChange(start, removed, added);
         
     | 
| 
       406 
     | 
    
         
            -
                 
     | 
| 
       407 
     | 
    
         
            -
             
     | 
| 
      
 406 
     | 
    
         
            +
                if (this._kvo_enumerable_property_chains) {
         
     | 
| 
      
 407 
     | 
    
         
            +
                  var removedObjects = this.slice(start, start+removed);
         
     | 
| 
      
 408 
     | 
    
         
            +
                  this.teardownEnumerablePropertyChains(removedObjects);
         
     | 
| 
      
 409 
     | 
    
         
            +
                }
         
     | 
| 
       408 
410 
     | 
    
         
             
              },
         
     | 
| 
       409 
411 
     | 
    
         | 
| 
       410 
412 
     | 
    
         
             
              _scac_arrayContentDidChange: function(start, removed, added) {
         
     | 
| 
       411 
413 
     | 
    
         
             
                this.arrayContentDidChange(start, removed, added);
         
     | 
| 
       412 
     | 
    
         
            -
                 
     | 
| 
      
 414 
     | 
    
         
            +
                if (this._kvo_enumerable_property_chains) {
         
     | 
| 
      
 415 
     | 
    
         
            +
                  var addedObjects = this.slice(start, start+added);
         
     | 
| 
      
 416 
     | 
    
         
            +
                  this.setupEnumerablePropertyChains(addedObjects);
         
     | 
| 
      
 417 
     | 
    
         
            +
                }
         
     | 
| 
       413 
418 
     | 
    
         
             
                this._scac_cached = NO;
         
     | 
| 
       414 
     | 
    
         
            -
                this.setupEnumerablePropertyChains(addedObjects);
         
     | 
| 
       415 
419 
     | 
    
         
             
                this.updateSelectionAfterContentChange();
         
     | 
| 
       416 
420 
     | 
    
         
             
              },
         
     | 
| 
       417 
421 
     | 
    
         | 
| 
         @@ -53,7 +53,7 @@ SC.Controller = SC.Object.extend( 
     | 
|
| 
       53 
53 
     | 
    
         | 
| 
       54 
54 
     | 
    
         
             
                if (!this.get('destroyContentOnReplace')) return;
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
                oldContent = this._oldContent 
     | 
| 
      
 56 
     | 
    
         
            +
                oldContent = this._oldContent;
         
     | 
| 
       57 
57 
     | 
    
         
             
                newContent = this.get('content');
         
     | 
| 
       58 
58 
     | 
    
         
             
                if (oldContent && newContent !== oldContent && oldContent.destroy) {
         
     | 
| 
       59 
59 
     | 
    
         
             
                  oldContent.destroy();
         
     | 
| 
         @@ -1,10 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 2 
     | 
    
         
            +
            // Project:   SproutCore - JavaScript Application Framework
         
     | 
| 
      
 3 
     | 
    
         
            +
            // Copyright: ©2006-2011 Strobe Inc. and contributors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            //            Portions ©2008-2011 Apple Inc. All rights reserved.
         
     | 
| 
      
 5 
     | 
    
         
            +
            // License:   Licensed under MIT license (see license.js)
         
     | 
| 
      
 6 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            sc_require('mixins/action_support');
         
     | 
| 
       1 
9 
     | 
    
         
             
            sc_require('views/template');
         
     | 
| 
       2 
10 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
            /**
         
     | 
| 
      
 12 
     | 
    
         
            +
              @class
         
     | 
| 
      
 13 
     | 
    
         
            +
              @extends SC.TemplateView
         
     | 
| 
      
 14 
     | 
    
         
            +
              @extends SC.ActionSupport
         
     | 
| 
      
 15 
     | 
    
         
            +
            */
         
     | 
| 
      
 16 
     | 
    
         
            +
            SC.Button = SC.TemplateView.extend(SC.ActionSupport,
         
     | 
| 
      
 17 
     | 
    
         
            +
            /** @scope SC.Button.prototype */{
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
       4 
19 
     | 
    
         
             
              classNames: ['sc-button'],
         
     | 
| 
       5 
20 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
              // Setting isActive to true will trigger the classBinding and add
         
     | 
| 
       7 
     | 
    
         
            -
              // 'is-active' to our layer's class names.
         
     | 
| 
       8 
21 
     | 
    
         
             
              mouseDown: function() {
         
     | 
| 
       9 
22 
     | 
    
         
             
                this.set('isActive', true);
         
     | 
| 
       10 
23 
     | 
    
         
             
                this._isMouseDown = YES;
         
     | 
| 
         @@ -25,18 +38,9 @@ SC.Button = SC.TemplateView.extend({ 
     | 
|
| 
       25 
38 
     | 
    
         
             
                return pane.get('rootResponder');
         
     | 
| 
       26 
39 
     | 
    
         
             
              }.property('pane').cacheable(),
         
     | 
| 
       27 
40 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
              // Setting isActive to false will remove 'is-active' from our
         
     | 
| 
       29 
     | 
    
         
            -
              // layer's class names.
         
     | 
| 
       30 
41 
     | 
    
         
             
              mouseUp: function(event) {
         
     | 
| 
       31 
42 
     | 
    
         
             
                if (this.get('isActive')) {
         
     | 
| 
       32 
     | 
    
         
            -
                   
     | 
| 
       33 
     | 
    
         
            -
                      target = this.get('target') || null,
         
     | 
| 
       34 
     | 
    
         
            -
                      rootResponder = this.get('rootResponder');
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                  if (action && rootResponder) {
         
     | 
| 
       37 
     | 
    
         
            -
                    rootResponder.sendAction(action, target, this, this.get('pane'), null, this);
         
     | 
| 
       38 
     | 
    
         
            -
                  }
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
      
 43 
     | 
    
         
            +
                  this.fireAction();
         
     | 
| 
       40 
44 
     | 
    
         
             
                  this.set('isActive', false);
         
     | 
| 
       41 
45 
     | 
    
         
             
                }
         
     | 
| 
       42 
46 
     | 
    
         | 
| 
         @@ -50,4 +54,5 @@ SC.Button = SC.TemplateView.extend({ 
     | 
|
| 
       50 
54 
     | 
    
         
             
              touchEnd: function(touch) {
         
     | 
| 
       51 
55 
     | 
    
         
             
                this.mouseUp(touch);
         
     | 
| 
       52 
56 
     | 
    
         
             
              }
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
       53 
58 
     | 
    
         
             
            });
         
     | 
| 
         @@ -166,16 +166,18 @@ Handlebars.registerHelper('bindAttr', function(options) { 
     | 
|
| 
       166 
166 
     | 
    
         
             
                    return;
         
     | 
| 
       167 
167 
     | 
    
         
             
                  }
         
     | 
| 
       168 
168 
     | 
    
         | 
| 
      
 169 
     | 
    
         
            +
                  var currentValue = elem.attr(attr);
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
       169 
171 
     | 
    
         
             
                  // A false result will remove the attribute from the element. This is
         
     | 
| 
       170 
172 
     | 
    
         
             
                  // to support attributes such as disabled, whose presence is meaningful.
         
     | 
| 
       171 
     | 
    
         
            -
                  if (result === NO) {
         
     | 
| 
      
 173 
     | 
    
         
            +
                  if (result === NO && currentValue) {
         
     | 
| 
       172 
174 
     | 
    
         
             
                    elem.removeAttr(attr);
         
     | 
| 
       173 
175 
     | 
    
         | 
| 
       174 
176 
     | 
    
         
             
                  // Likewise, a true result will set the attribute's name as the value.
         
     | 
| 
       175 
     | 
    
         
            -
                  } else if (result === YES) {
         
     | 
| 
      
 177 
     | 
    
         
            +
                  } else if (result === YES && currentValue !== attr) {
         
     | 
| 
       176 
178 
     | 
    
         
             
                    elem.attr(attr, attr);
         
     | 
| 
       177 
179 
     | 
    
         | 
| 
       178 
     | 
    
         
            -
                  } else {
         
     | 
| 
      
 180 
     | 
    
         
            +
                  } else if (currentValue !== result) {
         
     | 
| 
       179 
181 
     | 
    
         
             
                    elem.attr(attr, result);
         
     | 
| 
       180 
182 
     | 
    
         
             
                  }
         
     | 
| 
       181 
183 
     | 
    
         
             
                };
         
     | 
| 
         @@ -15,6 +15,8 @@ Handlebars.registerHelper('collection', function(path, options) { 
     | 
|
| 
       15 
15 
     | 
    
         
             
              // @if (debug)
         
     | 
| 
       16 
16 
     | 
    
         
             
              if (!collectionClass) {
         
     | 
| 
       17 
17 
     | 
    
         
             
                throw "%@ #collection: Could not find %@".fmt(data.view, path);
         
     | 
| 
      
 18 
     | 
    
         
            +
              } else if (!SC.kindOf(collectionClass, SC.TemplateCollectionView)) {
         
     | 
| 
      
 19 
     | 
    
         
            +
                throw "You must use a subclass of SC.TemplateCollectionView when using the #collection Handlebars helper";
         
     | 
| 
       18 
20 
     | 
    
         
             
              }
         
     | 
| 
       19 
21 
     | 
    
         
             
              // @endif
         
     | 
| 
       20 
22 
     | 
    
         | 
| 
         @@ -0,0 +1,80 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 2 
     | 
    
         
            +
            // Project:   SproutCore - JavaScript Application Framework
         
     | 
| 
      
 3 
     | 
    
         
            +
            // Copyright: ©2006-2011 Strobe Inc. and contributors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            //            Portions ©2008-2011 Apple Inc. All rights reserved.
         
     | 
| 
      
 5 
     | 
    
         
            +
            // License:   Licensed under MIT license (see license.js)
         
     | 
| 
      
 6 
     | 
    
         
            +
            // ==========================================================================
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            /**
         
     | 
| 
      
 9 
     | 
    
         
            +
              @class
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              Implements basic target and action support for views.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              @author Erich Ocean
         
     | 
| 
      
 14 
     | 
    
         
            +
              @author Colin Campbell (colin@sproutcore.com)
         
     | 
| 
      
 15 
     | 
    
         
            +
              @since SproutCore 1.7
         
     | 
| 
      
 16 
     | 
    
         
            +
            */
         
     | 
| 
      
 17 
     | 
    
         
            +
            SC.ActionSupport =
         
     | 
| 
      
 18 
     | 
    
         
            +
            /** @scope SC.ActionSupport.prototype */ {
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              /**
         
     | 
| 
      
 21 
     | 
    
         
            +
                The target object to invoke the action on when fireAction() is called.
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                If you set this target, the action will be called on the target object
         
     | 
| 
      
 24 
     | 
    
         
            +
                directly when fireAction() is called. If you leave this property set to
         
     | 
| 
      
 25 
     | 
    
         
            +
                null, then the responder chain will be searched for a view that implements
         
     | 
| 
      
 26 
     | 
    
         
            +
                the action.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                @type Object
         
     | 
| 
      
 29 
     | 
    
         
            +
                @default null
         
     | 
| 
      
 30 
     | 
    
         
            +
              */
         
     | 
| 
      
 31 
     | 
    
         
            +
              target: null,
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              /**
         
     | 
| 
      
 34 
     | 
    
         
            +
                The name of the action you want triggered when fireAction() is called.
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                This property is used in conjunction with the target property to execute
         
     | 
| 
      
 37 
     | 
    
         
            +
                a method when fireAction() is called.
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                If you do not set a target, then calling fireAction() will cause the
         
     | 
| 
      
 40 
     | 
    
         
            +
                responder chain to search for a view that implements the action you name
         
     | 
| 
      
 41 
     | 
    
         
            +
                here.  If you set a target, then fireAction() will try to call the
         
     | 
| 
      
 42 
     | 
    
         
            +
                method on the target itself.
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                @type String
         
     | 
| 
      
 45 
     | 
    
         
            +
                @default null
         
     | 
| 
      
 46 
     | 
    
         
            +
              */
         
     | 
| 
      
 47 
     | 
    
         
            +
              action: null,
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              /**
         
     | 
| 
      
 50 
     | 
    
         
            +
                Will be sent along with the action to provide the context of the action.
         
     | 
| 
      
 51 
     | 
    
         
            +
                This is an easy way to include information along with the action.
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                @type Object
         
     | 
| 
      
 54 
     | 
    
         
            +
                @default null
         
     | 
| 
      
 55 
     | 
    
         
            +
              */
         
     | 
| 
      
 56 
     | 
    
         
            +
              actionContext: null,
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
               /**
         
     | 
| 
      
 59 
     | 
    
         
            +
                 Perform the action. If an action paramter is not provided, then
         
     | 
| 
      
 60 
     | 
    
         
            +
                 the action defaults to the `action` property.
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                 @param {String} [action] The action to fire.
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                 @returns {Boolean} true if successful
         
     | 
| 
      
 65 
     | 
    
         
            +
                 @returns {Boolean} false otherwise
         
     | 
| 
      
 66 
     | 
    
         
            +
              */
         
     | 
| 
      
 67 
     | 
    
         
            +
              fireAction: function(action) {
         
     | 
| 
      
 68 
     | 
    
         
            +
                var target = this.get('target') || null,
         
     | 
| 
      
 69 
     | 
    
         
            +
                    rootResponder = this.getPath('pane.rootResponder');
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                if (action === undefined) { action = this.get('action'); }
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                if (action && rootResponder) {
         
     | 
| 
      
 74 
     | 
    
         
            +
                  return rootResponder.sendAction(action, target, this, this.get('pane'), this.get('actionContext'), this);
         
     | 
| 
      
 75 
     | 
    
         
            +
                }
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                return false;
         
     | 
| 
      
 78 
     | 
    
         
            +
              }
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            };
         
     | 
| 
         @@ -7,60 +7,19 @@ 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            sc_require('views/template');
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
            /** 
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
              classNames: ['sc-text-field'],
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
              /**
         
     | 
| 
       18 
     | 
    
         
            -
                If set to `YES` uses textarea tag instead of input to
         
     | 
| 
       19 
     | 
    
         
            -
                accommodate multi-line strings.
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                @type Boolean
         
     | 
| 
       22 
     | 
    
         
            -
                @default NO
         
     | 
| 
       23 
     | 
    
         
            -
              */
         
     | 
| 
       24 
     | 
    
         
            -
              isMultiline: NO,
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
              // we can't use bindAttr because of a race condition:
         
     | 
| 
       27 
     | 
    
         
            -
              //
         
     | 
| 
       28 
     | 
    
         
            -
              // when `value` is set, the bindAttr observer immediately calls
         
     | 
| 
       29 
     | 
    
         
            -
              // `get` in order to persist it to the DOM, but because we made
         
     | 
| 
       30 
     | 
    
         
            -
              // the `value` property idempotent, when it gets called by
         
     | 
| 
       31 
     | 
    
         
            -
              // bindAttr, it fetches the not-yet-updated value from the DOM
         
     | 
| 
       32 
     | 
    
         
            -
              // and returns it.
         
     | 
| 
       33 
     | 
    
         
            -
              //
         
     | 
| 
       34 
     | 
    
         
            -
              // In short, because we need to be able to catch changes to the
         
     | 
| 
       35 
     | 
    
         
            -
              // DOM made directly, we cannot also rely on bindAttr to update
         
     | 
| 
       36 
     | 
    
         
            -
              // the property: a chicken-and-egg problem.
         
     | 
| 
       37 
     | 
    
         
            -
              template: function(){
         
     | 
| 
       38 
     | 
    
         
            -
                return SC.Handlebars.compile(this.get('isMultiline') ? '<textarea></textarea>' : '<input type="text">');
         
     | 
| 
       39 
     | 
    
         
            -
              }.property('isMultiline').cacheable(),
         
     | 
| 
      
 10 
     | 
    
         
            +
            /**
         
     | 
| 
      
 11 
     | 
    
         
            +
              @class
         
     | 
| 
      
 12 
     | 
    
         
            +
            */
         
     | 
| 
      
 13 
     | 
    
         
            +
            SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{
         
     | 
| 
       40 
14 
     | 
    
         | 
| 
       41 
15 
     | 
    
         
             
              $input: function() {
         
     | 
| 
       42 
     | 
    
         
            -
                 
     | 
| 
       43 
     | 
    
         
            -
                return this.$(tagName);
         
     | 
| 
      
 16 
     | 
    
         
            +
                return this.$('input');
         
     | 
| 
       44 
17 
     | 
    
         
             
              },
         
     | 
| 
       45 
18 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
               
     | 
| 
       47 
     | 
    
         
            -
                 
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                input.val(this._value);
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                if (SC.browser.msie) {
         
     | 
| 
       53 
     | 
    
         
            -
                  SC.Event.add(input, 'focusin', this, this.focusIn);
         
     | 
| 
       54 
     | 
    
         
            -
                  SC.Event.add(input, 'focusout', this, this.focusOut);
         
     | 
| 
       55 
     | 
    
         
            -
                } else {
         
     | 
| 
       56 
     | 
    
         
            -
                  SC.Event.add(input, 'focus', this, this.focusIn);
         
     | 
| 
       57 
     | 
    
         
            -
                  SC.Event.add(input, 'blur', this, this.focusOut);
         
     | 
| 
       58 
     | 
    
         
            -
                }
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                input.bind('change', function() {
         
     | 
| 
       61 
     | 
    
         
            -
                  self.domValueDidChange(SC.$(this));
         
     | 
| 
       62 
     | 
    
         
            -
                });
         
     | 
| 
       63 
     | 
    
         
            -
              },
         
     | 
| 
      
 19 
     | 
    
         
            +
              /** @private
         
     | 
| 
      
 20 
     | 
    
         
            +
                Used internally to store value because the layer may not exist
         
     | 
| 
      
 21 
     | 
    
         
            +
              */
         
     | 
| 
      
 22 
     | 
    
         
            +
              _value: null,
         
     | 
| 
       64 
23 
     | 
    
         | 
| 
       65 
24 
     | 
    
         
             
              /**
         
     | 
| 
       66 
25 
     | 
    
         
             
                The problem this property is trying to solve is twofold:
         
     | 
| 
         @@ -77,79 +36,18 @@ SC.TextField = SC.TemplateView.extend( 
     | 
|
| 
       77 
36 
     | 
    
         
             
                In order to achieve (1), we need to store a local cache of the
         
     | 
| 
       78 
37 
     | 
    
         
             
                value, so that SproutCore can set the proper value as soon as
         
     | 
| 
       79 
38 
     | 
    
         
             
                the underlying DOM element is created.
         
     | 
| 
       80 
     | 
    
         
            -
              */
         
     | 
| 
       81 
     | 
    
         
            -
              value: function(key, value) {
         
     | 
| 
       82 
     | 
    
         
            -
                var input = this.$input();
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
                if (value !== undefined) {
         
     | 
| 
       85 
     | 
    
         
            -
                  // We don't want to unnecessarily set the value.
         
     | 
| 
       86 
     | 
    
         
            -
                  // Doing that could cause the selection to be lost.
         
     | 
| 
       87 
     | 
    
         
            -
                  if (this._value !== value || input.val() !== value) {
         
     | 
| 
       88 
     | 
    
         
            -
                    this._value = value;
         
     | 
| 
       89 
     | 
    
         
            -
                    input.val(value);
         
     | 
| 
       90 
     | 
    
         
            -
                  }
         
     | 
| 
       91 
     | 
    
         
            -
                } else if (input.length) {
         
     | 
| 
       92 
     | 
    
         
            -
                  this._value = value = input.val();
         
     | 
| 
       93 
     | 
    
         
            -
                } else {
         
     | 
| 
       94 
     | 
    
         
            -
                  value = this._value;
         
     | 
| 
       95 
     | 
    
         
            -
                }
         
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
                return value;
         
     | 
| 
       98 
     | 
    
         
            -
              }.property().idempotent(),
         
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
              domValueDidChange: function(jquery) {
         
     | 
| 
       101 
     | 
    
         
            -
                this.set('value', jquery.val());
         
     | 
| 
       102 
     | 
    
         
            -
              },
         
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
              focusIn: function(event) {
         
     | 
| 
       105 
     | 
    
         
            -
                this.becomeFirstResponder();
         
     | 
| 
       106 
     | 
    
         
            -
                this.tryToPerform('focus', event);
         
     | 
| 
       107 
     | 
    
         
            -
              },
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
              focusOut: function(event) {
         
     | 
| 
       110 
     | 
    
         
            -
                this.resignFirstResponder();
         
     | 
| 
       111 
     | 
    
         
            -
                this.tryToPerform('blur', event);
         
     | 
| 
       112 
     | 
    
         
            -
              },
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
              willLoseFirstResponder: function() {
         
     | 
| 
       115 
     | 
    
         
            -
                this.notifyPropertyChange('value');
         
     | 
| 
       116 
     | 
    
         
            -
              },
         
     | 
| 
       117 
39 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
              keyUp: function(evt) {
         
     | 
| 
       119 
     | 
    
         
            -
                this.domValueDidChange(this.$input());
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
                if (evt.keyCode === SC.Event.KEY_RETURN) {
         
     | 
| 
       122 
     | 
    
         
            -
                  return this.tryToPerform('insertNewline', evt);
         
     | 
| 
       123 
     | 
    
         
            -
                } else if (evt.keyCode === SC.Event.KEY_ESC) {
         
     | 
| 
       124 
     | 
    
         
            -
                  return this.tryToPerform('cancel', evt);
         
     | 
| 
       125 
     | 
    
         
            -
                }
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                return true;
         
     | 
| 
       128 
     | 
    
         
            -
              }
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
            });
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
            SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
              /** @private
         
     | 
| 
       135 
     | 
    
         
            -
                Used internally to store value because the layer may not exist
         
     | 
| 
       136 
     | 
    
         
            -
              */
         
     | 
| 
       137 
     | 
    
         
            -
              _value: null,
         
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       139 
     | 
    
         
            -
              /**
         
     | 
| 
       140 
40 
     | 
    
         
             
                @type String
         
     | 
| 
       141 
     | 
    
         
            -
                @default 
     | 
| 
      
 41 
     | 
    
         
            +
                @default  null
         
     | 
| 
       142 
42 
     | 
    
         
             
              */
         
     | 
| 
       143 
43 
     | 
    
         
             
              value: function(key, value) {
         
     | 
| 
       144 
     | 
    
         
            -
                var input = this.$( 
     | 
| 
      
 44 
     | 
    
         
            +
                var input = this.$input();
         
     | 
| 
       145 
45 
     | 
    
         | 
| 
       146 
46 
     | 
    
         
             
                if (value !== undefined) {
         
     | 
| 
       147 
47 
     | 
    
         
             
                  // We don't want to unnecessarily set the value.
         
     | 
| 
       148 
48 
     | 
    
         
             
                  // Doing that could cause the selection to be lost.
         
     | 
| 
       149 
     | 
    
         
            -
                  if (this._value !== value  
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
                    input.val(value);
         
     | 
| 
       152 
     | 
    
         
            -
                  }
         
     | 
| 
      
 49 
     | 
    
         
            +
                  if (this._value !== value) { this._value = value; }
         
     | 
| 
      
 50 
     | 
    
         
            +
                  if (input.val() !== value) { input.val(value); }
         
     | 
| 
       153 
51 
     | 
    
         
             
                } else {
         
     | 
| 
       154 
52 
     | 
    
         
             
                  if (input.length > 0) {
         
     | 
| 
       155 
53 
     | 
    
         
             
                    value = this._value = input.val();
         
     | 
| 
         @@ -162,7 +60,8 @@ SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{ 
     | 
|
| 
       162 
60 
     | 
    
         
             
              }.property().idempotent(),
         
     | 
| 
       163 
61 
     | 
    
         | 
| 
       164 
62 
     | 
    
         
             
              didCreateLayer: function() {
         
     | 
| 
       165 
     | 
    
         
            -
                var input = this.$( 
     | 
| 
      
 63 
     | 
    
         
            +
                var input = this.$input(),
         
     | 
| 
      
 64 
     | 
    
         
            +
                    self = this;
         
     | 
| 
       166 
65 
     | 
    
         | 
| 
       167 
66 
     | 
    
         
             
                input.val(this._value);
         
     | 
| 
       168 
67 
     | 
    
         | 
| 
         @@ -175,6 +74,18 @@ SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{ 
     | 
|
| 
       175 
74 
     | 
    
         
             
                }
         
     | 
| 
       176 
75 
     | 
    
         
             
              },
         
     | 
| 
       177 
76 
     | 
    
         | 
| 
      
 77 
     | 
    
         
            +
              willDestroyLayerMixin: function() {
         
     | 
| 
      
 78 
     | 
    
         
            +
                var input = this.$input();
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                if (SC.browser.msie) {
         
     | 
| 
      
 81 
     | 
    
         
            +
                  SC.Event.remove(input, 'focusin', this, this.focusIn);
         
     | 
| 
      
 82 
     | 
    
         
            +
                  SC.Event.remove(input, 'focusout', this, this.focusOut);
         
     | 
| 
      
 83 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 84 
     | 
    
         
            +
                  SC.Event.remove(input, 'focus', this, this.focusIn);
         
     | 
| 
      
 85 
     | 
    
         
            +
                  SC.Event.remove(input, 'blur', this, this.focusOut);
         
     | 
| 
      
 86 
     | 
    
         
            +
                }
         
     | 
| 
      
 87 
     | 
    
         
            +
              },
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
       178 
89 
     | 
    
         
             
              focusIn: function(event) {
         
     | 
| 
       179 
90 
     | 
    
         
             
                this.becomeFirstResponder();
         
     | 
| 
       180 
91 
     | 
    
         
             
                this.tryToPerform('focus', event);
         
     | 
| 
         @@ -185,6 +96,16 @@ SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{ 
     | 
|
| 
       185 
96 
     | 
    
         
             
                this.tryToPerform('blur', event);
         
     | 
| 
       186 
97 
     | 
    
         
             
              },
         
     | 
| 
       187 
98 
     | 
    
         | 
| 
      
 99 
     | 
    
         
            +
              touchStart: function(evt) {
         
     | 
| 
      
 100 
     | 
    
         
            +
                evt.allowDefault();
         
     | 
| 
      
 101 
     | 
    
         
            +
                return YES;
         
     | 
| 
      
 102 
     | 
    
         
            +
              },
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
              touchEnd: function(evt) {
         
     | 
| 
      
 105 
     | 
    
         
            +
                evt.allowDefault();
         
     | 
| 
      
 106 
     | 
    
         
            +
                return YES;
         
     | 
| 
      
 107 
     | 
    
         
            +
              },
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
       188 
109 
     | 
    
         
             
              /** @private
         
     | 
| 
       189 
110 
     | 
    
         
             
                Make sure our input value is synced with any bindings.
         
     | 
| 
       190 
111 
     | 
    
         
             
                In some cases, such as auto-filling, a value can get
         
     | 
| 
         @@ -196,7 +117,13 @@ SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{ 
     | 
|
| 
       196 
117 
     | 
    
         
             
                this.notifyPropertyChange('value');
         
     | 
| 
       197 
118 
     | 
    
         
             
              },
         
     | 
| 
       198 
119 
     | 
    
         | 
| 
      
 120 
     | 
    
         
            +
              domValueDidChange: function(jquery) {
         
     | 
| 
      
 121 
     | 
    
         
            +
                this.set('value', jquery.val());
         
     | 
| 
      
 122 
     | 
    
         
            +
              },
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
       199 
124 
     | 
    
         
             
              keyUp: function(event) {
         
     | 
| 
      
 125 
     | 
    
         
            +
                this.domValueDidChange(this.$input());
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
       200 
127 
     | 
    
         
             
                if (event.keyCode === SC.Event.KEY_RETURN) {
         
     | 
| 
       201 
128 
     | 
    
         
             
                  return this.tryToPerform('insertNewline', event);
         
     | 
| 
       202 
129 
     | 
    
         
             
                } else if (event.keyCode === SC.Event.KEY_ESC) {
         
     | 
| 
         @@ -205,3 +132,44 @@ SC.TextFieldSupport = /** @scope SC.TextFieldSupport */{ 
     | 
|
| 
       205 
132 
     | 
    
         
             
              }
         
     | 
| 
       206 
133 
     | 
    
         
             
            };
         
     | 
| 
       207 
134 
     | 
    
         | 
| 
      
 135 
     | 
    
         
            +
            /**
         
     | 
| 
      
 136 
     | 
    
         
            +
              @class
         
     | 
| 
      
 137 
     | 
    
         
            +
              @extends SC.TemplateView
         
     | 
| 
      
 138 
     | 
    
         
            +
              @extends SC.TextFieldSupport
         
     | 
| 
      
 139 
     | 
    
         
            +
            */
         
     | 
| 
      
 140 
     | 
    
         
            +
            SC.TextField = SC.TemplateView.extend(SC.TextFieldSupport,
         
     | 
| 
      
 141 
     | 
    
         
            +
            /** @scope SC.TextField.prototype */ {
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
              classNames: ['sc-text-field'],
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
              /**
         
     | 
| 
      
 146 
     | 
    
         
            +
                If set to `YES` uses textarea tag instead of input to
         
     | 
| 
      
 147 
     | 
    
         
            +
                accommodate multi-line strings.
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                @type Boolean
         
     | 
| 
      
 150 
     | 
    
         
            +
                @default NO
         
     | 
| 
      
 151 
     | 
    
         
            +
              */
         
     | 
| 
      
 152 
     | 
    
         
            +
              isMultiline: NO,
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
              // we can't use bindAttr because of a race condition:
         
     | 
| 
      
 155 
     | 
    
         
            +
              //
         
     | 
| 
      
 156 
     | 
    
         
            +
              // when `value` is set, the bindAttr observer immediately calls
         
     | 
| 
      
 157 
     | 
    
         
            +
              // `get` in order to persist it to the DOM, but because we made
         
     | 
| 
      
 158 
     | 
    
         
            +
              // the `value` property idempotent, when it gets called by
         
     | 
| 
      
 159 
     | 
    
         
            +
              // bindAttr, it fetches the not-yet-updated value from the DOM
         
     | 
| 
      
 160 
     | 
    
         
            +
              // and returns it.
         
     | 
| 
      
 161 
     | 
    
         
            +
              //
         
     | 
| 
      
 162 
     | 
    
         
            +
              // In short, because we need to be able to catch changes to the
         
     | 
| 
      
 163 
     | 
    
         
            +
              // DOM made directly, we cannot also rely on bindAttr to update
         
     | 
| 
      
 164 
     | 
    
         
            +
              // the property: a chicken-and-egg problem.
         
     | 
| 
      
 165 
     | 
    
         
            +
              template: function(){
         
     | 
| 
      
 166 
     | 
    
         
            +
                return SC.Handlebars.compile(this.get('isMultiline') ? '<textarea></textarea>' : '<input type="text">');
         
     | 
| 
      
 167 
     | 
    
         
            +
              }.property('isMultiline').cacheable(),
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
              $input: function() {
         
     | 
| 
      
 170 
     | 
    
         
            +
                var tagName = this.get('isMultiline') ? 'textarea' : 'input';
         
     | 
| 
      
 171 
     | 
    
         
            +
                return this.$(tagName);
         
     | 
| 
      
 172 
     | 
    
         
            +
              }
         
     | 
| 
      
 173 
     | 
    
         
            +
             
     | 
| 
      
 174 
     | 
    
         
            +
            });
         
     | 
| 
      
 175 
     | 
    
         
            +
             
     |