|  | @@ -1490,6 +1490,22 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.Package);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_sortedClasses'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('sortedClasses'),
 | 
	
		
			
				|  |  | +category: 'classes',
 | 
	
		
			
				|  |  | +fn: function (){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.send(smalltalk.send(self, "_classes", []), "_inject_into_", [[], (function(acc, each){return ((($receiver = smalltalk.send(acc, "_isEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);})(acc);})() : (function(){return ((($receiver = smalltalk.send(acc, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);})(acc);})() : (function(){return smalltalk.send([each], "__comma", [acc]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);})(acc);}), (function(){return smalltalk.send([each], "__comma", [acc]);})]));})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);})(acc);}), (function(){return ((($receiver = smalltalk.send(acc, "_includes_", [smalltalk.send(each, "_superclass", [])])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return (function($rec){smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);})(acc);})() : (function(){return smalltalk.send([each], "__comma", [acc]);})()) : smalltalk.send($receiver, "_ifTrue_ifFalse_", [(function(){return (function($rec){smalltalk.send($rec, "_add_", [each]);return smalltalk.send($rec, "_yourself", []);})(acc);}), (function(){return smalltalk.send([each], "__comma", [acc]);})]));})]));})]);
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: [],
 | 
	
		
			
				|  |  | +source: unescape('sortedClasses%0A%09%22Answer%20all%20classes%20in%20the%20receiver%2C%20sorted%20by%20superclass/subclasses%22%0A%09%0A%09%5Eself%20classes%20inject%3A%20%23%28%29%20into%3A%20%5B%3Aacc%20%3Aeach%20%7C%20%0A%09%09acc%20isEmpty%20%0A%09%09%09ifTrue%3A%20%5Bacc%20add%3A%20each%3B%20yourself%5D%0A%09%09%09ifFalse%3A%20%5B%28acc%20includes%3A%20each%20superclass%29%0A%09%09%09%09ifTrue%3A%20%5Bacc%20add%3A%20each%3B%20yourself%5D%0A%09%09%09%09ifFalse%3A%20%5B%7Beach%7D%2C%20acc%5D%5D%5D'),
 | 
	
		
			
				|  |  | +messageSends: ["inject:into:", "classes", "ifTrue:ifFalse:", "isEmpty", "add:", "yourself", "includes:", "superclass", unescape("%2C")],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.Package);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.Package.klass.iVarNames = ['defaultCommitPathJs','defaultCommitPathSt'];
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
	
		
			
				|  | @@ -2159,22 +2175,6 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.Number);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_%5C'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('%5C'),
 | 
	
		
			
				|  |  | -category: '',
 | 
	
		
			
				|  |  | -fn: function (aNumber){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -return self % aNumber;
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: ["aNumber"],
 | 
	
		
			
				|  |  | -source: unescape(''),
 | 
	
		
			
				|  |  | -messageSends: [],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.Number);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  unescape('_to_by_'),
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
	
		
			
				|  | @@ -3472,40 +3472,156 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  smalltalk.UndefinedObject.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel-Objects');
 | 
	
		
			
				|  |  | -smalltalk.Random.comment=unescape('%60Random%60%20is%20a%20random%20number%20generator%20and%20is%20implemented%20as%20a%20trivial%20wrapper%20around%20javascript%20%60Math.random%28%29%60%20and%20is%20used%20like%20this%3A%0A%0A%09Random%20new%20next%0A%0AThis%20will%20return%20a%20float%20x%20where%20x%20%3C%201%20and%20x%20%3E%200.%20If%20you%20want%20a%20random%20integer%20from%201%20to%2010%20you%20can%20use%20%60%23atRandom%60%0A%0A%0910%20atRandom%0A%0A...and%20if%20you%20want%20a%20random%20number%20in%20a%20specific%20interval%20this%20also%20works%3A%0A%0A%09%283%20to%3A%207%29%20atRandom%0A%0A...but%20be%20aware%20that%20%60%23to%3A%60%20does%20not%20create%20an%20Interval%20as%20in%20other%20Smalltalk%20implementations%20but%20in%20fact%20an%20%60Array%60%20of%20numbers%2C%20so%20it%27s%20better%20to%20use%3A%0A%0A%095%20atRandom%20+%202%0A%0ASince%20%60%23atRandom%60%20is%20implemented%20in%20%60SequencableCollection%60%20you%20can%20easy%20pick%20an%20element%20at%20random%3A%0A%0A%09%23%28%27a%27%20%27b%27%20%27c%27%29%20atRandom%0A%0A...or%20perhaps%20a%20letter%20from%20a%20%60String%60%3A%0A%0A%09%27abc%27%20atRandom%0A%0ASince%20Amber%20does%20not%20have%20Characters%20this%20will%20return%20a%20%60String%60%20of%20length%201%20like%20for%20example%20%60%27b%27%60.')
 | 
	
		
			
				|  |  | +smalltalk.addClass('JSObjectProxy', smalltalk.Object, ['jsObject'], 'Kernel-Objects');
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy.comment=unescape('JSObjectProxy%20handles%20sending%20messages%20to%20JavaScript%20object%2C%20therefore%20accessing%20JavaScript%20objects%20from%20Amber%20is%20transparent.%0AJSOjbectProxy%20makes%20intensive%20use%20of%20%60%23doesNotUnderstand%3A%60.%0A%0A%23%23%20Examples%0A%0AJSObjectProxy%20objects%20are%20instanciated%20by%20Amber%20when%20a%20Smalltalk%20message%20is%20sent%20to%20a%20JavaScript%20object.%0A%0A%20%20%20%20window%20alert%3A%20%27hello%20world%27.%0A%20%20%20%20window%20inspect.%0A%20%20%20%20%28window%20jQuery%3A%20%27body%27%29%20append%3A%20%27hello%20world%27%0A%0ASmalltalk%20messages%20sends%20are%20converted%20to%20JavaScript%20function%20calls%20or%20object%20property%20access%20_%28in%20this%20order%29_.%20If%20n%20one%20of%20them%20match%2C%20a%20%60MessageNotUnderstood%60%20error%20will%20be%20thrown.%20%0A%0A%23%23%20Message%20conversion%20rules%0A%0A-%20%60someUser%20name%60%20becomes%20%20%60someUser.name%60%0A-%20%60someUser%20name%3A%20%27John%27%60%20becomes%20%60someUser%20name%20%3D%20%22John%22%60%0A-%20%60console%20log%3A%20%27hello%20world%27%60%20becomes%20%60console.log%28%27hello%20world%27%29%60%0A-%20%60%28window%20jQuery%3A%20%27foo%27%29%20css%3A%20%27background%27%20color%3A%20%27red%27%60%20becomes%20%60window.jQuery%28%27foo%27%29.css%28%27background%27%2C%20%27red%27%29%60%0A%0A__Note%3A__%20For%20keyword-based%20messages%2C%20only%20the%20first%20keyword%20is%20kept%3A%20%60window%20foo%3A%201%20bar%3A%202%60%20is%20equivalent%20to%20%60window%20foo%3A%201%20baz%3A%202%60.')
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_next'),
 | 
	
		
			
				|  |  | +unescape('_jsObject_'),
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('next'),
 | 
	
		
			
				|  |  | +selector: unescape('jsObject%3A'),
 | 
	
		
			
				|  |  | +category: 'accessing',
 | 
	
		
			
				|  |  | +fn: function (aJSObject){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +(self['@jsObject']=aJSObject);
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: ["aJSObject"],
 | 
	
		
			
				|  |  | +source: unescape('jsObject%3A%20aJSObject%0A%09jsObject%20%3A%3D%20aJSObject'),
 | 
	
		
			
				|  |  | +messageSends: [],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_jsObject'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('jsObject'),
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -return Math.random();
 | 
	
		
			
				|  |  | +return self['@jsObject'];
 | 
	
		
			
				|  |  |  return self;},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: unescape('next%0A%09%3Creturn%20Math.random%28%29%3E'),
 | 
	
		
			
				|  |  | +source: unescape('jsObject%0A%09%5EjsObject'),
 | 
	
		
			
				|  |  |  messageSends: [],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.Random);
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_next_'),
 | 
	
		
			
				|  |  | +unescape('_printString'),
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('next%3A'),
 | 
	
		
			
				|  |  | +selector: unescape('printString'),
 | 
	
		
			
				|  |  | +category: 'proxy',
 | 
	
		
			
				|  |  | +fn: function (){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_toString", []);
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: [],
 | 
	
		
			
				|  |  | +source: unescape('printString%0A%09%5Eself%20jsObject%20toString'),
 | 
	
		
			
				|  |  | +messageSends: ["toString", "jsObject"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_inspectOn_'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('inspectOn%3A'),
 | 
	
		
			
				|  |  | +category: 'proxy',
 | 
	
		
			
				|  |  | +fn: function (anInspector){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var variables=nil;
 | 
	
		
			
				|  |  | +(variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 | 
	
		
			
				|  |  | +smalltalk.send(variables, "_at_put_", [unescape("%23self"), smalltalk.send(self, "_jsObject", [])]);
 | 
	
		
			
				|  |  | +smalltalk.send(anInspector, "_setLabel_", [smalltalk.send(self, "_printString", [])]);
 | 
	
		
			
				|  |  | +for(var i in self['@jsObject']) {
 | 
	
		
			
				|  |  | +		variables._at_put_(i, self['@jsObject'][i]);
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +smalltalk.send(anInspector, "_setVariables_", [variables]);
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: ["anInspector"],
 | 
	
		
			
				|  |  | +source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self%20jsObject.%0A%09anInspector%20setLabel%3A%20self%20printString.%0A%09%3Cfor%28var%20i%20in%20self%5B%27@jsObject%27%5D%29%20%7B%0A%09%09variables._at_put_%28i%2C%20self%5B%27@jsObject%27%5D%5Bi%5D%29%3B%0A%09%7D%3E.%0A%09anInspector%20setVariables%3A%20variables'),
 | 
	
		
			
				|  |  | +messageSends: ["new", "at:put:", "jsObject", "setLabel:", "printString", "setVariables:"],
 | 
	
		
			
				|  |  | +referencedClasses: ["Dictionary"]
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_doesNotUnderstand_'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('doesNotUnderstand%3A'),
 | 
	
		
			
				|  |  | +category: 'proxy',
 | 
	
		
			
				|  |  | +fn: function (aMessage){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var obj=nil;
 | 
	
		
			
				|  |  | +var selector=nil;
 | 
	
		
			
				|  |  | +var jsSelector=nil;
 | 
	
		
			
				|  |  | +var arguments=nil;
 | 
	
		
			
				|  |  | +(obj=smalltalk.send(self, "_jsObject", []));
 | 
	
		
			
				|  |  | +(selector=smalltalk.send(aMessage, "_selector", []));
 | 
	
		
			
				|  |  | +(jsSelector=smalltalk.send(selector, "_asJavaScriptSelector", []));
 | 
	
		
			
				|  |  | +(arguments=smalltalk.send(aMessage, "_arguments", []));
 | 
	
		
			
				|  |  | +if(obj[jsSelector] != undefined) {return smalltalk.send(obj, jsSelector, arguments)};
 | 
	
		
			
				|  |  | +smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: ["aMessage"],
 | 
	
		
			
				|  |  | +source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20jsSelector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09jsSelector%20%3A%3D%20selector%20asJavaScriptSelector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5BjsSelector%5D%20%21%3D%20undefined%29%20%7Breturn%20smalltalk.send%28obj%2C%20jsSelector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
 | 
	
		
			
				|  |  | +messageSends: ["jsObject", "selector", "asJavaScriptSelector", "arguments", "doesNotUnderstand:"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_at_'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('at%3A'),
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (anInteger){
 | 
	
		
			
				|  |  | +fn: function (aSymbol){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -return smalltalk.send(smalltalk.send((1), "_to_", [anInteger]), "_collect_", [(function(each){return smalltalk.send(self, "_next", []);})]);
 | 
	
		
			
				|  |  | +var attr=nil;
 | 
	
		
			
				|  |  | +(attr=smalltalk.send(aSymbol, "_asString", []));
 | 
	
		
			
				|  |  | +return self['@jsObject'][attr];
 | 
	
		
			
				|  |  |  return self;},
 | 
	
		
			
				|  |  | -args: ["anInteger"],
 | 
	
		
			
				|  |  | -source: unescape('next%3A%20anInteger%0A%20%20%20%20%5E%281%20to%3A%20anInteger%29%20collect%3A%20%5B%3Aeach%20%7C%20self%20next%5D'),
 | 
	
		
			
				|  |  | -messageSends: ["collect:", "to:", "next"],
 | 
	
		
			
				|  |  | +args: ["aSymbol"],
 | 
	
		
			
				|  |  | +source: unescape('at%3A%20aSymbol%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Creturn%20self%5B%27@jsObject%27%5D%5Battr%5D%3E'),
 | 
	
		
			
				|  |  | +messageSends: ["asString"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.Random);
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_at_put_'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('at%3Aput%3A'),
 | 
	
		
			
				|  |  | +category: 'accessing',
 | 
	
		
			
				|  |  | +fn: function (aSymbol, anObject){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var attr=nil;
 | 
	
		
			
				|  |  | +(attr=smalltalk.send(aSymbol, "_asString", []));
 | 
	
		
			
				|  |  | +self['@jsObject'][attr] = anObject;
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: ["aSymbol", "anObject"],
 | 
	
		
			
				|  |  | +source: unescape('at%3A%20aSymbol%20put%3A%20anObject%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Cself%5B%27@jsObject%27%5D%5Battr%5D%20%3D%20anObject%3E'),
 | 
	
		
			
				|  |  | +messageSends: ["asString"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +unescape('_on_'),
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: unescape('on%3A'),
 | 
	
		
			
				|  |  | +category: 'instance creation',
 | 
	
		
			
				|  |  | +fn: function (aJSObject){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return (function($rec){smalltalk.send($rec, "_jsObject_", [aJSObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 | 
	
		
			
				|  |  | +return self;},
 | 
	
		
			
				|  |  | +args: ["aJSObject"],
 | 
	
		
			
				|  |  | +source: unescape('on%3A%20aJSObject%0A%09%5Eself%20new%0A%09%09jsObject%3A%20aJSObject%3B%0A%09%09yourself'),
 | 
	
		
			
				|  |  | +messageSends: ["jsObject:", "yourself", "new"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.JSObjectProxy.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addClass('Point', smalltalk.Object, ['x', 'y'], 'Kernel-Objects');
 | 
	
	
		
			
				|  | @@ -3704,155 +3820,39 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  smalltalk.Point.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addClass('JSObjectProxy', smalltalk.Object, ['jsObject'], 'Kernel-Objects');
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy.comment=unescape('JSObjectProxy%20handles%20sending%20messages%20to%20JavaScript%20object%2C%20therefore%20accessing%20JavaScript%20objects%20from%20Amber%20is%20transparent.%0AJSOjbectProxy%20makes%20intensive%20use%20of%20%60%23doesNotUnderstand%3A%60.%0A%0A%23%23%20Examples%0A%0AJSObjectProxy%20objects%20are%20instanciated%20by%20Amber%20when%20a%20Smalltalk%20message%20is%20sent%20to%20a%20JavaScript%20object.%0A%0A%20%20%20%20window%20alert%3A%20%27hello%20world%27.%0A%20%20%20%20window%20inspect.%0A%20%20%20%20%28window%20jQuery%3A%20%27body%27%29%20append%3A%20%27hello%20world%27%0A%0ASmalltalk%20messages%20sends%20are%20converted%20to%20JavaScript%20function%20calls%20or%20object%20property%20access%20_%28in%20this%20order%29_.%20If%20n%20one%20of%20them%20match%2C%20a%20%60MessageNotUnderstood%60%20error%20will%20be%20thrown.%20%0A%0A%23%23%20Message%20conversion%20rules%0A%0A-%20%60someUser%20name%60%20becomes%20%20%60someUser.name%60%0A-%20%60someUser%20name%3A%20%27John%27%60%20becomes%20%60someUser%20name%20%3D%20%22John%22%60%0A-%20%60console%20log%3A%20%27hello%20world%27%60%20becomes%20%60console.log%28%27hello%20world%27%29%60%0A-%20%60%28window%20jQuery%3A%20%27foo%27%29%20css%3A%20%27background%27%20color%3A%20%27red%27%60%20becomes%20%60window.jQuery%28%27foo%27%29.css%28%27background%27%2C%20%27red%27%29%60%0A%0A__Note%3A__%20For%20keyword-based%20messages%2C%20only%20the%20first%20keyword%20is%20kept%3A%20%60window%20foo%3A%201%20bar%3A%202%60%20is%20equivalent%20to%20%60window%20foo%3A%201%20baz%3A%202%60.')
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_jsObject_'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('jsObject%3A'),
 | 
	
		
			
				|  |  | -category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (aJSObject){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -(self['@jsObject']=aJSObject);
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: ["aJSObject"],
 | 
	
		
			
				|  |  | -source: unescape('jsObject%3A%20aJSObject%0A%09jsObject%20%3A%3D%20aJSObject'),
 | 
	
		
			
				|  |  | -messageSends: [],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +smalltalk.addClass('Random', smalltalk.Object, [], 'Kernel-Objects');
 | 
	
		
			
				|  |  | +smalltalk.Random.comment=unescape('%60Random%60%20is%20a%20random%20number%20generator%20and%20is%20implemented%20as%20a%20trivial%20wrapper%20around%20javascript%20%60Math.random%28%29%60%20and%20is%20used%20like%20this%3A%0A%0A%09Random%20new%20next%0A%0AThis%20will%20return%20a%20float%20x%20where%20x%20%3C%201%20and%20x%20%3E%200.%20If%20you%20want%20a%20random%20integer%20from%201%20to%2010%20you%20can%20use%20%60%23atRandom%60%0A%0A%0910%20atRandom%0A%0A...and%20if%20you%20want%20a%20random%20number%20in%20a%20specific%20interval%20this%20also%20works%3A%0A%0A%09%283%20to%3A%207%29%20atRandom%0A%0A...but%20be%20aware%20that%20%60%23to%3A%60%20does%20not%20create%20an%20Interval%20as%20in%20other%20Smalltalk%20implementations%20but%20in%20fact%20an%20%60Array%60%20of%20numbers%2C%20so%20it%27s%20better%20to%20use%3A%0A%0A%095%20atRandom%20+%202%0A%0ASince%20%60%23atRandom%60%20is%20implemented%20in%20%60SequencableCollection%60%20you%20can%20easy%20pick%20an%20element%20at%20random%3A%0A%0A%09%23%28%27a%27%20%27b%27%20%27c%27%29%20atRandom%0A%0A...or%20perhaps%20a%20letter%20from%20a%20%60String%60%3A%0A%0A%09%27abc%27%20atRandom%0A%0ASince%20Amber%20does%20not%20have%20Characters%20this%20will%20return%20a%20%60String%60%20of%20length%201%20like%20for%20example%20%60%27b%27%60.')
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_jsObject'),
 | 
	
		
			
				|  |  | +unescape('_next'),
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('jsObject'),
 | 
	
		
			
				|  |  | +selector: unescape('next'),
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -return self['@jsObject'];
 | 
	
		
			
				|  |  | +return Math.random();
 | 
	
		
			
				|  |  |  return self;},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: unescape('jsObject%0A%09%5EjsObject'),
 | 
	
		
			
				|  |  | +source: unescape('next%0A%09%3Creturn%20Math.random%28%29%3E'),
 | 
	
		
			
				|  |  |  messageSends: [],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_printString'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('printString'),
 | 
	
		
			
				|  |  | -category: 'proxy',
 | 
	
		
			
				|  |  | -fn: function (){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -return smalltalk.send(smalltalk.send(self, "_jsObject", []), "_toString", []);
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: unescape('printString%0A%09%5Eself%20jsObject%20toString'),
 | 
	
		
			
				|  |  | -messageSends: ["toString", "jsObject"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_inspectOn_'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('inspectOn%3A'),
 | 
	
		
			
				|  |  | -category: 'proxy',
 | 
	
		
			
				|  |  | -fn: function (anInspector){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -var variables=nil;
 | 
	
		
			
				|  |  | -(variables=smalltalk.send((smalltalk.Dictionary || Dictionary), "_new", []));
 | 
	
		
			
				|  |  | -smalltalk.send(variables, "_at_put_", [unescape("%23self"), smalltalk.send(self, "_jsObject", [])]);
 | 
	
		
			
				|  |  | -smalltalk.send(anInspector, "_setLabel_", [smalltalk.send(self, "_printString", [])]);
 | 
	
		
			
				|  |  | -for(var i in self['@jsObject']) {
 | 
	
		
			
				|  |  | -		variables._at_put_(i, self['@jsObject'][i]);
 | 
	
		
			
				|  |  | -	};
 | 
	
		
			
				|  |  | -smalltalk.send(anInspector, "_setVariables_", [variables]);
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: ["anInspector"],
 | 
	
		
			
				|  |  | -source: unescape('inspectOn%3A%20anInspector%0A%09%7C%20variables%20%7C%0A%09variables%20%3A%3D%20Dictionary%20new.%0A%09variables%20at%3A%20%27%23self%27%20put%3A%20self%20jsObject.%0A%09anInspector%20setLabel%3A%20self%20printString.%0A%09%3Cfor%28var%20i%20in%20self%5B%27@jsObject%27%5D%29%20%7B%0A%09%09variables._at_put_%28i%2C%20self%5B%27@jsObject%27%5D%5Bi%5D%29%3B%0A%09%7D%3E.%0A%09anInspector%20setVariables%3A%20variables'),
 | 
	
		
			
				|  |  | -messageSends: ["new", "at:put:", "jsObject", "setLabel:", "printString", "setVariables:"],
 | 
	
		
			
				|  |  | -referencedClasses: ["Dictionary"]
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_doesNotUnderstand_'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('doesNotUnderstand%3A'),
 | 
	
		
			
				|  |  | -category: 'proxy',
 | 
	
		
			
				|  |  | -fn: function (aMessage){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -var obj=nil;
 | 
	
		
			
				|  |  | -var selector=nil;
 | 
	
		
			
				|  |  | -var jsSelector=nil;
 | 
	
		
			
				|  |  | -var arguments=nil;
 | 
	
		
			
				|  |  | -(obj=smalltalk.send(self, "_jsObject", []));
 | 
	
		
			
				|  |  | -(selector=smalltalk.send(aMessage, "_selector", []));
 | 
	
		
			
				|  |  | -(jsSelector=smalltalk.send(selector, "_asJavaScriptSelector", []));
 | 
	
		
			
				|  |  | -(arguments=smalltalk.send(aMessage, "_arguments", []));
 | 
	
		
			
				|  |  | -if(obj[jsSelector] != undefined) {return smalltalk.send(obj, jsSelector, arguments)};
 | 
	
		
			
				|  |  | -smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: ["aMessage"],
 | 
	
		
			
				|  |  | -source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20jsSelector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09jsSelector%20%3A%3D%20selector%20asJavaScriptSelector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5BjsSelector%5D%20%21%3D%20undefined%29%20%7Breturn%20smalltalk.send%28obj%2C%20jsSelector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
 | 
	
		
			
				|  |  | -messageSends: ["jsObject", "selector", "asJavaScriptSelector", "arguments", "doesNotUnderstand:"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_at_'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('at%3A'),
 | 
	
		
			
				|  |  | -category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (aSymbol){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -var attr=nil;
 | 
	
		
			
				|  |  | -(attr=smalltalk.send(aSymbol, "_asString", []));
 | 
	
		
			
				|  |  | -return self['@jsObject'][attr];
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: ["aSymbol"],
 | 
	
		
			
				|  |  | -source: unescape('at%3A%20aSymbol%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Creturn%20self%5B%27@jsObject%27%5D%5Battr%5D%3E'),
 | 
	
		
			
				|  |  | -messageSends: ["asString"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | +smalltalk.Random);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_at_put_'),
 | 
	
		
			
				|  |  | +unescape('_next_'),
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('at%3Aput%3A'),
 | 
	
		
			
				|  |  | +selector: unescape('next%3A'),
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (aSymbol, anObject){
 | 
	
		
			
				|  |  | +fn: function (anInteger){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -var attr=nil;
 | 
	
		
			
				|  |  | -(attr=smalltalk.send(aSymbol, "_asString", []));
 | 
	
		
			
				|  |  | -self['@jsObject'][attr] = anObject;
 | 
	
		
			
				|  |  | +return smalltalk.send(smalltalk.send((1), "_to_", [anInteger]), "_collect_", [(function(each){return smalltalk.send(self, "_next", []);})]);
 | 
	
		
			
				|  |  |  return self;},
 | 
	
		
			
				|  |  | -args: ["aSymbol", "anObject"],
 | 
	
		
			
				|  |  | -source: unescape('at%3A%20aSymbol%20put%3A%20anObject%0A%09%7C%20attr%20%7C%0A%09attr%20%3A%3D%20aSymbol%20asString.%0A%09%3Cself%5B%27@jsObject%27%5D%5Battr%5D%20%3D%20anObject%3E'),
 | 
	
		
			
				|  |  | -messageSends: ["asString"],
 | 
	
		
			
				|  |  | +args: ["anInteger"],
 | 
	
		
			
				|  |  | +source: unescape('next%3A%20anInteger%0A%20%20%20%20%5E%281%20to%3A%20anInteger%29%20collect%3A%20%5B%3Aeach%20%7C%20self%20next%5D'),
 | 
	
		
			
				|  |  | +messageSends: ["collect:", "to:", "next"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +smalltalk.Random);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -unescape('_on_'),
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: unescape('on%3A'),
 | 
	
		
			
				|  |  | -category: 'instance creation',
 | 
	
		
			
				|  |  | -fn: function (aJSObject){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -return (function($rec){smalltalk.send($rec, "_jsObject_", [aJSObject]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send(self, "_new", []));
 | 
	
		
			
				|  |  | -return self;},
 | 
	
		
			
				|  |  | -args: ["aJSObject"],
 | 
	
		
			
				|  |  | -source: unescape('on%3A%20aJSObject%0A%09%5Eself%20new%0A%09%09jsObject%3A%20aJSObject%3B%0A%09%09yourself'),
 | 
	
		
			
				|  |  | -messageSends: ["jsObject:", "yourself", "new"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -smalltalk.JSObjectProxy.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |