ember-source 1.11.0.beta.1 → 1.11.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

@@ -5,7 +5,7 @@
5
5
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
6
  * @license Licensed under MIT license
7
7
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- * @version 1.11.0-beta.1
8
+ * @version 1.11.0-beta.2
9
9
  */
10
10
 
11
11
  (function() {
@@ -1489,6 +1489,8 @@ enifed('container/registry', ['exports', 'ember-metal/core', 'ember-metal/dictio
1489
1489
 
1490
1490
  var VALID_FULL_NAME_REGEXP = /^[^:]+.+:[^:]+$/;
1491
1491
 
1492
+ var instanceInitializersFeatureEnabled;
1493
+
1492
1494
  /**
1493
1495
  A lightweight registry used to store factory and option information keyed
1494
1496
  by type.
@@ -1656,7 +1658,7 @@ enifed('container/registry', ['exports', 'ember-metal/core', 'ember-metal/dictio
1656
1658
  lookup: function(fullName, options) {
1657
1659
  Ember['default'].assert('Create a container on the registry (with `registry.container()`) before calling `lookup`.', this._defaultContainer);
1658
1660
 
1659
- if (Ember['default'].FEATURES.isEnabled('ember-application-instance-initializers')) {
1661
+ if (instanceInitializersFeatureEnabled) {
1660
1662
  Ember['default'].deprecate('`lookup` was called on a Registry. The `initializer` API no longer receives a container, and you should use an `instanceInitializer` to look up objects from the container.', { url: "http://emberjs.com/guides/deprecations#toc_deprecate-access-to-instances-in-initializers" });
1661
1663
  }
1662
1664
 
@@ -1666,7 +1668,7 @@ enifed('container/registry', ['exports', 'ember-metal/core', 'ember-metal/dictio
1666
1668
  lookupFactory: function(fullName) {
1667
1669
  Ember['default'].assert('Create a container on the registry (with `registry.container()`) before calling `lookupFactory`.', this._defaultContainer);
1668
1670
 
1669
- if (Ember['default'].FEATURES.isEnabled('ember-application-instance-initializers')) {
1671
+ if (instanceInitializersFeatureEnabled) {
1670
1672
  Ember['default'].deprecate('`lookupFactory` was called on a Registry. The `initializer` API no longer receives a container, and you should use an `instanceInitializer` to look up objects from the container.', { url: "http://emberjs.com/guides/deprecations#toc_deprecate-access-to-instances-in-initializers" });
1671
1673
  }
1672
1674
 
@@ -2789,51 +2791,65 @@ enifed("dom-helper",
2789
2791
  };
2790
2792
 
2791
2793
  prototype.createMorph = function(parent, start, end, contextualElement){
2794
+ if (contextualElement && contextualElement.nodeType === 11) {
2795
+ throw new Error("Cannot pass a fragment as the contextual element to createMorph");
2796
+ }
2797
+
2792
2798
  if (!contextualElement && parent.nodeType === 1) {
2793
2799
  contextualElement = parent;
2794
2800
  }
2795
- return new Morph(parent, start, end, this, contextualElement);
2801
+ var morph = new Morph(this, contextualElement);
2802
+ morph.firstNode = start;
2803
+ morph.lastNode = end;
2804
+ morph.state = {};
2805
+ morph.isDirty = true;
2806
+ return morph;
2796
2807
  };
2797
2808
 
2798
2809
  prototype.createUnsafeMorph = function(parent, start, end, contextualElement){
2799
2810
  var morph = this.createMorph(parent, start, end, contextualElement);
2800
- morph.escaped = false;
2811
+ morph.parseTextAsHTML = true;
2801
2812
  return morph;
2802
2813
  };
2803
2814
 
2804
2815
  // This helper is just to keep the templates good looking,
2805
2816
  // passing integers instead of element references.
2806
2817
  prototype.createMorphAt = function(parent, startIndex, endIndex, contextualElement){
2807
- var start = startIndex === -1 ? null : this.childAtIndex(parent, startIndex),
2808
- end = endIndex === -1 ? null : this.childAtIndex(parent, endIndex);
2818
+ var single = startIndex === endIndex;
2819
+ var start = this.childAtIndex(parent, startIndex);
2820
+ var end = single ? start : this.childAtIndex(parent, endIndex);
2809
2821
  return this.createMorph(parent, start, end, contextualElement);
2810
2822
  };
2811
2823
 
2812
2824
  prototype.createUnsafeMorphAt = function(parent, startIndex, endIndex, contextualElement) {
2813
2825
  var morph = this.createMorphAt(parent, startIndex, endIndex, contextualElement);
2814
- morph.escaped = false;
2826
+ morph.parseTextAsHTML = true;
2815
2827
  return morph;
2816
2828
  };
2817
2829
 
2818
2830
  prototype.insertMorphBefore = function(element, referenceChild, contextualElement) {
2819
- var start = this.document.createTextNode('');
2820
- var end = this.document.createTextNode('');
2821
- element.insertBefore(start, referenceChild);
2822
- element.insertBefore(end, referenceChild);
2823
- return this.createMorph(element, start, end, contextualElement);
2831
+ var insertion = this.document.createComment('');
2832
+ element.insertBefore(insertion, referenceChild);
2833
+ return this.createMorph(element, insertion, insertion, contextualElement);
2824
2834
  };
2825
2835
 
2826
2836
  prototype.appendMorph = function(element, contextualElement) {
2827
- var start = this.document.createTextNode('');
2828
- var end = this.document.createTextNode('');
2829
- element.appendChild(start);
2830
- element.appendChild(end);
2831
- return this.createMorph(element, start, end, contextualElement);
2837
+ var insertion = this.document.createComment('');
2838
+ element.appendChild(insertion);
2839
+ return this.createMorph(element, insertion, insertion, contextualElement);
2840
+ };
2841
+
2842
+ prototype.insertBoundary = function(fragment, index) {
2843
+ // this will always be null or firstChild
2844
+ var child = index === null ? null : this.childAtIndex(fragment, index);
2845
+ this.insertBefore(fragment, this.createTextNode(''), child);
2832
2846
  };
2833
2847
 
2834
2848
  prototype.parseHTML = function(html, contextualElement) {
2849
+ var childNodes;
2850
+
2835
2851
  if (interiorNamespace(contextualElement) === svgNamespace) {
2836
- return buildSVGDOM(html, this);
2852
+ childNodes = buildSVGDOM(html, this);
2837
2853
  } else {
2838
2854
  var nodes = buildHTMLDOM(html, contextualElement, this);
2839
2855
  if (detectOmittedStartTag(html, contextualElement)) {
@@ -2841,11 +2857,33 @@ enifed("dom-helper",
2841
2857
  while (node && node.nodeType !== 1) {
2842
2858
  node = node.nextSibling;
2843
2859
  }
2844
- return node.childNodes;
2860
+ childNodes = node.childNodes;
2845
2861
  } else {
2846
- return nodes;
2862
+ childNodes = nodes;
2863
+ }
2864
+ }
2865
+
2866
+ // Copy node list to a fragment.
2867
+ var fragment = this.document.createDocumentFragment();
2868
+
2869
+ if (childNodes && childNodes.length > 0) {
2870
+ var currentNode = childNodes[0];
2871
+
2872
+ // We prepend an <option> to <select> boxes to absorb any browser bugs
2873
+ // related to auto-select behavior. Skip past it.
2874
+ if (contextualElement.tagName === 'SELECT') {
2875
+ currentNode = currentNode.nextSibling;
2876
+ }
2877
+
2878
+ while (currentNode) {
2879
+ var tempNode = currentNode;
2880
+ currentNode = currentNode.nextSibling;
2881
+
2882
+ fragment.appendChild(tempNode);
2847
2883
  }
2848
2884
  }
2885
+
2886
+ return fragment;
2849
2887
  };
2850
2888
 
2851
2889
  var parsingNode;
@@ -2904,33 +2942,6 @@ enifed("dom-helper/build-html-dom",
2904
2942
  testEl.childNodes[2].nodeValue === ' Value';
2905
2943
  })(doc);
2906
2944
 
2907
- // IE8 create a selected attribute where they should only
2908
- // create a property
2909
- var createsSelectedAttribute = doc && (function(document) {
2910
- var testEl = document.createElement('div');
2911
- testEl.innerHTML = "<select><option></option></select>";
2912
- return testEl.childNodes[0].childNodes[0].getAttribute('selected') === 'selected';
2913
- })(doc);
2914
-
2915
- var detectAutoSelectedOption;
2916
- if (createsSelectedAttribute) {
2917
- detectAutoSelectedOption = (function(){
2918
- var detectAutoSelectedOptionRegex = /<option[^>]*selected/;
2919
- return function detectAutoSelectedOption(select, option, html) { //jshint ignore:line
2920
- return select.selectedIndex === 0 &&
2921
- !detectAutoSelectedOptionRegex.test(html);
2922
- };
2923
- })();
2924
- } else {
2925
- detectAutoSelectedOption = function detectAutoSelectedOption(select, option, html) { //jshint ignore:line
2926
- var selectedAttribute = option.getAttribute('selected');
2927
- return select.selectedIndex === 0 && (
2928
- selectedAttribute === null ||
2929
- ( selectedAttribute !== '' && selectedAttribute.toLowerCase() !== 'selected' )
2930
- );
2931
- };
2932
- }
2933
-
2934
2945
  var tagNamesRequiringInnerHTMLFix = doc && (function(document) {
2935
2946
  var tagNamesRequiringInnerHTMLFix;
2936
2947
  // IE 9 and earlier don't allow us to set innerHTML on col, colgroup, frameset,
@@ -3005,7 +3016,10 @@ enifed("dom-helper/build-html-dom",
3005
3016
  throw "Can't set innerHTML on "+tagName+" in this browser";
3006
3017
  }
3007
3018
 
3019
+ html = fixSelect(html, contextualElement);
3020
+
3008
3021
  var wrappingTags = tagNamesRequiringInnerHTMLFix[tagName.toLowerCase()];
3022
+
3009
3023
  var startTag = outerHTML.match(new RegExp("<"+tagName+"([^>]*)>", 'i'))[0];
3010
3024
  var endTag = '</'+tagName+'>';
3011
3025
 
@@ -3036,18 +3050,30 @@ enifed("dom-helper/build-html-dom",
3036
3050
  var buildDOM;
3037
3051
  if (needsShy) {
3038
3052
  buildDOM = function buildDOM(html, contextualElement, dom){
3053
+ html = fixSelect(html, contextualElement);
3054
+
3039
3055
  contextualElement = dom.cloneNode(contextualElement, false);
3040
3056
  scriptSafeInnerHTML(contextualElement, html);
3041
3057
  return contextualElement.childNodes;
3042
3058
  };
3043
3059
  } else {
3044
3060
  buildDOM = function buildDOM(html, contextualElement, dom){
3061
+ html = fixSelect(html, contextualElement);
3062
+
3045
3063
  contextualElement = dom.cloneNode(contextualElement, false);
3046
3064
  contextualElement.innerHTML = html;
3047
3065
  return contextualElement.childNodes;
3048
3066
  };
3049
3067
  }
3050
3068
 
3069
+ function fixSelect(html, contextualElement) {
3070
+ if (contextualElement.tagName === 'SELECT') {
3071
+ html = "<option></option>" + html;
3072
+ }
3073
+
3074
+ return html;
3075
+ }
3076
+
3051
3077
  var buildIESafeDOM;
3052
3078
  if (tagNamesRequiringInnerHTMLFix || movesWhitespace) {
3053
3079
  buildIESafeDOM = function buildIESafeDOM(html, contextualElement, dom) {
@@ -3118,45 +3144,17 @@ enifed("dom-helper/build-html-dom",
3118
3144
  buildIESafeDOM = buildDOM;
3119
3145
  }
3120
3146
 
3121
- // When parsing innerHTML, the browser may set up DOM with some things
3122
- // not desired. For example, with a select element context and option
3123
- // innerHTML the first option will be marked selected.
3124
- //
3125
- // This method cleans up some of that, resetting those values back to
3126
- // their defaults.
3127
- //
3128
- function buildSafeDOM(html, contextualElement, dom) {
3129
- var childNodes = buildIESafeDOM(html, contextualElement, dom);
3130
-
3131
- if (contextualElement.tagName === 'SELECT') {
3132
- // Walk child nodes
3133
- for (var i = 0; childNodes[i]; i++) {
3134
- // Find and process the first option child node
3135
- if (childNodes[i].tagName === 'OPTION') {
3136
- if (detectAutoSelectedOption(childNodes[i].parentNode, childNodes[i], html)) {
3137
- // If the first node is selected but does not have an attribute,
3138
- // presume it is not really selected.
3139
- childNodes[i].parentNode.selectedIndex = -1;
3140
- }
3141
- break;
3142
- }
3143
- }
3144
- }
3145
-
3146
- return childNodes;
3147
- }
3148
-
3149
3147
  var buildHTMLDOM;
3150
3148
  if (needsIntegrationPointFix) {
3151
3149
  buildHTMLDOM = function buildHTMLDOM(html, contextualElement, dom){
3152
3150
  if (svgHTMLIntegrationPoints[contextualElement.tagName]) {
3153
- return buildSafeDOM(html, document.createElement('div'), dom);
3151
+ return buildIESafeDOM(html, document.createElement('div'), dom);
3154
3152
  } else {
3155
- return buildSafeDOM(html, contextualElement, dom);
3153
+ return buildIESafeDOM(html, contextualElement, dom);
3156
3154
  }
3157
3155
  };
3158
3156
  } else {
3159
- buildHTMLDOM = buildSafeDOM;
3157
+ buildHTMLDOM = buildIESafeDOM;
3160
3158
  }
3161
3159
 
3162
3160
  __exports__.buildHTMLDOM = buildHTMLDOM;
@@ -3668,7 +3666,7 @@ enifed('ember-application/system/application-instance', ['exports', 'ember-metal
3668
3666
  });
3669
3667
 
3670
3668
  });
3671
- enifed('ember-application/system/application', ['exports', 'dag-map', 'container/registry', 'ember-metal', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-runtime/system/lazy_load', 'ember-runtime/system/namespace', 'ember-runtime/mixins/deferred', 'ember-application/system/resolver', 'ember-metal/platform/create', 'ember-metal/run_loop', 'ember-metal/utils', 'ember-runtime/controllers/controller', 'ember-metal/enumerable_utils', 'ember-runtime/controllers/object_controller', 'ember-runtime/controllers/array_controller', 'ember-views/system/renderer', 'dom-helper', 'ember-views/views/select', 'ember-views/views/view', 'ember-views/views/metamorph_view', 'ember-views/system/event_dispatcher', 'ember-views/system/jquery', 'ember-routing/system/route', 'ember-routing/system/router', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/location/none_location', 'ember-routing/system/cache', 'ember-application/system/application-instance', 'ember-extension-support/container_debug_adapter', 'ember-metal/environment'], function (exports, DAG, Registry, Ember, property_get, property_set, lazy_load, Namespace, DeferredMixin, DefaultResolver, create, run, utils, Controller, EnumerableUtils, ObjectController, ArrayController, Renderer, DOMHelper, SelectView, EmberView, _MetamorphView, EventDispatcher, jQuery, Route, Router, HashLocation, HistoryLocation, AutoLocation, NoneLocation, BucketCache, ApplicationInstance, ContainerDebugAdapter, environment) {
3669
+ enifed('ember-application/system/application', ['exports', 'dag-map', 'container/registry', 'ember-metal', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-runtime/system/lazy_load', 'ember-runtime/system/namespace', 'ember-runtime/mixins/deferred', 'ember-application/system/resolver', 'ember-metal/platform/create', 'ember-metal/run_loop', 'ember-metal/utils', 'ember-runtime/controllers/controller', 'ember-metal/enumerable_utils', 'ember-runtime/controllers/object_controller', 'ember-runtime/controllers/array_controller', 'ember-views/system/renderer', 'dom-helper', 'ember-views/views/select', 'ember-routing-views/views/outlet', 'ember-views/views/view', 'ember-views/views/metamorph_view', 'ember-views/system/event_dispatcher', 'ember-views/system/jquery', 'ember-routing/system/route', 'ember-routing/system/router', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/location/none_location', 'ember-routing/system/cache', 'ember-application/system/application-instance', 'ember-extension-support/container_debug_adapter', 'ember-metal/environment'], function (exports, DAG, Registry, Ember, property_get, property_set, lazy_load, Namespace, DeferredMixin, DefaultResolver, create, run, utils, Controller, EnumerableUtils, ObjectController, ArrayController, Renderer, DOMHelper, SelectView, outlet, EmberView, _MetamorphView, EventDispatcher, jQuery, Route, Router, HashLocation, HistoryLocation, AutoLocation, NoneLocation, BucketCache, ApplicationInstance, ContainerDebugAdapter, environment) {
3672
3670
 
3673
3671
  'use strict';
3674
3672
 
@@ -3921,19 +3919,10 @@ enifed('ember-application/system/application', ['exports', 'dag-map', 'container
3921
3919
  // decremented by the Application's own `initialize` method.
3922
3920
  this._readinessDeferrals = 1;
3923
3921
 
3924
- if (Ember['default'].FEATURES.isEnabled('ember-application-visit')) {
3925
- if (this.autoboot) {
3926
- // Create subclass of Ember.Router for this Application instance.
3927
- // This is to ensure that someone reopening `App.Router` does not
3928
- // tamper with the default `Ember.Router`.
3929
- // 2.0TODO: Can we move this into a globals-mode-only library?
3930
- this.Router = Router['default'].extend();
3931
- this.waitForDOMReady(this.buildDefaultInstance());
3932
- }
3933
- } else {
3922
+
3934
3923
  this.Router = Router['default'].extend();
3935
3924
  this.waitForDOMReady(this.buildDefaultInstance());
3936
- }
3925
+
3937
3926
  },
3938
3927
 
3939
3928
  /**
@@ -4308,12 +4297,10 @@ enifed('ember-application/system/application', ['exports', 'dag-map', 'container
4308
4297
  this._runInitializer('initializers', function(name, initializer) {
4309
4298
  Ember['default'].assert("No application initializer named '" + name + "'", !!initializer);
4310
4299
 
4311
- if (Ember['default'].FEATURES.isEnabled("ember-application-initializer-context")) {
4312
- initializer.initialize(registry, App);
4313
- } else {
4300
+
4314
4301
  var ref = initializer.initialize;
4315
4302
  ref(registry, App);
4316
- }
4303
+
4317
4304
  });
4318
4305
  },
4319
4306
 
@@ -4413,55 +4400,8 @@ enifed('ember-application/system/application', ['exports', 'dag-map', 'container
4413
4400
  }
4414
4401
  });
4415
4402
 
4416
- if (Ember['default'].FEATURES.isEnabled('ember-application-instance-initializers')) {
4417
- Application.reopen({
4418
- instanceInitializer: function(options) {
4419
- this.constructor.instanceInitializer(options);
4420
- }
4421
- });
4422
-
4423
- Application.reopenClass({
4424
- instanceInitializer: buildInitializerMethod('instanceInitializers', 'instance initializer')
4425
- });
4426
- }
4427
-
4428
- if (Ember['default'].FEATURES.isEnabled('ember-application-visit')) {
4429
- Application.reopen({
4430
- /**
4431
- Creates a new instance of the application and instructs it to route to the
4432
- specified initial URL. This method returns a promise that will be resolved
4433
- once rendering is complete. That promise is resolved with the instance.
4434
-
4435
- ```js
4436
- App.visit('/users').then(function(instance) {
4437
- var view = instance.view;
4438
- view.appendTo('#qunit-test-fixtures');
4439
- });
4440
- ```
4441
-
4442
- @method visit
4443
- @private
4444
- */
4445
- visit: function(url) {
4446
- var instance = this.buildInstance();
4447
- this.runInstanceInitializers(instance);
4448
-
4449
- var renderPromise = new Ember['default'].RSVP.Promise(function(res, rej) {
4450
- instance.didCreateRootView = function(view) {
4451
- instance.view = view;
4452
- res(instance);
4453
- };
4454
- });
4455
-
4456
- instance.setupRouter({ location: 'none' });
4457
-
4458
- return instance.handleURL(url).then(function() {
4459
- return renderPromise;
4460
- });
4461
- }
4462
- });
4463
- }
4464
-
4403
+
4404
+
4465
4405
  Application.reopenClass({
4466
4406
  initializers: create['default'](null),
4467
4407
  instanceInitializers: create['default'](null),
@@ -4640,6 +4580,7 @@ enifed('ember-application/system/application', ['exports', 'dag-map', 'container
4640
4580
 
4641
4581
  registry.injection('view', 'renderer', 'renderer:-dom');
4642
4582
  registry.register('view:select', SelectView['default']);
4583
+ registry.register('view:-outlet', outlet.OutletView);
4643
4584
 
4644
4585
  registry.register('view:default', _MetamorphView['default']);
4645
4586
  registry.register('view:toplevel', EmberView['default'].extend());
@@ -4648,6 +4589,7 @@ enifed('ember-application/system/application', ['exports', 'dag-map', 'container
4648
4589
  registry.register('event_dispatcher:main', EventDispatcher['default']);
4649
4590
 
4650
4591
  registry.injection('router:main', 'namespace', 'application:main');
4592
+ registry.injection('view:-outlet', 'namespace', 'application:main');
4651
4593
 
4652
4594
  registry.register('location:auto', AutoLocation['default']);
4653
4595
  registry.register('location:hash', HashLocation['default']);
@@ -5372,10 +5314,7 @@ enifed('ember-debug', ['exports', 'ember-metal/core', 'ember-metal/error', 'embe
5372
5314
  Ember['default'].FEATURES['features-stripped-test'] = true;
5373
5315
  var featuresWereStripped = true;
5374
5316
 
5375
- if (Ember['default'].FEATURES.isEnabled('features-stripped-test')) {
5376
- featuresWereStripped = false;
5377
- }
5378
-
5317
+
5379
5318
  delete Ember['default'].FEATURES['features-stripped-test'];
5380
5319
  _warnIfUsingStrippedFeatureFlags(Ember['default'].ENV.FEATURES, featuresWereStripped);
5381
5320
 
@@ -5974,40 +5913,34 @@ enifed('ember-htmlbars', ['ember-metal/core', 'ember-template-compiler', 'ember-
5974
5913
  helpers.registerHelper('each', each.eachHelper);
5975
5914
  helpers.registerHelper('unbound', unbound.unboundHelper);
5976
5915
 
5977
-
5978
- Ember['default'].HTMLBars = {
5979
- _registerHelper: helpers.registerHelper,
5980
- template: ember_template_compiler.template,
5981
- compile: ember_template_compiler.compile,
5982
- precompile: ember_template_compiler.precompile,
5983
- makeViewHelper: makeViewHelper['default'],
5984
- makeBoundHelper: makeBoundHelper['default'],
5985
- registerPlugin: ember_template_compiler.registerPlugin
5986
- };
5987
-
5988
-
5916
+ Ember['default'].HTMLBars = {
5917
+ _registerHelper: helpers.registerHelper,
5918
+ template: ember_template_compiler.template,
5919
+ compile: ember_template_compiler.compile,
5920
+ precompile: ember_template_compiler.precompile,
5921
+ makeViewHelper: makeViewHelper['default'],
5922
+ makeBoundHelper: makeBoundHelper['default'],
5923
+ registerPlugin: ember_template_compiler.registerPlugin
5924
+ };
5989
5925
 
5990
5926
  });
5991
5927
  enifed('ember-htmlbars/compat', ['exports', 'ember-metal/core', 'ember-htmlbars/helpers', 'ember-htmlbars/compat/helper', 'ember-htmlbars/compat/handlebars-get', 'ember-htmlbars/compat/make-bound-helper', 'ember-htmlbars/compat/register-bound-helper', 'ember-htmlbars/system/make-view-helper', 'ember-htmlbars/utils/string'], function (exports, Ember, helpers, helper, compatHandlebarsGet, compatMakeBoundHelper, compatRegisterBoundHelper, makeViewHelper, string) {
5992
5928
 
5993
5929
  'use strict';
5994
5930
 
5995
- var EmberHandlebars;
5996
-
5997
- EmberHandlebars = Ember['default'].Handlebars = Ember['default'].Handlebars || {};
5998
- EmberHandlebars.helpers = helpers['default'];
5999
- EmberHandlebars.helper = helper.handlebarsHelper;
6000
- EmberHandlebars.registerHelper = helper.registerHandlebarsCompatibleHelper;
6001
- EmberHandlebars.registerBoundHelper = compatRegisterBoundHelper['default'];
6002
- EmberHandlebars.makeBoundHelper = compatMakeBoundHelper['default'];
6003
- EmberHandlebars.get = compatHandlebarsGet['default'];
6004
- EmberHandlebars.makeViewHelper = makeViewHelper['default'];
6005
-
6006
- EmberHandlebars.SafeString = string.SafeString;
6007
- EmberHandlebars.Utils = {
6008
- escapeExpression: string.escapeExpression
6009
- };
6010
-
5931
+ var EmberHandlebars = Ember['default'].Handlebars = Ember['default'].Handlebars || {};
5932
+ EmberHandlebars.helpers = helpers['default'];
5933
+ EmberHandlebars.helper = helper.handlebarsHelper;
5934
+ EmberHandlebars.registerHelper = helper.registerHandlebarsCompatibleHelper;
5935
+ EmberHandlebars.registerBoundHelper = compatRegisterBoundHelper['default'];
5936
+ EmberHandlebars.makeBoundHelper = compatMakeBoundHelper['default'];
5937
+ EmberHandlebars.get = compatHandlebarsGet['default'];
5938
+ EmberHandlebars.makeViewHelper = makeViewHelper['default'];
5939
+
5940
+ EmberHandlebars.SafeString = string.SafeString;
5941
+ EmberHandlebars.Utils = {
5942
+ escapeExpression: string.escapeExpression
5943
+ };
6011
5944
 
6012
5945
  exports['default'] = EmberHandlebars;
6013
5946
 
@@ -6539,9 +6472,8 @@ enifed('ember-htmlbars/helpers/bind-attr', ['exports', 'ember-metal/core', 'embe
6539
6472
  function bindAttrHelperDeprecated() {
6540
6473
  Ember['default'].deprecate("The 'bindAttr' view helper is deprecated in favor of 'bind-attr'");
6541
6474
 
6542
-
6543
- return helpers['default']['bind-attr'].helperFunction.apply(this, arguments);
6544
- }
6475
+ return helpers['default']['bind-attr'].helperFunction.apply(this, arguments);
6476
+ }
6545
6477
 
6546
6478
  exports['default'] = bindAttrHelper;
6547
6479
 
@@ -7389,7 +7321,7 @@ enifed('ember-htmlbars/hooks/inline', ['exports', 'ember-views/views/simple_boun
7389
7321
  exports['default'] = inline;
7390
7322
 
7391
7323
  });
7392
- enifed('ember-htmlbars/hooks/set', ['exports', 'ember-metal/core', 'ember-metal/error'], function (exports, Ember, EmberError) {
7324
+ enifed('ember-htmlbars/hooks/set', ['exports'], function (exports) {
7393
7325
 
7394
7326
  'use strict';
7395
7327
 
@@ -7399,9 +7331,8 @@ enifed('ember-htmlbars/hooks/set', ['exports', 'ember-metal/core', 'ember-metal/
7399
7331
  */
7400
7332
 
7401
7333
  function set(env, view, name, value) {
7402
-
7403
- view._keywords[name] = value;
7404
- }
7334
+ view._keywords[name] = value;
7335
+ }
7405
7336
  exports['default'] = set;
7406
7337
 
7407
7338
  });
@@ -7529,9 +7460,6 @@ enifed('ember-htmlbars/system/bootstrap', ['exports', 'ember-metal/core', 'ember
7529
7460
  */
7530
7461
 
7531
7462
  lazy_load.onLoad('Ember.Application', function(Application) {
7532
-
7533
- // jscs:disable validateIndentation
7534
-
7535
7463
  Application.initializer({
7536
7464
  name: 'domTemplates',
7537
7465
  initialize: environment['default'].hasDOM ? _bootstrap : function() { }
@@ -7542,9 +7470,6 @@ enifed('ember-htmlbars/system/bootstrap', ['exports', 'ember-metal/core', 'ember
7542
7470
  after: 'domTemplates',
7543
7471
  initialize: registerComponentLookup
7544
7472
  });
7545
-
7546
- // jscs:enable validateIndentation
7547
-
7548
7473
  });
7549
7474
 
7550
7475
  exports['default'] = bootstrap;
@@ -7835,6 +7760,12 @@ enifed('ember-htmlbars/system/render-view', ['exports', 'ember-metal/core', 'emb
7835
7760
  exports['default'] = renderView;
7836
7761
 
7837
7762
  function renderHTMLBarsTemplate(view, buffer, template) {
7763
+ Ember['default'].assert(
7764
+ 'The template being rendered by `' + view + '` was compiled with `' + template.revision +
7765
+ '` which does not match `Ember@1.11.0-beta.2` (this revision).',
7766
+ template.revision === 'Ember@1.11.0-beta.2'
7767
+ );
7768
+
7838
7769
  var contextualElement = buffer.innerContextualElement();
7839
7770
  var args = view._blockArguments;
7840
7771
  var env = {
@@ -7869,17 +7800,16 @@ enifed('ember-htmlbars/templates/component', ['exports', 'ember-template-compile
7869
7800
 
7870
7801
  'use strict';
7871
7802
 
7872
- var t = (function() {
7803
+ exports['default'] = template['default']((function() {
7873
7804
  return {
7874
7805
  isHTMLBars: true,
7806
+ revision: "Ember@v1.11.0-beta.2",
7875
7807
  blockParams: 0,
7876
7808
  cachedFragment: null,
7877
7809
  hasRendered: false,
7878
7810
  build: function build(dom) {
7879
7811
  var el0 = dom.createDocumentFragment();
7880
- var el1 = dom.createTextNode("");
7881
- dom.appendChild(el0, el1);
7882
- var el1 = dom.createTextNode("");
7812
+ var el1 = dom.createComment("");
7883
7813
  dom.appendChild(el0, el1);
7884
7814
  return el0;
7885
7815
  },
@@ -7903,23 +7833,24 @@ enifed('ember-htmlbars/templates/component', ['exports', 'ember-template-compile
7903
7833
  } else {
7904
7834
  fragment = this.build(dom);
7905
7835
  }
7906
- if (this.cachedFragment) { dom.repairClonedNode(fragment,[0,1]); }
7907
- var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
7836
+ var morph0 = dom.createMorphAt(fragment,0,0,contextualElement);
7837
+ dom.insertBoundary(fragment, null);
7838
+ dom.insertBoundary(fragment, 0);
7908
7839
  content(env, morph0, context, "yield");
7909
7840
  return fragment;
7910
7841
  }
7911
7842
  };
7912
- }());
7913
- exports['default'] = template['default'](t);
7843
+ }()));
7914
7844
 
7915
7845
  });
7916
7846
  enifed('ember-htmlbars/templates/empty', ['exports', 'ember-template-compiler/system/template'], function (exports, template) {
7917
7847
 
7918
7848
  'use strict';
7919
7849
 
7920
- var t = (function() {
7850
+ exports['default'] = template['default']((function() {
7921
7851
  return {
7922
7852
  isHTMLBars: true,
7853
+ revision: "Ember@v1.11.0-beta.2",
7923
7854
  blockParams: 0,
7924
7855
  cachedFragment: null,
7925
7856
  hasRendered: false,
@@ -7949,24 +7880,28 @@ enifed('ember-htmlbars/templates/empty', ['exports', 'ember-template-compiler/sy
7949
7880
  return fragment;
7950
7881
  }
7951
7882
  };
7952
- }());
7953
- exports['default'] = template['default'](t);
7883
+ }()));
7954
7884
 
7955
7885
  });
7956
7886
  enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/system/template'], function (exports, template) {
7957
7887
 
7958
7888
  'use strict';
7959
7889
 
7960
- var t = (function() {
7890
+ exports['default'] = template['default']((function() {
7961
7891
  var child0 = (function() {
7962
7892
  return {
7963
7893
  isHTMLBars: true,
7894
+ revision: "Ember@v1.11.0-beta.2",
7964
7895
  blockParams: 0,
7965
7896
  cachedFragment: null,
7966
7897
  hasRendered: false,
7967
7898
  build: function build(dom) {
7968
- var el0 = dom.createElement("option");
7969
- dom.setAttribute(el0,"value","");
7899
+ var el0 = dom.createDocumentFragment();
7900
+ var el1 = dom.createElement("option");
7901
+ dom.setAttribute(el1,"value","");
7902
+ var el2 = dom.createComment("");
7903
+ dom.appendChild(el1, el2);
7904
+ dom.appendChild(el0, el1);
7970
7905
  return el0;
7971
7906
  },
7972
7907
  render: function render(context, env, contextualElement) {
@@ -7989,7 +7924,7 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
7989
7924
  } else {
7990
7925
  fragment = this.build(dom);
7991
7926
  }
7992
- var morph0 = dom.createMorphAt(fragment,-1,-1);
7927
+ var morph0 = dom.createMorphAt(dom.childAt(fragment, [0]),0,0);
7993
7928
  content(env, morph0, context, "view.prompt");
7994
7929
  return fragment;
7995
7930
  }
@@ -7999,14 +7934,13 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
7999
7934
  var child0 = (function() {
8000
7935
  return {
8001
7936
  isHTMLBars: true,
7937
+ revision: "Ember@v1.11.0-beta.2",
8002
7938
  blockParams: 0,
8003
7939
  cachedFragment: null,
8004
7940
  hasRendered: false,
8005
7941
  build: function build(dom) {
8006
7942
  var el0 = dom.createDocumentFragment();
8007
- var el1 = dom.createTextNode("");
8008
- dom.appendChild(el0, el1);
8009
- var el1 = dom.createTextNode("");
7943
+ var el1 = dom.createComment("");
8010
7944
  dom.appendChild(el0, el1);
8011
7945
  return el0;
8012
7946
  },
@@ -8030,8 +7964,9 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8030
7964
  } else {
8031
7965
  fragment = this.build(dom);
8032
7966
  }
8033
- if (this.cachedFragment) { dom.repairClonedNode(fragment,[0,1]); }
8034
- var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
7967
+ var morph0 = dom.createMorphAt(fragment,0,0,contextualElement);
7968
+ dom.insertBoundary(fragment, null);
7969
+ dom.insertBoundary(fragment, 0);
8035
7970
  inline(env, morph0, context, "view", [get(env, context, "view.groupView")], {"content": get(env, context, "group.content"), "label": get(env, context, "group.label")});
8036
7971
  return fragment;
8037
7972
  }
@@ -8039,14 +7974,13 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8039
7974
  }());
8040
7975
  return {
8041
7976
  isHTMLBars: true,
7977
+ revision: "Ember@v1.11.0-beta.2",
8042
7978
  blockParams: 0,
8043
7979
  cachedFragment: null,
8044
7980
  hasRendered: false,
8045
7981
  build: function build(dom) {
8046
7982
  var el0 = dom.createDocumentFragment();
8047
- var el1 = dom.createTextNode("");
8048
- dom.appendChild(el0, el1);
8049
- var el1 = dom.createTextNode("");
7983
+ var el1 = dom.createComment("");
8050
7984
  dom.appendChild(el0, el1);
8051
7985
  return el0;
8052
7986
  },
@@ -8070,8 +8004,9 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8070
8004
  } else {
8071
8005
  fragment = this.build(dom);
8072
8006
  }
8073
- if (this.cachedFragment) { dom.repairClonedNode(fragment,[0,1]); }
8074
- var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
8007
+ var morph0 = dom.createMorphAt(fragment,0,0,contextualElement);
8008
+ dom.insertBoundary(fragment, null);
8009
+ dom.insertBoundary(fragment, 0);
8075
8010
  block(env, morph0, context, "each", [get(env, context, "view.groupedContent")], {"keyword": "group"}, child0, null);
8076
8011
  return fragment;
8077
8012
  }
@@ -8081,14 +8016,13 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8081
8016
  var child0 = (function() {
8082
8017
  return {
8083
8018
  isHTMLBars: true,
8019
+ revision: "Ember@v1.11.0-beta.2",
8084
8020
  blockParams: 0,
8085
8021
  cachedFragment: null,
8086
8022
  hasRendered: false,
8087
8023
  build: function build(dom) {
8088
8024
  var el0 = dom.createDocumentFragment();
8089
- var el1 = dom.createTextNode("");
8090
- dom.appendChild(el0, el1);
8091
- var el1 = dom.createTextNode("");
8025
+ var el1 = dom.createComment("");
8092
8026
  dom.appendChild(el0, el1);
8093
8027
  return el0;
8094
8028
  },
@@ -8112,8 +8046,9 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8112
8046
  } else {
8113
8047
  fragment = this.build(dom);
8114
8048
  }
8115
- if (this.cachedFragment) { dom.repairClonedNode(fragment,[0,1]); }
8116
- var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
8049
+ var morph0 = dom.createMorphAt(fragment,0,0,contextualElement);
8050
+ dom.insertBoundary(fragment, null);
8051
+ dom.insertBoundary(fragment, 0);
8117
8052
  inline(env, morph0, context, "view", [get(env, context, "view.optionView")], {"content": get(env, context, "item")});
8118
8053
  return fragment;
8119
8054
  }
@@ -8121,14 +8056,13 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8121
8056
  }());
8122
8057
  return {
8123
8058
  isHTMLBars: true,
8059
+ revision: "Ember@v1.11.0-beta.2",
8124
8060
  blockParams: 0,
8125
8061
  cachedFragment: null,
8126
8062
  hasRendered: false,
8127
8063
  build: function build(dom) {
8128
8064
  var el0 = dom.createDocumentFragment();
8129
- var el1 = dom.createTextNode("");
8130
- dom.appendChild(el0, el1);
8131
- var el1 = dom.createTextNode("");
8065
+ var el1 = dom.createComment("");
8132
8066
  dom.appendChild(el0, el1);
8133
8067
  return el0;
8134
8068
  },
@@ -8152,8 +8086,9 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8152
8086
  } else {
8153
8087
  fragment = this.build(dom);
8154
8088
  }
8155
- if (this.cachedFragment) { dom.repairClonedNode(fragment,[0,1]); }
8156
- var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
8089
+ var morph0 = dom.createMorphAt(fragment,0,0,contextualElement);
8090
+ dom.insertBoundary(fragment, null);
8091
+ dom.insertBoundary(fragment, 0);
8157
8092
  block(env, morph0, context, "each", [get(env, context, "view.content")], {"keyword": "item"}, child0, null);
8158
8093
  return fragment;
8159
8094
  }
@@ -8161,14 +8096,15 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8161
8096
  }());
8162
8097
  return {
8163
8098
  isHTMLBars: true,
8099
+ revision: "Ember@v1.11.0-beta.2",
8164
8100
  blockParams: 0,
8165
8101
  cachedFragment: null,
8166
8102
  hasRendered: false,
8167
8103
  build: function build(dom) {
8168
8104
  var el0 = dom.createDocumentFragment();
8169
- var el1 = dom.createTextNode("");
8105
+ var el1 = dom.createComment("");
8170
8106
  dom.appendChild(el0, el1);
8171
- var el1 = dom.createTextNode("");
8107
+ var el1 = dom.createComment("");
8172
8108
  dom.appendChild(el0, el1);
8173
8109
  var el1 = dom.createTextNode("\n");
8174
8110
  dom.appendChild(el0, el1);
@@ -8194,16 +8130,15 @@ enifed('ember-htmlbars/templates/select', ['exports', 'ember-template-compiler/s
8194
8130
  } else {
8195
8131
  fragment = this.build(dom);
8196
8132
  }
8197
- if (this.cachedFragment) { dom.repairClonedNode(fragment,[0,1]); }
8198
- var morph0 = dom.createMorphAt(fragment,0,1,contextualElement);
8199
- var morph1 = dom.createMorphAt(fragment,1,2,contextualElement);
8133
+ var morph0 = dom.createMorphAt(fragment,0,0,contextualElement);
8134
+ var morph1 = dom.createMorphAt(fragment,1,1,contextualElement);
8135
+ dom.insertBoundary(fragment, 0);
8200
8136
  block(env, morph0, context, "if", [get(env, context, "view.prompt")], {}, child0, null);
8201
8137
  block(env, morph1, context, "if", [get(env, context, "view.optionGroupPath")], {}, child1, child2);
8202
8138
  return fragment;
8203
8139
  }
8204
8140
  };
8205
- }());
8206
- exports['default'] = template['default'](t);
8141
+ }()));
8207
8142
 
8208
8143
  });
8209
8144
  enifed('ember-htmlbars/utils/string', ['exports', 'htmlbars-util', 'ember-runtime/system/string'], function (exports, htmlbars_util, EmberStringUtils) {
@@ -8283,10 +8218,9 @@ enifed('ember-metal-views/renderer', ['exports', 'dom-helper', 'ember-metal/envi
8283
8218
  this._destinedForDOM = _destinedForDOM === undefined ? true : _destinedForDOM;
8284
8219
  }
8285
8220
 
8286
- function Renderer_renderTree(_view, _parentView, _insertAt) {
8221
+ function Renderer_renderTree(_view, _parentView, _refMorph) {
8287
8222
  var views = this._views;
8288
8223
  views[0] = _view;
8289
- var insertAt = _insertAt === undefined ? -1 : _insertAt;
8290
8224
  var index = 0;
8291
8225
  var total = 1;
8292
8226
  var levelBase = _parentView ? _parentView._level+1 : 0;
@@ -8380,7 +8314,7 @@ enifed('ember-metal-views/renderer', ['exports', 'dom-helper', 'ember-metal/envi
8380
8314
 
8381
8315
  parentIndex = parents[level];
8382
8316
  parent = parentIndex === -1 ? _parentView : views[parentIndex];
8383
- this.insertElement(view, parent, element, -1);
8317
+ this.insertElement(view, parent, element, null);
8384
8318
  index = queue[--length];
8385
8319
  view = views[index];
8386
8320
  element = elements[level];
@@ -8388,7 +8322,7 @@ enifed('ember-metal-views/renderer', ['exports', 'dom-helper', 'ember-metal/envi
8388
8322
  }
8389
8323
  }
8390
8324
 
8391
- this.insertElement(view, _parentView, element, insertAt);
8325
+ this.insertElement(view, _parentView, element, _refMorph);
8392
8326
 
8393
8327
  for (i=total-1; i>=0; i--) {
8394
8328
  if (willInsert) {
@@ -8437,7 +8371,12 @@ enifed('ember-metal-views/renderer', ['exports', 'dom-helper', 'ember-metal/envi
8437
8371
 
8438
8372
  Renderer.prototype.replaceIn =
8439
8373
  function Renderer_replaceIn(view, target) {
8440
- var morph = this._dom.createMorph(target, null, null);
8374
+ var morph;
8375
+ if (target.firstNode) {
8376
+ morph = this._dom.createMorph(target, target.firstNode, target.lastNode);
8377
+ } else {
8378
+ morph = this._dom.appendMorph(target);
8379
+ }
8441
8380
  this.scheduleInsert(view, morph);
8442
8381
  };
8443
8382
 
@@ -8510,7 +8449,7 @@ enifed('ember-metal-views/renderer', ['exports', 'dom-helper', 'ember-metal/envi
8510
8449
  }
8511
8450
  }
8512
8451
 
8513
- function Renderer_insertElement(view, parentView, element, index) {
8452
+ function Renderer_insertElement(view, parentView, element, refMorph) {
8514
8453
  if (element === null || element === undefined) {
8515
8454
  return;
8516
8455
  }
@@ -8518,11 +8457,7 @@ enifed('ember-metal-views/renderer', ['exports', 'dom-helper', 'ember-metal/envi
8518
8457
  if (view._morph) {
8519
8458
  view._morph.setContent(element);
8520
8459
  } else if (parentView) {
8521
- if (index === -1) {
8522
- view._morph = parentView._childViewsMorph.append(element);
8523
- } else {
8524
- view._morph = parentView._childViewsMorph.insert(index, element);
8525
- }
8460
+ view._morph = parentView._childViewsMorph.insertContentBeforeMorph(element, refMorph);
8526
8461
  }
8527
8462
  }
8528
8463
 
@@ -8611,12 +8546,12 @@ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/merge', 'embe
8611
8546
 
8612
8547
  var EmberInstrumentation = Ember['default'].Instrumentation = {};
8613
8548
  EmberInstrumentation.instrument = instrumentation.instrument;
8614
- EmberInstrumentation.subscribe = streams__utils.subscribe;
8615
- EmberInstrumentation.unsubscribe = streams__utils.unsubscribe;
8549
+ EmberInstrumentation.subscribe = instrumentation.subscribe;
8550
+ EmberInstrumentation.unsubscribe = instrumentation.unsubscribe;
8616
8551
  EmberInstrumentation.reset = instrumentation.reset;
8617
8552
 
8618
8553
  Ember['default'].instrument = instrumentation.instrument;
8619
- Ember['default'].subscribe = streams__utils.subscribe;
8554
+ Ember['default'].subscribe = instrumentation.subscribe;
8620
8555
 
8621
8556
  Ember['default']._Cache = Cache['default'];
8622
8557
 
@@ -8766,23 +8701,7 @@ enifed('ember-metal', ['exports', 'ember-metal/core', 'ember-metal/merge', 'embe
8766
8701
 
8767
8702
  Ember['default'].merge = merge['default'];
8768
8703
 
8769
- if (Ember['default'].FEATURES.isEnabled('ember-metal-stream')) {
8770
- Ember['default'].stream = {
8771
- Stream: Stream['default'],
8772
-
8773
- isStream: streams__utils.isStream,
8774
- subscribe: streams__utils.subscribe,
8775
- unsubscribe: streams__utils.unsubscribe,
8776
- read: streams__utils.read,
8777
- readHash: streams__utils.readHash,
8778
- readArray: streams__utils.readArray,
8779
- scanArray: streams__utils.scanArray,
8780
- scanHash: streams__utils.scanHash,
8781
- concat: streams__utils.concat,
8782
- chain: streams__utils.chain
8783
- };
8784
- }
8785
-
8704
+
8786
8705
  /**
8787
8706
  A function may be assigned to `Ember.onerror` to be called when Ember
8788
8707
  internals encounter an error. This is useful for specialized error handling
@@ -10051,27 +9970,13 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/property_set', 'ember-me
10051
9970
  */
10052
9971
  function ComputedProperty(config, opts) {
10053
9972
  this.isDescriptor = true;
10054
- if (Ember.FEATURES.isEnabled("new-computed-syntax")) {
10055
- if (typeof config === "function") {
10056
- config.__ember_arity = config.length;
10057
- this._getter = config;
10058
- if (config.__ember_arity > 1) {
10059
- this._setter = config;
10060
- }
10061
- } else {
10062
- this._getter = config.get;
10063
- this._setter = config.set;
10064
- if (this._setter && this._setter.__ember_arity === undefined) {
10065
- this._setter.__ember_arity = this._setter.length;
10066
- }
10067
- }
10068
- } else {
9973
+
10069
9974
  config.__ember_arity = config.length;
10070
9975
  this._getter = config;
10071
9976
  if (config.__ember_arity > 1) {
10072
9977
  this._setter = config;
10073
9978
  }
10074
- }
9979
+
10075
9980
 
10076
9981
  this._dependentKeys = undefined;
10077
9982
  this._suspended = undefined;
@@ -10517,14 +10422,12 @@ enifed('ember-metal/computed', ['exports', 'ember-metal/property_set', 'ember-me
10517
10422
 
10518
10423
  var cp = new ComputedProperty(func);
10519
10424
  // jscs:disable
10520
- if (Ember.FEATURES.isEnabled("new-computed-syntax")) {
10521
- // Empty block on purpose
10522
- } else {
10425
+
10523
10426
  // jscs:enable
10524
10427
  if (typeof func !== "function") {
10525
10428
  throw new EmberError['default']("Computed Property declared without a property function");
10526
10429
  }
10527
- }
10430
+
10528
10431
 
10529
10432
  if (args) {
10530
10433
  cp.property.apply(cp, args);
@@ -11338,7 +11241,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
11338
11241
 
11339
11242
  @class Ember
11340
11243
  @static
11341
- @version 1.11.0-beta.1
11244
+ @version 1.11.0-beta.2
11342
11245
  */
11343
11246
 
11344
11247
  if ('undefined' === typeof Ember) {
@@ -11366,10 +11269,10 @@ enifed('ember-metal/core', ['exports'], function (exports) {
11366
11269
  /**
11367
11270
  @property VERSION
11368
11271
  @type String
11369
- @default '1.11.0-beta.1'
11272
+ @default '1.11.0-beta.2'
11370
11273
  @static
11371
11274
  */
11372
- Ember.VERSION = '1.11.0-beta.1';
11275
+ Ember.VERSION = '1.11.0-beta.2';
11373
11276
 
11374
11277
  /**
11375
11278
  Standard environmental variables. You can define these in a global `EmberENV`
@@ -11414,7 +11317,7 @@ enifed('ember-metal/core', ['exports'], function (exports) {
11414
11317
  Ember.FEATURES = Ember.ENV.FEATURES;
11415
11318
 
11416
11319
  if (!Ember.FEATURES) {
11417
- Ember.FEATURES = {"features-stripped-test":null,"ember-routing-named-substates":true,"ember-metal-injected-properties":true,"mandatory-setter":true,"ember-htmlbars":true,"ember-htmlbars-block-params":true,"ember-htmlbars-component-generation":null,"ember-htmlbars-component-helper":true,"ember-htmlbars-inline-if-helper":true,"ember-htmlbars-attribute-syntax":true,"ember-routing-transitioning-classes":true,"new-computed-syntax":null,"ember-testing-checkbox-helpers":null,"ember-metal-stream":null,"ember-htmlbars-each-with-index":true,"ember-application-instance-initializers":null,"ember-application-initializer-context":null,"ember-router-willtransition":true,"ember-application-visit":null}; //jshint ignore:line
11320
+ Ember.FEATURES = {"features-stripped-test":false,"ember-routing-named-substates":true,"mandatory-setter":true,"ember-htmlbars-component-generation":false,"ember-htmlbars-component-helper":true,"ember-htmlbars-inline-if-helper":true,"ember-htmlbars-attribute-syntax":true,"ember-routing-transitioning-classes":true,"new-computed-syntax":false,"ember-testing-checkbox-helpers":false,"ember-metal-stream":false,"ember-htmlbars-each-with-index":true,"ember-application-instance-initializers":false,"ember-application-initializer-context":false,"ember-router-willtransition":true,"ember-application-visit":false}; //jshint ignore:line
11418
11321
  }
11419
11322
 
11420
11323
  /**
@@ -18610,7 +18513,7 @@ enifed('ember-routing-htmlbars/helpers/link-to', ['exports', 'ember-metal/core',
18610
18513
 
18611
18514
  if (!options.template) {
18612
18515
  var linkTitle = params.shift();
18613
- var shouldEscape = options.morph.escaped;
18516
+ var parseTextAsHTML = options.morph.parseTextAsHTML;
18614
18517
 
18615
18518
  if (utils.isStream(linkTitle)) {
18616
18519
  hash.linkTitle = { stream: linkTitle };
@@ -18618,12 +18521,13 @@ enifed('ember-routing-htmlbars/helpers/link-to', ['exports', 'ember-metal/core',
18618
18521
 
18619
18522
  options.template = {
18620
18523
  isHTMLBars: true,
18524
+ revision: 'Ember@1.11.0-beta.2',
18621
18525
  render: function(view, env) {
18622
18526
  var value = utils.read(linkTitle) || "";
18623
- if (shouldEscape) {
18624
- return env.dom.createTextNode(value);
18625
- } else {
18527
+ if (parseTextAsHTML) {
18626
18528
  return value;
18529
+ } else {
18530
+ return env.dom.createTextNode(value);
18627
18531
  }
18628
18532
  }
18629
18533
  };
@@ -18667,7 +18571,7 @@ enifed('ember-routing-htmlbars/helpers/link-to', ['exports', 'ember-metal/core',
18667
18571
  }
18668
18572
 
18669
18573
  });
18670
- enifed('ember-routing-htmlbars/helpers/outlet', ['exports', 'ember-metal/core', 'ember-metal/property_set', 'ember-routing-views/views/outlet'], function (exports, Ember, property_set, outlet) {
18574
+ enifed('ember-routing-htmlbars/helpers/outlet', ['exports', 'ember-metal/core'], function (exports, Ember) {
18671
18575
 
18672
18576
  'use strict';
18673
18577
 
@@ -18679,7 +18583,6 @@ enifed('ember-routing-htmlbars/helpers/outlet', ['exports', 'ember-metal/core',
18679
18583
  */
18680
18584
 
18681
18585
  function outletHelper(params, hash, options, env) {
18682
- var outletSource;
18683
18586
  var viewName;
18684
18587
  var viewClass;
18685
18588
  var viewFullName;
@@ -18691,11 +18594,6 @@ enifed('ember-routing-htmlbars/helpers/outlet', ['exports', 'ember-metal/core',
18691
18594
 
18692
18595
  var property = params[0] || 'main';
18693
18596
 
18694
- outletSource = this;
18695
- while (!outletSource.get('template.isTop')) {
18696
- outletSource = outletSource._parentView;
18697
- }
18698
- property_set.set(this, 'outletSource', outletSource);
18699
18597
 
18700
18598
  // provide controller override
18701
18599
  viewName = hash.view;
@@ -18713,12 +18611,9 @@ enifed('ember-routing-htmlbars/helpers/outlet', ['exports', 'ember-metal/core',
18713
18611
  );
18714
18612
  }
18715
18613
 
18716
- viewClass = viewName ? this.container.lookupFactory(viewFullName) : hash.viewClass || outlet.OutletView;
18717
-
18718
- hash.currentViewBinding = '_view.outletSource._outlets.' + property;
18719
-
18614
+ viewClass = viewName ? this.container.lookupFactory(viewFullName) : hash.viewClass || this.container.lookupFactory('view:-outlet');
18615
+ hash._outletName = property;
18720
18616
  options.helperName = options.helperName || 'outlet';
18721
-
18722
18617
  return env.helpers.view.helperFunction.call(this, [viewClass], hash, options, env);
18723
18618
  }
18724
18619
 
@@ -18923,7 +18818,7 @@ enifed('ember-routing-views/views/link', ['exports', 'ember-metal/core', 'ember-
18923
18818
  @extends Ember.View
18924
18819
  @see {Handlebars.helpers.link-to}
18925
18820
  **/
18926
- var LinkView = Ember['default'].LinkView = EmberComponent['default'].extend({
18821
+ var LinkView = EmberComponent['default'].extend({
18927
18822
  tagName: 'a',
18928
18823
 
18929
18824
  /**
@@ -19499,21 +19394,143 @@ enifed('ember-routing-views/views/link', ['exports', 'ember-metal/core', 'ember-
19499
19394
  exports.LinkView = LinkView;
19500
19395
 
19501
19396
  });
19502
- enifed('ember-routing-views/views/outlet', ['exports', 'ember-views/views/container_view', 'ember-views/views/metamorph_view'], function (exports, ContainerView, metamorph_view) {
19397
+ enifed('ember-routing-views/views/outlet', ['exports', 'ember-views/views/container_view', 'ember-views/views/metamorph_view', 'ember-metal/property_get'], function (exports, ContainerView, metamorph_view, property_get) {
19503
19398
 
19504
- 'use strict';
19399
+ 'use strict';
19505
19400
 
19506
- /**
19507
- @module ember
19508
- @submodule ember-routing-views
19509
- */
19401
+ /**
19402
+ @module ember
19403
+ @submodule ember-routing-views
19404
+ */
19405
+
19406
+ var CoreOutletView = ContainerView['default'].extend({
19407
+ init: function() {
19408
+ this._super();
19409
+ this._childOutlets = [];
19410
+ this._outletState = null;
19411
+ },
19412
+
19413
+ _isOutlet: true,
19414
+
19415
+ _parentOutlet: function() {
19416
+ var parent = this._parentView;
19417
+ while (parent && !parent._isOutlet) {
19418
+ parent = parent._parentView;
19419
+ }
19420
+ return parent;
19421
+ },
19422
+
19423
+ _linkParent: Ember.on('init', 'parentViewDidChange', function() {
19424
+ var parent = this._parentOutlet();
19425
+ if (parent) {
19426
+ parent._childOutlets.push(this);
19427
+ if (parent._outletState) {
19428
+ this.setOutletState(parent._outletState.outlets[this._outletName]);
19429
+ }
19430
+ }
19431
+ }),
19432
+
19433
+ willDestroy: function() {
19434
+ var parent = this._parentOutlet();
19435
+ if (parent) {
19436
+ parent._childOutlets.removeObject(this);
19437
+ }
19438
+ this._super();
19439
+ },
19440
+
19441
+
19442
+ _diffState: function(state) {
19443
+ while (state && emptyRouteState(state)) {
19444
+ state = state.outlets.main;
19445
+ }
19446
+ var different = !sameRouteState(this._outletState, state);
19447
+ this._outletState = state;
19448
+ return different;
19449
+ },
19510
19450
 
19511
- var OutletView = ContainerView['default'].extend(metamorph_view._Metamorph);
19451
+ setOutletState: function(state) {
19452
+ if (!this._diffState(state)) {
19453
+ var children = this._childOutlets;
19454
+ for (var i = 0 ; i < children.length; i++) {
19455
+ var child = children[i];
19456
+ child.setOutletState(this._outletState && this._outletState.outlets[child._outletName]);
19457
+ }
19458
+ } else {
19459
+ var view = this._buildView(this._outletState);
19460
+ var length = property_get.get(this, 'length');
19461
+ if (view) {
19462
+ this.replace(0, length, [view]);
19463
+ } else {
19464
+ this.replace(0, length , []);
19465
+ }
19466
+ }
19467
+ },
19468
+
19469
+ _buildView: function(state) {
19470
+ if (!state) { return; }
19471
+
19472
+ var LOG_VIEW_LOOKUPS = property_get.get(this, 'namespace.LOG_VIEW_LOOKUPS');
19473
+ var view;
19474
+ var render = state.render;
19475
+ var ViewClass = render.ViewClass;
19476
+ var isDefaultView = false;
19477
+
19478
+ if (!ViewClass) {
19479
+ isDefaultView = true;
19480
+ ViewClass = this.container.lookupFactory(this._isTopLevel ? 'view:toplevel' : 'view:default');
19481
+ }
19482
+
19483
+ view = ViewClass.create({
19484
+ _debugTemplateName: render.name,
19485
+ renderedName: render.name,
19486
+ controller: render.controller
19487
+ });
19488
+
19489
+ if (!property_get.get(view, 'template')) {
19490
+ view.set('template', render.template);
19491
+ }
19492
+
19493
+ if (LOG_VIEW_LOOKUPS) {
19494
+ Ember.Logger.info("Rendering " + render.name + " with " + (render.isDefaultView ? "default view " : "") + view, { fullName: 'view:' + render.name });
19495
+ }
19496
+
19497
+ return view;
19498
+ }
19499
+ });
19500
+
19501
+ function emptyRouteState(state) {
19502
+ return !state.render.ViewClass && !state.render.template;
19503
+ }
19504
+
19505
+ function sameRouteState(a, b) {
19506
+ if (!a && !b) {
19507
+ return true;
19508
+ }
19509
+ if (!a || !b) {
19510
+ return false;
19511
+ }
19512
+ a = a.render;
19513
+ b = b.render;
19514
+ for (var key in a) {
19515
+ if (a.hasOwnProperty(key)) {
19516
+ // name is only here for logging & debugging. If two different
19517
+ // names result in otherwise identical states, they're still
19518
+ // identical.
19519
+ if (a[key] !== b[key] && key !== 'name') {
19520
+ return false;
19521
+ }
19522
+ }
19523
+ }
19524
+ return true;
19525
+ }
19512
19526
 
19513
- exports.OutletView = OutletView;
19527
+ var OutletView = CoreOutletView.extend(metamorph_view._Metamorph);
19528
+
19529
+ exports.CoreOutletView = CoreOutletView;
19530
+ exports.OutletView = OutletView;
19514
19531
 
19515
19532
  });
19516
- enifed('ember-routing', ['exports', 'ember-metal/core', 'ember-routing/ext/run_loop', 'ember-routing/ext/controller', 'ember-routing/ext/view', 'ember-routing/location/api', 'ember-routing/location/none_location', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/system/generate_controller', 'ember-routing/system/controller_for', 'ember-routing/system/dsl', 'ember-routing/system/router', 'ember-routing/system/route'], function (exports, Ember, __dep1__, __dep2__, __dep3__, EmberLocation, NoneLocation, HashLocation, HistoryLocation, AutoLocation, generate_controller, controllerFor, RouterDSL, Router, Route) {
19533
+ enifed('ember-routing', ['exports', 'ember-metal/core', 'ember-routing/ext/run_loop', 'ember-routing/ext/controller', 'ember-routing/location/api', 'ember-routing/location/none_location', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/system/generate_controller', 'ember-routing/system/controller_for', 'ember-routing/system/dsl', 'ember-routing/system/router', 'ember-routing/system/route'], function (exports, Ember, __dep1__, __dep2__, EmberLocation, NoneLocation, HashLocation, HistoryLocation, AutoLocation, generate_controller, controllerFor, RouterDSL, Router, Route) {
19517
19534
 
19518
19535
  'use strict';
19519
19536
 
@@ -19894,157 +19911,6 @@ enifed('ember-routing/ext/run_loop', ['ember-metal/run_loop'], function (run) {
19894
19911
 
19895
19912
  run['default']._addQueue('routerTransitions', 'actions');
19896
19913
 
19897
- });
19898
- enifed('ember-routing/ext/view', ['exports', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/run_loop', 'ember-views/views/view'], function (exports, property_get, property_set, run, EmberView) {
19899
-
19900
- 'use strict';
19901
-
19902
- EmberView['default'].reopen({
19903
-
19904
- /**
19905
- Sets the private `_outlets` object on the view.
19906
-
19907
- @method init
19908
- */
19909
- init: function() {
19910
- this._outlets = {};
19911
- this._super.apply(this, arguments);
19912
- },
19913
-
19914
- /**
19915
- Manually fill any of a view's `{{outlet}}` areas with the
19916
- supplied view.
19917
-
19918
- Example
19919
-
19920
- ```javascript
19921
- var MyView = Ember.View.extend({
19922
- template: Ember.Handlebars.compile('Child view: {{outlet "main"}} ')
19923
- });
19924
- var myView = MyView.create();
19925
- myView.appendTo('body');
19926
- // The html for myView now looks like:
19927
- // <div id="ember228" class="ember-view">Child view: </div>
19928
-
19929
- var FooView = Ember.View.extend({
19930
- template: Ember.Handlebars.compile('<h1>Foo</h1> ')
19931
- });
19932
- var fooView = FooView.create();
19933
- myView.connectOutlet('main', fooView);
19934
- // The html for myView now looks like:
19935
- // <div id="ember228" class="ember-view">Child view:
19936
- // <div id="ember234" class="ember-view"><h1>Foo</h1> </div>
19937
- // </div>
19938
- ```
19939
- @method connectOutlet
19940
- @param {String} outletName A unique name for the outlet
19941
- @param {Object} view An Ember.View
19942
- */
19943
- connectOutlet: function(outletName, view) {
19944
- if (this._pendingDisconnections) {
19945
- delete this._pendingDisconnections[outletName];
19946
- }
19947
-
19948
- if (this._hasEquivalentView(outletName, view)) {
19949
- view.destroy();
19950
- return;
19951
- }
19952
-
19953
- var outlets = property_get.get(this, '_outlets');
19954
- var container = property_get.get(this, 'container');
19955
- var router = container && container.lookup('router:main');
19956
- var renderedName = property_get.get(view, 'renderedName');
19957
-
19958
- property_set.set(outlets, outletName, view);
19959
-
19960
- if (router && renderedName) {
19961
- router._connectActiveView(renderedName, view);
19962
- }
19963
- },
19964
-
19965
- /**
19966
- Determines if the view has already been created by checking if
19967
- the view has the same constructor, template, and context as the
19968
- view in the `_outlets` object.
19969
-
19970
- @private
19971
- @method _hasEquivalentView
19972
- @param {String} outletName The name of the outlet we are checking
19973
- @param {Object} view An Ember.View
19974
- @return {Boolean}
19975
- */
19976
- _hasEquivalentView: function(outletName, view) {
19977
- var existingView = property_get.get(this, '_outlets.'+outletName);
19978
- return existingView &&
19979
- existingView.constructor === view.constructor &&
19980
- existingView.get('template') === view.get('template') &&
19981
- existingView.get('context') === view.get('context');
19982
- },
19983
-
19984
- /**
19985
- Removes an outlet from the view.
19986
-
19987
- Example
19988
-
19989
- ```javascript
19990
- var MyView = Ember.View.extend({
19991
- template: Ember.Handlebars.compile('Child view: {{outlet "main"}} ')
19992
- });
19993
- var myView = MyView.create();
19994
- myView.appendTo('body');
19995
- // myView's html:
19996
- // <div id="ember228" class="ember-view">Child view: </div>
19997
-
19998
- var FooView = Ember.View.extend({
19999
- template: Ember.Handlebars.compile('<h1>Foo</h1> ')
20000
- });
20001
- var fooView = FooView.create();
20002
- myView.connectOutlet('main', fooView);
20003
- // myView's html:
20004
- // <div id="ember228" class="ember-view">Child view:
20005
- // <div id="ember234" class="ember-view"><h1>Foo</h1> </div>
20006
- // </div>
20007
-
20008
- myView.disconnectOutlet('main');
20009
- // myView's html:
20010
- // <div id="ember228" class="ember-view">Child view: </div>
20011
- ```
20012
-
20013
- @method disconnectOutlet
20014
- @param {String} outletName The name of the outlet to be removed
20015
- */
20016
- disconnectOutlet: function(outletName) {
20017
- if (!this._pendingDisconnections) {
20018
- this._pendingDisconnections = {};
20019
- }
20020
- this._pendingDisconnections[outletName] = true;
20021
- run['default'].once(this, '_finishDisconnections');
20022
- },
20023
-
20024
- /**
20025
- Gets an outlet that is pending disconnection and then
20026
- nullifies the object on the `_outlet` object.
20027
-
20028
- @private
20029
- @method _finishDisconnections
20030
- */
20031
- _finishDisconnections: function() {
20032
- if (this.isDestroyed) {
20033
- return; // _outlets will be gone anyway
20034
- }
20035
-
20036
- var outlets = property_get.get(this, '_outlets');
20037
- var pendingDisconnections = this._pendingDisconnections;
20038
- this._pendingDisconnections = null;
20039
-
20040
- for (var outletName in pendingDisconnections) {
20041
- property_set.set(outlets, outletName, null);
20042
- }
20043
- }
20044
- });
20045
-
20046
- exports['default'] = EmberView['default'];
20047
-
20048
19914
  });
20049
19915
  enifed('ember-routing/location/api', ['exports', 'ember-metal/core', 'ember-metal/environment'], function (exports, Ember, environment) {
20050
19916
 
@@ -21532,6 +21398,7 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
21532
21398
  @method enter
21533
21399
  */
21534
21400
  enter: function() {
21401
+ this.connections = [];
21535
21402
  this.activate();
21536
21403
  this.trigger('activate');
21537
21404
  },
@@ -22937,6 +22804,7 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
22937
22804
  Ember['default'].assert("The name in the given arguments is undefined", arguments.length > 0 ? !isNone['default'](arguments[0]) : true);
22938
22805
 
22939
22806
  var namePassed = typeof _name === 'string' && !!_name;
22807
+ var isDefaultRender = arguments.length === 0 || Ember['default'].isEmpty(arguments[0]);
22940
22808
  var name;
22941
22809
 
22942
22810
  if (typeof _name === 'object' && !options) {
@@ -22946,53 +22814,9 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
22946
22814
  name = _name;
22947
22815
  }
22948
22816
 
22949
- var templateName;
22950
-
22951
- if (name) {
22952
- name = name.replace(/\//g, '.');
22953
- templateName = name;
22954
- } else {
22955
- name = this.routeName;
22956
- templateName = this.templateName || name;
22957
- }
22958
-
22959
- var renderOptions = buildRenderOptions(this, namePassed, name, options);
22960
-
22961
- var LOG_VIEW_LOOKUPS = property_get.get(this.router, 'namespace.LOG_VIEW_LOOKUPS');
22962
- var viewName = options && options.view || namePassed && name || this.viewName || name;
22963
- var view, template;
22964
-
22965
- var ViewClass = this.container.lookupFactory('view:' + viewName);
22966
- if (ViewClass) {
22967
- view = setupView(ViewClass, renderOptions);
22968
- if (!property_get.get(view, 'template')) {
22969
- view.set('template', this.container.lookup('template:' + templateName));
22970
- }
22971
- if (LOG_VIEW_LOOKUPS) {
22972
- Ember['default'].Logger.info("Rendering " + renderOptions.name + " with " + view, { fullName: 'view:' + renderOptions.name });
22973
- }
22974
- } else {
22975
- template = this.container.lookup('template:' + templateName);
22976
- if (!template) {
22977
- Ember['default'].assert("Could not find \"" + name + "\" template or view.", arguments.length === 0 || Ember['default'].isEmpty(arguments[0]));
22978
- if (LOG_VIEW_LOOKUPS) {
22979
- Ember['default'].Logger.info("Could not find \"" + name + "\" template or view. Nothing will be rendered", { fullName: 'template:' + name });
22980
- }
22981
- return;
22982
- }
22983
- var defaultView = renderOptions.into ? 'view:default' : 'view:toplevel';
22984
- ViewClass = this.container.lookupFactory(defaultView);
22985
- view = setupView(ViewClass, renderOptions);
22986
- if (!property_get.get(view, 'template')) {
22987
- view.set('template', template);
22988
- }
22989
- if (LOG_VIEW_LOOKUPS) {
22990
- Ember['default'].Logger.info("Rendering " + renderOptions.name + " with default view " + view, { fullName: 'view:' + renderOptions.name });
22991
- }
22992
- }
22993
-
22994
- if (renderOptions.outlet === 'main') { this.lastRenderedTemplate = name; }
22995
- appendView(this, view, renderOptions);
22817
+ var renderOptions = buildRenderOptions(this, namePassed, isDefaultRender, name, options);
22818
+ this.connections.push(renderOptions);
22819
+ run['default'].once(this.router, '_setOutlets');
22996
22820
  },
22997
22821
 
22998
22822
  /**
@@ -23039,16 +22863,31 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
23039
22863
  @param {Object|String} options the options hash or outlet name
23040
22864
  */
23041
22865
  disconnectOutlet: function(options) {
22866
+ var outletName;
22867
+ var parentView;
22868
+ var parent;
23042
22869
  if (!options || typeof options === "string") {
23043
- var outletName = options;
23044
- options = {};
23045
- options.outlet = outletName;
22870
+ outletName = options;
22871
+ } else {
22872
+ outletName = options.outlet;
22873
+ parentView = options.parentView;
22874
+ }
22875
+
22876
+ parentView = parentView && parentView.replace(/\//g, '.');
22877
+ parent = parentRoute(this);
22878
+ if (parent && parentView === parent.routeName) {
22879
+ parentView = undefined;
23046
22880
  }
23047
- options.parentView = options.parentView ? options.parentView.replace(/\//g, '.') : parentTemplate(this);
23048
- options.outlet = options.outlet || 'main';
22881
+ outletName = outletName || 'main';
23049
22882
 
23050
- var parentView = this.router._lookupActiveView(options.parentView);
23051
- if (parentView) { parentView.disconnectOutlet(options.outlet); }
22883
+ for (var i = 0; i < this.connections.length; i++) {
22884
+ var connection = this.connections[i];
22885
+ if (connection.outlet === outletName && connection.into === parentView) {
22886
+ this.connections.splice(i, 1);
22887
+ run['default'].once(this.router, '_setOutlets');
22888
+ return;
22889
+ }
22890
+ }
23052
22891
  },
23053
22892
 
23054
22893
  willDestroy: function() {
@@ -23061,18 +22900,10 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
23061
22900
  @method teardownViews
23062
22901
  */
23063
22902
  teardownViews: function() {
23064
- // Tear down the top level view
23065
- if (this.teardownTopLevelView) { this.teardownTopLevelView(); }
23066
-
23067
- // Tear down any outlets rendered with 'into'
23068
- var teardownOutletViews = this.teardownOutletViews || [];
23069
- enumerable_utils.forEach(teardownOutletViews, function(teardownOutletView) {
23070
- teardownOutletView();
23071
- });
23072
-
23073
- delete this.teardownTopLevelView;
23074
- delete this.teardownOutletViews;
23075
- delete this.lastRenderedTemplate;
22903
+ if (this.connections && this.connections.length > 0) {
22904
+ this.connections = [];
22905
+ run['default'].once(this.router, '_setOutlets');
22906
+ }
23076
22907
  }
23077
22908
  });
23078
22909
 
@@ -23098,21 +22929,23 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
23098
22929
  }
23099
22930
  }
23100
22931
 
23101
- function parentTemplate(route) {
23102
- var parent = parentRoute(route);
22932
+ function buildRenderOptions(route, namePassed, isDefaultRender, name, options) {
22933
+ var controller = options && options.controller;
22934
+ var templateName;
22935
+ var viewName;
22936
+ var ViewClass;
23103
22937
  var template;
22938
+ var LOG_VIEW_LOOKUPS = property_get.get(route.router, 'namespace.LOG_VIEW_LOOKUPS');
22939
+ var into = options && options.into && options.into.replace(/\//g, '.');
22940
+ var outlet = (options && options.outlet) || 'main';
23104
22941
 
23105
- if (!parent) { return; }
23106
-
23107
- if (template = parent.lastRenderedTemplate) {
23108
- return template;
22942
+ if (name) {
22943
+ name = name.replace(/\//g, '.');
22944
+ templateName = name;
23109
22945
  } else {
23110
- return parentTemplate(parent);
22946
+ name = route.routeName;
22947
+ templateName = route.templateName || name;
23111
22948
  }
23112
- }
23113
-
23114
- function buildRenderOptions(route, namePassed, name, options) {
23115
- var controller = options && options.controller;
23116
22949
 
23117
22950
  if (!controller) {
23118
22951
  if (namePassed) {
@@ -23134,55 +22967,33 @@ enifed('ember-routing/system/route', ['exports', 'ember-metal/core', 'ember-meta
23134
22967
  controller.set('model', options.model);
23135
22968
  }
23136
22969
 
23137
- var renderOptions = {
23138
- into: options && options.into ? options.into.replace(/\//g, '.') : parentTemplate(route),
23139
- outlet: (options && options.outlet) || 'main',
23140
- name: name,
23141
- controller: controller
23142
- };
23143
-
23144
- Ember['default'].assert("An outlet ("+renderOptions.outlet+") was specified but was not found.", renderOptions.outlet === 'main' || renderOptions.into);
23145
-
23146
- return renderOptions;
23147
- }
23148
-
23149
- function setupView(ViewClass, options) {
23150
- return ViewClass.create({
23151
- _debugTemplateName: options.name,
23152
- renderedName: options.name,
23153
- controller: options.controller
23154
- });
23155
- }
23156
-
23157
- function appendView(route, view, options) {
23158
- if (options.into) {
23159
- var parentView = route.router._lookupActiveView(options.into);
23160
- var teardownOutletView = generateOutletTeardown(parentView, options.outlet);
23161
- if (!route.teardownOutletViews) { route.teardownOutletViews = []; }
23162
- enumerable_utils.replace(route.teardownOutletViews, 0, 0, [teardownOutletView]);
23163
- parentView.connectOutlet(options.outlet, view);
23164
- } else {
23165
- // tear down view if one is already rendered
23166
- if (route.teardownTopLevelView) {
23167
- route.teardownTopLevelView();
22970
+ viewName = options && options.view || namePassed && name || route.viewName || name;
22971
+ ViewClass = route.container.lookupFactory('view:' + viewName);
22972
+ template = route.container.lookup('template:' + templateName);
22973
+ if (!ViewClass && !template) {
22974
+ Ember['default'].assert("Could not find \"" + name + "\" template or view.", isDefaultRender);
22975
+ if (LOG_VIEW_LOOKUPS) {
22976
+ Ember['default'].Logger.info("Could not find \"" + name + "\" template or view. Nothing will be rendered", { fullName: 'template:' + name });
23168
22977
  }
22978
+ }
23169
22979
 
23170
- route.router._connectActiveView(options.name, view);
23171
- route.teardownTopLevelView = function() { view.destroy(); };
22980
+ Ember['default'].assert("An outlet ("+outlet+") was specified but was not found.", outlet === 'main' || into);
23172
22981
 
23173
- // Notify the application instance that we have created the root-most
23174
- // view. It is the responsibility of the instance to tell the root view
23175
- // how to render, typically by appending it to the application's
23176
- // `rootElement`.
23177
- var instance = route.container.lookup('-application-instance:main');
23178
- instance.didCreateRootView(view);
22982
+ var parent;
22983
+ if (into && (parent = parentRoute(route)) && into === parentRoute(route).routeName) {
22984
+ into = undefined;
23179
22985
  }
23180
- }
23181
22986
 
23182
- function generateOutletTeardown(parentView, outlet) {
23183
- return function() {
23184
- parentView.disconnectOutlet(outlet);
22987
+ var renderOptions = {
22988
+ into: into,
22989
+ outlet: outlet,
22990
+ name: name,
22991
+ controller: controller,
22992
+ ViewClass: ViewClass,
22993
+ template: template
23185
22994
  };
22995
+
22996
+ return renderOptions;
23186
22997
  }
23187
22998
 
23188
22999
  function getFullQueryParams(router, state) {
@@ -23395,6 +23206,38 @@ enifed('ember-routing/system/router', ['exports', 'ember-metal/core', 'ember-met
23395
23206
  }
23396
23207
  },
23397
23208
 
23209
+ _setOutlets: function() {
23210
+ var handlerInfos = this.router.currentHandlerInfos;
23211
+ var route;
23212
+ var defaultParentState;
23213
+ var liveRoutes = null;
23214
+
23215
+ if (!handlerInfos) {
23216
+ return;
23217
+ }
23218
+
23219
+ for (var i = 0; i < handlerInfos.length; i++) {
23220
+ route = handlerInfos[i].handler;
23221
+ var connections = normalizedConnections(route);
23222
+ var ownState;
23223
+ for (var j = 0; j < connections.length; j++) {
23224
+ var appended = appendLiveRoute(liveRoutes, defaultParentState, connections[j]);
23225
+ liveRoutes = appended.liveRoutes;
23226
+ if (appended.ownState.render.name === route.routeName) {
23227
+ ownState = appended.ownState;
23228
+ }
23229
+ }
23230
+ defaultParentState = ownState;
23231
+ }
23232
+ if (!this._toplevelView) {
23233
+ var OutletView = this.container.lookupFactory('view:-outlet');
23234
+ this._toplevelView = OutletView.create({ _isTopLevel: true });
23235
+ var instance = this.container.lookup('-application-instance:main');
23236
+ instance.didCreateRootView(this._toplevelView);
23237
+ }
23238
+ this._toplevelView.setOutletState(liveRoutes);
23239
+ },
23240
+
23398
23241
  /**
23399
23242
  Handles notifying any listeners of an impending URL
23400
23243
  change.
@@ -23523,6 +23366,10 @@ enifed('ember-routing/system/router', ['exports', 'ember-metal/core', 'ember-met
23523
23366
  },
23524
23367
 
23525
23368
  willDestroy: function() {
23369
+ if (this._toplevelView) {
23370
+ this._toplevelView.destroy();
23371
+ this._toplevelView = null;
23372
+ }
23526
23373
  this._super.apply(this, arguments);
23527
23374
  this.reset();
23528
23375
  },
@@ -24156,6 +24003,74 @@ enifed('ember-routing/system/router', ['exports', 'ember-metal/core', 'ember-met
24156
24003
  }
24157
24004
  }
24158
24005
 
24006
+ function findLiveRoute(liveRoutes, name) {
24007
+ if (!liveRoutes) { return; }
24008
+ var stack = [liveRoutes];
24009
+ while (stack.length > 0) {
24010
+ var test = stack.shift();
24011
+ if (test.render.name === name) {
24012
+ return test;
24013
+ }
24014
+ var outlets = test.outlets;
24015
+ for (var outletName in outlets) {
24016
+ stack.push(outlets[outletName]);
24017
+ }
24018
+ }
24019
+ }
24020
+
24021
+ function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) {
24022
+ var target;
24023
+ var myState = {
24024
+ render: renderOptions,
24025
+ outlets: create['default'](null)
24026
+ };
24027
+ if (renderOptions.into) {
24028
+ target = findLiveRoute(liveRoutes, renderOptions.into);
24029
+ } else {
24030
+ target = defaultParentState;
24031
+ }
24032
+ if (target) {
24033
+ property_set.set(target.outlets, renderOptions.outlet, myState);
24034
+ } else {
24035
+ Ember['default'].assert("You attempted to render into '" + renderOptions.into + "' but it was not found", !renderOptions.into);
24036
+ liveRoutes = myState;
24037
+ }
24038
+ return {
24039
+ liveRoutes: liveRoutes,
24040
+ ownState: myState
24041
+ };
24042
+ }
24043
+
24044
+ function normalizedConnections(route) {
24045
+ var connections = route.connections;
24046
+ var mainConnections = [];
24047
+ var otherConnections = [];
24048
+
24049
+ for (var i = 0; i < connections.length; i++) {
24050
+ var connection = connections[i];
24051
+ if (connection.outlet === 'main') {
24052
+ mainConnections.push(connection);
24053
+ } else {
24054
+ otherConnections.push(connection);
24055
+ }
24056
+ }
24057
+
24058
+ if (mainConnections.length === 0) {
24059
+ // There's always an entry to represent the route, even if it
24060
+ // doesn't actually render anything into its own
24061
+ // template. This gives other routes a place to target.
24062
+ mainConnections.push({
24063
+ name: route.routeName,
24064
+ outlet: 'main'
24065
+ });
24066
+ }
24067
+
24068
+ // We process main connections first, because a main connection may
24069
+ // be targeted by other connections.
24070
+ return mainConnections.concat(otherConnections);
24071
+ }
24072
+
24073
+
24159
24074
  exports['default'] = EmberRouter;
24160
24075
 
24161
24076
  });
@@ -28632,7 +28547,7 @@ enifed('ember-runtime/mixins/enumerable', ['exports', 'ember-metal/core', 'ember
28632
28547
 
28633
28548
  /**
28634
28549
  Returns an array with all of the items in the enumeration where the passed
28635
- function returns false for. This method is the inverse of filter().
28550
+ function returns true. This method is the inverse of filter().
28636
28551
 
28637
28552
  The callback method you provide should have the following signature (all
28638
28553
  parameters are optional):
@@ -34237,7 +34152,7 @@ enifed('ember-template-compiler/compat', ['ember-metal/core', 'ember-template-co
34237
34152
  EmberHandlebars.template = template['default'];
34238
34153
 
34239
34154
  });
34240
- enifed('ember-template-compiler/compat/precompile', ['exports'], function (exports) {
34155
+ enifed('ember-template-compiler/compat/precompile', ['exports', 'ember-template-compiler/system/compile_options'], function (exports, compileOptions) {
34241
34156
 
34242
34157
  'use strict';
34243
34158
 
@@ -34245,7 +34160,6 @@ enifed('ember-template-compiler/compat/precompile', ['exports'], function (expor
34245
34160
  @module ember
34246
34161
  @submodule ember-template-compiler
34247
34162
  */
34248
-
34249
34163
  var compile, compileSpec;
34250
34164
 
34251
34165
  exports['default'] = function(string) {
@@ -34263,7 +34177,7 @@ enifed('ember-template-compiler/compat/precompile', ['exports'], function (expor
34263
34177
  var asObject = arguments[1] === undefined ? true : arguments[1];
34264
34178
  var compileFunc = asObject ? compile : compileSpec;
34265
34179
 
34266
- return compileFunc(string);
34180
+ return compileFunc(string, compileOptions['default']());
34267
34181
  }
34268
34182
 
34269
34183
  });
@@ -34486,11 +34400,10 @@ enifed('ember-template-compiler/system/compile_options', ['exports', 'ember-meta
34486
34400
 
34487
34401
  exports['default'] = function() {
34488
34402
  var disableComponentGeneration = true;
34489
- if (Ember['default'].FEATURES.isEnabled('ember-htmlbars-component-generation')) {
34490
- disableComponentGeneration = false;
34491
- }
34492
-
34403
+
34493
34404
  return {
34405
+ revision: 'Ember@1.11.0-beta.2',
34406
+
34494
34407
  disableComponentGeneration: disableComponentGeneration,
34495
34408
 
34496
34409
  plugins: plugins['default']
@@ -34920,44 +34833,7 @@ enifed('ember-testing/helpers', ['ember-metal/core', 'ember-metal/property_get',
34920
34833
  */
34921
34834
  asyncHelper('click', click);
34922
34835
 
34923
- if (Ember['default'].FEATURES.isEnabled('ember-testing-checkbox-helpers')) {
34924
- /**
34925
- * Checks a checkbox. Ensures the presence of the `checked` attribute
34926
- *
34927
- * Example:
34928
- *
34929
- * ```javascript
34930
- * check('#remember-me').then(function() {
34931
- * // assert something
34932
- * });
34933
- * ```
34934
- *
34935
- * @method check
34936
- * @param {String} selector jQuery selector finding an `input[type="checkbox"]`
34937
- * element on the DOM to check
34938
- * @return {RSVP.Promise}
34939
- */
34940
- asyncHelper('check', check);
34941
-
34942
- /**
34943
- * Unchecks a checkbox. Ensures the absence of the `checked` attribute
34944
- *
34945
- * Example:
34946
- *
34947
- * ```javascript
34948
- * uncheck('#remember-me').then(function() {
34949
- * // assert something
34950
- * });
34951
- * ```
34952
- *
34953
- * @method check
34954
- * @param {String} selector jQuery selector finding an `input[type="checkbox"]`
34955
- * element on the DOM to uncheck
34956
- * @return {RSVP.Promise}
34957
- */
34958
- asyncHelper('uncheck', uncheck);
34959
- }
34960
- /**
34836
+ /**
34961
34837
  * Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode
34962
34838
  *
34963
34839
  * Example:
@@ -35960,7 +35836,11 @@ enifed('ember-views/attr_nodes/legacy_bind', ['exports', './attr_node', 'ember-r
35960
35836
  }
35961
35837
  var value = streams__utils.read(this.attrValue);
35962
35838
 
35963
- if (this.attrName === 'value' && (value === null || value === undefined)) {
35839
+ if (value === undefined) {
35840
+ value = null;
35841
+ }
35842
+
35843
+ if (this.attrName === 'value' && value === null) {
35964
35844
  value = '';
35965
35845
  }
35966
35846
 
@@ -36007,6 +35887,285 @@ enifed('ember-views/component_lookup', ['exports', 'ember-runtime/system/object'
36007
35887
  }
36008
35888
  });
36009
35889
 
35890
+ });
35891
+ enifed('ember-views/mixins/attribute_bindings_support', ['exports', 'ember-metal/mixin', 'ember-views/attr_nodes/attr_node', 'ember-metal/properties', 'ember-views/system/platform', 'ember-metal/streams/utils', 'ember-metal/property_set'], function (exports, mixin, AttrNode, properties, platform, utils, property_set) {
35892
+
35893
+ 'use strict';
35894
+
35895
+ var EMPTY_ARRAY = [];
35896
+
35897
+ var AttributeBindingsSupport = mixin.Mixin.create({
35898
+ concatenatedProperties: ['attributeBindings'],
35899
+
35900
+ /**
35901
+ A list of properties of the view to apply as attributes. If the property is
35902
+ a string value, the value of that string will be applied as the attribute.
35903
+
35904
+ ```javascript
35905
+ // Applies the type attribute to the element
35906
+ // with the value "button", like <div type="button">
35907
+ Ember.View.extend({
35908
+ attributeBindings: ['type'],
35909
+ type: 'button'
35910
+ });
35911
+ ```
35912
+
35913
+ If the value of the property is a Boolean, the name of that property is
35914
+ added as an attribute.
35915
+
35916
+ ```javascript
35917
+ // Renders something like <div enabled="enabled">
35918
+ Ember.View.extend({
35919
+ attributeBindings: ['enabled'],
35920
+ enabled: true
35921
+ });
35922
+ ```
35923
+
35924
+ @property attributeBindings
35925
+ */
35926
+ attributeBindings: EMPTY_ARRAY,
35927
+
35928
+ _unspecifiedAttributeBindings: null,
35929
+
35930
+ /**
35931
+ Iterates through the view's attribute bindings, sets up observers for each,
35932
+ then applies the current value of the attributes to the passed render buffer.
35933
+
35934
+ @method _applyAttributeBindings
35935
+ @param {Ember.RenderBuffer} buffer
35936
+ @param {Array} attributeBindings
35937
+ @private
35938
+ */
35939
+ _applyAttributeBindings: function(buffer) {
35940
+ var attributeBindings = this.attributeBindings;
35941
+
35942
+ if (!attributeBindings || !attributeBindings.length) { return; }
35943
+
35944
+ var unspecifiedAttributeBindings = this._unspecifiedAttributeBindings = this._unspecifiedAttributeBindings || {};
35945
+
35946
+ var binding, colonIndex, property, attrName, attrNode, attrValue;
35947
+ var i, l;
35948
+ for (i=0, l=attributeBindings.length; i<l; i++) {
35949
+ binding = attributeBindings[i];
35950
+ colonIndex = binding.indexOf(':');
35951
+ if (colonIndex === -1) {
35952
+ property = binding;
35953
+ attrName = binding;
35954
+ } else {
35955
+ property = binding.substring(0, colonIndex);
35956
+ attrName = binding.substring(colonIndex + 1);
35957
+ }
35958
+
35959
+ Ember.assert('You cannot use class as an attributeBinding, use classNameBindings instead.', attrName !== 'class');
35960
+
35961
+ if (property in this) {
35962
+ attrValue = this.getStream('view.'+property);
35963
+ attrNode = new AttrNode['default'](attrName, attrValue);
35964
+ this.appendAttr(attrNode);
35965
+ if (!platform.canSetNameOnInputs && attrName === 'name') {
35966
+ buffer.attr('name', utils.read(attrValue));
35967
+ }
35968
+ } else {
35969
+ unspecifiedAttributeBindings[property] = attrName;
35970
+ }
35971
+ }
35972
+
35973
+ // Lazily setup setUnknownProperty after attributeBindings are initially applied
35974
+ this.setUnknownProperty = this._setUnknownProperty;
35975
+ },
35976
+
35977
+ /**
35978
+ We're using setUnknownProperty as a hook to setup attributeBinding observers for
35979
+ properties that aren't defined on a view at initialization time.
35980
+
35981
+ Note: setUnknownProperty will only be called once for each property.
35982
+
35983
+ @method setUnknownProperty
35984
+ @param key
35985
+ @param value
35986
+ @private
35987
+ */
35988
+ setUnknownProperty: null, // Gets defined after initialization by _applyAttributeBindings
35989
+
35990
+ _setUnknownProperty: function(key, value) {
35991
+ var attrName = this._unspecifiedAttributeBindings && this._unspecifiedAttributeBindings[key];
35992
+
35993
+ properties.defineProperty(this, key);
35994
+
35995
+ if (attrName) {
35996
+ var attrValue = this.getStream('view.'+key);
35997
+ var attrNode = new AttrNode['default'](attrName, attrValue);
35998
+ this.appendAttr(attrNode);
35999
+ }
36000
+ return property_set.set(this, key, value);
36001
+ }
36002
+ });
36003
+
36004
+ exports['default'] = AttributeBindingsSupport;
36005
+
36006
+ });
36007
+ enifed('ember-views/mixins/class_names_support', ['exports', 'ember-metal/core', 'ember-metal/mixin', 'ember-runtime/system/native_array', 'ember-metal/enumerable_utils', 'ember-metal/streams/utils', 'ember-views/streams/class_name_binding', 'ember-metal/utils'], function (exports, Ember, mixin, native_array, enumerable_utils, utils, class_name_binding, ember_metal__utils) {
36008
+
36009
+ 'use strict';
36010
+
36011
+ var EMPTY_ARRAY = [];
36012
+
36013
+ var ClassNamesSupport = mixin.Mixin.create({
36014
+ concatenatedProperties: ['classNames', 'classNameBindings'],
36015
+
36016
+ init: function() {
36017
+ this._super.apply(this, arguments);
36018
+
36019
+ Ember['default'].assert("Only arrays are allowed for 'classNameBindings'", ember_metal__utils.typeOf(this.classNameBindings) === 'array');
36020
+ this.classNameBindings = native_array.A(this.classNameBindings.slice());
36021
+
36022
+ Ember['default'].assert("Only arrays of static class strings are allowed for 'classNames'. For dynamic classes, use 'classNameBindings'.", ember_metal__utils.typeOf(this.classNames) === 'array');
36023
+ this.classNames = native_array.A(this.classNames.slice());
36024
+ },
36025
+
36026
+ /**
36027
+ Standard CSS class names to apply to the view's outer element. This
36028
+ property automatically inherits any class names defined by the view's
36029
+ superclasses as well.
36030
+
36031
+ @property classNames
36032
+ @type Array
36033
+ @default ['ember-view']
36034
+ */
36035
+ classNames: ['ember-view'],
36036
+
36037
+ /**
36038
+ A list of properties of the view to apply as class names. If the property
36039
+ is a string value, the value of that string will be applied as a class
36040
+ name.
36041
+
36042
+ ```javascript
36043
+ // Applies the 'high' class to the view element
36044
+ Ember.View.extend({
36045
+ classNameBindings: ['priority']
36046
+ priority: 'high'
36047
+ });
36048
+ ```
36049
+
36050
+ If the value of the property is a Boolean, the name of that property is
36051
+ added as a dasherized class name.
36052
+
36053
+ ```javascript
36054
+ // Applies the 'is-urgent' class to the view element
36055
+ Ember.View.extend({
36056
+ classNameBindings: ['isUrgent']
36057
+ isUrgent: true
36058
+ });
36059
+ ```
36060
+
36061
+ If you would prefer to use a custom value instead of the dasherized
36062
+ property name, you can pass a binding like this:
36063
+
36064
+ ```javascript
36065
+ // Applies the 'urgent' class to the view element
36066
+ Ember.View.extend({
36067
+ classNameBindings: ['isUrgent:urgent']
36068
+ isUrgent: true
36069
+ });
36070
+ ```
36071
+
36072
+ This list of properties is inherited from the view's superclasses as well.
36073
+
36074
+ @property classNameBindings
36075
+ @type Array
36076
+ @default []
36077
+ */
36078
+ classNameBindings: EMPTY_ARRAY,
36079
+
36080
+ /**
36081
+ Iterates over the view's `classNameBindings` array, inserts the value
36082
+ of the specified property into the `classNames` array, then creates an
36083
+ observer to update the view's element if the bound property ever changes
36084
+ in the future.
36085
+
36086
+ @method _applyClassNameBindings
36087
+ @private
36088
+ */
36089
+ _applyClassNameBindings: function() {
36090
+ var classBindings = this.classNameBindings;
36091
+
36092
+ if (!classBindings || !classBindings.length) { return; }
36093
+
36094
+ var classNames = this.classNames;
36095
+ var elem, newClass, dasherizedClass;
36096
+
36097
+ // Loop through all of the configured bindings. These will be either
36098
+ // property names ('isUrgent') or property paths relative to the view
36099
+ // ('content.isUrgent')
36100
+ enumerable_utils.forEach(classBindings, function(binding) {
36101
+
36102
+ var boundBinding;
36103
+ if (utils.isStream(binding)) {
36104
+ boundBinding = binding;
36105
+ } else {
36106
+ boundBinding = class_name_binding.streamifyClassNameBinding(this, binding, '_view.');
36107
+ }
36108
+
36109
+ // Variable in which the old class value is saved. The observer function
36110
+ // closes over this variable, so it knows which string to remove when
36111
+ // the property changes.
36112
+ var oldClass;
36113
+
36114
+ // Set up an observer on the context. If the property changes, toggle the
36115
+ // class name.
36116
+ var observer = this._wrapAsScheduled(function() {
36117
+ // Get the current value of the property
36118
+ elem = this.$();
36119
+ newClass = utils.read(boundBinding);
36120
+
36121
+ // If we had previously added a class to the element, remove it.
36122
+ if (oldClass) {
36123
+ elem.removeClass(oldClass);
36124
+ // Also remove from classNames so that if the view gets rerendered,
36125
+ // the class doesn't get added back to the DOM.
36126
+ classNames.removeObject(oldClass);
36127
+ }
36128
+
36129
+ // If necessary, add a new class. Make sure we keep track of it so
36130
+ // it can be removed in the future.
36131
+ if (newClass) {
36132
+ elem.addClass(newClass);
36133
+ oldClass = newClass;
36134
+ } else {
36135
+ oldClass = null;
36136
+ }
36137
+ });
36138
+
36139
+ // Get the class name for the property at its current value
36140
+ dasherizedClass = utils.read(boundBinding);
36141
+
36142
+ if (dasherizedClass) {
36143
+ // Ensure that it gets into the classNames array
36144
+ // so it is displayed when we render.
36145
+ enumerable_utils.addObject(classNames, dasherizedClass);
36146
+
36147
+ // Save a reference to the class name so we can remove it
36148
+ // if the observer fires. Remember that this variable has
36149
+ // been closed over by the observer.
36150
+ oldClass = dasherizedClass;
36151
+ }
36152
+
36153
+ utils.subscribe(boundBinding, observer, this);
36154
+ // Remove className so when the view is rerendered,
36155
+ // the className is added based on binding reevaluation
36156
+ this.one('willClearRender', function() {
36157
+ if (oldClass) {
36158
+ classNames.removeObject(oldClass);
36159
+ oldClass = null;
36160
+ }
36161
+ });
36162
+
36163
+ }, this);
36164
+ }
36165
+ });
36166
+
36167
+ exports['default'] = ClassNamesSupport;
36168
+
36010
36169
  });
36011
36170
  enifed('ember-views/mixins/component_template_deprecation', ['exports', 'ember-metal/core', 'ember-metal/property_get', 'ember-metal/mixin'], function (exports, Ember, property_get, mixin) {
36012
36171
 
@@ -36057,6 +36216,117 @@ enifed('ember-views/mixins/component_template_deprecation', ['exports', 'ember-m
36057
36216
  }
36058
36217
  });
36059
36218
 
36219
+ });
36220
+ enifed('ember-views/mixins/instrumentation_support', ['exports', 'ember-metal/mixin', 'ember-metal/computed', 'ember-metal/property_get'], function (exports, mixin, computed, property_get) {
36221
+
36222
+ 'use strict';
36223
+
36224
+ var InstrumentationSupport = mixin.Mixin.create({
36225
+ /**
36226
+ Used to identify this view during debugging
36227
+
36228
+ @property instrumentDisplay
36229
+ @type String
36230
+ */
36231
+ instrumentDisplay: computed.computed(function() {
36232
+ if (this.helperName) {
36233
+ return '{{' + this.helperName + '}}';
36234
+ }
36235
+ }),
36236
+
36237
+ instrumentName: 'view',
36238
+
36239
+ instrumentDetails: function(hash) {
36240
+ hash.template = property_get.get(this, 'templateName');
36241
+ this._super(hash);
36242
+ }
36243
+ });
36244
+
36245
+ exports['default'] = InstrumentationSupport;
36246
+
36247
+ });
36248
+ enifed('ember-views/mixins/legacy_view_support', ['exports', 'ember-metal/core', 'ember-metal/mixin', 'ember-metal/property_get'], function (exports, Ember, mixin, property_get) {
36249
+
36250
+ 'use strict';
36251
+
36252
+ var LegacyViewSupport = mixin.Mixin.create({
36253
+ beforeRender: function(buffer) {},
36254
+
36255
+ afterRender: function(buffer) {},
36256
+
36257
+ mutateChildViews: function(callback) {
36258
+ var childViews = this._childViews;
36259
+ var idx = childViews.length;
36260
+ var view;
36261
+
36262
+ while (--idx >= 0) {
36263
+ view = childViews[idx];
36264
+ callback(this, view, idx);
36265
+ }
36266
+
36267
+ return this;
36268
+ },
36269
+
36270
+ /**
36271
+ Removes all children from the `parentView`.
36272
+
36273
+ @method removeAllChildren
36274
+ @return {Ember.View} receiver
36275
+ */
36276
+ removeAllChildren: function() {
36277
+ return this.mutateChildViews(function(parentView, view) {
36278
+ parentView.removeChild(view);
36279
+ });
36280
+ },
36281
+
36282
+ destroyAllChildren: function() {
36283
+ return this.mutateChildViews(function(parentView, view) {
36284
+ view.destroy();
36285
+ });
36286
+ },
36287
+
36288
+ /**
36289
+ Return the nearest ancestor whose parent is an instance of
36290
+ `klass`.
36291
+
36292
+ @method nearestChildOf
36293
+ @param {Class} klass Subclass of Ember.View (or Ember.View itself)
36294
+ @return Ember.View
36295
+ @deprecated
36296
+ */
36297
+ nearestChildOf: function(klass) {
36298
+ Ember['default'].deprecate("nearestChildOf has been deprecated.");
36299
+
36300
+ var view = property_get.get(this, 'parentView');
36301
+
36302
+ while (view) {
36303
+ if (property_get.get(view, 'parentView') instanceof klass) { return view; }
36304
+ view = property_get.get(view, 'parentView');
36305
+ }
36306
+ },
36307
+
36308
+ /**
36309
+ Return the nearest ancestor that is an instance of the provided
36310
+ class.
36311
+
36312
+ @method nearestInstanceOf
36313
+ @param {Class} klass Subclass of Ember.View (or Ember.View itself)
36314
+ @return Ember.View
36315
+ @deprecated
36316
+ */
36317
+ nearestInstanceOf: function(klass) {
36318
+ Ember['default'].deprecate("nearestInstanceOf is deprecated and will be removed from future releases. Use nearestOfType.");
36319
+ var view = property_get.get(this, 'parentView');
36320
+
36321
+ while (view) {
36322
+ if (view instanceof klass) { return view; }
36323
+ view = property_get.get(view, 'parentView');
36324
+ }
36325
+ }
36326
+ });
36327
+
36328
+ exports['default'] = LegacyViewSupport;
36329
+
36060
36330
  });
36061
36331
  enifed('ember-views/mixins/normalized_rerender_if_needed', ['exports', 'ember-metal/property_get', 'ember-metal/mixin', 'ember-metal/merge', 'ember-views/views/states'], function (exports, property_get, mixin, merge, views__states) {
36062
36332
 
@@ -36095,6 +36365,43 @@ enifed('ember-views/mixins/normalized_rerender_if_needed', ['exports', 'ember-me
36095
36365
  }
36096
36366
  });
36097
36367
 
36368
+ });
36369
+ enifed('ember-views/mixins/template_rendering_support', ['exports', 'ember-metal/mixin', 'ember-metal/property_get'], function (exports, mixin, property_get) {
36370
+
36371
+ 'use strict';
36372
+
36373
+ var _renderView;
36374
+ function renderView(view, buffer, template) {
36375
+ if (_renderView === undefined) {
36376
+ _renderView = eriuqer('ember-htmlbars/system/render-view')['default'];
36377
+ }
36378
+ _renderView(view, buffer, template);
36379
+ }
36380
+
36381
+ var TemplateRenderingSupport = mixin.Mixin.create({
36382
+ /**
36383
+ Called on your view when it should push strings of HTML into a
36384
+ `Ember.RenderBuffer`. Most users will want to override the `template`
36385
+ or `templateName` properties instead of this method.
36386
+
36387
+ By default, `Ember.View` will look for a function in the `template`
36388
+ property and invoke it with the value of `context`. The value of
36389
+ `context` will be the view's controller unless you override it.
36390
+
36391
+ @method render
36392
+ @param {Ember.RenderBuffer} buffer The render buffer
36393
+ */
36394
+ render: function(buffer) {
36395
+ // If this view has a layout, it is the responsibility of the
36396
+ // the layout to render the view's template. Otherwise, render the template
36397
+ // directly.
36398
+ var template = property_get.get(this, 'layout') || property_get.get(this, 'template');
36399
+ renderView(this, buffer, template);
36400
+ }
36401
+ });
36402
+
36403
+ exports['default'] = TemplateRenderingSupport;
36404
+
36098
36405
  });
36099
36406
  enifed('ember-views/mixins/text_support', ['exports', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/mixin', 'ember-runtime/mixins/target_action_support'], function (exports, property_get, property_set, mixin, TargetActionSupport) {
36100
36407
 
@@ -36343,6 +36650,394 @@ enifed('ember-views/mixins/text_support', ['exports', 'ember-metal/property_get'
36343
36650
 
36344
36651
  exports['default'] = TextSupport;
36345
36652
 
36653
+ });
36654
+ enifed('ember-views/mixins/view_child_views_support', ['exports', 'ember-metal/core', 'ember-metal/mixin', 'ember-metal/computed', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/set_properties', 'ember-metal/error', 'ember-metal/enumerable_utils', 'ember-runtime/system/native_array'], function (exports, Ember, mixin, computed, property_get, property_set, setProperties, EmberError, enumerable_utils, native_array) {
36655
+
36656
+ 'use strict';
36657
+
36658
+ var childViewsProperty = computed.computed(function() {
36659
+ var childViews = this._childViews;
36660
+ var ret = native_array.A();
36661
+
36662
+ enumerable_utils.forEach(childViews, function(view) {
36663
+ var currentChildViews;
36664
+ if (view.isVirtual) {
36665
+ if (currentChildViews = property_get.get(view, 'childViews')) {
36666
+ ret.pushObjects(currentChildViews);
36667
+ }
36668
+ } else {
36669
+ ret.push(view);
36670
+ }
36671
+ });
36672
+
36673
+ ret.replace = function (idx, removedCount, addedViews) {
36674
+ throw new EmberError['default']("childViews is immutable");
36675
+ };
36676
+
36677
+ return ret;
36678
+ });
36679
+
36680
+ var EMPTY_ARRAY = [];
36681
+
36682
+ var ViewChildViewsSupport = mixin.Mixin.create({
36683
+ /**
36684
+ Array of child views. You should never edit this array directly.
36685
+ Instead, use `appendChild` and `removeFromParent`.
36686
+
36687
+ @property childViews
36688
+ @type Array
36689
+ @default []
36690
+ @private
36691
+ */
36692
+ childViews: childViewsProperty,
36693
+
36694
+ _childViews: EMPTY_ARRAY,
36695
+
36696
+ init: function() {
36697
+ // setup child views. be sure to clone the child views array first
36698
+ this._childViews = this._childViews.slice();
36699
+
36700
+ this._super.apply(this, arguments);
36701
+ },
36702
+
36703
+ appendChild: function(view, options) {
36704
+ return this.currentState.appendChild(this, view, options);
36705
+ },
36706
+
36707
+ /**
36708
+ Removes the child view from the parent view.
36709
+
36710
+ @method removeChild
36711
+ @param {Ember.View} view
36712
+ @return {Ember.View} receiver
36713
+ */
36714
+ removeChild: function(view) {
36715
+ // If we're destroying, the entire subtree will be
36716
+ // freed, and the DOM will be handled separately,
36717
+ // so no need to mess with childViews.
36718
+ if (this.isDestroying) { return; }
36719
+
36720
+ // update parent node
36721
+ property_set.set(view, '_parentView', null);
36722
+
36723
+ // remove view from childViews array.
36724
+ var childViews = this._childViews;
36725
+
36726
+ enumerable_utils.removeObject(childViews, view);
36727
+
36728
+ this.propertyDidChange('childViews'); // HUH?! what happened to will change?
36729
+
36730
+ return this;
36731
+ },
36732
+
36733
+ /**
36734
+ Instantiates a view to be added to the childViews array during view
36735
+ initialization. You generally will not call this method directly unless
36736
+ you are overriding `createChildViews()`. Note that this method will
36737
+ automatically configure the correct settings on the new view instance to
36738
+ act as a child of the parent.
36739
+
36740
+ @method createChildView
36741
+ @param {Class|String} viewClass
36742
+ @param {Hash} [attrs] Attributes to add
36743
+ @return {Ember.View} new instance
36744
+ */
36745
+ createChildView: function(maybeViewClass, _attrs) {
36746
+ if (!maybeViewClass) {
36747
+ throw new TypeError("createChildViews first argument must exist");
36748
+ }
36749
+
36750
+ if (maybeViewClass.isView && maybeViewClass._parentView === this && maybeViewClass.container === this.container) {
36751
+ return maybeViewClass;
36752
+ }
36753
+
36754
+ var attrs = _attrs || {};
36755
+ var view;
36756
+ attrs._parentView = this;
36757
+ attrs.renderer = this.renderer;
36758
+
36759
+ if (maybeViewClass.isViewClass) {
36760
+ attrs.container = this.container;
36761
+
36762
+ view = maybeViewClass.create(attrs);
36763
+
36764
+ // don't set the property on a virtual view, as they are invisible to
36765
+ // consumers of the view API
36766
+ if (view.viewName) {
36767
+ property_set.set(property_get.get(this, 'concreteView'), view.viewName, view);
36768
+ }
36769
+ } else if ('string' === typeof maybeViewClass) {
36770
+ var fullName = 'view:' + maybeViewClass;
36771
+ var ViewKlass = this.container.lookupFactory(fullName);
36772
+
36773
+ Ember['default'].assert("Could not find view: '" + fullName + "'", !!ViewKlass);
36774
+
36775
+ view = ViewKlass.create(attrs);
36776
+ } else {
36777
+ view = maybeViewClass;
36778
+ Ember['default'].assert('You must pass instance or subclass of View', view.isView);
36779
+
36780
+ attrs.container = this.container;
36781
+ setProperties['default'](view, attrs);
36782
+ }
36783
+
36784
+ return view;
36785
+ }
36786
+ });
36787
+
36788
+ exports['default'] = ViewChildViewsSupport;
36789
+
36790
+ exports.childViewsProperty = childViewsProperty;
36791
+
36792
+ });
36793
+ enifed('ember-views/mixins/view_context_support', ['exports', 'ember-metal/mixin', 'ember-metal/computed', 'ember-metal/property_get', 'ember-metal/property_set'], function (exports, mixin, computed, property_get, property_set) {
36794
+
36795
+ 'use strict';
36796
+
36797
+ var ViewContextSupport = mixin.Mixin.create({
36798
+ /**
36799
+ The object from which templates should access properties.
36800
+
36801
+ This object will be passed to the template function each time the render
36802
+ method is called, but it is up to the individual function to decide what
36803
+ to do with it.
36804
+
36805
+ By default, this will be the view's controller.
36806
+
36807
+ @property context
36808
+ @type Object
36809
+ */
36810
+ context: computed.computed(function(key, value) {
36811
+ if (arguments.length === 2) {
36812
+ property_set.set(this, '_context', value);
36813
+ return value;
36814
+ } else {
36815
+ return property_get.get(this, '_context');
36816
+ }
36817
+ })["volatile"](),
36818
+
36819
+ /**
36820
+ Private copy of the view's template context. This can be set directly
36821
+ by Handlebars without triggering the observer that causes the view
36822
+ to be re-rendered.
36823
+
36824
+ The context of a view is looked up as follows:
36825
+
36826
+ 1. Supplied context (usually by Handlebars)
36827
+ 2. Specified controller
36828
+ 3. `parentView`'s context (for a child of a ContainerView)
36829
+
36830
+ The code in Handlebars that overrides the `_context` property first
36831
+ checks to see whether the view has a specified controller. This is
36832
+ something of a hack and should be revisited.
36833
+
36834
+ @property _context
36835
+ @private
36836
+ */
36837
+ _context: computed.computed(function(key, value) {
36838
+ if (arguments.length === 2) {
36839
+ return value;
36840
+ }
36841
+
36842
+ var parentView, controller;
36843
+
36844
+ if (controller = property_get.get(this, 'controller')) {
36845
+ return controller;
36846
+ }
36847
+
36848
+ parentView = this._parentView;
36849
+ if (parentView) {
36850
+ return property_get.get(parentView, '_context');
36851
+ }
36852
+
36853
+ return null;
36854
+ }),
36855
+
36856
+ _controller: null,
36857
+
36858
+ /**
36859
+ The controller managing this view. If this property is set, it will be
36860
+ made available for use by the template.
36861
+
36862
+ @property controller
36863
+ @type Object
36864
+ */
36865
+ controller: computed.computed(function(key, value) {
36866
+ if (arguments.length === 2) {
36867
+ this._controller = value;
36868
+ return value;
36869
+ }
36870
+
36871
+ if (this._controller) {
36872
+ return this._controller;
36873
+ }
36874
+
36875
+ var parentView = this._parentView;
36876
+ return parentView ? property_get.get(parentView, 'controller') : null;
36877
+ })
36878
+ });
36879
+
36880
+ exports['default'] = ViewContextSupport;
36881
+
36882
+ });
36883
+ enifed('ember-views/mixins/view_keyword_support', ['exports', 'ember-metal/mixin', 'ember-metal/platform/create', 'ember-views/streams/key_stream'], function (exports, mixin, create, KeyStream) {
36884
+
36885
+ 'use strict';
36886
+
36887
+ var ViewKeywordSupport = mixin.Mixin.create({
36888
+ init: function() {
36889
+ this._super.apply(this, arguments);
36890
+
36891
+ if (!this._keywords) {
36892
+ this._keywords = create['default'](null);
36893
+ }
36894
+ this._keywords._view = this;
36895
+ this._keywords.view = undefined;
36896
+ this._keywords.controller = new KeyStream['default'](this, 'controller');
36897
+ this._setupKeywords();
36898
+ },
36899
+
36900
+ _setupKeywords: function() {
36901
+ var keywords = this._keywords;
36902
+ var contextView = this._contextView || this._parentView;
36903
+
36904
+ if (contextView) {
36905
+ var parentKeywords = contextView._keywords;
36906
+
36907
+ keywords.view = this.isVirtual ? parentKeywords.view : this;
36908
+
36909
+ for (var name in parentKeywords) {
36910
+ if (keywords[name]) {
36911
+ continue;
36912
+ }
36913
+
36914
+ keywords[name] = parentKeywords[name];
36915
+ }
36916
+ } else {
36917
+ keywords.view = this.isVirtual ? null : this;
36918
+ }
36919
+ }
36920
+ });
36921
+
36922
+ exports['default'] = ViewKeywordSupport;
36923
+
36924
+ });
36925
+ enifed('ember-views/mixins/view_state_support', ['exports', 'ember-metal/core', 'ember-metal/mixin'], function (exports, Ember, mixin) {
36926
+
36927
+ 'use strict';
36928
+
36929
+ var ViewStateSupport = mixin.Mixin.create({
36930
+ transitionTo: function(state, children) {
36931
+ Ember['default'].deprecate("Ember.View#transitionTo has been deprecated, it is for internal use only");
36932
+ this._transitionTo(state, children);
36933
+ },
36934
+
36935
+ _transitionTo: function(state, children) {
36936
+ var priorState = this.currentState;
36937
+ var currentState = this.currentState = this._states[state];
36938
+ this._state = state;
36939
+
36940
+ if (priorState && priorState.exit) { priorState.exit(this); }
36941
+ if (currentState.enter) { currentState.enter(this); }
36942
+ }
36943
+ });
36944
+
36945
+ exports['default'] = ViewStateSupport;
36946
+
36947
+ });
36948
+ enifed('ember-views/mixins/view_stream_support', ['exports', 'ember-metal/mixin', 'ember-metal/streams/stream_binding', 'ember-views/streams/key_stream', 'ember-views/streams/context_stream', 'ember-metal/platform/create', 'ember-metal/streams/utils'], function (exports, mixin, StreamBinding, KeyStream, ContextStream, create, utils) {
36949
+
36950
+ 'use strict';
36951
+
36952
+ var ViewStreamSupport = mixin.Mixin.create({
36953
+ init: function() {
36954
+ this._baseContext = undefined;
36955
+ this._contextStream = undefined;
36956
+ this._streamBindings = undefined;
36957
+ this._super.apply(this, arguments);
36958
+ },
36959
+
36960
+ getStream: function(path) {
36961
+ var stream = this._getContextStream().get(path);
36962
+
36963
+ stream._label = path;
36964
+
36965
+ return stream;
36966
+ },
36967
+
36968
+ _willDestroyElement: function() {
36969
+ if (this._streamBindings) {
36970
+ this._destroyStreamBindings();
36971
+ }
36972
+ if (this._contextStream) {
36973
+ this._destroyContextStream();
36974
+ }
36975
+ },
36976
+
36977
+ _getBindingForStream: function(pathOrStream) {
36978
+ if (this._streamBindings === undefined) {
36979
+ this._streamBindings = create['default'](null);
36980
+ }
36981
+
36982
+ var path = pathOrStream;
36983
+ if (utils.isStream(pathOrStream)) {
36984
+ path = pathOrStream._label;
36985
+
36986
+ if (!path) {
36987
+ // if no _label is present on the provided stream
36988
+ // it is likely a subexpr and cannot be set (so it
36989
+ // does not need a StreamBinding)
36990
+ return pathOrStream;
36991
+ }
36992
+ }
36993
+
36994
+ if (this._streamBindings[path] !== undefined) {
36995
+ return this._streamBindings[path];
36996
+ } else {
36997
+ var stream = this._getContextStream().get(path);
36998
+ var streamBinding = new StreamBinding['default'](stream);
36999
+
37000
+ streamBinding._label = path;
37001
+
37002
+ return this._streamBindings[path] = streamBinding;
37003
+ }
37004
+ },
37005
+
37006
+ _destroyStreamBindings: function() {
37007
+ var streamBindings = this._streamBindings;
37008
+ for (var path in streamBindings) {
37009
+ streamBindings[path].destroy();
37010
+ }
37011
+ this._streamBindings = undefined;
37012
+ },
37013
+
37014
+ _getContextStream: function() {
37015
+ if (this._contextStream === undefined) {
37016
+ this._baseContext = new KeyStream['default'](this, 'context');
37017
+ this._contextStream = new ContextStream['default'](this);
37018
+ }
37019
+
37020
+ return this._contextStream;
37021
+ },
37022
+
37023
+ _destroyContextStream: function() {
37024
+ this._baseContext.destroy();
37025
+ this._baseContext = undefined;
37026
+ this._contextStream.destroy();
37027
+ this._contextStream = undefined;
37028
+ },
37029
+
37030
+ _unsubscribeFromStreamBindings: function() {
37031
+ for (var key in this._streamBindingSubscriptions) {
37032
+ var streamBinding = this[key + 'Binding'];
37033
+ var callback = this._streamBindingSubscriptions[key];
37034
+ streamBinding.unsubscribe(callback);
37035
+ }
37036
+ }
37037
+ });
37038
+
37039
+ exports['default'] = ViewStreamSupport;
37040
+
36346
37041
  });
36347
37042
  enifed('ember-views/mixins/view_target_action_support', ['exports', 'ember-metal/mixin', 'ember-runtime/mixins/target_action_support', 'ember-metal/alias'], function (exports, mixin, TargetActionSupport, alias) {
36348
37043
 
@@ -36359,6 +37054,99 @@ enifed('ember-views/mixins/view_target_action_support', ['exports', 'ember-metal
36359
37054
  actionContext: alias['default']('context')
36360
37055
  });
36361
37056
 
37057
+ });
37058
+ enifed('ember-views/mixins/visibility_support', ['exports', 'ember-metal/mixin', 'ember-metal/property_get', 'ember-metal/run_loop'], function (exports, mixin, property_get, run) {
37059
+
37060
+ 'use strict';
37061
+
37062
+ function K() { return this; }
37063
+
37064
+ var VisibilitySupport = mixin.Mixin.create({
37065
+ /**
37066
+ If `false`, the view will appear hidden in DOM.
37067
+
37068
+ @property isVisible
37069
+ @type Boolean
37070
+ @default null
37071
+ */
37072
+ isVisible: true,
37073
+
37074
+ becameVisible: K,
37075
+ becameHidden: K,
37076
+
37077
+ /**
37078
+ When the view's `isVisible` property changes, toggle the visibility
37079
+ element of the actual DOM element.
37080
+
37081
+ @method _isVisibleDidChange
37082
+ @private
37083
+ */
37084
+ _isVisibleDidChange: mixin.observer('isVisible', function() {
37085
+ if (this._isVisible === property_get.get(this, 'isVisible')) { return ; }
37086
+ run['default'].scheduleOnce('render', this, this._toggleVisibility);
37087
+ }),
37088
+
37089
+ _toggleVisibility: function() {
37090
+ var $el = this.$();
37091
+ var isVisible = property_get.get(this, 'isVisible');
37092
+
37093
+ if (this._isVisible === isVisible) { return ; }
37094
+
37095
+ // It's important to keep these in sync, even if we don't yet have
37096
+ // an element in the DOM to manipulate:
37097
+ this._isVisible = isVisible;
37098
+
37099
+ if (!$el) { return; }
37100
+
37101
+ $el.toggle(isVisible);
37102
+
37103
+ if (this._isAncestorHidden()) { return; }
37104
+
37105
+ if (isVisible) {
37106
+ this._notifyBecameVisible();
37107
+ } else {
37108
+ this._notifyBecameHidden();
37109
+ }
37110
+ },
37111
+
37112
+ _notifyBecameVisible: function() {
37113
+ this.trigger('becameVisible');
37114
+
37115
+ this.forEachChildView(function(view) {
37116
+ var isVisible = property_get.get(view, 'isVisible');
37117
+
37118
+ if (isVisible || isVisible === null) {
37119
+ view._notifyBecameVisible();
37120
+ }
37121
+ });
37122
+ },
37123
+
37124
+ _notifyBecameHidden: function() {
37125
+ this.trigger('becameHidden');
37126
+ this.forEachChildView(function(view) {
37127
+ var isVisible = property_get.get(view, 'isVisible');
37128
+
37129
+ if (isVisible || isVisible === null) {
37130
+ view._notifyBecameHidden();
37131
+ }
37132
+ });
37133
+ },
37134
+
37135
+ _isAncestorHidden: function() {
37136
+ var parent = property_get.get(this, 'parentView');
37137
+
37138
+ while (parent) {
37139
+ if (property_get.get(parent, 'isVisible') === false) { return true; }
37140
+
37141
+ parent = property_get.get(parent, 'parentView');
37142
+ }
37143
+
37144
+ return false;
37145
+ }
37146
+ });
37147
+
37148
+ exports['default'] = VisibilitySupport;
37149
+
36362
37150
  });
36363
37151
  enifed('ember-views/streams/class_name_binding', ['exports', 'ember-metal/streams/utils', 'ember-metal/property_get', 'ember-runtime/system/string', 'ember-metal/utils'], function (exports, utils, property_get, string, ember_metal__utils) {
36364
37152
 
@@ -37598,11 +38386,8 @@ enifed('ember-views/system/render_buffer', ['exports', 'ember-views/system/jquer
37598
38386
  if (content.nodeType) {
37599
38387
  this._element.appendChild(content);
37600
38388
  } else {
37601
- var nodes;
37602
- nodes = this.dom.parseHTML(content, contextualElement);
37603
- while (nodes[0]) {
37604
- this._element.appendChild(nodes[0]);
37605
- }
38389
+ var frag = this.dom.parseHTML(content, contextualElement);
38390
+ this._element.appendChild(frag);
37606
38391
  }
37607
38392
 
37608
38393
  // This should only happen with legacy string buffers
@@ -37906,8 +38691,8 @@ enifed('ember-views/system/utils', ['exports'], function (exports) {
37906
38691
  */
37907
38692
  function getViewRange(view) {
37908
38693
  var range = document.createRange();
37909
- range.setStartAfter(view._morph.start);
37910
- range.setEndBefore(view._morph.end);
38694
+ range.setStartBefore(view._morph.firstNode);
38695
+ range.setEndAfter(view._morph.lastNode);
37911
38696
  return range;
37912
38697
  }
37913
38698
 
@@ -38960,7 +39745,7 @@ enifed('ember-views/views/container_view', ['exports', 'ember-metal/core', 'embe
38960
39745
  buffer._element = element;
38961
39746
  this._childViewsMorph = dom.appendMorph(element, this._morph.contextualElement);
38962
39747
  } else {
38963
- this._childViewsMorph = dom.createMorph(element, element.lastChild, null);
39748
+ this._childViewsMorph = dom.appendMorph(element);
38964
39749
  }
38965
39750
 
38966
39751
  return element;
@@ -39083,12 +39868,13 @@ enifed('ember-views/views/container_view', ['exports', 'ember-metal/core', 'embe
39083
39868
  var childViews = view._childViews;
39084
39869
  var renderer = view._renderer;
39085
39870
 
39086
- var i, len, childView;
39087
- for (i = 0, len = childViews.length; i < len; i++) {
39088
- childView = childViews[i];
39871
+ var refMorph = null;
39872
+ for (var i = childViews.length-1; i >= 0; i--) {
39873
+ var childView = childViews[i];
39089
39874
  if (!childView._elementCreated) {
39090
- renderer.renderTree(childView, view, i);
39875
+ renderer.renderTree(childView, view, refMorph);
39091
39876
  }
39877
+ refMorph = childView._morph;
39092
39878
  }
39093
39879
  }
39094
39880
  });
@@ -39379,6 +40165,7 @@ enifed('ember-views/views/select', ['exports', 'ember-metal/enumerable_utils', '
39379
40165
 
39380
40166
  var selectOptionDefaultTemplate = {
39381
40167
  isHTMLBars: true,
40168
+ revision: 'Ember@1.11.0-beta.2',
39382
40169
  render: function(context, env, contextualElement) {
39383
40170
  var lazyValue = context.getStream('view.label');
39384
40171
 
@@ -39958,7 +40745,7 @@ enifed('ember-views/views/select', ['exports', 'ember-metal/enumerable_utils', '
39958
40745
  var content = property_get.get(this, 'contentValues');
39959
40746
  if (!el) { return; }
39960
40747
 
39961
- var selectionIndex = content.indexOf(selectionValue);
40748
+ var selectionIndex = enumerable_utils.indexOf(content, selectionValue);
39962
40749
  var prompt = property_get.get(this, 'prompt');
39963
40750
 
39964
40751
  if (prompt) { selectionIndex += 1; }
@@ -40407,565 +41194,186 @@ enifed('ember-views/views/states/in_dom', ['exports', 'ember-metal/core', 'ember
40407
41194
  });
40408
41195
  enifed('ember-views/views/states/pre_render', ['exports', 'ember-views/views/states/default', 'ember-metal/platform/create'], function (exports, _default, create) {
40409
41196
 
40410
- 'use strict';
40411
-
40412
- var preRender = create['default'](_default['default']);
40413
-
40414
- exports['default'] = preRender;
40415
-
40416
- });
40417
- enifed('ember-views/views/text_area', ['exports', 'ember-metal/property_get', 'ember-views/views/component', 'ember-views/mixins/text_support', 'ember-metal/mixin'], function (exports, property_get, Component, TextSupport, mixin) {
40418
-
40419
- 'use strict';
40420
-
40421
-
40422
- /**
40423
- @module ember
40424
- @submodule ember-views
40425
- */
40426
- exports['default'] = Component['default'].extend(TextSupport['default'], {
40427
- instrumentDisplay: '{{textarea}}',
40428
-
40429
- classNames: ['ember-text-area'],
40430
-
40431
- tagName: "textarea",
40432
- attributeBindings: [
40433
- 'rows',
40434
- 'cols',
40435
- 'name',
40436
- 'selectionEnd',
40437
- 'selectionStart',
40438
- 'wrap',
40439
- 'lang',
40440
- 'dir'
40441
- ],
40442
- rows: null,
40443
- cols: null,
40444
-
40445
- _updateElementValue: mixin.observer('value', function() {
40446
- // We do this check so cursor position doesn't get affected in IE
40447
- var value = property_get.get(this, 'value');
40448
- var $el = this.$();
40449
- if ($el && value !== $el.val()) {
40450
- $el.val(value);
40451
- }
40452
- }),
40453
-
40454
- init: function() {
40455
- this._super.apply(this, arguments);
40456
- this.on("didInsertElement", this, this._updateElementValue);
40457
- }
40458
- });
40459
-
40460
- });
40461
- enifed('ember-views/views/text_field', ['exports', 'ember-views/views/component', 'ember-views/mixins/text_support'], function (exports, Component, TextSupport) {
40462
-
40463
- 'use strict';
40464
-
40465
- /**
40466
- @module ember
40467
- @submodule ember-views
40468
- */
40469
- exports['default'] = Component['default'].extend(TextSupport['default'], {
40470
- instrumentDisplay: '{{input type="text"}}',
40471
-
40472
- classNames: ['ember-text-field'],
40473
- tagName: "input",
40474
- attributeBindings: [
40475
- 'accept',
40476
- 'autocomplete',
40477
- 'autosave',
40478
- 'dir',
40479
- 'formaction',
40480
- 'formenctype',
40481
- 'formmethod',
40482
- 'formnovalidate',
40483
- 'formtarget',
40484
- 'height',
40485
- 'inputmode',
40486
- 'lang',
40487
- 'list',
40488
- 'max',
40489
- 'min',
40490
- 'multiple',
40491
- 'name',
40492
- 'pattern',
40493
- 'size',
40494
- 'step',
40495
- 'type',
40496
- 'value',
40497
- 'width'
40498
- ],
40499
-
40500
- defaultLayout: null,
40501
-
40502
- /**
40503
- The `value` attribute of the input element. As the user inputs text, this
40504
- property is updated live.
40505
-
40506
- @property value
40507
- @type String
40508
- @default ""
40509
- */
40510
- value: "",
40511
-
40512
- /**
40513
- The `type` attribute of the input element.
40514
-
40515
- @property type
40516
- @type String
40517
- @default "text"
40518
- */
40519
- type: "text",
40520
-
40521
- /**
40522
- The `size` of the text field in characters.
40523
-
40524
- @property size
40525
- @type String
40526
- @default null
40527
- */
40528
- size: null,
40529
-
40530
- /**
40531
- The `pattern` attribute of input element.
40532
-
40533
- @property pattern
40534
- @type String
40535
- @default null
40536
- */
40537
- pattern: null,
40538
-
40539
- /**
40540
- The `min` attribute of input element used with `type="number"` or `type="range"`.
40541
-
40542
- @property min
40543
- @type String
40544
- @default null
40545
- @since 1.4.0
40546
- */
40547
- min: null,
40548
-
40549
- /**
40550
- The `max` attribute of input element used with `type="number"` or `type="range"`.
40551
-
40552
- @property max
40553
- @type String
40554
- @default null
40555
- @since 1.4.0
40556
- */
40557
- max: null
40558
- });
40559
-
40560
- });
40561
- enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/platform/create', 'ember-runtime/mixins/evented', 'ember-runtime/system/object', 'ember-metal/error', 'ember-metal/property_get', 'ember-metal/property_set', 'ember-metal/set_properties', 'ember-metal/run_loop', 'ember-metal/observer', 'ember-metal/properties', 'ember-metal/utils', 'ember-metal/computed', 'ember-metal/mixin', 'ember-views/streams/key_stream', 'ember-metal/streams/stream_binding', 'ember-views/streams/context_stream', 'ember-metal/streams/utils', 'ember-views/attr_nodes/attr_node', 'ember-metal/deprecate_property', 'ember-runtime/system/native_array', 'ember-views/streams/class_name_binding', 'ember-metal/enumerable_utils', 'ember-metal/property_events', 'ember-views/system/jquery', 'ember-views/system/ext', 'ember-views/views/core_view', 'ember-views/system/platform'], function (exports, Ember, create, Evented, EmberObject, EmberError, property_get, property_set, setProperties, run, ember_metal__observer, properties, utils, computed, mixin, KeyStream, StreamBinding, ContextStream, streams__utils, AttrNode, deprecate_property, native_array, class_name_binding, enumerable_utils, property_events, jQuery, __dep25__, CoreView, platform) {
40562
-
40563
- 'use strict';
40564
-
40565
- // Ember.assert, Ember.deprecate, Ember.warn, Ember.TEMPLATES,
40566
- // jQuery, Ember.lookup,
40567
- // Ember.ContainerView circular dependency
40568
- // Ember.ENV
40569
- function K() { return this; }
40570
-
40571
- // Circular dep
40572
- var _renderView;
40573
- function renderView(view, buffer, template) {
40574
- if (_renderView === undefined) {
40575
- _renderView = eriuqer('ember-htmlbars/system/render-view')['default'];
40576
- }
40577
- _renderView(view, buffer, template);
40578
- }
40579
-
40580
- /**
40581
- @module ember
40582
- @submodule ember-views
40583
- */
40584
- var childViewsProperty = computed.computed(function() {
40585
- var childViews = this._childViews;
40586
- var ret = native_array.A();
40587
-
40588
- enumerable_utils.forEach(childViews, function(view) {
40589
- var currentChildViews;
40590
- if (view.isVirtual) {
40591
- if (currentChildViews = property_get.get(view, 'childViews')) {
40592
- ret.pushObjects(currentChildViews);
40593
- }
40594
- } else {
40595
- ret.push(view);
40596
- }
40597
- });
40598
-
40599
- ret.replace = function (idx, removedCount, addedViews) {
40600
- throw new EmberError['default']("childViews is immutable");
40601
- };
40602
-
40603
- return ret;
40604
- });
40605
-
40606
- Ember['default'].warn("The VIEW_PRESERVES_CONTEXT flag has been removed and the functionality can no longer be disabled.", Ember['default'].ENV.VIEW_PRESERVES_CONTEXT !== false);
40607
-
40608
- /**
40609
- Global hash of shared templates. This will automatically be populated
40610
- by the build tools so that you can store your Handlebars templates in
40611
- separate files that get loaded into JavaScript at buildtime.
40612
-
40613
- @property TEMPLATES
40614
- @for Ember
40615
- @type Hash
40616
- */
40617
- Ember['default'].TEMPLATES = {};
40618
-
40619
- var EMPTY_ARRAY = [];
40620
-
40621
- var ViewStreamSupport = mixin.Mixin.create({
40622
- init: function() {
40623
- this._baseContext = undefined;
40624
- this._contextStream = undefined;
40625
- this._streamBindings = undefined;
40626
- this._super.apply(this, arguments);
40627
- },
40628
-
40629
- getStream: function(path) {
40630
- var stream = this._getContextStream().get(path);
40631
-
40632
- stream._label = path;
40633
-
40634
- return stream;
40635
- },
40636
-
40637
- _willDestroyElement: function() {
40638
- if (this._streamBindings) {
40639
- this._destroyStreamBindings();
40640
- }
40641
- if (this._contextStream) {
40642
- this._destroyContextStream();
40643
- }
40644
- },
40645
-
40646
- _getBindingForStream: function(pathOrStream) {
40647
- if (this._streamBindings === undefined) {
40648
- this._streamBindings = create['default'](null);
40649
- }
40650
-
40651
- var path = pathOrStream;
40652
- if (streams__utils.isStream(pathOrStream)) {
40653
- path = pathOrStream._label;
40654
-
40655
- if (!path) {
40656
- // if no _label is present on the provided stream
40657
- // it is likely a subexpr and cannot be set (so it
40658
- // does not need a StreamBinding)
40659
- return pathOrStream;
40660
- }
40661
- }
40662
-
40663
- if (this._streamBindings[path] !== undefined) {
40664
- return this._streamBindings[path];
40665
- } else {
40666
- var stream = this._getContextStream().get(path);
40667
- var streamBinding = new StreamBinding['default'](stream);
40668
-
40669
- streamBinding._label = path;
40670
-
40671
- return this._streamBindings[path] = streamBinding;
40672
- }
40673
- },
40674
-
40675
- _destroyStreamBindings: function() {
40676
- var streamBindings = this._streamBindings;
40677
- for (var path in streamBindings) {
40678
- streamBindings[path].destroy();
40679
- }
40680
- this._streamBindings = undefined;
40681
- },
40682
-
40683
- _getContextStream: function() {
40684
- if (this._contextStream === undefined) {
40685
- this._baseContext = new KeyStream['default'](this, 'context');
40686
- this._contextStream = new ContextStream['default'](this);
40687
- }
40688
-
40689
- return this._contextStream;
40690
- },
40691
-
40692
- _destroyContextStream: function() {
40693
- this._baseContext.destroy();
40694
- this._baseContext = undefined;
40695
- this._contextStream.destroy();
40696
- this._contextStream = undefined;
40697
- },
40698
-
40699
- _unsubscribeFromStreamBindings: function() {
40700
- for (var key in this._streamBindingSubscriptions) {
40701
- var streamBinding = this[key + 'Binding'];
40702
- var callback = this._streamBindingSubscriptions[key];
40703
- streamBinding.unsubscribe(callback);
40704
- }
40705
- }
40706
- });
40707
-
40708
- var ViewKeywordSupport = mixin.Mixin.create({
40709
- init: function() {
40710
- this._super.apply(this, arguments);
40711
-
40712
- if (!this._keywords) {
40713
- this._keywords = create['default'](null);
40714
- }
40715
- this._keywords._view = this;
40716
- this._keywords.view = undefined;
40717
- this._keywords.controller = new KeyStream['default'](this, 'controller');
40718
- this._setupKeywords();
40719
- },
40720
-
40721
- _setupKeywords: function() {
40722
- var keywords = this._keywords;
40723
- var contextView = this._contextView || this._parentView;
40724
-
40725
- if (contextView) {
40726
- var parentKeywords = contextView._keywords;
40727
-
40728
- keywords.view = this.isVirtual ? parentKeywords.view : this;
40729
-
40730
- for (var name in parentKeywords) {
40731
- if (keywords[name]) {
40732
- continue;
40733
- }
40734
-
40735
- keywords[name] = parentKeywords[name];
40736
- }
40737
- } else {
40738
- keywords.view = this.isVirtual ? null : this;
40739
- }
40740
- }
40741
- });
40742
-
40743
- var ViewContextSupport = mixin.Mixin.create({
40744
- /**
40745
- The object from which templates should access properties.
40746
-
40747
- This object will be passed to the template function each time the render
40748
- method is called, but it is up to the individual function to decide what
40749
- to do with it.
40750
-
40751
- By default, this will be the view's controller.
40752
-
40753
- @property context
40754
- @type Object
40755
- */
40756
- context: computed.computed(function(key, value) {
40757
- if (arguments.length === 2) {
40758
- property_set.set(this, '_context', value);
40759
- return value;
40760
- } else {
40761
- return property_get.get(this, '_context');
40762
- }
40763
- })["volatile"](),
40764
-
40765
- /**
40766
- Private copy of the view's template context. This can be set directly
40767
- by Handlebars without triggering the observer that causes the view
40768
- to be re-rendered.
40769
-
40770
- The context of a view is looked up as follows:
40771
-
40772
- 1. Supplied context (usually by Handlebars)
40773
- 2. Specified controller
40774
- 3. `parentView`'s context (for a child of a ContainerView)
40775
-
40776
- The code in Handlebars that overrides the `_context` property first
40777
- checks to see whether the view has a specified controller. This is
40778
- something of a hack and should be revisited.
40779
-
40780
- @property _context
40781
- @private
40782
- */
40783
- _context: computed.computed(function(key, value) {
40784
- if (arguments.length === 2) {
40785
- return value;
40786
- }
40787
-
40788
- var parentView, controller;
40789
-
40790
- if (controller = property_get.get(this, 'controller')) {
40791
- return controller;
40792
- }
40793
-
40794
- parentView = this._parentView;
40795
- if (parentView) {
40796
- return property_get.get(parentView, '_context');
40797
- }
41197
+ 'use strict';
40798
41198
 
40799
- return null;
40800
- }),
41199
+ var preRender = create['default'](_default['default']);
40801
41200
 
40802
- _controller: null,
41201
+ exports['default'] = preRender;
40803
41202
 
40804
- /**
40805
- The controller managing this view. If this property is set, it will be
40806
- made available for use by the template.
41203
+ });
41204
+ enifed('ember-views/views/text_area', ['exports', 'ember-metal/property_get', 'ember-views/views/component', 'ember-views/mixins/text_support', 'ember-metal/mixin'], function (exports, property_get, Component, TextSupport, mixin) {
40807
41205
 
40808
- @property controller
40809
- @type Object
40810
- */
40811
- controller: computed.computed(function(key, value) {
40812
- if (arguments.length === 2) {
40813
- this._controller = value;
40814
- return value;
40815
- }
41206
+ 'use strict';
40816
41207
 
40817
- if (this._controller) {
40818
- return this._controller;
40819
- }
40820
41208
 
40821
- var parentView = this._parentView;
40822
- return parentView ? property_get.get(parentView, 'controller') : null;
40823
- })
40824
- });
41209
+ /**
41210
+ @module ember
41211
+ @submodule ember-views
41212
+ */
41213
+ exports['default'] = Component['default'].extend(TextSupport['default'], {
41214
+ instrumentDisplay: '{{textarea}}',
40825
41215
 
40826
- var ViewChildViewsSupport = mixin.Mixin.create({
40827
- /**
40828
- Array of child views. You should never edit this array directly.
40829
- Instead, use `appendChild` and `removeFromParent`.
41216
+ classNames: ['ember-text-area'],
40830
41217
 
40831
- @property childViews
40832
- @type Array
40833
- @default []
40834
- @private
40835
- */
40836
- childViews: childViewsProperty,
41218
+ tagName: "textarea",
41219
+ attributeBindings: [
41220
+ 'rows',
41221
+ 'cols',
41222
+ 'name',
41223
+ 'selectionEnd',
41224
+ 'selectionStart',
41225
+ 'wrap',
41226
+ 'lang',
41227
+ 'dir'
41228
+ ],
41229
+ rows: null,
41230
+ cols: null,
40837
41231
 
40838
- _childViews: EMPTY_ARRAY,
41232
+ _updateElementValue: mixin.observer('value', function() {
41233
+ // We do this check so cursor position doesn't get affected in IE
41234
+ var value = property_get.get(this, 'value');
41235
+ var $el = this.$();
41236
+ if ($el && value !== $el.val()) {
41237
+ $el.val(value);
41238
+ }
41239
+ }),
40839
41240
 
40840
41241
  init: function() {
40841
- // setup child views. be sure to clone the child views array first
40842
- this._childViews = this._childViews.slice();
40843
-
40844
41242
  this._super.apply(this, arguments);
40845
- },
40846
-
40847
- appendChild: function(view, options) {
40848
- return this.currentState.appendChild(this, view, options);
40849
- },
41243
+ this.on("didInsertElement", this, this._updateElementValue);
41244
+ }
41245
+ });
40850
41246
 
40851
- /**
40852
- Removes the child view from the parent view.
41247
+ });
41248
+ enifed('ember-views/views/text_field', ['exports', 'ember-views/views/component', 'ember-views/mixins/text_support'], function (exports, Component, TextSupport) {
40853
41249
 
40854
- @method removeChild
40855
- @param {Ember.View} view
40856
- @return {Ember.View} receiver
40857
- */
40858
- removeChild: function(view) {
40859
- // If we're destroying, the entire subtree will be
40860
- // freed, and the DOM will be handled separately,
40861
- // so no need to mess with childViews.
40862
- if (this.isDestroying) { return; }
41250
+ 'use strict';
40863
41251
 
40864
- // update parent node
40865
- property_set.set(view, '_parentView', null);
41252
+ /**
41253
+ @module ember
41254
+ @submodule ember-views
41255
+ */
41256
+ exports['default'] = Component['default'].extend(TextSupport['default'], {
41257
+ instrumentDisplay: '{{input type="text"}}',
40866
41258
 
40867
- // remove view from childViews array.
40868
- var childViews = this._childViews;
41259
+ classNames: ['ember-text-field'],
41260
+ tagName: "input",
41261
+ attributeBindings: [
41262
+ 'accept',
41263
+ 'autocomplete',
41264
+ 'autosave',
41265
+ 'dir',
41266
+ 'formaction',
41267
+ 'formenctype',
41268
+ 'formmethod',
41269
+ 'formnovalidate',
41270
+ 'formtarget',
41271
+ 'height',
41272
+ 'inputmode',
41273
+ 'lang',
41274
+ 'list',
41275
+ 'max',
41276
+ 'min',
41277
+ 'multiple',
41278
+ 'name',
41279
+ 'pattern',
41280
+ 'size',
41281
+ 'step',
41282
+ 'type',
41283
+ 'value',
41284
+ 'width'
41285
+ ],
40869
41286
 
40870
- enumerable_utils.removeObject(childViews, view);
41287
+ defaultLayout: null,
40871
41288
 
40872
- this.propertyDidChange('childViews'); // HUH?! what happened to will change?
41289
+ /**
41290
+ The `value` attribute of the input element. As the user inputs text, this
41291
+ property is updated live.
40873
41292
 
40874
- return this;
40875
- },
41293
+ @property value
41294
+ @type String
41295
+ @default ""
41296
+ */
41297
+ value: "",
40876
41298
 
40877
41299
  /**
40878
- Instantiates a view to be added to the childViews array during view
40879
- initialization. You generally will not call this method directly unless
40880
- you are overriding `createChildViews()`. Note that this method will
40881
- automatically configure the correct settings on the new view instance to
40882
- act as a child of the parent.
41300
+ The `type` attribute of the input element.
40883
41301
 
40884
- @method createChildView
40885
- @param {Class|String} viewClass
40886
- @param {Hash} [attrs] Attributes to add
40887
- @return {Ember.View} new instance
41302
+ @property type
41303
+ @type String
41304
+ @default "text"
40888
41305
  */
40889
- createChildView: function(maybeViewClass, _attrs) {
40890
- if (!maybeViewClass) {
40891
- throw new TypeError("createChildViews first argument must exist");
40892
- }
40893
-
40894
- if (maybeViewClass.isView && maybeViewClass._parentView === this && maybeViewClass.container === this.container) {
40895
- return maybeViewClass;
40896
- }
41306
+ type: "text",
40897
41307
 
40898
- var attrs = _attrs || {};
40899
- var view;
40900
- attrs._parentView = this;
40901
- attrs.renderer = this.renderer;
41308
+ /**
41309
+ The `size` of the text field in characters.
40902
41310
 
40903
- if (maybeViewClass.isViewClass) {
40904
- attrs.container = this.container;
41311
+ @property size
41312
+ @type String
41313
+ @default null
41314
+ */
41315
+ size: null,
40905
41316
 
40906
- view = maybeViewClass.create(attrs);
41317
+ /**
41318
+ The `pattern` attribute of input element.
40907
41319
 
40908
- // don't set the property on a virtual view, as they are invisible to
40909
- // consumers of the view API
40910
- if (view.viewName) {
40911
- property_set.set(property_get.get(this, 'concreteView'), view.viewName, view);
40912
- }
40913
- } else if ('string' === typeof maybeViewClass) {
40914
- var fullName = 'view:' + maybeViewClass;
40915
- var ViewKlass = this.container.lookupFactory(fullName);
41320
+ @property pattern
41321
+ @type String
41322
+ @default null
41323
+ */
41324
+ pattern: null,
40916
41325
 
40917
- Ember['default'].assert("Could not find view: '" + fullName + "'", !!ViewKlass);
41326
+ /**
41327
+ The `min` attribute of input element used with `type="number"` or `type="range"`.
40918
41328
 
40919
- view = ViewKlass.create(attrs);
40920
- } else {
40921
- view = maybeViewClass;
40922
- Ember['default'].assert('You must pass instance or subclass of View', view.isView);
41329
+ @property min
41330
+ @type String
41331
+ @default null
41332
+ @since 1.4.0
41333
+ */
41334
+ min: null,
40923
41335
 
40924
- attrs.container = this.container;
40925
- setProperties['default'](view, attrs);
40926
- }
41336
+ /**
41337
+ The `max` attribute of input element used with `type="number"` or `type="range"`.
40927
41338
 
40928
- return view;
40929
- }
41339
+ @property max
41340
+ @type String
41341
+ @default null
41342
+ @since 1.4.0
41343
+ */
41344
+ max: null
40930
41345
  });
40931
41346
 
40932
- var ViewStateSupport = mixin.Mixin.create({
40933
- transitionTo: function(state, children) {
40934
- Ember['default'].deprecate("Ember.View#transitionTo has been deprecated, it is for internal use only");
40935
- this._transitionTo(state, children);
40936
- },
41347
+ });
41348
+ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-runtime/mixins/evented', 'ember-runtime/system/object', 'ember-metal/error', 'ember-metal/property_get', 'ember-metal/run_loop', 'ember-metal/observer', 'ember-metal/utils', 'ember-metal/computed', 'ember-metal/mixin', 'ember-metal/deprecate_property', 'ember-metal/property_events', 'ember-views/system/jquery', 'ember-views/system/ext', 'ember-views/views/core_view', 'ember-views/mixins/view_stream_support', 'ember-views/mixins/view_keyword_support', 'ember-views/mixins/view_context_support', 'ember-views/mixins/view_child_views_support', 'ember-views/mixins/view_state_support', 'ember-views/mixins/template_rendering_support', 'ember-views/mixins/class_names_support', 'ember-views/mixins/attribute_bindings_support', 'ember-views/mixins/legacy_view_support', 'ember-views/mixins/instrumentation_support', 'ember-views/mixins/visibility_support'], function (exports, Ember, Evented, EmberObject, EmberError, property_get, run, observer, utils, computed, mixin, deprecate_property, property_events, jQuery, __dep13__, CoreView, ViewStreamSupport, ViewKeywordSupport, ViewContextSupport, view_child_views_support, ViewStateSupport, TemplateRenderingSupport, ClassNamesSupport, AttributeBindingsSupport, LegacyViewSupport, InstrumentationSupport, VisibilitySupport) {
40937
41349
 
40938
- _transitionTo: function(state, children) {
40939
- var priorState = this.currentState;
40940
- var currentState = this.currentState = this._states[state];
40941
- this._state = state;
41350
+ 'use strict';
40942
41351
 
40943
- if (priorState && priorState.exit) { priorState.exit(this); }
40944
- if (currentState.enter) { currentState.enter(this); }
40945
- }
40946
- });
41352
+ // Ember.assert, Ember.deprecate, Ember.warn, Ember.TEMPLATES,
41353
+ // jQuery, Ember.lookup,
41354
+ // Ember.ContainerView circular dependency
41355
+ // Ember.ENV
41356
+ function K() { return this; }
40947
41357
 
40948
- var TemplateRenderingSupport = mixin.Mixin.create({
40949
- /**
40950
- Called on your view when it should push strings of HTML into a
40951
- `Ember.RenderBuffer`. Most users will want to override the `template`
40952
- or `templateName` properties instead of this method.
41358
+ /**
41359
+ @module ember
41360
+ @submodule ember-views
41361
+ */
40953
41362
 
40954
- By default, `Ember.View` will look for a function in the `template`
40955
- property and invoke it with the value of `context`. The value of
40956
- `context` will be the view's controller unless you override it.
41363
+ Ember['default'].warn("The VIEW_PRESERVES_CONTEXT flag has been removed and the functionality can no longer be disabled.", Ember['default'].ENV.VIEW_PRESERVES_CONTEXT !== false);
40957
41364
 
40958
- @method render
40959
- @param {Ember.RenderBuffer} buffer The render buffer
40960
- */
40961
- render: function(buffer) {
40962
- // If this view has a layout, it is the responsibility of the
40963
- // the layout to render the view's template. Otherwise, render the template
40964
- // directly.
40965
- var template = property_get.get(this, 'layout') || property_get.get(this, 'template');
40966
- renderView(this, buffer, template);
40967
- }
40968
- });
41365
+ /**
41366
+ Global hash of shared templates. This will automatically be populated
41367
+ by the build tools so that you can store your Handlebars templates in
41368
+ separate files that get loaded into JavaScript at buildtime.
41369
+
41370
+ @property TEMPLATES
41371
+ @for Ember
41372
+ @type Hash
41373
+ */
41374
+ Ember['default'].TEMPLATES = {};
41375
+
41376
+ var EMPTY_ARRAY = [];
40969
41377
 
40970
41378
  /**
40971
41379
  `Ember.View` is the class in Ember responsible for encapsulating templates of
@@ -41570,9 +41978,18 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41570
41978
  @namespace Ember
41571
41979
  @extends Ember.CoreView
41572
41980
  */
41573
- var View = CoreView['default'].extend(ViewStreamSupport, ViewKeywordSupport, ViewContextSupport, ViewChildViewsSupport, ViewStateSupport, TemplateRenderingSupport, {
41574
-
41575
- concatenatedProperties: ['classNames', 'classNameBindings', 'attributeBindings'],
41981
+ var View = CoreView['default'].extend(
41982
+ ViewStreamSupport['default'],
41983
+ ViewKeywordSupport['default'],
41984
+ ViewContextSupport['default'],
41985
+ view_child_views_support["default"],
41986
+ ViewStateSupport['default'],
41987
+ TemplateRenderingSupport['default'],
41988
+ ClassNamesSupport['default'],
41989
+ AttributeBindingsSupport['default'],
41990
+ LegacyViewSupport['default'],
41991
+ InstrumentationSupport['default'],
41992
+ VisibilitySupport['default'], {
41576
41993
 
41577
41994
  /**
41578
41995
  @property isView
@@ -41610,18 +42027,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41610
42027
  */
41611
42028
  layoutName: null,
41612
42029
 
41613
- /**
41614
- Used to identify this view during debugging
41615
-
41616
- @property instrumentDisplay
41617
- @type String
41618
- */
41619
- instrumentDisplay: computed.computed(function() {
41620
- if (this.helperName) {
41621
- return '{{' + this.helperName + '}}';
41622
- }
41623
- }),
41624
-
41625
42030
  /**
41626
42031
  The template used to render the view. This should be a function that
41627
42032
  accepts an optional context parameter and returns a string of HTML that
@@ -41671,12 +42076,7 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41671
42076
  var template = property_get.get(this, 'template');
41672
42077
 
41673
42078
  if (template) {
41674
- var useHTMLBars = false;
41675
-
41676
- useHTMLBars = template.isHTMLBars;
41677
-
41678
-
41679
- if (useHTMLBars) {
42079
+ if (template.isHTMLBars) {
41680
42080
  return template.render(this, options, morph.contextualElement);
41681
42081
  } else {
41682
42082
  return template(context, options);
@@ -41710,16 +42110,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41710
42110
  this.rerender();
41711
42111
  }),
41712
42112
 
41713
- /**
41714
- If `false`, the view will appear hidden in DOM.
41715
-
41716
- @property isVisible
41717
- @type Boolean
41718
- @default null
41719
- */
41720
- isVisible: true,
41721
-
41722
-
41723
42113
  // When it's a virtual view, we need to notify the parent that their
41724
42114
  // childViews will change.
41725
42115
  _childViewsWillChange: mixin.beforeObserver('childViews', function() {
@@ -41738,25 +42128,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41738
42128
  }
41739
42129
  }),
41740
42130
 
41741
- /**
41742
- Return the nearest ancestor that is an instance of the provided
41743
- class.
41744
-
41745
- @method nearestInstanceOf
41746
- @param {Class} klass Subclass of Ember.View (or Ember.View itself)
41747
- @return Ember.View
41748
- @deprecated
41749
- */
41750
- nearestInstanceOf: function(klass) {
41751
- Ember['default'].deprecate("nearestInstanceOf is deprecated and will be removed from future releases. Use nearestOfType.");
41752
- var view = property_get.get(this, 'parentView');
41753
-
41754
- while (view) {
41755
- if (view instanceof klass) { return view; }
41756
- view = property_get.get(view, 'parentView');
41757
- }
41758
- },
41759
-
41760
42131
  /**
41761
42132
  Return the nearest ancestor that is an instance of the provided
41762
42133
  class or mixin.
@@ -41794,26 +42165,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41794
42165
  }
41795
42166
  },
41796
42167
 
41797
- /**
41798
- Return the nearest ancestor whose parent is an instance of
41799
- `klass`.
41800
-
41801
- @method nearestChildOf
41802
- @param {Class} klass Subclass of Ember.View (or Ember.View itself)
41803
- @return Ember.View
41804
- @deprecated
41805
- */
41806
- nearestChildOf: function(klass) {
41807
- Ember['default'].deprecate("nearestChildOf has been deprecated.");
41808
-
41809
- var view = property_get.get(this, 'parentView');
41810
-
41811
- while (view) {
41812
- if (property_get.get(view, 'parentView') instanceof klass) { return view; }
41813
- view = property_get.get(view, 'parentView');
41814
- }
41815
- },
41816
-
41817
42168
  /**
41818
42169
  When the parent view changes, recursively invalidate `controller`
41819
42170
 
@@ -41861,159 +42212,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
41861
42212
  return this.currentState.rerender(this);
41862
42213
  },
41863
42214
 
41864
- /**
41865
- Iterates over the view's `classNameBindings` array, inserts the value
41866
- of the specified property into the `classNames` array, then creates an
41867
- observer to update the view's element if the bound property ever changes
41868
- in the future.
41869
-
41870
- @method _applyClassNameBindings
41871
- @private
41872
- */
41873
- _applyClassNameBindings: function(classBindings) {
41874
- var classNames = this.classNames;
41875
- var elem, newClass, dasherizedClass;
41876
-
41877
- // Loop through all of the configured bindings. These will be either
41878
- // property names ('isUrgent') or property paths relative to the view
41879
- // ('content.isUrgent')
41880
- enumerable_utils.forEach(classBindings, function(binding) {
41881
-
41882
- var boundBinding;
41883
- if (streams__utils.isStream(binding)) {
41884
- boundBinding = binding;
41885
- } else {
41886
- boundBinding = class_name_binding.streamifyClassNameBinding(this, binding, '_view.');
41887
- }
41888
-
41889
- // Variable in which the old class value is saved. The observer function
41890
- // closes over this variable, so it knows which string to remove when
41891
- // the property changes.
41892
- var oldClass;
41893
-
41894
- // Set up an observer on the context. If the property changes, toggle the
41895
- // class name.
41896
- var observer = this._wrapAsScheduled(function() {
41897
- // Get the current value of the property
41898
- elem = this.$();
41899
- newClass = streams__utils.read(boundBinding);
41900
-
41901
- // If we had previously added a class to the element, remove it.
41902
- if (oldClass) {
41903
- elem.removeClass(oldClass);
41904
- // Also remove from classNames so that if the view gets rerendered,
41905
- // the class doesn't get added back to the DOM.
41906
- classNames.removeObject(oldClass);
41907
- }
41908
-
41909
- // If necessary, add a new class. Make sure we keep track of it so
41910
- // it can be removed in the future.
41911
- if (newClass) {
41912
- elem.addClass(newClass);
41913
- oldClass = newClass;
41914
- } else {
41915
- oldClass = null;
41916
- }
41917
- });
41918
-
41919
- // Get the class name for the property at its current value
41920
- dasherizedClass = streams__utils.read(boundBinding);
41921
-
41922
- if (dasherizedClass) {
41923
- // Ensure that it gets into the classNames array
41924
- // so it is displayed when we render.
41925
- enumerable_utils.addObject(classNames, dasherizedClass);
41926
-
41927
- // Save a reference to the class name so we can remove it
41928
- // if the observer fires. Remember that this variable has
41929
- // been closed over by the observer.
41930
- oldClass = dasherizedClass;
41931
- }
41932
-
41933
- streams__utils.subscribe(boundBinding, observer, this);
41934
- // Remove className so when the view is rerendered,
41935
- // the className is added based on binding reevaluation
41936
- this.one('willClearRender', function() {
41937
- if (oldClass) {
41938
- classNames.removeObject(oldClass);
41939
- oldClass = null;
41940
- }
41941
- });
41942
-
41943
- }, this);
41944
- },
41945
-
41946
- _unspecifiedAttributeBindings: null,
41947
-
41948
- /**
41949
- Iterates through the view's attribute bindings, sets up observers for each,
41950
- then applies the current value of the attributes to the passed render buffer.
41951
-
41952
- @method _applyAttributeBindings
41953
- @param {Ember.RenderBuffer} buffer
41954
- @param {Array} attributeBindings
41955
- @private
41956
- */
41957
- _applyAttributeBindings: function(buffer, attributeBindings) {
41958
- var unspecifiedAttributeBindings = this._unspecifiedAttributeBindings = this._unspecifiedAttributeBindings || {};
41959
-
41960
- var binding, colonIndex, property, attrName, attrNode, attrValue;
41961
- var i, l;
41962
- for (i=0, l=attributeBindings.length; i<l; i++) {
41963
- binding = attributeBindings[i];
41964
- colonIndex = binding.indexOf(':');
41965
- if (colonIndex === -1) {
41966
- property = binding;
41967
- attrName = binding;
41968
- } else {
41969
- property = binding.substring(0, colonIndex);
41970
- attrName = binding.substring(colonIndex + 1);
41971
- }
41972
-
41973
- Ember['default'].assert('You cannot use class as an attributeBinding, use classNameBindings instead.', attrName !== 'class');
41974
-
41975
- if (property in this) {
41976
- attrValue = this.getStream('view.'+property);
41977
- attrNode = new AttrNode['default'](attrName, attrValue);
41978
- this.appendAttr(attrNode);
41979
- if (!platform.canSetNameOnInputs && attrName === 'name') {
41980
- buffer.attr('name', streams__utils.read(attrValue));
41981
- }
41982
- } else {
41983
- unspecifiedAttributeBindings[property] = attrName;
41984
- }
41985
- }
41986
-
41987
- // Lazily setup setUnknownProperty after attributeBindings are initially applied
41988
- this.setUnknownProperty = this._setUnknownProperty;
41989
- },
41990
-
41991
- /**
41992
- We're using setUnknownProperty as a hook to setup attributeBinding observers for
41993
- properties that aren't defined on a view at initialization time.
41994
-
41995
- Note: setUnknownProperty will only be called once for each property.
41996
-
41997
- @method setUnknownProperty
41998
- @param key
41999
- @param value
42000
- @private
42001
- */
42002
- setUnknownProperty: null, // Gets defined after initialization by _applyAttributeBindings
42003
-
42004
- _setUnknownProperty: function(key, value) {
42005
- var attrName = this._unspecifiedAttributeBindings && this._unspecifiedAttributeBindings[key];
42006
-
42007
- properties.defineProperty(this, key);
42008
-
42009
- if (attrName) {
42010
- var attrValue = this.getStream('view.'+key);
42011
- var attrNode = new AttrNode['default'](attrName, attrValue);
42012
- this.appendAttr(attrNode);
42013
- }
42014
- return property_set.set(this, key, value);
42015
- },
42016
-
42017
42215
  /**
42018
42216
  Given a property name, returns a dasherized version of that
42019
42217
  property name if the property evaluates to a non-falsy value.
@@ -42057,19 +42255,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42057
42255
  return this.currentState.$(this, sel);
42058
42256
  },
42059
42257
 
42060
- mutateChildViews: function(callback) {
42061
- var childViews = this._childViews;
42062
- var idx = childViews.length;
42063
- var view;
42064
-
42065
- while (--idx >= 0) {
42066
- view = childViews[idx];
42067
- callback(this, view, idx);
42068
- }
42069
-
42070
- return this;
42071
- },
42072
-
42073
42258
  forEachChildView: function(callback) {
42074
42259
  var childViews = this._childViews;
42075
42260
 
@@ -42298,32 +42483,16 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42298
42483
  */
42299
42484
  parentViewDidChange: K,
42300
42485
 
42301
- instrumentName: 'view',
42302
-
42303
- instrumentDetails: function(hash) {
42304
- hash.template = property_get.get(this, 'templateName');
42305
- this._super(hash);
42306
- },
42307
-
42308
- beforeRender: function(buffer) {},
42309
-
42310
- afterRender: function(buffer) {},
42311
-
42312
42486
  applyAttributesToBuffer: function(buffer) {
42313
42487
  // Creates observers for all registered class name and attribute bindings,
42314
42488
  // then adds them to the element.
42315
- var classNameBindings = this.classNameBindings;
42316
- if (classNameBindings.length) {
42317
- this._applyClassNameBindings(classNameBindings);
42318
- }
42489
+
42490
+ this._applyClassNameBindings();
42319
42491
 
42320
42492
  // Pass the render buffer so the method can apply attributes directly.
42321
42493
  // This isn't needed for class name bindings because they use the
42322
42494
  // existing classNames infrastructure.
42323
- var attributeBindings = this.attributeBindings;
42324
- if (attributeBindings.length) {
42325
- this._applyAttributeBindings(buffer, attributeBindings);
42326
- }
42495
+ this._applyAttributeBindings(buffer);
42327
42496
 
42328
42497
  buffer.setClasses(this.classNames);
42329
42498
  buffer.id(this.elementId);
@@ -42373,88 +42542,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42373
42542
  */
42374
42543
  ariaRole: null,
42375
42544
 
42376
- /**
42377
- Standard CSS class names to apply to the view's outer element. This
42378
- property automatically inherits any class names defined by the view's
42379
- superclasses as well.
42380
-
42381
- @property classNames
42382
- @type Array
42383
- @default ['ember-view']
42384
- */
42385
- classNames: ['ember-view'],
42386
-
42387
- /**
42388
- A list of properties of the view to apply as class names. If the property
42389
- is a string value, the value of that string will be applied as a class
42390
- name.
42391
-
42392
- ```javascript
42393
- // Applies the 'high' class to the view element
42394
- Ember.View.extend({
42395
- classNameBindings: ['priority']
42396
- priority: 'high'
42397
- });
42398
- ```
42399
-
42400
- If the value of the property is a Boolean, the name of that property is
42401
- added as a dasherized class name.
42402
-
42403
- ```javascript
42404
- // Applies the 'is-urgent' class to the view element
42405
- Ember.View.extend({
42406
- classNameBindings: ['isUrgent']
42407
- isUrgent: true
42408
- });
42409
- ```
42410
-
42411
- If you would prefer to use a custom value instead of the dasherized
42412
- property name, you can pass a binding like this:
42413
-
42414
- ```javascript
42415
- // Applies the 'urgent' class to the view element
42416
- Ember.View.extend({
42417
- classNameBindings: ['isUrgent:urgent']
42418
- isUrgent: true
42419
- });
42420
- ```
42421
-
42422
- This list of properties is inherited from the view's superclasses as well.
42423
-
42424
- @property classNameBindings
42425
- @type Array
42426
- @default []
42427
- */
42428
- classNameBindings: EMPTY_ARRAY,
42429
-
42430
- /**
42431
- A list of properties of the view to apply as attributes. If the property is
42432
- a string value, the value of that string will be applied as the attribute.
42433
-
42434
- ```javascript
42435
- // Applies the type attribute to the element
42436
- // with the value "button", like <div type="button">
42437
- Ember.View.extend({
42438
- attributeBindings: ['type'],
42439
- type: 'button'
42440
- });
42441
- ```
42442
-
42443
- If the value of the property is a Boolean, the name of that property is
42444
- added as an attribute.
42445
-
42446
- ```javascript
42447
- // Renders something like <div enabled="enabled">
42448
- Ember.View.extend({
42449
- attributeBindings: ['enabled'],
42450
- enabled: true
42451
- });
42452
- ```
42453
-
42454
- @property attributeBindings
42455
- */
42456
- attributeBindings: EMPTY_ARRAY,
42457
-
42458
42545
  // .......................................................
42459
42546
  // CORE DISPLAY METHODS
42460
42547
  //
@@ -42475,12 +42562,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42475
42562
  }
42476
42563
 
42477
42564
  this._super.apply(this, arguments);
42478
-
42479
- Ember['default'].assert("Only arrays are allowed for 'classNameBindings'", utils.typeOf(this.classNameBindings) === 'array');
42480
- this.classNameBindings = native_array.A(this.classNameBindings.slice());
42481
-
42482
- Ember['default'].assert("Only arrays of static class strings are allowed for 'classNames'. For dynamic classes, use 'classNameBindings'.", utils.typeOf(this.classNames) === 'array');
42483
- this.classNames = native_array.A(this.classNames.slice());
42484
42565
  },
42485
42566
 
42486
42567
  __defineNonEnumerable: function(property) {
@@ -42491,24 +42572,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42491
42572
  return this.currentState.appendAttr(this, node);
42492
42573
  },
42493
42574
 
42494
- /**
42495
- Removes all children from the `parentView`.
42496
-
42497
- @method removeAllChildren
42498
- @return {Ember.View} receiver
42499
- */
42500
- removeAllChildren: function() {
42501
- return this.mutateChildViews(function(parentView, view) {
42502
- parentView.removeChild(view);
42503
- });
42504
- },
42505
-
42506
- destroyAllChildren: function() {
42507
- return this.mutateChildViews(function(parentView, view) {
42508
- view.destroy();
42509
- });
42510
- },
42511
-
42512
42575
  /**
42513
42576
  Removes the view from its `parentView`, if one is found. Otherwise
42514
42577
  does nothing.
@@ -42549,79 +42612,6 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42549
42612
  return this;
42550
42613
  },
42551
42614
 
42552
- becameVisible: K,
42553
- becameHidden: K,
42554
-
42555
- /**
42556
- When the view's `isVisible` property changes, toggle the visibility
42557
- element of the actual DOM element.
42558
-
42559
- @method _isVisibleDidChange
42560
- @private
42561
- */
42562
- _isVisibleDidChange: mixin.observer('isVisible', function() {
42563
- if (this._isVisible === property_get.get(this, 'isVisible')) { return ; }
42564
- run['default'].scheduleOnce('render', this, this._toggleVisibility);
42565
- }),
42566
-
42567
- _toggleVisibility: function() {
42568
- var $el = this.$();
42569
- var isVisible = property_get.get(this, 'isVisible');
42570
-
42571
- if (this._isVisible === isVisible) { return ; }
42572
-
42573
- // It's important to keep these in sync, even if we don't yet have
42574
- // an element in the DOM to manipulate:
42575
- this._isVisible = isVisible;
42576
-
42577
- if (!$el) { return; }
42578
-
42579
- $el.toggle(isVisible);
42580
-
42581
- if (this._isAncestorHidden()) { return; }
42582
-
42583
- if (isVisible) {
42584
- this._notifyBecameVisible();
42585
- } else {
42586
- this._notifyBecameHidden();
42587
- }
42588
- },
42589
-
42590
- _notifyBecameVisible: function() {
42591
- this.trigger('becameVisible');
42592
-
42593
- this.forEachChildView(function(view) {
42594
- var isVisible = property_get.get(view, 'isVisible');
42595
-
42596
- if (isVisible || isVisible === null) {
42597
- view._notifyBecameVisible();
42598
- }
42599
- });
42600
- },
42601
-
42602
- _notifyBecameHidden: function() {
42603
- this.trigger('becameHidden');
42604
- this.forEachChildView(function(view) {
42605
- var isVisible = property_get.get(view, 'isVisible');
42606
-
42607
- if (isVisible || isVisible === null) {
42608
- view._notifyBecameHidden();
42609
- }
42610
- });
42611
- },
42612
-
42613
- _isAncestorHidden: function() {
42614
- var parent = property_get.get(this, 'parentView');
42615
-
42616
- while (parent) {
42617
- if (property_get.get(parent, 'isVisible') === false) { return true; }
42618
-
42619
- parent = property_get.get(parent, 'parentView');
42620
- }
42621
-
42622
- return false;
42623
- },
42624
-
42625
42615
  // .......................................................
42626
42616
  // EVENT HANDLING
42627
42617
  //
@@ -42650,10 +42640,10 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42650
42640
 
42651
42641
  var scheduledObserver = this._wrapAsScheduled(observer);
42652
42642
 
42653
- ember_metal__observer.addObserver(root, path, target, scheduledObserver);
42643
+ observer.addObserver(root, path, target, scheduledObserver);
42654
42644
 
42655
42645
  this.one('willClearRender', function() {
42656
- ember_metal__observer.removeObserver(root, path, target, scheduledObserver);
42646
+ observer.removeObserver(root, path, target, scheduledObserver);
42657
42647
  });
42658
42648
  },
42659
42649
 
@@ -42727,16 +42717,18 @@ enifed('ember-views/views/view', ['exports', 'ember-metal/core', 'ember-metal/pl
42727
42717
  // supplied childViews and then restore the original computed property
42728
42718
  // at view initialization time. This happens in Ember.ContainerView's init
42729
42719
  // method.
42730
- View.childViewsProperty = childViewsProperty;
42720
+ View.childViewsProperty = view_child_views_support.childViewsProperty;
42731
42721
 
42732
42722
  exports['default'] = View;
42733
42723
 
42734
- exports.ViewKeywordSupport = ViewKeywordSupport;
42735
- exports.ViewStreamSupport = ViewStreamSupport;
42736
- exports.ViewContextSupport = ViewContextSupport;
42737
- exports.ViewChildViewsSupport = ViewChildViewsSupport;
42738
- exports.ViewStateSupport = ViewStateSupport;
42739
- exports.TemplateRenderingSupport = TemplateRenderingSupport;
42724
+ exports.ViewKeywordSupport = ViewKeywordSupport['default'];
42725
+ exports.ViewStreamSupport = ViewStreamSupport['default'];
42726
+ exports.ViewContextSupport = ViewContextSupport['default'];
42727
+ exports.ViewChildViewsSupport = view_child_views_support["default"];
42728
+ exports.ViewStateSupport = ViewStateSupport['default'];
42729
+ exports.TemplateRenderingSupport = TemplateRenderingSupport['default'];
42730
+ exports.ClassNamesSupport = ClassNamesSupport['default'];
42731
+ exports.AttributeBindingsSupport = AttributeBindingsSupport['default'];
42740
42732
 
42741
42733
  });
42742
42734
  enifed('ember-views/views/with_view', ['exports', 'ember-metal/property_set', 'ember-views/views/metamorph_view', 'ember-views/mixins/normalized_rerender_if_needed', 'ember-metal/run_loop', 'ember-htmlbars/system/render-view'], function (exports, property_set, _MetamorphView, NormalizedRerenderIfNeededSupport, run, renderView) {
@@ -42811,7 +42803,7 @@ enifed('ember-views/views/with_view', ['exports', 'ember-metal/property_set', 'e
42811
42803
  });
42812
42804
 
42813
42805
  });
42814
- enifed('ember', ['ember-metal', 'ember-runtime', 'ember-views', 'ember-routing', 'ember-application', 'ember-extension-support', 'ember-htmlbars', 'ember-routing-htmlbars', 'ember-metal/environment', 'ember-runtime/system/lazy_load'], function (__dep0__, __dep1__, __dep2__, __dep3__, __dep4__, __dep5__, __dep6__, __dep7__, environment, lazy_load) {
42806
+ enifed('ember', ['ember-metal', 'ember-runtime', 'ember-views', 'ember-routing', 'ember-application', 'ember-extension-support', 'ember-htmlbars', 'ember-routing-htmlbars', 'ember-routing-views', 'ember-metal/environment', 'ember-runtime/system/lazy_load'], function (__dep0__, __dep1__, __dep2__, __dep3__, __dep4__, __dep5__, __dep6__, __dep7__, __dep8__, environment, lazy_load) {
42815
42807
 
42816
42808
  'use strict';
42817
42809
 
@@ -43212,298 +43204,310 @@ enifed("morph-attr/sanitize-attribute-value",
43212
43204
  __exports__.sanitizeAttributeValue = sanitizeAttributeValue;
43213
43205
  });
43214
43206
  enifed("morph-range",
43215
- ["exports"],
43216
- function(__exports__) {
43207
+ ["./morph-range/utils","exports"],
43208
+ function(__dependency1__, __exports__) {
43217
43209
  "use strict";
43218
- var splice = Array.prototype.splice;
43210
+ var clear = __dependency1__.clear;
43211
+ var insertBefore = __dependency1__.insertBefore;
43219
43212
 
43220
- function ensureStartEnd(start, end) {
43221
- if (start === null || end === null) {
43222
- throw new Error('a fragment parent must have boundary nodes in order to detect insertion');
43223
- }
43213
+ function Morph(domHelper, contextualElement) {
43214
+ this.domHelper = domHelper;
43215
+ // context if content if current content is detached
43216
+ this.contextualElement = contextualElement;
43217
+
43218
+ // flag to force text to setContent to be treated as html
43219
+ this.parseTextAsHTML = false;
43220
+
43221
+ this.firstNode = null;
43222
+ this.lastNode = null;
43223
+
43224
+ // morph graph
43225
+ this.parentMorph = null;
43226
+ this.firstChildMorph = null;
43227
+ this.lastChildMorph = null;
43228
+
43229
+ this.previousMorph = null;
43230
+ this.nextMorph = null;
43224
43231
  }
43225
43232
 
43226
- function ensureContext(contextualElement) {
43227
- if (!contextualElement || contextualElement.nodeType !== 1) {
43228
- throw new Error('An element node must be provided for a contextualElement, you provided ' +
43229
- (contextualElement ? 'nodeType ' + contextualElement.nodeType : 'nothing'));
43233
+ Morph.prototype.setContent = function Morph$setContent(content) {
43234
+ if (content === null || content === undefined) {
43235
+ return this.clear();
43230
43236
  }
43231
- }
43232
43237
 
43233
- // TODO: this is an internal API, this should be an assert
43234
- function Morph(parent, start, end, domHelper, contextualElement) {
43235
- if (parent.nodeType === 11) {
43236
- ensureStartEnd(start, end);
43237
- this.element = null;
43238
- } else {
43239
- this.element = parent;
43238
+ var type = typeof content;
43239
+ switch (type) {
43240
+ case 'string':
43241
+ if (this.parseTextAsHTML) {
43242
+ return this.setHTML(content);
43243
+ }
43244
+ return this.setText(content);
43245
+ case 'object':
43246
+ if (typeof content.nodeType === 'number') {
43247
+ return this.setNode(content);
43248
+ }
43249
+ /* Handlebars.SafeString */
43250
+ if (typeof content.string === 'string') {
43251
+ return this.setHTML(content.string);
43252
+ }
43253
+ if (this.parseTextAsHTML) {
43254
+ return this.setHTML(content.toString());
43255
+ }
43256
+ /* falls through */
43257
+ case 'boolean':
43258
+ case 'number':
43259
+ return this.setText(content.toString());
43260
+ default:
43261
+ throw new TypeError('unsupported content');
43240
43262
  }
43241
- this._parent = parent;
43242
- this.start = start;
43243
- this.end = end;
43244
- this.domHelper = domHelper;
43245
- ensureContext(contextualElement);
43246
- this.contextualElement = contextualElement;
43247
- this.escaped = true;
43248
- this.reset();
43249
- }
43263
+ };
43250
43264
 
43251
- Morph.prototype.reset = function() {
43252
- this.text = null;
43253
- this.owner = null;
43254
- this.morphs = null;
43255
- this.before = null;
43256
- this.after = null;
43265
+ Morph.prototype.clear = function Morph$clear() {
43266
+ return this.setNode(this.domHelper.createComment(''));
43257
43267
  };
43258
43268
 
43259
- Morph.prototype.parent = function () {
43260
- if (!this.element) {
43261
- var parent = this.start.parentNode;
43262
- if (this._parent !== parent) {
43263
- this._parent = parent;
43264
- }
43265
- if (parent.nodeType === 1) {
43266
- this.element = parent;
43267
- }
43269
+ Morph.prototype.setText = function Morph$setText(text) {
43270
+ var firstNode = this.firstNode;
43271
+ var lastNode = this.lastNode;
43272
+
43273
+ if (firstNode &&
43274
+ lastNode === firstNode &&
43275
+ firstNode.nodeType === 3) {
43276
+ firstNode.nodeValue = text;
43277
+ return firstNode;
43268
43278
  }
43269
- return this._parent;
43279
+
43280
+ return this.setNode(
43281
+ text ? this.domHelper.createTextNode(text) : this.domHelper.createComment('')
43282
+ );
43270
43283
  };
43271
43284
 
43272
- Morph.prototype.destroy = function () {
43273
- if (this.owner) {
43274
- this.owner.removeMorph(this);
43275
- } else {
43276
- clear(this.element || this.parent(), this.start, this.end);
43285
+ Morph.prototype.setNode = function Morph$setNode(newNode) {
43286
+ var firstNode, lastNode;
43287
+ switch (newNode.nodeType) {
43288
+ case 3:
43289
+ firstNode = newNode;
43290
+ lastNode = newNode;
43291
+ break;
43292
+ case 11:
43293
+ firstNode = newNode.firstChild;
43294
+ lastNode = newNode.lastChild;
43295
+ if (firstNode === null) {
43296
+ firstNode = this.domHelper.createComment('');
43297
+ newNode.appendChild(firstNode);
43298
+ lastNode = firstNode;
43299
+ }
43300
+ break;
43301
+ default:
43302
+ firstNode = newNode;
43303
+ lastNode = newNode;
43304
+ break;
43277
43305
  }
43306
+
43307
+ var previousFirstNode = this.firstNode;
43308
+ if (previousFirstNode !== null) {
43309
+
43310
+ var parentNode = previousFirstNode.parentNode;
43311
+ insertBefore(parentNode, firstNode, lastNode, previousFirstNode);
43312
+ clear(parentNode, previousFirstNode, this.lastNode);
43313
+ }
43314
+
43315
+ this.firstNode = firstNode;
43316
+ this.lastNode = lastNode;
43317
+
43318
+ if (this.parentMorph) {
43319
+ syncFirstNode(this);
43320
+ syncLastNode(this);
43321
+ }
43322
+
43323
+ return newNode;
43278
43324
  };
43279
43325
 
43280
- Morph.prototype.removeMorph = function (morph) {
43281
- var morphs = this.morphs;
43282
- for (var i=0, l=morphs.length; i<l; i++) {
43283
- if (morphs[i] === morph) {
43284
- this.replace(i, 1);
43326
+ function syncFirstNode(_morph) {
43327
+ var morph = _morph;
43328
+ var parentMorph;
43329
+ while (parentMorph = morph.parentMorph) {
43330
+ if (morph !== parentMorph.firstChildMorph) {
43331
+ break;
43332
+ }
43333
+ if (morph.firstNode === parentMorph.firstNode) {
43285
43334
  break;
43286
43335
  }
43287
- }
43288
- };
43289
43336
 
43290
- Morph.prototype.setContent = function (nodeOrString) {
43291
- this._update(this.element || this.parent(), nodeOrString);
43292
- };
43337
+ parentMorph.firstNode = morph.firstNode;
43293
43338
 
43294
- Morph.prototype.updateNode = function (node) {
43295
- var parent = this.element || this.parent();
43296
- if (!node) {
43297
- return this._updateText(parent, '');
43339
+ morph = parentMorph;
43298
43340
  }
43299
- this._updateNode(parent, node);
43300
- };
43341
+ }
43301
43342
 
43302
- Morph.prototype.updateText = function (text) {
43303
- this._updateText(this.element || this.parent(), text);
43304
- };
43343
+ function syncLastNode(_morph) {
43344
+ var morph = _morph;
43345
+ var parentMorph;
43346
+ while (parentMorph = morph.parentMorph) {
43347
+ if (morph !== parentMorph.lastChildMorph) {
43348
+ break;
43349
+ }
43350
+ if (morph.lastNode === parentMorph.lastNode) {
43351
+ break;
43352
+ }
43353
+
43354
+ parentMorph.lastNode = morph.lastNode;
43305
43355
 
43306
- Morph.prototype.updateHTML = function (html) {
43307
- var parent = this.element || this.parent();
43308
- if (!html) {
43309
- return this._updateText(parent, '');
43356
+ morph = parentMorph;
43310
43357
  }
43311
- this._updateHTML(parent, html);
43358
+ }
43359
+
43360
+ // return morph content to an undifferentiated state
43361
+ // drops knowledge that the node has content.
43362
+ // this is for rerender, I need to test, but basically
43363
+ // the idea is to leave the content, but allow render again
43364
+ // without appending, so n
43365
+ Morph.prototype.reset = function Morph$reset() {
43366
+ this.firstChildMorph = null;
43367
+ this.lastChildMorph = null;
43312
43368
  };
43313
43369
 
43314
- Morph.prototype._update = function (parent, nodeOrString) {
43315
- if (nodeOrString === null || nodeOrString === undefined) {
43316
- this._updateText(parent, '');
43317
- } else if (typeof nodeOrString === 'string') {
43318
- if (this.escaped) {
43319
- this._updateText(parent, nodeOrString);
43370
+ Morph.prototype.destroy = function Morph$destroy() {
43371
+ var parentMorph = this.parentMorph;
43372
+ var previousMorph = this.previousMorph;
43373
+ var nextMorph = this.nextMorph;
43374
+ var firstNode = this.firstNode;
43375
+ var lastNode = this.lastNode;
43376
+ var parentNode = firstNode && firstNode.parentNode;
43377
+
43378
+ if (previousMorph) {
43379
+ if (nextMorph) {
43380
+ previousMorph.nextMorph = nextMorph;
43381
+ nextMorph.previousMorph = previousMorph;
43320
43382
  } else {
43321
- this._updateHTML(parent, nodeOrString);
43383
+ previousMorph.nextMorph = null;
43384
+ if (parentMorph) { parentMorph.lastChildMorph = previousMorph; }
43322
43385
  }
43323
- } else if (nodeOrString.nodeType) {
43324
- this._updateNode(parent, nodeOrString);
43325
- } else if (nodeOrString.string) { // duck typed SafeString
43326
- this._updateHTML(parent, nodeOrString.string);
43327
43386
  } else {
43328
- this._updateText(parent, nodeOrString.toString());
43387
+ if (nextMorph) {
43388
+ nextMorph.previousMorph = null;
43389
+ if (parentMorph) { parentMorph.firstChildMorph = nextMorph; }
43390
+ } else if (parentMorph) {
43391
+ parentMorph.lastChildMorph = parentMorph.firstChildMorph = null;
43392
+ }
43329
43393
  }
43330
- };
43331
43394
 
43332
- Morph.prototype._updateNode = function (parent, node) {
43333
- if (this.text) {
43334
- if (node.nodeType === 3) {
43335
- this.text.nodeValue = node.nodeValue;
43395
+ this.parentMorph = null;
43396
+ this.firstNode = null;
43397
+ this.lastNode = null;
43398
+
43399
+ if (parentMorph) {
43400
+ if (!parentMorph.firstChildMorph) {
43401
+ // list is empty
43402
+ parentMorph.clear();
43336
43403
  return;
43337
43404
  } else {
43338
- this.text = null;
43405
+ syncFirstNode(parentMorph.firstChildMorph);
43406
+ syncLastNode(parentMorph.lastChildMorph);
43339
43407
  }
43340
43408
  }
43341
- var start = this.start, end = this.end;
43342
- clear(parent, start, end);
43343
- parent.insertBefore(node, end);
43344
- if (this.before !== null) {
43345
- this.before.end = start.nextSibling;
43346
- }
43347
- if (this.after !== null) {
43348
- this.after.start = end.previousSibling;
43349
- }
43350
- };
43351
43409
 
43352
- Morph.prototype._updateText = function (parent, text) {
43353
- if (this.text) {
43354
- this.text.nodeValue = text;
43355
- return;
43356
- }
43357
- var node = this.domHelper.createTextNode(text);
43358
- this.text = node;
43359
- clear(parent, this.start, this.end);
43360
- parent.insertBefore(node, this.end);
43361
- if (this.before !== null) {
43362
- this.before.end = node;
43363
- }
43364
- if (this.after !== null) {
43365
- this.after.start = node;
43366
- }
43410
+ clear(parentNode, firstNode, lastNode);
43367
43411
  };
43368
43412
 
43369
- Morph.prototype._updateHTML = function (parent, html) {
43370
- var start = this.start, end = this.end;
43371
- clear(parent, start, end);
43372
- this.text = null;
43373
- var childNodes = this.domHelper.parseHTML(html, this.contextualElement);
43374
- appendChildren(parent, end, childNodes);
43375
- if (this.before !== null) {
43376
- this.before.end = start.nextSibling;
43377
- }
43378
- if (this.after !== null) {
43379
- this.after.start = end.previousSibling;
43380
- }
43413
+ Morph.prototype.setHTML = function(text) {
43414
+ var fragment = this.domHelper.parseHTML(text, this.contextualElement);
43415
+ return this.setNode(fragment);
43381
43416
  };
43382
43417
 
43383
- Morph.prototype.append = function (node) {
43384
- if (this.morphs === null) {
43385
- this.morphs = [];
43386
- }
43387
- var index = this.morphs.length;
43388
- return this.insert(index, node);
43418
+ Morph.prototype.appendContent = function(content) {
43419
+ return this.insertContentBeforeMorph(content, null);
43389
43420
  };
43390
43421
 
43391
- Morph.prototype.insert = function (index, node) {
43392
- if (this.morphs === null) {
43393
- this.morphs = [];
43394
- }
43395
- var parent = this.element || this.parent();
43396
- var morphs = this.morphs;
43397
- var before = index > 0 ? morphs[index-1] : null;
43398
- var after = index < morphs.length ? morphs[index] : null;
43399
- var start = before === null ? this.start : (before.end === null ? parent.lastChild : before.end.previousSibling);
43400
- var end = after === null ? this.end : (after.start === null ? parent.firstChild : after.start.nextSibling);
43401
- var morph = new Morph(parent, start, end, this.domHelper, this.contextualElement);
43422
+ Morph.prototype.insertContentBeforeMorph = function (content, referenceMorph) {
43423
+ var morph = new Morph(this.domHelper, this.contextualElement);
43424
+ morph.setContent(content);
43425
+ this.insertBeforeMorph(morph, referenceMorph);
43426
+ return morph;
43427
+ };
43402
43428
 
43403
- morph.owner = this;
43404
- morph._update(parent, node);
43429
+ Morph.prototype.appendMorph = function(morph) {
43430
+ this.insertBeforeMorph(morph, null);
43431
+ };
43405
43432
 
43406
- if (before !== null) {
43407
- morph.before = before;
43408
- before.end = start.nextSibling;
43409
- before.after = morph;
43433
+ Morph.prototype.insertBeforeMorph = function(morph, referenceMorph) {
43434
+ if (referenceMorph && referenceMorph.parentMorph !== this) {
43435
+ throw new Error('The morph before which the new morph is to be inserted is not a child of this morph.');
43410
43436
  }
43411
43437
 
43412
- if (after !== null) {
43413
- morph.after = after;
43414
- after.before = morph;
43415
- after.start = end.previousSibling;
43416
- }
43438
+ morph.parentMorph = this;
43417
43439
 
43418
- this.morphs.splice(index, 0, morph);
43419
- return morph;
43420
- };
43440
+ var parentNode = this.firstNode.parentNode;
43421
43441
 
43422
- Morph.prototype.replace = function (index, removedLength, addedNodes) {
43423
- if (this.morphs === null) {
43424
- this.morphs = [];
43425
- }
43426
- var parent = this.element || this.parent();
43427
- var morphs = this.morphs;
43428
- var before = index > 0 ? morphs[index-1] : null;
43429
- var after = index+removedLength < morphs.length ? morphs[index+removedLength] : null;
43430
- var start = before === null ? this.start : (before.end === null ? parent.lastChild : before.end.previousSibling);
43431
- var end = after === null ? this.end : (after.start === null ? parent.firstChild : after.start.nextSibling);
43432
- var addedLength = addedNodes === undefined ? 0 : addedNodes.length;
43433
- var args, i, current;
43442
+ insertBefore(
43443
+ parentNode,
43444
+ morph.firstNode,
43445
+ morph.lastNode,
43446
+ referenceMorph ? referenceMorph.firstNode : this.lastNode.nextSibling
43447
+ );
43434
43448
 
43435
- if (removedLength > 0) {
43436
- clear(parent, start, end);
43449
+ // was not in list mode replace current content
43450
+ if (!this.firstChildMorph) {
43451
+ clear(parentNode, this.firstNode, this.lastNode);
43437
43452
  }
43438
43453
 
43439
- if (addedLength === 0) {
43440
- if (before !== null) {
43441
- before.after = after;
43442
- before.end = end;
43443
- }
43444
- if (after !== null) {
43445
- after.before = before;
43446
- after.start = start;
43447
- }
43448
- morphs.splice(index, removedLength);
43449
- return;
43454
+ var previousMorph = referenceMorph ? referenceMorph.previousMorph : this.lastChildMorph;
43455
+ if (previousMorph) {
43456
+ previousMorph.nextMorph = morph;
43457
+ morph.previousMorph = previousMorph;
43458
+ } else {
43459
+ this.firstChildMorph = morph;
43450
43460
  }
43451
43461
 
43452
- args = new Array(addedLength+2);
43453
- if (addedLength > 0) {
43454
- for (i=0; i<addedLength; i++) {
43455
- args[i+2] = current = new Morph(parent, start, end, this.domHelper, this.contextualElement);
43456
- current._update(parent, addedNodes[i]);
43457
- current.owner = this;
43458
- if (before !== null) {
43459
- current.before = before;
43460
- before.end = start.nextSibling;
43461
- before.after = current;
43462
- }
43463
- before = current;
43464
- start = end === null ? parent.lastChild : end.previousSibling;
43465
- }
43466
- if (after !== null) {
43467
- current.after = after;
43468
- after.before = current;
43469
- after.start = end.previousSibling;
43470
- }
43462
+ if (referenceMorph) {
43463
+ referenceMorph.previousMorph = morph;
43464
+ morph.nextMorph = referenceMorph;
43465
+ } else {
43466
+ this.lastChildMorph = morph;
43471
43467
  }
43472
43468
 
43473
- args[0] = index;
43474
- args[1] = removedLength;
43475
-
43476
- splice.apply(morphs, args);
43469
+ syncFirstNode(this.firstChildMorph);
43470
+ syncLastNode(this.lastChildMorph);
43477
43471
  };
43478
43472
 
43479
- function appendChildren(parent, end, nodeList) {
43480
- var ref = end;
43481
- var i = nodeList.length;
43482
- var node;
43473
+ __exports__["default"] = Morph;
43474
+ });
43475
+ enifed("morph-range/utils",
43476
+ ["exports"],
43477
+ function(__exports__) {
43478
+ "use strict";
43479
+ // inclusive of both nodes
43480
+ function clear(parentNode, firstNode, lastNode) {
43481
+ if (!parentNode) { return; }
43483
43482
 
43484
- while (i--) {
43485
- node = nodeList[i];
43486
- parent.insertBefore(node, ref);
43487
- ref = node;
43488
- }
43483
+ var node = firstNode;
43484
+ var nextNode;
43485
+ do {
43486
+ nextNode = node.nextSibling;
43487
+ parentNode.removeChild(node);
43488
+ if (node === lastNode) {
43489
+ break;
43490
+ }
43491
+ node = nextNode;
43492
+ } while (node);
43489
43493
  }
43490
43494
 
43491
- function clear(parent, start, end) {
43492
- var current, previous;
43493
- if (end === null) {
43494
- current = parent.lastChild;
43495
- } else {
43496
- current = end.previousSibling;
43497
- }
43498
-
43499
- while (current !== null && current !== start) {
43500
- previous = current.previousSibling;
43501
- parent.removeChild(current);
43502
- current = previous;
43503
- }
43495
+ __exports__.clear = clear;function insertBefore(parentNode, firstNode, lastNode, _refNode) {
43496
+ var node = lastNode;
43497
+ var refNode = _refNode;
43498
+ var prevNode;
43499
+ do {
43500
+ prevNode = node.previousSibling;
43501
+ parentNode.insertBefore(node, refNode);
43502
+ if (node === firstNode) {
43503
+ break;
43504
+ }
43505
+ refNode = node;
43506
+ node = prevNode;
43507
+ } while (node);
43504
43508
  }
43505
43509
 
43506
- __exports__["default"] = Morph;
43510
+ __exports__.insertBefore = insertBefore;
43507
43511
  });
43508
43512
  enifed("route-recognizer",
43509
43513
  ["./route-recognizer/dsl","exports"],