|  | @@ -1,189 +1,193 @@
 | 
	
		
			
				|  |  | -/* Adapted from Clamato by Avi Bryant. http://www.clamato.net */
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -(function() {
 | 
	
		
			
				|  |  | -    var
 | 
	
		
			
				|  |  | -    scripts = document.getElementsByTagName("script"),
 | 
	
		
			
				|  |  | -    src = scripts[ scripts.length - 1 ].src,
 | 
	
		
			
				|  |  | -    home = src.split("/").slice(0, -2).join("/") + "/";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    window.Amber = {
 | 
	
		
			
				|  |  | -	debug: false,
 | 
	
		
			
				|  |  | -	deploy: false,
 | 
	
		
			
				|  |  | -	nocache: '?' + (new Date()).getTime(),
 | 
	
		
			
				|  |  | -	home: home,
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	/*
 | 
	
		
			
				|  |  | -	  example:
 | 
	
		
			
				|  |  | -	  Amber.load({
 | 
	
		
			
				|  |  | -	  files: ['MyCategory1.js', 'MyCategory2.js'],
 | 
	
		
			
				|  |  | -	  ready: function() {smalltalk.Browser._open()}
 | 
	
		
			
				|  |  | -	  })
 | 
	
		
			
				|  |  | -	*/
 | 
	
		
			
				|  |  | -	load: function(spec) {
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    self.localStorageSource = [];
 | 
	
		
			
				|  |  | -	    self.spec = ((typeof spec == 'undefined') ? {} : spec);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    // In deployment mode, only the compressed version of Kernel
 | 
	
		
			
				|  |  | -	    // and Canvas are loaded
 | 
	
		
			
				|  |  | -	    self.deploy = self.spec.deploy || self.deploy;
 | 
	
		
			
				|  |  | -	    self.debug = self.spec.debug || self.debug;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    // Specify a version string to avoid wrong browser caching
 | 
	
		
			
				|  |  | -	    if (self.spec.version)
 | 
	
		
			
				|  |  | -		self.nocache = '?' + self.spec.version;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    self.loadDependencies();
 | 
	
		
			
				|  |  | -	    self.loadJS('boot.js');
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    self.populateLocalPackages();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    if (self.deploy) {
 | 
	
		
			
				|  |  | -		self.loadPackages([
 | 
	
		
			
				|  |  | -		    'Kernel.deploy',
 | 
	
		
			
				|  |  | -		    'Canvas.deploy'
 | 
	
		
			
				|  |  | -		]);
 | 
	
		
			
				|  |  | -	    } else {
 | 
	
		
			
				|  |  | -		self.loadIDEDependencies();
 | 
	
		
			
				|  |  | -		self.loadCSS('amber.css');
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		self.loadPackages([
 | 
	
		
			
				|  |  | -		    'Kernel',
 | 
	
		
			
				|  |  | -		    'Canvas',
 | 
	
		
			
				|  |  | -		    'Compiler',
 | 
	
		
			
				|  |  | -		    'parser',
 | 
	
		
			
				|  |  | -		    'IDE',
 | 
	
		
			
				|  |  | -		    'SUnit',
 | 
	
		
			
				|  |  | -		    'Examples',
 | 
	
		
			
				|  |  | -		    'Benchfib',
 | 
	
		
			
				|  |  | -		    'Kernel-Tests'
 | 
	
		
			
				|  |  | -		]);
 | 
	
		
			
				|  |  | -	    }
 | 
	
		
			
				|  |  | +/* Amber package loading
 | 
	
		
			
				|  |  | +   usage example:
 | 
	
		
			
				|  |  | +   amber.load({
 | 
	
		
			
				|  |  | +     files: ['MyCategory1.js', 'MyCategory2.js'],
 | 
	
		
			
				|  |  | +     ready: function() {smalltalk.Browser._open()}
 | 
	
		
			
				|  |  | +   })
 | 
	
		
			
				|  |  | +*/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +amber = (function() {
 | 
	
		
			
				|  |  | +    var that = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var scripts = document.getElementsByTagName("script");
 | 
	
		
			
				|  |  | +    var src     = scripts[ scripts.length - 1 ].src;
 | 
	
		
			
				|  |  | +    var home    = src.split("/").slice(0, -2).join("/") + "/";
 | 
	
		
			
				|  |  | +    var nocache = '?' + (new Date()).getTime();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var debug;
 | 
	
		
			
				|  |  | +    var deploy;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	    var additionalFiles = self.spec.packages || self.spec.files;
 | 
	
		
			
				|  |  | -	    if (additionalFiles)
 | 
	
		
			
				|  |  | -		self.loadPackages(additionalFiles, self.spec.prefix);
 | 
	
		
			
				|  |  | +    var localStorageSource = [];
 | 
	
		
			
				|  |  | +    var localPackages;
 | 
	
		
			
				|  |  | +    var spec;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    that.load = function(obj) {
 | 
	
		
			
				|  |  | +	spec = obj || {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// In deployment mode, only the compressed version of Kernel
 | 
	
		
			
				|  |  | +	// and Canvas are loaded
 | 
	
		
			
				|  |  | +	deploy = spec.deploy || false;
 | 
	
		
			
				|  |  | +	debug = spec.debug || false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Specify a version string to avoid wrong browser caching
 | 
	
		
			
				|  |  | +	if (spec.version) {
 | 
	
		
			
				|  |  | +	    nocache = '?' + spec.version;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	loadDependencies();
 | 
	
		
			
				|  |  | +	loadJS('boot.js');
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	populateLocalPackages();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (deploy) {
 | 
	
		
			
				|  |  | +	    loadPackages([
 | 
	
		
			
				|  |  | +		'Kernel.deploy',
 | 
	
		
			
				|  |  | +		'Canvas.deploy'
 | 
	
		
			
				|  |  | +	    ]);
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +	    loadIDEDependencies();
 | 
	
		
			
				|  |  | +	    loadCSS('amber.css');
 | 
	
		
			
				|  |  | +	    
 | 
	
		
			
				|  |  | +	    loadPackages([
 | 
	
		
			
				|  |  | +		'Kernel',
 | 
	
		
			
				|  |  | +		'Canvas',
 | 
	
		
			
				|  |  | +		'Compiler',
 | 
	
		
			
				|  |  | +		'parser',
 | 
	
		
			
				|  |  | +		'IDE',
 | 
	
		
			
				|  |  | +		'SUnit',
 | 
	
		
			
				|  |  | +		'Examples',
 | 
	
		
			
				|  |  | +		'Benchfib',
 | 
	
		
			
				|  |  | +		'Kernel-Tests'
 | 
	
		
			
				|  |  | +	    ]);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var additionalFiles = spec.packages || spec.files;
 | 
	
		
			
				|  |  | +	    if (additionalFiles) {
 | 
	
		
			
				|  |  | +		loadPackages(additionalFiles, spec.prefix);
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	    // Always load all local packages
 | 
	
		
			
				|  |  | -	    for (name in self.localPackages) {
 | 
	
		
			
				|  |  | -		self.log('Local package:  ' + name);
 | 
	
		
			
				|  |  | -		self.localStorageSource.push(self.localPackages[name]);
 | 
	
		
			
				|  |  | +	    for (name in localPackages) {
 | 
	
		
			
				|  |  | +		log('Local package:  ' + name);
 | 
	
		
			
				|  |  | +		localStorageSource.push(localPackages[name]);
 | 
	
		
			
				|  |  |  	    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	    // Be sure to setup & initialize smalltalk classes
 | 
	
		
			
				|  |  | -	    self.loadJS('init.js');
 | 
	
		
			
				|  |  | -	    self.initializeSmalltalk();
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	loadPackages: function(names, prefix){
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    var name, url;
 | 
	
		
			
				|  |  | -	    var prefix = prefix || 'js';
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    for (var i=0; i < names.length; i++) {
 | 
	
		
			
				|  |  | -		name = names[i].split(/\.js$/)[0];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		// Only load package from the server if it isn't stored in
 | 
	
		
			
				|  |  | -		// localStorage
 | 
	
		
			
				|  |  | -		if (!(name in self.localPackages)) {
 | 
	
		
			
				|  |  | -		    self.log('Server package: ' + name);
 | 
	
		
			
				|  |  | -		    self.loadJS(name + '.js', prefix);
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +	    loadJS('init.js');
 | 
	
		
			
				|  |  | +	    initializeSmalltalk();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    function loadPackages(names, prefix){
 | 
	
		
			
				|  |  | +	var name, url;
 | 
	
		
			
				|  |  | +	var prefix = prefix || 'js';
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	for (var i=0; i < names.length; i++) {
 | 
	
		
			
				|  |  | +	    name = names[i].split(/\.js$/)[0];
 | 
	
		
			
				|  |  | +	    
 | 
	
		
			
				|  |  | +	    // Only load package from the server if it isn't stored in
 | 
	
		
			
				|  |  | +	    // localStorage
 | 
	
		
			
				|  |  | +	    if (!(name in localPackages)) {
 | 
	
		
			
				|  |  | +		log('Server package: ' + name);
 | 
	
		
			
				|  |  | +		loadJS(name + '.js', prefix);
 | 
	
		
			
				|  |  |  	    }
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	loadJS: function(name, prefix) {
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    var prefix = prefix || 'js';
 | 
	
		
			
				|  |  | -	    var name = name;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    if (!self.deploy)
 | 
	
		
			
				|  |  | -		name = name + self.nocache;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    var url = self.home + prefix + '/' + name;
 | 
	
		
			
				|  |  | -	    var scriptString = '<script src="' + url + '" type="text/javascript"></script>';
 | 
	
		
			
				|  |  | -	    document.write(scriptString);
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	loadCSS: function (name, prefix) {
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    var prefix = prefix || 'css';
 | 
	
		
			
				|  |  | -	    var name = name;
 | 
	
		
			
				|  |  | -	    if (!self.deploy)
 | 
	
		
			
				|  |  | -		name = name + self.nocache;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    var url = self.home + prefix + '/' + name;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    var link = document.createElement("link");
 | 
	
		
			
				|  |  | -	    link.setAttribute("rel", "stylesheet");
 | 
	
		
			
				|  |  | -	    link.setAttribute("type", "text/css");
 | 
	
		
			
				|  |  | -	    link.setAttribute("href", url);
 | 
	
		
			
				|  |  | -	    document.getElementsByTagName("head")[0].appendChild(link);
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	loadDependencies: function() {
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    self.loadJS('lib/jQuery/jquery-1.6.4.min.js');
 | 
	
		
			
				|  |  | -	    self.loadJS('lib/jQuery/jquery-ui-1.8.9.custom.min.js');
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	loadIDEDependencies: function() {
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    self.loadJS('lib/jQuery/jquery.textarea.js');
 | 
	
		
			
				|  |  | -	    self.loadJS('lib/CodeMirror/lib/codemirror.js');
 | 
	
		
			
				|  |  | -	    self.loadCSS('lib/CodeMirror/lib/codemirror.css', 'js');
 | 
	
		
			
				|  |  | -	    self.loadJS('lib/CodeMirror/mode/smalltalk/smalltalk.js');
 | 
	
		
			
				|  |  | -	    self.loadCSS('lib/CodeMirror/theme/amber.css', 'js');
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// This will be called after JS files have been loaded
 | 
	
		
			
				|  |  | -	initializeSmalltalk: function(){
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    for (var i=0; i < self.localStorageSource.length; i++)
 | 
	
		
			
				|  |  | -		eval(self.localStorageSource[i]);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    if (self.spec.ready)
 | 
	
		
			
				|  |  | -		self.spec.ready();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	    if (self.deploy)
 | 
	
		
			
				|  |  | -		smalltalk.setDeploymentMode();
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    function loadJS(name, prefix) {
 | 
	
		
			
				|  |  | +	var prefix = prefix || 'js';
 | 
	
		
			
				|  |  | +	var name = name;
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	if (!deploy) {
 | 
	
		
			
				|  |  | +	    name = name + nocache;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	populateLocalPackages: function(){
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    var localStorageRE = /^smalltalk\.packages\.(.*)$/;
 | 
	
		
			
				|  |  | -	    self.localPackages = {};
 | 
	
		
			
				|  |  | +	var url = home + prefix + '/' + name;
 | 
	
		
			
				|  |  | +	var scriptString = '<script src="' + url + '" type="text/javascript"></script>';
 | 
	
		
			
				|  |  | +	document.write(scriptString);
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	    var match, key;
 | 
	
		
			
				|  |  | +    function loadCSS(name, prefix) {
 | 
	
		
			
				|  |  | +	var prefix = prefix || 'css';
 | 
	
		
			
				|  |  | +	var name = name;
 | 
	
		
			
				|  |  | +	if (!deploy) {
 | 
	
		
			
				|  |  | +	    name = name + nocache;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	    for(var i=0; i < localStorage.length; i++) {
 | 
	
		
			
				|  |  | -		key = localStorage.key(i);
 | 
	
		
			
				|  |  | +	var url = home + prefix + '/' + name;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		if (match = key.match(localStorageRE)) {
 | 
	
		
			
				|  |  | -		    self.localPackages[match[1]] = localStorage[key];
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	    }
 | 
	
		
			
				|  |  | +	var link = document.createElement("link");
 | 
	
		
			
				|  |  | +	link.setAttribute("rel", "stylesheet");
 | 
	
		
			
				|  |  | +	link.setAttribute("type", "text/css");
 | 
	
		
			
				|  |  | +	link.setAttribute("href", url);
 | 
	
		
			
				|  |  | +	document.getElementsByTagName("head")[0].appendChild(link);
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	    return self.localPackages;
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | +    function loadDependencies() {
 | 
	
		
			
				|  |  | +	loadJS('lib/jQuery/jquery-1.6.4.min.js');
 | 
	
		
			
				|  |  | +	loadJS('lib/jQuery/jquery-ui-1.8.9.custom.min.js');
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    function loadIDEDependencies() {
 | 
	
		
			
				|  |  | +	loadJS('lib/jQuery/jquery.textarea.js');
 | 
	
		
			
				|  |  | +	loadJS('lib/CodeMirror/lib/codemirror.js');
 | 
	
		
			
				|  |  | +	loadCSS('lib/CodeMirror/lib/codemirror.css', 'js');
 | 
	
		
			
				|  |  | +	loadJS('lib/CodeMirror/mode/smalltalk/smalltalk.js');
 | 
	
		
			
				|  |  | +	loadCSS('lib/CodeMirror/theme/amber.css', 'js');
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	clearLocalPackages: function(){
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    for (var name in self.localPackages) {
 | 
	
		
			
				|  |  | -		self.log('Removing ' + name + ' from local storage');
 | 
	
		
			
				|  |  | -		localStorage.removeItem('smalltalk.packages.' + name);
 | 
	
		
			
				|  |  | +    // This will be called after JS files have been loaded
 | 
	
		
			
				|  |  | +    function initializeSmalltalk() {
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	window.smalltalkReady = function() {
 | 
	
		
			
				|  |  | +	    
 | 
	
		
			
				|  |  | +	    for (var i=0; i < localStorageSource.length; i++) {
 | 
	
		
			
				|  |  | +		eval(localStorageSource[i]);
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  | +	    
 | 
	
		
			
				|  |  | +	    if (deploy) {
 | 
	
		
			
				|  |  | +		smalltalk.setDeploymentMode();
 | 
	
		
			
				|  |  |  	    }
 | 
	
		
			
				|  |  | -	},
 | 
	
		
			
				|  |  | +	    
 | 
	
		
			
				|  |  | +	    if (spec.ready) {
 | 
	
		
			
				|  |  | +		spec.ready();
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	log: function(string) {
 | 
	
		
			
				|  |  | -	    var self = this;
 | 
	
		
			
				|  |  | -	    if (self.debug)
 | 
	
		
			
				|  |  | -		console.log(string);
 | 
	
		
			
				|  |  | +    function populateLocalPackages(){
 | 
	
		
			
				|  |  | +	var localStorageRE = /^smalltalk\.packages\.(.*)$/;
 | 
	
		
			
				|  |  | +	localPackages = {};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var match, key;
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	for(var i=0; i < localStorage.length; i++) {
 | 
	
		
			
				|  |  | +	    key = localStorage.key(i);
 | 
	
		
			
				|  |  | +	    
 | 
	
		
			
				|  |  | +	    if (match = key.match(localStorageRE)) {
 | 
	
		
			
				|  |  | +		localPackages[match[1]] = localStorage[key];
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return localPackages;
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    window.loadAmber = function(spec) {
 | 
	
		
			
				|  |  | -	Amber.load(spec);
 | 
	
		
			
				|  |  | +    function clearLocalPackages() {
 | 
	
		
			
				|  |  | +	for (var name in localPackages) {
 | 
	
		
			
				|  |  | +	    log('Removing ' + name + ' from local storage');
 | 
	
		
			
				|  |  | +	    localStorage.removeItem('smalltalk.packages.' + name);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    function log(string) {
 | 
	
		
			
				|  |  | +	if (debug) {
 | 
	
		
			
				|  |  | +	    console.log(string);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return that;
 | 
	
		
			
				|  |  |  })();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +window.loadAmber = function(spec) {
 | 
	
		
			
				|  |  | +    amber.load(spec);
 | 
	
		
			
				|  |  | +}
 |