ember-rails 0.9.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +2 -0
- data/lib/ember/handlebars/template.rb +2 -2
- data/lib/ember/handlebars/version.rb +1 -1
- data/lib/ember/rails/version.rb +1 -1
- data/lib/ember/version.rb +1 -1
- data/vendor/ember/development/ember.js +1465 -676
- data/vendor/ember/development/handlebars-runtime.js +53 -3
- data/vendor/ember/development/handlebars.js +298 -89
- data/vendor/ember/production/ember.js +1442 -668
- data/vendor/ember/production/handlebars-runtime.js +53 -3
- data/vendor/ember/production/handlebars.js +298 -89
- metadata +4 -4
| @@ -55,7 +55,7 @@ var define, requireModule; | |
| 55 55 |  | 
| 56 56 | 
             
              @class Ember
         | 
| 57 57 | 
             
              @static
         | 
| 58 | 
            -
              @version 1.0.0- | 
| 58 | 
            +
              @version 1.0.0-rc.1
         | 
| 59 59 | 
             
            */
         | 
| 60 60 |  | 
| 61 61 | 
             
            if ('undefined' === typeof Ember) {
         | 
| @@ -82,10 +82,10 @@ Ember.toString = function() { return "Ember"; }; | |
| 82 82 | 
             
            /**
         | 
| 83 83 | 
             
              @property VERSION
         | 
| 84 84 | 
             
              @type String
         | 
| 85 | 
            -
              @default '1.0.0- | 
| 85 | 
            +
              @default '1.0.0-rc.1'
         | 
| 86 86 | 
             
              @final
         | 
| 87 87 | 
             
            */
         | 
| 88 | 
            -
            Ember.VERSION = '1.0.0- | 
| 88 | 
            +
            Ember.VERSION = '1.0.0-rc.1';
         | 
| 89 89 |  | 
| 90 90 | 
             
            /**
         | 
| 91 91 | 
             
              Standard environmental variables. You can define these in a global `ENV`
         | 
| @@ -155,20 +155,12 @@ Ember.K = function() { return this; }; | |
| 155 155 |  | 
| 156 156 | 
             
            if ('undefined' === typeof Ember.assert) { Ember.assert = Ember.K; }
         | 
| 157 157 | 
             
            if ('undefined' === typeof Ember.warn) { Ember.warn = Ember.K; }
         | 
| 158 | 
            +
            if ('undefined' === typeof Ember.debug) { Ember.debug = Ember.K; }
         | 
| 158 159 | 
             
            if ('undefined' === typeof Ember.deprecate) { Ember.deprecate = Ember.K; }
         | 
| 159 160 | 
             
            if ('undefined' === typeof Ember.deprecateFunc) {
         | 
| 160 161 | 
             
              Ember.deprecateFunc = function(_, func) { return func; };
         | 
| 161 162 | 
             
            }
         | 
| 162 163 |  | 
| 163 | 
            -
            // These are deprecated but still supported
         | 
| 164 | 
            -
             | 
| 165 | 
            -
            if ('undefined' === typeof ember_assert) { exports.ember_assert = Ember.K; }
         | 
| 166 | 
            -
            if ('undefined' === typeof ember_warn) { exports.ember_warn = Ember.K; }
         | 
| 167 | 
            -
            if ('undefined' === typeof ember_deprecate) { exports.ember_deprecate = Ember.K; }
         | 
| 168 | 
            -
            if ('undefined' === typeof ember_deprecateFunc) {
         | 
| 169 | 
            -
              exports.ember_deprecateFunc = function(_, func) { return func; };
         | 
| 170 | 
            -
            }
         | 
| 171 | 
            -
             | 
| 172 164 | 
             
            /**
         | 
| 173 165 | 
             
              Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from
         | 
| 174 166 | 
             
              jQuery master. We'll just bootstrap our own uuid now.
         | 
| @@ -183,14 +175,36 @@ Ember.uuid = 0; | |
| 183 175 | 
             
            // LOGGER
         | 
| 184 176 | 
             
            //
         | 
| 185 177 |  | 
| 178 | 
            +
            function consoleMethod(name) {
         | 
| 179 | 
            +
              if (imports.console && imports.console[name]) {
         | 
| 180 | 
            +
                // Older IE doesn't support apply, but Chrome needs it
         | 
| 181 | 
            +
                if (imports.console[name].apply) {
         | 
| 182 | 
            +
                  return function() {
         | 
| 183 | 
            +
                    imports.console[name].apply(imports.console, arguments);
         | 
| 184 | 
            +
                  };
         | 
| 185 | 
            +
                } else {
         | 
| 186 | 
            +
                  return function() {
         | 
| 187 | 
            +
                    var message = Array.prototype.join.call(arguments, ', ');
         | 
| 188 | 
            +
                    imports.console[name](message);
         | 
| 189 | 
            +
                  };
         | 
| 190 | 
            +
                }
         | 
| 191 | 
            +
              }
         | 
| 192 | 
            +
            }
         | 
| 193 | 
            +
             | 
| 186 194 | 
             
            /**
         | 
| 187 | 
            -
              Inside Ember-Metal, simply uses the `imports.console | 
| 195 | 
            +
              Inside Ember-Metal, simply uses the methods from `imports.console`.
         | 
| 188 196 | 
             
              Override this to provide more robust logging functionality.
         | 
| 189 197 |  | 
| 190 198 | 
             
              @class Logger
         | 
| 191 199 | 
             
              @namespace Ember
         | 
| 192 200 | 
             
            */
         | 
| 193 | 
            -
            Ember.Logger =  | 
| 201 | 
            +
            Ember.Logger = {
         | 
| 202 | 
            +
              log:   consoleMethod('log')   || Ember.K,
         | 
| 203 | 
            +
              warn:  consoleMethod('warn')  || Ember.K,
         | 
| 204 | 
            +
              error: consoleMethod('error') || Ember.K,
         | 
| 205 | 
            +
              info:  consoleMethod('info')  || Ember.K,
         | 
| 206 | 
            +
              debug: consoleMethod('debug') || consoleMethod('info') || Ember.K
         | 
| 207 | 
            +
            };
         | 
| 194 208 |  | 
| 195 209 |  | 
| 196 210 | 
             
            // ..........................................................
         | 
| @@ -1109,8 +1123,63 @@ Ember.subscribe = Ember.Instrumentation.subscribe; | |
| 1109 1123 |  | 
| 1110 1124 |  | 
| 1111 1125 | 
             
            (function() {
         | 
| 1112 | 
            -
             | 
| 1126 | 
            +
            var utils = Ember.EnumerableUtils = {
         | 
| 1127 | 
            +
              map: function(obj, callback, thisArg) {
         | 
| 1128 | 
            +
                return obj.map ? obj.map.call(obj, callback, thisArg) : Array.prototype.map.call(obj, callback, thisArg);
         | 
| 1129 | 
            +
              },
         | 
| 1130 | 
            +
             | 
| 1131 | 
            +
              forEach: function(obj, callback, thisArg) {
         | 
| 1132 | 
            +
                return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : Array.prototype.forEach.call(obj, callback, thisArg);
         | 
| 1133 | 
            +
              },
         | 
| 1134 | 
            +
             | 
| 1135 | 
            +
              indexOf: function(obj, element, index) {
         | 
| 1136 | 
            +
                return obj.indexOf ? obj.indexOf.call(obj, element, index) : Array.prototype.indexOf.call(obj, element, index);
         | 
| 1137 | 
            +
              },
         | 
| 1138 | 
            +
             | 
| 1139 | 
            +
              indexesOf: function(obj, elements) {
         | 
| 1140 | 
            +
                return elements === undefined ? [] : utils.map(elements, function(item) {
         | 
| 1141 | 
            +
                  return utils.indexOf(obj, item);
         | 
| 1142 | 
            +
                });
         | 
| 1143 | 
            +
              },
         | 
| 1144 | 
            +
             | 
| 1145 | 
            +
              addObject: function(array, item) {
         | 
| 1146 | 
            +
                var index = utils.indexOf(array, item);
         | 
| 1147 | 
            +
                if (index === -1) { array.push(item); }
         | 
| 1148 | 
            +
              },
         | 
| 1113 1149 |  | 
| 1150 | 
            +
              removeObject: function(array, item) {
         | 
| 1151 | 
            +
                var index = utils.indexOf(array, item);
         | 
| 1152 | 
            +
                if (index !== -1) { array.splice(index, 1); }
         | 
| 1153 | 
            +
              },
         | 
| 1154 | 
            +
             | 
| 1155 | 
            +
              replace: function(array, idx, amt, objects) {
         | 
| 1156 | 
            +
                if (array.replace) {
         | 
| 1157 | 
            +
                  return array.replace(idx, amt, objects);
         | 
| 1158 | 
            +
                } else {
         | 
| 1159 | 
            +
                  var args = Array.prototype.concat.apply([idx, amt], objects);
         | 
| 1160 | 
            +
                  return array.splice.apply(array, args);
         | 
| 1161 | 
            +
                }
         | 
| 1162 | 
            +
              },
         | 
| 1163 | 
            +
             | 
| 1164 | 
            +
              intersection: function(array1, array2) {
         | 
| 1165 | 
            +
                var intersection = [];
         | 
| 1166 | 
            +
             | 
| 1167 | 
            +
                array1.forEach(function(element) {
         | 
| 1168 | 
            +
                  if (array2.indexOf(element) >= 0) {
         | 
| 1169 | 
            +
                    intersection.push(element);
         | 
| 1170 | 
            +
                  }
         | 
| 1171 | 
            +
                });
         | 
| 1172 | 
            +
             | 
| 1173 | 
            +
                return intersection;
         | 
| 1174 | 
            +
              }
         | 
| 1175 | 
            +
            };
         | 
| 1176 | 
            +
             | 
| 1177 | 
            +
            })();
         | 
| 1178 | 
            +
             | 
| 1179 | 
            +
             | 
| 1180 | 
            +
             | 
| 1181 | 
            +
            (function() {
         | 
| 1182 | 
            +
            /*jshint newcap:false*/
         | 
| 1114 1183 | 
             
            /**
         | 
| 1115 1184 | 
             
            @module ember-metal
         | 
| 1116 1185 | 
             
            */
         | 
| @@ -1188,46 +1257,6 @@ Ember.ArrayPolyfills = { | |
| 1188 1257 | 
             
              indexOf: arrayIndexOf
         | 
| 1189 1258 | 
             
            };
         | 
| 1190 1259 |  | 
| 1191 | 
            -
            var utils = Ember.EnumerableUtils = {
         | 
| 1192 | 
            -
              map: function(obj, callback, thisArg) {
         | 
| 1193 | 
            -
                return obj.map ? obj.map.call(obj, callback, thisArg) : arrayMap.call(obj, callback, thisArg);
         | 
| 1194 | 
            -
              },
         | 
| 1195 | 
            -
             | 
| 1196 | 
            -
              forEach: function(obj, callback, thisArg) {
         | 
| 1197 | 
            -
                return obj.forEach ? obj.forEach.call(obj, callback, thisArg) : arrayForEach.call(obj, callback, thisArg);
         | 
| 1198 | 
            -
              },
         | 
| 1199 | 
            -
             | 
| 1200 | 
            -
              indexOf: function(obj, element, index) {
         | 
| 1201 | 
            -
                return obj.indexOf ? obj.indexOf.call(obj, element, index) : arrayIndexOf.call(obj, element, index);
         | 
| 1202 | 
            -
              },
         | 
| 1203 | 
            -
             | 
| 1204 | 
            -
              indexesOf: function(obj, elements) {
         | 
| 1205 | 
            -
                return elements === undefined ? [] : utils.map(elements, function(item) {
         | 
| 1206 | 
            -
                  return utils.indexOf(obj, item);
         | 
| 1207 | 
            -
                });
         | 
| 1208 | 
            -
              },
         | 
| 1209 | 
            -
             | 
| 1210 | 
            -
              addObject: function(array, item) {
         | 
| 1211 | 
            -
                var index = utils.indexOf(array, item);
         | 
| 1212 | 
            -
                if (index === -1) { array.push(item); }
         | 
| 1213 | 
            -
              },
         | 
| 1214 | 
            -
             | 
| 1215 | 
            -
              removeObject: function(array, item) {
         | 
| 1216 | 
            -
                var index = utils.indexOf(array, item);
         | 
| 1217 | 
            -
                if (index !== -1) { array.splice(index, 1); }
         | 
| 1218 | 
            -
              },
         | 
| 1219 | 
            -
             | 
| 1220 | 
            -
              replace: function(array, idx, amt, objects) {
         | 
| 1221 | 
            -
                if (array.replace) {
         | 
| 1222 | 
            -
                  return array.replace(idx, amt, objects);
         | 
| 1223 | 
            -
                } else {
         | 
| 1224 | 
            -
                  var args = Array.prototype.concat.apply([idx, amt], objects);
         | 
| 1225 | 
            -
                  return array.splice.apply(array, args);
         | 
| 1226 | 
            -
                }
         | 
| 1227 | 
            -
              }
         | 
| 1228 | 
            -
            };
         | 
| 1229 | 
            -
             | 
| 1230 | 
            -
             | 
| 1231 1260 | 
             
            if (Ember.SHIM_ES5) {
         | 
| 1232 1261 | 
             
              if (!Array.prototype.map) {
         | 
| 1233 1262 | 
             
                Array.prototype.map = arrayMap;
         | 
| @@ -1962,6 +1991,17 @@ var Descriptor = Ember.Descriptor = function() {}; | |
| 1962 1991 | 
             
            // DEFINING PROPERTIES API
         | 
| 1963 1992 | 
             
            //
         | 
| 1964 1993 |  | 
| 1994 | 
            +
            var MANDATORY_SETTER_FUNCTION = Ember.MANDATORY_SETTER_FUNCTION = function(value) {
         | 
| 1995 | 
            +
             | 
| 1996 | 
            +
            };
         | 
| 1997 | 
            +
             | 
| 1998 | 
            +
            var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
         | 
| 1999 | 
            +
              return function() {
         | 
| 2000 | 
            +
                var meta = this[META_KEY];
         | 
| 2001 | 
            +
                return meta && meta.values[name];
         | 
| 2002 | 
            +
              };
         | 
| 2003 | 
            +
            };
         | 
| 2004 | 
            +
             | 
| 1965 2005 | 
             
            /**
         | 
| 1966 2006 | 
             
              @private
         | 
| 1967 2007 |  | 
| @@ -2045,13 +2085,8 @@ Ember.defineProperty = function(obj, keyName, desc, data, meta) { | |
| 2045 2085 | 
             
                    objectDefineProperty(obj, keyName, {
         | 
| 2046 2086 | 
             
                      configurable: true,
         | 
| 2047 2087 | 
             
                      enumerable: true,
         | 
| 2048 | 
            -
                      set:  | 
| 2049 | 
            -
             | 
| 2050 | 
            -
                      },
         | 
| 2051 | 
            -
                      get: function() {
         | 
| 2052 | 
            -
                        var meta = this[META_KEY];
         | 
| 2053 | 
            -
                        return meta && meta.values[keyName];
         | 
| 2054 | 
            -
                      }
         | 
| 2088 | 
            +
                      set: MANDATORY_SETTER_FUNCTION,
         | 
| 2089 | 
            +
                      get: DEFAULT_GETTER_FUNCTION(keyName)
         | 
| 2055 2090 | 
             
                    });
         | 
| 2056 2091 | 
             
                  } else {
         | 
| 2057 2092 | 
             
                    obj[keyName] = data;
         | 
| @@ -2775,13 +2810,8 @@ Ember.watch = function(obj, keyName) { | |
| 2775 2810 | 
             
                    o_defineProperty(obj, keyName, {
         | 
| 2776 2811 | 
             
                      configurable: true,
         | 
| 2777 2812 | 
             
                      enumerable: true,
         | 
| 2778 | 
            -
                      set:  | 
| 2779 | 
            -
             | 
| 2780 | 
            -
                      },
         | 
| 2781 | 
            -
                      get: function() {
         | 
| 2782 | 
            -
                        var meta = this[META_KEY];
         | 
| 2783 | 
            -
                        return meta && meta.values[keyName];
         | 
| 2784 | 
            -
                      }
         | 
| 2813 | 
            +
                      set: Ember.MANDATORY_SETTER_FUNCTION,
         | 
| 2814 | 
            +
                      get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
         | 
| 2785 2815 | 
             
                    });
         | 
| 2786 2816 | 
             
                  }
         | 
| 2787 2817 | 
             
                } else {
         | 
| @@ -5693,7 +5723,8 @@ define("rsvp", | |
| 5693 5723 | 
             
                        callbacks, callbackTuple, callback, binding, event;
         | 
| 5694 5724 |  | 
| 5695 5725 | 
             
                    if (callbacks = allCallbacks[eventName]) {
         | 
| 5696 | 
            -
                       | 
| 5726 | 
            +
                      // Don't cache the callbacks.length since it may grow
         | 
| 5727 | 
            +
                      for (var i=0; i<callbacks.length; i++) {
         | 
| 5697 5728 | 
             
                        callbackTuple = callbacks[i];
         | 
| 5698 5729 | 
             
                        callback = callbackTuple[0];
         | 
| 5699 5730 | 
             
                        binding = callbackTuple[1];
         | 
| @@ -5811,9 +5842,41 @@ define("rsvp", | |
| 5811 5842 | 
             
                  });
         | 
| 5812 5843 | 
             
                }
         | 
| 5813 5844 |  | 
| 5845 | 
            +
                function all(promises) {
         | 
| 5846 | 
            +
                	var i, results = [];
         | 
| 5847 | 
            +
                	var allPromise = new Promise();
         | 
| 5848 | 
            +
                	var remaining = promises.length;
         | 
| 5849 | 
            +
             | 
| 5850 | 
            +
                  if (remaining === 0) {
         | 
| 5851 | 
            +
                    allPromise.resolve([]);
         | 
| 5852 | 
            +
                  }
         | 
| 5853 | 
            +
             | 
| 5854 | 
            +
                	var resolver = function(index) {
         | 
| 5855 | 
            +
                		return function(value) {
         | 
| 5856 | 
            +
                			resolve(index, value);
         | 
| 5857 | 
            +
                		};
         | 
| 5858 | 
            +
                	};
         | 
| 5859 | 
            +
             | 
| 5860 | 
            +
                	var resolve = function(index, value) {
         | 
| 5861 | 
            +
                		results[index] = value;
         | 
| 5862 | 
            +
                		if (--remaining === 0) {
         | 
| 5863 | 
            +
                			allPromise.resolve(results);
         | 
| 5864 | 
            +
                		}
         | 
| 5865 | 
            +
                	};
         | 
| 5866 | 
            +
             | 
| 5867 | 
            +
                	var reject = function(error) {
         | 
| 5868 | 
            +
                		allPromise.reject(error);
         | 
| 5869 | 
            +
                	};
         | 
| 5870 | 
            +
             | 
| 5871 | 
            +
                	for (i = 0; i < remaining; i++) {
         | 
| 5872 | 
            +
                		promises[i].then(resolver(i), reject);
         | 
| 5873 | 
            +
                	}
         | 
| 5874 | 
            +
                	return allPromise;
         | 
| 5875 | 
            +
                }
         | 
| 5876 | 
            +
             | 
| 5814 5877 | 
             
                EventTarget.mixin(Promise.prototype);
         | 
| 5815 5878 |  | 
| 5816 | 
            -
                RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget };
         | 
| 5879 | 
            +
                RSVP = { async: async, Promise: Promise, Event: Event, EventTarget: EventTarget, all: all, raiseOnUncaughtExceptions: true };
         | 
| 5817 5880 | 
             
                return RSVP;
         | 
| 5818 5881 | 
             
              });
         | 
| 5819 5882 |  | 
| @@ -5884,10 +5947,10 @@ define("container", | |
| 5884 5947 | 
             
                  this.resolver = parent && parent.resolver || function() {};
         | 
| 5885 5948 | 
             
                  this.registry = new InheritingDict(parent && parent.registry);
         | 
| 5886 5949 | 
             
                  this.cache = new InheritingDict(parent && parent.cache);
         | 
| 5887 | 
            -
                  this.typeInjections =  | 
| 5950 | 
            +
                  this.typeInjections = new InheritingDict(parent && parent.typeInjections);
         | 
| 5888 5951 | 
             
                  this.injections = {};
         | 
| 5889 | 
            -
                  this. | 
| 5890 | 
            -
                  this. | 
| 5952 | 
            +
                  this._options = new InheritingDict(parent && parent._options);
         | 
| 5953 | 
            +
                  this._typeOptions = new InheritingDict(parent && parent._typeOptions);
         | 
| 5891 5954 | 
             
                }
         | 
| 5892 5955 |  | 
| 5893 5956 | 
             
                Container.prototype = {
         | 
| @@ -5902,8 +5965,20 @@ define("container", | |
| 5902 5965 | 
             
                  },
         | 
| 5903 5966 |  | 
| 5904 5967 | 
             
                  register: function(type, name, factory, options) {
         | 
| 5905 | 
            -
                     | 
| 5906 | 
            -
             | 
| 5968 | 
            +
                    var fullName;
         | 
| 5969 | 
            +
             | 
| 5970 | 
            +
             | 
| 5971 | 
            +
                    if (type.indexOf(':') !== -1){
         | 
| 5972 | 
            +
                      options = factory;
         | 
| 5973 | 
            +
                      factory = name;
         | 
| 5974 | 
            +
                      fullName = type;
         | 
| 5975 | 
            +
                    } else {
         | 
| 5976 | 
            +
             | 
| 5977 | 
            +
                      fullName = type + ":" + name;
         | 
| 5978 | 
            +
                    }
         | 
| 5979 | 
            +
             | 
| 5980 | 
            +
                    this.registry.set(fullName, factory);
         | 
| 5981 | 
            +
                    this._options.set(fullName, options || {});
         | 
| 5907 5982 | 
             
                  },
         | 
| 5908 5983 |  | 
| 5909 5984 | 
             
                  resolve: function(fullName) {
         | 
| @@ -5937,19 +6012,31 @@ define("container", | |
| 5937 6012 | 
             
                  optionsForType: function(type, options) {
         | 
| 5938 6013 | 
             
                    if (this.parent) { illegalChildOperation('optionsForType'); }
         | 
| 5939 6014 |  | 
| 5940 | 
            -
                    this. | 
| 6015 | 
            +
                    this._typeOptions.set(type, options);
         | 
| 6016 | 
            +
                  },
         | 
| 6017 | 
            +
             | 
| 6018 | 
            +
                  options: function(type, options) {
         | 
| 6019 | 
            +
                    this.optionsForType(type, options);
         | 
| 5941 6020 | 
             
                  },
         | 
| 5942 6021 |  | 
| 5943 6022 | 
             
                  typeInjection: function(type, property, fullName) {
         | 
| 5944 6023 | 
             
                    if (this.parent) { illegalChildOperation('typeInjection'); }
         | 
| 5945 6024 |  | 
| 5946 | 
            -
                    var injections = this.typeInjections | 
| 6025 | 
            +
                    var injections = this.typeInjections.get(type);
         | 
| 6026 | 
            +
                    if (!injections) {
         | 
| 6027 | 
            +
                      injections = [];
         | 
| 6028 | 
            +
                      this.typeInjections.set(type, injections);
         | 
| 6029 | 
            +
                    }
         | 
| 5947 6030 | 
             
                    injections.push({ property: property, fullName: fullName });
         | 
| 5948 6031 | 
             
                  },
         | 
| 5949 6032 |  | 
| 5950 6033 | 
             
                  injection: function(factoryName, property, injectionName) {
         | 
| 5951 6034 | 
             
                    if (this.parent) { illegalChildOperation('injection'); }
         | 
| 5952 6035 |  | 
| 6036 | 
            +
                    if (factoryName.indexOf(':') === -1) {
         | 
| 6037 | 
            +
                      return this.typeInjection(factoryName, property, injectionName);
         | 
| 6038 | 
            +
                    }
         | 
| 6039 | 
            +
             | 
| 5953 6040 | 
             
                    var injections = this.injections[factoryName] = this.injections[factoryName] || [];
         | 
| 5954 6041 | 
             
                    injections.push({ property: property, fullName: injectionName });
         | 
| 5955 6042 | 
             
                  },
         | 
| @@ -6010,14 +6097,14 @@ define("container", | |
| 6010 6097 | 
             
                }
         | 
| 6011 6098 |  | 
| 6012 6099 | 
             
                function option(container, fullName, optionName) {
         | 
| 6013 | 
            -
                  var options = container. | 
| 6100 | 
            +
                  var options = container._options.get(fullName);
         | 
| 6014 6101 |  | 
| 6015 6102 | 
             
                  if (options && options[optionName] !== undefined) {
         | 
| 6016 6103 | 
             
                    return options[optionName];
         | 
| 6017 6104 | 
             
                  }
         | 
| 6018 6105 |  | 
| 6019 6106 | 
             
                  var type = fullName.split(":")[0];
         | 
| 6020 | 
            -
                  options = container. | 
| 6107 | 
            +
                  options = container._typeOptions.get(type);
         | 
| 6021 6108 |  | 
| 6022 6109 | 
             
                  if (options) {
         | 
| 6023 6110 | 
             
                    return options[optionName];
         | 
| @@ -6041,11 +6128,12 @@ define("container", | |
| 6041 6128 |  | 
| 6042 6129 | 
             
                  if (factory) {
         | 
| 6043 6130 | 
             
                    var injections = [];
         | 
| 6044 | 
            -
                    injections = injections.concat(container.typeInjections | 
| 6131 | 
            +
                    injections = injections.concat(container.typeInjections.get(type) || []);
         | 
| 6045 6132 | 
             
                    injections = injections.concat(container.injections[fullName] || []);
         | 
| 6046 6133 |  | 
| 6047 6134 | 
             
                    var hash = buildInjections(container, injections);
         | 
| 6048 6135 | 
             
                    hash.container = container;
         | 
| 6136 | 
            +
                    hash._debugContainerKey = fullName;
         | 
| 6049 6137 |  | 
| 6050 6138 | 
             
                    value = factory.create(hash);
         | 
| 6051 6139 |  | 
| @@ -6221,7 +6309,7 @@ Ember.empty = Ember.deprecateFunc("Ember.empty is deprecated. Please use Ember.i | |
| 6221 6309 | 
             
              Ember.compare('hello', 'hello');  // 0
         | 
| 6222 6310 | 
             
              Ember.compare('abc', 'dfg');      // -1
         | 
| 6223 6311 | 
             
              Ember.compare(2, 1);              // 1
         | 
| 6224 | 
            -
              ``` | 
| 6312 | 
            +
              ```
         | 
| 6225 6313 |  | 
| 6226 6314 | 
             
             @method compare
         | 
| 6227 6315 | 
             
             @for Ember
         | 
| @@ -7434,7 +7522,7 @@ Ember.Enumerable = Ember.Mixin.create( | |
| 7434 7522 | 
             
                @method find
         | 
| 7435 7523 | 
             
                @param {Function} callback The callback to execute
         | 
| 7436 7524 | 
             
                @param {Object} [target] The target object to use
         | 
| 7437 | 
            -
                @return {Object} Found item or ` | 
| 7525 | 
            +
                @return {Object} Found item or `undefined`.
         | 
| 7438 7526 | 
             
              */
         | 
| 7439 7527 | 
             
              find: function(callback, target) {
         | 
| 7440 7528 | 
             
                var len = get(this, 'length') ;
         | 
| @@ -7462,7 +7550,7 @@ Ember.Enumerable = Ember.Mixin.create( | |
| 7462 7550 | 
             
                @method findProperty
         | 
| 7463 7551 | 
             
                @param {String} key the property to test
         | 
| 7464 7552 | 
             
                @param {String} [value] optional value to test against.
         | 
| 7465 | 
            -
                @return {Object} found item or ` | 
| 7553 | 
            +
                @return {Object} found item or `undefined`
         | 
| 7466 7554 | 
             
              */
         | 
| 7467 7555 | 
             
              findProperty: function(key, value) {
         | 
| 7468 7556 | 
             
                return this.find(iter.apply(this, arguments));
         | 
| @@ -7522,7 +7610,7 @@ Ember.Enumerable = Ember.Mixin.create( | |
| 7522 7610 |  | 
| 7523 7611 | 
             
              /**
         | 
| 7524 7612 | 
             
                Returns `true` if the passed function returns true for any item in the
         | 
| 7525 | 
            -
                enumeration. This corresponds with the ` | 
| 7613 | 
            +
                enumeration. This corresponds with the `some()` method in JavaScript 1.6.
         | 
| 7526 7614 |  | 
| 7527 7615 | 
             
                The callback method you provide should have the following signature (all
         | 
| 7528 7616 | 
             
                parameters are optional):
         | 
| @@ -8042,7 +8130,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot | |
| 8042 8130 | 
             
                arr.indexOf("a", -1);   //  4
         | 
| 8043 8131 | 
             
                arr.indexOf("b", 3);    // -1
         | 
| 8044 8132 | 
             
                arr.indexOf("a", 100);  // -1
         | 
| 8045 | 
            -
                ``` | 
| 8133 | 
            +
                ```
         | 
| 8046 8134 |  | 
| 8047 8135 | 
             
                @method indexOf
         | 
| 8048 8136 | 
             
                @param {Object} object the item to search for
         | 
| @@ -8687,7 +8775,7 @@ Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable, | |
| 8687 8775 | 
             
                var colors = ["red", "green", "blue"];
         | 
| 8688 8776 | 
             
                colors.insertAt(2, "yellow");  // ["red", "green", "yellow", "blue"]
         | 
| 8689 8777 | 
             
                colors.insertAt(5, "orange");  // Error: Index out of range
         | 
| 8690 | 
            -
                ``` | 
| 8778 | 
            +
                ```
         | 
| 8691 8779 |  | 
| 8692 8780 | 
             
                @method insertAt
         | 
| 8693 8781 | 
             
                @param {Number} idx index of insert the object at.
         | 
| @@ -8988,9 +9076,6 @@ var get = Ember.get, set = Ember.set, defineProperty = Ember.defineProperty; | |
| 8988 9076 | 
             
            */
         | 
| 8989 9077 | 
             
            Ember.Observable = Ember.Mixin.create(/** @scope Ember.Observable.prototype */ {
         | 
| 8990 9078 |  | 
| 8991 | 
            -
              // compatibility
         | 
| 8992 | 
            -
              isObserverable: true,
         | 
| 8993 | 
            -
             | 
| 8994 9079 | 
             
              /**
         | 
| 8995 9080 | 
             
                Retrieves the value of a property from the object.
         | 
| 8996 9081 |  | 
| @@ -9577,7 +9662,7 @@ Ember.Evented = Ember.Mixin.create({ | |
| 9577 9662 | 
             
                event.
         | 
| 9578 9663 |  | 
| 9579 9664 | 
             
                ```javascript
         | 
| 9580 | 
            -
                person.on('didEat', food) {
         | 
| 9665 | 
            +
                person.on('didEat', function(food) {
         | 
| 9581 9666 | 
             
                  console.log('person ate some ' + food);
         | 
| 9582 9667 | 
             
                });
         | 
| 9583 9668 |  | 
| @@ -9856,9 +9941,9 @@ function makeCtor() { | |
| 9856 9941 | 
             
            }
         | 
| 9857 9942 |  | 
| 9858 9943 | 
             
            var CoreObject = makeCtor();
         | 
| 9944 | 
            +
            CoreObject.toString = function() { return "Ember.CoreObject"; };
         | 
| 9859 9945 |  | 
| 9860 9946 | 
             
            CoreObject.PrototypeMixin = Mixin.create({
         | 
| 9861 | 
            -
             | 
| 9862 9947 | 
             
              reopen: function() {
         | 
| 9863 9948 | 
             
                applyMixin(this, arguments, true);
         | 
| 9864 9949 | 
             
                return this;
         | 
| @@ -9959,9 +10044,10 @@ CoreObject.PrototypeMixin = Mixin.create({ | |
| 9959 10044 | 
             
                @return {Ember.Object} receiver
         | 
| 9960 10045 | 
             
              */
         | 
| 9961 10046 | 
             
              destroy: function() {
         | 
| 9962 | 
            -
                if (this. | 
| 10047 | 
            +
                if (this._didCallDestroy) { return; }
         | 
| 9963 10048 |  | 
| 9964 10049 | 
             
                this.isDestroying = true;
         | 
| 10050 | 
            +
                this._didCallDestroy = true;
         | 
| 9965 10051 |  | 
| 9966 10052 | 
             
                if (this.willDestroy) { this.willDestroy(); }
         | 
| 9967 10053 |  | 
| @@ -10029,6 +10115,8 @@ CoreObject.PrototypeMixin = Mixin.create({ | |
| 10029 10115 | 
             
              }
         | 
| 10030 10116 | 
             
            });
         | 
| 10031 10117 |  | 
| 10118 | 
            +
            CoreObject.PrototypeMixin.ownerConstructor = CoreObject;
         | 
| 10119 | 
            +
             | 
| 10032 10120 | 
             
            function makeToString(ret) {
         | 
| 10033 10121 | 
             
              return function() { return ret; };
         | 
| 10034 10122 | 
             
            }
         | 
| @@ -10166,6 +10254,8 @@ var ClassMixin = Mixin.create({ | |
| 10166 10254 |  | 
| 10167 10255 | 
             
            });
         | 
| 10168 10256 |  | 
| 10257 | 
            +
            ClassMixin.ownerConstructor = CoreObject;
         | 
| 10258 | 
            +
             | 
| 10169 10259 | 
             
            if (Ember.config.overrideClassMixin) {
         | 
| 10170 10260 | 
             
              Ember.config.overrideClassMixin(ClassMixin);
         | 
| 10171 10261 | 
             
            }
         | 
| @@ -10657,6 +10747,7 @@ Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Emb | |
| 10657 10747 | 
             
              @uses Ember.Observable
         | 
| 10658 10748 | 
             
            */
         | 
| 10659 10749 | 
             
            Ember.Object = Ember.CoreObject.extend(Ember.Observable);
         | 
| 10750 | 
            +
            Ember.Object.toString = function() { return "Ember.Object"; };
         | 
| 10660 10751 |  | 
| 10661 10752 | 
             
            })();
         | 
| 10662 10753 |  | 
| @@ -10717,16 +10808,28 @@ var Namespace = Ember.Namespace = Ember.Object.extend({ | |
| 10717 10808 |  | 
| 10718 10809 | 
             
            Namespace.reopenClass({
         | 
| 10719 10810 | 
             
              NAMESPACES: [Ember],
         | 
| 10811 | 
            +
              NAMESPACES_BY_ID: {},
         | 
| 10720 10812 | 
             
              PROCESSED: false,
         | 
| 10721 | 
            -
              processAll: processAllNamespaces
         | 
| 10813 | 
            +
              processAll: processAllNamespaces,
         | 
| 10814 | 
            +
              byName: function(name) {
         | 
| 10815 | 
            +
                if (!Ember.BOOTED) {
         | 
| 10816 | 
            +
                  processAllNamespaces();
         | 
| 10817 | 
            +
                }
         | 
| 10818 | 
            +
             | 
| 10819 | 
            +
                return NAMESPACES_BY_ID[name];
         | 
| 10820 | 
            +
              }
         | 
| 10722 10821 | 
             
            });
         | 
| 10723 10822 |  | 
| 10823 | 
            +
            var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
         | 
| 10824 | 
            +
             | 
| 10724 10825 | 
             
            var hasOwnProp = ({}).hasOwnProperty,
         | 
| 10725 10826 | 
             
                guidFor = Ember.guidFor;
         | 
| 10726 10827 |  | 
| 10727 10828 | 
             
            function processNamespace(paths, root, seen) {
         | 
| 10728 10829 | 
             
              var idx = paths.length;
         | 
| 10729 10830 |  | 
| 10831 | 
            +
              NAMESPACES_BY_ID[paths.join('.')] = root;
         | 
| 10832 | 
            +
             | 
| 10730 10833 | 
             
              // Loop over all of the keys in the namespace, looking for classes
         | 
| 10731 10834 | 
             
              for(var key in root) {
         | 
| 10732 10835 | 
             
                if (!hasOwnProp.call(root, key)) { continue; }
         | 
| @@ -10826,12 +10929,15 @@ function classToString() { | |
| 10826 10929 | 
             
            }
         | 
| 10827 10930 |  | 
| 10828 10931 | 
             
            function processAllNamespaces() {
         | 
| 10829 | 
            -
               | 
| 10932 | 
            +
              var unprocessedNamespaces = !Namespace.PROCESSED,
         | 
| 10933 | 
            +
                  unprocessedMixins = Ember.anyUnprocessedMixins;
         | 
| 10934 | 
            +
             | 
| 10935 | 
            +
              if (unprocessedNamespaces) {
         | 
| 10830 10936 | 
             
                findNamespaces();
         | 
| 10831 10937 | 
             
                Namespace.PROCESSED = true;
         | 
| 10832 10938 | 
             
              }
         | 
| 10833 10939 |  | 
| 10834 | 
            -
              if ( | 
| 10940 | 
            +
              if (unprocessedNamespaces || unprocessedMixins) {
         | 
| 10835 10941 | 
             
                var namespaces = Namespace.NAMESPACES, namespace;
         | 
| 10836 10942 | 
             
                for (var i=0, l=namespaces.length; i<l; i++) {
         | 
| 10837 10943 | 
             
                  namespace = namespaces[i];
         | 
| @@ -10957,9 +11063,7 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray, | |
| 10957 11063 |  | 
| 10958 11064 | 
             
               @property arrangedContent
         | 
| 10959 11065 | 
             
              */
         | 
| 10960 | 
            -
              arrangedContent: Ember.computed('content', | 
| 10961 | 
            -
                return get(this, 'content');
         | 
| 10962 | 
            -
              }),
         | 
| 11066 | 
            +
              arrangedContent: Ember.computed.alias('content'),
         | 
| 10963 11067 |  | 
| 10964 11068 | 
             
              /**
         | 
| 10965 11069 | 
             
                Should actually retrieve the object at the specified index from the
         | 
| @@ -11242,6 +11346,10 @@ Ember.ObjectProxy = Ember.Object.extend( | |
| 11242 11346 |  | 
| 11243 11347 | 
             
              }, 'content'),
         | 
| 11244 11348 |  | 
| 11349 | 
            +
              isTruthy: Ember.computed.bool('content'),
         | 
| 11350 | 
            +
             | 
| 11351 | 
            +
              _debugContainerKey: null,
         | 
| 11352 | 
            +
             | 
| 11245 11353 | 
             
              willWatchProperty: function (key) {
         | 
| 11246 11354 | 
             
                var contentKey = 'content.' + key;
         | 
| 11247 11355 | 
             
                addBeforeObserver(this, contentKey, null, contentPropertyWillChange);
         | 
| @@ -11666,7 +11774,7 @@ Ember.Deferred = Deferred; | |
| 11666 11774 | 
             
            @submodule ember-runtime
         | 
| 11667 11775 | 
             
            */
         | 
| 11668 11776 |  | 
| 11669 | 
            -
            var loadHooks = {};
         | 
| 11777 | 
            +
            var loadHooks = Ember.ENV.EMBER_LOAD_HOOKS || {};
         | 
| 11670 11778 | 
             
            var loaded = {};
         | 
| 11671 11779 |  | 
| 11672 11780 | 
             
            /**
         | 
| @@ -11753,6 +11861,9 @@ var get = Ember.get; | |
| 11753 11861 | 
             
              @extends Ember.Mixin
         | 
| 11754 11862 | 
             
            */
         | 
| 11755 11863 | 
             
            Ember.ControllerMixin = Ember.Mixin.create({
         | 
| 11864 | 
            +
              /* ducktype as a controller */
         | 
| 11865 | 
            +
              isController: true,
         | 
| 11866 | 
            +
             | 
| 11756 11867 | 
             
              /**
         | 
| 11757 11868 | 
             
                The object to which events from the view should be sent.
         | 
| 11758 11869 |  | 
| @@ -11771,6 +11882,8 @@ Ember.ControllerMixin = Ember.Mixin.create({ | |
| 11771 11882 |  | 
| 11772 11883 | 
             
              store: null,
         | 
| 11773 11884 |  | 
| 11885 | 
            +
              model: Ember.computed.alias('content'),
         | 
| 11886 | 
            +
             | 
| 11774 11887 | 
             
              send: function(actionName) {
         | 
| 11775 11888 | 
             
                var args = [].slice.call(arguments, 1), target;
         | 
| 11776 11889 |  | 
| @@ -11819,7 +11932,8 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach; | |
| 11819 11932 |  | 
| 11820 11933 | 
             
              songsController = Ember.ArrayController.create({
         | 
| 11821 11934 | 
             
                content: songs,
         | 
| 11822 | 
            -
                sortProperties: ['trackNumber']
         | 
| 11935 | 
            +
                sortProperties: ['trackNumber'],
         | 
| 11936 | 
            +
                sortAscending: true
         | 
| 11823 11937 | 
             
              });
         | 
| 11824 11938 |  | 
| 11825 11939 | 
             
              songsController.get('firstObject');  // {trackNumber: 2, title: 'Back in the U.S.S.R.'}
         | 
| @@ -11834,7 +11948,19 @@ var get = Ember.get, set = Ember.set, forEach = Ember.EnumerableUtils.forEach; | |
| 11834 11948 | 
             
              @uses Ember.MutableEnumerable
         | 
| 11835 11949 | 
             
            */
         | 
| 11836 11950 | 
             
            Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, {
         | 
| 11951 | 
            +
             | 
| 11952 | 
            +
              /**
         | 
| 11953 | 
            +
                Specifies which properties dictate the arrangedContent's sort order.
         | 
| 11954 | 
            +
             | 
| 11955 | 
            +
                @property {Array} sortProperties
         | 
| 11956 | 
            +
              */
         | 
| 11837 11957 | 
             
              sortProperties: null,
         | 
| 11958 | 
            +
             | 
| 11959 | 
            +
              /**
         | 
| 11960 | 
            +
                Specifies the arrangedContent's sort direction
         | 
| 11961 | 
            +
             | 
| 11962 | 
            +
                @property {Boolean} sortAscending
         | 
| 11963 | 
            +
              */
         | 
| 11838 11964 | 
             
              sortAscending: true,
         | 
| 11839 11965 |  | 
| 11840 11966 | 
             
              orderBy: function(item1, item2) {
         | 
| @@ -11870,9 +11996,7 @@ Ember.SortableMixin = Ember.Mixin.create(Ember.MutableEnumerable, { | |
| 11870 11996 | 
             
                return this._super();
         | 
| 11871 11997 | 
             
              },
         | 
| 11872 11998 |  | 
| 11873 | 
            -
              isSorted: Ember.computed('sortProperties', | 
| 11874 | 
            -
                return !!get(this, 'sortProperties');
         | 
| 11875 | 
            -
              }),
         | 
| 11999 | 
            +
              isSorted: Ember.computed.bool('sortProperties'),
         | 
| 11876 12000 |  | 
| 11877 12001 | 
             
              arrangedContent: Ember.computed('content', 'sortProperties.@each', function(key, value) {
         | 
| 11878 12002 | 
             
                var content = get(this, 'content'),
         | 
| @@ -12147,20 +12271,22 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin, | |
| 12147 12271 |  | 
| 12148 12272 | 
             
              objectAtContent: function(idx) {
         | 
| 12149 12273 | 
             
                var length = get(this, 'length'),
         | 
| 12150 | 
            -
                    object = get(this,'arrangedContent').objectAt(idx) | 
| 12151 | 
            -
                    controllerClass = this.lookupItemController(object);
         | 
| 12274 | 
            +
                    object = get(this,'arrangedContent').objectAt(idx);
         | 
| 12152 12275 |  | 
| 12153 | 
            -
                if ( | 
| 12154 | 
            -
                   | 
| 12155 | 
            -
             | 
| 12156 | 
            -
             | 
| 12157 | 
            -
                   | 
| 12158 | 
            -
                  // controllerClass is defined but the index is out of range,  we want to
         | 
| 12159 | 
            -
                  // return the "out of range" value, whatever that might be.  Rather than
         | 
| 12160 | 
            -
                  // make assumptions (e.g. guessing `null` or `undefined`) we defer this to
         | 
| 12161 | 
            -
                  // `arrangedContent`.
         | 
| 12162 | 
            -
                  return object;
         | 
| 12276 | 
            +
                if (idx >= 0 && idx < length) {
         | 
| 12277 | 
            +
                  var controllerClass = this.lookupItemController(object);
         | 
| 12278 | 
            +
                  if (controllerClass) {
         | 
| 12279 | 
            +
                    return this.controllerAt(idx, object, controllerClass);
         | 
| 12280 | 
            +
                  }
         | 
| 12163 12281 | 
             
                }
         | 
| 12282 | 
            +
             | 
| 12283 | 
            +
                // When `controllerClass` is falsy, we have not opted in to using item
         | 
| 12284 | 
            +
                // controllers, so return the object directly.
         | 
| 12285 | 
            +
             | 
| 12286 | 
            +
                // When the index is out of range, we want to return the "out of range"
         | 
| 12287 | 
            +
                // value, whatever that might be.  Rather than make assumptions
         | 
| 12288 | 
            +
                // (e.g. guessing `null` or `undefined`) we defer this to `arrangedContent`.
         | 
| 12289 | 
            +
                return object;
         | 
| 12164 12290 | 
             
              },
         | 
| 12165 12291 |  | 
| 12166 12292 | 
             
              arrangedContentDidChange: function() {
         | 
| @@ -12186,6 +12312,7 @@ Ember.ArrayController = Ember.ArrayProxy.extend(Ember.ControllerMixin, | |
| 12186 12312 |  | 
| 12187 12313 | 
             
              init: function() {
         | 
| 12188 12314 | 
             
                this._super();
         | 
| 12315 | 
            +
                if (!this.get('content')) { this.set('content', Ember.A()); }
         | 
| 12189 12316 | 
             
                this._resetSubContainers();
         | 
| 12190 12317 | 
             
              },
         | 
| 12191 12318 |  | 
| @@ -12558,6 +12685,21 @@ Ember._RenderBuffer.prototype = | |
| 12558 12685 | 
             
              */
         | 
| 12559 12686 | 
             
              elementAttributes: null,
         | 
| 12560 12687 |  | 
| 12688 | 
            +
              /**
         | 
| 12689 | 
            +
                A hash keyed on the name of the properties and whose value will be
         | 
| 12690 | 
            +
                applied to that property. For example, if you wanted to apply a
         | 
| 12691 | 
            +
                `checked=true` property to an element, you would set the
         | 
| 12692 | 
            +
                elementProperties hash to `{'checked':true}`.
         | 
| 12693 | 
            +
             | 
| 12694 | 
            +
                You should not maintain this hash yourself, rather, you should use
         | 
| 12695 | 
            +
                the `prop()` method of `Ember.RenderBuffer`.
         | 
| 12696 | 
            +
             | 
| 12697 | 
            +
                @property elementProperties
         | 
| 12698 | 
            +
                @type Hash
         | 
| 12699 | 
            +
                @default {}
         | 
| 12700 | 
            +
              */
         | 
| 12701 | 
            +
              elementProperties: null,
         | 
| 12702 | 
            +
             | 
| 12561 12703 | 
             
              /**
         | 
| 12562 12704 | 
             
                The tagname of the element an instance of `Ember.RenderBuffer` represents.
         | 
| 12563 12705 |  | 
| @@ -12680,6 +12822,41 @@ Ember._RenderBuffer.prototype = | |
| 12680 12822 | 
             
                return this;
         | 
| 12681 12823 | 
             
              },
         | 
| 12682 12824 |  | 
| 12825 | 
            +
              /**
         | 
| 12826 | 
            +
                Adds an property which will be rendered to the element.
         | 
| 12827 | 
            +
             | 
| 12828 | 
            +
                @method prop
         | 
| 12829 | 
            +
                @param {String} name The name of the property
         | 
| 12830 | 
            +
                @param {String} value The value to add to the property
         | 
| 12831 | 
            +
                @chainable
         | 
| 12832 | 
            +
                @return {Ember.RenderBuffer|String} this or the current property value
         | 
| 12833 | 
            +
              */
         | 
| 12834 | 
            +
              prop: function(name, value) {
         | 
| 12835 | 
            +
                var properties = this.elementProperties = (this.elementProperties || {});
         | 
| 12836 | 
            +
             | 
| 12837 | 
            +
                if (arguments.length === 1) {
         | 
| 12838 | 
            +
                  return properties[name];
         | 
| 12839 | 
            +
                } else {
         | 
| 12840 | 
            +
                  properties[name] = value;
         | 
| 12841 | 
            +
                }
         | 
| 12842 | 
            +
             | 
| 12843 | 
            +
                return this;
         | 
| 12844 | 
            +
              },
         | 
| 12845 | 
            +
             | 
| 12846 | 
            +
              /**
         | 
| 12847 | 
            +
                Remove an property from the list of properties to render.
         | 
| 12848 | 
            +
             | 
| 12849 | 
            +
                @method removeProp
         | 
| 12850 | 
            +
                @param {String} name The name of the property
         | 
| 12851 | 
            +
                @chainable
         | 
| 12852 | 
            +
              */
         | 
| 12853 | 
            +
              removeProp: function(name) {
         | 
| 12854 | 
            +
                var properties = this.elementProperties;
         | 
| 12855 | 
            +
                if (properties) { delete properties[name]; }
         | 
| 12856 | 
            +
             | 
| 12857 | 
            +
                return this;
         | 
| 12858 | 
            +
              },
         | 
| 12859 | 
            +
             | 
| 12683 12860 | 
             
              /**
         | 
| 12684 12861 | 
             
                Adds a style to the style attribute which will be rendered to the element.
         | 
| 12685 12862 |  | 
| @@ -12713,8 +12890,9 @@ Ember._RenderBuffer.prototype = | |
| 12713 12890 | 
             
                    id = this.elementId,
         | 
| 12714 12891 | 
             
                    classes = this.classes,
         | 
| 12715 12892 | 
             
                    attrs = this.elementAttributes,
         | 
| 12893 | 
            +
                    props = this.elementProperties,
         | 
| 12716 12894 | 
             
                    style = this.elementStyle,
         | 
| 12717 | 
            -
                    prop;
         | 
| 12895 | 
            +
                    attr, prop;
         | 
| 12718 12896 |  | 
| 12719 12897 | 
             
                buffer.push('<' + tagName);
         | 
| 12720 12898 |  | 
| @@ -12742,15 +12920,32 @@ Ember._RenderBuffer.prototype = | |
| 12742 12920 | 
             
                }
         | 
| 12743 12921 |  | 
| 12744 12922 | 
             
                if (attrs) {
         | 
| 12745 | 
            -
                  for ( | 
| 12746 | 
            -
                    if (attrs.hasOwnProperty( | 
| 12747 | 
            -
                      buffer.push(' ' +  | 
| 12923 | 
            +
                  for (attr in attrs) {
         | 
| 12924 | 
            +
                    if (attrs.hasOwnProperty(attr)) {
         | 
| 12925 | 
            +
                      buffer.push(' ' + attr + '="' + this._escapeAttribute(attrs[attr]) + '"');
         | 
| 12748 12926 | 
             
                    }
         | 
| 12749 12927 | 
             
                  }
         | 
| 12750 12928 |  | 
| 12751 12929 | 
             
                  this.elementAttributes = null;
         | 
| 12752 12930 | 
             
                }
         | 
| 12753 12931 |  | 
| 12932 | 
            +
                if (props) {
         | 
| 12933 | 
            +
                  for (prop in props) {
         | 
| 12934 | 
            +
                    if (props.hasOwnProperty(prop)) {
         | 
| 12935 | 
            +
                      var value = props[prop];
         | 
| 12936 | 
            +
                      if (value || typeof(value) === 'number') {
         | 
| 12937 | 
            +
                        if (value === true) {
         | 
| 12938 | 
            +
                          buffer.push(' ' + prop + '="' + prop + '"');
         | 
| 12939 | 
            +
                        } else {
         | 
| 12940 | 
            +
                          buffer.push(' ' + prop + '="' + this._escapeAttribute(props[prop]) + '"');
         | 
| 12941 | 
            +
                        }
         | 
| 12942 | 
            +
                      }
         | 
| 12943 | 
            +
                    }
         | 
| 12944 | 
            +
                  }
         | 
| 12945 | 
            +
             | 
| 12946 | 
            +
                  this.elementProperties = null;
         | 
| 12947 | 
            +
                }
         | 
| 12948 | 
            +
             | 
| 12754 12949 | 
             
                buffer.push('>');
         | 
| 12755 12950 | 
             
              },
         | 
| 12756 12951 |  | 
| @@ -12770,8 +12965,9 @@ Ember._RenderBuffer.prototype = | |
| 12770 12965 | 
             
                    id = this.elementId,
         | 
| 12771 12966 | 
             
                    classes = this.classes,
         | 
| 12772 12967 | 
             
                    attrs = this.elementAttributes,
         | 
| 12968 | 
            +
                    props = this.elementProperties,
         | 
| 12773 12969 | 
             
                    style = this.elementStyle,
         | 
| 12774 | 
            -
                    styleBuffer = '', prop;
         | 
| 12970 | 
            +
                    styleBuffer = '', attr, prop;
         | 
| 12775 12971 |  | 
| 12776 12972 | 
             
                if (id) {
         | 
| 12777 12973 | 
             
                  $element.attr('id', id);
         | 
| @@ -12795,15 +12991,25 @@ Ember._RenderBuffer.prototype = | |
| 12795 12991 | 
             
                }
         | 
| 12796 12992 |  | 
| 12797 12993 | 
             
                if (attrs) {
         | 
| 12798 | 
            -
                  for ( | 
| 12799 | 
            -
                    if (attrs.hasOwnProperty( | 
| 12800 | 
            -
                      $element.attr( | 
| 12994 | 
            +
                  for (attr in attrs) {
         | 
| 12995 | 
            +
                    if (attrs.hasOwnProperty(attr)) {
         | 
| 12996 | 
            +
                      $element.attr(attr, attrs[attr]);
         | 
| 12801 12997 | 
             
                    }
         | 
| 12802 12998 | 
             
                  }
         | 
| 12803 12999 |  | 
| 12804 13000 | 
             
                  this.elementAttributes = null;
         | 
| 12805 13001 | 
             
                }
         | 
| 12806 13002 |  | 
| 13003 | 
            +
                if (props) {
         | 
| 13004 | 
            +
                  for (prop in props) {
         | 
| 13005 | 
            +
                    if (props.hasOwnProperty(prop)) {
         | 
| 13006 | 
            +
                      $element.prop(prop, props[prop]);
         | 
| 13007 | 
            +
                    }
         | 
| 13008 | 
            +
                  }
         | 
| 13009 | 
            +
             | 
| 13010 | 
            +
                  this.elementProperties = null;
         | 
| 13011 | 
            +
                }
         | 
| 13012 | 
            +
             | 
| 12807 13013 | 
             
                return element;
         | 
| 12808 13014 | 
             
              },
         | 
| 12809 13015 |  | 
| @@ -13017,11 +13223,13 @@ Ember.EventDispatcher = Ember.Object.extend( | |
| 13017 13223 | 
             
                rootElement.delegate('[data-ember-action]', event + '.ember', function(evt) {
         | 
| 13018 13224 | 
             
                  return Ember.handleErrors(function() {
         | 
| 13019 13225 | 
             
                    var actionId = Ember.$(evt.currentTarget).attr('data-ember-action'),
         | 
| 13020 | 
            -
                        action   = Ember.Handlebars.ActionHelper.registeredActions[actionId] | 
| 13021 | 
            -
                        handler  = action.handler;
         | 
| 13226 | 
            +
                        action   = Ember.Handlebars.ActionHelper.registeredActions[actionId];
         | 
| 13022 13227 |  | 
| 13023 | 
            -
                     | 
| 13024 | 
            -
             | 
| 13228 | 
            +
                    // We have to check for action here since in some cases, jQuery will trigger
         | 
| 13229 | 
            +
                    // an event on `removeChild` (i.e. focusout) after we've already torn down the
         | 
| 13230 | 
            +
                    // action handlers for the view.
         | 
| 13231 | 
            +
                    if (action && action.eventName === eventName) {
         | 
| 13232 | 
            +
                      return action.handler(evt);
         | 
| 13025 13233 | 
             
                    }
         | 
| 13026 13234 | 
             
                  }, this);
         | 
| 13027 13235 | 
             
                });
         | 
| @@ -13110,7 +13318,25 @@ Ember.ControllerMixin.reopen({ | |
| 13110 13318 | 
             
              target: null,
         | 
| 13111 13319 | 
             
              namespace: null,
         | 
| 13112 13320 | 
             
              view: null,
         | 
| 13113 | 
            -
              container: null
         | 
| 13321 | 
            +
              container: null,
         | 
| 13322 | 
            +
              _childContainers: null,
         | 
| 13323 | 
            +
             | 
| 13324 | 
            +
              init: function() {
         | 
| 13325 | 
            +
                this._super();
         | 
| 13326 | 
            +
                set(this, '_childContainers', {});
         | 
| 13327 | 
            +
              },
         | 
| 13328 | 
            +
             | 
| 13329 | 
            +
              _modelDidChange: Ember.observer(function() {
         | 
| 13330 | 
            +
                var containers = get(this, '_childContainers'),
         | 
| 13331 | 
            +
                    container;
         | 
| 13332 | 
            +
             | 
| 13333 | 
            +
                for (var prop in containers) {
         | 
| 13334 | 
            +
                  if (!containers.hasOwnProperty(prop)) { continue; }
         | 
| 13335 | 
            +
                  containers[prop].destroy();
         | 
| 13336 | 
            +
                }
         | 
| 13337 | 
            +
             | 
| 13338 | 
            +
                set(this, '_childContainers', {});
         | 
| 13339 | 
            +
              }, 'model')
         | 
| 13114 13340 | 
             
            });
         | 
| 13115 13341 |  | 
| 13116 13342 | 
             
            })();
         | 
| @@ -13138,9 +13364,7 @@ var a_forEach = Ember.EnumerableUtils.forEach; | |
| 13138 13364 | 
             
            var a_addObject = Ember.EnumerableUtils.addObject;
         | 
| 13139 13365 |  | 
| 13140 13366 | 
             
            var childViewsProperty = Ember.computed(function() {
         | 
| 13141 | 
            -
              var childViews = this._childViews;
         | 
| 13142 | 
            -
             | 
| 13143 | 
            -
              var ret = Ember.A();
         | 
| 13367 | 
            +
              var childViews = this._childViews, ret = Ember.A(), view = this;
         | 
| 13144 13368 |  | 
| 13145 13369 | 
             
              a_forEach(childViews, function(view) {
         | 
| 13146 13370 | 
             
                if (view.isVirtual) {
         | 
| @@ -13150,6 +13374,14 @@ var childViewsProperty = Ember.computed(function() { | |
| 13150 13374 | 
             
                }
         | 
| 13151 13375 | 
             
              });
         | 
| 13152 13376 |  | 
| 13377 | 
            +
              ret.replace = function (idx, removedCount, addedViews) {
         | 
| 13378 | 
            +
                if (view instanceof Ember.ContainerView) {
         | 
| 13379 | 
            +
             | 
| 13380 | 
            +
                  return view.replace(idx, removedCount, addedViews);
         | 
| 13381 | 
            +
                }
         | 
| 13382 | 
            +
                throw new Error("childViews is immutable");
         | 
| 13383 | 
            +
              };
         | 
| 13384 | 
            +
             | 
| 13153 13385 | 
             
              return ret;
         | 
| 13154 13386 | 
             
            });
         | 
| 13155 13387 |  | 
| @@ -13175,7 +13407,10 @@ Ember.CoreView = Ember.Object.extend(Ember.Evented, { | |
| 13175 13407 |  | 
| 13176 13408 | 
             
                // Register the view for event handling. This hash is used by
         | 
| 13177 13409 | 
             
                // Ember.EventDispatcher to dispatch incoming events.
         | 
| 13178 | 
            -
                if (!this.isVirtual)  | 
| 13410 | 
            +
                if (!this.isVirtual) {
         | 
| 13411 | 
            +
             | 
| 13412 | 
            +
                  Ember.View.views[this.elementId] = this;
         | 
| 13413 | 
            +
                }
         | 
| 13179 13414 |  | 
| 13180 13415 | 
             
                this.addBeforeObserver('elementId', function() {
         | 
| 13181 13416 | 
             
                  throw new Error("Changing a view's elementId after creation is not allowed");
         | 
| @@ -13942,6 +14177,7 @@ Ember.View = Ember.CoreView.extend( | |
| 13942 14177 | 
             
                var templateName = get(this, 'templateName'),
         | 
| 13943 14178 | 
             
                    template = this.templateForName(templateName, 'template');
         | 
| 13944 14179 |  | 
| 14180 | 
            +
             | 
| 13945 14181 | 
             
                return template || get(this, 'defaultTemplate');
         | 
| 13946 14182 | 
             
              }).property('templateName'),
         | 
| 13947 14183 |  | 
| @@ -13983,6 +14219,7 @@ Ember.View = Ember.CoreView.extend( | |
| 13983 14219 | 
             
                var layoutName = get(this, 'layoutName'),
         | 
| 13984 14220 | 
             
                    layout = this.templateForName(layoutName, 'layout');
         | 
| 13985 14221 |  | 
| 14222 | 
            +
             | 
| 13986 14223 | 
             
                return layout || get(this, 'defaultLayout');
         | 
| 13987 14224 | 
             
              }).property('layoutName'),
         | 
| 13988 14225 |  | 
| @@ -14359,11 +14596,16 @@ Ember.View = Ember.CoreView.extend( | |
| 14359 14596 | 
             
                    oldClass = dasherizedClass;
         | 
| 14360 14597 | 
             
                  }
         | 
| 14361 14598 |  | 
| 14362 | 
            -
                   | 
| 14363 | 
            -
             | 
| 14599 | 
            +
                  this.registerObserver(this, parsedPath.path, observer);
         | 
| 14600 | 
            +
                  // Remove className so when the view is rerendered,
         | 
| 14601 | 
            +
                  // the className is added based on binding reevaluation
         | 
| 14364 14602 | 
             
                  this.one('willClearRender', function() {
         | 
| 14365 | 
            -
                     | 
| 14603 | 
            +
                    if (oldClass) {
         | 
| 14604 | 
            +
                      classNames.removeObject(oldClass);
         | 
| 14605 | 
            +
                      oldClass = null;
         | 
| 14606 | 
            +
                    }
         | 
| 14366 14607 | 
             
                  });
         | 
| 14608 | 
            +
             | 
| 14367 14609 | 
             
                }, this);
         | 
| 14368 14610 | 
             
              },
         | 
| 14369 14611 |  | 
| @@ -14395,11 +14637,7 @@ Ember.View = Ember.CoreView.extend( | |
| 14395 14637 | 
             
                    Ember.View.applyAttributeBindings(elem, attributeName, attributeValue);
         | 
| 14396 14638 | 
             
                  };
         | 
| 14397 14639 |  | 
| 14398 | 
            -
                   | 
| 14399 | 
            -
             | 
| 14400 | 
            -
                  this.one('willClearRender', function() {
         | 
| 14401 | 
            -
                    removeObserver(this, property, observer);
         | 
| 14402 | 
            -
                  });
         | 
| 14640 | 
            +
                  this.registerObserver(this, property, observer);
         | 
| 14403 14641 |  | 
| 14404 14642 | 
             
                  // Determine the current value and add it to the render buffer
         | 
| 14405 14643 | 
             
                  // if necessary.
         | 
| @@ -14610,7 +14848,7 @@ Ember.View = Ember.CoreView.extend( | |
| 14610 14848 | 
             
                // element.
         | 
| 14611 14849 | 
             
                // In the interim, we will just re-render if that happens. It is more
         | 
| 14612 14850 | 
             
                // important than elements get garbage collected.
         | 
| 14613 | 
            -
                this.destroyElement();
         | 
| 14851 | 
            +
                if (!this.removedFromDOM) { this.destroyElement(); }
         | 
| 14614 14852 | 
             
                this.invokeRecursively(function(view) {
         | 
| 14615 14853 | 
             
                  if (view.clearRenderedChildren) { view.clearRenderedChildren(); }
         | 
| 14616 14854 | 
             
                });
         | 
| @@ -15083,12 +15321,17 @@ Ember.View = Ember.CoreView.extend( | |
| 15083 15321 | 
             
                // so collect any information we need before calling super.
         | 
| 15084 15322 | 
             
                var childViews = this._childViews,
         | 
| 15085 15323 | 
             
                    parent = this._parentView,
         | 
| 15086 | 
            -
                    childLen;
         | 
| 15324 | 
            +
                    childLen, i;
         | 
| 15087 15325 |  | 
| 15088 15326 | 
             
                // destroy the element -- this will avoid each child view destroying
         | 
| 15089 15327 | 
             
                // the element over and over again...
         | 
| 15090 15328 | 
             
                if (!this.removedFromDOM) { this.destroyElement(); }
         | 
| 15091 15329 |  | 
| 15330 | 
            +
                childLen = childViews.length;
         | 
| 15331 | 
            +
                for (i=childLen-1; i>=0; i--) {
         | 
| 15332 | 
            +
                  childViews[i].removedFromDOM = true;
         | 
| 15333 | 
            +
                }
         | 
| 15334 | 
            +
             | 
| 15092 15335 | 
             
                // remove from non-virtual parent view if viewName was specified
         | 
| 15093 15336 | 
             
                if (this.viewName) {
         | 
| 15094 15337 | 
             
                  var nonVirtualParentView = get(this, 'parentView');
         | 
| @@ -15105,8 +15348,7 @@ Ember.View = Ember.CoreView.extend( | |
| 15105 15348 | 
             
                this.transitionTo('destroyed');
         | 
| 15106 15349 |  | 
| 15107 15350 | 
             
                childLen = childViews.length;
         | 
| 15108 | 
            -
                for ( | 
| 15109 | 
            -
                  childViews[i].removedFromDOM = true;
         | 
| 15351 | 
            +
                for (i=childLen-1; i>=0; i--) {
         | 
| 15110 15352 | 
             
                  childViews[i].destroy();
         | 
| 15111 15353 | 
             
                }
         | 
| 15112 15354 |  | 
| @@ -15251,6 +15493,14 @@ Ember.View = Ember.CoreView.extend( | |
| 15251 15493 | 
             
              */
         | 
| 15252 15494 | 
             
              handleEvent: function(eventName, evt) {
         | 
| 15253 15495 | 
             
                return this.currentState.handleEvent(this, eventName, evt);
         | 
| 15496 | 
            +
              },
         | 
| 15497 | 
            +
             | 
| 15498 | 
            +
              registerObserver: function(root, path, target, observer) {
         | 
| 15499 | 
            +
                Ember.addObserver(root, path, target, observer);
         | 
| 15500 | 
            +
             | 
| 15501 | 
            +
                this.one('willClearRender', function() {
         | 
| 15502 | 
            +
                  Ember.removeObserver(root, path, target, observer);
         | 
| 15503 | 
            +
                });
         | 
| 15254 15504 | 
             
              }
         | 
| 15255 15505 |  | 
| 15256 15506 | 
             
            });
         | 
| @@ -15441,13 +15691,17 @@ Ember.View.childViewsProperty = childViewsProperty; | |
| 15441 15691 |  | 
| 15442 15692 | 
             
            Ember.View.applyAttributeBindings = function(elem, name, value) {
         | 
| 15443 15693 | 
             
              var type = Ember.typeOf(value);
         | 
| 15444 | 
            -
              var currentValue = elem.attr(name);
         | 
| 15445 15694 |  | 
| 15446 15695 | 
             
              // if this changes, also change the logic in ember-handlebars/lib/helpers/binding.js
         | 
| 15447 | 
            -
              if ((type === 'string' || (type === 'number' && !isNaN(value))) | 
| 15448 | 
            -
                elem.attr(name | 
| 15449 | 
            -
             | 
| 15450 | 
            -
                 | 
| 15696 | 
            +
              if (name !== 'value' && (type === 'string' || (type === 'number' && !isNaN(value)))) {
         | 
| 15697 | 
            +
                if (value !== elem.attr(name)) {
         | 
| 15698 | 
            +
                  elem.attr(name, value);
         | 
| 15699 | 
            +
                }
         | 
| 15700 | 
            +
              } else if (name === 'value' || type === 'boolean') {
         | 
| 15701 | 
            +
                if (value !== elem.prop(name)) {
         | 
| 15702 | 
            +
                  // value and booleans should always be properties
         | 
| 15703 | 
            +
                  elem.prop(name, value);
         | 
| 15704 | 
            +
                }
         | 
| 15451 15705 | 
             
              } else if (!value) {
         | 
| 15452 15706 | 
             
                elem.removeAttr(name);
         | 
| 15453 15707 | 
             
              }
         | 
| @@ -15800,14 +16054,9 @@ var states = Ember.View.cloneStates(Ember.View.states); | |
| 15800 16054 | 
             
            var get = Ember.get, set = Ember.set, meta = Ember.meta;
         | 
| 15801 16055 | 
             
            var forEach = Ember.EnumerableUtils.forEach;
         | 
| 15802 16056 |  | 
| 15803 | 
            -
            var childViewsProperty = Ember.computed(function() {
         | 
| 15804 | 
            -
              return get(this, '_childViews');
         | 
| 15805 | 
            -
            }).property('_childViews');
         | 
| 15806 | 
            -
             | 
| 15807 16057 | 
             
            /**
         | 
| 15808 | 
            -
              A `ContainerView` is an `Ember.View` subclass that  | 
| 15809 | 
            -
              programatic management of  | 
| 15810 | 
            -
              update the `ContainerView` instance's rendered DOM representation.
         | 
| 16058 | 
            +
              A `ContainerView` is an `Ember.View` subclass that implements `Ember.MutableArray`
         | 
| 16059 | 
            +
              allowing programatic management of its child views.
         | 
| 15811 16060 |  | 
| 15812 16061 | 
             
              ## Setting Initial Child Views
         | 
| 15813 16062 |  | 
| @@ -15847,11 +16096,9 @@ var childViewsProperty = Ember.computed(function() { | |
| 15847 16096 |  | 
| 15848 16097 | 
             
              ## Adding and Removing Child Views
         | 
| 15849 16098 |  | 
| 15850 | 
            -
              The  | 
| 15851 | 
            -
              manipulating the `childViews` property directly.
         | 
| 16099 | 
            +
              The container view implements `Ember.MutableArray` allowing programatic management of its child views.
         | 
| 15852 16100 |  | 
| 15853 | 
            -
              To remove a view pass that view into a `removeObject` call on the container | 
| 15854 | 
            -
              `childViews` property.
         | 
| 16101 | 
            +
              To remove a view, pass that view into a `removeObject` call on the container view.
         | 
| 15855 16102 |  | 
| 15856 16103 | 
             
              Given an empty `<body>` the following code
         | 
| 15857 16104 |  | 
| @@ -15882,9 +16129,9 @@ var childViewsProperty = Ember.computed(function() { | |
| 15882 16129 | 
             
              Removing a view
         | 
| 15883 16130 |  | 
| 15884 16131 | 
             
              ```javascript
         | 
| 15885 | 
            -
              aContainer. | 
| 15886 | 
            -
              aContainer. | 
| 15887 | 
            -
              aContainer. | 
| 16132 | 
            +
              aContainer.toArray();  // [aContainer.aView, aContainer.bView]
         | 
| 16133 | 
            +
              aContainer.removeObject(aContainer.get('bView'));
         | 
| 16134 | 
            +
              aContainer.toArray();  // [aContainer.aView]
         | 
| 15888 16135 | 
             
              ```
         | 
| 15889 16136 |  | 
| 15890 16137 | 
             
              Will result in the following HTML
         | 
| @@ -15896,7 +16143,7 @@ var childViewsProperty = Ember.computed(function() { | |
| 15896 16143 | 
             
              ```
         | 
| 15897 16144 |  | 
| 15898 16145 | 
             
              Similarly, adding a child view is accomplished by adding `Ember.View` instances to the
         | 
| 15899 | 
            -
              container | 
| 16146 | 
            +
              container view.
         | 
| 15900 16147 |  | 
| 15901 16148 | 
             
              Given an empty `<body>` the following code
         | 
| 15902 16149 |  | 
| @@ -15931,9 +16178,9 @@ var childViewsProperty = Ember.computed(function() { | |
| 15931 16178 | 
             
                template: Ember.Handlebars.compile("Another view")
         | 
| 15932 16179 | 
             
              });
         | 
| 15933 16180 |  | 
| 15934 | 
            -
              aContainer. | 
| 15935 | 
            -
              aContainer. | 
| 15936 | 
            -
              aContainer. | 
| 16181 | 
            +
              aContainer.toArray();  // [aContainer.aView, aContainer.bView]
         | 
| 16182 | 
            +
              aContainer.pushObject(AnotherViewClass.create());
         | 
| 16183 | 
            +
              aContainer.toArray(); // [aContainer.aView, aContainer.bView, <AnotherViewClass instance>]
         | 
| 15937 16184 | 
             
              ```
         | 
| 15938 16185 |  | 
| 15939 16186 | 
             
              Will result in the following HTML
         | 
| @@ -15946,71 +16193,20 @@ var childViewsProperty = Ember.computed(function() { | |
| 15946 16193 | 
             
              </div>
         | 
| 15947 16194 | 
             
              ```
         | 
| 15948 16195 |  | 
| 15949 | 
            -
               | 
| 15950 | 
            -
              to `remove` or `removeFromParent` or calls to a container's `removeChild` may
         | 
| 15951 | 
            -
              not behave correctly.
         | 
| 16196 | 
            +
              ## Templates and Layout
         | 
| 15952 16197 |  | 
| 15953 | 
            -
               | 
| 15954 | 
            -
               | 
| 16198 | 
            +
              A `template`, `templateName`, `defaultTemplate`, `layout`, `layoutName` or
         | 
| 16199 | 
            +
              `defaultLayout` property on a container view will not result in the template
         | 
| 16200 | 
            +
              or layout being rendered. The HTML contents of a `Ember.ContainerView`'s DOM
         | 
| 16201 | 
            +
              representation will only be the rendered HTML of its child views.
         | 
| 15955 16202 |  | 
| 15956 | 
            -
               | 
| 15957 | 
            -
              from the container's `childView`s but keep its HTML within the container's
         | 
| 15958 | 
            -
              rendered view.
         | 
| 16203 | 
            +
              ## Binding a View to Display
         | 
| 15959 16204 |  | 
| 15960 | 
            -
               | 
| 15961 | 
            -
               | 
| 15962 | 
            -
             | 
| 15963 | 
            -
               | 
| 15964 | 
            -
               | 
| 15965 | 
            -
                classNames: ['the-container'],
         | 
| 15966 | 
            -
                childViews: ['aView', 'bView'],
         | 
| 15967 | 
            -
                aView: Ember.View.create({
         | 
| 15968 | 
            -
                  template: Ember.Handlebars.compile("A")
         | 
| 15969 | 
            -
                }),
         | 
| 15970 | 
            -
                bView: Ember.View.create({
         | 
| 15971 | 
            -
                  template: Ember.Handlebars.compile("B")
         | 
| 15972 | 
            -
                })
         | 
| 15973 | 
            -
              });
         | 
| 15974 | 
            -
             | 
| 15975 | 
            -
              aContainer.appendTo('body');
         | 
| 15976 | 
            -
              ```
         | 
| 15977 | 
            -
             | 
| 15978 | 
            -
              Results in the HTML
         | 
| 15979 | 
            -
             | 
| 15980 | 
            -
              ```html
         | 
| 15981 | 
            -
              <div class="ember-view the-container">
         | 
| 15982 | 
            -
                <div class="ember-view">A</div>
         | 
| 15983 | 
            -
                <div class="ember-view">B</div>
         | 
| 15984 | 
            -
              </div>
         | 
| 15985 | 
            -
              ```
         | 
| 15986 | 
            -
             | 
| 15987 | 
            -
              Calling `aContainer.get('aView').removeFromParent()` will result in the
         | 
| 15988 | 
            -
              following HTML
         | 
| 15989 | 
            -
             | 
| 15990 | 
            -
              ```html
         | 
| 15991 | 
            -
              <div class="ember-view the-container">
         | 
| 15992 | 
            -
                <div class="ember-view">B</div>
         | 
| 15993 | 
            -
              </div>
         | 
| 15994 | 
            -
              ```
         | 
| 15995 | 
            -
             | 
| 15996 | 
            -
              And the `Ember.View` instance stored in `aContainer.aView` will be removed from `aContainer`'s
         | 
| 15997 | 
            -
              `childViews` array.
         | 
| 15998 | 
            -
             | 
| 15999 | 
            -
              ## Templates and Layout
         | 
| 16000 | 
            -
             | 
| 16001 | 
            -
              A `template`, `templateName`, `defaultTemplate`, `layout`, `layoutName` or
         | 
| 16002 | 
            -
              `defaultLayout` property on a container view will not result in the template
         | 
| 16003 | 
            -
              or layout being rendered. The HTML contents of a `Ember.ContainerView`'s DOM
         | 
| 16004 | 
            -
              representation will only be the rendered HTML of its child views.
         | 
| 16005 | 
            -
             | 
| 16006 | 
            -
              ## Binding a View to Display
         | 
| 16007 | 
            -
             | 
| 16008 | 
            -
              If you would like to display a single view in your ContainerView, you can set
         | 
| 16009 | 
            -
              its `currentView` property. When the `currentView` property is set to a view
         | 
| 16010 | 
            -
              instance, it will be added to the ContainerView's `childViews` array. If the
         | 
| 16011 | 
            -
              `currentView` property is later changed to a different view, the new view
         | 
| 16012 | 
            -
              will replace the old view. If `currentView` is set to `null`, the last
         | 
| 16013 | 
            -
              `currentView` will be removed.
         | 
| 16205 | 
            +
              If you would like to display a single view in your ContainerView, you can set
         | 
| 16206 | 
            +
              its `currentView` property. When the `currentView` property is set to a view
         | 
| 16207 | 
            +
              instance, it will be added to the ContainerView. If the `currentView` property
         | 
| 16208 | 
            +
              is later changed to a different view, the new view will replace the old view.
         | 
| 16209 | 
            +
              If `currentView` is set to `null`, the last `currentView` will be removed.
         | 
| 16014 16210 |  | 
| 16015 16211 | 
             
              This functionality is useful for cases where you want to bind the display of
         | 
| 16016 16212 | 
             
              a ContainerView to a controller or state manager. For example, you can bind
         | 
| @@ -16032,15 +16228,16 @@ var childViewsProperty = Ember.computed(function() { | |
| 16032 16228 | 
             
              @namespace Ember
         | 
| 16033 16229 | 
             
              @extends Ember.View
         | 
| 16034 16230 | 
             
            */
         | 
| 16035 | 
            -
             | 
| 16036 | 
            -
            Ember.ContainerView = Ember.View.extend({
         | 
| 16231 | 
            +
            Ember.ContainerView = Ember.View.extend(Ember.MutableArray, {
         | 
| 16037 16232 | 
             
              states: states,
         | 
| 16038 16233 |  | 
| 16039 16234 | 
             
              init: function() {
         | 
| 16040 16235 | 
             
                this._super();
         | 
| 16041 16236 |  | 
| 16042 16237 | 
             
                var childViews = get(this, 'childViews');
         | 
| 16043 | 
            -
             | 
| 16238 | 
            +
             | 
| 16239 | 
            +
                // redefine view's childViews property that was obliterated
         | 
| 16240 | 
            +
                Ember.defineProperty(this, 'childViews', Ember.View.childViewsProperty);
         | 
| 16044 16241 |  | 
| 16045 16242 | 
             
                var _childViews = this._childViews;
         | 
| 16046 16243 |  | 
| @@ -16059,20 +16256,38 @@ Ember.ContainerView = Ember.View.extend({ | |
| 16059 16256 | 
             
                }, this);
         | 
| 16060 16257 |  | 
| 16061 16258 | 
             
                var currentView = get(this, 'currentView');
         | 
| 16062 | 
            -
                if (currentView)  | 
| 16259 | 
            +
                if (currentView) {
         | 
| 16260 | 
            +
                  _childViews.push(this.createChildView(currentView));
         | 
| 16261 | 
            +
                }
         | 
| 16262 | 
            +
              },
         | 
| 16063 16263 |  | 
| 16064 | 
            -
             | 
| 16065 | 
            -
                 | 
| 16264 | 
            +
              replace: function(idx, removedCount, addedViews) {
         | 
| 16265 | 
            +
                var addedCount = addedViews ? get(addedViews, 'length') : 0;
         | 
| 16066 16266 |  | 
| 16067 | 
            -
                 | 
| 16068 | 
            -
                 | 
| 16069 | 
            -
             | 
| 16070 | 
            -
                 | 
| 16071 | 
            -
                   | 
| 16072 | 
            -
             | 
| 16073 | 
            -
             | 
| 16267 | 
            +
                this.arrayContentWillChange(idx, removedCount, addedCount);
         | 
| 16268 | 
            +
                this.childViewsWillChange(this._childViews, idx, removedCount);
         | 
| 16269 | 
            +
             | 
| 16270 | 
            +
                if (addedCount === 0) {
         | 
| 16271 | 
            +
                  this._childViews.splice(idx, removedCount) ;
         | 
| 16272 | 
            +
                } else {
         | 
| 16273 | 
            +
                  var args = [idx, removedCount].concat(addedViews);
         | 
| 16274 | 
            +
                  this._childViews.splice.apply(this._childViews, args);
         | 
| 16275 | 
            +
                }
         | 
| 16276 | 
            +
             | 
| 16277 | 
            +
                this.arrayContentDidChange(idx, removedCount, addedCount);
         | 
| 16278 | 
            +
                this.childViewsDidChange(this._childViews, idx, removedCount, addedCount);
         | 
| 16279 | 
            +
             | 
| 16280 | 
            +
                return this;
         | 
| 16281 | 
            +
              },
         | 
| 16282 | 
            +
             | 
| 16283 | 
            +
              objectAt: function(idx) {
         | 
| 16284 | 
            +
                return this._childViews[idx];
         | 
| 16074 16285 | 
             
              },
         | 
| 16075 16286 |  | 
| 16287 | 
            +
              length: Ember.computed(function () {
         | 
| 16288 | 
            +
                return this._childViews.length;
         | 
| 16289 | 
            +
              }),
         | 
| 16290 | 
            +
             | 
| 16076 16291 | 
             
              /**
         | 
| 16077 16292 | 
             
                @private
         | 
| 16078 16293 |  | 
| @@ -16089,23 +16304,6 @@ Ember.ContainerView = Ember.View.extend({ | |
| 16089 16304 |  | 
| 16090 16305 | 
             
              instrumentName: 'render.container',
         | 
| 16091 16306 |  | 
| 16092 | 
            -
              /**
         | 
| 16093 | 
            -
                @private
         | 
| 16094 | 
            -
             | 
| 16095 | 
            -
                When the container view is destroyed, tear down the child views
         | 
| 16096 | 
            -
                array observer.
         | 
| 16097 | 
            -
             | 
| 16098 | 
            -
                @method willDestroy
         | 
| 16099 | 
            -
              */
         | 
| 16100 | 
            -
              willDestroy: function() {
         | 
| 16101 | 
            -
                get(this, 'childViews').removeArrayObserver(this, {
         | 
| 16102 | 
            -
                  willChange: 'childViewsWillChange',
         | 
| 16103 | 
            -
                  didChange: 'childViewsDidChange'
         | 
| 16104 | 
            -
                });
         | 
| 16105 | 
            -
             | 
| 16106 | 
            -
                this._super();
         | 
| 16107 | 
            -
              },
         | 
| 16108 | 
            -
             | 
| 16109 16307 | 
             
              /**
         | 
| 16110 16308 | 
             
                @private
         | 
| 16111 16309 |  | 
| @@ -16121,12 +16319,19 @@ Ember.ContainerView = Ember.View.extend({ | |
| 16121 16319 | 
             
                @param {Number} removed the number of child views removed
         | 
| 16122 16320 | 
             
              **/
         | 
| 16123 16321 | 
             
              childViewsWillChange: function(views, start, removed) {
         | 
| 16124 | 
            -
                 | 
| 16322 | 
            +
                this.propertyWillChange('childViews');
         | 
| 16125 16323 |  | 
| 16126 | 
            -
                 | 
| 16127 | 
            -
             | 
| 16324 | 
            +
                if (removed > 0) {
         | 
| 16325 | 
            +
                  var changedViews = views.slice(start, start+removed);
         | 
| 16326 | 
            +
                  // transition to preRender before clearing parentView
         | 
| 16327 | 
            +
                  this.currentState.childViewsWillChange(this, views, start, removed);
         | 
| 16328 | 
            +
                  this.initializeViews(changedViews, null, null);
         | 
| 16329 | 
            +
                }
         | 
| 16330 | 
            +
              },
         | 
| 16128 16331 |  | 
| 16129 | 
            -
             | 
| 16332 | 
            +
              removeChild: function(child) {
         | 
| 16333 | 
            +
                this.removeObject(child);
         | 
| 16334 | 
            +
                return this;
         | 
| 16130 16335 | 
             
              },
         | 
| 16131 16336 |  | 
| 16132 16337 | 
             
              /**
         | 
| @@ -16147,16 +16352,12 @@ Ember.ContainerView = Ember.View.extend({ | |
| 16147 16352 | 
             
                @param {Number} the number of child views added
         | 
| 16148 16353 | 
             
              */
         | 
| 16149 16354 | 
             
              childViewsDidChange: function(views, start, removed, added) {
         | 
| 16150 | 
            -
                 | 
| 16151 | 
            -
             | 
| 16152 | 
            -
             | 
| 16153 | 
            -
             | 
| 16154 | 
            -
             | 
| 16155 | 
            -
                 | 
| 16156 | 
            -
                this.initializeViews(changedViews, this, get(this, 'templateData'));
         | 
| 16157 | 
            -
             | 
| 16158 | 
            -
                // Let the current state handle the changes
         | 
| 16159 | 
            -
                this.currentState.childViewsDidChange(this, views, start, added);
         | 
| 16355 | 
            +
                if (added > 0) {
         | 
| 16356 | 
            +
                  var changedViews = views.slice(start, start+added);
         | 
| 16357 | 
            +
                  this.initializeViews(changedViews, this, get(this, 'templateData'));
         | 
| 16358 | 
            +
                  this.currentState.childViewsDidChange(this, views, start, added);
         | 
| 16359 | 
            +
                }
         | 
| 16360 | 
            +
                this.propertyDidChange('childViews');
         | 
| 16160 16361 | 
             
              },
         | 
| 16161 16362 |  | 
| 16162 16363 | 
             
              initializeViews: function(views, parentView, templateData) {
         | 
| @@ -16172,21 +16373,16 @@ Ember.ContainerView = Ember.View.extend({ | |
| 16172 16373 | 
             
              currentView: null,
         | 
| 16173 16374 |  | 
| 16174 16375 | 
             
              _currentViewWillChange: Ember.beforeObserver(function() {
         | 
| 16175 | 
            -
                var  | 
| 16176 | 
            -
                    currentView = get(this, 'currentView');
         | 
| 16177 | 
            -
             | 
| 16376 | 
            +
                var currentView = get(this, 'currentView');
         | 
| 16178 16377 | 
             
                if (currentView) {
         | 
| 16179 16378 | 
             
                  currentView.destroy();
         | 
| 16180 | 
            -
                  childViews.removeObject(currentView);
         | 
| 16181 16379 | 
             
                }
         | 
| 16182 16380 | 
             
              }, 'currentView'),
         | 
| 16183 16381 |  | 
| 16184 16382 | 
             
              _currentViewDidChange: Ember.observer(function() {
         | 
| 16185 | 
            -
                var  | 
| 16186 | 
            -
                    currentView = get(this, 'currentView');
         | 
| 16187 | 
            -
             | 
| 16383 | 
            +
                var currentView = get(this, 'currentView');
         | 
| 16188 16384 | 
             
                if (currentView) {
         | 
| 16189 | 
            -
                   | 
| 16385 | 
            +
                  this.pushObject(currentView);
         | 
| 16190 16386 | 
             
                }
         | 
| 16191 16387 | 
             
              }, 'currentView'),
         | 
| 16192 16388 |  | 
| @@ -16219,7 +16415,7 @@ Ember.merge(states.hasElement, { | |
| 16219 16415 | 
             
              },
         | 
| 16220 16416 |  | 
| 16221 16417 | 
             
              ensureChildrenAreInDOM: function(view) {
         | 
| 16222 | 
            -
                var childViews = view. | 
| 16418 | 
            +
                var childViews = view._childViews, i, len, childView, previous, buffer;
         | 
| 16223 16419 | 
             
                for (i = 0, len = childViews.length; i < len; i++) {
         | 
| 16224 16420 | 
             
                  childView = childViews[i];
         | 
| 16225 16421 | 
             
                  buffer = childView.renderToBufferIfNeeded();
         | 
| @@ -16484,6 +16680,10 @@ Ember.CollectionView = Ember.ContainerView.extend( | |
| 16484 16680 | 
             
                if (content) { content.removeArrayObserver(this); }
         | 
| 16485 16681 |  | 
| 16486 16682 | 
             
                this._super();
         | 
| 16683 | 
            +
             | 
| 16684 | 
            +
                if (this._createdEmptyView) {
         | 
| 16685 | 
            +
                  this._createdEmptyView.destroy();
         | 
| 16686 | 
            +
                }
         | 
| 16487 16687 | 
             
              },
         | 
| 16488 16688 |  | 
| 16489 16689 | 
             
              arrayWillChange: function(content, start, removedCount) {
         | 
| @@ -16497,9 +16697,9 @@ Ember.CollectionView = Ember.ContainerView.extend( | |
| 16497 16697 | 
             
                // Loop through child views that correspond with the removed items.
         | 
| 16498 16698 | 
             
                // Note that we loop from the end of the array to the beginning because
         | 
| 16499 16699 | 
             
                // we are mutating it as we go.
         | 
| 16500 | 
            -
                var childViews =  | 
| 16700 | 
            +
                var childViews = this._childViews, childView, idx, len;
         | 
| 16501 16701 |  | 
| 16502 | 
            -
                len =  | 
| 16702 | 
            +
                len = this._childViews.length;
         | 
| 16503 16703 |  | 
| 16504 16704 | 
             
                var removingAll = removedCount === len;
         | 
| 16505 16705 |  | 
| @@ -16529,7 +16729,6 @@ Ember.CollectionView = Ember.ContainerView.extend( | |
| 16529 16729 | 
             
              */
         | 
| 16530 16730 | 
             
              arrayDidChange: function(content, start, removed, added) {
         | 
| 16531 16731 | 
             
                var itemViewClass = get(this, 'itemViewClass'),
         | 
| 16532 | 
            -
                    childViews = get(this, 'childViews'),
         | 
| 16533 16732 | 
             
                    addedViews = [], view, item, idx, len, itemTagName;
         | 
| 16534 16733 |  | 
| 16535 16734 | 
             
                if ('string' === typeof itemViewClass) {
         | 
| @@ -16553,11 +16752,15 @@ Ember.CollectionView = Ember.ContainerView.extend( | |
| 16553 16752 | 
             
                  var emptyView = get(this, 'emptyView');
         | 
| 16554 16753 | 
             
                  if (!emptyView) { return; }
         | 
| 16555 16754 |  | 
| 16755 | 
            +
                  var isClass = Ember.CoreView.detect(emptyView);
         | 
| 16756 | 
            +
             | 
| 16556 16757 | 
             
                  emptyView = this.createChildView(emptyView);
         | 
| 16557 16758 | 
             
                  addedViews.push(emptyView);
         | 
| 16558 16759 | 
             
                  set(this, 'emptyView', emptyView);
         | 
| 16760 | 
            +
             | 
| 16761 | 
            +
                  if (isClass) { this._createdEmptyView = emptyView; }
         | 
| 16559 16762 | 
             
                }
         | 
| 16560 | 
            -
                 | 
| 16763 | 
            +
                this.replace(start, 0, addedViews);
         | 
| 16561 16764 | 
             
              },
         | 
| 16562 16765 |  | 
| 16563 16766 | 
             
              createChildView: function(view, attrs) {
         | 
| @@ -17169,6 +17372,8 @@ Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string) | |
| 17169 17372 | 
             
              return "data.buffer.push("+string+");";
         | 
| 17170 17373 | 
             
            };
         | 
| 17171 17374 |  | 
| 17375 | 
            +
            var prefix = "ember" + (+new Date()), incr = 1;
         | 
| 17376 | 
            +
             | 
| 17172 17377 | 
             
            /**
         | 
| 17173 17378 | 
             
              @private
         | 
| 17174 17379 |  | 
| @@ -17181,8 +17386,11 @@ Ember.Handlebars.JavaScriptCompiler.prototype.appendToBuffer = function(string) | |
| 17181 17386 | 
             
              @param mustache
         | 
| 17182 17387 | 
             
            */
         | 
| 17183 17388 | 
             
            Ember.Handlebars.Compiler.prototype.mustache = function(mustache) {
         | 
| 17184 | 
            -
              if (mustache. | 
| 17185 | 
            -
                 | 
| 17389 | 
            +
              if (mustache.isHelper && mustache.id.string === 'control') {
         | 
| 17390 | 
            +
                mustache.hash = mustache.hash || new Handlebars.AST.HashNode([]);
         | 
| 17391 | 
            +
                mustache.hash.pairs.push(["controlID", new Handlebars.AST.StringNode(prefix + incr++)]);
         | 
| 17392 | 
            +
              } else if (mustache.params.length || mustache.hash) {
         | 
| 17393 | 
            +
                // no changes required
         | 
| 17186 17394 | 
             
              } else {
         | 
| 17187 17395 | 
             
                var id = new Handlebars.AST.IdNode(['_triageMustache']);
         | 
| 17188 17396 |  | 
| @@ -17194,8 +17402,9 @@ Ember.Handlebars.Compiler.prototype.mustache = function(mustache) { | |
| 17194 17402 | 
             
                  mustache.hash.pairs.push(["unescaped", new Handlebars.AST.StringNode("true")]);
         | 
| 17195 17403 | 
             
                }
         | 
| 17196 17404 | 
             
                mustache = new Handlebars.AST.MustacheNode([id].concat([mustache.id]), mustache.hash, !mustache.escaped);
         | 
| 17197 | 
            -
                return Handlebars.Compiler.prototype.mustache.call(this, mustache);
         | 
| 17198 17405 | 
             
              }
         | 
| 17406 | 
            +
             | 
| 17407 | 
            +
              return Handlebars.Compiler.prototype.mustache.call(this, mustache);
         | 
| 17199 17408 | 
             
            };
         | 
| 17200 17409 |  | 
| 17201 17410 | 
             
            /**
         | 
| @@ -17254,6 +17463,8 @@ if (Handlebars.compile) { | |
| 17254 17463 | 
             
            })();
         | 
| 17255 17464 |  | 
| 17256 17465 | 
             
            (function() {
         | 
| 17466 | 
            +
            var slice = Array.prototype.slice;
         | 
| 17467 | 
            +
             | 
| 17257 17468 | 
             
            /**
         | 
| 17258 17469 | 
             
              @private
         | 
| 17259 17470 |  | 
| @@ -17308,7 +17519,7 @@ var normalizePath = Ember.Handlebars.normalizePath = function(root, path, data) | |
| 17308 17519 | 
             
              @param {String} path The path to be lookedup
         | 
| 17309 17520 | 
             
              @param {Object} options The template's option hash
         | 
| 17310 17521 | 
             
            */
         | 
| 17311 | 
            -
            Ember.Handlebars.get = function(root, path, options) {
         | 
| 17522 | 
            +
            var handlebarsGet = Ember.Handlebars.get = function(root, path, options) {
         | 
| 17312 17523 | 
             
              var data = options && options.data,
         | 
| 17313 17524 | 
             
                  normalizedPath = normalizePath(root, path, data),
         | 
| 17314 17525 | 
             
                  value;
         | 
| @@ -17330,6 +17541,41 @@ Ember.Handlebars.get = function(root, path, options) { | |
| 17330 17541 | 
             
            };
         | 
| 17331 17542 | 
             
            Ember.Handlebars.getPath = Ember.deprecateFunc('`Ember.Handlebars.getPath` has been changed to `Ember.Handlebars.get` for consistency.', Ember.Handlebars.get);
         | 
| 17332 17543 |  | 
| 17544 | 
            +
            Ember.Handlebars.resolveParams = function(context, params, options) {
         | 
| 17545 | 
            +
              var resolvedParams = [], types = options.types, param, type;
         | 
| 17546 | 
            +
             | 
| 17547 | 
            +
              for (var i=0, l=params.length; i<l; i++) {
         | 
| 17548 | 
            +
                param = params[i];
         | 
| 17549 | 
            +
                type = types[i];
         | 
| 17550 | 
            +
             | 
| 17551 | 
            +
                if (type === 'ID') {
         | 
| 17552 | 
            +
                  resolvedParams.push(handlebarsGet(context, param, options));
         | 
| 17553 | 
            +
                } else {
         | 
| 17554 | 
            +
                  resolvedParams.push(param);
         | 
| 17555 | 
            +
                }
         | 
| 17556 | 
            +
              }
         | 
| 17557 | 
            +
             | 
| 17558 | 
            +
              return resolvedParams;
         | 
| 17559 | 
            +
            };
         | 
| 17560 | 
            +
             | 
| 17561 | 
            +
            Ember.Handlebars.resolveHash = function(context, hash, options) {
         | 
| 17562 | 
            +
              var resolvedHash = {}, types = options.hashTypes, type;
         | 
| 17563 | 
            +
             | 
| 17564 | 
            +
              for (var key in hash) {
         | 
| 17565 | 
            +
                if (!hash.hasOwnProperty(key)) { continue; }
         | 
| 17566 | 
            +
             | 
| 17567 | 
            +
                type = types[key];
         | 
| 17568 | 
            +
             | 
| 17569 | 
            +
                if (type === 'ID') {
         | 
| 17570 | 
            +
                  resolvedHash[key] = handlebarsGet(context, hash[key], options);
         | 
| 17571 | 
            +
                } else {
         | 
| 17572 | 
            +
                  resolvedHash[key] = hash[key];
         | 
| 17573 | 
            +
                }
         | 
| 17574 | 
            +
              }
         | 
| 17575 | 
            +
             | 
| 17576 | 
            +
              return resolvedHash;
         | 
| 17577 | 
            +
            };
         | 
| 17578 | 
            +
             | 
| 17333 17579 | 
             
            /**
         | 
| 17334 17580 | 
             
              @private
         | 
| 17335 17581 |  | 
| @@ -17399,6 +17645,18 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) { | |
| 17399 17645 | 
             
              {{repeat text count=3}}
         | 
| 17400 17646 | 
             
              ```
         | 
| 17401 17647 |  | 
| 17648 | 
            +
              ## Example with bound options
         | 
| 17649 | 
            +
             | 
| 17650 | 
            +
              Bound hash options are also supported. Example: 
         | 
| 17651 | 
            +
             | 
| 17652 | 
            +
              ```handlebars
         | 
| 17653 | 
            +
              {{repeat text countBinding="numRepeats"}}
         | 
| 17654 | 
            +
              ```
         | 
| 17655 | 
            +
             | 
| 17656 | 
            +
              In this example, count will be bound to the value of
         | 
| 17657 | 
            +
              the `numRepeats` property on the context. If that property
         | 
| 17658 | 
            +
              changes, the helper will be re-rendered.
         | 
| 17659 | 
            +
             | 
| 17402 17660 | 
             
              ## Example with extra dependencies
         | 
| 17403 17661 |  | 
| 17404 17662 | 
             
              The `Ember.Handlebars.registerBoundHelper` method takes a variable length
         | 
| @@ -17411,6 +17669,37 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) { | |
| 17411 17669 | 
             
              }, 'name');
         | 
| 17412 17670 | 
             
              ```
         | 
| 17413 17671 |  | 
| 17672 | 
            +
              ## Example with multiple bound properties
         | 
| 17673 | 
            +
             | 
| 17674 | 
            +
              `Ember.Handlebars.registerBoundHelper` supports binding to
         | 
| 17675 | 
            +
              multiple properties, e.g.:
         | 
| 17676 | 
            +
             | 
| 17677 | 
            +
              ```javascript
         | 
| 17678 | 
            +
              Ember.Handlebars.registerBoundHelper('concatenate', function() {
         | 
| 17679 | 
            +
                var values = arguments[arguments.length - 1];
         | 
| 17680 | 
            +
                return values.join('||');
         | 
| 17681 | 
            +
              });
         | 
| 17682 | 
            +
              ```
         | 
| 17683 | 
            +
             | 
| 17684 | 
            +
              Which allows for template syntax such as {{concatenate prop1 prop2}} or
         | 
| 17685 | 
            +
              {{concatenate prop1 prop2 prop3}}. If any of the properties change,
         | 
| 17686 | 
            +
              the helpr will re-render.  Note that dependency keys cannot be
         | 
| 17687 | 
            +
              using in conjunction with multi-property helpers, since it is ambiguous
         | 
| 17688 | 
            +
              which property the dependent keys would belong to. 
         | 
| 17689 | 
            +
              
         | 
| 17690 | 
            +
              ## Use with unbound helper
         | 
| 17691 | 
            +
             | 
| 17692 | 
            +
              The {{unbound}} helper can be used with bound helper invocations 
         | 
| 17693 | 
            +
              to render them in their unbound form, e.g.
         | 
| 17694 | 
            +
             | 
| 17695 | 
            +
              ```handlebars
         | 
| 17696 | 
            +
              {{unbound capitalize name}} 
         | 
| 17697 | 
            +
              ```
         | 
| 17698 | 
            +
             | 
| 17699 | 
            +
              In this example, if the name property changes, the helper
         | 
| 17700 | 
            +
              will not re-render.
         | 
| 17701 | 
            +
             | 
| 17702 | 
            +
             | 
| 17414 17703 | 
             
              @method registerBoundHelper
         | 
| 17415 17704 | 
             
              @for Ember.Handlebars
         | 
| 17416 17705 | 
             
              @param {String} name
         | 
| @@ -17418,15 +17707,49 @@ Ember.Handlebars.registerHelper('helperMissing', function(path, options) { | |
| 17418 17707 | 
             
              @param {String} dependentKeys*
         | 
| 17419 17708 | 
             
            */
         | 
| 17420 17709 | 
             
            Ember.Handlebars.registerBoundHelper = function(name, fn) {
         | 
| 17421 | 
            -
              var dependentKeys =  | 
| 17422 | 
            -
             | 
| 17423 | 
            -
             | 
| 17710 | 
            +
              var dependentKeys = slice.call(arguments, 2);
         | 
| 17711 | 
            +
             | 
| 17712 | 
            +
              function helper() {
         | 
| 17713 | 
            +
                var properties = slice.call(arguments, 0, -1),
         | 
| 17714 | 
            +
                  numProperties = properties.length,
         | 
| 17715 | 
            +
                  options = arguments[arguments.length - 1],
         | 
| 17716 | 
            +
                  normalizedProperties = [],
         | 
| 17717 | 
            +
                  data = options.data,
         | 
| 17718 | 
            +
                  hash = options.hash,
         | 
| 17424 17719 | 
             
                  view = data.view,
         | 
| 17425 17720 | 
             
                  currentContext = (options.contexts && options.contexts[0]) || this,
         | 
| 17426 | 
            -
                   | 
| 17427 | 
            -
                   | 
| 17721 | 
            +
                  normalized,
         | 
| 17722 | 
            +
                  pathRoot, path, 
         | 
| 17723 | 
            +
                  loc, hashOption;
         | 
| 17724 | 
            +
             | 
| 17725 | 
            +
                // Detect bound options (e.g. countBinding="otherCount")
         | 
| 17726 | 
            +
                hash.boundOptions = {};
         | 
| 17727 | 
            +
                for (hashOption in hash) {
         | 
| 17728 | 
            +
                  if (!hash.hasOwnProperty(hashOption)) { continue; }
         | 
| 17729 | 
            +
             | 
| 17730 | 
            +
                  if (Ember.IS_BINDING.test(hashOption) && typeof hash[hashOption] === 'string') {
         | 
| 17731 | 
            +
                    // Lop off 'Binding' suffix.
         | 
| 17732 | 
            +
                    hash.boundOptions[hashOption.slice(0, -7)] = hash[hashOption];
         | 
| 17733 | 
            +
                  }
         | 
| 17734 | 
            +
                }
         | 
| 17735 | 
            +
             | 
| 17736 | 
            +
                // Expose property names on data.properties object.
         | 
| 17737 | 
            +
                data.properties = [];
         | 
| 17738 | 
            +
                for (loc = 0; loc < numProperties; ++loc) {
         | 
| 17739 | 
            +
                  data.properties.push(properties[loc]);
         | 
| 17740 | 
            +
                  normalizedProperties.push(normalizePath(currentContext, properties[loc], data));
         | 
| 17741 | 
            +
                }
         | 
| 17742 | 
            +
             | 
| 17743 | 
            +
                if (data.isUnbound) {
         | 
| 17744 | 
            +
                  return evaluateUnboundHelper(this, fn, normalizedProperties, options);
         | 
| 17745 | 
            +
                }
         | 
| 17746 | 
            +
             | 
| 17747 | 
            +
                if (dependentKeys.length === 0) {
         | 
| 17748 | 
            +
                  return evaluateMultiPropertyBoundHelper(currentContext, fn, normalizedProperties, options);
         | 
| 17749 | 
            +
                }
         | 
| 17750 | 
            +
             | 
| 17428 17751 |  | 
| 17429 | 
            -
                normalized =  | 
| 17752 | 
            +
                normalized = normalizedProperties[0];
         | 
| 17430 17753 |  | 
| 17431 17754 | 
             
                pathRoot = normalized.root;
         | 
| 17432 17755 | 
             
                path = normalized.path;
         | 
| @@ -17442,28 +17765,116 @@ Ember.Handlebars.registerBoundHelper = function(name, fn) { | |
| 17442 17765 |  | 
| 17443 17766 | 
             
                view.appendChild(bindView);
         | 
| 17444 17767 |  | 
| 17445 | 
            -
                 | 
| 17446 | 
            -
                  Ember.run.scheduleOnce('render', bindView, 'rerender');
         | 
| 17447 | 
            -
                };
         | 
| 17768 | 
            +
                view.registerObserver(pathRoot, path, bindView, rerenderBoundHelperView);
         | 
| 17448 17769 |  | 
| 17449 | 
            -
                 | 
| 17450 | 
            -
             | 
| 17451 | 
            -
                while(loc < dependentKeys.length) {
         | 
| 17452 | 
            -
                  Ember.addObserver(pathRoot, path + '.' + dependentKeys[loc], observer);
         | 
| 17453 | 
            -
                  loc += 1;
         | 
| 17770 | 
            +
                for (var i=0, l=dependentKeys.length; i<l; i++) {
         | 
| 17771 | 
            +
                  view.registerObserver(pathRoot, path + '.' + dependentKeys[i], bindView, rerenderBoundHelperView);
         | 
| 17454 17772 | 
             
                }
         | 
| 17773 | 
            +
              }
         | 
| 17455 17774 |  | 
| 17456 | 
            -
             | 
| 17457 | 
            -
             | 
| 17458 | 
            -
                  loc = 0;
         | 
| 17459 | 
            -
                  while(loc < dependentKeys.length) {
         | 
| 17460 | 
            -
                    Ember.removeObserver(pathRoot, path + '.' + dependentKeys[loc], observer);
         | 
| 17461 | 
            -
                    loc += 1;
         | 
| 17462 | 
            -
                  }
         | 
| 17463 | 
            -
                });
         | 
| 17464 | 
            -
              });
         | 
| 17775 | 
            +
              helper._rawFunction = fn;
         | 
| 17776 | 
            +
              Ember.Handlebars.registerHelper(name, helper);
         | 
| 17465 17777 | 
             
            };
         | 
| 17466 17778 |  | 
| 17779 | 
            +
            /**
         | 
| 17780 | 
            +
              @private
         | 
| 17781 | 
            +
             | 
| 17782 | 
            +
              Renders the unbound form of an otherwise bound helper function.
         | 
| 17783 | 
            +
             | 
| 17784 | 
            +
              @param {Function} fn
         | 
| 17785 | 
            +
              @param {Object} context
         | 
| 17786 | 
            +
              @param {Array} normalizedProperties
         | 
| 17787 | 
            +
              @param {String} options
         | 
| 17788 | 
            +
            */
         | 
| 17789 | 
            +
            function evaluateMultiPropertyBoundHelper(context, fn, normalizedProperties, options) {
         | 
| 17790 | 
            +
              var numProperties = normalizedProperties.length,
         | 
| 17791 | 
            +
                  self = this,
         | 
| 17792 | 
            +
                  data = options.data,
         | 
| 17793 | 
            +
                  view = data.view,
         | 
| 17794 | 
            +
                  hash = options.hash,
         | 
| 17795 | 
            +
                  boundOptions = hash.boundOptions,
         | 
| 17796 | 
            +
                  watchedProperties,
         | 
| 17797 | 
            +
                  boundOption, bindView, loc, property, len;
         | 
| 17798 | 
            +
             | 
| 17799 | 
            +
              bindView = new Ember._SimpleHandlebarsView(null, null, !hash.unescaped, data);
         | 
| 17800 | 
            +
              bindView.normalizedValue = function() {
         | 
| 17801 | 
            +
                var args = [], value, boundOption;
         | 
| 17802 | 
            +
             | 
| 17803 | 
            +
                // Copy over bound options.
         | 
| 17804 | 
            +
                for (boundOption in boundOptions) {
         | 
| 17805 | 
            +
                  if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
         | 
| 17806 | 
            +
                  property = normalizePath(context, boundOptions[boundOption], data);
         | 
| 17807 | 
            +
                  bindView.path = property.path;
         | 
| 17808 | 
            +
                  bindView.pathRoot = property.root;
         | 
| 17809 | 
            +
                  hash[boundOption] = Ember._SimpleHandlebarsView.prototype.normalizedValue.call(bindView);
         | 
| 17810 | 
            +
                }
         | 
| 17811 | 
            +
             | 
| 17812 | 
            +
                for (loc = 0; loc < numProperties; ++loc) {
         | 
| 17813 | 
            +
                  property = normalizedProperties[loc];
         | 
| 17814 | 
            +
                  bindView.path = property.path;
         | 
| 17815 | 
            +
                  bindView.pathRoot = property.root;
         | 
| 17816 | 
            +
                  args.push(Ember._SimpleHandlebarsView.prototype.normalizedValue.call(bindView));
         | 
| 17817 | 
            +
                }
         | 
| 17818 | 
            +
                args.push(options);
         | 
| 17819 | 
            +
                return fn.apply(context, args);
         | 
| 17820 | 
            +
              };
         | 
| 17821 | 
            +
             | 
| 17822 | 
            +
              view.appendChild(bindView);
         | 
| 17823 | 
            +
             | 
| 17824 | 
            +
              // Assemble liast of watched properties that'll re-render this helper.
         | 
| 17825 | 
            +
              watchedProperties = [];
         | 
| 17826 | 
            +
              for (boundOption in boundOptions) {
         | 
| 17827 | 
            +
                if (boundOptions.hasOwnProperty(boundOption)) { 
         | 
| 17828 | 
            +
                  watchedProperties.push(normalizePath(context, boundOptions[boundOption], data));
         | 
| 17829 | 
            +
                }
         | 
| 17830 | 
            +
              }
         | 
| 17831 | 
            +
              watchedProperties = watchedProperties.concat(normalizedProperties);
         | 
| 17832 | 
            +
             | 
| 17833 | 
            +
              // Observe each property.
         | 
| 17834 | 
            +
              for (loc = 0, len = watchedProperties.length; loc < len; ++loc) {
         | 
| 17835 | 
            +
                property = watchedProperties[loc];
         | 
| 17836 | 
            +
                view.registerObserver(property.root, property.path, bindView, rerenderBoundHelperView);
         | 
| 17837 | 
            +
              }
         | 
| 17838 | 
            +
             | 
| 17839 | 
            +
            }
         | 
| 17840 | 
            +
             | 
| 17841 | 
            +
            /**
         | 
| 17842 | 
            +
              @private
         | 
| 17843 | 
            +
             | 
| 17844 | 
            +
              An observer function used with bound helpers which
         | 
| 17845 | 
            +
              will schedule a re-render of the _SimpleHandlebarsView
         | 
| 17846 | 
            +
              connected with the helper.
         | 
| 17847 | 
            +
            */
         | 
| 17848 | 
            +
            function rerenderBoundHelperView() {
         | 
| 17849 | 
            +
              Ember.run.scheduleOnce('render', this, 'rerender');
         | 
| 17850 | 
            +
            }
         | 
| 17851 | 
            +
             | 
| 17852 | 
            +
            /**
         | 
| 17853 | 
            +
              @private
         | 
| 17854 | 
            +
             | 
| 17855 | 
            +
              Renders the unbound form of an otherwise bound helper function.
         | 
| 17856 | 
            +
             | 
| 17857 | 
            +
              @param {Function} fn
         | 
| 17858 | 
            +
              @param {Object} context
         | 
| 17859 | 
            +
              @param {Array} normalizedProperties
         | 
| 17860 | 
            +
              @param {String} options
         | 
| 17861 | 
            +
            */
         | 
| 17862 | 
            +
            function evaluateUnboundHelper(context, fn, normalizedProperties, options) {
         | 
| 17863 | 
            +
              var args = [], hash = options.hash, boundOptions = hash.boundOptions, loc, len, property, boundOption;
         | 
| 17864 | 
            +
             | 
| 17865 | 
            +
              for (boundOption in boundOptions) {
         | 
| 17866 | 
            +
                if (!boundOptions.hasOwnProperty(boundOption)) { continue; }
         | 
| 17867 | 
            +
                hash[boundOption] = Ember.Handlebars.get(context, boundOptions[boundOption], options);
         | 
| 17868 | 
            +
              }
         | 
| 17869 | 
            +
             | 
| 17870 | 
            +
              for(loc = 0, len = normalizedProperties.length; loc < len; ++loc) {
         | 
| 17871 | 
            +
                property = normalizedProperties[loc];
         | 
| 17872 | 
            +
                args.push(Ember.Handlebars.get(context, property.path, options));
         | 
| 17873 | 
            +
              }
         | 
| 17874 | 
            +
              args.push(options);
         | 
| 17875 | 
            +
              return fn.apply(context, args);
         | 
| 17876 | 
            +
            }
         | 
| 17877 | 
            +
             | 
| 17467 17878 | 
             
            /**
         | 
| 17468 17879 | 
             
              @private
         | 
| 17469 17880 |  | 
| @@ -17567,7 +17978,7 @@ var DOMManager = { | |
| 17567 17978 | 
             
                view.transitionTo('preRender');
         | 
| 17568 17979 |  | 
| 17569 17980 | 
             
                Ember.run.schedule('render', this, function() {
         | 
| 17570 | 
            -
                  if ( | 
| 17981 | 
            +
                  if (view.isDestroying) { return; }
         | 
| 17571 17982 |  | 
| 17572 17983 | 
             
                  view.clearRenderedChildren();
         | 
| 17573 17984 | 
             
                  var buffer = view.renderToBuffer();
         | 
| @@ -17988,20 +18399,16 @@ var EmberHandlebars = Ember.Handlebars, helpers = EmberHandlebars.helpers; | |
| 17988 18399 |  | 
| 17989 18400 | 
             
            // Binds a property into the DOM. This will create a hook in DOM that the
         | 
| 17990 18401 | 
             
            // KVO system will look for and update if the property changes.
         | 
| 17991 | 
            -
            function bind(property, options, preserveContext, shouldDisplay, valueNormalizer) {
         | 
| 18402 | 
            +
            function bind(property, options, preserveContext, shouldDisplay, valueNormalizer, childProperties) {
         | 
| 17992 18403 | 
             
              var data = options.data,
         | 
| 17993 18404 | 
             
                  fn = options.fn,
         | 
| 17994 18405 | 
             
                  inverse = options.inverse,
         | 
| 17995 18406 | 
             
                  view = data.view,
         | 
| 17996 18407 | 
             
                  currentContext = this,
         | 
| 17997 | 
            -
                   | 
| 17998 | 
            -
                  observer;
         | 
| 18408 | 
            +
                  normalized, observer, i;
         | 
| 17999 18409 |  | 
| 18000 18410 | 
             
              normalized = normalizePath(currentContext, property, data);
         | 
| 18001 18411 |  | 
| 18002 | 
            -
              pathRoot = normalized.root;
         | 
| 18003 | 
            -
              path = normalized.path;
         | 
| 18004 | 
            -
             | 
| 18005 18412 | 
             
              // Set up observers for observable objects
         | 
| 18006 18413 | 
             
              if ('object' === typeof this) {
         | 
| 18007 18414 | 
             
                if (data.insideGroup) {
         | 
| @@ -18009,7 +18416,7 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer | |
| 18009 18416 | 
             
                    Ember.run.once(view, 'rerender');
         | 
| 18010 18417 | 
             
                  };
         | 
| 18011 18418 |  | 
| 18012 | 
            -
                  var template, context, result = handlebarsGet( | 
| 18419 | 
            +
                  var template, context, result = handlebarsGet(currentContext, property, options);
         | 
| 18013 18420 |  | 
| 18014 18421 | 
             
                  result = valueNormalizer(result);
         | 
| 18015 18422 |  | 
| @@ -18031,8 +18438,8 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer | |
| 18031 18438 | 
             
                    valueNormalizerFunc: valueNormalizer,
         | 
| 18032 18439 | 
             
                    displayTemplate: fn,
         | 
| 18033 18440 | 
             
                    inverseTemplate: inverse,
         | 
| 18034 | 
            -
                    path:  | 
| 18035 | 
            -
                    pathRoot:  | 
| 18441 | 
            +
                    path: property,
         | 
| 18442 | 
            +
                    pathRoot: currentContext,
         | 
| 18036 18443 | 
             
                    previousContext: currentContext,
         | 
| 18037 18444 | 
             
                    isEscaped: !options.hash.unescaped,
         | 
| 18038 18445 | 
             
                    templateData: options.data
         | 
| @@ -18049,17 +18456,18 @@ function bind(property, options, preserveContext, shouldDisplay, valueNormalizer | |
| 18049 18456 | 
             
                // tells the Ember._HandlebarsBoundView to re-render. If property
         | 
| 18050 18457 | 
             
                // is an empty string, we are printing the current context
         | 
| 18051 18458 | 
             
                // object ({{this}}) so updating it is not our responsibility.
         | 
| 18052 | 
            -
                if (path !== '') {
         | 
| 18053 | 
            -
                   | 
| 18054 | 
            -
             | 
| 18055 | 
            -
             | 
| 18056 | 
            -
             | 
| 18057 | 
            -
             | 
| 18459 | 
            +
                if (normalized.path !== '') {
         | 
| 18460 | 
            +
                  view.registerObserver(normalized.root, normalized.path, observer);
         | 
| 18461 | 
            +
                  if (childProperties) {
         | 
| 18462 | 
            +
                    for (i=0; i<childProperties.length; i++) {
         | 
| 18463 | 
            +
                      view.registerObserver(normalized.root, normalized.path+'.'+childProperties[i], observer);
         | 
| 18464 | 
            +
                    }
         | 
| 18465 | 
            +
                  }
         | 
| 18058 18466 | 
             
                }
         | 
| 18059 18467 | 
             
              } else {
         | 
| 18060 18468 | 
             
                // The object is not observable, so just render it out and
         | 
| 18061 18469 | 
             
                // be done with it.
         | 
| 18062 | 
            -
                data.buffer.push(handlebarsGet( | 
| 18470 | 
            +
                data.buffer.push(handlebarsGet(currentContext, property, options));
         | 
| 18063 18471 | 
             
              }
         | 
| 18064 18472 | 
             
            }
         | 
| 18065 18473 |  | 
| @@ -18067,14 +18475,10 @@ function simpleBind(property, options) { | |
| 18067 18475 | 
             
              var data = options.data,
         | 
| 18068 18476 | 
             
                  view = data.view,
         | 
| 18069 18477 | 
             
                  currentContext = this,
         | 
| 18070 | 
            -
                   | 
| 18071 | 
            -
                  observer;
         | 
| 18478 | 
            +
                  normalized, observer;
         | 
| 18072 18479 |  | 
| 18073 18480 | 
             
              normalized = normalizePath(currentContext, property, data);
         | 
| 18074 18481 |  | 
| 18075 | 
            -
              pathRoot = normalized.root;
         | 
| 18076 | 
            -
              path = normalized.path;
         | 
| 18077 | 
            -
             | 
| 18078 18482 | 
             
              // Set up observers for observable objects
         | 
| 18079 18483 | 
             
              if ('object' === typeof this) {
         | 
| 18080 18484 | 
             
                if (data.insideGroup) {
         | 
| @@ -18082,12 +18486,12 @@ function simpleBind(property, options) { | |
| 18082 18486 | 
             
                    Ember.run.once(view, 'rerender');
         | 
| 18083 18487 | 
             
                  };
         | 
| 18084 18488 |  | 
| 18085 | 
            -
                  var result = handlebarsGet( | 
| 18489 | 
            +
                  var result = handlebarsGet(currentContext, property, options);
         | 
| 18086 18490 | 
             
                  if (result === null || result === undefined) { result = ""; }
         | 
| 18087 18491 | 
             
                  data.buffer.push(result);
         | 
| 18088 18492 | 
             
                } else {
         | 
| 18089 18493 | 
             
                  var bindView = new Ember._SimpleHandlebarsView(
         | 
| 18090 | 
            -
                     | 
| 18494 | 
            +
                    property, currentContext, !options.hash.unescaped, options.data
         | 
| 18091 18495 | 
             
                  );
         | 
| 18092 18496 |  | 
| 18093 18497 | 
             
                  bindView._parentView = view;
         | 
| @@ -18102,17 +18506,13 @@ function simpleBind(property, options) { | |
| 18102 18506 | 
             
                // tells the Ember._HandlebarsBoundView to re-render. If property
         | 
| 18103 18507 | 
             
                // is an empty string, we are printing the current context
         | 
| 18104 18508 | 
             
                // object ({{this}}) so updating it is not our responsibility.
         | 
| 18105 | 
            -
                if (path !== '') {
         | 
| 18106 | 
            -
                   | 
| 18107 | 
            -
             | 
| 18108 | 
            -
                  view.one('willClearRender', function() {
         | 
| 18109 | 
            -
                    Ember.removeObserver(pathRoot, path, observer);
         | 
| 18110 | 
            -
                  });
         | 
| 18509 | 
            +
                if (normalized.path !== '') {
         | 
| 18510 | 
            +
                  view.registerObserver(normalized.root, normalized.path, observer);
         | 
| 18111 18511 | 
             
                }
         | 
| 18112 18512 | 
             
              } else {
         | 
| 18113 18513 | 
             
                // The object is not observable, so just render it out and
         | 
| 18114 18514 | 
             
                // be done with it.
         | 
| 18115 | 
            -
                data.buffer.push(handlebarsGet( | 
| 18515 | 
            +
                data.buffer.push(handlebarsGet(currentContext, property, options));
         | 
| 18116 18516 | 
             
              }
         | 
| 18117 18517 | 
             
            }
         | 
| 18118 18518 |  | 
| @@ -18201,14 +18601,17 @@ EmberHandlebars.registerHelper('bind', function(property, options) { | |
| 18201 18601 | 
             
            EmberHandlebars.registerHelper('boundIf', function(property, fn) {
         | 
| 18202 18602 | 
             
              var context = (fn.contexts && fn.contexts[0]) || this;
         | 
| 18203 18603 | 
             
              var func = function(result) {
         | 
| 18204 | 
            -
                 | 
| 18604 | 
            +
                var truthy = result && get(result, 'isTruthy');
         | 
| 18605 | 
            +
                if (typeof truthy === 'boolean') { return truthy; }
         | 
| 18606 | 
            +
             | 
| 18607 | 
            +
                if (Ember.isArray(result)) {
         | 
| 18205 18608 | 
             
                  return get(result, 'length') !== 0;
         | 
| 18206 18609 | 
             
                } else {
         | 
| 18207 18610 | 
             
                  return !!result;
         | 
| 18208 18611 | 
             
                }
         | 
| 18209 18612 | 
             
              };
         | 
| 18210 18613 |  | 
| 18211 | 
            -
              return bind.call(context, property, fn, true, func, func);
         | 
| 18614 | 
            +
              return bind.call(context, property, fn, true, func, func, ['isTruthy', 'length']);
         | 
| 18212 18615 | 
             
            });
         | 
| 18213 18616 |  | 
| 18214 18617 | 
             
            /**
         | 
| @@ -18442,22 +18845,19 @@ EmberHandlebars.registerHelper('bindAttr', function(options) { | |
| 18442 18845 | 
             
              // current value of the property as an attribute.
         | 
| 18443 18846 | 
             
              forEach.call(attrKeys, function(attr) {
         | 
| 18444 18847 | 
             
                var path = attrs[attr],
         | 
| 18445 | 
            -
                     | 
| 18848 | 
            +
                    normalized;
         | 
| 18446 18849 |  | 
| 18447 18850 |  | 
| 18448 18851 | 
             
                normalized = normalizePath(ctx, path, options.data);
         | 
| 18449 18852 |  | 
| 18450 | 
            -
                 | 
| 18451 | 
            -
                path = normalized.path;
         | 
| 18452 | 
            -
             | 
| 18453 | 
            -
                var value = (path === 'this') ? pathRoot : handlebarsGet(pathRoot, path, options),
         | 
| 18853 | 
            +
                var value = (path === 'this') ? normalized.root : handlebarsGet(ctx, path, options),
         | 
| 18454 18854 | 
             
                    type = Ember.typeOf(value);
         | 
| 18455 18855 |  | 
| 18456 18856 |  | 
| 18457 18857 | 
             
                var observer, invoker;
         | 
| 18458 18858 |  | 
| 18459 18859 | 
             
                observer = function observer() {
         | 
| 18460 | 
            -
                  var result = handlebarsGet( | 
| 18860 | 
            +
                  var result = handlebarsGet(ctx, path, options);
         | 
| 18461 18861 |  | 
| 18462 18862 |  | 
| 18463 18863 | 
             
                  var elem = view.$("[data-bindattr-" + dataId + "='" + dataId + "']");
         | 
| @@ -18467,7 +18867,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) { | |
| 18467 18867 | 
             
                  // In that case, we can assume the template has been re-rendered
         | 
| 18468 18868 | 
             
                  // and we need to clean up the observer.
         | 
| 18469 18869 | 
             
                  if (!elem || elem.length === 0) {
         | 
| 18470 | 
            -
                    Ember.removeObserver( | 
| 18870 | 
            +
                    Ember.removeObserver(normalized.root, normalized.path, invoker);
         | 
| 18471 18871 | 
             
                    return;
         | 
| 18472 18872 | 
             
                  }
         | 
| 18473 18873 |  | 
| @@ -18482,11 +18882,7 @@ EmberHandlebars.registerHelper('bindAttr', function(options) { | |
| 18482 18882 | 
             
                // When the observer fires, find the element using the
         | 
| 18483 18883 | 
             
                // unique data id and update the attribute to the new value.
         | 
| 18484 18884 | 
             
                if (path !== 'this') {
         | 
| 18485 | 
            -
                   | 
| 18486 | 
            -
             | 
| 18487 | 
            -
                  view.one('willClearRender', function() {
         | 
| 18488 | 
            -
                    Ember.removeObserver(pathRoot, path, invoker);
         | 
| 18489 | 
            -
                  });
         | 
| 18885 | 
            +
                  view.registerObserver(normalized.root, normalized.path, invoker);
         | 
| 18490 18886 | 
             
                }
         | 
| 18491 18887 |  | 
| 18492 18888 | 
             
                // if this changes, also change the logic in ember-views/lib/views/view.js
         | 
| @@ -18576,7 +18972,7 @@ EmberHandlebars.bindClasses = function(context, classBindings, view, bindAttrId, | |
| 18576 18972 | 
             
                // class name.
         | 
| 18577 18973 | 
             
                observer = function() {
         | 
| 18578 18974 | 
             
                  // Get the current value of the property
         | 
| 18579 | 
            -
                  newClass = classStringForPath( | 
| 18975 | 
            +
                  newClass = classStringForPath(context, parsedPath, options);
         | 
| 18580 18976 | 
             
                  elem = bindAttrId ? view.$("[data-bindattr-" + bindAttrId + "='" + bindAttrId + "']") : view.$();
         | 
| 18581 18977 |  | 
| 18582 18978 | 
             
                  // If we can't find the element anymore, a parent template has been
         | 
| @@ -18605,16 +19001,12 @@ EmberHandlebars.bindClasses = function(context, classBindings, view, bindAttrId, | |
| 18605 19001 | 
             
                };
         | 
| 18606 19002 |  | 
| 18607 19003 | 
             
                if (path !== '' && path !== 'this') {
         | 
| 18608 | 
            -
                   | 
| 18609 | 
            -
             | 
| 18610 | 
            -
                  view.one('willClearRender', function() {
         | 
| 18611 | 
            -
                    Ember.removeObserver(pathRoot, path, invoker);
         | 
| 18612 | 
            -
                  });
         | 
| 19004 | 
            +
                  view.registerObserver(pathRoot, path, invoker);
         | 
| 18613 19005 | 
             
                }
         | 
| 18614 19006 |  | 
| 18615 19007 | 
             
                // We've already setup the observer; now we just need to figure out the
         | 
| 18616 19008 | 
             
                // correct behavior right now on the first pass through.
         | 
| 18617 | 
            -
                value = classStringForPath( | 
| 19009 | 
            +
                value = classStringForPath(context, parsedPath, options);
         | 
| 18618 19010 |  | 
| 18619 19011 | 
             
                if (value) {
         | 
| 18620 19012 | 
             
                  ret.push(value);
         | 
| @@ -19134,7 +19526,7 @@ Ember.Handlebars.registerHelper('collection', function(path, options) { | |
| 19134 19526 | 
             
                if (hash.hasOwnProperty(prop)) {
         | 
| 19135 19527 | 
             
                  match = prop.match(/^item(.)(.*)$/);
         | 
| 19136 19528 |  | 
| 19137 | 
            -
                  if(match) {
         | 
| 19529 | 
            +
                  if(match && prop !== 'itemController') {
         | 
| 19138 19530 | 
             
                    // Convert itemShouldFoo -> shouldFoo
         | 
| 19139 19531 | 
             
                    itemHash[match[1].toLowerCase() + match[2]] = hash[prop];
         | 
| 19140 19532 | 
             
                    // Delete from hash as this will end up getting passed to the
         | 
| @@ -19161,13 +19553,10 @@ Ember.Handlebars.registerHelper('collection', function(path, options) { | |
| 19161 19553 | 
             
              } else if (hash.emptyViewClass) {
         | 
| 19162 19554 | 
             
                emptyViewClass = handlebarsGet(this, hash.emptyViewClass, options);
         | 
| 19163 19555 | 
             
              }
         | 
| 19164 | 
            -
              hash.emptyView = emptyViewClass;
         | 
| 19556 | 
            +
              if (emptyViewClass) { hash.emptyView = emptyViewClass; }
         | 
| 19165 19557 |  | 
| 19166 | 
            -
              if | 
| 19167 | 
            -
                itemHash._context = Ember.computed( | 
| 19168 | 
            -
                  return get(this, 'content');
         | 
| 19169 | 
            -
                }).property('content');
         | 
| 19170 | 
            -
                delete hash.eachHelper;
         | 
| 19558 | 
            +
              if(!hash.keyword){
         | 
| 19559 | 
            +
                itemHash._context = Ember.computed.alias('content');
         | 
| 19171 19560 | 
             
              }
         | 
| 19172 19561 |  | 
| 19173 19562 | 
             
              var viewString = view.toString();
         | 
| @@ -19200,13 +19589,31 @@ var handlebarsGet = Ember.Handlebars.get; | |
| 19200 19589 | 
             
              <div>{{unbound somePropertyThatDoesntChange}}</div>
         | 
| 19201 19590 | 
             
              ```
         | 
| 19202 19591 |  | 
| 19592 | 
            +
              `unbound` can also be used in conjunction with a bound helper to
         | 
| 19593 | 
            +
              render it in its unbound form:
         | 
| 19594 | 
            +
             | 
| 19595 | 
            +
              ```handlebars
         | 
| 19596 | 
            +
              <div>{{unbound helperName somePropertyThatDoesntChange}}</div>
         | 
| 19597 | 
            +
              ```
         | 
| 19598 | 
            +
             | 
| 19203 19599 | 
             
              @method unbound
         | 
| 19204 19600 | 
             
              @for Ember.Handlebars.helpers
         | 
| 19205 19601 | 
             
              @param {String} property
         | 
| 19206 19602 | 
             
              @return {String} HTML string
         | 
| 19207 19603 | 
             
            */
         | 
| 19208 19604 | 
             
            Ember.Handlebars.registerHelper('unbound', function(property, fn) {
         | 
| 19209 | 
            -
              var  | 
| 19605 | 
            +
              var options = arguments[arguments.length - 1], helper, context, out;
         | 
| 19606 | 
            +
             | 
| 19607 | 
            +
              if(arguments.length > 2) {
         | 
| 19608 | 
            +
                // Unbound helper call.
         | 
| 19609 | 
            +
                options.data.isUnbound = true;
         | 
| 19610 | 
            +
                helper = Ember.Handlebars.helpers[arguments[0]] || Ember.Handlebars.helperMissing;
         | 
| 19611 | 
            +
                out = helper.apply(this, Array.prototype.slice.call(arguments, 1)); 
         | 
| 19612 | 
            +
                delete options.data.isUnbound;
         | 
| 19613 | 
            +
                return out;
         | 
| 19614 | 
            +
              }
         | 
| 19615 | 
            +
             | 
| 19616 | 
            +
              context = (fn.contexts && fn.contexts[0]) || this;
         | 
| 19210 19617 | 
             
              return handlebarsGet(context, property, fn);
         | 
| 19211 19618 | 
             
            });
         | 
| 19212 19619 |  | 
| @@ -19272,6 +19679,44 @@ Ember.Handlebars.registerHelper('debugger', function() { | |
| 19272 19679 | 
             
            var get = Ember.get, set = Ember.set;
         | 
| 19273 19680 |  | 
| 19274 19681 | 
             
            Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, {
         | 
| 19682 | 
            +
              init: function() {
         | 
| 19683 | 
            +
                var itemController = get(this, 'itemController');
         | 
| 19684 | 
            +
                var binding;
         | 
| 19685 | 
            +
             | 
| 19686 | 
            +
                if (itemController) {
         | 
| 19687 | 
            +
                  var controller = Ember.ArrayController.create();
         | 
| 19688 | 
            +
                  set(controller, 'itemController', itemController);
         | 
| 19689 | 
            +
                  set(controller, 'container', get(this, 'controller.container'));
         | 
| 19690 | 
            +
                  set(controller, '_eachView', this);
         | 
| 19691 | 
            +
                  set(controller, 'target', get(this, 'controller'));
         | 
| 19692 | 
            +
             | 
| 19693 | 
            +
                  this.disableContentObservers(function() {
         | 
| 19694 | 
            +
                    set(this, 'content', controller);
         | 
| 19695 | 
            +
                    binding = new Ember.Binding('content', '_eachView.dataSource').oneWay();
         | 
| 19696 | 
            +
                    binding.connect(controller);
         | 
| 19697 | 
            +
                  });
         | 
| 19698 | 
            +
             | 
| 19699 | 
            +
                  set(this, '_arrayController', controller);
         | 
| 19700 | 
            +
                } else {
         | 
| 19701 | 
            +
                  this.disableContentObservers(function() {
         | 
| 19702 | 
            +
                    binding = new Ember.Binding('content', 'dataSource').oneWay();
         | 
| 19703 | 
            +
                    binding.connect(this);
         | 
| 19704 | 
            +
                  });
         | 
| 19705 | 
            +
                }
         | 
| 19706 | 
            +
             | 
| 19707 | 
            +
                return this._super();
         | 
| 19708 | 
            +
              },
         | 
| 19709 | 
            +
             | 
| 19710 | 
            +
              disableContentObservers: function(callback) {
         | 
| 19711 | 
            +
                Ember.removeBeforeObserver(this, 'content', null, '_contentWillChange');
         | 
| 19712 | 
            +
                Ember.removeObserver(this, 'content', null, '_contentDidChange');
         | 
| 19713 | 
            +
             | 
| 19714 | 
            +
                callback.apply(this);
         | 
| 19715 | 
            +
             | 
| 19716 | 
            +
                Ember.addBeforeObserver(this, 'content', null, '_contentWillChange');
         | 
| 19717 | 
            +
                Ember.addObserver(this, 'content', null, '_contentDidChange');
         | 
| 19718 | 
            +
              },
         | 
| 19719 | 
            +
             | 
| 19275 19720 | 
             
              itemViewClass: Ember._MetamorphView,
         | 
| 19276 19721 | 
             
              emptyViewClass: Ember._MetamorphView,
         | 
| 19277 19722 |  | 
| @@ -19282,6 +19727,7 @@ Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, { | |
| 19282 19727 | 
             
                // to insert keywords, it is responsible for cloning
         | 
| 19283 19728 | 
             
                // the keywords hash. This will be fixed momentarily.
         | 
| 19284 19729 | 
             
                var keyword = get(this, 'keyword');
         | 
| 19730 | 
            +
                var content = get(view, 'content');
         | 
| 19285 19731 |  | 
| 19286 19732 | 
             
                if (keyword) {
         | 
| 19287 19733 | 
             
                  var data = get(view, 'templateData');
         | 
| @@ -19290,14 +19736,28 @@ Ember.Handlebars.EachView = Ember.CollectionView.extend(Ember._Metamorph, { | |
| 19290 19736 | 
             
                  data.keywords = view.cloneKeywords();
         | 
| 19291 19737 | 
             
                  set(view, 'templateData', data);
         | 
| 19292 19738 |  | 
| 19293 | 
            -
                  var content = get(view, 'content');
         | 
| 19294 | 
            -
             | 
| 19295 19739 | 
             
                  // In this case, we do not bind, because the `content` of
         | 
| 19296 19740 | 
             
                  // a #each item cannot change.
         | 
| 19297 19741 | 
             
                  data.keywords[keyword] = content;
         | 
| 19298 19742 | 
             
                }
         | 
| 19299 19743 |  | 
| 19744 | 
            +
                // If {{#each}} is looping over an array of controllers,
         | 
| 19745 | 
            +
                // point each child view at their respective controller.
         | 
| 19746 | 
            +
                if (content && get(content, 'isController')) {
         | 
| 19747 | 
            +
                  set(view, 'controller', content);
         | 
| 19748 | 
            +
                }
         | 
| 19749 | 
            +
             | 
| 19300 19750 | 
             
                return view;
         | 
| 19751 | 
            +
              },
         | 
| 19752 | 
            +
             | 
| 19753 | 
            +
              willDestroy: function() {
         | 
| 19754 | 
            +
                var arrayController = get(this, '_arrayController');
         | 
| 19755 | 
            +
             | 
| 19756 | 
            +
                if (arrayController) {
         | 
| 19757 | 
            +
                  arrayController.destroy();
         | 
| 19758 | 
            +
                }
         | 
| 19759 | 
            +
             | 
| 19760 | 
            +
                return this._super();
         | 
| 19301 19761 | 
             
              }
         | 
| 19302 19762 | 
             
            });
         | 
| 19303 19763 |  | 
| @@ -19391,7 +19851,8 @@ GroupedEach.prototype = { | |
| 19391 19851 |  | 
| 19392 19852 | 
             
            /**
         | 
| 19393 19853 | 
             
              The `{{#each}}` helper loops over elements in a collection, rendering its
         | 
| 19394 | 
            -
              block once for each item | 
| 19854 | 
            +
              block once for each item. It is an extension of the base Handlebars `{{#each}}`
         | 
| 19855 | 
            +
              helper:
         | 
| 19395 19856 |  | 
| 19396 19857 | 
             
              ```javascript
         | 
| 19397 19858 | 
             
              Developers = [{name: 'Yehuda'},{name: 'Tom'}, {name: 'Paul'}];
         | 
| @@ -19423,12 +19884,20 @@ GroupedEach.prototype = { | |
| 19423 19884 | 
             
                {{this}}
         | 
| 19424 19885 | 
             
              {{/each}}
         | 
| 19425 19886 | 
             
              ```
         | 
| 19887 | 
            +
              ### {{else}} condition
         | 
| 19888 | 
            +
              `{{#each}}` can have a matching `{{else}}`. The contents of this block will render
         | 
| 19889 | 
            +
              if the collection is empty.
         | 
| 19426 19890 |  | 
| 19427 | 
            -
               | 
| 19428 | 
            -
             | 
| 19429 | 
            -
             | 
| 19430 | 
            -
               | 
| 19431 | 
            -
             | 
| 19891 | 
            +
              ```
         | 
| 19892 | 
            +
              {{#each person in Developers}}
         | 
| 19893 | 
            +
                {{person.name}}
         | 
| 19894 | 
            +
              {{else}}
         | 
| 19895 | 
            +
                <p>Sorry, nobody is available for this task.</p>
         | 
| 19896 | 
            +
              {{/each}}
         | 
| 19897 | 
            +
              ```
         | 
| 19898 | 
            +
              ### Specifying a View class for items
         | 
| 19899 | 
            +
              If you provide an `itemViewClass` option that references a view class
         | 
| 19900 | 
            +
              with its own `template` you can omit the block.
         | 
| 19432 19901 |  | 
| 19433 19902 | 
             
              The following template:
         | 
| 19434 19903 |  | 
| @@ -19454,8 +19923,6 @@ GroupedEach.prototype = { | |
| 19454 19923 | 
             
              App.AnItemView = Ember.View.extend({
         | 
| 19455 19924 | 
             
                template: Ember.Handlebars.compile("Greetings {{name}}")
         | 
| 19456 19925 | 
             
              });
         | 
| 19457 | 
            -
             | 
| 19458 | 
            -
              App.initialize();
         | 
| 19459 19926 | 
             
              ```
         | 
| 19460 19927 |  | 
| 19461 19928 | 
             
              Will result in the HTML structure below
         | 
| @@ -19467,11 +19934,39 @@ GroupedEach.prototype = { | |
| 19467 19934 | 
             
                <div class="ember-view">Greetings Sara</div>
         | 
| 19468 19935 | 
             
              </div>
         | 
| 19469 19936 | 
             
              ```
         | 
| 19470 | 
            -
             | 
| 19937 | 
            +
              
         | 
| 19938 | 
            +
              ### Representing each item with a Controller.
         | 
| 19939 | 
            +
              By default the controller lookup within an `{{#each}}` block will be
         | 
| 19940 | 
            +
              the controller of the template where the `{{#each}}` was used. If each
         | 
| 19941 | 
            +
              item needs to be presented by a custom controller you can provide a
         | 
| 19942 | 
            +
              `itemController` option which references a controller by lookup name.
         | 
| 19943 | 
            +
              Each item in the loop will be wrapped in an instance of this controller
         | 
| 19944 | 
            +
              and the item itself will be set to the `content` property of that controller.
         | 
| 19945 | 
            +
              
         | 
| 19946 | 
            +
              This is useful in cases where properties of model objects need transformation
         | 
| 19947 | 
            +
              or synthesis for display:
         | 
| 19948 | 
            +
              
         | 
| 19949 | 
            +
              ```javascript
         | 
| 19950 | 
            +
              App.DeveloperController = Ember.ObjectController.extend({
         | 
| 19951 | 
            +
                isAvailableForHire: function(){
         | 
| 19952 | 
            +
                  return !this.get('content.isEmployed') && this.get('content.isSeekingWork');
         | 
| 19953 | 
            +
                }.property('isEmployed', 'isSeekingWork')
         | 
| 19954 | 
            +
              })
         | 
| 19955 | 
            +
              ```
         | 
| 19956 | 
            +
              
         | 
| 19957 | 
            +
              ```handlebars
         | 
| 19958 | 
            +
              {{#each person in Developers itemController="developer"}}
         | 
| 19959 | 
            +
                {{person.name}} {{#if person.isAvailableForHire}}Hire me!{{/if}}
         | 
| 19960 | 
            +
              {{/each}}
         | 
| 19961 | 
            +
              ```
         | 
| 19962 | 
            +
              
         | 
| 19471 19963 | 
             
              @method each
         | 
| 19472 19964 | 
             
              @for Ember.Handlebars.helpers
         | 
| 19473 19965 | 
             
              @param [name] {String} name for item (used with `in`)
         | 
| 19474 19966 | 
             
              @param path {String} path
         | 
| 19967 | 
            +
              @param [options] {Object} Handlebars key/value pairs of options
         | 
| 19968 | 
            +
              @param [options.itemViewClass] {String} a path to a view class used for each item
         | 
| 19969 | 
            +
              @param [options.itemController] {String} name of a controller to be created for each item
         | 
| 19475 19970 | 
             
            */
         | 
| 19476 19971 | 
             
            Ember.Handlebars.registerHelper('each', function(path, options) {
         | 
| 19477 19972 | 
             
              if (arguments.length === 4) {
         | 
| @@ -19484,11 +19979,9 @@ Ember.Handlebars.registerHelper('each', function(path, options) { | |
| 19484 19979 | 
             
                if (path === '') { path = "this"; }
         | 
| 19485 19980 |  | 
| 19486 19981 | 
             
                options.hash.keyword = keywordName;
         | 
| 19487 | 
            -
              } else {
         | 
| 19488 | 
            -
                options.hash.eachHelper = 'each';
         | 
| 19489 19982 | 
             
              }
         | 
| 19490 19983 |  | 
| 19491 | 
            -
              options.hash. | 
| 19984 | 
            +
              options.hash.dataSourceBinding = path;
         | 
| 19492 19985 | 
             
              // Set up emptyView as a metamorph with no tag
         | 
| 19493 19986 | 
             
              //options.hash.emptyViewClass = Ember._MetamorphView;
         | 
| 19494 19987 |  | 
| @@ -19844,7 +20337,7 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport, | |
| 19844 20337 |  | 
| 19845 20338 | 
             
              classNames: ['ember-text-field'],
         | 
| 19846 20339 | 
             
              tagName: "input",
         | 
| 19847 | 
            -
              attributeBindings: ['type', 'value', 'size'],
         | 
| 20340 | 
            +
              attributeBindings: ['type', 'value', 'size', 'pattern'],
         | 
| 19848 20341 |  | 
| 19849 20342 | 
             
              /**
         | 
| 19850 20343 | 
             
                The `value` attribute of the input element. As the user inputs text, this
         | 
| @@ -19874,6 +20367,15 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport, | |
| 19874 20367 | 
             
              */
         | 
| 19875 20368 | 
             
              size: null,
         | 
| 19876 20369 |  | 
| 20370 | 
            +
              /**
         | 
| 20371 | 
            +
                The `pattern` the pattern attribute of input element.
         | 
| 20372 | 
            +
             | 
| 20373 | 
            +
                @property pattern
         | 
| 20374 | 
            +
                @type String
         | 
| 20375 | 
            +
                @default null
         | 
| 20376 | 
            +
              */
         | 
| 20377 | 
            +
              pattern: null,
         | 
| 20378 | 
            +
             | 
| 19877 20379 | 
             
              /**
         | 
| 19878 20380 | 
             
                The action to be sent when the user presses the return key.
         | 
| 19879 20381 |  | 
| @@ -19887,15 +20389,34 @@ Ember.TextField = Ember.View.extend(Ember.TextSupport, | |
| 19887 20389 | 
             
              */
         | 
| 19888 20390 | 
             
              action: null,
         | 
| 19889 20391 |  | 
| 19890 | 
            -
               | 
| 19891 | 
            -
                 | 
| 20392 | 
            +
              /**
         | 
| 20393 | 
            +
                Whether they `keyUp` event that triggers an `action` to be sent continues
         | 
| 20394 | 
            +
                propagating to other views.
         | 
| 20395 | 
            +
             | 
| 20396 | 
            +
                By default, when the user presses the return key on their keyboard and
         | 
| 20397 | 
            +
                the text field has an `action` set, the action will be sent to the view's
         | 
| 20398 | 
            +
                controller and the key event will stop propagating.
         | 
| 20399 | 
            +
             | 
| 20400 | 
            +
                If you would like parent views to receive the `keyUp` event even after an
         | 
| 20401 | 
            +
                action has been dispatched, set `bubbles` to true.
         | 
| 20402 | 
            +
             | 
| 20403 | 
            +
                @property bubbles
         | 
| 20404 | 
            +
                @type Boolean
         | 
| 20405 | 
            +
                @default false
         | 
| 20406 | 
            +
              */
         | 
| 20407 | 
            +
              bubbles: false,
         | 
| 20408 | 
            +
             | 
| 20409 | 
            +
              insertNewline: function(event) {
         | 
| 20410 | 
            +
                var controller = get(this, 'controller'),
         | 
| 19892 20411 | 
             
                    action = get(this, 'action');
         | 
| 19893 20412 |  | 
| 19894 20413 | 
             
                if (action) {
         | 
| 19895 | 
            -
                  controller.send(action, get(this, 'value'));
         | 
| 19896 | 
            -
                }
         | 
| 20414 | 
            +
                  controller.send(action, get(this, 'value'), this);
         | 
| 19897 20415 |  | 
| 19898 | 
            -
             | 
| 20416 | 
            +
                  if (!get(this, 'bubbles')) {
         | 
| 20417 | 
            +
                    event.stopPropagation();
         | 
| 20418 | 
            +
                  }
         | 
| 20419 | 
            +
                }
         | 
| 19899 20420 | 
             
              }
         | 
| 19900 20421 | 
             
            });
         | 
| 19901 20422 |  | 
| @@ -20369,30 +20890,37 @@ Ember.Select = Ember.View.extend( | |
| 20369 20890 | 
             
              tagName: 'select',
         | 
| 20370 20891 | 
             
              classNames: ['ember-select'],
         | 
| 20371 20892 | 
             
              defaultTemplate: Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {
         | 
| 20893 | 
            +
            this.compilerInfo = [2,'>= 1.0.0-rc.3'];
         | 
| 20372 20894 | 
             
            helpers = helpers || Ember.Handlebars.helpers; data = data || {};
         | 
| 20373 | 
            -
              var buffer = '', stack1, escapeExpression=this.escapeExpression, self=this;
         | 
| 20895 | 
            +
              var buffer = '', stack1, hashTypes, escapeExpression=this.escapeExpression, self=this;
         | 
| 20374 20896 |  | 
| 20375 20897 | 
             
            function program1(depth0,data) {
         | 
| 20376 20898 |  | 
| 20377 | 
            -
              var buffer = '',  | 
| 20899 | 
            +
              var buffer = '', hashTypes;
         | 
| 20378 20900 | 
             
              data.buffer.push("<option value=\"\">");
         | 
| 20379 | 
            -
               | 
| 20380 | 
            -
              data.buffer.push(escapeExpression( | 
| 20381 | 
            -
               | 
| 20901 | 
            +
              hashTypes = {};
         | 
| 20902 | 
            +
              data.buffer.push(escapeExpression(helpers._triageMustache.call(depth0, "view.prompt", {hash:{},contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data})));
         | 
| 20903 | 
            +
              data.buffer.push("</option>");
         | 
| 20904 | 
            +
              return buffer;
         | 
| 20905 | 
            +
              }
         | 
| 20382 20906 |  | 
| 20383 20907 | 
             
            function program3(depth0,data) {
         | 
| 20384 20908 |  | 
| 20385 | 
            -
              var  | 
| 20386 | 
            -
               | 
| 20387 | 
            -
               | 
| 20388 | 
            -
             | 
| 20389 | 
            -
              data | 
| 20909 | 
            +
              var hashTypes;
         | 
| 20910 | 
            +
              hashTypes = {'contentBinding': "STRING"};
         | 
| 20911 | 
            +
              data.buffer.push(escapeExpression(helpers.view.call(depth0, "Ember.SelectOption", {hash:{
         | 
| 20912 | 
            +
                'contentBinding': ("this")
         | 
| 20913 | 
            +
              },contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data})));
         | 
| 20914 | 
            +
              }
         | 
| 20390 20915 |  | 
| 20391 | 
            -
               | 
| 20916 | 
            +
              hashTypes = {};
         | 
| 20917 | 
            +
              stack1 = helpers['if'].call(depth0, "view.prompt", {hash:{},inverse:self.noop,fn:self.program(1, program1, data),contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data});
         | 
| 20392 20918 | 
             
              if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
         | 
| 20393 | 
            -
               | 
| 20919 | 
            +
              hashTypes = {};
         | 
| 20920 | 
            +
              stack1 = helpers.each.call(depth0, "view.content", {hash:{},inverse:self.noop,fn:self.program(3, program3, data),contexts:[depth0],types:["ID"],hashTypes:hashTypes,data:data});
         | 
| 20394 20921 | 
             
              if(stack1 || stack1 === 0) { data.buffer.push(stack1); }
         | 
| 20395 20922 | 
             
              return buffer;
         | 
| 20923 | 
            +
              
         | 
| 20396 20924 | 
             
            }),
         | 
| 20397 20925 | 
             
              attributeBindings: ['multiple', 'disabled', 'tabindex'],
         | 
| 20398 20926 |  | 
| @@ -21728,10 +22256,16 @@ define("router", | |
| 21728 22256 | 
             
                    if (handler.setup) { handler.setup(context); }
         | 
| 21729 22257 | 
             
                  });
         | 
| 21730 22258 |  | 
| 22259 | 
            +
                  var aborted = false;
         | 
| 21731 22260 | 
             
                  eachHandler(partition.entered, function(handler, context) {
         | 
| 22261 | 
            +
                    if (aborted) { return; }
         | 
| 21732 22262 | 
             
                    if (handler.enter) { handler.enter(); }
         | 
| 21733 22263 | 
             
                    setContext(handler, context);
         | 
| 21734 | 
            -
                    if (handler.setup) { | 
| 22264 | 
            +
                    if (handler.setup) {
         | 
| 22265 | 
            +
                      if (false === handler.setup(context)) {
         | 
| 22266 | 
            +
                        aborted = true;
         | 
| 22267 | 
            +
                      }
         | 
| 22268 | 
            +
                    }
         | 
| 21735 22269 | 
             
                  });
         | 
| 21736 22270 |  | 
| 21737 22271 | 
             
                  if (router.didTransition) {
         | 
| @@ -21855,21 +22389,23 @@ define("router", | |
| 21855 22389 | 
             
                function trigger(router, args) {
         | 
| 21856 22390 | 
             
                  var currentHandlerInfos = router.currentHandlerInfos;
         | 
| 21857 22391 |  | 
| 22392 | 
            +
                  var name = args.shift();
         | 
| 22393 | 
            +
             | 
| 21858 22394 | 
             
                  if (!currentHandlerInfos) {
         | 
| 21859 | 
            -
                    throw new Error("Could not trigger event. There are no active handlers");
         | 
| 22395 | 
            +
                    throw new Error("Could not trigger event '" + name + "'. There are no active handlers");
         | 
| 21860 22396 | 
             
                  }
         | 
| 21861 22397 |  | 
| 21862 | 
            -
                  var name = args.shift();
         | 
| 21863 | 
            -
             | 
| 21864 22398 | 
             
                  for (var i=currentHandlerInfos.length-1; i>=0; i--) {
         | 
| 21865 22399 | 
             
                    var handlerInfo = currentHandlerInfos[i],
         | 
| 21866 22400 | 
             
                        handler = handlerInfo.handler;
         | 
| 21867 22401 |  | 
| 21868 22402 | 
             
                    if (handler.events && handler.events[name]) {
         | 
| 21869 22403 | 
             
                      handler.events[name].apply(handler, args);
         | 
| 21870 | 
            -
                       | 
| 22404 | 
            +
                      return;
         | 
| 21871 22405 | 
             
                    }
         | 
| 21872 22406 | 
             
                  }
         | 
| 22407 | 
            +
             | 
| 22408 | 
            +
                  throw new Error("Nothing handled the event '" + name + "'.");
         | 
| 21873 22409 | 
             
                }
         | 
| 21874 22410 |  | 
| 21875 22411 | 
             
                function setContext(handler, context) {
         | 
| @@ -22015,7 +22551,7 @@ Ember.generateController = function(container, controllerName, context) { | |
| 22015 22551 | 
             
            var Router = requireModule("router");
         | 
| 22016 22552 | 
             
            var get = Ember.get, set = Ember.set, classify = Ember.String.classify;
         | 
| 22017 22553 |  | 
| 22018 | 
            -
            var DefaultView = Ember. | 
| 22554 | 
            +
            var DefaultView = Ember._MetamorphView;
         | 
| 22019 22555 | 
             
            function setupLocation(router) {
         | 
| 22020 22556 | 
             
              var location = get(router, 'location'),
         | 
| 22021 22557 | 
             
                  rootURL = get(router, 'rootURL');
         | 
| @@ -22031,6 +22567,14 @@ function setupLocation(router) { | |
| 22031 22567 | 
             
              }
         | 
| 22032 22568 | 
             
            }
         | 
| 22033 22569 |  | 
| 22570 | 
            +
            /**
         | 
| 22571 | 
            +
              The `Ember.Router` class manages the application state and URLs. Refer to
         | 
| 22572 | 
            +
              the [routing guide](http://emberjs.com/guides/routing/) for documentation.
         | 
| 22573 | 
            +
             | 
| 22574 | 
            +
              @class Router
         | 
| 22575 | 
            +
              @namespace Ember
         | 
| 22576 | 
            +
              @extends Ember.Object
         | 
| 22577 | 
            +
            */
         | 
| 22034 22578 | 
             
            Ember.Router = Ember.Object.extend({
         | 
| 22035 22579 | 
             
              location: 'hash',
         | 
| 22036 22580 |  | 
| @@ -22040,6 +22584,10 @@ Ember.Router = Ember.Object.extend({ | |
| 22040 22584 | 
             
                setupLocation(this);
         | 
| 22041 22585 | 
             
              },
         | 
| 22042 22586 |  | 
| 22587 | 
            +
              url: Ember.computed(function() {
         | 
| 22588 | 
            +
                return get(this, 'location').getURL();
         | 
| 22589 | 
            +
              }),
         | 
| 22590 | 
            +
             | 
| 22043 22591 | 
             
              startRouting: function() {
         | 
| 22044 22592 | 
             
                this.router = this.router || this.constructor.map(Ember.K);
         | 
| 22045 22593 |  | 
| @@ -22053,15 +22601,18 @@ Ember.Router = Ember.Object.extend({ | |
| 22053 22601 | 
             
                container.register('view', 'default', DefaultView);
         | 
| 22054 22602 | 
             
                container.register('view', 'toplevel', Ember.View.extend());
         | 
| 22055 22603 |  | 
| 22056 | 
            -
                router.handleURL(location.getURL());
         | 
| 22057 22604 | 
             
                location.onUpdateURL(function(url) {
         | 
| 22058 | 
            -
                   | 
| 22605 | 
            +
                  self.handleURL(url);
         | 
| 22059 22606 | 
             
                });
         | 
| 22607 | 
            +
             | 
| 22608 | 
            +
                this.handleURL(location.getURL());
         | 
| 22060 22609 | 
             
              },
         | 
| 22061 22610 |  | 
| 22062 22611 | 
             
              didTransition: function(infos) {
         | 
| 22063 22612 | 
             
                // Don't do any further action here if we redirected
         | 
| 22064 | 
            -
                 | 
| 22613 | 
            +
                for (var i=0, l=infos.length; i<l; i++) {
         | 
| 22614 | 
            +
                  if (infos[i].handler.redirected) { return; }
         | 
| 22615 | 
            +
                }
         | 
| 22065 22616 |  | 
| 22066 22617 | 
             
                var appController = this.container.lookup('controller:application'),
         | 
| 22067 22618 | 
             
                    path = routePath(infos);
         | 
| @@ -22079,23 +22630,14 @@ Ember.Router = Ember.Object.extend({ | |
| 22079 22630 | 
             
                this.notifyPropertyChange('url');
         | 
| 22080 22631 | 
             
              },
         | 
| 22081 22632 |  | 
| 22082 | 
            -
              transitionTo: function( | 
| 22083 | 
            -
                var args = [].slice.call(arguments) | 
| 22084 | 
            -
             | 
| 22085 | 
            -
                if (!this.router.hasRoute(passedName)) {
         | 
| 22086 | 
            -
                  name = args[0] = passedName + '.index';
         | 
| 22087 | 
            -
                } else {
         | 
| 22088 | 
            -
                  name = passedName;
         | 
| 22089 | 
            -
                }
         | 
| 22090 | 
            -
             | 
| 22091 | 
            -
             | 
| 22092 | 
            -
                this.router.transitionTo.apply(this.router, args);
         | 
| 22093 | 
            -
                this.notifyPropertyChange('url');
         | 
| 22633 | 
            +
              transitionTo: function(name) {
         | 
| 22634 | 
            +
                var args = [].slice.call(arguments);
         | 
| 22635 | 
            +
                doTransition(this, 'transitionTo', args);
         | 
| 22094 22636 | 
             
              },
         | 
| 22095 22637 |  | 
| 22096 22638 | 
             
              replaceWith: function() {
         | 
| 22097 | 
            -
                 | 
| 22098 | 
            -
                this | 
| 22639 | 
            +
                var args = [].slice.call(arguments);
         | 
| 22640 | 
            +
                doTransition(this, 'replaceWith', args);
         | 
| 22099 22641 | 
             
              },
         | 
| 22100 22642 |  | 
| 22101 22643 | 
             
              generate: function() {
         | 
| @@ -22109,11 +22651,7 @@ Ember.Router = Ember.Object.extend({ | |
| 22109 22651 | 
             
              },
         | 
| 22110 22652 |  | 
| 22111 22653 | 
             
              send: function(name, context) {
         | 
| 22112 | 
            -
                 | 
| 22113 | 
            -
                  context = context.context;
         | 
| 22114 | 
            -
                }
         | 
| 22115 | 
            -
             | 
| 22116 | 
            -
                this.router.trigger(name, context);
         | 
| 22654 | 
            +
                this.router.trigger.apply(this.router, arguments);
         | 
| 22117 22655 | 
             
              },
         | 
| 22118 22656 |  | 
| 22119 22657 | 
             
              hasRoute: function(route) {
         | 
| @@ -22230,6 +22768,20 @@ function setupRouter(emberRouter, router, location) { | |
| 22230 22768 | 
             
              };
         | 
| 22231 22769 | 
             
            }
         | 
| 22232 22770 |  | 
| 22771 | 
            +
            function doTransition(router, method, args) {
         | 
| 22772 | 
            +
              var passedName = args[0], name;
         | 
| 22773 | 
            +
             | 
| 22774 | 
            +
              if (!router.router.hasRoute(args[0])) {
         | 
| 22775 | 
            +
                name = args[0] = passedName + '.index';
         | 
| 22776 | 
            +
              } else {
         | 
| 22777 | 
            +
                name = passedName;
         | 
| 22778 | 
            +
              }
         | 
| 22779 | 
            +
             | 
| 22780 | 
            +
             | 
| 22781 | 
            +
              router.router[method].apply(router.router, args);
         | 
| 22782 | 
            +
              router.notifyPropertyChange('url');
         | 
| 22783 | 
            +
            }
         | 
| 22784 | 
            +
             | 
| 22233 22785 | 
             
            Ember.Router.reopenClass({
         | 
| 22234 22786 | 
             
              map: function(callback) {
         | 
| 22235 22787 | 
             
                var router = this.router = new Router();
         | 
| @@ -22259,12 +22811,70 @@ var get = Ember.get, set = Ember.set, | |
| 22259 22811 | 
             
                classify = Ember.String.classify,
         | 
| 22260 22812 | 
             
                decamelize = Ember.String.decamelize;
         | 
| 22261 22813 |  | 
| 22814 | 
            +
            /**
         | 
| 22815 | 
            +
              The `Ember.Route` class is used to define individual routes. Refer to
         | 
| 22816 | 
            +
              the [routing guide](http://emberjs.com/guides/routing/) for documentation.
         | 
| 22262 22817 |  | 
| 22818 | 
            +
              @class Route
         | 
| 22819 | 
            +
              @namespace Ember
         | 
| 22820 | 
            +
              @extends Ember.Object
         | 
| 22821 | 
            +
            */
         | 
| 22263 22822 | 
             
            Ember.Route = Ember.Object.extend({
         | 
| 22823 | 
            +
              /**
         | 
| 22824 | 
            +
                @private
         | 
| 22825 | 
            +
             | 
| 22826 | 
            +
                @method exit
         | 
| 22827 | 
            +
              */
         | 
| 22264 22828 | 
             
              exit: function() {
         | 
| 22829 | 
            +
                this.deactivate();
         | 
| 22265 22830 | 
             
                teardownView(this);
         | 
| 22266 22831 | 
             
              },
         | 
| 22267 22832 |  | 
| 22833 | 
            +
              /**
         | 
| 22834 | 
            +
                @private
         | 
| 22835 | 
            +
             | 
| 22836 | 
            +
                @method enter
         | 
| 22837 | 
            +
              */
         | 
| 22838 | 
            +
              enter: function() {
         | 
| 22839 | 
            +
                this.activate();
         | 
| 22840 | 
            +
              },
         | 
| 22841 | 
            +
             | 
| 22842 | 
            +
              /**
         | 
| 22843 | 
            +
                The collection of functions keyed by name available on this route as
         | 
| 22844 | 
            +
                action targets.
         | 
| 22845 | 
            +
             | 
| 22846 | 
            +
                These functions will be invoked when a matching `{{action}}` is triggered
         | 
| 22847 | 
            +
                from within a template and the application's current route is this route.
         | 
| 22848 | 
            +
             | 
| 22849 | 
            +
                Events can also be invoked from other parts of your application via `Route#send`.
         | 
| 22850 | 
            +
             | 
| 22851 | 
            +
                The context of event will be the this route.
         | 
| 22852 | 
            +
             | 
| 22853 | 
            +
                @see {Ember.Route#send}
         | 
| 22854 | 
            +
                @see {Handlebars.helpers.action}
         | 
| 22855 | 
            +
             | 
| 22856 | 
            +
                @property events
         | 
| 22857 | 
            +
                @type Hash
         | 
| 22858 | 
            +
                @default null
         | 
| 22859 | 
            +
              */
         | 
| 22860 | 
            +
              events: null,
         | 
| 22861 | 
            +
             | 
| 22862 | 
            +
              /**
         | 
| 22863 | 
            +
                This hook is executed when the router completely exits this route. It is
         | 
| 22864 | 
            +
                not executed when the model for the route changes.
         | 
| 22865 | 
            +
             | 
| 22866 | 
            +
                @method deactivate
         | 
| 22867 | 
            +
              */
         | 
| 22868 | 
            +
              deactivate: Ember.K,
         | 
| 22869 | 
            +
             | 
| 22870 | 
            +
              /**
         | 
| 22871 | 
            +
                This hook is executed when the router enters the route for the first time.
         | 
| 22872 | 
            +
                It is not executed when the model for the route changes.
         | 
| 22873 | 
            +
             | 
| 22874 | 
            +
                @method activate
         | 
| 22875 | 
            +
              */
         | 
| 22876 | 
            +
              activate: Ember.K,
         | 
| 22877 | 
            +
             | 
| 22268 22878 | 
             
              /**
         | 
| 22269 22879 | 
             
                Transition into another route. Optionally supply a model for the
         | 
| 22270 22880 | 
             
                route in question. The model will be serialized into the URL
         | 
| @@ -22275,7 +22885,7 @@ Ember.Route = Ember.Object.extend({ | |
| 22275 22885 | 
             
                @param {...Object} models the
         | 
| 22276 22886 | 
             
              */
         | 
| 22277 22887 | 
             
              transitionTo: function() {
         | 
| 22278 | 
            -
                this. | 
| 22888 | 
            +
                if (this._checkingRedirect) { this.redirected = true; }
         | 
| 22279 22889 | 
             
                return this.router.transitionTo.apply(this.router, arguments);
         | 
| 22280 22890 | 
             
              },
         | 
| 22281 22891 |  | 
| @@ -22288,7 +22898,7 @@ Ember.Route = Ember.Object.extend({ | |
| 22288 22898 | 
             
                @param {...Object} models the
         | 
| 22289 22899 | 
             
              */
         | 
| 22290 22900 | 
             
              replaceWith: function() {
         | 
| 22291 | 
            -
                this. | 
| 22901 | 
            +
                if (this._checkingRedirect) { this.redirected = true; }
         | 
| 22292 22902 | 
             
                return this.router.replaceWith.apply(this.router, arguments);
         | 
| 22293 22903 | 
             
              },
         | 
| 22294 22904 |  | 
| @@ -22304,14 +22914,18 @@ Ember.Route = Ember.Object.extend({ | |
| 22304 22914 | 
             
                @method setup
         | 
| 22305 22915 | 
             
              */
         | 
| 22306 22916 | 
             
              setup: function(context) {
         | 
| 22307 | 
            -
                this. | 
| 22917 | 
            +
                this.redirected = false;
         | 
| 22918 | 
            +
                this._checkingRedirect = true;
         | 
| 22919 | 
            +
             | 
| 22308 22920 | 
             
                this.redirect(context);
         | 
| 22309 22921 |  | 
| 22310 | 
            -
                 | 
| 22922 | 
            +
                this._checkingRedirect = false;
         | 
| 22923 | 
            +
                if (this.redirected) { return false; }
         | 
| 22311 22924 |  | 
| 22312 22925 | 
             
                var controller = this.controllerFor(this.routeName, context);
         | 
| 22313 22926 |  | 
| 22314 22927 | 
             
                if (controller) {
         | 
| 22928 | 
            +
                  this.controller = controller;
         | 
| 22315 22929 | 
             
                  set(controller, 'model', context);
         | 
| 22316 22930 | 
             
                }
         | 
| 22317 22931 |  | 
| @@ -22386,16 +23000,18 @@ Ember.Route = Ember.Object.extend({ | |
| 22386 23000 | 
             
                @param {Object} params the parameters extracted from the URL
         | 
| 22387 23001 | 
             
              */
         | 
| 22388 23002 | 
             
              model: function(params) {
         | 
| 22389 | 
            -
                var match, name, value;
         | 
| 23003 | 
            +
                var match, name, sawParams, value;
         | 
| 22390 23004 |  | 
| 22391 23005 | 
             
                for (var prop in params) {
         | 
| 22392 23006 | 
             
                  if (match = prop.match(/^(.*)_id$/)) {
         | 
| 22393 23007 | 
             
                    name = match[1];
         | 
| 22394 23008 | 
             
                    value = params[prop];
         | 
| 22395 23009 | 
             
                  }
         | 
| 23010 | 
            +
                  sawParams = true;
         | 
| 22396 23011 | 
             
                }
         | 
| 22397 23012 |  | 
| 22398 | 
            -
                if (!name) { return; }
         | 
| 23013 | 
            +
                if (!name && sawParams) { return params; }
         | 
| 23014 | 
            +
                else if (!name) { return; }
         | 
| 22399 23015 |  | 
| 22400 23016 | 
             
                var className = classify(name),
         | 
| 22401 23017 | 
             
                    namespace = this.router.namespace,
         | 
| @@ -22442,7 +23058,12 @@ Ember.Route = Ember.Object.extend({ | |
| 22442 23058 | 
             
                if (params.length !== 1) { return; }
         | 
| 22443 23059 |  | 
| 22444 23060 | 
             
                var name = params[0], object = {};
         | 
| 22445 | 
            -
             | 
| 23061 | 
            +
             | 
| 23062 | 
            +
                if (/_id$/.test(name)) {
         | 
| 23063 | 
            +
                  object[name] = get(model, 'id');
         | 
| 23064 | 
            +
                } else {
         | 
| 23065 | 
            +
                  object[name] = model;
         | 
| 23066 | 
            +
                }
         | 
| 22446 23067 |  | 
| 22447 23068 | 
             
                return object;
         | 
| 22448 23069 | 
             
              },
         | 
| @@ -22610,12 +23231,16 @@ Ember.Route = Ember.Object.extend({ | |
| 22610 23231 |  | 
| 22611 23232 | 
             
                if (!view && !template) { return; }
         | 
| 22612 23233 |  | 
| 22613 | 
            -
                this.lastRenderedTemplate = name;
         | 
| 22614 | 
            -
             | 
| 22615 23234 | 
             
                options = normalizeOptions(this, name, template, options);
         | 
| 22616 23235 | 
             
                view = setupView(view, container, options);
         | 
| 22617 23236 |  | 
| 23237 | 
            +
                if (options.outlet === 'main') { this.lastRenderedTemplate = name; }
         | 
| 23238 | 
            +
             | 
| 22618 23239 | 
             
                appendView(this, view, options);
         | 
| 23240 | 
            +
              },
         | 
| 23241 | 
            +
             | 
| 23242 | 
            +
              willDestroy: function() {
         | 
| 23243 | 
            +
                teardownView(this);
         | 
| 22619 23244 | 
             
              }
         | 
| 22620 23245 | 
             
            });
         | 
| 22621 23246 |  | 
| @@ -22631,15 +23256,16 @@ function parentRoute(route) { | |
| 22631 23256 | 
             
              }
         | 
| 22632 23257 | 
             
            }
         | 
| 22633 23258 |  | 
| 22634 | 
            -
            function parentTemplate(route) {
         | 
| 23259 | 
            +
            function parentTemplate(route, isRecursive) {
         | 
| 22635 23260 | 
             
              var parent = parentRoute(route), template;
         | 
| 22636 23261 |  | 
| 22637 23262 | 
             
              if (!parent) { return; }
         | 
| 22638 23263 |  | 
| 23264 | 
            +
             | 
| 22639 23265 | 
             
              if (template = parent.lastRenderedTemplate) {
         | 
| 22640 23266 | 
             
                return template;
         | 
| 22641 23267 | 
             
              } else {
         | 
| 22642 | 
            -
                return parentTemplate(parent);
         | 
| 23268 | 
            +
                return parentTemplate(parent, true);
         | 
| 22643 23269 | 
             
              }
         | 
| 22644 23270 | 
             
            }
         | 
| 22645 23271 |  | 
| @@ -22650,6 +23276,7 @@ function normalizeOptions(route, name, template, options) { | |
| 22650 23276 | 
             
              options.name = name;
         | 
| 22651 23277 | 
             
              options.template = template;
         | 
| 22652 23278 |  | 
| 23279 | 
            +
             | 
| 22653 23280 | 
             
              var controller = options.controller, namedController;
         | 
| 22654 23281 |  | 
| 22655 23282 | 
             
              if (options.controller) {
         | 
| @@ -22676,6 +23303,8 @@ function setupView(view, container, options) { | |
| 22676 23303 |  | 
| 22677 23304 | 
             
              if (!get(view, 'templateName')) {
         | 
| 22678 23305 | 
             
                set(view, 'template', options.template);
         | 
| 23306 | 
            +
             | 
| 23307 | 
            +
                set(view, '_debugTemplateName', options.name);
         | 
| 22679 23308 | 
             
              }
         | 
| 22680 23309 |  | 
| 22681 23310 | 
             
              set(view, 'renderedName', options.name);
         | 
| @@ -22698,7 +23327,7 @@ function appendView(route, view, options) { | |
| 22698 23327 | 
             
            }
         | 
| 22699 23328 |  | 
| 22700 23329 | 
             
            function teardownTopLevel(view) {
         | 
| 22701 | 
            -
              return function() { view. | 
| 23330 | 
            +
              return function() { view.destroy(); };
         | 
| 22702 23331 | 
             
            }
         | 
| 22703 23332 |  | 
| 22704 23333 | 
             
            function teardownOutlet(parentView, outlet) {
         | 
| @@ -22723,10 +23352,15 @@ function teardownView(route) { | |
| 22723 23352 |  | 
| 22724 23353 |  | 
| 22725 23354 | 
             
            (function() {
         | 
| 23355 | 
            +
            /**
         | 
| 23356 | 
            +
            @module ember
         | 
| 23357 | 
            +
            @submodule ember-routing
         | 
| 23358 | 
            +
            */
         | 
| 23359 | 
            +
             | 
| 22726 23360 | 
             
            var get = Ember.get, set = Ember.set;
         | 
| 22727 23361 | 
             
            Ember.onLoad('Ember.Handlebars', function(Handlebars) {
         | 
| 22728 23362 |  | 
| 22729 | 
            -
              var  | 
| 23363 | 
            +
              var resolveParams = Ember.Handlebars.resolveParams,
         | 
| 22730 23364 | 
             
                  isSimpleClick = Ember.ViewUtils.isSimpleClick;
         | 
| 22731 23365 |  | 
| 22732 23366 | 
             
              function fullRouteName(router, name) {
         | 
| @@ -22737,8 +23371,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22737 23371 | 
             
                return name;
         | 
| 22738 23372 | 
             
              }
         | 
| 22739 23373 |  | 
| 22740 | 
            -
              function resolvedPaths( | 
| 22741 | 
            -
                 | 
| 23374 | 
            +
              function resolvedPaths(options) {
         | 
| 23375 | 
            +
                var types = options.options.types.slice(1),
         | 
| 23376 | 
            +
                    data = options.options.data;
         | 
| 23377 | 
            +
             | 
| 23378 | 
            +
                return resolveParams(options.context, options.params, { types: types, data: data });
         | 
| 22742 23379 | 
             
              }
         | 
| 22743 23380 |  | 
| 22744 23381 | 
             
              function args(linkView, router, route) {
         | 
| @@ -22748,7 +23385,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22748 23385 |  | 
| 22749 23386 |  | 
| 22750 23387 | 
             
                var ret = [ routeName ];
         | 
| 22751 | 
            -
                return ret.concat( | 
| 23388 | 
            +
                return ret.concat(resolvedPaths(linkView.parameters));
         | 
| 22752 23389 | 
             
              }
         | 
| 22753 23390 |  | 
| 22754 23391 | 
             
              var LinkView = Ember.View.extend({
         | 
| @@ -22761,9 +23398,15 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22761 23398 | 
             
                attributeBindings: ['href', 'title'],
         | 
| 22762 23399 | 
             
                classNameBindings: 'active',
         | 
| 22763 23400 |  | 
| 23401 | 
            +
                // Even though this isn't a virtual view, we want to treat it as if it is
         | 
| 23402 | 
            +
                // so that you can access the parent with {{view.prop}}
         | 
| 23403 | 
            +
                concreteView: Ember.computed(function() {
         | 
| 23404 | 
            +
                  return get(this, 'parentView');
         | 
| 23405 | 
            +
                }).property('parentView').volatile(),
         | 
| 23406 | 
            +
             | 
| 22764 23407 | 
             
                active: Ember.computed(function() {
         | 
| 22765 23408 | 
             
                  var router = this.get('router'),
         | 
| 22766 | 
            -
                      params = resolvedPaths(this),
         | 
| 23409 | 
            +
                      params = resolvedPaths(this.parameters),
         | 
| 22767 23410 | 
             
                      currentWithIndex = this.currentWhen + '.index',
         | 
| 22768 23411 | 
             
                      isActive = router.isActive.apply(router, [this.currentWhen].concat(params)) ||
         | 
| 22769 23412 | 
             
                                 router.isActive.apply(router, [currentWithIndex].concat(params));
         | 
| @@ -22798,9 +23441,16 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22798 23441 |  | 
| 22799 23442 | 
             
              LinkView.toString = function() { return "LinkView"; };
         | 
| 22800 23443 |  | 
| 23444 | 
            +
              /**
         | 
| 23445 | 
            +
                @method linkTo
         | 
| 23446 | 
            +
                @for Ember.Handlebars.helpers
         | 
| 23447 | 
            +
                @param {String} routeName
         | 
| 23448 | 
            +
                @param {Object} [context]*
         | 
| 23449 | 
            +
                @return {String} HTML string
         | 
| 23450 | 
            +
              */
         | 
| 22801 23451 | 
             
              Ember.Handlebars.registerHelper('linkTo', function(name) {
         | 
| 22802 23452 | 
             
                var options = [].slice.call(arguments, -1)[0];
         | 
| 22803 | 
            -
                var  | 
| 23453 | 
            +
                var params = [].slice.call(arguments, 1, -1);
         | 
| 22804 23454 |  | 
| 22805 23455 | 
             
                var hash = options.hash;
         | 
| 22806 23456 |  | 
| @@ -22808,9 +23458,9 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22808 23458 | 
             
                hash.currentWhen = hash.currentWhen || name;
         | 
| 22809 23459 |  | 
| 22810 23460 | 
             
                hash.parameters = {
         | 
| 22811 | 
            -
                   | 
| 22812 | 
            -
                   | 
| 22813 | 
            -
                   | 
| 23461 | 
            +
                  context: this,
         | 
| 23462 | 
            +
                  options: options,
         | 
| 23463 | 
            +
                  params: params
         | 
| 22814 23464 | 
             
                };
         | 
| 22815 23465 |  | 
| 22816 23466 | 
             
                return Ember.Handlebars.helpers.view.call(this, LinkView, options);
         | 
| @@ -22894,45 +23544,6 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22894 23544 |  | 
| 22895 23545 | 
             
                return Handlebars.helpers.view.call(this, Handlebars.OutletView, options);
         | 
| 22896 23546 | 
             
              });
         | 
| 22897 | 
            -
             | 
| 22898 | 
            -
              Ember.View.reopen({
         | 
| 22899 | 
            -
                init: function() {
         | 
| 22900 | 
            -
                  set(this, '_outlets', {});
         | 
| 22901 | 
            -
                  this._super();
         | 
| 22902 | 
            -
                },
         | 
| 22903 | 
            -
             | 
| 22904 | 
            -
                connectOutlet: function(outletName, view) {
         | 
| 22905 | 
            -
                  var outlets = get(this, '_outlets'),
         | 
| 22906 | 
            -
                      container = get(this, 'container'),
         | 
| 22907 | 
            -
                      router = container && container.lookup('router:main'),
         | 
| 22908 | 
            -
                      oldView = get(outlets, outletName),
         | 
| 22909 | 
            -
                      renderedName = get(view, 'renderedName');
         | 
| 22910 | 
            -
             | 
| 22911 | 
            -
                  set(outlets, outletName, view);
         | 
| 22912 | 
            -
             | 
| 22913 | 
            -
                  if (router) {
         | 
| 22914 | 
            -
                    if (oldView) {
         | 
| 22915 | 
            -
                      router._disconnectActiveView(oldView);
         | 
| 22916 | 
            -
                    }
         | 
| 22917 | 
            -
                    if (renderedName) {
         | 
| 22918 | 
            -
                      router._connectActiveView(renderedName, view);
         | 
| 22919 | 
            -
                    }
         | 
| 22920 | 
            -
                  }
         | 
| 22921 | 
            -
                },
         | 
| 22922 | 
            -
             | 
| 22923 | 
            -
                disconnectOutlet: function(outletName) {
         | 
| 22924 | 
            -
                  var outlets = get(this, '_outlets'),
         | 
| 22925 | 
            -
                      container = get(this, 'container'),
         | 
| 22926 | 
            -
                      router = container && container.lookup('router:main'),
         | 
| 22927 | 
            -
                      view = get(outlets, outletName);
         | 
| 22928 | 
            -
             | 
| 22929 | 
            -
                  set(outlets, outletName, null);
         | 
| 22930 | 
            -
             | 
| 22931 | 
            -
                  if (router && view) {
         | 
| 22932 | 
            -
                    router._disconnectActiveView(view);
         | 
| 22933 | 
            -
                  }
         | 
| 22934 | 
            -
                }
         | 
| 22935 | 
            -
              });
         | 
| 22936 23547 | 
             
            });
         | 
| 22937 23548 |  | 
| 22938 23549 | 
             
            })();
         | 
| @@ -22948,17 +23559,34 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22948 23559 | 
             
            var get = Ember.get, set = Ember.set;
         | 
| 22949 23560 | 
             
            Ember.onLoad('Ember.Handlebars', function(Handlebars) {
         | 
| 22950 23561 |  | 
| 22951 | 
            -
               | 
| 23562 | 
            +
              /**
         | 
| 23563 | 
            +
                Renders the named template in the current context using the singleton
         | 
| 23564 | 
            +
                instance of the same-named controller.
         | 
| 23565 | 
            +
             | 
| 23566 | 
            +
                If a view class with the same name exists, uses the view class.
         | 
| 23567 | 
            +
             | 
| 23568 | 
            +
                If a `model` is specified, it becomes the model for that controller.
         | 
| 22952 23569 |  | 
| 22953 | 
            -
                 | 
| 23570 | 
            +
                The default target for `{{action}}`s in the rendered template is the
         | 
| 23571 | 
            +
                named controller.
         | 
| 23572 | 
            +
             | 
| 23573 | 
            +
                @method action
         | 
| 23574 | 
            +
                @for Ember.Handlebars.helpers
         | 
| 23575 | 
            +
                @param {String} actionName
         | 
| 23576 | 
            +
                @param {Object?} model
         | 
| 23577 | 
            +
                @param {Hash} options
         | 
| 23578 | 
            +
              */
         | 
| 23579 | 
            +
              Ember.Handlebars.registerHelper('render', function(name, contextString, options) {
         | 
| 23580 | 
            +
             | 
| 23581 | 
            +
                var container, router, controller, view, context;
         | 
| 22954 23582 |  | 
| 22955 23583 | 
             
                if (arguments.length === 2) {
         | 
| 22956 | 
            -
                  options =  | 
| 22957 | 
            -
                   | 
| 23584 | 
            +
                  options = contextString;
         | 
| 23585 | 
            +
                  contextString = undefined;
         | 
| 22958 23586 | 
             
                }
         | 
| 22959 23587 |  | 
| 22960 | 
            -
                if (typeof  | 
| 22961 | 
            -
                  context = Ember.Handlebars.get(options.contexts[1],  | 
| 23588 | 
            +
                if (typeof contextString === 'string') {
         | 
| 23589 | 
            +
                  context = Ember.Handlebars.get(options.contexts[1], contextString, options);
         | 
| 22962 23590 | 
             
                }
         | 
| 22963 23591 |  | 
| 22964 23592 | 
             
                name = name.replace(/\//g, '.');
         | 
| @@ -22978,6 +23606,14 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 22978 23606 | 
             
                  controller.set('model', context);
         | 
| 22979 23607 | 
             
                }
         | 
| 22980 23608 |  | 
| 23609 | 
            +
                var root = options.contexts[1];
         | 
| 23610 | 
            +
             | 
| 23611 | 
            +
                if (root) {
         | 
| 23612 | 
            +
                  view.registerObserver(root, contextString, function() {
         | 
| 23613 | 
            +
                    controller.set('model', Ember.Handlebars.get(root, contextString, options));
         | 
| 23614 | 
            +
                  });
         | 
| 23615 | 
            +
                }
         | 
| 23616 | 
            +
             | 
| 22981 23617 | 
             
                controller.set('target', options.data.keywords.controller);
         | 
| 22982 23618 |  | 
| 22983 23619 | 
             
                options.hash.viewName = Ember.String.camelize(name);
         | 
| @@ -23004,7 +23640,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23004 23640 | 
             
            */
         | 
| 23005 23641 | 
             
            Ember.onLoad('Ember.Handlebars', function(Handlebars) {
         | 
| 23006 23642 |  | 
| 23007 | 
            -
              var  | 
| 23643 | 
            +
              var resolveParams = Ember.Handlebars.resolveParams,
         | 
| 23008 23644 | 
             
                  isSimpleClick = Ember.ViewUtils.isSimpleClick;
         | 
| 23009 23645 |  | 
| 23010 23646 | 
             
              var EmberHandlebars = Ember.Handlebars,
         | 
| @@ -23016,7 +23652,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23016 23652 | 
             
              function args(options, actionName) {
         | 
| 23017 23653 | 
             
                var ret = [];
         | 
| 23018 23654 | 
             
                if (actionName) { ret.push(actionName); }
         | 
| 23019 | 
            -
             | 
| 23655 | 
            +
             | 
| 23656 | 
            +
                var types = options.options.types.slice(1),
         | 
| 23657 | 
            +
                    data = options.options.data;
         | 
| 23658 | 
            +
             | 
| 23659 | 
            +
                return ret.concat(resolveParams(options.context, options.params, { types: types, data: data }));
         | 
| 23020 23660 | 
             
              }
         | 
| 23021 23661 |  | 
| 23022 23662 | 
             
              var ActionHelper = EmberHandlebars.ActionHelper = {
         | 
| @@ -23040,12 +23680,20 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23040 23680 | 
             
                        contexts = options.contexts,
         | 
| 23041 23681 | 
             
                        target = options.target;
         | 
| 23042 23682 |  | 
| 23043 | 
            -
                    if (target. | 
| 23044 | 
            -
                       | 
| 23683 | 
            +
                    if (target.target) {
         | 
| 23684 | 
            +
                      target = handlebarsGet(target.root, target.target, target.options);
         | 
| 23045 23685 | 
             
                    } else {
         | 
| 23046 | 
            -
             | 
| 23047 | 
            -
                      return target[actionName].apply(target, args(options));
         | 
| 23686 | 
            +
                      target = target.root;
         | 
| 23048 23687 | 
             
                    }
         | 
| 23688 | 
            +
             | 
| 23689 | 
            +
                    Ember.run(function() {
         | 
| 23690 | 
            +
                      if (target.send) {
         | 
| 23691 | 
            +
                        target.send.apply(target, args(options.parameters, actionName));
         | 
| 23692 | 
            +
                      } else {
         | 
| 23693 | 
            +
             | 
| 23694 | 
            +
                        target[actionName].apply(target, args(options.parameters));
         | 
| 23695 | 
            +
                      }
         | 
| 23696 | 
            +
                    });
         | 
| 23049 23697 | 
             
                  }
         | 
| 23050 23698 | 
             
                };
         | 
| 23051 23699 |  | 
| @@ -23225,7 +23873,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23225 23873 | 
             
                @method action
         | 
| 23226 23874 | 
             
                @for Ember.Handlebars.helpers
         | 
| 23227 23875 | 
             
                @param {String} actionName
         | 
| 23228 | 
            -
                @param {Object | 
| 23876 | 
            +
                @param {Object} [context]*
         | 
| 23229 23877 | 
             
                @param {Hash} options
         | 
| 23230 23878 | 
             
              */
         | 
| 23231 23879 | 
             
              EmberHandlebars.registerHelper('action', function(actionName) {
         | 
| @@ -23234,7 +23882,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23234 23882 |  | 
| 23235 23883 | 
             
                var hash = options.hash,
         | 
| 23236 23884 | 
             
                    view = options.data.view,
         | 
| 23237 | 
            -
                     | 
| 23885 | 
            +
                    controller, link;
         | 
| 23238 23886 |  | 
| 23239 23887 | 
             
                // create a hash to pass along to registerAction
         | 
| 23240 23888 | 
             
                var action = {
         | 
| @@ -23242,20 +23890,23 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23242 23890 | 
             
                };
         | 
| 23243 23891 |  | 
| 23244 23892 | 
             
                action.parameters = {
         | 
| 23245 | 
            -
                   | 
| 23246 | 
            -
                   | 
| 23247 | 
            -
                   | 
| 23893 | 
            +
                  context: this,
         | 
| 23894 | 
            +
                  options: options,
         | 
| 23895 | 
            +
                  params: contexts
         | 
| 23248 23896 | 
             
                };
         | 
| 23249 23897 |  | 
| 23250 23898 | 
             
                action.view = view = get(view, 'concreteView');
         | 
| 23251 23899 |  | 
| 23900 | 
            +
                var root, target;
         | 
| 23901 | 
            +
             | 
| 23252 23902 | 
             
                if (hash.target) {
         | 
| 23253 | 
            -
                   | 
| 23903 | 
            +
                  root = this;
         | 
| 23904 | 
            +
                  target = hash.target;
         | 
| 23254 23905 | 
             
                } else if (controller = options.data.keywords.controller) {
         | 
| 23255 | 
            -
                   | 
| 23906 | 
            +
                  root = controller;
         | 
| 23256 23907 | 
             
                }
         | 
| 23257 23908 |  | 
| 23258 | 
            -
                action.target = target;
         | 
| 23909 | 
            +
                action.target = { root: root, target: target, options: options };
         | 
| 23259 23910 | 
             
                action.bubbles = hash.bubbles;
         | 
| 23260 23911 |  | 
| 23261 23912 | 
             
                var actionId = ActionHelper.registerAction(actionName, action);
         | 
| @@ -23268,108 +23919,124 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) { | |
| 23268 23919 |  | 
| 23269 23920 |  | 
| 23270 23921 |  | 
| 23271 | 
            -
            (function() {
         | 
| 23272 | 
            -
             | 
| 23273 | 
            -
            })();
         | 
| 23274 | 
            -
             | 
| 23275 | 
            -
             | 
| 23276 | 
            -
             | 
| 23277 23922 | 
             
            (function() {
         | 
| 23278 23923 | 
             
            /**
         | 
| 23279 23924 | 
             
            @module ember
         | 
| 23280 23925 | 
             
            @submodule ember-routing
         | 
| 23281 23926 | 
             
            */
         | 
| 23282 23927 |  | 
| 23283 | 
            -
             | 
| 23284 | 
            -
            var  | 
| 23285 | 
            -
              controller: null,
         | 
| 23928 | 
            +
            if (Ember.ENV.EXPERIMENTAL_CONTROL_HELPER) {
         | 
| 23929 | 
            +
              var get = Ember.get, set = Ember.set;
         | 
| 23286 23930 |  | 
| 23287 | 
            -
               | 
| 23288 | 
            -
                 | 
| 23289 | 
            -
             | 
| 23290 | 
            -
                  dependency;
         | 
| 23931 | 
            +
              /**
         | 
| 23932 | 
            +
                The control helper is currently under development and is considered experimental.
         | 
| 23933 | 
            +
                To enable it, set `ENV.EXPERIMENTAL_CONTROL_HELPER = true` before requiring Ember.
         | 
| 23291 23934 |  | 
| 23292 | 
            -
                 | 
| 23293 | 
            -
             | 
| 23294 | 
            -
             | 
| 23295 | 
            -
             | 
| 23296 | 
            -
             | 
| 23935 | 
            +
                @method control
         | 
| 23936 | 
            +
                @for Ember.Handlebars.helpers
         | 
| 23937 | 
            +
                @param {String} path
         | 
| 23938 | 
            +
                @param {String} modelPath
         | 
| 23939 | 
            +
                @param {Hash} options
         | 
| 23940 | 
            +
                @return {String} HTML string
         | 
| 23941 | 
            +
              */
         | 
| 23942 | 
            +
              Ember.Handlebars.registerHelper('control', function(path, modelPath, options) {
         | 
| 23943 | 
            +
                if (arguments.length === 2) {
         | 
| 23944 | 
            +
                  options = modelPath;
         | 
| 23945 | 
            +
                  modelPath = undefined;
         | 
| 23297 23946 | 
             
                }
         | 
| 23298 | 
            -
              }
         | 
| 23299 | 
            -
            });
         | 
| 23300 23947 |  | 
| 23301 | 
            -
             | 
| 23302 | 
            -
              concatenatedProperties: ['needs'],
         | 
| 23303 | 
            -
              needs: [],
         | 
| 23948 | 
            +
                var model;
         | 
| 23304 23949 |  | 
| 23305 | 
            -
             | 
| 23306 | 
            -
             | 
| 23950 | 
            +
                if (modelPath) {
         | 
| 23951 | 
            +
                  model = Ember.Handlebars.get(this, modelPath, options);
         | 
| 23952 | 
            +
                }
         | 
| 23307 23953 |  | 
| 23308 | 
            -
                 | 
| 23309 | 
            -
             | 
| 23954 | 
            +
                var controller = options.data.keywords.controller,
         | 
| 23955 | 
            +
                    view = options.data.keywords.view,
         | 
| 23956 | 
            +
                    children = get(controller, '_childContainers'),
         | 
| 23957 | 
            +
                    controlID = options.hash.controlID,
         | 
| 23958 | 
            +
                    container, subContainer;
         | 
| 23310 23959 |  | 
| 23960 | 
            +
                if (children.hasOwnProperty(controlID)) {
         | 
| 23961 | 
            +
                  subContainer = children[controlID];
         | 
| 23962 | 
            +
                } else {
         | 
| 23963 | 
            +
                  container = get(controller, 'container'),
         | 
| 23964 | 
            +
                  subContainer = container.child();
         | 
| 23965 | 
            +
                  children[controlID] = subContainer;
         | 
| 23311 23966 | 
             
                }
         | 
| 23312 | 
            -
              },
         | 
| 23313 23967 |  | 
| 23314 | 
            -
             | 
| 23315 | 
            -
                var target = get(this, 'target');
         | 
| 23968 | 
            +
                var normalizedPath = path.replace(/\//g, '.');
         | 
| 23316 23969 |  | 
| 23317 | 
            -
                 | 
| 23318 | 
            -
             | 
| 23970 | 
            +
                var childView = subContainer.lookup('view:' + normalizedPath) || subContainer.lookup('view:default'),
         | 
| 23971 | 
            +
                    childController = subContainer.lookup('controller:' + normalizedPath),
         | 
| 23972 | 
            +
                    childTemplate = subContainer.lookup('template:' + path);
         | 
| 23319 23973 |  | 
| 23320 | 
            -
              // TODO: Deprecate this, see https://github.com/emberjs/ember.js/issues/1785
         | 
| 23321 | 
            -
              transitionTo: function() {
         | 
| 23322 | 
            -
                return this.transitionToRoute.apply(this, arguments);
         | 
| 23323 | 
            -
              },
         | 
| 23324 23974 |  | 
| 23325 | 
            -
              replaceRoute: function() {
         | 
| 23326 | 
            -
                var target = get(this, 'target');
         | 
| 23327 23975 |  | 
| 23328 | 
            -
                 | 
| 23329 | 
            -
             | 
| 23330 | 
            -
             | 
| 23331 | 
            -
              // TODO: Deprecate this, see https://github.com/emberjs/ember.js/issues/1785
         | 
| 23332 | 
            -
              replaceWith: function() {
         | 
| 23333 | 
            -
                return this.replaceRoute.apply(this, arguments);
         | 
| 23334 | 
            -
              },
         | 
| 23976 | 
            +
                set(childController, 'target', controller);
         | 
| 23977 | 
            +
                set(childController, 'model', model);
         | 
| 23335 23978 |  | 
| 23336 | 
            -
             | 
| 23337 | 
            -
                 | 
| 23338 | 
            -
                return container.lookup('controller:' + controllerName);
         | 
| 23339 | 
            -
              },
         | 
| 23979 | 
            +
                options.hash.template = childTemplate;
         | 
| 23980 | 
            +
                options.hash.controller = childController;
         | 
| 23340 23981 |  | 
| 23341 | 
            -
             | 
| 23342 | 
            -
             | 
| 23343 | 
            -
                   | 
| 23344 | 
            -
             | 
| 23345 | 
            -
                  return get(this, 'content');
         | 
| 23982 | 
            +
                function observer() {
         | 
| 23983 | 
            +
                  var model = Ember.Handlebars.get(this, modelPath, options);
         | 
| 23984 | 
            +
                  set(childController, 'model', model);
         | 
| 23985 | 
            +
                  childView.rerender();
         | 
| 23346 23986 | 
             
                }
         | 
| 23347 | 
            -
              }).property('content'),
         | 
| 23348 23987 |  | 
| 23349 | 
            -
             | 
| 23350 | 
            -
                 | 
| 23351 | 
            -
             | 
| 23352 | 
            -
            });
         | 
| 23988 | 
            +
                Ember.addObserver(this, modelPath, observer);
         | 
| 23989 | 
            +
                childView.one('willDestroyElement', this, function() {
         | 
| 23990 | 
            +
                  Ember.removeObserver(this, modelPath, observer);
         | 
| 23991 | 
            +
                });
         | 
| 23353 23992 |  | 
| 23354 | 
            -
             | 
| 23355 | 
            -
               | 
| 23356 | 
            -
             | 
| 23357 | 
            -
                  dependency, satisfied = true;
         | 
| 23993 | 
            +
                Ember.Handlebars.helpers.view.call(this, childView, options);
         | 
| 23994 | 
            +
              });
         | 
| 23995 | 
            +
            }
         | 
| 23358 23996 |  | 
| 23359 | 
            -
             | 
| 23360 | 
            -
                dependency = needs[i];
         | 
| 23361 | 
            -
                if (dependency.indexOf(':') === -1) {
         | 
| 23362 | 
            -
                  dependency = "controller:" + dependency;
         | 
| 23363 | 
            -
                }
         | 
| 23997 | 
            +
            })();
         | 
| 23364 23998 |  | 
| 23365 | 
            -
                if (!container.has(dependency)) {
         | 
| 23366 | 
            -
                  satisfied = false;
         | 
| 23367 23999 |  | 
| 23368 | 
            -
                }
         | 
| 23369 | 
            -
              }
         | 
| 23370 24000 |  | 
| 23371 | 
            -
             | 
| 23372 | 
            -
             | 
| 24001 | 
            +
            (function() {
         | 
| 24002 | 
            +
             | 
| 24003 | 
            +
            })();
         | 
| 24004 | 
            +
             | 
| 24005 | 
            +
             | 
| 24006 | 
            +
             | 
| 24007 | 
            +
            (function() {
         | 
| 24008 | 
            +
            /**
         | 
| 24009 | 
            +
            @module ember
         | 
| 24010 | 
            +
            @submodule ember-routing
         | 
| 24011 | 
            +
            */
         | 
| 24012 | 
            +
             | 
| 24013 | 
            +
            var get = Ember.get, set = Ember.set;
         | 
| 24014 | 
            +
             | 
| 24015 | 
            +
            Ember.ControllerMixin.reopen({
         | 
| 24016 | 
            +
              transitionToRoute: function() {
         | 
| 24017 | 
            +
                // target may be either another controller or a router
         | 
| 24018 | 
            +
                var target = get(this, 'target'),
         | 
| 24019 | 
            +
                    method = target.transitionToRoute || target.transitionTo;
         | 
| 24020 | 
            +
                return method.apply(target, arguments);
         | 
| 24021 | 
            +
              },
         | 
| 24022 | 
            +
             | 
| 24023 | 
            +
              transitionTo: function() {
         | 
| 24024 | 
            +
             | 
| 24025 | 
            +
                return this.transitionToRoute.apply(this, arguments);
         | 
| 24026 | 
            +
              },
         | 
| 24027 | 
            +
             | 
| 24028 | 
            +
              replaceRoute: function() {
         | 
| 24029 | 
            +
                // target may be either another controller or a router
         | 
| 24030 | 
            +
                var target = get(this, 'target'),
         | 
| 24031 | 
            +
                    method = target.replaceRoute || target.replaceWith;
         | 
| 24032 | 
            +
                return method.apply(target, arguments);
         | 
| 24033 | 
            +
              },
         | 
| 24034 | 
            +
             | 
| 24035 | 
            +
              replaceWith: function() {
         | 
| 24036 | 
            +
             | 
| 24037 | 
            +
                return this.replaceRoute.apply(this, arguments);
         | 
| 24038 | 
            +
              }
         | 
| 24039 | 
            +
            });
         | 
| 23373 24040 |  | 
| 23374 24041 | 
             
            })();
         | 
| 23375 24042 |  | 
| @@ -23506,7 +24173,12 @@ Ember.NoneLocation = Ember.Object.extend({ | |
| 23506 24173 | 
             
              },
         | 
| 23507 24174 |  | 
| 23508 24175 | 
             
              onUpdateURL: function(callback) {
         | 
| 23509 | 
            -
                 | 
| 24176 | 
            +
                this.updateCallback = callback;
         | 
| 24177 | 
            +
              },
         | 
| 24178 | 
            +
             | 
| 24179 | 
            +
              handleURL: function(url) {
         | 
| 24180 | 
            +
                set(this, 'path', url);
         | 
| 24181 | 
            +
                this.updateCallback(url);
         | 
| 23510 24182 | 
             
              },
         | 
| 23511 24183 |  | 
| 23512 24184 | 
             
              formatURL: function(url) {
         | 
| @@ -23587,12 +24259,14 @@ Ember.HashLocation = Ember.Object.extend({ | |
| 23587 24259 | 
             
                var guid = Ember.guidFor(this);
         | 
| 23588 24260 |  | 
| 23589 24261 | 
             
                Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
         | 
| 23590 | 
            -
                   | 
| 23591 | 
            -
             | 
| 24262 | 
            +
                  Ember.run(function() {
         | 
| 24263 | 
            +
                    var path = location.hash.substr(1);
         | 
| 24264 | 
            +
                    if (get(self, 'lastSetURL') === path) { return; }
         | 
| 23592 24265 |  | 
| 23593 | 
            -
             | 
| 24266 | 
            +
                    set(self, 'lastSetURL', null);
         | 
| 23594 24267 |  | 
| 23595 | 
            -
             | 
| 24268 | 
            +
                    callback(location.hash.substr(1));
         | 
| 24269 | 
            +
                  });
         | 
| 23596 24270 | 
             
                });
         | 
| 23597 24271 | 
             
              },
         | 
| 23598 24272 |  | 
| @@ -23657,7 +24331,7 @@ Ember.HistoryLocation = Ember.Object.extend({ | |
| 23657 24331 | 
             
                @method initState
         | 
| 23658 24332 | 
             
              */
         | 
| 23659 24333 | 
             
              initState: function() {
         | 
| 23660 | 
            -
                this.replaceState( | 
| 24334 | 
            +
                this.replaceState(this.formatURL(this.getURL()));
         | 
| 23661 24335 | 
             
                set(this, 'history', window.history);
         | 
| 23662 24336 | 
             
              },
         | 
| 23663 24337 |  | 
| @@ -23672,12 +24346,18 @@ Ember.HistoryLocation = Ember.Object.extend({ | |
| 23672 24346 | 
             
              /**
         | 
| 23673 24347 | 
             
                @private
         | 
| 23674 24348 |  | 
| 23675 | 
            -
                Returns the current `location.pathname | 
| 24349 | 
            +
                Returns the current `location.pathname` without rootURL
         | 
| 23676 24350 |  | 
| 23677 24351 | 
             
                @method getURL
         | 
| 23678 24352 | 
             
              */
         | 
| 23679 24353 | 
             
              getURL: function() {
         | 
| 23680 | 
            -
                 | 
| 24354 | 
            +
                var rootURL = get(this, 'rootURL'),
         | 
| 24355 | 
            +
                    url = get(this, 'location').pathname;
         | 
| 24356 | 
            +
             | 
| 24357 | 
            +
                rootURL = rootURL.replace(/\/$/, '');
         | 
| 24358 | 
            +
                url = url.replace(rootURL, '');
         | 
| 24359 | 
            +
             | 
| 24360 | 
            +
                return url;
         | 
| 23681 24361 | 
             
              },
         | 
| 23682 24362 |  | 
| 23683 24363 | 
             
              /**
         | 
| @@ -23760,13 +24440,14 @@ Ember.HistoryLocation = Ember.Object.extend({ | |
| 23760 24440 | 
             
                @param callback {Function}
         | 
| 23761 24441 | 
             
              */
         | 
| 23762 24442 | 
             
              onUpdateURL: function(callback) {
         | 
| 23763 | 
            -
                var guid = Ember.guidFor(this) | 
| 24443 | 
            +
                var guid = Ember.guidFor(this),
         | 
| 24444 | 
            +
                    self = this;
         | 
| 23764 24445 |  | 
| 23765 24446 | 
             
                Ember.$(window).bind('popstate.ember-location-'+guid, function(e) {
         | 
| 23766 24447 | 
             
                  if(!popstateReady) {
         | 
| 23767 24448 | 
             
                    return;
         | 
| 23768 24449 | 
             
                  }
         | 
| 23769 | 
            -
                  callback( | 
| 24450 | 
            +
                  callback(self.getURL());
         | 
| 23770 24451 | 
             
                });
         | 
| 23771 24452 | 
             
              },
         | 
| 23772 24453 |  | 
| @@ -24028,68 +24709,32 @@ var get = Ember.get, set = Ember.set, | |
| 24028 24709 | 
             
              layer, and a list of the event listeners that are setup by default, visit the
         | 
| 24029 24710 | 
             
              [Ember View Layer guide](http://emberjs.com/guides/view_layer#toc_event-delegation).
         | 
| 24030 24711 |  | 
| 24031 | 
            -
              ###  | 
| 24712 | 
            +
              ### Initializers
         | 
| 24032 24713 |  | 
| 24033 | 
            -
               | 
| 24034 | 
            -
              *classes*, not *instances*. When your application loads, all of the instances
         | 
| 24035 | 
            -
              are created for you. Creating these instances is the responsibility of
         | 
| 24036 | 
            -
              `Ember.Application`.
         | 
| 24037 | 
            -
             | 
| 24038 | 
            -
              When the `Ember.Application` initializes, it will look for an `Ember.Router`
         | 
| 24039 | 
            -
              class defined on the applications's `Router` property, like this:
         | 
| 24714 | 
            +
              Libraries on top of Ember can register additional initializers, like so:
         | 
| 24040 24715 |  | 
| 24041 24716 | 
             
              ```javascript
         | 
| 24042 | 
            -
               | 
| 24043 | 
            -
             | 
| 24044 | 
            -
              });
         | 
| 24045 | 
            -
              ```
         | 
| 24046 | 
            -
             | 
| 24047 | 
            -
              If found, the router is instantiated and saved on the application's `router`
         | 
| 24048 | 
            -
              property (note the lowercase 'r'). While you should *not* reference this
         | 
| 24049 | 
            -
              router instance directly from your application code, having access to
         | 
| 24050 | 
            -
              `App.router` from the console can be useful during debugging.
         | 
| 24051 | 
            -
             | 
| 24052 | 
            -
              After the router is created, the application loops through all of the
         | 
| 24053 | 
            -
              registered _injections_ and invokes them once for each property on the
         | 
| 24054 | 
            -
              `Ember.Application` object.
         | 
| 24055 | 
            -
             | 
| 24056 | 
            -
              An injection is a function that is responsible for instantiating objects from
         | 
| 24057 | 
            -
              classes defined on the application. By default, the only injection registered
         | 
| 24058 | 
            -
              instantiates controllers and makes them available on the router.
         | 
| 24717 | 
            +
              Ember.Application.initializer({
         | 
| 24718 | 
            +
                name: "store",
         | 
| 24059 24719 |  | 
| 24060 | 
            -
             | 
| 24061 | 
            -
             | 
| 24062 | 
            -
             | 
| 24063 | 
            -
              App.MyController = Ember.Controller.extend({
         | 
| 24064 | 
            -
                // ...
         | 
| 24720 | 
            +
                initialize: function(container, application) {
         | 
| 24721 | 
            +
                  container.register('store', 'main', application.Store);
         | 
| 24722 | 
            +
                }
         | 
| 24065 24723 | 
             
              });
         | 
| 24066 24724 | 
             
              ```
         | 
| 24067 24725 |  | 
| 24068 | 
            -
               | 
| 24069 | 
            -
              `myController` property.
         | 
| 24726 | 
            +
              ### Routing
         | 
| 24070 24727 |  | 
| 24071 | 
            -
               | 
| 24072 | 
            -
               | 
| 24073 | 
            -
               | 
| 24728 | 
            +
              In addition to creating your application's router, `Ember.Application` is
         | 
| 24729 | 
            +
              also responsible for telling the router when to start routing. Transitions
         | 
| 24730 | 
            +
              between routes can be logged with the LOG_TRANSITIONS flag:
         | 
| 24074 24731 |  | 
| 24075 24732 | 
             
              ```javascript
         | 
| 24076 | 
            -
              Ember.Application. | 
| 24077 | 
            -
                 | 
| 24078 | 
            -
                before: 'controllers',
         | 
| 24079 | 
            -
             | 
| 24080 | 
            -
                injection: function(app, router, property) {
         | 
| 24081 | 
            -
                  if (property === 'Store') {
         | 
| 24082 | 
            -
                    set(router, 'store', app[property].create());
         | 
| 24083 | 
            -
                  }
         | 
| 24084 | 
            -
                }
         | 
| 24733 | 
            +
              window.App = Ember.Application.create({
         | 
| 24734 | 
            +
                LOG_TRANSITIONS: true
         | 
| 24085 24735 | 
             
              });
         | 
| 24086 24736 | 
             
              ```
         | 
| 24087 24737 |  | 
| 24088 | 
            -
              ### Routing
         | 
| 24089 | 
            -
             | 
| 24090 | 
            -
              In addition to creating your application's router, `Ember.Application` is
         | 
| 24091 | 
            -
              also responsible for telling the router when to start routing.
         | 
| 24092 | 
            -
             | 
| 24093 24738 | 
             
              By default, the router will begin trying to translate the current URL into
         | 
| 24094 24739 | 
             
              application state once the browser emits the `DOMContentReady` event. If you
         | 
| 24095 24740 | 
             
              need to defer routing, you can call the application's `deferReadiness()`
         | 
| @@ -24097,14 +24742,7 @@ var get = Ember.get, set = Ember.set, | |
| 24097 24742 |  | 
| 24098 24743 | 
             
              If there is any setup required before routing begins, you can implement a
         | 
| 24099 24744 | 
             
              `ready()` method on your app that will be invoked immediately before routing
         | 
| 24100 | 
            -
              begins | 
| 24101 | 
            -
             | 
| 24102 | 
            -
              ```javascript
         | 
| 24103 | 
            -
              window.App = Ember.Application.create({
         | 
| 24104 | 
            -
                ready: function() {
         | 
| 24105 | 
            -
                  this.set('router.enableLogging', true);
         | 
| 24106 | 
            -
                }
         | 
| 24107 | 
            -
              });
         | 
| 24745 | 
            +
              begins.
         | 
| 24108 24746 |  | 
| 24109 24747 | 
             
              To begin routing, you must have at a minimum a top-level controller and view.
         | 
| 24110 24748 | 
             
              You define these as `App.ApplicationController` and `App.ApplicationView`,
         | 
| @@ -24122,8 +24760,7 @@ var get = Ember.get, set = Ember.set, | |
| 24122 24760 | 
             
              @namespace Ember
         | 
| 24123 24761 | 
             
              @extends Ember.Namespace
         | 
| 24124 24762 | 
             
            */
         | 
| 24125 | 
            -
            var Application = Ember.Application = Ember.Namespace.extend(
         | 
| 24126 | 
            -
            /** @scope Ember.Application.prototype */{
         | 
| 24763 | 
            +
            var Application = Ember.Application = Ember.Namespace.extend({
         | 
| 24127 24764 |  | 
| 24128 24765 | 
             
              /**
         | 
| 24129 24766 | 
             
                The root DOM element of the Application. This can be specified as an
         | 
| @@ -24202,6 +24839,11 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24202 24839 |  | 
| 24203 24840 | 
             
                this.deferUntilDOMReady();
         | 
| 24204 24841 | 
             
                this.scheduleInitialize();
         | 
| 24842 | 
            +
             | 
| 24843 | 
            +
             | 
| 24844 | 
            +
             | 
| 24845 | 
            +
             | 
| 24846 | 
            +
             | 
| 24205 24847 | 
             
              },
         | 
| 24206 24848 |  | 
| 24207 24849 | 
             
              /**
         | 
| @@ -24333,9 +24975,52 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24333 24975 | 
             
                }
         | 
| 24334 24976 | 
             
              },
         | 
| 24335 24977 |  | 
| 24978 | 
            +
              /**
         | 
| 24979 | 
            +
                registers a factory for later injection
         | 
| 24980 | 
            +
             | 
| 24981 | 
            +
                Example:
         | 
| 24982 | 
            +
             | 
| 24983 | 
            +
                ```javascript
         | 
| 24984 | 
            +
                App = Ember.Application.create();
         | 
| 24985 | 
            +
             | 
| 24986 | 
            +
                App.Person = Ember.Object.extend({});
         | 
| 24987 | 
            +
                App.Orange = Ember.Object.extend({});
         | 
| 24988 | 
            +
                App.Email  = Ember.Object.extend({});
         | 
| 24989 | 
            +
             | 
| 24990 | 
            +
                App.register('model:user', App.Person, {singleton: false });
         | 
| 24991 | 
            +
                App.register('fruit:favorite', App.Orange);
         | 
| 24992 | 
            +
                App.register('communication:main', App.Email, {singleton: false});
         | 
| 24993 | 
            +
                ```
         | 
| 24994 | 
            +
             | 
| 24995 | 
            +
                @method register
         | 
| 24996 | 
            +
                @param  type {String}
         | 
| 24997 | 
            +
                @param  name {String}
         | 
| 24998 | 
            +
                @param  factory {String}
         | 
| 24999 | 
            +
                @param  options {String} (optional)
         | 
| 25000 | 
            +
              **/
         | 
| 24336 25001 | 
             
              register: function() {
         | 
| 24337 25002 | 
             
                var container = this.__container__;
         | 
| 24338 | 
            -
                 | 
| 25003 | 
            +
                container.register.apply(container, arguments);
         | 
| 25004 | 
            +
              },
         | 
| 25005 | 
            +
              /**
         | 
| 25006 | 
            +
                defines an injection or typeInjection
         | 
| 25007 | 
            +
             | 
| 25008 | 
            +
                Example:
         | 
| 25009 | 
            +
             | 
| 25010 | 
            +
                ```javascript
         | 
| 25011 | 
            +
                App.inject(<full_name or type>, <property name>, <full_name>)
         | 
| 25012 | 
            +
                App.inject('model:user', 'email', 'model:email')
         | 
| 25013 | 
            +
                App.inject('model', 'source', 'source:main')
         | 
| 25014 | 
            +
                ```
         | 
| 25015 | 
            +
             | 
| 25016 | 
            +
                @method inject
         | 
| 25017 | 
            +
                @param  factoryNameOrType {String}
         | 
| 25018 | 
            +
                @param  property {String}
         | 
| 25019 | 
            +
                @param  injectionName {String}
         | 
| 25020 | 
            +
              **/
         | 
| 25021 | 
            +
              inject: function(){
         | 
| 25022 | 
            +
                var container = this.__container__;
         | 
| 25023 | 
            +
                container.injection.apply(container, arguments);
         | 
| 24339 25024 | 
             
              },
         | 
| 24340 25025 |  | 
| 24341 25026 | 
             
              /**
         | 
| @@ -24343,7 +25028,7 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24343 25028 |  | 
| 24344 25029 | 
             
                Initialize the application. This happens automatically.
         | 
| 24345 25030 |  | 
| 24346 | 
            -
                Run any  | 
| 25031 | 
            +
                Run any initializers and run the application load hook. These hooks may
         | 
| 24347 25032 | 
             
                choose to defer readiness. For example, an authentication hook might want
         | 
| 24348 25033 | 
             
                to defer readiness until the auth token has been retrieved.
         | 
| 24349 25034 |  | 
| @@ -24357,13 +25042,10 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24357 25042 | 
             
                // At this point, the App.Router must already be assigned
         | 
| 24358 25043 | 
             
                this.__container__.register('router', 'main', this.Router);
         | 
| 24359 25044 |  | 
| 24360 | 
            -
                // Run any injections and run the application load hook. These hooks may
         | 
| 24361 | 
            -
                // choose to defer readiness. For example, an authentication hook might want
         | 
| 24362 | 
            -
                // to defer readiness until the auth token has been retrieved.
         | 
| 24363 25045 | 
             
                this.runInitializers();
         | 
| 24364 25046 | 
             
                Ember.runLoadHooks('application', this);
         | 
| 24365 25047 |  | 
| 24366 | 
            -
                // At this point, any  | 
| 25048 | 
            +
                // At this point, any initializers or load hooks that would have wanted
         | 
| 24367 25049 | 
             
                // to defer readiness have fired. In general, advancing readiness here
         | 
| 24368 25050 | 
             
                // will proceed to didBecomeReady.
         | 
| 24369 25051 | 
             
                this.advanceReadiness();
         | 
| @@ -24371,6 +25053,15 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24371 25053 | 
             
                return this;
         | 
| 24372 25054 | 
             
              },
         | 
| 24373 25055 |  | 
| 25056 | 
            +
              reset: function() {
         | 
| 25057 | 
            +
                get(this, '__container__').destroy();
         | 
| 25058 | 
            +
                this.buildContainer();
         | 
| 25059 | 
            +
             | 
| 25060 | 
            +
                this.isInitialized = false;
         | 
| 25061 | 
            +
                this.initialize();
         | 
| 25062 | 
            +
                this.startRouting();
         | 
| 25063 | 
            +
              },
         | 
| 25064 | 
            +
             | 
| 24374 25065 | 
             
              /**
         | 
| 24375 25066 | 
             
                @private
         | 
| 24376 25067 | 
             
                @method runInitializers
         | 
| @@ -24458,6 +25149,12 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24458 25149 | 
             
                router.startRouting();
         | 
| 24459 25150 | 
             
              },
         | 
| 24460 25151 |  | 
| 25152 | 
            +
              handleURL: function(url) {
         | 
| 25153 | 
            +
                var router = this.__container__.lookup('router:main');
         | 
| 25154 | 
            +
             | 
| 25155 | 
            +
                router.handleURL(url);
         | 
| 25156 | 
            +
              },
         | 
| 25157 | 
            +
             | 
| 24461 25158 | 
             
              /**
         | 
| 24462 25159 | 
             
                Called when the Application has become ready.
         | 
| 24463 25160 | 
             
                The call will be delayed until the DOM has become ready.
         | 
| @@ -24472,7 +25169,7 @@ var Application = Ember.Application = Ember.Namespace.extend( | |
| 24472 25169 | 
             
                var eventDispatcher = get(this, 'eventDispatcher');
         | 
| 24473 25170 | 
             
                if (eventDispatcher) { eventDispatcher.destroy(); }
         | 
| 24474 25171 |  | 
| 24475 | 
            -
                this | 
| 25172 | 
            +
                get(this, '__container__').destroy();
         | 
| 24476 25173 | 
             
              },
         | 
| 24477 25174 |  | 
| 24478 25175 | 
             
              initializer: function(options) {
         | 
| @@ -24520,7 +25217,7 @@ Ember.Application.reopenClass({ | |
| 24520 25217 | 
             
              */
         | 
| 24521 25218 | 
             
              buildContainer: function(namespace) {
         | 
| 24522 25219 | 
             
                var container = new Ember.Container();
         | 
| 24523 | 
            -
                Ember.Container.defaultContainer = container;
         | 
| 25220 | 
            +
                Ember.Container.defaultContainer = Ember.Container.defaultContainer || container;
         | 
| 24524 25221 |  | 
| 24525 25222 | 
             
                container.set = Ember.set;
         | 
| 24526 25223 | 
             
                container.resolver = resolverFor(namespace);
         | 
| @@ -24595,6 +25292,85 @@ Ember.runLoadHooks('Ember.Application', Ember.Application); | |
| 24595 25292 |  | 
| 24596 25293 |  | 
| 24597 25294 |  | 
| 25295 | 
            +
            (function() {
         | 
| 25296 | 
            +
            /**
         | 
| 25297 | 
            +
            @module ember
         | 
| 25298 | 
            +
            @submodule ember-routing
         | 
| 25299 | 
            +
            */
         | 
| 25300 | 
            +
             | 
| 25301 | 
            +
            var get = Ember.get, set = Ember.set;
         | 
| 25302 | 
            +
            var ControllersProxy = Ember.Object.extend({
         | 
| 25303 | 
            +
              controller: null,
         | 
| 25304 | 
            +
             | 
| 25305 | 
            +
              unknownProperty: function(controllerName) {
         | 
| 25306 | 
            +
                var controller = get(this, 'controller'),
         | 
| 25307 | 
            +
                  needs = get(controller, 'needs'),
         | 
| 25308 | 
            +
                  container = controller.get('container'),
         | 
| 25309 | 
            +
                  dependency;
         | 
| 25310 | 
            +
             | 
| 25311 | 
            +
                for (var i=0, l=needs.length; i<l; i++) {
         | 
| 25312 | 
            +
                  dependency = needs[i];
         | 
| 25313 | 
            +
                  if (dependency === controllerName) {
         | 
| 25314 | 
            +
                    return container.lookup('controller:' + controllerName);
         | 
| 25315 | 
            +
                  }
         | 
| 25316 | 
            +
                }
         | 
| 25317 | 
            +
              }
         | 
| 25318 | 
            +
            });
         | 
| 25319 | 
            +
             | 
| 25320 | 
            +
            function verifyDependencies(controller) {
         | 
| 25321 | 
            +
              var needs = get(controller, 'needs'),
         | 
| 25322 | 
            +
                  container = get(controller, 'container'),
         | 
| 25323 | 
            +
                  dependency, satisfied = true;
         | 
| 25324 | 
            +
             | 
| 25325 | 
            +
              for (var i=0, l=needs.length; i<l; i++) {
         | 
| 25326 | 
            +
                dependency = needs[i];
         | 
| 25327 | 
            +
                if (dependency.indexOf(':') === -1) {
         | 
| 25328 | 
            +
                  dependency = "controller:" + dependency;
         | 
| 25329 | 
            +
                }
         | 
| 25330 | 
            +
             | 
| 25331 | 
            +
                if (!container.has(dependency)) {
         | 
| 25332 | 
            +
                  satisfied = false;
         | 
| 25333 | 
            +
             | 
| 25334 | 
            +
                }
         | 
| 25335 | 
            +
              }
         | 
| 25336 | 
            +
             | 
| 25337 | 
            +
              return satisfied;
         | 
| 25338 | 
            +
            }
         | 
| 25339 | 
            +
             | 
| 25340 | 
            +
            Ember.ControllerMixin.reopen({
         | 
| 25341 | 
            +
              concatenatedProperties: ['needs'],
         | 
| 25342 | 
            +
              needs: [],
         | 
| 25343 | 
            +
             | 
| 25344 | 
            +
              init: function() {
         | 
| 25345 | 
            +
                this._super.apply(this, arguments);
         | 
| 25346 | 
            +
             | 
| 25347 | 
            +
                // Structure asserts to still do verification but not string concat in production
         | 
| 25348 | 
            +
                if(!verifyDependencies(this)) {
         | 
| 25349 | 
            +
             | 
| 25350 | 
            +
                }
         | 
| 25351 | 
            +
              },
         | 
| 25352 | 
            +
             | 
| 25353 | 
            +
              controllerFor: function(controllerName) {
         | 
| 25354 | 
            +
             | 
| 25355 | 
            +
                var container = get(this, 'container');
         | 
| 25356 | 
            +
                return container.lookup('controller:' + controllerName);
         | 
| 25357 | 
            +
              },
         | 
| 25358 | 
            +
             | 
| 25359 | 
            +
              controllers: Ember.computed(function() {
         | 
| 25360 | 
            +
                return ControllersProxy.create({ controller: this });
         | 
| 25361 | 
            +
              })
         | 
| 25362 | 
            +
            });
         | 
| 25363 | 
            +
             | 
| 25364 | 
            +
            })();
         | 
| 25365 | 
            +
             | 
| 25366 | 
            +
             | 
| 25367 | 
            +
             | 
| 25368 | 
            +
            (function() {
         | 
| 25369 | 
            +
             | 
| 25370 | 
            +
            })();
         | 
| 25371 | 
            +
             | 
| 25372 | 
            +
             | 
| 25373 | 
            +
             | 
| 24598 25374 | 
             
            (function() {
         | 
| 24599 25375 | 
             
            /**
         | 
| 24600 25376 | 
             
            Ember Application
         | 
| @@ -25563,9 +26339,7 @@ Ember.StateManager = Ember.State.extend({ | |
| 25563 26339 | 
             
               @property currentPath
         | 
| 25564 26340 | 
             
               @type String
         | 
| 25565 26341 | 
             
              */
         | 
| 25566 | 
            -
              currentPath: Ember.computed('currentState', | 
| 25567 | 
            -
                return get(this, 'currentState.path');
         | 
| 25568 | 
            -
              }),
         | 
| 26342 | 
            +
              currentPath: Ember.computed.alias('currentState.path'),
         | 
| 25569 26343 |  | 
| 25570 26344 | 
             
              /**
         | 
| 25571 26345 | 
             
                The name of transitionEvent that this stateManager will dispatch
         |