| 
					
				 | 
			
			
				@@ -191,29 +191,29 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var methods = [], checker = Object.create(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.selectors = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.get = function (string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var index = this.selectors.indexOf(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.get = function (stSelector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var index = this.selectors.indexOf(stSelector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if(index !== -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return methods[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			this.selectors.push(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var selector = st.selector(string); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			checker[selector] = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var method = {jsSelector: selector, fn: createHandler(selector)}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.selectors.push(stSelector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var jsSelector = st.selector(stSelector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			checker[jsSelector] = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var method = {jsSelector: jsSelector, fn: createHandler(stSelector)}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			methods.push(method); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			manip.installMethod(method, rootAsClass); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return method; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		this.isSelector = function (selector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return checker[selector]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.isSelector = function (jsSelector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return checker[jsSelector]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Dnu handler method */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		function createHandler(selector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		function createHandler(stSelector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return function() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return brikz.messageSend.messageNotUnderstood(this, selector, arguments); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return brikz.messageSend.messageNotUnderstood(this, stSelector, arguments); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -987,43 +987,44 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		/* Handles unhandled errors during message sends */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// simply send the message and handle #dnu: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		st.send = function(receiver, selector, args, klass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		st.send = function(receiver, jsSelector, args, klass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			var method; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if(receiver === null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				receiver = nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			method = klass ? klass.fn.prototype[selector] : receiver.klass && receiver[selector]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			method = klass ? klass.fn.prototype[jsSelector] : receiver.klass && receiver[jsSelector]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if(method) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return method.apply(receiver, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return messageNotUnderstood(receiver, selector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return messageNotUnderstood(receiver, st.convertSelector(jsSelector), args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/* Handles #dnu: *and* JavaScript method calls. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 if the receiver has no klass, we consider it a JS object (outside of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 Amber system). Else assume that the receiver understands #doesNotUnderstand: */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		function messageNotUnderstood(receiver, selector, args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			/* Handles JS method calls. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if(receiver.klass === undefined || receiver.allowJavaScriptCalls) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return callJavaScriptMethod(receiver, selector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			/* Handles not understood messages. Also see the Amber counter-part 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			 Object>>doesNotUnderstand: */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		function invokeDnuMethod(receiver, stSelector, args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return receiver._doesNotUnderstand_( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				globals.Message._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					._selector_(st.convertSelector(selector)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					._selector_(stSelector) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					._arguments_([].slice.call(args)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/* Call a method of a JS object, or answer a property if it exists. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 Else try wrapping a JSObjectProxy around the receiver. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* Handles #dnu: *and* JavaScript method calls. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 if the receiver has no klass, we consider it a JS object (outside of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 Amber system). Else assume that the receiver understands #doesNotUnderstand: */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		function messageNotUnderstood(receiver, stSelector, args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (receiver.klass !== undefined && !receiver.allowJavaScriptCalls) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return invokeDnuMethod(receiver, stSelector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/* Call a method of a JS object, or answer a property if it exists. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 Else try wrapping a JSObjectProxy around the receiver. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var propertyName = st.st2prop(stSelector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (!(propertyName in receiver)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return invokeDnuMethod(globals.JSObjectProxy._on_(receiver), stSelector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return accessJavaScript(receiver, propertyName, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 If the object property is a function, then call it, except if it starts with 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* If the object property is a function, then call it, except if it starts with 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 an uppercase character (we probably want to answer the function itself in this 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 case and send it #new from Amber). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1032,24 +1033,19 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 Example: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 "self do: aBlock with: anObject" -> "self.do(aBlock, anObject)" */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		function callJavaScriptMethod(receiver, selector, args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			var jsSelector = st.st2prop(selector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if (jsSelector in receiver) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				var jsProperty = receiver[jsSelector]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if (typeof jsProperty === "function" && !/^[A-Z]/.test(jsSelector)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return jsProperty.apply(receiver, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} else if (args.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					receiver[jsSelector] = args[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return jsProperty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		function accessJavaScript(receiver, propertyName, args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var propertyValue = receiver[propertyName]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (typeof propertyValue === "function" && !/^[A-Z]/.test(propertyName)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return propertyValue.apply(receiver, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else if (args.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				receiver[propertyName] = args[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return nil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return propertyValue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return st.send(globals.JSObjectProxy._on_(receiver), selector, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		st.accessJavaScript = accessJavaScript; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.messageNotUnderstood = messageNotUnderstood; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1110,7 +1106,6 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         st.st2prop = function (stSelector) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (stSelector[0] === '_') return ''; // TODO revert when #1062 root cause fixed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var colonPosition = stSelector.indexOf(':'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return colonPosition === -1 ? stSelector : stSelector.slice(0, colonPosition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 |