|  | @@ -195,13 +195,12 @@ function Smalltalk(){
 | 
											
												
													
														|  |  	if(typeof receiver === "undefined") {
 |  |  	if(typeof receiver === "undefined") {
 | 
											
												
													
														|  |  	    receiver = nil;
 |  |  	    receiver = nil;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	var klass = klass || receiver.klass;
 |  | 
 | 
											
												
													
														|  | -	if(!klass) { return messageNotUnderstood(receiver, selector, args) };
 |  | 
 | 
											
												
													
														|  | -	var method = klass.fn.prototype[selector];
 |  | 
 | 
											
												
													
														|  | -	if(!method) {
 |  | 
 | 
											
												
													
														|  | -	    return messageNotUnderstood(receiver, selector, args);
 |  | 
 | 
											
												
													
														|  | 
 |  | +	if(!klass && receiver.klass && receiver[selector]) {
 | 
											
												
													
														|  | 
 |  | +	    return receiver[selector].apply(receiver, args);
 | 
											
												
													
														|  | 
 |  | +	} else if(klass && klass.fn.prototype[selector]) {
 | 
											
												
													
														|  | 
 |  | +	    return klass.fn.prototype[selector].apply(receiver, args)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	return method.apply(receiver, args);
 |  | 
 | 
											
												
													
														|  | 
 |  | +	return messageNotUnderstood(receiver, selector, args);
 | 
											
												
													
														|  |      };
 |  |      };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      /* Handles #dnu: *and* JavaScript method calls.
 |  |      /* Handles #dnu: *and* JavaScript method calls.
 | 
											
										
											
												
													
														|  | @@ -209,27 +208,13 @@ function Smalltalk(){
 | 
											
												
													
														|  |         Jtalk system). Else assume that the receiver understands #doesNotUnderstand: */
 |  |         Jtalk system). Else assume that the receiver understands #doesNotUnderstand: */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      function messageNotUnderstood(receiver, selector, args) {
 |  |      function messageNotUnderstood(receiver, selector, args) {
 | 
											
												
													
														|  | -	/* Handles JS method calls. Assumes that a single array or single argument was passed from Jtalk.
 |  | 
 | 
											
												
													
														|  | -	   Example: someJSObject foo: #(1 2 3) -> someJSObject.foo(1,2,3); */
 |  | 
 | 
											
												
													
														|  | -	var jsSelector = selector.replace(/_/g, '');
 |  | 
 | 
											
												
													
														|  | -	var jsProperty = receiver[jsSelector];
 |  | 
 | 
											
												
													
														|  | -	var jsArguments;
 |  | 
 | 
											
												
													
														|  | 
 |  | +	/* Handles JS method calls. */
 | 
											
												
													
														|  |  	if(receiver.klass === undefined) {
 |  |  	if(receiver.klass === undefined) {
 | 
											
												
													
														|  | -	    if(typeof jsProperty === "function") {
 |  | 
 | 
											
												
													
														|  | -		if(args[0] && args[0].constructor === Array) {
 |  | 
 | 
											
												
													
														|  | -		    jsArguments = args[0]
 |  | 
 | 
											
												
													
														|  | -		} else {
 |  | 
 | 
											
												
													
														|  | -		    jsArguments = [args[0]]
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  | -		return jsProperty.apply(receiver, jsArguments);
 |  | 
 | 
											
												
													
														|  | -	    } else if(jsProperty !== undefined) {
 |  | 
 | 
											
												
													
														|  | -		return jsProperty
 |  | 
 | 
											
												
													
														|  | -	    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +	    return callJavaScriptMethod(receiver, selector, args);
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	/* Handles not understood messages. Also see the Jtalk counter-part 
 |  |  	/* Handles not understood messages. Also see the Jtalk counter-part 
 | 
											
												
													
														|  |  	   Object>>doesNotUnderstand: */
 |  |  	   Object>>doesNotUnderstand: */
 | 
											
												
													
														|  | -	if(!receiver.klass) {throw(receiver + ' is not a Jtalk object and ' + jsSelector + ' is undefined')}
 |  | 
 | 
											
												
													
														|  |  	
 |  |  	
 | 
											
												
													
														|  |  	return receiver._doesNotUnderstand_(
 |  |  	return receiver._doesNotUnderstand_(
 | 
											
												
													
														|  |  	    st.Message._new()
 |  |  	    st.Message._new()
 | 
											
										
											
												
													
														|  | @@ -238,6 +223,27 @@ function Smalltalk(){
 | 
											
												
													
														|  |  	);
 |  |  	);
 | 
											
												
													
														|  |      };
 |  |      };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    function callJavaScriptMethod(receiver, selector, args) {
 | 
											
												
													
														|  | 
 |  | +	/* Call a method of a JS object, or answer a property.
 | 
											
												
													
														|  | 
 |  | + 
 | 
											
												
													
														|  | 
 |  | +	   Converts keyword-based selectors by using the first
 | 
											
												
													
														|  | 
 |  | +	   keyword only, but keeping all message arguments.
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	   Example:
 | 
											
												
													
														|  | 
 |  | +	   "self do: aBlock with: anObjec"t -> "self.do(aBlock, anObject)" */
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	var jsSelector = selector.replace(/^_/, '').replace(/_.*/g, '');
 | 
											
												
													
														|  | 
 |  | +	var jsProperty = receiver[jsSelector];
 | 
											
												
													
														|  | 
 |  | +	if(typeof jsProperty === "function") {
 | 
											
												
													
														|  | 
 |  | +	    return jsProperty.apply(receiver, args);
 | 
											
												
													
														|  | 
 |  | +	} else if(jsProperty !== undefined) {
 | 
											
												
													
														|  | 
 |  | +	    return jsProperty
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	throw(receiver + ' is not a Jtalk object and ' + jsSelector + ' is undefined')
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      /* Convert a string to a valid smalltalk selector.
 |  |      /* Convert a string to a valid smalltalk selector.
 | 
											
												
													
														|  |         if you modify the following functions, also change String>>asSelector
 |  |         if you modify the following functions, also change String>>asSelector
 | 
											
												
													
														|  |         accordingly */
 |  |         accordingly */
 |