fn,\n functionDef =\n-\tpos:p ( func:fn | '(' func:fn ')' ) somethingRelated ( defEnd | spaces )\n+\tpos:p ( func:fn | '(' func:fn ')' ) somethingRelated defEnd\n \t-> { this._fragment(fn, 'functionDef', p, this.pos()-1) },\n \n staticProperty =\n","/core/lively/lang/String.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/lang/String.js\t2012-06-14 10:16:59.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/lang/String.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -11,6 +11,7 @@\n return this == '';\n },\n \n+\n blank: function() {\n return /^\\s*$/.test(this);\n },\n@@ -93,7 +94,7 @@\n \n times: function(count) {\n return count < 1 ? '' : new Array(count + 1).join(this);\n- }\n+ },\n \n });\n \n@@ -193,8 +194,14 @@\n return removeLeadingWhitespace(removeTrailingWhitespace(str));\n },\n \n- print: function(str) {\n- var result = str;\n+ print: function(obj) {\n+ if (obj && obj.constructor && obj.constructor === Array) {\n+ return '[' + obj.map(function(ea) { return Strings.print(ea) }) + ']';\n+ }\n+ if (typeof obj !== \"string\") {\n+ return String(obj);\n+ }\n+ var result = String(obj);\n result = result.replace(/\\n/g, '\\\\n\\\\\\n')\n result = result.replace(/(\"|')/g, '\\\\$1')\n result = '\\'' + result + '\\'';\n@@ -205,12 +212,6 @@\n return str.split(/\\n\\r?/);\n },\n \n- nonEmptyLines: function(str) {\n- return Strings.lines(str).reject(function(line) {\n- return line == ''\n- });\n- },\n-\n tokens: function(str, regex) {\n regex = regex || /\\s+/;\n return str.split(regex);\n@@ -220,11 +221,10 @@\n depth = depth || 0;\n var s = \"\"\n list.forEach(function(ea) {\n- if (ea instanceof Array) {\n+ if (ea instanceof Array)\n s += Strings.printNested(ea, depth + 1)\n- } else {\n+ else\n s += Strings.indent(ea +\"\\n\", ' ', depth);\n- }\n })\n return s\n },\n@@ -234,44 +234,11 @@\n },\n \n tableize: function(s) {\n- // string => array\n- // Strings.tableize('a b c\\nd e f') => [[a, b, c], [d, e, f]]\n return Strings.lines(s).collect(function(ea) {\n return Strings.tokens(ea)\n })\n },\n \n- pad: function(string, n, left) {\n- return left ? ' '.times(n) + string : string + ' '.times(n);\n- },\n-\n- printTable: function(tableArray, options) {\n- // array => string\n- // Strings.printTable([[a, b, c], [d, e, f]]) => 'a b c\\nd e f'\n- var columnWidths = [],\n- separator = (options && options.separator) || ' ',\n- alignLeftAll = !options || !options.align || options.align === 'left',\n- alignRightAll = options && options.align === 'right';\n- function alignRight(columnIndex) {\n- if (alignLeftAll) return false;\n- if (alignRightAll) return true;\n- return options\n- && Object.isArray(options.align)\n- && options.align[columnIndex] === 'right';\n- }\n- tableArray.forEach(function(row) {\n- row.forEach(function(cellString, i) {\n- if (columnWidths[i] === undefined) columnWidths[i] = 0;\n- columnWidths[i] = Math.max(columnWidths[i], cellString.length);\n- });\n- });\n- return tableArray.collect(function(row) {\n- return row.collect(function(cellString, i) {\n- return Strings.pad(cellString, columnWidths[i] - cellString.length, alignRight(i));\n- }).join(separator);\n- }).join('\\n');\n- },\n-\n newUUID: function() {\n // copied from Martin's UUID class\n var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n@@ -281,11 +248,10 @@\n return id;\n },\n \n- unescapeCharacterEntities: function(s) {\n- // like ¨\n- var div = XHTMLNS.create('div');\n- div.innerHTML = s;\n- return div.textContent\n- }\n-\n+\tunescapeCharacterEntities: function(s) {\n+\t\t// like ¨\n+\t\tvar div = XHTMLNS.create('div');\n+\t\tdiv.innerHTML = s;\n+\t\treturn div.textContent\n+\t},\n };\n\\ No newline at end of file\n","/core/lively/lang/Object.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/lang/Object.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/lang/Object.js\t2012-04-22 00:37:41.000000000 +0200\n@@ -70,11 +70,7 @@\n },\n \n isFunction: function(object) {\n- return object instanceof Function;\n- },\n-\n- isBoolean: function(object) {\n- return typeof object == \"boolean\";\n+ return typeof object == \"function\";\n },\n \n isString: function(object) {\n@@ -92,10 +88,6 @@\n isRegExp: function(object) {\n return object instanceof RegExp;\n },\n- \n- isObject: function(object) {\n- return typeof object == \"object\";\n- },\n \n inherit: function(obj) {\n var constructor = function ProtoConstructor() { return this }\n@@ -146,12 +138,8 @@\n protoCreator.prototype = obj;\n var protoObj = new protoCreator();\n return protoObj;\n- },\n+ }\n \n-\taddScript: function (object, funcOrString, optName) {\n-\t\tvar func = Function.fromString(funcOrString);\n-\t\treturn func.asScriptOf(object, optName);\n-\t}\n });\n \n \n@@ -213,7 +201,7 @@\n \n safeToString: function(obj) {\n try {\n- return (obj ? obj.toString() : String(obj)).replace('\\n','');\n+ return obj ? obj.toString() : String(obj);\n } catch (e) {\n return '';\n }\n@@ -289,20 +277,6 @@\n \n printObjectSize: function(obj) {\n return Numbers.humanReadableByteSize(JSON.stringify(obj).length);\n- },\n- \n- any: function(obj, predicate) {\n- for (var name in obj) {\n- if (predicate(obj, name)) return true;\n- }\n- },\n- \n- allProperties: function(obj, predicate) {\n- var result = [];\n- for (var name in obj) {\n- if (predicate(obj, name)) result.push(name);\n- }\n- return result;\n }\n \n };\n","/core/lively/lang/Function.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/lang/Function.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/lang/Function.js\t2012-04-07 13:34:18.000000000 +0200\n@@ -263,7 +263,6 @@\n addToObject: function(obj, name) {\n this.name = name;\n obj[name] = this;\n- this.declaredObject = Objects.safeToString(obj);\n // suppport for tracing\n if (lively.Tracing && lively.Tracing.stackTracingEnabled) {\n lively.Tracing.instrumentMethod(obj, name, {\n","/core/lively/lang/Array.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/lang/Array.js\t2012-06-12 21:34:53.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/lang/Array.js\t2012-04-22 00:37:41.000000000 +0200\n@@ -7,7 +7,7 @@\n \n // FIXME: Is Enumerable used somewhere else? Can Array be extended directly?\n var Enumerable = {\n- each: Array.prototype.forEach || function(iterator, context) {\n+ each: function(iterator, context) {\n var index = 0;\n iterator = iterator.bind(context);\n try {\n@@ -22,7 +22,7 @@\n \n all: function(iterator, context) {\n var result = true;\n- for (var i = 0, len = this.length; i < len; i++) {\n+ for (var i = 0; i < this.length; i++) {\n result = result && !! iterator.call(context || Global, this[i], i);\n if (!result) break;\n }\n@@ -30,21 +30,21 @@\n },\n \n any: function(iterator, context) {\n- return this.detect(iterator, context) !== undefined;\n+ return this.detect(iterator, context) !== undefined\n },\n \n- collect: Array.prototype.map || (function(iterator, context) {\n+ collect: (Array.prototype.map || (function(iterator, context) {\n iterator = iterator ? iterator.bind(context) : Prototype.K;\n var results = [];\n this.each(function(value, index) {\n results.push(iterator(value, index));\n });\n return results;\n- }),\n+ })),\n \n detect: function(iterator, context) {\n- for (var value, i = 0, len = this.length; i < len; i++) {\n- value = this[i];\n+ for (var i = 0; i < this.length; i++) {\n+ var value = this[i];\n if (iterator.call(context, value, i)) return value;\n }\n return undefined;\n@@ -71,23 +71,22 @@\n return results;\n },\n \n- include: Array.prototype.indexOf ?\n- function(object) { return this.indexOf(object) != -1 } :\n- function(object) {\n- if (typeof this.indexOf == 'function') return this.indexOf(object) != -1;\n-\n- var found = false;\n- this.each(function(value) {\n- if (value == object) {\n- found = true;\n- throw $break;\n- }\n- });\n- return found;\n- },\n+ include: function(object) {\n+ if (typeof this.indexOf == 'function') return this.indexOf(object) != -1;\n+\n+ var found = false;\n+ this.each(function(value) {\n+ if (value == object) {\n+ found = true;\n+ throw $break;\n+ }\n+ });\n+ return found;\n+ },\n+\n \n inject: function(memo, iterator, context) {\n- if (context) iterator = iterator.bind(context);\n+ iterator = iterator.bind(context);\n this.each(function(value, index) {\n memo = iterator(memo, value, index);\n });\n@@ -95,10 +94,10 @@\n },\n \n invoke: function(method) {\n- var args = Array.from(arguments).slice(1),\n+ var args = $A(arguments).slice(1),\n result = new Array(this.length);\n- for (var value, i = 0, len = this.length; i < len; i++) {\n- value = this[i];\n+ for (var i = 0; i < this.length; i++) {\n+ var value = this[i];\n result[i] = value[method].apply(value, args);\n }\n return result;\n@@ -125,7 +124,7 @@\n },\n \n partition: function(iterator, context) {\n- iterator = iterator ? (context ? iterator.bind(context) : iterator) : Prototype.K;\n+ iterator = iterator ? iterator.bind(context) : Prototype.K;\n var trues = [],\n falses = [];\n this.each(function(value, index) {\n@@ -378,17 +377,6 @@\n var sum = 0;\n for (var i = 0; i < this.length; i++) sum += this[i];\n return sum;\n- },\n-\n- groupBy: function(iterator, context) {\n- iterator = context ? iterator.bind(context) : iterator;\n- var groups = {};\n- for (var i = 0, len = this.length; i < len; i++) {\n- var hash = iterator(this[i], i);\n- if (!groups[hash]) groups[hash] = [];\n- groups[hash].push(this[i]);\n- }\n- return groups;\n }\n \n });\n@@ -443,7 +431,7 @@\n // Global Helper - Arrays\n ///////////////////////////////////////////////////////////////////////////////\n \n-var Arrays = {\n+Arrays = {\n equal: function(firstArray, secondArray) {\n // deprecated, use anArray.equals\n return firstArray.equals(secondArray);\n@@ -456,4 +444,4 @@\n ///////////////////////////////////////////////////////////////////////////////\n \n // DEPRECATED!\n-var $A = Array.from;\n\\ No newline at end of file\n+$A = Array.from;\n","/core/lively/ide/VersionTools.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/VersionTools.js\t2012-05-21 15:20:26.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/VersionTools.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -106,11 +106,9 @@\n \n revert: function() {\n this.fetchSelectedVersionAndDo(function(resForGet) {\n- // using two to know when status of put\n- var resForPut = new WebResource(this.url).beAsync();\n+ var resForPut = new WebResource(this.url).beAsync(); // using two to know when status of put\n lively.bindings.connect(resForGet, 'content', resForPut, 'put');\n- lively.bindings.connect(resForPut, 'status', this, 'revertDone', {updater:\n- function($upd, status) { if (status.isDone())$upd(status) }});\n+ lively.bindings.connect(resForPut, 'status', this, 'revertDone');\n });\n },\n revertDone: function (status) {\n","/core/lively/ide/tests/FileParserTests.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/tests/FileParserTests.js\t2012-05-21 15:20:26.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/tests/FileParserTests.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -234,18 +234,6 @@\n this.assertIdentity(descriptor.startIndex, 0);\n this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n },\n- testParseFunction3: function() { // function abc() {...}\n- var src = 'function bar() {\\n\\n}';\n-this.sut.parserErrors = [];\n-this.sut.debugMode = true;\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('functionDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'bar');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf('}'));\n- },\n-\n \n testParseExecutedFunction: function() { // (function() {...});\n var src = '(function testModuleLoad() {\\n\\t\\tvar modules = Global.subNamespaces(true);\\n\\t}).delay(5);';\n","/core/lively/ide/SystemCodeBrowser.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/SystemCodeBrowser.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/SystemCodeBrowser.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -28,8 +28,8 @@\n \n connect(this.locationInput(), 'savedTextString', this, 'setTargetURL',\n {converter: function(value) { return new URL(value) }});\n- this.targetURL = this.targetURL; // hrmpf\n- this.locationInput().applyStyle({fontSize: 8, textColor: Color.darkGray, borderWidth: 0});\n+ this.targetURL = this.targetURL // hrmpf\n+ this.locationInput().applyStyle({fontSize: 8, textColor: Color.darkGray, borderWidth: 0})\n \n this.panel.codeBaseDirBtn.setLabel('codebase');\n connect(this.panel.codeBaseDirBtn, 'fire', this, 'setTargetURL',\n@@ -37,8 +37,8 @@\n this.panel.codeBaseDirBtn.applyStyle({scaleProportional: true, label: {fontSize: 8}, padding: Rectangle.inset(2)})\n \n this.panel.localDirBtn.setLabel('local');\n- connect(this.panel.localDirBtn, 'fire', this, 'setTargetURL', {converter: function() {\n- return $world.getUserName() ? $world.getUserDir() : URL.source.getDirectory() }});\n+ connect(this.panel.localDirBtn, 'fire', this, 'setTargetURL',\n+ {converter: function() { return URL.source.getDirectory() }});\n this.panel.localDirBtn.applyStyle({scaleProportional: true, label: {fontSize: 8}, padding: Rectangle.inset(2)})\n },\n \n@@ -131,80 +131,45 @@\n });\n \n Object.extend(lively.ide, {\n- browse: function(/*args*/) {\n- // args can be:\n- // 1. objectName, methodName, moduleNameOrSpec\n- // Browse a method in a object (class, layer, etc)\n- // See MethodFinder for original implementation\n- // Example:\n- // objectName = \"lively.morphic.Morph\"\n- // methodName = \"onMouseDown\"\n- // moduleNameOrSpec = \"lively.morphic.Events\"\n- // || {name: \"lively.ast.LivelyJSParser\", type: 'ometa'};\n- // 2. URL (URL object or string)\n- // 3. path (String) relative to URL.root\n-\n- var args = Array.from(arguments);\n- if (args.length === 1) { // url or path\n- var url = args[0].toString().startsWith('http:') ?\n- new URL(args[0]) : URL.root.withFilename(args[0]);\n- this.browseURL(url);\n- } else {\n- var objectName = args[0],\n- methodName = args[1],\n- moduleNameOrSpec = args[2];\n-\n- var promise = {}, moduleName, moduleType;\n- if (Object.isString(moduleNameOrSpec)) {\n- moduleName = moduleNameOrSpec;\n- } else if (moduleNameOrSpec.name) {\n- moduleName = moduleNameOrSpec.name;\n- moduleType = moduleNameOrSpec.type || moduleType;\n- }\n+ browse: function(objectName, methodName, moduleNameOrSpec) {\n+ // Browse a method in a object (class, layer, etc)\n+ // See MethodFinder for original implementation\n+ // Example:\n+ // objectName = \"lively.morphic.Morph\"\n+ // methodName = \"onMouseDown\"\n+ // moduleNameOrSpec = \"lively.morphic.Events\"\n+ // || {name: \"lively.ast.LivelyJSParser\", type: 'ometa'};\n+\n+ var promise = {}, moduleName, moduleType;\n+ if (Object.isString(moduleNameOrSpec)) {\n+ moduleName = moduleNameOrSpec;\n+ } else if (moduleNameOrSpec.name) {\n+ moduleName = moduleNameOrSpec.name;\n+ moduleType = moduleNameOrSpec.type || moduleType;\n+ }\n \n- if (objectName) {\n- objectName = objectName.replace(/^Global\\./,\"\");\n- }\n+ if (objectName) {\n+ objectName = objectName.replace(/^Global\\./,\"\");\n+ }\n \n- var relative = module(moduleName).relativePath(moduleType),\n- moduleNode = lively.ide.startSourceControl().addModule(relative),\n- rootNode = moduleNode.ast(),\n- fileFragments = rootNode.subElements(10).select(function(ea) {\n- var path = ea.getOwnerNamePath();\n- return path.include(objectName) && (!methodName || path.include(methodName));\n- });\n-\n- if (fileFragments.length > 0) {\n- return fileFragments[0].browseIt()\n- } else {\n- alert(\"could not browse \" + methodName + \" in \" + objectName);\n- rootNode.browseIt();\n- return false;\n- }\n+ var relative = module(moduleName).relativePath(moduleType),\n+ moduleNode = lively.ide.startSourceControl().addModule(relative),\n+ rootNode = moduleNode.ast(),\n+ fileFragments = rootNode.subElements(10).select(function(ea) {\n+ var path = ea.getOwnerNamePath();\n+ return path.include(objectName) && (!methodName || path.include(methodName));\n+ });\n \n- return promise;\n- }\n- },\n- browseURL: function(url) {\n- var browser = this.openSystemCodeBrowser();\n- if (url.isLeaf()) {\n- var dir = url.getDirectory(),\n- fileName = url.filename();\n- browser.setTargetURL(dir);\n- browser.selectNodeMatching(function(node) {\n- return node && node.url && node.url().filename() == fileName;\n- })\n+ if (fileFragments.length > 0) {\n+ return fileFragments[0].browseIt()\n } else {\n- browser.setTargetURL(url);\n+ alert(\"could not browse \" + methodName + \" in \" + objectName);\n+ rootNode.browseIt();\n+ return false;\n }\n- \n- },\n- openSystemCodeBrowser: function() {\n- var browser = new lively.ide.SystemBrowser();\n- browser.openIn(lively.morphic.World.current());\n- return browser;\n- },\n-\n \n+ return promise;\n+ }\n });\n+\n }) // end of module\n\\ No newline at end of file\n","/core/lively/ide/SystemBrowserNodes.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/SystemBrowserNodes.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/SystemBrowserNodes.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -115,10 +115,9 @@\n },\n \n saveSource: function($super, newSource, sourceControl) {\n- lively.ide.enableDebugFileParsing(this.browser.debugMode);\n+ this.target.debugMode = this.browser.debugMode\n this.target.putSourceCode(newSource);\n this.savedSource = this.target.getSourceCode(); // assume that users sees newSource after that\n- lively.ide.enableDebugFileParsing(false);\n return true;\n },\n \n@@ -314,10 +313,8 @@\n },\n \n reparse: function() {\n- lively.ide.enableDebugFileParsing(this.browser.debugMode);\n- this.getSourceControl().reparseModule(this.moduleName, true);\n- this.signalChange();\n- lively.ide.enableDebugFileParsing(false);\n+ this.getSourceControl().reparseModule(this.moduleName, true);\n+ this.signalChange();\n }\n },\n 'consistency', {\n@@ -557,19 +554,13 @@\n var paneName = this.browser.paneNameOfNode(this),\n idx = Number(paneName[paneName.length-1]),\n nextPane = 'Pane' + (idx + 1);\n- this.browser.inPaneSelectNodeNamed(nextPane, '-- all --');\n- setTimeout((function() {\n- //FIXME: dirty hack to get syntax highlighting when selecting classes\n- this.browser.panel.sourcePane.innerMorph().highlightJavaScriptSyntax();\n- }).bind(this), 800);\n+ this.browser.inPaneSelectNodeNamed(nextPane, '-- all --')\n },\n \n });\n \n lively.ide.MultiFileFragmentsNode.subclass('lively.ide.MethodCategoryFragmentNode', {\n \n- isCategoryNode: true,\n-\n getName: function() { return this.target.getName() },\n \n sourceString: lively.ide.FileFragmentNode.prototype.sourceString, // FIXME\n@@ -628,9 +619,6 @@\n return false;\n // do nothing\n },\n-},\n-'testing', {\n- isClassNode: true,\n });\n \n lively.ide.FileFragmentNode.subclass('lively.ide.ObjectFragmentNode', {\n","/core/lively/ide/SyntaxHighlighting.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/SyntaxHighlighting.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/SyntaxHighlighting.js\t2012-04-07 13:34:18.000000000 +0200\n@@ -105,50 +105,38 @@\n \n lively.morphic.Text.addMethods(\n 'syntax highlighting', {\n- syntaxHighlightingCharLimit: 8000,\n- syntaxHighlightingMinDelay: 300,\n- syntaxHighlightingMaxDelay: 10000,\n+ syntaxHighlightingCharLimit: 4000,\n highlightJavaScriptSyntax: function() {\n // FIXME use defaultconfig\n if (URL.source && URL.source.toString().include('disableSyntaxHighlighting=true')) return;\n if (!this.renderContext().textNode) return; // FIXME\n var length = this.textString.length;\n+\n if (length > this.syntaxHighlightingCharLimit) return;\n- clearTimeout(this._syntaxHighlightTimeout);\n- var later = function() {\n- this._syntaxHighlightTimeout = null;\n- var start = Date.now();\n- this.highlightSyntaxFromTo(0, this.textString.length,\n- SyntaxHighlighter.JavaScriptRules);\n- this.lastSyntaxHighlightTime = Date.now() - start;\n- }.bind(this);\n- if (this.lastSyntaxHighlightTime >= 0) {\n- var time = this.lastSyntaxHighlightTime * 2;\n- time = Math.max(this.syntaxHighlightingMinDelay, time);\n- time = Math.min(this.syntaxHighlightingMaxDelay, time);\n- this._syntaxHighlightTimeout = setTimeout(later, time);\n- } else {\n- later();\n- }\n- return true;\n- },\n- applyHighlighterRules: function(target, highlighterRules) {\n- for (var ruleName in highlighterRules) {\n- if (!highlighterRules.hasOwnProperty(ruleName)) continue;\n- var rule = highlighterRules[ruleName];\n- target.emphasizeRegex(rule.match, rule.style)\n- }\n+ var currentMs = Date.now();\n+ if (this.lastSyntaxHighlightTime && (currentMs-this.lastSyntaxHighlightTime < 300)) return;\n+ this.lastSyntaxHighlightTime = currentMs;\n+ this.highlightSyntaxFromTo(0, length, SyntaxHighlighter.JavaScriptRules);\n },\n+\n highlightSyntaxFromTo: function(from, to, highlighterRules) {\n var selRange = this.getSelectionRange(),\n scroll = this.getScroll();\n if (false) {\n this.emphasize({color: Color.black, fontWeight: 'normal'}, from, to);\n- this.applyHighlighterRules(this, highlighterRules);\n+ for (var ruleName in highlighterRules) {\n+ if (!highlighterRules.hasOwnProperty(ruleName)) continue;\n+ var rule = highlighterRules[ruleName];\n+ this.emphasizeRegex(rule.match, rule.style)\n+ }\n } else {\n var rt = new lively.morphic.RichText(this.textString);\n- this.applyHighlighterRules(rt, highlighterRules);\n- this.setRichText(rt);\n+ for (var ruleName in highlighterRules) {\n+ if (!highlighterRules.hasOwnProperty(ruleName)) continue;\n+ var rule = highlighterRules[ruleName];\n+ rt.emphasizeRegex(rule.match, rule.style)\n+ }\n+ this.setRichText(rt)\n }\n selRange && this.setSelectionRange(selRange[0], selRange[1]);\n scroll && this.setScroll(scroll[0], scroll[1]);\n@@ -157,13 +145,13 @@\n // FIXME use defaultconfig\n if (URL.source && URL.source.toString().include('disableSyntaxHighlighting=true')) return;\n if (!this.renderContext().textNode) return; // FIXME\n- var later = function() {\n- this._syntaxHighlightTimeout = null;\n- this.highlightSyntaxFromTo(0, this.textString.length,\n- SyntaxHighlighter.LaTeXRules);\n- }.bind(this);\n- clearTimeout(this._syntaxHighlightTimeout);\n- this._syntaxHighlightTimeout = setTimeout(later, 300);\n+ var length = this.textString.length;\n+\n+ // if (length > 10000) return;\n+ var currentMs = Date.now();\n+ if (this.lastSyntaxHighlightTime && (currentMs-this.lastSyntaxHighlightTime < 300)) return;\n+ this.lastSyntaxHighlightTime = currentMs;\n+ this.highlightSyntaxFromTo(0, length, SyntaxHighlighter.LaTeXRules);\n },\n \n })\n","/core/lively/ide/SourceDatabase.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/SourceDatabase.js\t2012-06-12 21:34:53.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/SourceDatabase.js\t2012-06-01 10:28:55.000000000 +0200\n@@ -244,15 +244,11 @@\n findModuleWrapperForFileName: function(fileName) {\n // support for Config.modulePaths == [users/, projects/]\n // FIXME this is a hack\n- //console.log(\"** in file name: \" + fileName);\n var m = fileName.match(/\\.\\.\\/([A-Za-z0-9]+\\/)(.*)/);\n if (m && Config.modulePaths.include(m[1])) {\n fileName = m[1] + m[2];\n }\n- return this.allModules().detect(function(ea) {\n- //console.log(ea.fileName()); \n- return ea.fileName() == fileName \n- })\n+ return this.allModules().detect(function(ea) { return ea.fileName() == fileName })\n },\n \n createModuleWrapperForFileName: function(fileName, isVirtual) {\n@@ -503,14 +499,6 @@\n return this.startSourceControl();\n },\n \n- debugFileParsingEnabled: function() {\n- return this._debugFileParsingEnabled;\n- },\n-\n- enableDebugFileParsing: function(bool) {\n- return this._debugFileParsingEnabled = bool;\n- },\n-\n startSourceControl: function() {\n // creates or fetches\n return lively.ide.SourceControl = lively.ide.SourceControl || new AnotherSourceDatabase();\n","/core/lively/ide/FileParsing.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/FileParsing.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/FileParsing.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -470,15 +470,6 @@\n \n giveHint: Functions.Null,\n \n- /*debugging*/\n- get debugMode() {\n- return this._debugMode || lively.ide.debugFileParsingEnabled();\n- },\n-\n- set debugMode(bool) {\n- return this._debugMode = bool;\n- },\n-\n /* parsing */\n prepareParsing: function(src, config) {\n this.src = src;\n@@ -576,13 +567,14 @@\n var msg = 'The following parser errors occured. Please note that not all of them are real errors. If you know that the source code should be a class definition look at the output of klassDef and look for \"<--Error-->\" to get a hint what to fix in order to parse the code.\\n\\n';\n msg += this.parserErrors.pluck('parseError').join('\\n\\n----------------------\\n');\n \n- lively.morphic.World.current().addTextWindow({title: 'Parsing errors', content: msg});\n+ lively.morphic.World.current().addTextWindow({title: 'Parsing errors', content: msg})\n }\n \n if (this.specialDescr && this.specialDescr.length > 0\n && (!this.specialDescr.last().subElements().last().isError\n || !this.changeList.last().isError)) {\n console.warn('Couldn\\'t find end of ' + this.specialDescr.last().type);\n+ //throw dbgOn(new Error('Couldn\\'t find end of ' + specialDescr.last().type));\n }\n \n console.log('Finished parsing in ' + (new Date().getTime()-msStart)/1000 + ' s');\n","/core/lively/ide/BrowserFramework.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ide/BrowserFramework.js\t2012-05-21 15:20:26.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ide/BrowserFramework.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -622,7 +622,7 @@\n \n //this.setSourceString(src);\n var text = this.panel.sourcePane.innerMorph();\n- text.setTextString(src.toString());\n+ text.setTextString(src.toString())\n this.panel.sourcePane.setVerticalScrollPosition(sourcePos);\n // text.changed()\n text.showChangeClue(); // FIXME\n","/core/lively/DOMAbstraction.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/DOMAbstraction.js\t2012-06-01 10:29:34.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/DOMAbstraction.js\t2012-02-21 22:41:27.000000000 +0100\n@@ -5,9 +5,9 @@\n // ===========================================================================\n \n Global.Namespace = {\n- SVG: \"http:\\/\\/www.w3.org/2000/svg\",\n- LIVELY: UserAgent.usableNamespacesInSerializer ? \"http:\\/\\/www.experimentalstuff.com/Lively\" : null,\n- XLINK: \"http:\\/\\/www.w3.org/1999/xlink\",\n+ SVG: \"http:\\/\\/www.w3.org/2000/svg\", \n+ LIVELY: UserAgent.usableNamespacesInSerializer ? \"http:\\/\\/www.experimentalstuff.com/Lively\" : null, \n+ XLINK: \"http:\\/\\/www.w3.org/1999/xlink\", \n XHTML: \"http:\\/\\/www.w3.org/1999/xhtml\",\n ATOM: \"http:\\/\\/www.w3.org/2005/Atom\",\n \n@@ -17,9 +17,6 @@\n DC: \"http:\\/\\/purl.org/dc/terms\",\n BATCH: \"http:\\/\\/schemas.google.com/gdata/batch\",\n GD: \"http:\\/\\/schemas.google.com/g/2005\",\n-\n- // SVN / DAV\n- LP1: \"DAV:\"\n };\n \n Global.Converter = {\n@@ -38,7 +35,7 @@\n \n parseInset: function(string) {\n // syntax: (,(,,)?)?\n-\n+ \n if (!string || string == \"none\") return null;\n try {\n var box = string.split(\",\");\n@@ -61,7 +58,7 @@\n default:\n console.log(\"unable to parse padding \" + padding);\n return null;\n- }\n+ } \n return Rectangle.inset(t, l, b, r);\n },\n \n@@ -99,7 +96,7 @@\n return JSON.serialize({XML: Exporter.stringify(value)});\n throw new Error('Cannot store Document/DocumentType'); // to be removed\n },\n-\n+ \n toJSONAttribute: function(obj) {\n return obj ? escape(JSON.serialize(obj, Converter.wrapperAndNodeEncodeFilter)) : \"\";\n },\n@@ -119,13 +116,13 @@\n fromJSONAttribute: function(str) {\n return str ? JSON.unserialize(unescape(str), Converter.nodeDecodeFilter) : null;\n },\n-\n+ \n needsJSONEncoding: function(value) {\n // some objects can be saved in as DOM attributes using their\n // .toString() form, others need JSON\n if (value instanceof Color) return false;\n var type = typeof value.valueOf();\n- return type != \"string\" && type != \"number\";\n+ return type != \"string\" && type != \"number\"; \n },\n \n quoteCDATAEndSequence: function(string) {\n@@ -167,14 +164,14 @@\n }\n desc.appendChild(encoding);\n return desc;\n- }\n-\n+ } \n+ \n if (propValue && propValue.toLiteral) {\n desc.setAttributeNS(null, \"family\", propValue.constructor.type);\n desc.appendChild(NodeFactory.createCDATA(JSON.serialize(propValue.toLiteral())));\n return desc;\n }\n-\n+ \n if (propValue.nodeType) {\n switch (propValue.nodeType) {\n case document.DOCUMENT_NODE:\n@@ -185,10 +182,10 @@\n desc.appendChild(document.importNode(propValue, true));\n }\n return desc;\n- }\n+ } \n return null;\n },\n-\n+ \n isJSONConformant: function(value) { // for now, arrays not handled but could be\n if (value instanceof Element && value.ownerDocument === document) return false;\n // why disallow all objects?\n@@ -232,7 +229,7 @@\n createText: function(string) {\n return Global.document.createTextNode(string);\n },\n-\n+ \n createNL: function(string) {\n return Global.document.createTextNode(\"\\n\");\n },\n@@ -244,7 +241,7 @@\n CDATAType: function() {\n return Global.document.CDATA_SECTION_NODE;\n },\n-\n+ \n TextType: function() {\n return Global.document.TEXT_NODE;\n },\n@@ -266,7 +263,7 @@\n setHref: function(node, href) {\n return node.setAttributeNS(Namespace.XLINK, \"href\", href);\n },\n-\n+ \n getHref: function(node) {\n return node.getAttributeNS(Namespace.XLINK, \"href\");\n }\n@@ -385,7 +382,9 @@\n return null;\n }\n var doc = webRes.contentDocument;\n- if (!doc) return null;\n+ console.log(\"problems to parse \" + URL.source);\n+ if (!doc)\n+ return null;\n // FIX for IE9+\n if (doc.documentElement == null) {\n doc = new ActiveXObject('MSXML2.DOMDocument.6.0');\n@@ -437,7 +436,7 @@\n });\n \n var codeBaseDef = this.createCodeBaseDef(this.codeBaseFrom(this.codeBase, this.toDir));\n-\n+ \n if (codeBaseDefs.length == 0) {\n var script = NodeFactory.create('script');\n script.setAttribute('name', 'codeBase');\n","/core/lively/defaultconfig.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/defaultconfig.js\t2012-06-16 18:29:17.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/defaultconfig.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -31,7 +31,7 @@\n * to be overridden.\n */\n \n-;(function setupUserAgent(Global) {\n+(function setupUserAgent(Global) {\n \n var webKitVersion = (function() {\n if (!window.navigator) return 0;\n","/core/lively/Data.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/Data.js\t2012-06-01 10:29:34.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/Data.js\t2012-02-21 22:41:27.000000000 +0100\n@@ -30,96 +30,97 @@\n \n // FIX for IE9+\n if (typeof XPathResult == 'undefined') {\n- // constant values taken from Safari implementation (XPath 3.0)\n- Object.subclass('XPathResult', { });\n- Object.extend(XPathResult, {\n- ANY_TYPE: 0,\n- ANY_UNORDERED_NODE_TYPE: 8,\n- BOOLEAN_TYPE: 3,\n- FIRST_ORDERED_NODE_TYPE: 9,\n- NUMBER_TYPE: 1,\n- ORDERED_NODE_ITERATOR_TYPE: 5,\n- ORDERED_NODE_SNAPSHOT_TYPE: 7,\n- STRING_TYPE: 2,\n- UNORDERED_NODE_ITERATOR_TYPE: 4,\n- UNORDERED_NODE_SNAPSHOT_TYPE: 6\n- });\n+\t// constant values taken from Safari implementation (XPath 3.0)\n+\tObject.subclass('XPathResult', { });\n+\tObject.extend(XPathResult, {\n+\t\tANY_TYPE: 0,\n+\t\tANY_UNORDERED_NODE_TYPE: 8,\n+\t\tBOOLEAN_TYPE: 3,\n+\t\tFIRST_ORDERED_NODE_TYPE: 9,\n+\t\tNUMBER_TYPE: 1,\n+\t\tORDERED_NODE_ITERATOR_TYPE: 5,\n+\t\tORDERED_NODE_SNAPSHOT_TYPE: 7,\n+\t\tSTRING_TYPE: 2,\n+\t\tUNORDERED_NODE_ITERATOR_TYPE: 4,\n+\t\tUNORDERED_NODE_SNAPSHOT_TYPE: 6\n+\t});\n }\n \n // FIX for IE9+\n Object.subclass('XPathEmulator', {\n-\t initialize: function() {\n-\t\t this.xmlDom = new ActiveXObject('MSXML2.DOMDocument.6.0');\n-\t\t this.xmlDom.setProperty('SelectionLanguage', 'XPath');\n-\t },\n-\n-\t evaluate: function(expr, node, nsResolver) {\n-\t\t this.xmlDom.setProperty(\"SelectionNamespaces\", (typeof nsResolver == 'function' ? this.createNSResolver() : nsResolver));\n-\n-\t\t var queryObj;\n-\t\t try {\n-\t\t\t if (node.selectNodes('*'))\n-\t\t\t\t queryObj = node;\n-\t\t } catch(e) {\n-\t\t\t queryObj = this.xmlDom;\n-\t\t\t if (node.outerHTML) {\n-\t\t\t\t this.xmlDom.loadXML(node.outerHTML);\n- } else if (node.ownerDocument.documentElement === node) {\n-\t\t\t\t var serializer = new XMLSerializer();\n-\t\t\t\t this.xmlDom.loadXML(serializer.serializeToString(node));\n-\t\t\t } else {\n- this.xmlDom.loadXML(node.ownerDocument.documentElement.outerHTML);\n-\t\t\t\t queryObj = this.xmlDom.selectSingleNode('//*[@id=\"' + node.id + '\"]');\n-\t\t\t }\n-\t\t }\n-\t\t return new XPathEmulatorResult(node, queryObj, expr);\n-\t },\n+\tinitialize: function() {\n+\t\tthis.xmlDom = new ActiveXObject('MSXML2.DOMDocument.6.0');\n+\t\tthis.xmlDom.setProperty('SelectionLanguage', 'XPath');\n+\t},\n+\n+\tevaluate: function(expr, node, nsResolver) {\n+\t\tthis.xmlDom.setProperty(\"SelectionNamespaces\", (typeof nsResolver == 'function' ? this.createNSResolver() : nsResolver));\n+\n+\t\tvar queryObj;\n+\t\ttry {\n+\t\t\tif (node.selectNodes('*'))\n+\t\t\t\t queryObj = node;\n+\t\t} catch(e) {\n+\t\t\tqueryObj = this.xmlDom;\n+\t\t\tif (node.outerHTML)\n+\t\t\t\tthis.xmlDom.loadXML(node.outerHTML);\n+\t\t\telse if (node.ownerDocument.documentElement === node) {\n+\t\t\t\tvar serializer = new XMLSerializer();\n+\t\t\t\tthis.xmlDom.loadXML(serializer.serializeToString(node));\n+\t\t\t} else {\n+\t\t\t\tthis.xmlDom.loadXML(node.ownerDocument.documentElement.outerHTML);\n+\t\t\t\tqueryObj = this.xmlDom.selectSingleNode('//*[@id=\"' + node.id + '\"]');\n+\t\t\t}\n+\t\t}\n+\n+\t\treturn new XPathEmulatorResult(node, queryObj, expr);\n+\t},\n \n \tcreateNSResolver: function(ctx) {\n \t\tvar ns = '';\n-\t\tProperties.forEachOwn(Namespace, function(key, value) {\n- ns += 'xmlns:' + key.toLowerCase() + '=\"' + value + '\" '; });\n+\t\tProperties.forEachOwn(Namespace, function(key, value) { ns += 'xmlns:' + key.toLowerCase() + '=\"' + value + '\" '; });\n \t\treturn ns;\n-\t}\n+\t},\n });\n \n // FIX for IE9+\n Object.subclass('XPathEmulatorResult', {\n-\t initialize: function(origNode, queryObj, expr) {\n-\t\t this.sourceNode = origNode;\n-\t\t this.result = queryObj.selectNodes(expr);\n-\t\t this.length = this.result.length;\n-\t\t this.pointer = 0;\n-\t },\n-\n-\t iterateNext: function() {\n-\t\t if (this.pointer >= this.length) return undefined;\n-\n-\t\t var res = this.result[this.pointer];\n-\t\t // sync with original source\n-\t\t if (this.sourceNode.ownerDocument && (Global.document == this.sourceNode.ownerDocument)) {\n-\t\t\t var doc = this.sourceNode.ownerDocument,\n- nodeNoStack = [],\n- curNode = res;\n-\t\t\t while (curNode.parentNode) {\n-\t\t\t\t var i = 0;\n-\t\t\t\t while (curNode.previousSibling) {\n-\t\t\t\t\t curNode = curNode.previousSibling;\n-\t\t\t\t\t if (curNode.nodeType != 8) i++;\n-\t\t\t\t }\n-\t\t\t\t nodeNoStack.push(i);\n-\t\t\t\t curNode = curNode.parentNode;\n-\t\t\t }\n-\t\t\t nodeNoStack.pop();\n-\n-\t\t\t res = document.documentElement;\n-\t\t\t while (nodeNoStack.length > 0)\n-\t\t\t\t res = (res.children ? $A(res.children)[nodeNoStack.pop()] : $A(res.childNodes)[nodeNoStack.pop()]);\n-\t\t }\n-\n-\t\t this.pointer += 1;\n-\t\t return res;\n-\t }\n+\tinitialize: function(origNode, queryObj, expr) {\n+\t\tthis.sourceNode = origNode;\n+\t\tthis.result = queryObj.selectNodes(expr);\n+\t\tthis.length = this.result.length;\n+\t\tthis.pointer = 0;\n+\t},\n+\n+\titerateNext: function() {\n+\t\tif (this.pointer >= this.length)\n+\t\t\treturn undefined;\n+\n+\t\tvar res = this.result[this.pointer];\n+\t\t// sync with original source\n+\t\tif (this.sourceNode.ownerDocument && (Global.document == this.sourceNode.ownerDocument)) {\n+\t\t\tvar doc = this.sourceNode.ownerDocument;\n+\t\t\tvar nodeNoStack = [];\n+\t\t\tvar curNode = res;\n+\t\t\twhile (curNode.parentNode) {\n+\t\t\t\tvar i = 0;\n+\t\t\t\twhile (curNode.previousSibling) {\n+\t\t\t\t\tcurNode = curNode.previousSibling;\n+\t\t\t\t\tif (curNode.nodeType != 8) i++;\n+\t\t\t\t}\n+\t\t\t\tnodeNoStack.push(i);\n+\t\t\t\tcurNode = curNode.parentNode;\n+\t\t\t}\n+\t\t\tnodeNoStack.pop();\n+\n+\t\t\tres = document.documentElement;\n+\t\t\twhile (nodeNoStack.length > 0) \n+\t\t\t\tres = (res.children ? $A(res.children)[nodeNoStack.pop()] : $A(res.childNodes)[nodeNoStack.pop()]);\n+\t\t}\n+\n+\t\tthis.pointer += 1;\n+\t\treturn res;\n+\t},\n });\n \n if (!Global.View) Object.subclass(\"View\");\n@@ -128,79 +129,75 @@\n documentation: \"Wrapper around XPath evaluation\",\n \n xpe: Global.XPathEvaluator ? new XPathEvaluator() : (console.log('XPath not available, emulating...') || new XPathEmulator()),\n-\n+ \n formals: [\"+Results\", // Node[]\n-\t\t \"-ContextNode\", // where to evaluate\n-\t ],\n+\t\t\"-ContextNode\", // where to evaluate\n+\t],\n \n-\t initialize: function(expression, optPlug) {\n-\t\t //if (!this.xpe) throw new Error(\"XPath not available\");\n-\t\t this.contextNode = null;\n-\t\t this.expression = expression;\n-\t\t if (optPlug) this.connectModel(optPlug);\n-\t },\n-\n-\t establishContext: function(node) {\n-\t\t if (this.nsResolver) return;\n-\t\t var ctx = node.ownerDocument ? node.ownerDocument.documentElement : node.documentElement;\n-\t\t if (ctx !== this.contextNode) {\n-\t\t\t this.contextNode = ctx;\n-\t\t\t this.nsResolver = this.xpe.createNSResolver(ctx);\n-\t\t }\n-\t },\n-\n-\t manualNSLookup: function() {\n-\t\t this.nsResolver = function(prefix) {\n-\t\t\t return Namespace[prefix.toUpperCase()] || null;\n-\t\t }\n-\t\t return this;\n-\t },\n-\n-\t updateView: function(aspect, controller) {\n-\t\t var p = this.modelPlug;\n-\t\t if (!p) return;\n-\t\t switch (aspect) {\n-\t\t\t case p.getContextNode:\n-\t\t\t this.onContextNodeUpdate(this.getContextNode());\n-\t\t\t break;\n-\t\t }\n-\t },\n-\n-\t onContextNodeUpdate: function(node) {\n-\t\t if (node instanceof Document) node = node.documentElement;\n-\t\t var result = this.findAll(node, null);\n-\t\t this.setResults(result);\n-\t },\n-\n-\t findAll: function(node, defaultValue) {\n-\t\t this.establishContext(node);\n-\t\t var result = this.xpe.evaluate(this.expression, node, this.nsResolver, XPathResult.ANY_TYPE, null),\n- accumulator = [],\n- res = null;\n-\t\t while (res = result.iterateNext()) accumulator.push(res);\n-\t\t return accumulator.length > 0 || defaultValue === undefined ? accumulator : defaultValue;\n-\t },\n-\n-\t findFirst: function(node) {\n-\t\t this.establishContext(node);\n-\t\t var result = this.xpe.evaluate(this.expression, node, this.nsResolver, XPathResult.ANY_TYPE, null);\n-\t\t return result.iterateNext();\n-\t }\n+\tinitialize: function(expression, optPlug) {\n+\t\t//if (!this.xpe) throw new Error(\"XPath not available\");\n+\t\tthis.contextNode = null;\n+\t\tthis.expression = expression;\n+\t\tif (optPlug) this.connectModel(optPlug);\n+\t},\n+\n+\testablishContext: function(node) {\n+\t\tif (this.nsResolver) return;\n+\t\tvar ctx = node.ownerDocument ? node.ownerDocument.documentElement : node.documentElement;\n+\t\tif (ctx !== this.contextNode) {\n+\t\t\tthis.contextNode = ctx;\n+\t\t\tthis.nsResolver = this.xpe.createNSResolver(ctx);\n+\t\t}\n+\t},\n+\n+\tmanualNSLookup: function() {\n+\t\tthis.nsResolver = function(prefix) {\n+\t\t\treturn Namespace[prefix.toUpperCase()] || null;\n+\t\t}\n+\t\treturn this\n+\t},\n+\t\n+\tupdateView: function(aspect, controller) {\n+\t\tvar p = this.modelPlug;\n+\t\tif (!p) return;\n+\t\tswitch (aspect) {\n+\t\t\tcase p.getContextNode:\n+\t\t\tthis.onContextNodeUpdate(this.getContextNode());\n+\t\t\tbreak;\n+\t\t}\n+\t},\n+ \n+\tonContextNodeUpdate: function(node) {\n+\t\tif (node instanceof Document) node = node.documentElement;\n+\t\tvar result = this.findAll(node, null);\n+\t\tthis.setResults(result);\n+\t},\n+\n+\tfindAll: function(node, defaultValue) {\n+\t\tthis.establishContext(node);\n+\t\tvar result = this.xpe.evaluate(this.expression, node, this.nsResolver, XPathResult.ANY_TYPE, null);\n+\t\tvar accumulator = [];\n+\t\tvar res = null;\n+\t\twhile (res = result.iterateNext()) accumulator.push(res);\n+\t\treturn accumulator.length > 0 || defaultValue === undefined ? accumulator : defaultValue;\n+\t},\n+\n+\tfindFirst: function(node) {\n+\t\tthis.establishContext(node);\n+\t\tvar result = this.xpe.evaluate(this.expression, node, this.nsResolver, XPathResult.ANY_TYPE, null);\n+\t\treturn result.iterateNext();\n+\t},\n \n });\n-\n Object.extend(Query, {\n- find: function(expr, doc) {\n- return new Query(expr).manualNSLookup().findFirst(doc)\n- },\n-\n- findAll: function(expr, doc) {\n- return new Query(expr).manualNSLookup().findAll(doc)\n- }\n+\tfind: function(expr, doc) {\n+\t\treturn new Query(expr).manualNSLookup().findFirst(doc)\n+\t},\n+\n+\tfindAll: function(expr, doc) {\n+\t\treturn new Query(expr).manualNSLookup().findAll(doc)\n+\t},\n });\n \n-Object.extend(module(\"lively.Data\"), {\n- XPathQuery: Query\n-});\n \n }); // end of module\n\\ No newline at end of file\n","/core/lively/ChangeSet.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ChangeSet.js\t2012-02-22 23:15:12.000000000 +0100\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ChangeSet.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -51,7 +51,7 @@\n },\n 'accessing', {\n \tgetXMLElement: function() { return this.xmlElement },\n-\t\n+\n \tsetXMLElement: function(newElement) {\n \t\tvar p = this.getXMLElement().parentNode,\n \t\t\toldElement = this.getXMLElement();\n@@ -246,7 +246,7 @@\n \n \treconstructFrom: function(node) {\n \t\tif (!node) return false;\n-\t\tvar codeNodes = $A(node.childNodes).select(function(node) { return node.localName == 'code' }); \n+\t\tvar codeNodes = $A(node.childNodes).select(function(node) { return node.localName == 'code' });\n \t\tif (codeNodes.length == 0) return false;\n \t\tif (codeNodes.length > 1)\n \t\t\tconsole.warn('multiple code nodes in ' + node);\n@@ -270,7 +270,7 @@\n \t\t\telse throw e;\n \t\t}\n \t},\n-\t\n+\n \tfindOrCreateDefNodeOfWorld: function(doc) {\n \t\t// FIXME !!!\n \t\tif (doc.getAttribute && (doc.getAttribute('type') || doc.getAttribute('lively:type')) == \"WorldMorph\" ) {\n@@ -356,25 +356,25 @@\n \tlogChange: function(spec) {},\n },\n 'system startup, initializer and world requirements', {\n-\t\n+\n \tgetInitializer: function() {\n \t\tvar elems = this.subElements();\n \t\tfor (var i = 0; i < elems.length; i++)\n \t\t\tif (elems[i].isInitializer()) return elems[i];\n \t},\n-\t\n+\n \tgetWorldRequirementsList: function() {\n \t\tvar elems = this.subElements();\n \t\tfor (var i = 0; i < elems.length; i++)\n \t\t\tif (elems[i].isWorldRequirementsList()) return elems[i];\n \t},\n-\t\n+\n \tensureHasInitializeScript: function() {\n \t\tif (this.getInitializer()) return;\n \t\tvar content = '// this script is evaluated on world load';\n \t\tthis.addOrChangeElementNamed(Change.initializerName, content);\n \t},\n-\t\n+\n \tensureHasWorldRequirements: function() {\n \t\tif (this.getWorldRequirementsList()) return;\n \t\tvar content = '// An array of module names that is loaded on world load\\n[]';\n@@ -382,7 +382,7 @@\n \t\t\tDoitChange.create(content, Change.worldRequirementsListName),\n \t\t\tthis.getInitializer()); // insert before initializer\n \t},\n-\t\n+\n \tevaluateAllButInitializer: function() {\n \t\tvar changes = this.subElements();\n \t\tfor (var i = 0; i < changes.length; i++) {\n@@ -393,12 +393,12 @@\n \t\t\t\t\tchange.evaluate();\n \t\t}\n \t},\n-\t\n+\n \tevaluateInitializer: function() {\n \t\tvar initializerDoit = this.getInitializer();\n \t\tif (initializerDoit) initializerDoit.evaluate();\n \t},\n-\t\n+\n \tevaluateWorldRequirements: function() {\n \t\tvar requirementsDoit = this.getWorldRequirementsList();\n \t\tif (!requirementsDoit) return;\n@@ -406,13 +406,13 @@\n \t\tif (Object.isArray(list))\n \t\t\tConfig.modulesBeforeWorldLoad = Config.modulesBeforeWorldLoad.concat(list);\n \t},\n-\t\n+\n \tensureCompatibility: function() {\n \t\tvar ps = this.subElementNamed('postscript');\n \t\tif (!ps) return;\n \t\tps.setName(Change.initializerName);\n \t},\n-\t\n+\n \taddWorldRequirement: function(moduleName) {\n \t\tvar list = this.getWorldRequirementsList().evaluate();\n \t\tif (!list.include(moduleName))\n@@ -438,8 +438,8 @@\n \t\tvar fileNames = dir.getSubElements().subDocuments.collect(function(file) {\n \t\t\treturn file.getURL().filename()\n \t\t}).select(function(ea){return ea.endsWith(\".js\")});\n-\t\tvar fullModuleNames = fileNames.collect(function(ea){ \n-\t\t\treturn namespaceName + \".\" + ea.match(/(.+)\\.js/)[1]});\n+\t\tvar fullModuleNames = fileNames.collect(function(ea) {\n+\t\t\treturn namespaceName + \".\" + ea.match(/(.+)\\.js/)[1] });\n \t\treturn fullModuleNames\n \t}\n });\n@@ -633,7 +633,7 @@\n \t\t\tvar className = this.getClassName(),\n \t\t\t\tklass = Class.forName(className);\n \t\t\tif (!klass) throw dbgOn(new Error('Could not find class of static change' + this.getName()));\n-\t\t\tvar src = Strings.format('Object.extend(%s, {%s: %s})', className, this.getName(), this.getDefinition());\t\t\n+\t\t\tvar src = Strings.format('Object.extend(%s, {%s: %s})', className, this.getName(), this.getDefinition());\n \t\t\teval(src);\n \t\t\treturn klass[this.getName()];\n \t\t} catch(e) {\n@@ -642,7 +642,7 @@\n \t\t}\n \t},\n },\n-'conversion', {\t\n+'conversion', {\n \tasJs: function(depth) { // FIXME duplication with ProtoChange\n \t\tdepth = depth || '';\n \t\tvar body = this.getDefinition();\n","/core/lively/bootstrap.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/bootstrap.js\t2012-06-16 18:29:17.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/bootstrap.js\t2012-06-14 10:17:32.000000000 +0200\n@@ -3,20 +3,6 @@\n \n function livelyConfigExists() { return typeof Config !== \"undefined\" }\n \n-(function setupLively(Global) {\n- var lively = Global.lively;\n- if (!lively) { lively = Global.lively = {}; }\n-\n- if (!lively.whenLoaded) {\n- if (!Config.finishLoadingCallbacks) {\n- Config.finishLoadingCallbacks = [];\n- }\n- lively.whenLoaded = function(callback) {\n- Config.finishLoadingCallbacks.push(callback);\n- }\n- }\n-})(this);\n-\n (function setupConsole() {\n \n var platformConsole = window.console ||\n@@ -34,11 +20,9 @@\n \n if (isFireBug) return;\n \n- var consumers = platformConsole.consumers = [];\n- platformConsole.wasWrapped = false;\n-\n function addWrappers() {\n if (platformConsole.wasWrapped) return;\n+ platformConsole.wasWrapped = true;\n \n var props = [];\n for (var name in platformConsole) props.push(name);\n@@ -57,10 +41,10 @@\n };\n })(props[i]);\n }\n- platformConsole.wasWrapped = true;\n }\n \n function removeWrappers() {\n+ platformConsole.wasWrapped = false;\n for (var name in platformConsole) {\n if (name[0] !== '$') continue;\n platformConsole[name.substring(1, name.length)] = platformConsole[name];\n@@ -68,6 +52,7 @@\n }\n }\n \n+ var consumers = platformConsole.consumers = [];\n platformConsole.addConsumer = function(c) {\n addWrappers();\n consumers.push(c);\n@@ -918,7 +903,6 @@\n 'lively/lang/String.js',\n 'lively/lang/Array.js',\n 'lively/lang/Number.js',\n- 'lively/lang/Date.js',\n 'lively/defaultconfig.js',\n 'lively/localconfig.js',\n 'lively/Base.js',\n","/core/lively/bindings.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/bindings.js\t2012-06-01 10:29:34.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/bindings.js\t2012-02-21 22:41:27.000000000 +0100\n@@ -489,7 +489,6 @@\n disconnectAll: lively.bindings.disconnectAll,\n signal: lively.bindings.signal,\n updateAttributeConnection: lively.bindings.signal\n-\n });\n \n }); // end of module\n","/core/lively/bindings/Core.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/bindings/Core.js\t2012-04-07 21:20:16.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/bindings/Core.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -41,7 +41,7 @@\n \t\t\tthis.removeAfterUpdate = spec.removeAfterUpdate;\n \t\t\t// when converter function references objects from its environment we can't\n \t\t\t// serialize it. To fail as early as possible we will serialize the converter\n-\t\t\t// already here \n+\t\t\t// already here\n \t\t\tthis.converter = null;\n \t\t\tthis.converterString = spec.converter ? spec.converter.toString() : null;\n \t\t\tthis.updater = null;\n@@ -161,12 +161,13 @@\n \t\tvar connection = this, updater = this.getUpdater(), converter = this.getConverter(),\n \t\t\ttarget = this.targetObj, propName = this.targetMethodName;\n \t\tif (!target || !propName) {\n-\t\t\tvar msg = 'Cannot update ' + this.toString(newValue) + ' because of no target (' + \n+\t\t\tvar msg = 'Cannot update ' + this.toString(newValue) + ' because of no target (' +\n \t\t\t\t\ttarget + ') or targetProp (' + propName+') ';\n-\t\t\tif (this.isWeakConnection) \n- this.disconnect()\n- console.error(msg);\n- \n+\t\t\tif (this.isWeakConnection) {\n+ this.disconnect();\n+ }\n+ console.error(msg);\n+\n \t\t\t// alert(msg);\n \t\t\treturn null;\n \t\t}\n@@ -207,7 +208,7 @@\n 'private helper', {\n \n \taddSourceObjGetterAndSetter: function(existingGetter, existingSetter) {\n-\t\tif ((existingGetter && existingGetter.isAttributeConnectionGetter) || \n+\t\tif ((existingGetter && existingGetter.isAttributeConnectionGetter) ||\n \t\t\t(existingSetter && existingSetter.isAttributeConnectionSetter))\n \t\t\t\treturn;\n \n@@ -220,7 +221,7 @@\n \n \t\tif (sourceObj[newAttrName])\n \t\t\tconsole.warn('newAttrName ' + newAttrName + ' already exists. Are there already other connections?');\n-\t\t\t\n+\n \t\t// add new attr to the serialization ignore list\n \t\tif (!sourceObj.hasOwnProperty('doNotSerialize'))\n \t\t\tsourceObj.doNotSerialize = [];\n@@ -229,8 +230,8 @@\n \t\tif (!sourceObj.hasOwnProperty('doNotCopyProperties'))\n \t\t\tsourceObj.doNotCopyProperties = [];\n \t\tsourceObj.doNotCopyProperties.pushIfNotIncluded(newAttrName);\n-\t\t\n-\t\t\n+\n+\n \t\tif (existingGetter)\n \t\t\tsourceObj.__defineGetter__(newAttrName, existingGetter);\n \t\tif (existingSetter)\n@@ -295,7 +296,7 @@\n var realAttrName = this.sourceAttrName,\n helperAttrName = this.privateAttrName(realAttrName),\n srcObj = this.sourceObj;\n- \n+\n if(srcObj.__lookupGetter__(realAttrName)) {\n delete srcObj[realAttrName];\n srcObj[realAttrName] = srcObj[helperAttrName];\n@@ -457,13 +458,13 @@\n \t\tvar result = connection.connect();\n if (typeof sourceObj['onConnect'] == 'function') {\n sourceObj.onConnect(attrName, targetObj, targetMethodName)\n- }; \n+ };\n return result;\n \t},\n-\t\n+\n \tdisconnect: function(sourceObj, attrName, targetObj, targetMethodName) {\n \t\tif (!sourceObj.attributeConnections) return;\n- \n+\n \t\tsourceObj.attributeConnections.select(function(con) {\n \t\t\treturn \tcon.getSourceAttrName() == attrName &&\n \t\t\t\t\tcon.getTargetObj() === targetObj &&\n@@ -474,13 +475,13 @@\n sourceObj.onDisconnect(attrName, targetObj, targetMethodName);\n };\n \t},\n-\t\n+\n \tdisconnectAll: function(sourceObj) {\n \t\tif (!sourceObj.attributeConnections) return;\n \t\twhile (sourceObj.attributeConnections.length > 0)\n \t\t\tsourceObj.attributeConnections[0].disconnect();\n \t},\n-\t\n+\n \tsignal: function(sourceObj, attrName, newVal) {\n \t\tif (!sourceObj.attributeConnections) return;\n \t\tvar oldVal = sourceObj[attrName];\n@@ -526,5 +527,5 @@\n \tsignal: lively.bindings.signal,\n \tupdateAttributeConnection: lively.bindings.signal\n });\n-\t\n+\n }); // end of module\n","/core/lively/Base.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/Base.js\t2012-06-16 18:29:17.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/Base.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -157,9 +157,9 @@\n modules\n .select(function(ea) { return ea.hasPendingRequirements() })\n .forEach(function(ea) {\n- var msg = Strings.format('%s has unloaded requirements: %s',\n- ea.uri(), ea.pendingRequirementNames());\n- console.warn(msg);\n+\t\t\t var msg = Strings.format('%s has unloaded requirements: %s',\n+\t\t\t\t ea.uri(), ea.pendingRequirementNames());\n+\t\t\t console.warn(msg);\n \n // FIXME use proper Config-URL-parsing\n if (lively.Config.ignoreMissingModules || document.URL.indexOf('ignoreMissingModules=true') >= 0) {\n@@ -167,7 +167,7 @@\n ea.load();\n testModuleLoad.delay(6);\n }\n- });\n+\t\t});\n console.log('Module load check done. ' + modules.length + ' modules loaded.');\n }).delay(10);\n \n@@ -595,7 +595,7 @@\n \n namespaceFor: function Class$namespaceFor(className) {\n // get the namespace object given the qualified name\n- var lastDot = className ? className.lastIndexOf('.') : -1;\n+ var lastDot = className.lastIndexOf('.');\n if (lastDot < 0) return Global;\n else return namespace(className.substring(0, lastDot));\n },\n@@ -823,10 +823,6 @@\n return new URL(this.uri(optType)).relativePathFrom(URL.codeBase);\n },\n \n- lastPart: function() {\n- return this.name().match(/[^.]+$/)[0]\n- }\n-\n },\n 'module dependencies', {\n addDependendModule: function(depModule) {\n","/core/lively/ast/tests/AstTests.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/tests/AstTests.js\t2012-06-14 10:16:59.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/tests/AstTests.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -47,16 +47,16 @@\n result = this.parseJS(src, 'number');\n this.assertMatches(expected, result);\n },\n- test03SingleLineCommentWithoutSemicolon: function() {\n- var src = '23 // comment\\n42',\n- expected = ['begin', [0, 16],\n- ['number', [0, 2], 23],\n- ['number', [14, 16], 42]\n- ],\n- result = this.parseJS(src);\n- this.assertMatches(expected, result,\n- 'single line comment without semicolon cannot be parsed');\n- },\n+ // test03SingleLineCommentWithoutSemicolon: function() {\n+ // // FIXME, not implemented yet\n+ // var src = '23 // comment\\n42',\n+ // expected = ['begin', [0, 16],\n+ // ['number', [0, 2], 23],\n+ // ['number', [3, 16], 42]\n+ // ],\n+ // result = this.parseJS(src);\n+ // this.assertMatches(expected, result, 'single line comment without semicolon cannot be parsed');\n+ // },\n // test04AssignmentOperators: function() {\n // // FIXME, not implemented yet\n // var src1 = 'a >>= 12',\n@@ -78,9 +78,9 @@\n var src1 = '5 & 3', // = 1\n src2 = '5 | 3', // = 7\n src3 = '5 ^ 3', // = 6\n- expected1 = ['binop', [0, 5], '&', ['number', [0, 1], '5'], ['number', [4, 5], 3]],\n- expected2 = ['binop', [0, 5], '|', ['number', [0, 1], '5'], ['number', [4, 5], 3]],\n- expected3 = ['binop', [0, 5], '^', ['number', [0, 1], '5'], ['number', [4, 5], 3]],\n+ expected1 = ['binop', [0, 5], '&', ['number', [0, 1], '5'], ['number', [3, 5], 3]],\n+ expected2 = ['binop', [0, 5], '|', ['number', [0, 1], '5'], ['number', [3, 5], 3]],\n+ expected3 = ['binop', [0, 5], '^', ['number', [0, 1], '5'], ['number', [3, 5], 3]],\n result;\n \n result = this.parseJS(src1, 'expr');\n@@ -117,49 +117,10 @@\n expected = [\"forIn\",\n [0, 22],\n [\"get\", [5, 9], \"name\"],\n- [\"get\", [13, 16], \"obj\"]],\n- result = this.parseJS(src, 'stmt');\n- this.assertMatches(expected, result);\n- },\n- test09ParseMemberFragment: function() {\n- var src1 = 'method: 23',\n- src2 = 'method: 23,',\n- expected = [\"binding\", [0, 10], \"method\", [\"number\", [8, 10]]],\n- result1 = this.parseJS(src1, 'memberFragment'),\n- result2 = this.parseJS(src2, 'memberFragment');\n- this.assertMatches(expected, result1);\n- this.assertMatches(expected, result2);\n- },\n- test10ParseCategoryFragment: function() {\n- var src1 = '\"accessing\", { method: 23 }',\n- src2 = '\"accessing\", { method: 23 },',\n- expected = [\"arr\", [0, 27], [\"string\", [0, 11], \"accessing\"],\n- [\"json\", [12, 27], [\"binding\", [14, 25], \"method\", [\"number\", [23, 25]]]]],\n- result1 = this.parseJS(src1, 'categoryFragment'),\n- result2 = this.parseJS(src2, 'categoryFragment');\n- this.assertMatches(expected, result1);\n- this.assertMatches(expected, result2);\n- },\n- test11ParseVarDecl: function() {\n- var src = 'var /*bla*/s = 23;',\n- expected = [\"begin\", [3, 17], [\"var\", [3, 17], \"s\", [\"number\", [15, 17], 23]]],\n+ [\"get\", [12, 16], \"obj\"]],\n result = this.parseJS(src, 'stmt');\n this.assertMatches(expected, result);\n },\n- test12ParseSet: function() {\n- var src = 'v = /*bla*/s;',\n- expected = [\"set\", [0, 12], [\"get\", [0, 1], \"v\"], [\"get\", [11, 12], \"s\"]],\n- result = this.parseJS(src, 'stmt');\n- this.assertMatches(expected, result);\n- },\n- test13ParseBinary: function() {\n- var src = '1&1|1',\n- expected = ['binop', [0, 5], '|',\n- ['binop', [0, 3], '&', ['number', [0, 1], 1], ['number', [2, 3], 1]],\n- ['number', [4, 5], 1]],\n- result = this.parseJS(src, 'expr');\n- this.assertMatches(expected, result);\n- }\n });\n \n \n@@ -200,6 +161,7 @@\n }]\n },\n };\n+ console.log(r.toString());\n this.assertMatches(expected, r.children[0]);\n },\n test03TryCatch: function() {\n@@ -796,16 +758,16 @@\n test01FindFreeVariable: function() {\n var f = function() { var x = 3; return x + y },\n result = new lively.ast.VariableAnalyzer().findGlobalVariablesIn(String(f));\n- this.assertVarsFound(f, [['y', 36, 37]], result);\n+ this.assertVarsFound(f, [['y', 35, 37]], result);\n },\n testFindSimpleGlobalRead: function() {\n var codeAndExpected = [\n [\"Foo.bar()\", [[\"Foo\", 0, 3]]],\n- [\"var Foo = x(); Foo.bar()\", [[\"x\", 10, 11]]],\n+ [\"var Foo = x(); Foo.bar()\", [[\"x\", 9, 11]]],\n [\"Foo = false;\", [[\"Foo\", 0, 3]]],\n- [\"function() { function() { Foo = 3 }}\", [[\"Foo\", 26, 29]]],\n+ [\"function() { function() { Foo = 3 }}\", [[\"Foo\", 25, 29]]],\n [\"function(arg) { return arg + 1 }\", []],\n- [\"function() { function(arg) {}; return arg }\", [['arg', 38, 41]]]\n+ [\"function() { function(arg) {}; return arg }\", [['arg', 37, 41]]]\n ];\n \n for (var i = 0; i < codeAndExpected.length; i++) {\n@@ -982,28 +944,8 @@\n for (var i = 0; i < 4; i++) {\n a += i;\n }\n- var b = 2;\n return a;\n },\n- whileloop: function(i) {\n- var a = 4;\n- debugger;\n- while (a > 1) {\n- a--;\n- }\n- var b = a + 4;\n- return b;\n- },\n- dowhileloop: function() {\n- var a = 3;\n- debugger;\n- do {\n- a--;\n- } while (a > 0);\n- var b = a + 2;\n- return b;\n- },\n-\n restart: function() {\n var i = 0;\n i++;\n@@ -1297,8 +1239,6 @@\n this.assertStep(frame,{a:3,i:3});\n this.assertStep(frame,{a:6,i:3});\n this.assertStep(frame,{a:6,i:4});\n- this.assertStep(frame,{a:6,i:4});\n- this.assertStep(frame,{a:6,b:2,i:4});\n this.assertEquals(frame.resume(),6);\n },\n testSimpleRestart: function() {\n@@ -1325,31 +1265,6 @@\n that.assert(frame.resume());\n });\n this.assertEquals(frame.mapping.i, 3);\n- },\n- testWhileLoop: function() {\n- var frame = this.assertBreaksWhenInterpretated(this.examples.whileloop);\n- this.assertStep(frame,{a:4});\n- this.assertStep(frame,{a:4});\n- this.assertStep(frame,{a:3});\n- this.assertStep(frame,{a:3});\n- this.assertStep(frame,{a:2});\n- this.assertStep(frame,{a:2});\n- this.assertStep(frame,{a:1});\n- this.assertStep(frame,{a:1});\n- this.assertStep(frame,{a:1,b:5});\n- this.assertEquals(frame.resume(),5);\n- },\n- testDoWhileLoop: function() {\n- var frame = this.assertBreaksWhenInterpretated(this.examples.dowhileloop);\n- this.assertStep(frame,{a:3});\n- this.assertStep(frame,{a:2});\n- this.assertStep(frame,{a:2});\n- this.assertStep(frame,{a:1});\n- this.assertStep(frame,{a:1});\n- this.assertStep(frame,{a:0});\n- this.assertStep(frame,{a:0});\n- this.assertStep(frame,{a:0,b:2});\n- this.assertEquals(frame.resume(),2);\n }\n });\n \n@@ -1424,46 +1339,6 @@\n node = node.nextStatement(); //i<4\n this.assert(node.isBinaryOp);\n },\n- testWhileLoop: function() {\n- var fun = function() {var i=4;while(i>1){i--};var b=2};\n- var ast = fun.ast();\n- var node = ast.firstStatement(); //var i=4\n- this.assert(node.isVarDeclaration);\n- node = node.nextStatement(); //i>1\n- this.assert(node.isBinaryOp);\n- node = node.nextStatement(); //i--\n- this.assert(node.isPostOp);\n- node = node.nextStatement(); //i>1\n- this.assert(node.isBinaryOp);\n- },\n- testDoWhileLoop: function() {\n- var fun = function() {var a=3;do{a--}while(a>0);var b=2};\n- var ast = fun.ast();\n- var node = ast.firstStatement(); //var a=3\n- this.assert(node.isVarDeclaration);\n- node = node.nextStatement(); //a--\n- this.assert(node.isPostOp);\n- node = node.nextStatement(); //a>0\n- this.assert(node.isBinaryOp);\n- node = node.nextStatement(); //a--\n- this.assert(node.isPostOp);\n- },\n- testForLoopIsAfter: function() {\n- var fun = function() {var a=0;for(var i=1;i<4;i++){a=i};var b;};\n- var ast = fun.ast();\n- var node = ast.firstStatement().nextStatement(); //var i=1\n- var set = node._parent._parent.body.children[0];\n- var decl = ast.body.children[3].children[0];\n- this.assert(decl.isVarDeclaration);\n- this.assert(decl.isAfter(set), \"declaration should be after set\");\n- },\n- testPostOpStatements: function() {\n- var src = \"i++;a++\";\n- var ast = lively.ast.Parser.parse(src, \"topLevel\");\n- this.assert(ast.children[0].isPostOp);\n- this.assert(ast.children[0].nextStatement().isPostOp);\n- this.assert(ast.children[0].expr.nextStatement().isPostOp);\n- }\n });\n \n }) // end of module\n\\ No newline at end of file\n","/core/lively/ast/TestFramework.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/TestFramework.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/TestFramework.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -8,6 +8,7 @@\n var runTearDown = true;\n try {\n this.setUp();\n+ console.log(\"so\");\n this[this.currentSelector].forInterpretation().call(this);\n this.addAndSignalSuccess();\n } catch (e) {\n","/core/lively/ast/StaticAnalysis.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/StaticAnalysis.js\t2012-06-12 21:34:53.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/StaticAnalysis.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -1,12 +1,11 @@\n-module('lively.ast.StaticAnalysis').requires('lively.ast.Parser', 'lively.ide.BrowserFramework', 'lively.ide.FileParsing').toRun(function() {\n+module('lively.ast.StaticAnalysis').requires('lively.ast.Parser').toRun(function() {\n \n lively.ast.Visitor.subclass('lively.ast.DFAVisitor',\n 'analyzing helper', {\n knownGlobals: [\"true\", \"false\", \"null\", \"undefined\",\n \"Object\", \"Function\", \"String\", \"Date\", \"Math\", \"parseFloat\", \"isNaN\",\n- \"eval\", \"alert\", \"window\", \"document\", \"Node\",\n- \"HTMLCanvasElement\", \"Image\", \"Error\",\n- \"lively\", \"pt\", \"rect\", \"rgb\"],\n+ \"eval\", \"window\", \"document\", \"Node\",\n+ \"HTMLCanvasElement\", \"Image\"],\n newScope: function() {\n return this.current = this.current\n ? this.current.newScope()\n@@ -29,7 +28,7 @@\n 'visiting', {\n visitVariable: function(node) {\n if (this.knownGlobals.include(node.name)) return;\n- if (this.current.isDeclaration(node)) {\n+ if (node._parent.isFunction) {\n this.current.define(node);\n } else if (node._parent.isSet) {\n this.current.define(node);\n@@ -73,15 +72,9 @@\n visitCall: function(node) { this.visitParts(node, ['fn', 'args*']) },\n visitNew: function(node) { this.visitParts(node, ['clsExpr']) },\n visitThrow: function(node) { this.visitParts(node, ['expr']) },\n- visitTryCatchFinally: function(node) {\n- this.visitParts(node, ['trySeq']);\n- this.current = this.newScope();\n- this.visitParts(node, ['err', 'catchSeq']);\n- this.current = this.current.parent;\n- this.visitParts(node, ['finallySeq']);\n- },\n+ visitTryCatchFinally: function(node) { this.visitParts(node, ['trySeq', 'catchSeq', 'finallySeq']) },\n visitFunction: function(node) {\n- this.current = this.newScope();\n+ var funcScope = this.newScope();\n this.visitParts(node, ['args*', 'body']);\n this.current = this.current.parent;\n },\n@@ -102,7 +95,7 @@\n },\n 'helping', {\n isDeclaration: function(node) {\n- return node.isVarDeclaration || node._parent.isFunction || node._parent.isTryCatchFinally;\n+ return node.isVarDeclaration || node._parent.isFunction;\n },\n },\n 'accessing', {\n@@ -151,8 +144,7 @@\n var chain = this.lookup_def(varnode.name);\n if (chain) {\n chain.push(varnode);\n- }\n- if (!this.lookup_decl(varnode.name)) {\n+ } else {\n this.global_uses.push(varnode);\n }\n },\n@@ -160,7 +152,7 @@\n var res = [];\n res.pushAll(this.global_uses);\n this.scopes.each(function(s) {\n- res.pushAll(s.allGlobalUses());\n+ res.pushAll(s.allGlobalUses()); \n });\n return res;\n },\n@@ -168,7 +160,7 @@\n var res = [];\n res.pushAll(this.global_defs);\n this.scopes.each(function(s) {\n- res.pushAll(s.allGlobalDefs());\n+ res.pushAll(s.allGlobalDefs()); \n });\n return res;\n },\n@@ -191,74 +183,5 @@\n return this.findGlobalVariablesInAST(this.parse(source));\n },\n });\n-cop.create('AdvancedSyntaxHighlighting').refineClass(lively.morphic.Text, {\n- highlightGlobals: function(target, ast) {\n- var analyzer = new lively.ast.VariableAnalyzer();\n- var globals = analyzer.findGlobalVariablesInAST(ast);\n- globals.each(function(g) {\n- target.emphasize(AdvancedSyntaxHighlighting.globalStyle, g.pos[0], g.pos[1]);\n- });\n- },\n- applyHighlighterRules: function(target, highlighterRules) {\n- cop.proceed(target, highlighterRules);\n- if (this.specialHighlighting == \"none\") return;\n- try {\n- var rule = this.specialHighlighting ? this.specialHighlighting : 'topLevel';\n- var ast = lively.ast.Parser.parse(this.textString, rule);\n- this.parseErrors = null;\n- this.highlightGlobals(target, ast);\n- } catch (e) {\n- this.parseErrors = [e];\n- this.doNotSerialize.push('parseErrors');\n- target.emphasize(AdvancedSyntaxHighlighting.errorStyle, e[3], this.textString.length);\n- }\n- },\n- boundEval: function(str) {\n- if (this.specialHighlighting == \"none\") return cop.proceed(str);\n- try {\n- var rule = this.specialHighlighting ? this.specialHighlighting : 'topLevel';\n- lively.ast.Parser.parse(str, rule);\n- } catch (e) {\n- var st = this.setStatus || this.displayStatus;\n- if (st) st.apply(this, OMetaSupport.handleErrorDebug(e[0], e[1], e[2], e[3]));\n- return null;\n- }\n- return cop.proceed(str);\n- },\n-}).refineClass(lively.ide.BasicBrowser, {\n- onSourceStringUpdate: function(methodString, source) {\n- var node = this.selectedNode();\n- var textMorph = this.panel.sourcePane.innerMorph();\n- if (node && node.target.specialHighlighting) {\n- textMorph.specialHighlighting = node.target.specialHighlighting();\n- } else {\n- textMorph.specialHighlighting = \"none\";\n- }\n- cop.proceed(methodString, source);\n- },\n-}).refineClass(lively.ide.FileFragment, {\n- specialHighlighting: function() {\n- if ([\"klassDef\", \"objectDef\", \"klassExtensionDef\", \"moduleDef\"].include(this.type))\n- return \"topLevel\";\n- if (this.type == \"propertyDef\") return \"memberFragment\";\n- if (this.type == \"categoryDef\") return \"categoryFragment\";\n- if (this.type == \"traitDef\") return \"traitFragment\";\n- return \"none\";\n- },\n- reparseAndCheck: function(newSource) {\n- try {\n- lively.ast.Parser.parse(newSource, this.specialHighlighting());\n- } catch (e) {\n- throw OMetaSupport.handleErrorDebug(e[0], e[1], e[2], e[3]/*src, rule, msg, idx*/);\n- }\n- var newFragment = cop.proceed(newSource);\n- return newFragment;\n- }\n-})\n-.beGlobal();\n \n-Object.extend(AdvancedSyntaxHighlighting, {\n- errorStyle: { backgroundColor: Color.web.salmon.lighter() },\n- globalStyle: { color: Color.red }\n-});\n-});\n+}) // end of module\n\\ No newline at end of file\n","/core/lively/ast/Parser.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/Parser.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/Parser.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -50,13 +50,13 @@\n basicParse: function(source, rule) {\n // first call the LKJSParser. this will result in a synbolic AST tree.\n // translate this into real AST objects using JSTranslator\n- var errorHandler = function() { throw $A(arguments) };\n+ function errorHandler() { alert(OMetaSupport.handleErrorDebug.apply(OMetaSupport, arguments)) }\n var intermediate = OMetaSupport.matchAllWithGrammar(this.jsParser, rule, source, errorHandler);\n if (!intermediate || Object.isString(intermediate))\n- throw [source, rule, 'Could not parse JS source code', 0, intermediate];\n+ throw new Error('Could not parse JS source code: ' + intermediate);\n var ast = OMetaSupport.matchWithGrammar(this.astTranslator, 'trans', intermediate);\n if (!ast || Object.isString(ast))\n- throw [source, rule, 'Could not translate symbolic AST tree', 0, intermediate, ast];\n+ throw new Error('Could not translate symbolic AST tree: ' + ast);\n return ast;\n },\n \n@@ -149,6 +149,7 @@\n isAfter: function(other) {\n var that = this, first = null;\n this.parentFunction().body.withAllChildNodesDo(function(node) {\n+ if (node.isFor || node.isForIn || node.isWhile || node.isDoWhile) return false;\n if (!first) {\n if (node === that) first = that;\n if (node === other) first = other;\n@@ -254,59 +255,22 @@\n \n },\n 'stepping', {\n+\n firstStatement: function() {\n return this;\n },\n+\n nextStatement: function(node) {\n- var stmt = this.getParent().nextStatement(this);\n+ var stmt = this.getParent().parentComposite().nextStatement(this)\n return stmt ? stmt.firstStatement() : null;\n },\n+\n+ parentComposite: function() {\n+ return this.isComposite() ? this : this.getParent().parentComposite();\n+ },\n isComposite: function() {\n return false;\n }\n-},\n-'matching', {\n- match: function(patternAst) {\n- var matchedPlaceholder = true;\n- for (var key in patternAst) {\n- var result = this.matchVal(key, this[key], patternAst[key]);\n- if (result !== true) matchedPlaceholder = result;\n- }\n- return matchedPlaceholder;\n- },\n- matchVal: function(key, value, pattern) {\n- if (pattern === lively.ast.Node.placeholder) return value;\n- if (value == pattern) return true;\n- if (Object.isString(pattern)) {\n- if (value.toString() == pattern) return true;\n- if (value.value == pattern) return true;\n- if (value.name == pattern) return true;\n- }\n- if (Object.isArray(pattern) && Object.isArray(value)) {\n- var matchedPlaceholder = true;\n- for (var i = 0; i < pattern.length; i++) {\n- var success = false;\n- var lastError = null;\n- for (var j = 0; j < value.length; j++) {\n- try {\n- var res = this.matchVal(key, value[j], pattern[i]);\n- if (res !== true) matchedPlaceholder = res;\n- success = true;\n- } catch(e) { lastError = e; }\n- }\n- if (!success) throw lastError;\n- }\n- if (value.length !== pattern.length) {\n- throw {key: key, err: \"count\",\n- expected: pattern.length, actual: value.length};\n- }\n- return matchedPlaceholder;\n- }\n- if (Object.isObject(pattern) && value.isASTNode) {\n- return value.match(pattern);\n- }\n- throw {key: key, err: \"missmatch\", expected: String(pattern), actual: String(value)};\n- }\n });\n \n Object.subclass('lively.ast.SourceGenerator',\n@@ -489,23 +453,6 @@\n this.condExpr.asJS(depth), this.body.asJS(depth));\n },\n },\n- stepping: {\n- firstStatement: function() {\n- return this.condExpr.firstStatement();\n- },\n- nextStatement: function($super, node) {\n- if (node === this.condExpr) {\n- return this.body;\n- } else if (node === this.body) {\n- return this.condExpr;\n- } else {\n- return $super(this);\n- }\n- },\n- isComposite: function() {\n- return true;\n- }\n- },\n },\n \n 'doWhile': {\n@@ -523,29 +470,12 @@\n this.body.asJS(depth), this.condExpr.asJS(depth));\n },\n },\n- stepping: {\n- firstStatement: function() {\n- return this.body.firstStatement();\n- },\n- nextStatement: function($super, node) {\n- if (node === this.condExpr) {\n- return this.body;\n- } else if (node === this.body) {\n- return this.condExpr;\n- } else {\n- return $super(this);\n- }\n- },\n- isComposite: function() {\n- return true;\n- }\n- },\n },\n \n 'for': {\n- className: 'For', rules: [':pos', 'trans:init', 'trans:condExpr', 'trans:body', 'trans:upd'],\n+ className: 'For', rules: [':pos', 'trans:init', 'trans:condExpr', 'trans:upd', 'trans:body'],\n debugging: {\n- printConstruction: function() { return this.printConstructorCall(this.pos, this.init, this.condExpr, this.body, this.upd) },\n+ printConstruction: function() { return this.printConstructorCall(this.pos, this.init, this.condExpr, this.upd, this.body) },\n toString: function() { return Strings.format(\n '%s(%s;%s;%s do %s)',\n this.constructor.name, this.init, this.condExpr, this.upd, this.body) },\n@@ -874,9 +804,9 @@\n },\n \n 'try': {\n- className: 'TryCatchFinally', rules: [':pos', 'trans:trySeq', 'trans:err', 'trans:catchSeq', 'trans:finallySeq'],\n+ className: 'TryCatchFinally', rules: [':pos', 'trans:trySeq', ':errName', 'trans:catchSeq', 'trans:finallySeq'],\n debugging: {\n- printConstruction: function() { return this.printConstructorCall(this.pos, this.trySeq, '\"'+this.err.name+'\"', this.catchSeq, this.finallySeq) },\n+ printConstruction: function() { return this.printConstructorCall(this.pos, this.trySeq, '\"'+this.errName+'\"', this.catchSeq, this.finallySeq) },\n toString: function() {\n return Strings.format(\n '%s(%s %s %s)',\n@@ -889,7 +819,7 @@\n indent = this.indent(depth),\n str = 'try {\\n' + indent + this.trySeq.asJS(depth) + '\\n' + baseIndent + '}';\n if (!this.isUndefined(this.catchSeq))\n- str += ' catch(' + this.err.name + ') {\\n' +\n+ str += ' catch(' + this.errName + ') {\\n' +\n indent + this.catchSeq.asJS(depth) + '\\n' + baseIndent + '}';\n if (!this.isUndefined(this.finallySeq))\n str += ' finally {\\n' + indent + this.finallySeq.asJS(depth) + '\\n' + baseIndent + '}';\n@@ -1259,9 +1189,6 @@\n return parseResult;\n },\n });\n-Object.extend(lively.ast.Node, {\n- placeholder: {},\n-});\n \n \n \n","/core/lively/ast/LivelyJSParser.ometa":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/LivelyJSParser.ometa\t2012-06-14 10:17:00.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/LivelyJSParser.ometa\t2012-05-13 22:32:29.000000000 +0200\n@@ -1,230 +1,215 @@\n-ometa LivelyJSParser <: Parser {\r\n-whereAreYou -> {\r\n-\tvar charsBefore = 120, charsAfter = 120, src = this._originalInput.arr,\r\n-\t\tstartIndex = Math.max(0, this.pos() - charsBefore),\r\n-\t\tstopIndex = Math.min(src.length, this.pos() + charsAfter),\r\n-\t\tmsg = src.substring(startIndex, this.pos()) + '<--I am here-->' + src.substring(this.pos(), stopIndex);\r\n-\tmsg += '\\nRules: ' + this._ruleStack;\r\n-\tmsg += '\\nStack: ' + this.stack;\r\n-\talert(msg);\r\n-\ttrue\r\n-},\r\n-fromTo :x :y = seq(x) (~seq(y) char)* seq(y), \r\n-fromToWithout :x :y = seq(x) (~seq(y) char)*,\r\n-space = ^space | fromToWithout('//', '\\n') | fromTo('//', #end) | fromTo('/*', '*/'),\r\n-nameFirst = letter | '$' | '_',\r\n-nameRest = nameFirst | digit,\r\n-iName =\r\n-\tfirstAndRest(#nameFirst, #nameRest):r -> r.join(''),\r\n-isKeyword :x = ?LivelyJSParser._isKeyword(x),\r\n-name =\r\n-\tpos:p1 iName:n ~isKeyword(n) pos:p2 -> [#name, [p1, p2], n],\r\n-keyword\t= \r\n-\tpos:p1 iName:k isKeyword(k) pos:p2 -> [k, [p1, p2], k],\r\n-hexDigit\r\n-\t= char:x {this.hexDigits.indexOf(x.toLowerCase())}:v ?(v >= 0)\r\n-\t-> v,\r\n-hexLit =\r\n-\thexLit:n hexDigit:d -> (n * 16 + d)\r\n-\t| hexDigit,\r\n-number =\r\n-\tpos:p1 (\r\n-\t``0x'' hexLit:n pos:p2 -> [#number, [p1, p2], n]\r\n-\t| '.' digit+:fs pos:p2 -> [#number, [p1, p2], parseFloat('.' + fs.join(''))]\r\n-\t| digit+:ws ('.' digit+ | empty -> []):fs ('e' ('+' | '-' | empty -> ''):sig digit+ | empty -> []):exp pos:p2\r\n-\t\t-> [#number, [p1, p2], parseFloat(ws.join('') + '.' + fs.join('') + 'e' + sig + exp.join(''))]),\r\n-escapeChar =\r\n-\t'\\\\' char:c\r\n-\t-> unescape('\\\\' + c),\r\n-str =\r\n-\tpos:p1 (\r\n-\t\tseq('\"\"\"') (escapeChar | ~seq('\"\"\"') char)*:cs seq('\"\"\"') pos:p2 -> [#string, [p1, p2], cs.join('')]\r\n-\t\t| '\\'' (escapeChar | ~'\\'' char)*:cs '\\'' pos:p2 -> [#string, [p1, p2], cs.join('')]\r\n-\t\t| '\"' (escapeChar | ~'\"' char)*:cs '\"' pos:p2 -> [#string, [p1, p2], cs.join('')]\r\n-\t\t| ('#' | '`') iName:n pos:p2 -> [#string, [p1, p2], n]),\r\n-special =\r\n-\tpos:p1 ( '(' | ')' | '{' | '}' | '[' | ']' | ',' | ';'\r\n-\t| '?' | ':' | ``!=='' | ``!='' | ``==='' | ``=='' | ``='' | ``>>>''\r\n-\t| ``>>='' | ``>='' | ``>>'' | '>' | ``<<='' | ``<='' | ``<<'' | '<'\r\n-\t| ``++'' | ``+='' | '+' | ``--'' | ``-='' | '-' | ``*='' | '*'\r\n-\t| ``/='' | '/' | ``%='' | '%' | ``&&='' | ``&&'' | ``||='' | ``||'' \r\n-\t| '.' | '!' | '&' | '|' | '^'):s pos:p2\r\n-\t-> [s, [p1, p2], s],\r\n-tok =\r\n-\tspaces (name | keyword | number | str | special),\r\n-toks =\r\n-\ttoken*:ts spaces end\r\n-\t-> ts,\r\n-token :tt = tok:t ?(t[0] == tt) -> { t[2] }, // we return t[2] not t[1] because t[1] is the pos\r\n-spacesNoNl = (~'\\n' space)*,\r\n-expr =\r\n-\tpos:p1 expr:f ',' exprPart:s pos:p2\t-> [#begin, [p1, p2], f,s]\r\n- | exprPart,\r\n-exprPart =\r\n-\tpos:p1 ternaryExpr:e (\r\n-\t\t\"?\" exprPart:t \":\" exprPart:f pos:p2\t\t\t-> [#condExpr, [p1, p2], e, t, f]\r\n-\t\t| \"=\" exprPart:rhs pos:p2\t\t\t-> [#set, [p1, p2], e, rhs]\r\n-\t\t| \"+=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"+\", rhs]\r\n-\t\t| \"-=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"-\", rhs]\r\n-\t\t| \"*=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"*\", rhs]\r\n-\t\t| \"/=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"/\", rhs]\r\n-\t\t| \"%=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"%\", rhs]\r\n-\t\t| \"&=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"&\", rhs]\r\n-\t\t| \"&&=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"&&\", rhs]\r\n-\t\t| \"|=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"|\", rhs]\r\n-\t\t| \"||=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"||\", rhs]\r\n-\t\t| \"^=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"^\", rhs]\r\n-\t\t| \">>=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \">>\", rhs]\r\n-\t\t| \"<<=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"<<\", rhs]\r\n-\t\t| \">>>=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \">>>\", rhs]\r\n-\t\t| empty\t\t\t\t\t\t\t\t\t-> e\r\n-\t),\r\n-ternaryExpr =\r\n-\tpos:p1 orExpr:e (\r\n-\t \"?\" orExpr:t \":\" orExpr:f pos:p2\t-> [#condExpr, [p1, p2], e, t, f]\r\n-\t\t| empty\t\t\t\t\t\t\t\t-> e\r\n-\t),\r\n-orExpr =\r\n-\tpos:p1 orExpr:x \"||\" andExpr:y pos:p2 -> [#binop, [p1, p2], \"||\", x, y]\r\n-\t| andExpr,\r\n-andExpr =\r\n-\tpos:p1 andExpr:x \"&&\" bitOrExpr:y pos:p2 -> [#binop, [p1, p2], \"&&\", x, y]\r\n-\t| bitOrExpr,\r\n-bitOrExpr =\r\n-\tpos:p1 bitXorExpr:x \"|\" bitOrExpr:y pos:p2 -> [#binop, [p1, p2], \"|\", x, y]\r\n-\t| bitXorExpr,\r\n-bitXorExpr =\r\n-\tpos:p1 bitAndExpr:x \"^\" bitXorExpr:y pos:p2 -> [#binop, [p1, p2], \"^\", x, y]\r\n-\t| bitAndExpr,\r\n-bitAndExpr =\r\n-\tpos:p1 eqExpr:x \"&\" bitAndExpr:y pos:p2 -> [#binop, [p1, p2], \"&\", x, y]\r\n-\t| eqExpr,\r\n-eqExpr =\r\n-\tpos:p1 eqExpr:x (\"==\" | \"!=\" | \"===\" | \"!==\"):op relExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\r\n-\t| relExpr,\r\n-relExpr =\r\n-\tpos:p1 relExpr:x (\">\" | \">=\" | \"<\" | \"<=\" | \"instanceof\" | \"in\"):op shiftExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\r\n-\t| shiftExpr,\r\n-shiftExpr =\r\n-\tpos:p1 shiftExpr:x (\">>\" | \"<<\" | \">>>\"):op addExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\r\n-\t| addExpr,\r\n-addExpr =\r\n-\tpos:p1 addExpr:x (\"+\" | \"-\"):op mulExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\r\n-\t| mulExpr,\r\n-mulExpr =\r\n-\tpos:p1 mulExpr:x (\"*\" | \"\\/\" | \"%\"):op unary:y pos:p2 -> [#binop, [p1, p2], op, x, y]\r\n-\t| unary,\r\n-unary =\r\n-\tpos:p1 (\"-\" postfix:p pos:p2 -> [#unop, [p1, p2], \"-\", p]\r\n-\t\t| \"+\" postfix:p pos:p2 -> [#unop, [p1, p2], \"+\", p]\r\n-\t\t| \"++\" postfix:p pos:p2 -> [#preop, [p1, p2], \"++\", p]\r\n-\t\t| \"--\" postfix:p pos:p2 -> [#preop, [p1, p2], \"--\", p]\r\n-\t\t| \"!\" unary:p pos:p2 -> [#unop, [p1, p2], \"!\", p]\r\n-\t\t| \"void\" unary:p pos:p2 -> [#unop, [p1, p2], \"void\", p]\r\n-\t\t| \"delete\" unary:p pos:p2 -> [#unop, [p1, p2], \"delete\", p]\r\n-\t\t| \"typeof\" unary:p pos:p2 -> [#unop, [p1, p2], \"typeof\", p])\r\n-\t| postfix,\r\n-postfix =\r\n-\tpos:p1 callExpr:p ( spacesNoNl \"++\" pos:p2\t-> [#postop, [p1, p2], \"++\", p]\r\n-\t\t| spacesNoNl \"--\" pos:p2\t\t\t-> [#postop, [p1, p2], \"--\", p]\r\n-\t\t| empty\t\t\t\t\t\t\t-> p\r\n-\t),\r\n-args = \"(\" listOf(#exprPart, ','):as \")\" -> as,\r\n-callExpr =\r\n-\tpos:p1 callExpr:p (\r\n-\t\targs:as pos:p2\t\t\t\t-> [#call, [p1, p2], p].concat(as)\r\n-\t\t| \".\" pos:p3 \"name\":m pos:p4 args:as pos:p2\t-> [#send, [p1, p2], [#string, [p3,p4], m], p].concat(as)\r\n-\t\t| \"[\" expr:i \"]\" args:as pos:p2 -> [#send, [p1, p2], i, p].concat(as)\r\n-\t\t| \"[\" expr:i \"]\" pos:p2\t\t\t-> [#getp, [p1, p2], i, p]\r\n-\t\t| \".\" pos:p3 \"name\":f pos:p2\t-> [#getp, [p1, p2], [#string, [p3,p2], f], p]\r\n-\t\t)\r\n-\t| primExpr,\r\n-memberExpr =\r\n-\tpos:p1 memberExpr:p (\r\n-\t\t\"[\" expr:i \"]\" pos:p2\t\t\t\t-> [#getp, [p1, p2], i, p]\r\n-\t\t| \".\" pos:p3 \"name\":f pos:p2\t\t-> [#getp, [p1, p2], [#string, [p3,p2], f], p]\r\n-\t\t)\r\n-\t| primExpr,\r\n-primExpr =\r\n-\t\"(\" expr:e \")\" -> e\r\n-\t| spaces pos:p1 (\r\n-\t\t\"this\" pos:p2\t\t\t\t\t\t\t\t\t\t\t-> [#this, [p1, p2]]\r\n-\t\t| \"new\" pos:p3 memberExpr:e (args | empty -> []):as pos:p2\t-> [#new, [p1, p2], [#call, [p3, p2], e].concat(as)]\r\n-\t\t| \"name\":n pos:p2\t\t\t\t\t\t\t\t\t\t-> [#get, [p1, p2], n]\r\n-\t\t| \"number\":n pos:p2\t\t\t\t\t\t\t\t\t\t-> [#number, [p1, p2], n]\r\n-\t\t| \"string\":s pos:p2\t\t\t\t\t\t\t\t\t\t-> [#string, [p1, p2], s]\r\n-\t\t| \"function\" (\"name\" | empty) funcRest\r\n-\t\t| \"[\" listOf(#exprPart, ','):es (\",\" | empty) \"]\"\tpos:p2\t-> [#arr, [p1, p2]].concat(es)\r\n-\t\t| \"/\" (escapeChar | ~'\\/' char)*:e \"/\" letter*:f pos:p2\t-> [#regex, [p1, p2], e.join(''), f.join('')]\r\n-\t )\r\n-\t| json,\r\n-\r\n-json =\r\n-\tpos:p1 \"{\" listOf(#jsonBinding, ','):bs (\",\" | empty) \"}\" pos:p2\r\n-\t-> [#json, [p1, p2]].concat(bs),\r\n-\r\n-jsonBinding =\r\n-\tpos:p1 jsonPropName:n \":\" exprPart:v pos:p2\r\n-\t-> [#binding, [p1, p2], n, v],\r\n-jsonPropName = \"name\" | \"number\" | \"string\",\r\n-memberFragment = spaces jsonBinding:jb (',' | empty) spaces end -> jb,\r\n-categoryFragment = spaces pos:p1 listOf(#exprPart, ','):es pos:p2 (\",\" | empty) spaces end -> [#arr, [p1, p2]].concat(es),\r\n-traitFragment = spaces pos:p1 \"name\" \"(\" spaces listOf(#exprPart, ','):es spaces \")\" spaces sc pos:p2 spaces end -> [#arr, [p1, p2]].concat(es),\r\n-formal = spaces pos:p1 \"name\":n pos:p2 -> [#get, [p1, p2], n],\r\n-funcRest =\r\n-\tpos: p1 \"(\" listOf(#formal, ','):args \")\" \"{\" srcElems:body \"}\" pos:p2\r\n-\t-> [#func, [p1, p2], body].concat(args),\r\n-sc =\r\n-\tspacesNoNl ('\\n' | &'}' | end) | \";\",\r\n-binding =\r\n-\tpos:p1 \"name\":n ( \"=\" exprPart | empty pos:p -> [#get, [p, p], 'undefined'] ):v pos:p2\r\n-\t-> [#var, [p1, p2], n, v],\r\n-bindingList =\r\n-\tpos:p1 listOf(#binding, ','):bs pos:p2\t-> [#begin, [p1, p2]].concat(bs),\r\n-block =\r\n-\t\"{\" srcElems:ss \"}\"\r\n-\t-> ss,\r\n-stmt =\r\n-\tblock\r\n-\t| spaces pos:p1 (\r\n-\t\t\"var\" bindingList:bs sc pos:p2\t-> bs\r\n-\t\t| \"if\" \"(\" expr:c \")\" stmt:t\r\n-\t\t\t( \"else\" stmt\r\n-\t\t | empty pos:p -> [#get, [p,p], 'undefined']\r\n-\t\t\t):f (sc | empty) pos:p2\t\t\t\t\t-> [#if, [p1, p2], c, t, f]\r\n-\t\t| \"while\" \"(\" expr:c \")\" stmt:s pos:p2\t\t-> [#while, [p1, p2], c, s]\r\n-\t\t| \"do\" stmt:s \"while\" \"(\" expr:c \")\" sc pos:p2 -> [#doWhile, [p1, p2], s, c]\r\n-\t\t| \"for\" \"(\"\r\n-\t\t\t( \"var\" bindingList | expr | empty pos:p -> [#get, [p, p], 'undefined'] ):i\r\n-\t\t\t\";\" ( expr | empty pos:p -> [#get, [p, p], 'true'] ):c\r\n-\t\t\t\";\" ( expr | empty pos:p -> [#get, [p, p], 'undefined'] ):u\r\n-\t\t\t\")\" stmt:s pos:p2\t\t\t\t\t\t-> [#for, [p1, p2], i, c, s, u]\r\n-\t\t| \"for\" \"(\"\r\n-\t\t\t( pos:p3 ( \"var\" \"name\":n pos:p4 -> [#var, [p3, p4], n, [#get, [p3, p3], 'undefined']] ) | \"name\":n pos:p4 -> [#get, [p3, p4], n] ):v\r\n-\t\t\t\"in\" expr:e \")\" stmt:s pos:p2\t\t\t-> [#forIn, [p1, p2], v, e, s]\r\n-\t\t| \"switch\" \"(\" expr:e \")\" \"{\"\r\n-\t\t\t( pos:p3 \"case\" expr:c \":\" srcElems:cs pos:p4 -> [#case, [p3, p4], c, cs]\r\n-\t\t\t| pos:p3 \"default\" \":\" srcElems:cs pos:p4 -> [#default, [p3, p4], cs] )*:cs\r\n-\t\t\t\"}\" pos:p2\t\t\t\t\t\t\t\t-> [#switch, [p1, p2], e].concat(cs)\r\n-\t\t| \"break\" sc pos:p2\t\t\t\t\t\t\t-> [#break, [p1, p2]]\r\n-\t\t| \"debugger\" sc pos:p2\t\t\t\t\t\t\t-> [#debugger, [p1, p2]]\r\n-\t\t| \"continue\" sc pos:p2\t\t\t\t\t\t-> [#continue, [p1, p2]]\r\n-\t\t| \"throw\" spacesNoNl expr:e sc pos:p2\t\t-> [#throw, [p1, p2], e]\r\n-\t\t| \"try\" block:t\r\n-\t\t\t( \"catch\" \"(\" formal:e \")\" block | ( empty pos:p -> [#get, [p,p], 'undefined'] ):e ):c\r\n-\t\t\t( \"finally\" block | empty pos:p -> [#get, [p,p], 'undefined'] ):f sc pos:p2\r\n-\t\t\t-> [#try, [p1, p2], t, e, c, f]\r\n-\t\t| \"return\" ( expr | empty pos:p -> [#get, [p,p], 'undefined'] ):e sc pos:p2 -> [#return, [p1, p2], e]\r\n-\t\t| \"with\" \"(\" expr:x \")\" stmt:s pos:p2\t\t-> [#with, [p1, p2], x, s]\r\n-\t\t| expr:e sc\t\t\t\t\t\t\t\t\t-> e\r\n-\t\t| \";\" pos:p2\t\t\t\t\t\t\t\t-> [#get, [p1, p2], \"undefined\"]),\r\n-srcElem =\r\n-\tpos:p1 \"function\" \"name\":n funcRest:f pos:p2 -> [#var, [p1,p2], n, f]\r\n-\t| stmt,\r\n-srcElems =\r\n-\tpos:p1 srcElem*:ss pos:p2\r\n-\t-> [#begin, [p1,p2]].concat(ss),\r\n-topLevel =\r\n-\tsrcElems:r spaces end\r\n-\t-> r\r\n+ometa LivelyJSParser <: Parser {\n+whereAreYou -> {\n+\tvar charsBefore = 120, charsAfter = 120, src = this._originalInput.arr,\n+\t\tstartIndex = Math.max(0, this.pos() - charsBefore),\n+\t\tstopIndex = Math.min(src.length, this.pos() + charsAfter),\n+\t\tmsg = src.substring(startIndex, this.pos()) + '<--I am here-->' + src.substring(this.pos(), stopIndex);\n+\tmsg += '\\nRules: ' + this._ruleStack;\n+\tmsg += '\\nStack: ' + this.stack;\n+\talert(msg);\n+\ttrue\n+},\n+fromTo :x :y = seq(x) (~seq(y) char)* seq(y), \n+space = ^space | fromTo('//', '\\n') | fromTo('//', #end) | fromTo('/*', '*/'),\n+nameFirst = letter | '$' | '_',\n+nameRest = nameFirst | digit,\n+iName =\n+\tfirstAndRest(#nameFirst, #nameRest):r -> r.join(''),\n+isKeyword :x = ?LivelyJSParser._isKeyword(x),\n+name =\n+\tpos:p1 iName:n ~isKeyword(n) pos:p2 -> [#name, [p1, p2], n],\n+keyword\t= \n+\tpos:p1 iName:k isKeyword(k) pos:p2 -> [k, [p1, p2], k],\n+hexDigit\n+\t= char:x {this.hexDigits.indexOf(x.toLowerCase())}:v ?(v >= 0)\n+\t-> v,\n+hexLit =\n+\thexLit:n hexDigit:d -> (n * 16 + d)\n+\t| hexDigit,\n+number =\n+\tpos:p1 (\n+\t``0x'' hexLit:n pos:p2 -> [#number, [p1, p2], n]\n+\t| '.' digit+:fs pos:p2 -> [#number, [p1, p2], parseFloat('.' + fs.join(''))]\n+\t| digit+:ws ('.' digit+ | empty -> []):fs ('e' ('+' | '-' | empty -> ''):sig digit+ | empty -> []):exp pos:p2\n+\t\t-> [#number, [p1, p2], parseFloat(ws.join('') + '.' + fs.join('') + 'e' + sig + exp.join(''))]),\n+escapeChar =\n+\t'\\\\' char:c\n+\t-> unescape('\\\\' + c),\n+str =\n+\tpos:p1 (\n+\t\tseq('\"\"\"') (escapeChar | ~seq('\"\"\"') char)*:cs seq('\"\"\"') pos:p2 -> [#string, [p1, p2], cs.join('')]\n+\t\t| '\\'' (escapeChar | ~'\\'' char)*:cs '\\'' pos:p2 -> [#string, [p1, p2], cs.join('')]\n+\t\t| '\"' (escapeChar | ~'\"' char)*:cs '\"' pos:p2 -> [#string, [p1, p2], cs.join('')]\n+\t\t| ('#' | '`') iName:n pos:p2 -> [#string, [p1, p2], n]),\n+special =\n+\tpos:p1 ( '(' | ')' | '{' | '}' | '[' | ']' | ',' | ';'\n+\t| '?' | ':' | ``!=='' | ``!='' | ``==='' | ``=='' | ``='' | ``>>>''\n+\t| ``>>='' | ``>='' | ``>>'' | '>' | ``<<='' | ``<='' | ``<<'' | '<'\n+\t| ``++'' | ``+='' | '+' | ``--'' | ``-='' | '-' | ``*='' | '*'\n+\t| ``/='' | '/' | ``%='' | '%' | ``&&='' | ``&&'' | ``||='' | ``||'' \n+\t| '.' | '!' | '&' | '|' | '^'):s pos:p2\n+\t-> [s, [p1, p2], s],\n+tok =\n+\tspaces (name | keyword | number | str | special),\n+toks =\n+\ttoken*:ts spaces end\n+\t-> ts,\n+token :tt = tok:t ?(t[0] == tt) -> { t[2] }, // we return t[2] not t[1] because t[1] is the pos\n+spacesNoNl = (~'\\n' space)*,\n+expr =\n+\tpos:p1 expr:f ',' exprPart:s pos:p2\t-> [#begin, [p1, p2], f,s]\n+ | exprPart,\n+exprPart =\n+\tpos:p1 orExpr:e (\n+\t\t\"?\" exprPart:t \":\" exprPart:f pos:p2\t\t\t-> [#condExpr, [p1, p2], e, t, f]\n+\t\t| \"=\" exprPart:rhs pos:p2\t\t\t-> [#set, [p1, p2], e, rhs]\n+\t\t| \"+=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"+\", rhs]\n+\t\t| \"-=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"-\", rhs]\n+\t\t| \"*=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"*\", rhs]\n+\t\t| \"/=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"/\", rhs]\n+\t\t| \"%=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"%\", rhs]\n+\t\t| \"&=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"&\", rhs]\n+\t\t| \"&&=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"&&\", rhs]\n+\t\t| \"|=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"|\", rhs]\n+\t\t| \"||=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"||\", rhs]\n+\t\t| \"^=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"^\", rhs]\n+\t\t| \">>=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \">>\", rhs]\n+\t\t| \"<<=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \"<<\", rhs]\n+\t\t| \">>>=\" exprPart:rhs pos:p2\t\t\t-> [#mset, [p1, p2], e, \">>>\", rhs]\n+\t\t| empty\t\t\t\t\t\t\t\t\t-> e\n+\t),\n+orExpr =\n+\tpos:p1 orExpr:x \"||\" andExpr:y pos:p2 -> [#binop, [p1, p2], \"||\", x, y]\n+\t| andExpr,\n+andExpr =\n+\tpos:p1 andExpr:x \"&&\" bitExpr:y pos:p2 -> [#binop, [p1, p2], \"&&\", x, y]\n+\t| bitExpr,\n+bitExpr =\n+\tpos:p1 relExpr:x (\"&\" | \"|\" | \"^\"):op eqExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\n+\t| eqExpr,\n+eqExpr =\n+\tpos:p1 eqExpr:x (\"==\" | \"!=\" | \"===\" | \"!==\"):op relExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\n+\t| relExpr,\n+relExpr =\n+\tpos:p1 relExpr:x (\">\" | \">=\" | \"<\" | \"<=\" | \"instanceof\" | \"in\"):op shiftExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\n+\t| shiftExpr,\n+shiftExpr =\n+\tpos:p1 shiftExpr:x (\">>\" | \"<<\" | \">>>\"):op addExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\n+\t| addExpr,\n+addExpr =\n+\tpos:p1 addExpr:x (\"+\" | \"-\"):op mulExpr:y pos:p2 -> [#binop, [p1, p2], op, x, y]\n+\t| mulExpr,\n+mulExpr =\n+\tpos:p1 mulExpr:x (\"*\" | \"\\/\" | \"%\"):op unary:y pos:p2 -> [#binop, [p1, p2], op, x, y]\n+\t| unary,\n+unary =\n+\tpos:p1 (\"-\" postfix:p pos:p2 -> [#unop, [p1, p2], \"-\", p]\n+\t\t| \"+\" postfix:p pos:p2 -> [#unop, [p1, p2], \"+\", p]\n+\t\t| \"++\" postfix:p pos:p2 -> [#preop, [p1, p2], \"++\", p]\n+\t\t| \"--\" postfix:p pos:p2 -> [#preop, [p1, p2], \"--\", p]\n+\t\t| \"!\" unary:p pos:p2 -> [#unop, [p1, p2], \"!\", p]\n+\t\t| \"void\" unary:p pos:p2 -> [#unop, [p1, p2], \"void\", p]\n+\t\t| \"delete\" unary:p pos:p2 -> [#unop, [p1, p2], \"delete\", p]\n+\t\t| \"typeof\" unary:p pos:p2 -> [#unop, [p1, p2], \"typeof\", p])\n+\t| postfix,\n+postfix =\n+\tpos:p1 callExpr:p ( spacesNoNl \"++\" pos:p2\t-> [#postop, [p1, p2], \"++\", p]\n+\t\t| spacesNoNl \"--\" pos:p2\t\t\t-> [#postop, [p1, p2], \"--\", p]\n+\t\t| empty\t\t\t\t\t\t\t-> p\n+\t),\n+args = \"(\" listOf(#exprPart, ','):as \")\" -> as,\n+callExpr =\n+\tpos:p1 callExpr:p (\n+\t\targs:as pos:p2\t\t\t\t-> [#call, [p1, p2], p].concat(as)\n+\t\t| \".\" pos:p3 \"name\":m pos:p4 args:as pos:p2\t-> [#send, [p1, p2], [#string, [p3,p4], m], p].concat(as)\n+\t\t| \"[\" expr:i \"]\" args:as pos:p2 -> [#send, [p1, p2], i, p].concat(as)\n+\t\t| \"[\" expr:i \"]\" pos:p2\t\t\t-> [#getp, [p1, p2], i, p]\n+\t\t| \".\" pos:p3 \"name\":f pos:p2\t-> [#getp, [p1, p2], [#string, [p3,p2], f], p]\n+\t\t)\n+\t| primExpr,\n+memberExpr =\n+\tpos:p1 memberExpr:p (\n+\t\t\"[\" expr:i \"]\" pos:p2\t\t\t\t-> [#getp, [p1, p2], i, p]\n+\t\t| \".\" pos:p3 \"name\":f pos:p2\t\t-> [#getp, [p1, p2], [#string, [p3,p2], f], p]\n+\t\t)\n+\t| primExpr,\n+primExpr =\n+\t\"(\" expr:e \")\" -> e\n+\t| pos:p1 (\n+\t\t\"this\" pos:p2\t\t\t\t\t\t\t\t\t\t\t-> [#this, [p1, p2]]\n+\t\t| \"new\" pos:p3 memberExpr:e (args | empty -> []):as pos:p2\t-> [#new, [p1, p2], [#call, [p3, p2], e].concat(as)]\n+\t\t| \"name\":n pos:p2\t\t\t\t\t\t\t\t\t\t-> [#get, [p1, p2], n]\n+\t\t| \"number\":n pos:p2\t\t\t\t\t\t\t\t\t\t-> [#number, [p1, p2], n]\n+\t\t| \"string\":s pos:p2\t\t\t\t\t\t\t\t\t\t-> [#string, [p1, p2], s]\n+\t\t| \"function\" (\"name\" | empty) funcRest\n+\t\t| \"[\" listOf(#exprPart, ','):es (\",\" | empty) \"]\"\tpos:p2\t-> [#arr, [p1, p2]].concat(es)\n+\t\t| \"/\" (escapeChar | ~'\\/' char)*:e \"/\" letter*:f pos:p2\t-> [#regex, [p1, p2], e.join(''), f.join('')]\n+\t )\n+\t| json,\n+\n+json =\n+\tpos:p1 \"{\" listOf(#jsonBinding, ','):bs (\",\" | empty) \"}\" pos:p2\n+\t-> [#json, [p1, p2]].concat(bs),\n+\n+jsonBinding =\n+\tpos:p1 jsonPropName:n \":\" exprPart:v pos:p2\n+\t-> [#binding, [p1, p2], n, v],\n+jsonPropName = \"name\" | \"number\" | \"string\",\n+formal = spaces pos:p1 \"name\":n pos:p2 -> [#get, [p1, p2], n],\n+funcRest =\n+\tpos: p1 \"(\" listOf(#formal, ','):args \")\" \"{\" srcElems:body \"}\" pos:p2\n+\t-> [#func, [p1, p2], body].concat(args),\n+sc =\n+\tspacesNoNl ('\\n' | &'}' | end) | \";\",\n+binding =\n+\tpos:p1 \"name\":n ( \"=\" exprPart | empty pos:p -> [#get, [p, p], 'undefined'] ):v pos:p2\n+\t-> [#var, [p1, p2], n, v],\n+bindingList =\n+\tpos:p1 listOf(#binding, ','):bs pos:p2\t-> [#begin, [p1, p2]].concat(bs),\n+block =\n+\t\"{\" srcElems:ss \"}\"\n+\t-> ss,\n+stmt =\n+\tblock\n+\t| pos:p1 (\n+\t\t\"var\" bindingList:bs sc pos:p2\t-> bs\n+\t\t| \"if\" \"(\" expr:c \")\" stmt:t\n+\t\t\t( \"else\" stmt\n+\t\t | empty pos:p -> [#get, [p,p], 'undefined']\n+\t\t\t):f (sc | empty) pos:p2\t\t\t\t\t-> [#if, [p1, p2], c, t, f]\n+\t\t| \"while\" \"(\" expr:c \")\" stmt:s pos:p2\t\t-> [#while, [p1, p2], c, s]\n+\t\t| \"do\" stmt:s \"while\" \"(\" expr:c \")\" sc pos:p2 -> [#doWhile, [p1, p2], s, c]\n+\t\t| \"for\" \"(\"\n+\t\t\t( \"var\" bindingList | expr | empty pos:p -> [#get, [p, p], 'undefined'] ):i\n+\t\t\t\";\" ( expr | empty pos:p -> [#get, [p, p], 'true'] ):c\n+\t\t\t\";\" ( expr | empty pos:p -> [#get, [p, p], 'undefined'] ):u\n+\t\t\t\")\" stmt:s pos:p2\t\t\t\t\t\t-> [#for, [p1, p2], i, c, u, s]\n+\t\t| \"for\" \"(\"\n+\t\t\t( pos:p3 ( \"var\" \"name\":n pos:p4 -> [#var, [p3, p4], n, [#get, [p3, p3], 'undefined']] ) | \"name\":n pos:p4 -> [#get, [p3, p4], n] ):v\n+\t\t\t\"in\" expr:e \")\" stmt:s pos:p2\t\t\t-> [#forIn, [p1, p2], v, e, s]\n+\t\t| \"switch\" \"(\" expr:e \")\" \"{\"\n+\t\t\t( pos:p3 \"case\" expr:c \":\" srcElems:cs pos:p4 -> [#case, [p3, p4], c, cs]\n+\t\t\t| pos:p3 \"default\" \":\" srcElems:cs pos:p4 -> [#default, [p3, p4], cs] )*:cs\n+\t\t\t\"}\" pos:p2\t\t\t\t\t\t\t\t-> [#switch, [p1, p2], e].concat(cs)\n+\t\t| \"break\" sc pos:p2\t\t\t\t\t\t\t-> [#break, [p1, p2]]\n+\t\t| \"debugger\" sc pos:p2\t\t\t\t\t\t\t-> [#debugger, [p1, p2]]\n+\t\t| \"continue\" sc pos:p2\t\t\t\t\t\t-> [#continue, [p1, p2]]\n+\t\t| \"throw\" spacesNoNl expr:e sc pos:p2\t\t-> [#throw, [p1, p2], e]\n+\t\t| \"try\" block:t\n+\t\t\t( \"catch\" \"(\" \"name\":e \")\" block | empty pos:p -> [#get, [p,p], 'undefined'] ):c\n+\t\t\t( \"finally\" block | empty pos:p -> [#get, [p,p], 'undefined'] ):f sc pos:p2\n+\t\t\t-> [#try, [p1, p2], t, e, c, f]\n+\t\t| \"return\" ( expr | empty pos:p -> [#get, [p,p], 'undefined'] ):e sc pos:p2 -> [#return, [p1, p2], e]\n+\t\t| \"with\" \"(\" expr:x \")\" stmt:s pos:p2\t\t-> [#with, [p1, p2], x, s]\n+\t\t| expr:e sc\t\t\t\t\t\t\t\t\t-> e\n+\t\t| \";\" pos:p2\t\t\t\t\t\t\t\t-> [#get, [p1, p2], \"undefined\"]),\n+srcElem =\n+\tpos:p1 \"function\" \"name\":n funcRest:f pos:p2 -> [#var, [p1,p2], n, f]\n+\t| stmt,\n+srcElems =\n+\tpos:p1 srcElem*:ss pos:p2\n+\t-> [#begin, [p1,p2]].concat(ss),\n+topLevel =\n+\tsrcElems:r spaces end\n+\t-> r\n }\n\\ No newline at end of file\n","/core/lively/ast/LivelyJSParser.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/LivelyJSParser.js\t2012-06-14 10:17:00.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/LivelyJSParser.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -2,8 +2,7 @@\n LivelyJSParser=Object.delegated(Parser,{\n \"whereAreYou\":function(){var $elf=this;return (function (){{var charsBefore=(120);var charsAfter=(120);var src=this[\"_originalInput\"][\"arr\"];var startIndex=Math.max((0),(this.pos() - charsBefore));var stopIndex=Math.min(src[\"length\"],(this.pos() + charsAfter));var msg=((src.substring(startIndex,this.pos()) + \"<--I am here-->\") + src.substring(this.pos(),stopIndex))};(msg+=(\"\\nRules: \" + this[\"_ruleStack\"]));(msg+=(\"\\nStack: \" + this[\"stack\"]));alert(msg);return true}).call(this)},\n \"fromTo\":function(){var $elf=this,x,y;return (function(){x=this._apply(\"anything\");y=this._apply(\"anything\");this._applyWithArgs(\"seq\",x);this._many((function(){return (function(){this._not((function(){return this._applyWithArgs(\"seq\",y)}));return this._apply(\"char\")}).call(this)}));return this._applyWithArgs(\"seq\",y)}).call(this)},\n-\"fromToWithout\":function(){var $elf=this,x,y;return (function(){x=this._apply(\"anything\");y=this._apply(\"anything\");this._applyWithArgs(\"seq\",x);return this._many((function(){return (function(){this._not((function(){return this._applyWithArgs(\"seq\",y)}));return this._apply(\"char\")}).call(this)}))}).call(this)},\n-\"space\":function(){var $elf=this;return this._or((function(){return Parser._superApplyWithArgs(this,'space')}),(function(){return this._applyWithArgs(\"fromToWithout\",\"//\",\"\\n\")}),(function(){return this._applyWithArgs(\"fromTo\",\"//\",\"end\")}),(function(){return this._applyWithArgs(\"fromTo\",\"/*\",\"*/\")}))},\n+\"space\":function(){var $elf=this;return this._or((function(){return Parser._superApplyWithArgs(this,'space')}),(function(){return this._applyWithArgs(\"fromTo\",\"//\",\"\\n\")}),(function(){return this._applyWithArgs(\"fromTo\",\"//\",\"end\")}),(function(){return this._applyWithArgs(\"fromTo\",\"/*\",\"*/\")}))},\n \"nameFirst\":function(){var $elf=this;return this._or((function(){return this._apply(\"letter\")}),(function(){return (function(){switch(this._apply('anything')){case \"$\":return \"$\";case \"_\":return \"_\";default: throw fail}}).call(this)}))},\n \"nameRest\":function(){var $elf=this;return this._or((function(){return this._apply(\"nameFirst\")}),(function(){return this._apply(\"digit\")}))},\n \"iName\":function(){var $elf=this,r;return (function(){r=this._applyWithArgs(\"firstAndRest\",\"nameFirst\",\"nameRest\");return r.join(\"\")}).call(this)},\n@@ -21,13 +20,10 @@\n \"token\":function(){var $elf=this,tt,t;return (function(){tt=this._apply(\"anything\");t=this._apply(\"tok\");this._pred((t[(0)] == tt));return t[(2)]}).call(this)},\n \"spacesNoNl\":function(){var $elf=this;return this._many((function(){return (function(){this._not((function(){return this._applyWithArgs(\"exactly\",\"\\n\")}));return this._apply(\"space\")}).call(this)}))},\n \"expr\":function(){var $elf=this,p1,f,s,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");f=this._apply(\"expr\");this._applyWithArgs(\"exactly\",\",\");s=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"begin\",[p1,p2],f,s]}).call(this)}),(function(){return this._apply(\"exprPart\")}))},\n-\"exprPart\":function(){var $elf=this,p1,e,t,f,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2;return (function(){p1=this._apply(\"pos\");e=this._apply(\"ternaryExpr\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"?\");t=this._apply(\"exprPart\");this._applyWithArgs(\"token\",\":\");f=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"condExpr\",[p1,p2],e,t,f]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"set\",[p1,p2],e,rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"+=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"+\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"-=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"-\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"*=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"*\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"/=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"/\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"%=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"%\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"&=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"&\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"&&=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"&&\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"|=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"|\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"||=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"||\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"^=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"^\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\">>=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\">>\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"<<=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"<<\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\">>>=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\">>>\",rhs]}).call(this)}),(function(){return (function(){this._apply(\"empty\");return e}).call(this)}))}).call(this)},\n-\"ternaryExpr\":function(){var $elf=this,p1,e,t,f,p2;return (function(){p1=this._apply(\"pos\");e=this._apply(\"orExpr\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"?\");t=this._apply(\"orExpr\");this._applyWithArgs(\"token\",\":\");f=this._apply(\"orExpr\");p2=this._apply(\"pos\");return [\"condExpr\",[p1,p2],e,t,f]}).call(this)}),(function(){return (function(){this._apply(\"empty\");return e}).call(this)}))}).call(this)},\n+\"exprPart\":function(){var $elf=this,p1,e,t,f,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2,rhs,p2;return (function(){p1=this._apply(\"pos\");e=this._apply(\"orExpr\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"?\");t=this._apply(\"exprPart\");this._applyWithArgs(\"token\",\":\");f=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"condExpr\",[p1,p2],e,t,f]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"set\",[p1,p2],e,rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"+=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"+\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"-=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"-\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"*=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"*\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"/=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"/\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"%=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"%\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"&=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"&\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"&&=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"&&\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"|=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"|\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"||=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"||\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"^=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"^\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\">>=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\">>\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"<<=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\"<<\",rhs]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\">>>=\");rhs=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"mset\",[p1,p2],e,\">>>\",rhs]}).call(this)}),(function(){return (function(){this._apply(\"empty\");return e}).call(this)}))}).call(this)},\n \"orExpr\":function(){var $elf=this,p1,x,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"orExpr\");this._applyWithArgs(\"token\",\"||\");y=this._apply(\"andExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],\"||\",x,y]}).call(this)}),(function(){return this._apply(\"andExpr\")}))},\n-\"andExpr\":function(){var $elf=this,p1,x,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"andExpr\");this._applyWithArgs(\"token\",\"&&\");y=this._apply(\"bitOrExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],\"&&\",x,y]}).call(this)}),(function(){return this._apply(\"bitOrExpr\")}))},\n-\"bitOrExpr\":function(){var $elf=this,p1,x,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"bitXorExpr\");this._applyWithArgs(\"token\",\"|\");y=this._apply(\"bitOrExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],\"|\",x,y]}).call(this)}),(function(){return this._apply(\"bitXorExpr\")}))},\n-\"bitXorExpr\":function(){var $elf=this,p1,x,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"bitAndExpr\");this._applyWithArgs(\"token\",\"^\");y=this._apply(\"bitXorExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],\"^\",x,y]}).call(this)}),(function(){return this._apply(\"bitAndExpr\")}))},\n-\"bitAndExpr\":function(){var $elf=this,p1,x,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"eqExpr\");this._applyWithArgs(\"token\",\"&\");y=this._apply(\"bitAndExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],\"&\",x,y]}).call(this)}),(function(){return this._apply(\"eqExpr\")}))},\n+\"andExpr\":function(){var $elf=this,p1,x,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"andExpr\");this._applyWithArgs(\"token\",\"&&\");y=this._apply(\"bitExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],\"&&\",x,y]}).call(this)}),(function(){return this._apply(\"bitExpr\")}))},\n+\"bitExpr\":function(){var $elf=this,p1,x,op,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"relExpr\");op=this._or((function(){return this._applyWithArgs(\"token\",\"&\")}),(function(){return this._applyWithArgs(\"token\",\"|\")}),(function(){return this._applyWithArgs(\"token\",\"^\")}));y=this._apply(\"eqExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],op,x,y]}).call(this)}),(function(){return this._apply(\"eqExpr\")}))},\n \"eqExpr\":function(){var $elf=this,p1,x,op,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"eqExpr\");op=this._or((function(){return this._applyWithArgs(\"token\",\"==\")}),(function(){return this._applyWithArgs(\"token\",\"!=\")}),(function(){return this._applyWithArgs(\"token\",\"===\")}),(function(){return this._applyWithArgs(\"token\",\"!==\")}));y=this._apply(\"relExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],op,x,y]}).call(this)}),(function(){return this._apply(\"relExpr\")}))},\n \"relExpr\":function(){var $elf=this,p1,x,op,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"relExpr\");op=this._or((function(){return this._applyWithArgs(\"token\",\">\")}),(function(){return this._applyWithArgs(\"token\",\">=\")}),(function(){return this._applyWithArgs(\"token\",\"<\")}),(function(){return this._applyWithArgs(\"token\",\"<=\")}),(function(){return this._applyWithArgs(\"token\",\"instanceof\")}),(function(){return this._applyWithArgs(\"token\",\"in\")}));y=this._apply(\"shiftExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],op,x,y]}).call(this)}),(function(){return this._apply(\"shiftExpr\")}))},\n \"shiftExpr\":function(){var $elf=this,p1,x,op,y,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");x=this._apply(\"shiftExpr\");op=this._or((function(){return this._applyWithArgs(\"token\",\">>\")}),(function(){return this._applyWithArgs(\"token\",\"<<\")}),(function(){return this._applyWithArgs(\"token\",\">>>\")}));y=this._apply(\"addExpr\");p2=this._apply(\"pos\");return [\"binop\",[p1,p2],op,x,y]}).call(this)}),(function(){return this._apply(\"addExpr\")}))},\n@@ -38,20 +34,17 @@\n \"args\":function(){var $elf=this,as;return (function(){this._applyWithArgs(\"token\",\"(\");as=this._applyWithArgs(\"listOf\",\"exprPart\",\",\");this._applyWithArgs(\"token\",\")\");return as}).call(this)},\n \"callExpr\":function(){var $elf=this,p1,p,as,p2,p3,m,p4,as,p2,i,as,p2,i,p2,p3,f,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");p=this._apply(\"callExpr\");return this._or((function(){return (function(){as=this._apply(\"args\");p2=this._apply(\"pos\");return [\"call\",[p1,p2],p].concat(as)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\".\");p3=this._apply(\"pos\");m=this._applyWithArgs(\"token\",\"name\");p4=this._apply(\"pos\");as=this._apply(\"args\");p2=this._apply(\"pos\");return [\"send\",[p1,p2],[\"string\",[p3,p4],m],p].concat(as)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"[\");i=this._apply(\"expr\");this._applyWithArgs(\"token\",\"]\");as=this._apply(\"args\");p2=this._apply(\"pos\");return [\"send\",[p1,p2],i,p].concat(as)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"[\");i=this._apply(\"expr\");this._applyWithArgs(\"token\",\"]\");p2=this._apply(\"pos\");return [\"getp\",[p1,p2],i,p]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\".\");p3=this._apply(\"pos\");f=this._applyWithArgs(\"token\",\"name\");p2=this._apply(\"pos\");return [\"getp\",[p1,p2],[\"string\",[p3,p2],f],p]}).call(this)}))}).call(this)}),(function(){return this._apply(\"primExpr\")}))},\n \"memberExpr\":function(){var $elf=this,p1,p,i,p2,p3,f,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");p=this._apply(\"memberExpr\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"[\");i=this._apply(\"expr\");this._applyWithArgs(\"token\",\"]\");p2=this._apply(\"pos\");return [\"getp\",[p1,p2],i,p]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\".\");p3=this._apply(\"pos\");f=this._applyWithArgs(\"token\",\"name\");p2=this._apply(\"pos\");return [\"getp\",[p1,p2],[\"string\",[p3,p2],f],p]}).call(this)}))}).call(this)}),(function(){return this._apply(\"primExpr\")}))},\n-\"primExpr\":function(){var $elf=this,e,p1,p2,p3,e,as,p2,n,p2,n,p2,s,p2,es,p2,e,f,p2;return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"(\");e=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");return e}).call(this)}),(function(){return (function(){this._apply(\"spaces\");p1=this._apply(\"pos\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"this\");p2=this._apply(\"pos\");return [\"this\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"new\");p3=this._apply(\"pos\");e=this._apply(\"memberExpr\");as=this._or((function(){return this._apply(\"args\")}),(function(){return (function(){this._apply(\"empty\");return []}).call(this)}));p2=this._apply(\"pos\");return [\"new\",[p1,p2],[\"call\",[p3,p2],e].concat(as)]}).call(this)}),(function(){return (function(){n=this._applyWithArgs(\"token\",\"name\");p2=this._apply(\"pos\");return [\"get\",[p1,p2],n]}).call(this)}),(function(){return (function(){n=this._applyWithArgs(\"token\",\"number\");p2=this._apply(\"pos\");return [\"number\",[p1,p2],n]}).call(this)}),(function(){return (function(){s=this._applyWithArgs(\"token\",\"string\");p2=this._apply(\"pos\");return [\"string\",[p1,p2],s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"function\");this._or((function(){return this._applyWithArgs(\"token\",\"name\")}),(function(){return this._apply(\"empty\")}));return this._apply(\"funcRest\")}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"[\");es=this._applyWithArgs(\"listOf\",\"exprPart\",\",\");this._or((function(){return this._applyWithArgs(\"token\",\",\")}),(function(){return this._apply(\"empty\")}));this._applyWithArgs(\"token\",\"]\");p2=this._apply(\"pos\");return [\"arr\",[p1,p2]].concat(es)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"/\");e=this._many((function(){return this._or((function(){return this._apply(\"escapeChar\")}),(function(){return (function(){this._not((function(){return this._applyWithArgs(\"exactly\",\"/\")}));return this._apply(\"char\")}).call(this)}))}));this._applyWithArgs(\"token\",\"/\");f=this._many((function(){return this._apply(\"letter\")}));p2=this._apply(\"pos\");return [\"regex\",[p1,p2],e.join(\"\"),f.join(\"\")]}).call(this)}))}).call(this)}),(function(){return this._apply(\"json\")}))},\n+\"primExpr\":function(){var $elf=this,e,p1,p2,p3,e,as,p2,n,p2,n,p2,s,p2,es,p2,e,f,p2;return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"(\");e=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");return e}).call(this)}),(function(){return (function(){p1=this._apply(\"pos\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"this\");p2=this._apply(\"pos\");return [\"this\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"new\");p3=this._apply(\"pos\");e=this._apply(\"memberExpr\");as=this._or((function(){return this._apply(\"args\")}),(function(){return (function(){this._apply(\"empty\");return []}).call(this)}));p2=this._apply(\"pos\");return [\"new\",[p1,p2],[\"call\",[p3,p2],e].concat(as)]}).call(this)}),(function(){return (function(){n=this._applyWithArgs(\"token\",\"name\");p2=this._apply(\"pos\");return [\"get\",[p1,p2],n]}).call(this)}),(function(){return (function(){n=this._applyWithArgs(\"token\",\"number\");p2=this._apply(\"pos\");return [\"number\",[p1,p2],n]}).call(this)}),(function(){return (function(){s=this._applyWithArgs(\"token\",\"string\");p2=this._apply(\"pos\");return [\"string\",[p1,p2],s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"function\");this._or((function(){return this._applyWithArgs(\"token\",\"name\")}),(function(){return this._apply(\"empty\")}));return this._apply(\"funcRest\")}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"[\");es=this._applyWithArgs(\"listOf\",\"exprPart\",\",\");this._or((function(){return this._applyWithArgs(\"token\",\",\")}),(function(){return this._apply(\"empty\")}));this._applyWithArgs(\"token\",\"]\");p2=this._apply(\"pos\");return [\"arr\",[p1,p2]].concat(es)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"/\");e=this._many((function(){return this._or((function(){return this._apply(\"escapeChar\")}),(function(){return (function(){this._not((function(){return this._applyWithArgs(\"exactly\",\"/\")}));return this._apply(\"char\")}).call(this)}))}));this._applyWithArgs(\"token\",\"/\");f=this._many((function(){return this._apply(\"letter\")}));p2=this._apply(\"pos\");return [\"regex\",[p1,p2],e.join(\"\"),f.join(\"\")]}).call(this)}))}).call(this)}),(function(){return this._apply(\"json\")}))},\n \"json\":function(){var $elf=this,p1,bs,p2;return (function(){p1=this._apply(\"pos\");this._applyWithArgs(\"token\",\"{\");bs=this._applyWithArgs(\"listOf\",\"jsonBinding\",\",\");this._or((function(){return this._applyWithArgs(\"token\",\",\")}),(function(){return this._apply(\"empty\")}));this._applyWithArgs(\"token\",\"}\");p2=this._apply(\"pos\");return [\"json\",[p1,p2]].concat(bs)}).call(this)},\n \"jsonBinding\":function(){var $elf=this,p1,n,v,p2;return (function(){p1=this._apply(\"pos\");n=this._apply(\"jsonPropName\");this._applyWithArgs(\"token\",\":\");v=this._apply(\"exprPart\");p2=this._apply(\"pos\");return [\"binding\",[p1,p2],n,v]}).call(this)},\n \"jsonPropName\":function(){var $elf=this;return this._or((function(){return this._applyWithArgs(\"token\",\"name\")}),(function(){return this._applyWithArgs(\"token\",\"number\")}),(function(){return this._applyWithArgs(\"token\",\"string\")}))},\n-\"memberFragment\":function(){var $elf=this,jb;return (function(){this._apply(\"spaces\");jb=this._apply(\"jsonBinding\");this._or((function(){return (function(){switch(this._apply('anything')){case \",\":return \",\";default: throw fail}}).call(this)}),(function(){return this._apply(\"empty\")}));this._apply(\"spaces\");this._apply(\"end\");return jb}).call(this)},\n-\"categoryFragment\":function(){var $elf=this,p1,es,p2;return (function(){this._apply(\"spaces\");p1=this._apply(\"pos\");es=this._applyWithArgs(\"listOf\",\"exprPart\",\",\");p2=this._apply(\"pos\");this._or((function(){return this._applyWithArgs(\"token\",\",\")}),(function(){return this._apply(\"empty\")}));this._apply(\"spaces\");this._apply(\"end\");return [\"arr\",[p1,p2]].concat(es)}).call(this)},\n-\"traitFragment\":function(){var $elf=this,p1,es,p2;return (function(){this._apply(\"spaces\");p1=this._apply(\"pos\");this._applyWithArgs(\"token\",\"name\");this._applyWithArgs(\"token\",\"(\");this._apply(\"spaces\");es=this._applyWithArgs(\"listOf\",\"exprPart\",\",\");this._apply(\"spaces\");this._applyWithArgs(\"token\",\")\");this._apply(\"spaces\");this._apply(\"sc\");p2=this._apply(\"pos\");this._apply(\"spaces\");this._apply(\"end\");return [\"arr\",[p1,p2]].concat(es)}).call(this)},\n \"formal\":function(){var $elf=this,p1,n,p2;return (function(){this._apply(\"spaces\");p1=this._apply(\"pos\");n=this._applyWithArgs(\"token\",\"name\");p2=this._apply(\"pos\");return [\"get\",[p1,p2],n]}).call(this)},\n \"funcRest\":function(){var $elf=this,p1,args,body,p2;return (function(){p1=this._apply(\"pos\");this._applyWithArgs(\"token\",\"(\");args=this._applyWithArgs(\"listOf\",\"formal\",\",\");this._applyWithArgs(\"token\",\")\");this._applyWithArgs(\"token\",\"{\");body=this._apply(\"srcElems\");this._applyWithArgs(\"token\",\"}\");p2=this._apply(\"pos\");return [\"func\",[p1,p2],body].concat(args)}).call(this)},\n \"sc\":function(){var $elf=this;return this._or((function(){return (function(){this._apply(\"spacesNoNl\");return this._or((function(){return (function(){switch(this._apply('anything')){case \"\\n\":return \"\\n\";default: throw fail}}).call(this)}),(function(){return this._lookahead((function(){return this._applyWithArgs(\"exactly\",\"}\")}))}),(function(){return this._apply(\"end\")}))}).call(this)}),(function(){return this._applyWithArgs(\"token\",\";\")}))},\n \"binding\":function(){var $elf=this,p1,n,p,v,p2;return (function(){p1=this._apply(\"pos\");n=this._applyWithArgs(\"token\",\"name\");v=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"=\");return this._apply(\"exprPart\")}).call(this)}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));p2=this._apply(\"pos\");return [\"var\",[p1,p2],n,v]}).call(this)},\n \"bindingList\":function(){var $elf=this,p1,bs,p2;return (function(){p1=this._apply(\"pos\");bs=this._applyWithArgs(\"listOf\",\"binding\",\",\");p2=this._apply(\"pos\");return [\"begin\",[p1,p2]].concat(bs)}).call(this)},\n \"block\":function(){var $elf=this,ss;return (function(){this._applyWithArgs(\"token\",\"{\");ss=this._apply(\"srcElems\");this._applyWithArgs(\"token\",\"}\");return ss}).call(this)},\n-\"stmt\":function(){var $elf=this,p1,bs,p2,c,t,p,f,p2,c,s,p2,s,c,p2,p,i,p,c,p,u,s,p2,p3,n,p4,n,p4,v,e,s,p2,e,p3,c,cs,p4,p3,cs,p4,cs,p2,p2,p2,p2,e,p2,t,e,p,e,c,p,f,p2,p,e,p2,x,s,p2,e,p2;return this._or((function(){return this._apply(\"block\")}),(function(){return (function(){this._apply(\"spaces\");p1=this._apply(\"pos\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"var\");bs=this._apply(\"bindingList\");this._apply(\"sc\");p2=this._apply(\"pos\");return bs}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"if\");this._applyWithArgs(\"token\",\"(\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");t=this._apply(\"stmt\");f=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"else\");return this._apply(\"stmt\")}).call(this)}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._or((function(){return this._apply(\"sc\")}),(function(){return this._apply(\"empty\")}));p2=this._apply(\"pos\");return [\"if\",[p1,p2],c,t,f]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"while\");this._applyWithArgs(\"token\",\"(\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"while\",[p1,p2],c,s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"do\");s=this._apply(\"stmt\");this._applyWithArgs(\"token\",\"while\");this._applyWithArgs(\"token\",\"(\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"doWhile\",[p1,p2],s,c]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"for\");this._applyWithArgs(\"token\",\"(\");i=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"var\");return this._apply(\"bindingList\")}).call(this)}),(function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._applyWithArgs(\"token\",\";\");c=this._or((function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"true\"]}).call(this)}));this._applyWithArgs(\"token\",\";\");u=this._or((function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"for\",[p1,p2],i,c,s,u]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"for\");this._applyWithArgs(\"token\",\"(\");v=this._or((function(){return (function(){p3=this._apply(\"pos\");this._applyWithArgs(\"token\",\"var\");n=this._applyWithArgs(\"token\",\"name\");p4=this._apply(\"pos\");return [\"var\",[p3,p4],n,[\"get\",[p3,p3],\"undefined\"]]}).call(this)}),(function(){return (function(){n=this._applyWithArgs(\"token\",\"name\");p4=this._apply(\"pos\");return [\"get\",[p3,p4],n]}).call(this)}));this._applyWithArgs(\"token\",\"in\");e=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"forIn\",[p1,p2],v,e,s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"switch\");this._applyWithArgs(\"token\",\"(\");e=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");this._applyWithArgs(\"token\",\"{\");cs=this._many((function(){return this._or((function(){return (function(){p3=this._apply(\"pos\");this._applyWithArgs(\"token\",\"case\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\":\");cs=this._apply(\"srcElems\");p4=this._apply(\"pos\");return [\"case\",[p3,p4],c,cs]}).call(this)}),(function(){return (function(){p3=this._apply(\"pos\");this._applyWithArgs(\"token\",\"default\");this._applyWithArgs(\"token\",\":\");cs=this._apply(\"srcElems\");p4=this._apply(\"pos\");return [\"default\",[p3,p4],cs]}).call(this)}))}));this._applyWithArgs(\"token\",\"}\");p2=this._apply(\"pos\");return [\"switch\",[p1,p2],e].concat(cs)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"break\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"break\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"debugger\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"debugger\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"continue\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"continue\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"throw\");this._apply(\"spacesNoNl\");e=this._apply(\"expr\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"throw\",[p1,p2],e]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"try\");t=this._apply(\"block\");c=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"catch\");this._applyWithArgs(\"token\",\"(\");e=this._apply(\"formal\");this._applyWithArgs(\"token\",\")\");return this._apply(\"block\")}).call(this)}),(function(){return e=(function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));f=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"finally\");return this._apply(\"block\")}).call(this)}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._apply(\"sc\");p2=this._apply(\"pos\");return [\"try\",[p1,p2],t,e,c,f]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"return\");e=this._or((function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._apply(\"sc\");p2=this._apply(\"pos\");return [\"return\",[p1,p2],e]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"with\");this._applyWithArgs(\"token\",\"(\");x=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"with\",[p1,p2],x,s]}).call(this)}),(function(){return (function(){e=this._apply(\"expr\");this._apply(\"sc\");return e}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\";\");p2=this._apply(\"pos\");return [\"get\",[p1,p2],\"undefined\"]}).call(this)}))}).call(this)}))},\n+\"stmt\":function(){var $elf=this,p1,bs,p2,c,t,p,f,p2,c,s,p2,s,c,p2,p,i,p,c,p,u,s,p2,p3,n,p4,n,p4,v,e,s,p2,e,p3,c,cs,p4,p3,cs,p4,cs,p2,p2,p2,p2,e,p2,t,e,p,c,p,f,p2,p,e,p2,x,s,p2,e,p2;return this._or((function(){return this._apply(\"block\")}),(function(){return (function(){p1=this._apply(\"pos\");return this._or((function(){return (function(){this._applyWithArgs(\"token\",\"var\");bs=this._apply(\"bindingList\");this._apply(\"sc\");p2=this._apply(\"pos\");return bs}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"if\");this._applyWithArgs(\"token\",\"(\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");t=this._apply(\"stmt\");f=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"else\");return this._apply(\"stmt\")}).call(this)}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._or((function(){return this._apply(\"sc\")}),(function(){return this._apply(\"empty\")}));p2=this._apply(\"pos\");return [\"if\",[p1,p2],c,t,f]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"while\");this._applyWithArgs(\"token\",\"(\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"while\",[p1,p2],c,s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"do\");s=this._apply(\"stmt\");this._applyWithArgs(\"token\",\"while\");this._applyWithArgs(\"token\",\"(\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"doWhile\",[p1,p2],s,c]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"for\");this._applyWithArgs(\"token\",\"(\");i=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"var\");return this._apply(\"bindingList\")}).call(this)}),(function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._applyWithArgs(\"token\",\";\");c=this._or((function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"true\"]}).call(this)}));this._applyWithArgs(\"token\",\";\");u=this._or((function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"for\",[p1,p2],i,c,u,s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"for\");this._applyWithArgs(\"token\",\"(\");v=this._or((function(){return (function(){p3=this._apply(\"pos\");this._applyWithArgs(\"token\",\"var\");n=this._applyWithArgs(\"token\",\"name\");p4=this._apply(\"pos\");return [\"var\",[p3,p4],n,[\"get\",[p3,p3],\"undefined\"]]}).call(this)}),(function(){return (function(){n=this._applyWithArgs(\"token\",\"name\");p4=this._apply(\"pos\");return [\"get\",[p3,p4],n]}).call(this)}));this._applyWithArgs(\"token\",\"in\");e=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"forIn\",[p1,p2],v,e,s]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"switch\");this._applyWithArgs(\"token\",\"(\");e=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");this._applyWithArgs(\"token\",\"{\");cs=this._many((function(){return this._or((function(){return (function(){p3=this._apply(\"pos\");this._applyWithArgs(\"token\",\"case\");c=this._apply(\"expr\");this._applyWithArgs(\"token\",\":\");cs=this._apply(\"srcElems\");p4=this._apply(\"pos\");return [\"case\",[p3,p4],c,cs]}).call(this)}),(function(){return (function(){p3=this._apply(\"pos\");this._applyWithArgs(\"token\",\"default\");this._applyWithArgs(\"token\",\":\");cs=this._apply(\"srcElems\");p4=this._apply(\"pos\");return [\"default\",[p3,p4],cs]}).call(this)}))}));this._applyWithArgs(\"token\",\"}\");p2=this._apply(\"pos\");return [\"switch\",[p1,p2],e].concat(cs)}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"break\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"break\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"debugger\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"debugger\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"continue\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"continue\",[p1,p2]]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"throw\");this._apply(\"spacesNoNl\");e=this._apply(\"expr\");this._apply(\"sc\");p2=this._apply(\"pos\");return [\"throw\",[p1,p2],e]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"try\");t=this._apply(\"block\");c=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"catch\");this._applyWithArgs(\"token\",\"(\");e=this._applyWithArgs(\"token\",\"name\");this._applyWithArgs(\"token\",\")\");return this._apply(\"block\")}).call(this)}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));f=this._or((function(){return (function(){this._applyWithArgs(\"token\",\"finally\");return this._apply(\"block\")}).call(this)}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._apply(\"sc\");p2=this._apply(\"pos\");return [\"try\",[p1,p2],t,e,c,f]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"return\");e=this._or((function(){return this._apply(\"expr\")}),(function(){return (function(){this._apply(\"empty\");p=this._apply(\"pos\");return [\"get\",[p,p],\"undefined\"]}).call(this)}));this._apply(\"sc\");p2=this._apply(\"pos\");return [\"return\",[p1,p2],e]}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\"with\");this._applyWithArgs(\"token\",\"(\");x=this._apply(\"expr\");this._applyWithArgs(\"token\",\")\");s=this._apply(\"stmt\");p2=this._apply(\"pos\");return [\"with\",[p1,p2],x,s]}).call(this)}),(function(){return (function(){e=this._apply(\"expr\");this._apply(\"sc\");return e}).call(this)}),(function(){return (function(){this._applyWithArgs(\"token\",\";\");p2=this._apply(\"pos\");return [\"get\",[p1,p2],\"undefined\"]}).call(this)}))}).call(this)}))},\n \"srcElem\":function(){var $elf=this,p1,n,f,p2;return this._or((function(){return (function(){p1=this._apply(\"pos\");this._applyWithArgs(\"token\",\"function\");n=this._applyWithArgs(\"token\",\"name\");f=this._apply(\"funcRest\");p2=this._apply(\"pos\");return [\"var\",[p1,p2],n,f]}).call(this)}),(function(){return this._apply(\"stmt\")}))},\n \"srcElems\":function(){var $elf=this,p1,ss,p2;return (function(){p1=this._apply(\"pos\");ss=this._many((function(){return this._apply(\"srcElem\")}));p2=this._apply(\"pos\");return [\"begin\",[p1,p2]].concat(ss)}).call(this)},\n \"topLevel\":function(){var $elf=this,r;return (function(){r=this._apply(\"srcElems\");this._apply(\"spaces\");this._apply(\"end\");return r}).call(this)}})\n","/core/lively/ast/Interpreter.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/Interpreter.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/Interpreter.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -231,7 +231,6 @@\n isBreakingAt: function(node) {\n if (this.bp === null) return false;\n if (this.bp === node) return true;\n- if (this.bp == node.nextStatement()) return false;\n return node.isAfter(this.bp);\n },\n setPC: function(node) {\n@@ -281,7 +280,7 @@\n text.setTextString(this.getFuncSource());\n text.highlightJavaScriptSyntax();\n if (this.pc !== null) {\n- var style = { backgroundColor: Color.rgb(255,255,127) };\n+ var style = { backgroundColor: Color.web.salmon.lighter() };\n text.emphasize(style, this.pc.pos[0], this.pc.pos[1]);\n }\n },\n@@ -704,7 +703,7 @@\n try {\n result = this.visit(node.trySeq);\n } catch(e) {\n- frame.addToMapping(node.err.name, e);\n+ frame.addToMapping(node.errName, e);\n result = this.visit(node.catchSeq);\n } finally {\n if (node.finallySeq.isVariable && node.finallySeq.name == 'undefined') {\n","/core/lively/ast/generated/Translator.ometa":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/generated/Translator.ometa\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/generated/Translator.ometa\t2012-05-13 22:32:29.000000000 +0200\n@@ -22,8 +22,8 @@\n \t:pos trans:body trans:condExpr\n \t-> { new lively.ast.DoWhile(pos, body, condExpr) },\n for =\n-\t:pos trans:init trans:condExpr trans:body trans:upd\n-\t-> { new lively.ast.For(pos, init, condExpr, body, upd) },\n+\t:pos trans:init trans:condExpr trans:upd trans:body\n+\t-> { new lively.ast.For(pos, init, condExpr, upd, body) },\n forIn =\n \t:pos trans:name trans:obj trans:body\n \t-> { new lively.ast.ForIn(pos, name, obj, body) },\n@@ -88,8 +88,8 @@\n \t:pos trans:expr\n \t-> { new lively.ast.Throw(pos, expr) },\n try =\n-\t:pos trans:trySeq trans:err trans:catchSeq trans:finallySeq\n-\t-> { new lively.ast.TryCatchFinally(pos, trySeq, err, catchSeq, finallySeq) },\n+\t:pos trans:trySeq :errName trans:catchSeq trans:finallySeq\n+\t-> { new lively.ast.TryCatchFinally(pos, trySeq, errName, catchSeq, finallySeq) },\n func =\n \t:pos trans:body trans*:args\n \t-> { new lively.ast.Function(pos, body, args) },\n","/core/lively/ast/generated/Translator.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/generated/Translator.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/generated/Translator.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -1,4 +1,4 @@\n-module('lively.ast.generated.Translator').requires('ometa.parser').toRun(function() {\n+module('lively.ast.generated.Translator').requires().toRun(function() {\n JSTranslator=Object.delegated(Parser,{\n \"trans\":function(){var $elf=this,t,ans;return (function(){this._form((function(){return (function(){t=this._apply(\"anything\");return ans=this._applyWithArgs(\"apply\",t)}).call(this)}));return ans}).call(this)},\n \"begin\":function(){var $elf=this,pos,children;return (function(){pos=this._apply(\"anything\");children=this._many((function(){return this._apply(\"trans\")}));this._apply(\"end\");return new lively.ast.Sequence(pos,children)}).call(this)},\n@@ -8,7 +8,7 @@\n \"if\":function(){var $elf=this,pos,condExpr,trueExpr,falseExpr;return (function(){pos=this._apply(\"anything\");condExpr=this._apply(\"trans\");trueExpr=this._apply(\"trans\");falseExpr=this._apply(\"trans\");return new lively.ast.If(pos,condExpr,trueExpr,falseExpr)}).call(this)},\n \"while\":function(){var $elf=this,pos,condExpr,body;return (function(){pos=this._apply(\"anything\");condExpr=this._apply(\"trans\");body=this._apply(\"trans\");return new lively.ast.While(pos,condExpr,body)}).call(this)},\n \"doWhile\":function(){var $elf=this,pos,body,condExpr;return (function(){pos=this._apply(\"anything\");body=this._apply(\"trans\");condExpr=this._apply(\"trans\");return new lively.ast.DoWhile(pos,body,condExpr)}).call(this)},\n-\"for\":function(){var $elf=this,pos,init,condExpr,body,upd;return (function(){pos=this._apply(\"anything\");init=this._apply(\"trans\");condExpr=this._apply(\"trans\");body=this._apply(\"trans\");upd=this._apply(\"trans\");return new lively.ast.For(pos,init,condExpr,body,upd)}).call(this)},\n+\"for\":function(){var $elf=this,pos,init,condExpr,upd,body;return (function(){pos=this._apply(\"anything\");init=this._apply(\"trans\");condExpr=this._apply(\"trans\");upd=this._apply(\"trans\");body=this._apply(\"trans\");return new lively.ast.For(pos,init,condExpr,upd,body)}).call(this)},\n \"forIn\":function(){var $elf=this,pos,name,obj,body;return (function(){pos=this._apply(\"anything\");name=this._apply(\"trans\");obj=this._apply(\"trans\");body=this._apply(\"trans\");return new lively.ast.ForIn(pos,name,obj,body)}).call(this)},\n \"set\":function(){var $elf=this,pos,left,right;return (function(){pos=this._apply(\"anything\");left=this._apply(\"trans\");right=this._apply(\"trans\");return new lively.ast.Set(pos,left,right)}).call(this)},\n \"mset\":function(){var $elf=this,pos,left,name,right;return (function(){pos=this._apply(\"anything\");left=this._apply(\"trans\");name=this._apply(\"anything\");right=this._apply(\"trans\");return new lively.ast.ModifyingSet(pos,left,name,right)}).call(this)},\n@@ -30,7 +30,7 @@\n \"new\":function(){var $elf=this,pos,clsExpr;return (function(){pos=this._apply(\"anything\");clsExpr=this._apply(\"trans\");return new lively.ast.New(pos,clsExpr)}).call(this)},\n \"var\":function(){var $elf=this,pos,name,val;return (function(){pos=this._apply(\"anything\");name=this._apply(\"anything\");val=this._apply(\"trans\");return new lively.ast.VarDeclaration(pos,name,val)}).call(this)},\n \"throw\":function(){var $elf=this,pos,expr;return (function(){pos=this._apply(\"anything\");expr=this._apply(\"trans\");return new lively.ast.Throw(pos,expr)}).call(this)},\n-\"try\":function(){var $elf=this,pos,trySeq,err,catchSeq,finallySeq;return (function(){pos=this._apply(\"anything\");trySeq=this._apply(\"trans\");err=this._apply(\"trans\");catchSeq=this._apply(\"trans\");finallySeq=this._apply(\"trans\");return new lively.ast.TryCatchFinally(pos,trySeq,err,catchSeq,finallySeq)}).call(this)},\n+\"try\":function(){var $elf=this,pos,trySeq,errName,catchSeq,finallySeq;return (function(){pos=this._apply(\"anything\");trySeq=this._apply(\"trans\");errName=this._apply(\"anything\");catchSeq=this._apply(\"trans\");finallySeq=this._apply(\"trans\");return new lively.ast.TryCatchFinally(pos,trySeq,errName,catchSeq,finallySeq)}).call(this)},\n \"func\":function(){var $elf=this,pos,body,args;return (function(){pos=this._apply(\"anything\");body=this._apply(\"trans\");args=this._many((function(){return this._apply(\"trans\")}));return new lively.ast.Function(pos,body,args)}).call(this)},\n \"json\":function(){var $elf=this,pos,properties;return (function(){pos=this._apply(\"anything\");properties=this._many((function(){return this._apply(\"trans\")}));return new lively.ast.ObjectLiteral(pos,properties)}).call(this)},\n \"binding\":function(){var $elf=this,pos,name,property;return (function(){pos=this._apply(\"anything\");name=this._apply(\"anything\");property=this._apply(\"trans\");return new lively.ast.ObjProperty(pos,name,property)}).call(this)},\n","/core/lively/ast/generated/Nodes.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/ast/generated/Nodes.js\t2012-06-01 10:29:33.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/ast/generated/Nodes.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -1,7 +1,7 @@\n module('lively.ast.generated.Nodes').requires().toRun(function() {\n Object.subclass('lively.ast.Node');\n \n-lively.ast.Node.subclass('lively.ast.Sequence', \n+lively.ast.Node.subclass('lively.ast.Sequence',\n 'testing', {\n \tisSequence: true,\n },\n@@ -67,7 +67,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Number', \n+lively.ast.Node.subclass('lively.ast.Number',\n 'testing', {\n \tisNumber: true,\n },\n@@ -90,7 +90,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.String', \n+lively.ast.Node.subclass('lively.ast.String',\n 'testing', {\n \tisString: true,\n },\n@@ -113,7 +113,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Cond', \n+lively.ast.Node.subclass('lively.ast.Cond',\n 'testing', {\n \tisCond: true,\n },\n@@ -146,7 +146,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.If', \n+lively.ast.Node.subclass('lively.ast.If',\n 'testing', {\n \tisIf: true,\n },\n@@ -194,7 +194,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.While', \n+lively.ast.Node.subclass('lively.ast.While',\n 'testing', {\n \tisWhile: true,\n },\n@@ -219,30 +219,13 @@\n 'while (%s) {%s}',\n this.condExpr.asJS(depth), this.body.asJS(depth));\n },\n-},\n-'stepping', {\n-\tfirstStatement: function () {\n- return this.condExpr.firstStatement();\n- },\n-\tnextStatement: function ($super, node) {\n- if (node === this.condExpr) {\n- return this.body;\n- } else if (node === this.body) {\n- return this.condExpr;\n- } else {\n- return $super(this);\n- }\n- },\n-\tisComposite: function () {\n- return true;\n- },\n },'visiting', {\n \taccept: function(visitor) {\n \t\treturn visitor.visitWhile(this);\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.DoWhile', \n+lively.ast.Node.subclass('lively.ast.DoWhile',\n 'testing', {\n \tisDoWhile: true,\n },\n@@ -267,48 +250,31 @@\n 'do {%s} while (%s);',\n this.body.asJS(depth), this.condExpr.asJS(depth));\n },\n-},\n-'stepping', {\n-\tfirstStatement: function () {\n- return this.body.firstStatement();\n- },\n-\tnextStatement: function ($super, node) {\n- if (node === this.condExpr) {\n- return this.body;\n- } else if (node === this.body) {\n- return this.condExpr;\n- } else {\n- return $super(this);\n- }\n- },\n-\tisComposite: function () {\n- return true;\n- },\n },'visiting', {\n \taccept: function(visitor) {\n \t\treturn visitor.visitDoWhile(this);\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.For', \n+lively.ast.Node.subclass('lively.ast.For',\n 'testing', {\n \tisFor: true,\n },\n 'initializing', {\n-\tinitialize: function($super, pos, init, condExpr, body, upd) {\n+\tinitialize: function($super, pos, init, condExpr, upd, body) {\n \t\tthis.pos = pos;\n \t\tthis.init = init;\n \t\tthis.condExpr = condExpr;\n-\t\tthis.body = body;\n \t\tthis.upd = upd;\n+\t\tthis.body = body;\n \t\tinit.setParent(this);\n \t\tcondExpr.setParent(this);\n-\t\tbody.setParent(this);\n \t\tupd.setParent(this);\n+\t\tbody.setParent(this);\n \t},\n },\n 'debugging', {\n-\tprintConstruction: function () { return this.printConstructorCall(this.pos, this.init, this.condExpr, this.body, this.upd) },\n+\tprintConstruction: function () { return this.printConstructorCall(this.pos, this.init, this.condExpr, this.upd, this.body) },\n \ttoString: function () { return Strings.format(\n '%s(%s;%s;%s do %s)',\n this.constructor.name, this.init, this.condExpr, this.upd, this.body) },\n@@ -344,7 +310,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.ForIn', \n+lively.ast.Node.subclass('lively.ast.ForIn',\n 'testing', {\n \tisForIn: true,\n },\n@@ -379,7 +345,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Set', \n+lively.ast.Node.subclass('lively.ast.Set',\n 'testing', {\n \tisSet: true,\n },\n@@ -406,7 +372,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.ModifyingSet', \n+lively.ast.Node.subclass('lively.ast.ModifyingSet',\n 'testing', {\n \tisModifyingSet: true,\n },\n@@ -434,7 +400,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.BinaryOp', \n+lively.ast.Node.subclass('lively.ast.BinaryOp',\n 'testing', {\n \tisBinaryOp: true,\n },\n@@ -462,7 +428,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.UnaryOp', \n+lively.ast.Node.subclass('lively.ast.UnaryOp',\n 'testing', {\n \tisUnaryOp: true,\n },\n@@ -488,7 +454,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.PreOp', \n+lively.ast.Node.subclass('lively.ast.PreOp',\n 'testing', {\n \tisPreOp: true,\n },\n@@ -514,7 +480,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.PostOp', \n+lively.ast.Node.subclass('lively.ast.PostOp',\n 'testing', {\n \tisPostOp: true,\n },\n@@ -540,7 +506,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.This', \n+lively.ast.Node.subclass('lively.ast.This',\n 'testing', {\n \tisThis: true,\n },\n@@ -562,7 +528,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Variable', \n+lively.ast.Node.subclass('lively.ast.Variable',\n 'testing', {\n \tisVariable: true,\n },\n@@ -587,7 +553,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.GetSlot', \n+lively.ast.Node.subclass('lively.ast.GetSlot',\n 'testing', {\n \tisGetSlot: true,\n },\n@@ -618,7 +584,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Break', \n+lively.ast.Node.subclass('lively.ast.Break',\n 'testing', {\n \tisBreak: true,\n },\n@@ -639,7 +605,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Debugger', \n+lively.ast.Node.subclass('lively.ast.Debugger',\n 'testing', {\n \tisDebugger: true,\n },\n@@ -660,7 +626,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Continue', \n+lively.ast.Node.subclass('lively.ast.Continue',\n 'testing', {\n \tisContinue: true,\n },\n@@ -681,7 +647,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.ArrayLiteral', \n+lively.ast.Node.subclass('lively.ast.ArrayLiteral',\n 'testing', {\n \tisArrayLiteral: true,\n },\n@@ -706,7 +672,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Return', \n+lively.ast.Node.subclass('lively.ast.Return',\n 'testing', {\n \tisReturn: true,\n },\n@@ -731,7 +697,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.With', \n+lively.ast.Node.subclass('lively.ast.With',\n 'testing', {\n \tisWith: true,\n },\n@@ -758,7 +724,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Send', \n+lively.ast.Node.subclass('lively.ast.Send',\n 'testing', {\n \tisSend: true,\n },\n@@ -799,7 +765,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Call', \n+lively.ast.Node.subclass('lively.ast.Call',\n 'testing', {\n \tisCall: true,\n },\n@@ -832,7 +798,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.New', \n+lively.ast.Node.subclass('lively.ast.New',\n 'testing', {\n \tisNew: true,\n },\n@@ -859,7 +825,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.VarDeclaration', \n+lively.ast.Node.subclass('lively.ast.VarDeclaration',\n 'testing', {\n \tisVarDeclaration: true,\n },\n@@ -887,7 +853,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Throw', \n+lively.ast.Node.subclass('lively.ast.Throw',\n 'testing', {\n \tisThrow: true,\n },\n@@ -914,25 +880,24 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.TryCatchFinally', \n+lively.ast.Node.subclass('lively.ast.TryCatchFinally',\n 'testing', {\n \tisTryCatchFinally: true,\n },\n 'initializing', {\n-\tinitialize: function($super, pos, trySeq, err, catchSeq, finallySeq) {\n+\tinitialize: function($super, pos, trySeq, errName, catchSeq, finallySeq) {\n \t\tthis.pos = pos;\n \t\tthis.trySeq = trySeq;\n-\t\tthis.err = err;\n+\t\tthis.errName = errName;\n \t\tthis.catchSeq = catchSeq;\n \t\tthis.finallySeq = finallySeq;\n \t\ttrySeq.setParent(this);\n-\t\terr.setParent(this);\n \t\tcatchSeq.setParent(this);\n \t\tfinallySeq.setParent(this);\n \t},\n },\n 'debugging', {\n-\tprintConstruction: function () { return this.printConstructorCall(this.pos, this.trySeq, '\"'+this.err.name+'\"', this.catchSeq, this.finallySeq) },\n+\tprintConstruction: function () { return this.printConstructorCall(this.pos, this.trySeq, '\"'+this.errName+'\"', this.catchSeq, this.finallySeq) },\n \ttoString: function () {\n return Strings.format(\n '%s(%s %s %s)',\n@@ -945,7 +910,7 @@\n indent = this.indent(depth),\n str = 'try {\\n' + indent + this.trySeq.asJS(depth) + '\\n' + baseIndent + '}';\n if (!this.isUndefined(this.catchSeq))\n- str += ' catch(' + this.err.name + ') {\\n' +\n+ str += ' catch(' + this.errName + ') {\\n' +\n indent + this.catchSeq.asJS(depth) + '\\n' + baseIndent + '}';\n if (!this.isUndefined(this.finallySeq))\n str += ' finally {\\n' + indent + this.finallySeq.asJS(depth) + '\\n' + baseIndent + '}';\n@@ -957,7 +922,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Function', \n+lively.ast.Node.subclass('lively.ast.Function',\n 'testing', {\n \tisFunction: true,\n },\n@@ -997,7 +962,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.ObjectLiteral', \n+lively.ast.Node.subclass('lively.ast.ObjectLiteral',\n 'testing', {\n \tisObjectLiteral: true,\n },\n@@ -1026,7 +991,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.ObjProperty', \n+lively.ast.Node.subclass('lively.ast.ObjProperty',\n 'testing', {\n \tisObjProperty: true,\n },\n@@ -1055,7 +1020,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Switch', \n+lively.ast.Node.subclass('lively.ast.Switch',\n 'testing', {\n \tisSwitch: true,\n },\n@@ -1084,7 +1049,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Case', \n+lively.ast.Node.subclass('lively.ast.Case',\n 'testing', {\n \tisCase: true,\n },\n@@ -1114,7 +1079,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Default', \n+lively.ast.Node.subclass('lively.ast.Default',\n 'testing', {\n \tisDefault: true,\n },\n@@ -1139,7 +1104,7 @@\n \t},\n })\n \n-lively.ast.Node.subclass('lively.ast.Regex', \n+lively.ast.Node.subclass('lively.ast.Regex',\n 'testing', {\n \tisRegex: true,\n },\n@@ -1162,7 +1127,7 @@\n \t\treturn visitor.visitRegex(this);\n \t},\n })\n-Object.subclass('lively.ast.Visitor', \n+Object.subclass('lively.ast.Visitor',\n 'visiting', {\n \tvisit: function(node) { return node.accept(this) },\n \tvisitSequence: function(node) {},\n","/core/lively/localconfig.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/localconfig.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/localconfig.js\t2012-05-21 15:20:04.000000000 +0200\n@@ -1,81 +1,34 @@\n-Config.proxyURL = document.location.protocol + '//' + document.location.host + '/proxy';\n+var host = document.location.host,\n+ protocol = document.location.protocol,\n+ url = document.location.toString(),\n+ wwPath = \"/repository/webwerkstatt\";\n \n-Config.wikiRepoUrl = document.location.protocol + '//' + document.location.host +\n-\t(document.URL.include('swa/research') ?\n-\t\t'/repository/webwerkstatt/swa/research' :\n-\t\t'/repository/webwerkstatt');\n \n-Config.debugExtras = false;\n+lively.Config.set('proxyURL', protocol + '//' + host + '/proxy');\n \n-Config.showFabrikWeatherWidgetExample = false;\n+lively.Config.set(\"wikiRepoUrl\", protocol + '//' + host + (url.include('swa/research') ?\n+ wwPath + '/swa/research' : wwPath));\n \n-// Config.highlightSyntax = true;\n-// Config.usePieMenus = false;\n+lively.Config.set(\"debugExtras\", false);\n \n-Config.askBeforeQuit = true;\n+lively.Config.set(\"askBeforeQuit\", true);\n+lively.Config.set(\"confirmNavigation\", false);\n \n-// Config.modulesOnWorldLoad = Config.modulesOnWorldLoad.concat([\"cop/Layers\", \"Tests/LayersTest\"])\n-// Config.modulesOnWorldLoad = Config.modulesOnWorldLoad.concat([\"lively.Fabrik\", \"lively.Presentation\", \"cop.Layers\", 'lively.LayerableMorphs', \"cop.Workspace\", \"lively.Graffle\", \"lively.Undo\", \"lively.TabCompletion\", \"lively.SyntaxHighlighting\"])\n-//Config.modulesOnWorldLoad = Config.modulesOnWorldLoad.concat([\"lively.Graffle\", \"lively.Undo\", \"lively.ide.AutoCompletion\", \"lively.ide.SyntaxHighlighting\", 'lively.Scripting', 'lively.ast.StaticAnalysis'])\n-Config.modulesOnWorldLoad = Config.modulesOnWorldLoad.concat([\"lively.ide.AutoIndent\", 'lively.ast.StaticAnalysis'])\n+lively.Config.set(\"showNetworkExamples\", true);\n \n-Config.showNetworkExamples = true\n+lively.Config.set(\"resizeScreenToWorldBounds\", true);\n \n+lively.Config.set(\"disableScriptCaching\", true);\n \n-if (!Config.isNewMorphic) {\n-\tConfig.modulesOnWorldLoad.push('lively.deprecated.Helper')\n-}\n+// 'primitive', 'turquoise', 'hpi', 'lively'\n+lively.Config.set(\"defaultDisplayTheme\", 'hpi');\n \n-Config.modulesBeforeWorldLoad.push('projects.BP2012.InteractionWithIPad.Preloader');\n+lively.Config.set(\"disableNoConsoleWarning\", true);\n \n-Config.modulesBeforeWorldLoad.push('projects.BP2012.InteractionWithIPad.IPad');\n+lively.Config.set(\"ignoreAdvice\", false);\n \n-Config.modulesBeforeWorldLoad.push('lively.morphic.DiffMerge');\n+lively.Config.set(\"loadUserConfig\", true);\n \n-Config.modulesBeforeWorldLoad.push('lively.PartCaching');\n+lively.Config.add(\"modulePaths\", 'apps');\n \n-Config.testInRealWorld = true;\n-\n-Config.confirmNavigation = false;\n-\n-Config.resizeScreenToWorldBounds = true;\n-\n-Config.disableScriptCaching = true;\n-\n-// document.body.style.cursor = 'none';\n-// document.body.style.cursor = 'url(\"/repository/webwerkstatt/media/nocursor.gif\"), none';\n-// new URL(Config.codeBase).withFilename('media/nocursor.gif').withRelativePartsResolved().pathname\n-\n-// document.body.style.cursor = 'wait'\n-\n-Config.silentFailOnWrapperClassNotFound = true;\n-\n-Config.defaultDisplayTheme = 'hpi' // 'primitive', 'turquoise', 'hpi', 'lively'\n-\n-Config.disableNoConsoleWarning = true;\n-\n-Config.ignoreAdvice = false;\n-\n-// disable visual connect because it is broken in Chrome 17 and was a bad idea anyway\n-// (Jens, 2012-02-14)\n-Config.visualConnectEnabled = false\n-\n-Config.loadUserConfig = true;\n-Config.ChromeSVGRenderingHotfix = true;\n-\n-Config.ignoreMissingModules = false;\n-\n-Config.textUndoEnabled = false;\n-// Config.textUndoEnabled = document.URL.indexOf('textUndoEnabled=false') === -1;\n-// if (Config.textUndoEnabled) {\n-// Config.modulesBeforeWorldLoad.push('users.robertkrahn.TextUndo');\n-// }\n-\n-// warning\n-// warn = $('');\n-// warn.text('Currently optimized loading is disabled. It can therefore take a bit longer loading a world. We will soon fix this issue.');\n-// warn.css({position: 'absolute', left: '20px', top: '20px', color: 'orange', 'font-family': 'sans-serif', \"font-size\": \"20px\"});\n-// warn.appendTo('body');\n-// setTimeout(function() { warn.remove(); }, 4000);\n-\n-Config.useObjectInspector = true;\n+lively.Config.urlQueryOverride();\n\\ No newline at end of file\n","/core/lively/Traits.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/Traits.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/Traits.js\t2012-05-13 12:17:44.000000000 +0200\n@@ -2,29 +2,29 @@\n \n Object.subclass('RealTrait',\n 'global state', {\n- traitRegistry: {},\n- isTrait: true\n+\ttraitRegistry: {},\n+\tisTrait: true,\n },\n 'properties', {\n- objectTraitConfig: '_traitConfig_'\n+\tobjectTraitConfig: '_traitConfig_',\n },\n 'initializing', {\n- initialize: function(name, optionsForApply) {\n- if (!name || !Object.isString(name)) throw new Error('Trait needs a name!')\n- this.name = name;\n- this.def = {};\n- this.optionsForApply = optionsForApply || {};\n- this.categories = {};\n- this.extendedObjectsAndOptions = {classes: {}, traits: {}, objects: []};\n- this.traitRegistry[name] = this;\n+\t initialize: function(name, optionsForApply) {\n+\t\t if (!name || !Object.isString(name)) throw new Error('Trait needs a name!')\n+\t\t this.name = name;\n+\t\t this.def = {};\n+\t\t this.optionsForApply = optionsForApply || {};\n+\t\t this.categories = {};\n+\t\t this.extendedObjectsAndOptions = {classes: {}, traits: {}, objects: []};\n+\t\t this.traitRegistry[name] = this;\n \n // remember the module that contains the class def\n- if (Global.lively && lively.lang && lively.lang.Namespace)\n+\t\t if (Global.lively && lively.lang && lively.lang.Namespace)\n this.sourceModule = lively.lang.Namespace.current();\n },\n- createAnonymousTrait: function(options) {\n- return RealTrait.createAnonymousTrait('Modified' + this.name, options);\n- },\n+\t createAnonymousTrait: function(options) {\n+\t\t return RealTrait.createAnonymousTrait('Modified' + this.name, options);\n+\t },\n },\n 'accessing', {\n optionsConfForObj: function(obj) {\n@@ -33,124 +33,124 @@\n }\n },\n 'manipulating', {\n- extend: function(category, def) {\n- if (!def) return null;\n- this.removeFromDependents();\n- for (var name in def) {\n+\t extend: function(category, def) {\n+\t\t if (!def) return null;\n+\t\t this.removeFromDependents();\n+\t\t for (var name in def) {\n if (!def.hasOwnProperty(name) || !Object.isFunction(def[name])) continue;\n if (Global.lively && lively.lang && lively.lang.Namespace) {\n def[name].sourceModule = lively.lang.Namespace.current();\n }\n- def[name].belongsToTrait = this;\n+\t\t\t\t def[name].belongsToTrait = this;\n }\n- Object.extend(this.def, def);\n- this.categories[category] = def;\n- this.updateDependents();\n+\t\t Object.extend(this.def, def);\n+\t\t this.categories[category] = def;\n+\t\t this.updateDependents();\n \n- return this;\n- },\n+\t\t return this;\n+\t },\n },\n 'testing', {\n- equalOptions: function(a, b) {\n- function equals(leftObj, rightObj) {\n- if (!leftObj && !rightObj) return true;\n- if (!leftObj || !rightObj) return false;\n- switch (leftObj.constructor) {\n- case String:\n- case Boolean:\n- case Number: return leftObj == rightObj;\n- };\n- if (leftObj.isEqualNode) return leftObj.isEqualNode(rightObj);\n-\n- var cmp = function(left, right) {\n- for (var name in left) {\n- if (Object.isFunction(left[name])) continue;\n- if (equals(left[name], right[name])) continue;\n+\t equalOptions: function(a, b) {\n+\t\t function equals(leftObj, rightObj) {\n+\t\t\t if (!leftObj && !rightObj) return true;\n+\t\t\t if (!leftObj || !rightObj) return false;\n+\t\t\t switch (leftObj.constructor) {\n+\t\t\t\t case String:\n+\t\t\t\t case Boolean:\n+\t\t\t\t case Number: return leftObj == rightObj;\n+\t\t\t };\n+\t\t\t if (leftObj.isEqualNode) return leftObj.isEqualNode(rightObj);\n+\n+\t\t\t var cmp = function(left, right) {\n+\t\t\t\t for (var name in left) {\n+\t\t\t\t\t if (Object.isFunction(left[name])) continue;\n+\t\t\t\t\t\t if (equals(left[name], right[name])) continue;\n return false;\n- };\n- return true;\n- };\n- return cmp(leftObj, rightObj) && cmp(rightObj, leftObj);\n- }\n- return equals(a, b);\n- },\n+\t\t\t\t };\n+\t\t\t\t return true;\n+\t\t\t };\n+\t\t\t return cmp(leftObj, rightObj) && cmp(rightObj, leftObj);\n+\t\t }\n+\t\t return equals(a, b);\n+\t },\n },\n 'derive', {\n- derive: function(options) {\n- var derivedTrait = this.findDerivedTrait(options);\n- if (derivedTrait) return derivedTrait;\n- derivedTrait = this.createAnonymousTrait(options);\n- this.applyTo(derivedTrait, options);\n- return derivedTrait;\n- },\n- findDerivedTrait: function(options) {\n- var extTraits = this.extendedObjectsAndOptions.traits;\n- for (var name in extTraits) {\n- if (!extTraits.hasOwnProperty(name)) continue;\n- var extTraitOptions = extTraits[name];\n- if (this.equalOptions(options, extTraitOptions)) return Trait(name)\n- }\n- return null;\n- },\n+\t derive: function(options) {\n+\t\t var derivedTrait = this.findDerivedTrait(options);\n+\t\t if (derivedTrait) return derivedTrait;\n+\t\t derivedTrait = this.createAnonymousTrait(options);\n+\t\t this.applyTo(derivedTrait, options);\n+\t\t return derivedTrait;\n+\t },\n+\t findDerivedTrait: function(options) {\n+\t\t var extTraits = this.extendedObjectsAndOptions.traits;\n+\t\t for (var name in extTraits) {\n+\t\t\t if (!extTraits.hasOwnProperty(name)) continue;\n+\t\t\t var extTraitOptions = extTraits[name];\n+\t\t\t if (this.equalOptions(options, extTraitOptions)) return Trait(name)\n+\t\t }\n+\t\t return null;\n+\t },\n \n },\n 'updating', {\n- updateDependents: function() {\n- Properties.forEachOwn(this.extendedObjectsAndOptions.classes, function(className, options) {\n- var klass = Class.forName(className);\n- if (klass) this.applyToClass(klass, options)\n- }, this);\n- Properties.forEachOwn(this.extendedObjectsAndOptions.traits, function(traitName, options) {\n- var trait = Trait(traitName);\n- if (trait) this.applyToTrait(trait, options);\n- }, this);\n- var objectConfs = this.extendedObjectsAndOptions.objects;\n- objectConfs.forEach(function(conf) {\n- if (!conf.object) return;\n+\t updateDependents: function() {\n+\t\t Properties.forEachOwn(this.extendedObjectsAndOptions.classes, function(className, options) {\n+\t\t\t var klass = Class.forName(className);\n+\t\t\t if (klass) this.applyToClass(klass, options)\n+\t\t }, this);\n+\t\t Properties.forEachOwn(this.extendedObjectsAndOptions.traits, function(traitName, options) {\n+\t\t\t var trait = Trait(traitName);\n+\t\t\t if (trait) this.applyToTrait(trait, options);\n+\t\t }, this);\n+\t\t var objectConfs = this.extendedObjectsAndOptions.objects;\n+\t\t objectConfs.forEach(function(conf) {\n+\t\t\t if (!conf.object) return;\n var options = conf.options;\n- this.applyToObject(conf.object, options);\n- }, this);\n- },\n- applyTo: function(obj, options) {\n- options = options || this.optionsForApply;\n- if (Class.isClass(obj)) return this.applyToClass(obj, options);\n- if (obj.isTrait) return this.applyToTrait(obj, options);\n- return this.applyToObject(obj, options);\n- },\n- applyToClass: function(klass, options) {\n- this.removeFrom(klass.prototype);\n- this.basicApplyTo(this.def, klass.prototype, options)\n- this.extendedObjectsAndOptions.classes[klass.type || klass.name] = options;\n- return this;\n- },\n- applyToTrait: function(trait, options) {\n- trait.removeFromDependents();\n- this.removeFrom(trait.def);\n- var def = {};\n- for (var name in this.def){\n- if (this.def.hasOwnProperty(name) && !trait.def[name]) {\n- def[name] = this.def[name];\n+\t\t\t this.applyToObject(conf.object, options);\n+\t\t }, this);\n+\t },\n+\t applyTo: function(obj, options) {\n+\t\t options = options || this.optionsForApply;\n+\t\t if (Class.isClass(obj)) return this.applyToClass(obj, options);\n+\t\t if (obj.isTrait) return this.applyToTrait(obj, options);\n+\t\t return this.applyToObject(obj, options);\n+\t },\n+\t applyToClass: function(klass, options) {\n+\t\t this.removeFrom(klass.prototype);\n+\t\t this.basicApplyTo(this.def, klass.prototype, options)\n+\t\t this.extendedObjectsAndOptions.classes[klass.type || klass.name] = options;\n+\t\t return this;\n+\t },\n+\t applyToTrait: function(trait, options) {\n+\t\t trait.removeFromDependents();\n+\t\t this.removeFrom(trait.def);\n+\t\t var def = {};\n+\t\t for (var name in this.def){\n+\t\t\t if (this.def.hasOwnProperty(name) && !trait.def[name]) {\n+\t\t\t\t def[name] = this.def[name];\n }\n }\n- this.basicApplyTo(def, trait.def, options);\n- this.extendedObjectsAndOptions.traits[trait.name] = options;\n- trait.updateDependents();\n- return this;\n- },\n-\n- applyToObject: function(obj, options) {\n- this.removeFrom(obj);\n- this.basicApplyTo(this.def, obj, options);\n+\t\t this.basicApplyTo(def, trait.def, options);\n+\t\t this.extendedObjectsAndOptions.traits[trait.name] = options;\n+\t\t trait.updateDependents();\n+\t\t return this;\n+\t },\n+\n+\t applyToObject: function(obj, options) {\n+\t\t this.removeFrom(obj);\n+\t\t this.basicApplyTo(this.def, obj, options);\n \n // we store a hash {object: obj, options: options} in\n // extendedObjectsAndOptions.objects for updating.\n var conf = this.optionsConfForObj(obj);\n conf.options = options;\n- this.extendedObjectsAndOptions.objects.pushIfNotIncluded(conf);\n+\t\t this.extendedObjectsAndOptions.objects.pushIfNotIncluded(conf);\n \n // We also store the trait name and options in the object\n // itself for serialization\n- var myName = this.name,\n+\t\t var myName = this.name,\n traitsList = obj[this.objectTraitConfig] || [],\n objTraitOptions = traitsList.detect(function(ea) { return ea.traitName === myName });\n if (objTraitOptions) {\n@@ -159,93 +159,93 @@\n traitsList.push({traitName: this.name, options: options});\n obj[this.objectTraitConfig] = traitsList;\n }\n- return this;\n- },\n+\t\t return this;\n+\t },\n \n- basicApplyTo: function(source, target, options) {\n- var def = {},\n- aliasing = (options && options.alias) || {},\n- exclusion = (options && options.exclude) || [],\n- override = (options && options.override) || [];\n- for (var name in source) {\n- if (!source.hasOwnProperty(name)) continue;\n- if (exclusion.include(name)) continue;\n- var aliasedName = aliasing[name] || name;\n- if (target[aliasedName] && !override.include(aliasedName)) continue;\n- def[aliasedName] = source[name];\n- }\n- Object.extend(target, def);\n- return this;\n- },\n+\t basicApplyTo: function(source, target, options) {\n+\t\t var def = {},\n+\t\t\t aliasing = (options && options.alias) || {},\n+\t\t\t exclusion = (options && options.exclude) || [],\n+\t\t\t override = (options && options.override) || [];\n+\t\t for (var name in source) {\n+\t\t\t if (!source.hasOwnProperty(name)) continue;\n+\t\t\t if (exclusion.include(name)) continue;\n+\t\t\t var aliasedName = aliasing[name] || name;\n+\t\t\t if (target[aliasedName] && !override.include(aliasedName)) continue;\n+\t\t\t def[aliasedName] = source[name];\n+\t\t }\n+\t\t Object.extend(target, def);\n+\t\t return this;\n+\t },\n },\n 'removing', {\n- remove: function() {\n- this.removeFromDependents();\n- delete this.traitRegistry[this.name];\n- },\n- removeFrom: function(obj) {\n- var own = Properties.ownValues(this.def),\n- props = Functions.all(obj);\n- for (var i = 0; i < props.length; i++) {\n- if (own.include(obj[props[i]])) {\n- delete obj[props[i]];\n+\t remove: function() {\n+\t\t this.removeFromDependents();\n+\t\t delete this.traitRegistry[this.name];\n+\t },\n+\t removeFrom: function(obj) {\n+\t\t var own = Properties.ownValues(this.def),\n+\t\t\t props = Functions.all(obj);\n+\t\t for (var i = 0; i < props.length; i++) {\n+\t\t\t if (own.include(obj[props[i]])) {\n+\t\t\t\t delete obj[props[i]];\n }\n }\n- },\n- removeFromDependents: function() {\n- Properties.forEachOwn(this.extendedObjectsAndOptions.classes, function(className, options) {\n- var klass = Class.forName(className);\n- if (!klass) return;\n- this.removeFrom(klass.prototype)\n- }, this);\n- Properties.forEachOwn(this.extendedObjectsAndOptions.traits, function(traitName, options) {\n- var trait = Trait(traitName);\n- if (!trait) return;\n- trait.removeFromDependents();\n- this.removeFrom(trait.def);\n- trait.updateDependents();\n- }, this);\n- var objConfs = this.extendedObjectsAndOptions.objects;\n- objConfs && objConfs.forEach(function(conf) { if (conf.object) this.removeFrom(conf.object); }, this);\n- },\n+\t },\n+\t removeFromDependents: function() {\n+\t\t Properties.forEachOwn(this.extendedObjectsAndOptions.classes, function(className, options) {\n+\t\t\t var klass = Class.forName(className);\n+\t\t\t if (!klass) return;\n+\t\t\t this.removeFrom(klass.prototype)\n+\t\t }, this);\n+\t\t Properties.forEachOwn(this.extendedObjectsAndOptions.traits, function(traitName, options) {\n+\t\t\t var trait = Trait(traitName);\n+\t\t\t if (!trait) return;\n+\t\t\t trait.removeFromDependents();\n+\t\t\t this.removeFrom(trait.def);\n+\t\t\t trait.updateDependents();\n+\t\t }, this);\n+\t\t var objConfs = this.extendedObjectsAndOptions.objects;\n+\t\t objConfs && objConfs.forEach(function(conf) { if (conf.object) this.removeFrom(conf.object); }, this);\n+\t },\n },\n 'categories', {\n- getCategoryNames: function() { return Properties.own(this.categories) },\n+\tgetCategoryNames: function() { return Properties.own(this.categories) },\n },\n 'debugging', {\n- toString: function() { return 'Trait(\\'' + this.name + '\\')' },\n+\ttoString: function() { return 'Trait(\\'' + this.name + '\\')' },\n });\n \n Object.extend(RealTrait, {\n- named: function(name, options) {\n- return this.prototype.traitRegistry[name] || new RealTrait(name, options);\n- },\n- createAnonymousTrait: function(baseName, options) {\n- var counter = 0, name;\n- do {\n- name = baseName + counter;\n- counter++;\n- } while(this.prototype.traitRegistry[name] != undefined);\n- return this.named(name, options);\n- }\n+\t named: function(name, options) {\n+\t\t return this.prototype.traitRegistry[name] || new RealTrait(name, options);\n+\t },\n+\t createAnonymousTrait: function(baseName, options) {\n+\t\t var counter = 0, name;\n+\t\t do {\n+\t\t\t name = baseName + counter;\n+\t\t\t counter++;\n+\t\t } while(this.prototype.traitRegistry[name] != undefined);\n+\t\t return this.named(name, options);\n+\t }\n });\n \n Object.extend(Global, {\n \n- Trait: function(/*traitName, def ... */) {\n- var args = $A(arguments),\n- traitName = args.shift(),\n- trait = RealTrait.named(traitName),\n- category = ' default category';\n- for (var i = 0; i < args.length; i++) {\n- if (Object.isString(args[i])) {\n- category = args[i];\n- } else {\n- trait.extend(category, args[i]);\n- }\n- }\n- return trait;\n- }\n+\t Trait: function(/*traitName, def ... */) {\n+\t\t var args = $A(arguments),\n+\t\t\t traitName = args.shift(),\n+\t\t\t trait = RealTrait.named(traitName),\n+\t\t\t category = ' default category';\n+\t\t for (var i = 0; i < args.length; i++) {\n+\t\t\t if (Object.isString(args[i])) {\n+\t\t\t\t category = args[i];\n+\t\t\t } else {\n+\t\t\t\t trait.extend(category, args[i]);\n+\t\t\t }\n+\t\t }\n+\t\t return trait;\n+\t }\n \n });\n \n","/core/lively/tests/ToolsTests.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/tests/ToolsTests.js\t2012-02-24 02:19:47.000000000 +0100\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/tests/ToolsTests.js\t2012-04-14 21:45:38.000000000 +0200\n@@ -1,388 +1,63 @@\n-module('lively.tests.ToolsTests').requires('lively.TestFramework', 'lively.Tools', 'lively.ide', 'tests.SerializationTests', 'lively.ide.AutoCompletion').toRun(function() {\n-\n-Object.extend(tests.ToolsTests, {\n-\tcreateDummyNamespace: function() {\n-\t\tconsole.assert(!tests.ToolsTests['testNS'], 'testNS already existing');\n-\t\t// creating 5 namespaces- namespace('testNS.one', tests.ToolsTests); namespace('testNS.two', tests.ToolsTests);\n-\t\tnamespace('testNS.three.threeOne', tests.ToolsTests);\n-\t\t// create classes\n-\t\tObject.subclass(tests.ToolsTests.namespaceIdentifier + '.testNS.Dummy', { method1: function() { 1 } });\n-\t\tObject.subclass(tests.ToolsTests.namespaceIdentifier + '.testNS.one.Dummy');\n-\t\tObject.subclass(tests.ToolsTests.namespaceIdentifier + '.testNS.three.threeOne.Dummy');\n-\t\t// create functions\n-\t\ttests.ToolsTests.testNS.dummyFunc = function() { return 1 };\n-\t\ttests.ToolsTests.testNS.three.threeOne.dummyFunc = function() { return 2 };\n-\t},\n-\tremoveDummyNamespace: function() { delete tests.ToolsTests['testNS'] },\n-});\n-\n-\n-// Browser related tests\n-TestCase.subclass('lively.tests.ToolsTests.SystemBrowserTests', {\n-\n-\tsetUp: function() {\n-\t\tvar browser = this.createBrowser();\n-\t\tvar root = this.createMockNode(browser);\n-\t\tbrowser.rootNode = function() { return root };\n-\t\tthis.browser = browser;\n-\t},\n-\n-\tcreateBrowser: function() {\n-\t\treturn new lively.ide.BasicBrowser();\n-\t},\n-\n-\tmockNodeClass: lively.ide.BrowserNode.subclass('lively.tests.ToolsTests.MockNode', {\n-\t\t\tinitialize: function($super, target, browser, c) { $super(target, browser); this.children = c || [] },\n-\t\t\tchildNodes: function() { return this.children; }\n-\t\t}),\n-\t\t\n-\tcreateMockNode: function(browser, children, target, name) {\n-\t\tvar node = new this.mockNodeClass(target, browser, children);\n-\t\tif (name)\n-\t\t\tnode.asString = function() { return name}\n-\t\treturn node;\n-\t},\n-\n-\ttestSelectNodeInFirstPane: function() {\n-\t\tlively.ide.startSourceControl();\n-\t\tvar browser = this.browser;\n-\t\tvar node1 = this.createMockNode(browser);\n-\t\tvar node2 = this.createMockNode(browser);\n-\t\tbrowser.rootNode().children = [node1, node2];\n-\t\tbrowser.buildView();\n-\t\tthis.assertEquals(browser.nodesInPane('Pane1').length, 2);\n-\t\tbrowser.selectNode(node1);\n-\t\tthis.assertIdentity(node1, browser.selectedNode());\n-\t},\n-\n-\ttestFilterChildNodes: function() {\n-\t\tvar browser = this.browser;\n-\t\tvar node1 = this.createMockNode(browser);\n-\t\tvar node2 = this.createMockNode(browser);\n-\t\tnode1.shouldAppear = true; node2.shouldAppear = false;\n-\t\tbrowser.rootNode().children = [node1, node2];\n-\t\tvar testFilterClass = lively.ide.NodeFilter.subclass('lively.tests.ToolsTest.TestFilter', {\n-\t\t\tapply: function(nodes) { return nodes.select(function(ea) {return ea.shouldAppear}) }\n-\t\t});\n-\t\tvar result = browser.filterChildNodesOf(browser.rootNode(), [new testFilterClass()]);\n-\t\tthis.assertEquals(result.length, 1);\n-\t\tthis.assertIdentity(result[0], node1);\n-\t},\n-\n-\ttestUninstallFilter: function() {\n-\t\tvar browser = this.browser;\n-\t\tbrowser.installFilter(new lively.ide.NodeFilter(), 'Pane1');\n-\t\tthis.assert(browser.getPane1Filters().length > 0);\n-\t\tbrowser.uninstallFilters(function(filter) { return filter instanceof lively.ide.NodeFilter }, 'Pane1')\n-\t\tthis.assertEquals(browser.getPane1Filters().length, 0);\n-\t},\n-\n-\ttestSortFilter: function() {\n-\t\tvar filter = new lively.ide.SortFilter();\n-\t\tvar n1 = this.createMockNode(null, null, null, 'c');\n-\t\tvar n2 = this.createMockNode(null, null, null, 'a');\n-\t\tvar n3 = this.createMockNode(null, null, null, 'b');\n-\t\tvar result = filter.apply([n1, n2, n3]);\n-\t\tthis.assertEquals(result.length, 3);\n-\t\tthis.assertIdentity(result[0], n2);\n-\t\tthis.assertIdentity(result[1], n3);\n-\t\tthis.assertIdentity(result[2], n1);\n-\t},\n-testBrowserFourthPane: function() {\n-\tvar browser = this.browser;\n-\n-\tvar n4 = this.createMockNode(browser, [], null, 'd');\n-\tvar n3 = this.createMockNode(browser, [n4], null, 'c');\n-\tvar n2 = this.createMockNode(browser, [n3], null, 'b');\n-\tvar n1 = this.createMockNode(browser, [n2], null, 'a');\n-\t\n-\tbrowser.rootNode().children = [n1];\n-\n-\tvar m = browser.buildView();\n-\t\n-\tbrowser.selectNode(n1);\n-\tbrowser.selectNode(n2);\n-\tbrowser.selectNode(n3);\n-\n-\t// m.openInWorld()\n-\n-\tthis.assertEquals(browser.nodesInPane('Pane4').length, 1);\t\n-\tthis.assertIdentity(n4, browser.nodesInPane('Pane4')[0]);\n-},\n- newMethod: function() {\n- // enter comment here\n- },\n-\n-\n-\n-\n-\n-});\n-tests.ToolsTests.SystemBrowserTests.subclass('lively.tests.ToolsTests.BrowserNodeTest',\n-'running', {\n-\tcreateBrowser: function() {\n-\t\t// FIXME\n-\t\treturn new lively.ide.SystemBrowser();\n-\t},\n-\n-\tbuildTestSource: function() {\n-\t\t// create and parse the source into filefragments\n-\t\tvar src = \"\\n\\Object.subclass('Foo',\\n\\\n-'catA', {\\n\\\n-\tm1: function() { return 23 },\\n\\\n-\tm2: function() {},\\n\\\n-},\\n\\\n-'catB', {\\n\\\n-\tm3: function() { return 42},\\n\\\n-});\\n\\\n-\\n\\\n-Foo.addMethods('catC',{\\n\\\n-\tm4: function() {},\\n\\\n-});\"\n-\n-\t\tthis.db = new AnotherSourceDatabase();\n-\t\tvar rootFragment = this.db.prepareForMockModule('dummySource.js', src);\n-\n-\t\tthis.klassDef = rootFragment.subElements()[1]\n-\t\tthis.m1 = this.klassDef.subElements()[0];\n-\t\tthis.m2 = this.klassDef.subElements()[1];\n-\t\tthis.m3 = this.klassDef.subElements()[2];\n-\t\tthis.klassExtensionDef = rootFragment.subElements()[3]\n-\t\tthis.m4 = this.klassExtensionDef.subElements()[0];\n-\n-\t\tthis.fileFragment = rootFragment;\n-\n-\t\t// setup browser\n-\t\tvar completeFFNode = new lively.ide.CompleteFileFragmentNode(\n-\t\t\tthis.fileFragment, this.browser, null, this.fileFragment.name)\n-\t\tvar root = this.createMockNode(this.browser, [completeFFNode]);\n-\t\tthis.browser.rootNode = function() { return root };\n-\t},\n-\tbuildCopTestSource: function() {\n-\t\t// create and parse the source into filefragments\n-\t\tvar src = \"cop.create(\\\"testLayer\\\")\"\n-\n-\t\tthis.db = new AnotherSourceDatabase();\n-\t\tvar rootFragment = this.db.prepareForMockModule('dummyCopSource.js', src);\n-\n-\t\tthis.fileFragment = rootFragment;\n-\n-\t\t// setup browser\n-\t\tvar completeFFNode = new lively.ide.CompleteFileFragmentNode(\n-\t\t\tthis.fileFragment, this.browser, null, this.fileFragment.name)\n-\t\tvar root = this.createMockNode(this.browser, [completeFFNode]);\n-\n-\t\tthis.copNode = completeFFNode.childNodes()[0];\n-\n-\t\tthis.browser.rootNode = function() { return root };\n-\t},\n-\n-\n-\n-},\n-'testing', {\n-\n-\ttestCopFragmentWholeLayerEvaluate: function() {\n-\t\tthis.browser.buildView();\n-\t\tthis.buildCopTestSource();\n-\t\tvar node = this.copNode;\n-\t\tvar klass = Object.subclass('CopBrowserNodeDummy');\n-\t\tvar src = 'cop.create(\"testLayer\").refineClass(CopBrowserNodeDummy, { m: function() { return 23 } });'\n-\t\tnode.newSource(src);\n-\t\twithLayers([testLayer], function() {\n-\t\t\tthis.assertEquals(23, new klass().m());\n-\t\t}.bind(this))\t\t\n-\t},\n-\ttestCopFragmentPartialClassEvaluate: function() {\n-\t\tthis.browser.buildView();\n-\t\tthis.buildCopTestSource();\n-\t\tvar node = this.copNode;\n-\t\tvar klass = Object.subclass('CopBrowserNodeDummy');\n-\t\tvar src = 'cop.create(\"testLayer\").refineClass(CopBrowserNodeDummy, { m: function() { return 23 } });'\n-\t\tnode.newSource(src);\n-\t\tthis.assertEquals(1, node.childNodes().length);\n-\t\tvar klassNode = node.childNodes()[0];\n-\t\tklassNode.newSource('.refineClass(CopBrowserNodeDummy, { m: function() { return 42 } })')\n-\t\twithLayers([testLayer], function() {\n-\t\t\tthis.assertEquals(42, new klass().m(), 'klass not did not evaluate');\n-\t\t}.bind(this))\t\t\n-\t},\n-\ttestCopFragmentMethodEvaluate: function() {\n-\t\tthis.browser.buildView();\n-\t\tthis.buildCopTestSource();\n-\t\tvar node = this.copNode;\n-\t\tvar klass = Object.subclass('CopBrowserNodeDummy');\n-\t\tvar src = 'cop.create(\"testLayer\").refineClass(CopBrowserNodeDummy, {\\nm: function() { return 23 }\\n});'\n-\t\tnode.newSource(src);\n-\t\tvar methodNode = node.childNodes()[0].childNodes()[0];\n-\t\tmethodNode.newSource('m: function() { return 42 }')\n-\t\twithLayers([testLayer], function() {\n-\t\t\tthis.assertEquals(42, new klass().m(), 'method not did not evaluate');\n-\t\t}.bind(this))\t\t\n-\t},\n-\n-\n-\n-\ttestCreateCategoriesFromClassDef: function() {\n-\t\tthis.buildTestSource();\n-\t\tvar browser = this.browser;\n-\t\t\n-\t\tvar completeFFNode = browser.rootNode().childNodes().first();\n-\t\tthis.assertEquals(2, completeFFNode.childNodes().length);\n-\t\tvar classNode = completeFFNode.childNodes().first();\n-\n-\t\tthis.assertEquals(3, classNode.childNodes().length);\n-\t\tthis.assertEquals('-- all --', classNode.childNodes()[0].getName());\n-\t\tthis.assertEquals('catA', classNode.childNodes()[1].getName());\n-\t\tthis.assertEquals('catB', classNode.childNodes()[2].getName());\n-\n-\t\tthis.assertEquals(3, classNode.childNodes()[0].childNodes().length);\n-\t\tthis.assertEquals(2, classNode.childNodes()[1].childNodes().length);\n-\t\tthis.assertEquals(1, classNode.childNodes()[2].childNodes().length);\n-\t\t\n-\t\tvar methodNodes = classNode.childNodes()[1].childNodes()\n-\t\tthis.assertEquals('m1', methodNodes[0].getName());\n-\t\tthis.assertEquals('m2', methodNodes[1].getName());\n-\n-\t},\n-\ttestCreateCategoriesFromAddMethodDef: function() {\n-\t\tthis.buildTestSource();\n-\t\tvar browser = this.browser;\n-\t\t// browser.buildView()\n-\n-\t\tvar completeFFNode = browser.rootNode().childNodes().first();\n-\t\tthis.assertEquals(2, completeFFNode.childNodes().length);\n-\t\tvar addMethodNode = completeFFNode.childNodes()[1];\n-\n-\t\tthis.assertEquals(2, addMethodNode.childNodes().length);\n-\t\tthis.assertEquals('-- all --', addMethodNode.childNodes()[0].getName());\n-\t\tthis.assertEquals('catC', addMethodNode.childNodes()[1].getName());\n-\n-\t\t// category childs\n-\t\tthis.assertEquals(1, addMethodNode.childNodes()[0].childNodes().length);\n-\t\tthis.assertEquals(1, addMethodNode.childNodes()[1].childNodes().length);\n-\t\t\n-\t\tvar methodNodes = addMethodNode.childNodes()[1].childNodes()\n-\t\tthis.assertEquals('m4', methodNodes[0].getName());\n-\n-\t},\n-\n-\n-\ttestAddClassCommand: function() {\n-\t\tthis.buildTestSource();\n-\t\tvar browser = this.browser;\n-\t\tbrowser.buildView()\n-\n-\t\tbrowser.inPaneSelectNodeNamed('Pane1', 'dummySource.js');\n-\t\tvar commands = browser.commandMenuSpec('Pane2'),\n-\t\t\tcommandSpec = commands.detect(function(spec) { return spec[0] == 'add class' });\n-\t\tthis.assert(commandSpec && Object.isFunction(commandSpec[1]), 'Cannot find add class command');\n-\n-\t\tvar className = 'MyClass';\n-\t\tthis.answerPromptsDuring(commandSpec[1]);\n-\n-\t\tvar newClassFragment = this.fileFragment.subElements().detect(function(ff) {\n-\t\t\treturn ff.getName() == className;\n-\t\t});\n-\n-\t\tthis.assert(newClassFragment, 'new class not created');\n-\t\tthis.assert(newClassFragment.getSourceCode().startsWith('Object.subclass(\\'' + className + '\\','),\n-\t\t\t'source code of new class is strange');\n-\n-\t\t// var newNode = browser.selectedNode();\n-\t\t// this.assertEquals(newClassFragment, newNode.target, 'browser hasn\\'t selected the new class');\n-\t},\n-\n-\ttestAddMethodCommand: function() {\n-\t\tthis.buildTestSource();\n-\t\tvar browser = this.browser;\n-\t\tbrowser.buildView()\n-\n-\t\tbrowser.inPaneSelectNodeNamed('Pane1', 'dummySource.js');\n-\t\tbrowser.inPaneSelectNodeNamed('Pane2', 'Foo');\n-\t\tvar commands = browser.commandMenuSpec('Pane4');\n-\t\tvar commandSpec = commands.detect(function(spec) { return spec[0] == 'add method' });\n-\t\tthis.assert(commandSpec && Object.isFunction(commandSpec[1]), 'Cannot find add method command');\n-\n-\t\tvar methodName = 'newMethod';\n-\t\tthis.answerPromptsDuring(commandSpec[1]);\n-\n-\t\tvar newMethodFragment = this.fileFragment.flattened().detect(function(ff) {\n-\t\t\treturn ff.getName() == methodName;\n-\t\t});\n-\n-\t\tthis.assert(newMethodFragment, 'new class not created');\n-\t\tthis.assert(newMethodFragment.getSourceCode().startsWith(methodName + ': function() {'),\n-\t\t\t'source code of new method is strange');\n-\n-\t\t// var newNode = browser.selectedNode();\n-\t\t// this.assertEquals(newMethodFragment, newNode.target, 'browser hasn\\'t selected the new method');\n-\t},\n-\n-\n-\ttestBrowseIt: function() {\n-\t\tthis.buildTestSource();\n-\t\tvar browser = this.browser;\n-\t\tbrowser.buildView()\n-\n-\t\tthis.m1.basicBrowseIt(browser)\t\n-\n-\t\tthis.assertEquals(browser.nodesInPane('Pane4').length, 3);\t\n-\t\tthis.assertIdentity(this.m1, browser.nodesInPane('Pane4')[0].target);\n-\t},\n-\ttestBrowserKnowsCurrentModule: function() {\n-\t\tif (Global.Foo) Foo.remove();\n-\t\tthis.buildTestSource();\n-\t\tthis.browser.buildView()\n-\t\tthis.browser.selectNodeNamed('dummySource.js');\n-\t\tthis.browser.selectNodeNamed('Foo');\n-\t\tvar n = this.browser.selectedNode();\n-\t\tn.evalSource(n.sourceString());\n-\t\tthis.assert(Global.Foo, 'Class Foo could not be evaled');\n-\t\tthis.assertIdentity(Foo.sourceModule, module('dummySource'));\n-\t},\n-\n-\n+module('lively.tests.ToolsTests').requires(\n+ 'lively.TestFramework',\n+ 'lively.ide',\n+ 'tests.SerializationTests',\n+ 'lively.ide.AutoCompletion').toRun(function() {\n \n+var tests = lively.tests;\n \n+Object.extend(tests.ToolsTests, {\n+\t createDummyNamespace: function() {\n+\t\t console.assert(!tests.ToolsTests['testNS'], 'testNS already existing');\n+\t\t // creating 5 namespaces- namespace('testNS.one', tests.ToolsTests); namespace('testNS.two', tests.ToolsTests);\n+\t\t namespace('testNS.three.threeOne', tests.ToolsTests);\n+\t\t // create classes\n+\t\t Object.subclass(tests.ToolsTests.namespaceIdentifier + '.testNS.Dummy', { method1: function() { 1 } });\n+\t\t Object.subclass(tests.ToolsTests.namespaceIdentifier + '.testNS.one.Dummy');\n+\t\t Object.subclass(tests.ToolsTests.namespaceIdentifier + '.testNS.three.threeOne.Dummy');\n+\t\t // create functions\n+\t\t tests.ToolsTests.testNS.dummyFunc = function() { return 1 };\n+\t\t tests.ToolsTests.testNS.three.threeOne.dummyFunc = function() { return 2 };\n+\t },\n+\t removeDummyNamespace: function() { delete tests.ToolsTests['testNS'] },\n });\n \n-TestCase.subclass('lively.tests.ToolsTests.FileParserTest', {\n+TestCase.subclass('lively.ide.tests.FileParserTests.FileParserTest', {\n \n setUp: function() {\n-\tthis.sut = new FileParser();\n-\tthis.sut.verbose = false;\n+\t this.sut = new FileParser();\n+\t this.sut.verbose = false;\n },\n- \n+\n testParseClassDef: function() {\n-\tvar source = \"Object.subclass('Test', {});\"\n-\tthis.sut.parseFile('1', 0, source, null/*db*/, 'scan', null/*search_str*/)\n-\tthis.assertEquals(this.sut.changeList.length, 1);\n-\tthis.assertEquals(this.sut.changeList.first().name, 'Test');\n-\tthis.assertEquals(this.sut.changeList.first().type, 'classDef');\n+\t var source = \"Object.subclass('Test', {});\"\n+\t this.sut.parseFile('1', 0, source, null/*db*/, 'scan', null/*search_str*/)\n+\t this.assertEquals(this.sut.changeList.length, 1);\n+\t this.assertEquals(this.sut.changeList.first().name, 'Test');\n+\t this.assertEquals(this.sut.changeList.first().type, 'classDef');\n },\n- \n+\n testScanModuleDef: function() {\n-\tvar source = \"module('bla.blupf').requires('blupf.bla').toRun({\\nObject.subclass('Test', {\\n});\\n\\n});\"\n-\tthis.sut.parseFile('2', 0, source, null/*db*/, 'scan', null/*search_str*/)\n-\tthis.assertEquals(this.sut.changeList.length, 2);\n-\tthis.assertEquals(this.sut.changeList[0].type, 'moduleDef');\n+\t var source = \"module('bla.blupf').requires('blupf.bla').toRun({\\nObject.subclass('Test', {\\n});\\n\\n});\"\n+\t this.sut.parseFile('2', 0, source, null/*db*/, 'scan', null/*search_str*/)\n+\t this.assertEquals(this.sut.changeList.length, 2);\n+\t this.assertEquals(this.sut.changeList[0].type, 'moduleDef');\n },\n- \n+\n testScanFunctionDef01: function() {\n-\tvar source = \"module('bla.blupf').requires('blupf.bla').toRun({\\nfunction abc(a,b,c) {\\n return 1+2;\\n};\\nObject.subclass('Test', {\\n});\\n\\n});\"\n-\tthis.sut.parseFile('3', 0, source, null/*db*/, 'scan', null/*search_str*/)\n-\tthis.assertEquals(this.sut.changeList.length, 3);\n-\tthis.assertEquals(this.sut.changeList[1].type, 'functionDef');\n+\t var source = \"module('bla.blupf').requires('blupf.bla').toRun({\\nfunction abc(a,b,c) {\\n return 1+2;\\n};\\nObject.subclass('Test', {\\n});\\n\\n});\"\n+\t this.sut.parseFile('3', 0, source, null/*db*/, 'scan', null/*search_str*/)\n+\t this.assertEquals(this.sut.changeList.length, 3);\n+\t this.assertEquals(this.sut.changeList[1].type, 'functionDef');\n },\n- \n+\n testScanFunctionDef02: function() {\n var source = \"module('bla.blupf').requires('blupf.bla').toRun({\\nvar abc = function(a,b,c) {\\n return 1+2;\\n};\\nObject.subclass('Test', {\\n});\\n\\n});\"\n this.sut.parseFile('4', 0, source, null/*db*/, 'scan', null/*search_str*/)\n this.assertEquals(this.sut.changeList.length, 3);\n this.assertEquals(this.sut.changeList[1].type, 'functionDef');\n },\n- \n+\n testScanFunctionDefInDB: function() {\n var source = \"function abc(a,b,c) {\\n return 1+2;\\n};\"\n var db = new SourceDatabase();\n@@ -390,1370 +65,7 @@\n this.assertEquals(this.sut.changeList.length, 1);\n this.assertEquals(this.sut.changeList[0].type, 'functionDef');\n }\n- \n-});\n \n-TestCase.subclass('lively.tests.ToolsTests.JsParserTest', {\n- \n- setUp: function() {\n- this.sut = new JsParser();\n- },\n- \n- assertSubDescriptorsAreValid: function(descr) {\n- for (var i = 0; i < descr.length; i++) {\n- if (descr[i].subElements()) this.assertSubDescriptorsAreValid(descr[i].subElements());\n- if (!descr[i+1]) continue;\n- console.log(descr[i].name + ':' + descr[i].startIndex + '-' + descr[i].stopIndex + '<->' + descr[i+1].name + ':' + descr[i+1].startIndex + '-' + descr[i+1].stopIndex);\n- this.assert(descr[i].stopIndex < descr[i+1].startIndex,\n- 'descrs conflict: ' + descr[i].type + ' ' + descr[i].name + ' <----> ' + descr[i+1].type + ' ' + descr[i+1].name);\n- \n- } \n- },\n- \n- assertDescriptorsAreValid: function(descr) {\n- for (var i = 0; i < descr.length; i++) {\n- if (descr[i].subElements()) this.assertSubDescriptorsAreValid(descr[i].subElements());\n- if (!descr[i+1]) continue;\n- console.log(descr[i].name + ':' + descr[i].startIndex + '-' + descr[i].stopIndex + '<->' + descr[i+1].name + ':' + descr[i+1].startIndex + '-' + descr[i+1].stopIndex);\n- this.assertEquals(descr[i].stopIndex, descr[i+1].startIndex - 1,\n- 'descrs conflict: ' + descr[i].type + ' ' + descr[i].name + ' <----> ' + descr[i+1].type + ' ' + descr[i+1].name);\n- }\n- },\n-\n-\tsrcFromLinesOfFile: function(fileName, startLine, endLine) {\n-\t\t// for testing parsing parts of files\n-\t\t// returns a substring of the file begining with first character if startLine and last Character of endLine\n-\t\t// var db = lively.ide.startSourceControl();\n-\t\tvar src = new WebResource(URL.codeBase.withFilename('lively/' + fileName)).get().content\n- // var src = db.getCachedText(fileName);\n-\t\tvar lines = src.split('\\n');\n-\t\tendLine = Math.min(endLine, lines.length-1);\n-\t\t// get the ptrs\n-\t\tvar start = JsParser.prototype.ptrOfLine(lines, startLine);\n-\t\tvar end = JsParser.prototype.ptrOfLine(lines, endLine) + lines[endLine-1].length-1;\n-\t\treturn src.slice(start, end);\n-\t}\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.JsParserTest1', {\n- \n- testParseClass: function() { // Object.subclass\n- var src = 'Object.subclass(\\'Dummy\\', {\\n' +\n- '\\tsetUp: function() { tests.ToolsTests.createDummyNamespace() },\\n' +\n- '\\ttearDown: function() { tests.ToolsTests.removeDummyNamespace() }\\n' +\n- '})';\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'Dummy');\n- this.assertEquals(descriptor.superclassName, 'Object');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- testParseClassWithTrait: function() { // Object.subclass\n- var src = 'lively.xyz.ABC.TheClass.subclass(\\'CodeMarkupParser\\', ViewTrait, {\\n' +\n- 'formals: [\"CodeDocument\", \"CodeText\", \"URL\"],\\n\\n' +\n- 'initialize: function(url) {\\n\\n}\\n\\n});'\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'CodeMarkupParser');\n- this.assertEquals(descriptor.superclassName, 'lively.xyz.ABC.TheClass');\n- this.assertEquals(descriptor.traits[0], 'ViewTrait');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertEquals(descriptor.subElements().length, 2);\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- testParseClassWithRealTrait: function() { // Object.subclass\n- var src = 'lively.xyz.ABC.TheClass.subclass(\\'SomeClass\\', Trait(\\'SomeTrait\\'), {});'\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'SomeClass');\n- this.assertEquals(descriptor.superclassName, 'lively.xyz.ABC.TheClass');\n- this.assertEquals(descriptor.traits[0], 'SomeTrait');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- testParseClassWithRealTrait2: function() { // Object.subclass\n- var src = 'lively.xyz.ABC.TheClass.subclass(\\'SomeClass\\', Trait(\\'SomeTrait\\'));'\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'SomeClass');\n- this.assertEquals(descriptor.superclassName, 'lively.xyz.ABC.TheClass');\n- this.assertEquals(descriptor.traits[0], 'SomeTrait');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n-\n-\n-testParseEmptyClass: function() { // Object.subclass\n- var src = 'Object.subclass(\\'Foo\\', {\\n\\n\\n});'\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'Foo');\n- this.assertEquals(descriptor.superclassName, 'Object');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertEquals(descriptor.subElements().length, 0);\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n-\n- \n- testParseSimpleSubclassing: function() {\n- var src = 'Wrapper.subclass(\\'lively.scene.Node\\');';\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'lively.scene.Node');\n- this.assertEquals(descriptor.superclassName, 'Wrapper');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertEquals(descriptor.subElements().length, 0);\n- },\n- \n- testParseClassAndMethods: function() { // Object.subclass\n- var src = 'Object.subclass(\\'Dummy\\', {\\n' +\n- '\\tsetUp: function() { tests.ToolsTests.createDummyNamespace() },\\n' +\n- 'formals: [\"Pane1Content\",\\n\\t\\t\"Pane1Selection\"],\\n' +\n- '\\ttearDown: function() { tests.ToolsTests.removeDummyNamespace() }\\n' +\n- '})';\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- \n- var dscr = descriptor.subElements();\n- this.assertEquals(dscr.length, 3);\n- this.assertEquals(dscr[0].name, 'setUp');\n- this.assertIdentity(dscr[0].startIndex, src.indexOf('\\tsetUp'));\n- this.assertIdentity(dscr[0].stopIndex, src.indexOf(',\\nformals'));\n- this.assertEquals(dscr[1].name, 'formals');\n- this.assertIdentity(dscr[1].startIndex, src.indexOf('formals:'));\n- this.assertIdentity(dscr[1].stopIndex, src.indexOf(',\\n\\ttearDown'));\n- this.assertEquals(dscr[2].name, 'tearDown');\n- this.assertIdentity(dscr[2].startIndex, src.indexOf('\\ttearDown'));\n- this.assertIdentity(dscr[2].stopIndex, src.lastIndexOf('\\n\\})'));\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- testParseMethod1: function() { // xxx: function()...,\n- var src = 'testMethod_8: function($super,a,b) { function abc(a) {\\n\\t1+2;\\n}; }';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'testMethod_8');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- },\n- \n- testParseMethod2: function() { // xxx: function()...,\n- var src = 'onEnter: function() {},';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'onEnter');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- },\n- \n- testParseMethod3: function() { // xxx: function()...,\n- var src = 'setShape: function(newShape) {\\n\\tthis.internalSetShape(newShape);\\n}.wrap(Morph.onLayoutChange(\\'shape\\')),';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'setShape');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- },\n-\n- testParseMethodWithComment: function() {\n- \t\tvar src = 'm1: function() { /*\\{*/ }';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n-\t\t\tthis.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'm1');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- },\n- \n- testParseProperty: function() { // xxx: yyy,\n- var src = 'initialViewExtent: pt(400,250),';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'initialViewExtent');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(','));\n- },\n-\n- testParseObject: function() { // var object = {...};\n- var src = 'var Converter = {\\n'+\n- '\\tdocumentation: \"singleton used to parse DOM attribute values into JS values\",\\n\\n\\n\\n' +\n- 'toBoolean: function toBoolean(string) {\\n' +\n- \t'return string && string == \\'true\\';\\n}\\n\\n};';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('objectDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'Converter');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- this.assertEquals(descriptor.subElements().length, 2);\n-\t\tthis.assert(descriptor.subElements()[0].isStatic(), 'non static subelem');\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- testParseFunction1: function() { // function abc() {...};\n- var src = 'function equals(leftObj, rightObj) {\\n\\t\\treturn cmp(leftObj, rightObj);\\n\\t};'\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('functionDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'equals');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- },\n- \n- testParseFunction2: function() { // var abc = function() {...};\n- var src = 'var equals = function(leftObj, rightObj) {\\n\\t\\treturn cmp(leftObj, rightObj);\\n\\t};'\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('functionDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'equals');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- },\n- \n- testParseExecutedFunction: function() { // (function() {...});\n- var src = '(function testModuleLoad() {\\n\\t\\tvar modules = Global.subNamespaces(true);\\n\\t}).delay(5);';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('functionDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'testModuleLoad');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- },\n- \n- testParseStaticFunctions: function() { // Klass.method = function() {...};\n- var src = 'lively.tests.ToolsTests.ScriptEnvironment.open = function() {};'\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'open');\n- this.assertEquals(descriptor.className, 'lively.tests.ToolsTests.ScriptEnvironment');\n-\t\tthis.assert(descriptor.isStatic());\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n-\n-\ttestExtensionSubElementsAreStaticProperties: function() {\n-\t\tvar src = 'Object.extend(Bla, {\\nm1: function() {\\n 1+2\\n },\\n x: 1\\n});';\n-\t\tthis.sut.src = src;\n- var descriptor = this.sut.callOMeta('klassExtensionDef');\n-\t\tthis.assertEquals(descriptor.subElements()[0].name, 'm1');\n-\t\tthis.assert(descriptor.subElements()[0].isStatic, 'not static!');\n-\t},\n- \n- testParseMethodModification: function() { // Klass.protoype.method = function() {...};\n- var src = 'Morph.prototype.morphMenu = Morph.prototype.morphMenu.wrap(function(proceed, evt) { });';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'morphMenu');\n- this.assertEquals(descriptor.className, 'Morph');\n-\t\tthis.assert(!descriptor.isStatic());\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- testParseClassExtension01: function() { // Object.extend(...);\n- var src = 'Object.extend(tests.ToolsTests.ScriptEnvironment, { \\nopen: function() {\\n\\t\\t1+2\\n\\t}\\n});';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('klassExtensionDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assert(descriptor.name.startsWith('lively.tests.ToolsTests.ScriptEnvironment'));\n- this.assertEquals(descriptor.subElements().length, 1);\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- testParseClassExtension02: function() { // Klass.addMethods(...); || Klass.addProperties(...);\n- var src = 'Morph.addMethods({\\n\\ngetStyleClass: function() {\\n\\treturn this.styleClass;\\n},});';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('klassExtensionDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assert(descriptor.name.startsWith('Morph'));\n- this.assertEquals(descriptor.subElements().length, 1);\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'));\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- testParseComment: function() { // /* ... */ || // ...\n- var src = ' /*\\n * bla bla bla\\n *\\n */';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('comment');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.type, 'comment');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.lastIndexOf('/'));\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n- \n- xtestFileContent: function() {\n- var src = '// Bla\\n// ===\\n\\nnamespace(\\'lively.data\\');\\n\\nObject.subclass(\\'lively.data.Wrapper\\', { });\\n\\n';\n- this.sut.src = src;\n- var all = this.sut.callOMeta('fileContent');\n- this.assertEquals(all.length, 6);\n- },\n-\ttestParseClassWithURLProperty: function() {\n-\t\t\n- var src = 'Object.subclass(\\'Dummy\\', {\\n' +\n- '\\turl: \\'http://www.lively-kernel.org/trac\\',\\n' +\n- '})';\n- this.sut.src = src;\n- var descriptor = this.sut.parseClass();\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'Dummy');\n- this.assertEquals(descriptor.superclassName, 'Object');\n- this.assertIdentity(descriptor.startIndex, 0);\n- this.assertIdentity(descriptor.stopIndex, src.length - 1);\n- this.assertDescriptorsAreValid([descriptor]);\n- },\n-\n- \n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.JsParserParsesCoreTest', {\n- \n-\tshouldRun: false,\n-\t\n- test01ParseCoreAlternativ: function() {\n- // var url = URL.source.withFilename('Core.js');\n- // var result = this.sut.parseFileFromUrl(url);\n- var db = new SourceDatabase();\n- var src = db.getCachedText('Core.js');\n- var result = this.sut.parseSource(src);\n- this.assert(result && !result.isError)\n- // this.assertDescriptorsAreValid(result);\n- },\n-\n-\n-\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.JsParserTest2', {\n-\n- \ttestFindLinNo: function() {\n- var str = 'abc\\ndef123\\n\\n\\nxyz\\n';\n- var lines = str.split(/[\\n\\r]/);\n- this.assertEquals(this.sut.findLineNo(lines, 0), 1);\n- this.assertEquals(this.sut.findLineNo(lines, 2), 1);\n- this.assertEquals(this.sut.findLineNo(lines, 3), 1);\n- this.assertEquals(this.sut.findLineNo(lines, 4), 2);\n- this.assertEquals(this.sut.findLineNo(lines, 10), 2);\n- this.assertEquals(this.sut.findLineNo(lines, 11), 3);\n- this.assertEquals(this.sut.findLineNo(lines, 14), 5);\n- this.assertEquals(this.sut.findLineNo(lines, 16), 5);\n- },\n- \n- testParseCompleteSource: function() {\n- var src = '// Bla\\n// ===\\n\\nnamespace(\\'lively.data\\');\\n\\nObject.subclass(\\'lively.data.Wrapper\\', { });\\n\\n';\n- var result = this.sut.parseSource(src);\n- this.assertEquals(result.length, 5);\n- },\n- \n- testOverlappingIndices: function() {\n- var src = \n- '/*' + '\\n' +\n- ' * Copyright � 2006-2008 Sun Microsystems, Inc.' + '\\n' +\n- ' * All rights reserved. Use is subject to license terms.' + '\\n' +\n- ' * This distribution may include materials developed by third parties.' + '\\n' +\n- ' * ' + '\\n' +\n- ' * Sun, Sun Microsystems, the Sun logo, Java and JavaScript are trademarks' + '\\n' +\n- ' * or registered trademarks of Sun Microsystems, Inc. in the U.S. and' + '\\n' +\n- ' * other countries.' + '\\n' +\n- ' */ ' + '\\n' +\n- '\\n' +\n- '/**' + '\\n' +\n- '* Core.js. This file contains the core system definition' + '\\n' +\n- '* as well as the core Morphic graphics framework. ' + '\\n' +\n- '*/' + '\\n' + '\\n' + '\\n' +\n- '/* Code loader. Appends file to DOM. */' + '\\n' +\n- 'var Loader = {' + '\\n' +\n- '\\n' +\n- ' loadJs: function(url, onLoadCb, embedSerializable) {' + '\\n' +\n- '\\n' +\n- ' if (document.getElementById(url)) return;' + '\\n' +\n- '\\n' +\n- ' var script = document.createElement(\\'script\\');' + '\\n' +\n- ' script.id = url;' + '\\n' +\n- ' script.type = \\'text/javascript\\';' + '\\n' +\n- ' script.src = url;' + '\\n' +\n- ' var node = document.getElementsByTagName(embedSerializable ? \"defs\" : \"script\")[0];' + '\\n' +\n- ' if (onLoadCb) script.onload = onLoadCb;' + '\\n' +\n- ' node.appendChild(script);' + '\\n' +\n- ' },' + '\\n' +\n- '\\n' +\n- ' scriptInDOM: function(url) {' + '\\n' +\n- ' if (document.getElementById(url)) return true;' + '\\n' +\n- ' var preloaded = document.getElementsByTagName(\\'defs\\')[0].childNodes;' + '\\n' +\n- ' for (var i = 0; i < preloaded.length; i++)' + '\\n' +\n- ' if (preloaded[i].getAttribute &&' + '\\n' +\n- ' preloaded[i].getAttribute(\\'xlink:href\\') &&' + '\\n' +\n- ' url.endsWith(preloaded[i].getAttribute(\\'xlink:href\\')))' + '\\n' +\n- ' return true' + '\\n' +\n- ' return false;' + '\\n' +\n- ' }' + '\\n' +\n- '};';\n-\n- var result = this.sut.parseSource(src);\n- this.assertDescriptorsAreValid(result);\n- },\n- \n- testFailingKlass: function() { // scene.js 841\n- var src = 'this.PathElement.subclass(\\'lively.scene.MoveTo\\', {\\n\\\n- charCode: \\'M\\',\\n\\n\\\n- initialize: function(x, y) {\\n\\\n- this.x = x;\\n\\\n- this.y = y;\\n\\\n- },\\n\\n\\\n- allocateRawNode: function(rawPathNode) {\\n\\\n- this.rawNode = rawPathNode.createSVGPathSegMovetoAbs(this.x, this.y);\\n\\\n- return this.rawNode;\\n\\\n- },\\n\\n\\\n- controlPoints: function() {\\n\\\n- return [pt(this.x, this.y)];\\n\\\n- },\\n\\n\\n\\n});';\n- var result = this.sut.parseSource(src);\n- this.assert(result.length = 1); // FIXME\n- this.assertEquals(result.last().type, 'klassDef');\n- this.assertDescriptorsAreValid(result);\n- },\n- \n- testFailingKlassExtension1: function() { // Core 1899 and before\n- var src = '\\n// Morph bindings to its parent, world, canvas, etc.' + '\\n' +\n- 'Morph.addMethods({' + '\\n' + '\\n' +\n- ' world: function() {' + '\\n' +\n- \t' return this.owner ? this.owner.world() : null;' + '\\n' +\n- '},' + '\\n' + '\\n' +\n- '// Morph coordinate transformation functions' + '\\n' + '\\n' +\n- '// SVG has transform so renamed to getTransform()' + '\\n' +\n- 'getTransform: function() {' + '\\n' +\n- \t' if (this.pvtCachedTransform) return this.pvtCachedTransform;\\n}' + '\\n' + '\\n' +\n- \t'});';\n- var result = this.sut.parseSource(src);\n- this.assert(result.length >= 1); // FIXME\n- this.assertEquals(result.last().type, 'klassExtensionDef');\n- this.assertDescriptorsAreValid(result);\n- },\n- \n- testFailingKlassExtension2: function() { // Base 1945\n- var src = 'Object.extend(Color, {' + '\\n' +\n- ' darkGray: Color.gray.darker(),' + '\\n' +\n- ' lightGray: Color.gray.lighter(),' + '\\n' +\n- ' veryLightGray: Color.gray.lighter().lighter(),' + '\\n' +\n- ' turquoise: Color.rgb(0, 240, 255),' + '\\n' +\n- ' // brown: Color.rgb(182, 67, 0),' + '\\n' +\n- ' // red: Color.rgb(255, 0, 0),' + '\\n' +\n- ' orange: Color.rgb(255, 153, 0),' + '\\n' +\n- ' // yellow: Color.rgb(204, 255, 0),' + '\\n' +\n- ' // limeGreen: Color.rgb(51, 255, 0),' + '\\n' +\n- ' // green: Color.rgb(0, 255, 102),' + '\\n' +\n- ' // cyan: Color.rgb(0, 255, 255),' + '\\n' +\n- ' // blue: Color.rgb(0, 102, 255),' + '\\n' +\n- ' // purple: Color.rgb(131, 0, 201),' + '\\n' +\n- ' // magenta: Color.rgb(204, 0, 255),' + '\\n' +\n- ' // pink: Color.rgb(255, 30, 153),' + '\\n' +\n- ' primary: {' + '\\n' +\n- '\t// Sun palette' + '\\n' +\n- '\tblue: Color.rgb(0x53, 0x82, 0xA1),' + '\\n' +\n- '\torange: Color.rgb(0xef, 0x6f, 0x00),' + '\\n' +\n- '\tgreen: Color.rgb(0xb2, 0xbc, 00),' + '\\n' +\n- '\tyellow: Color.rgb(0xff, 0xc7, 0x26)' + '\\n' +\n- ' },' + '\\n' +\n- '' + '\\n' +\n- ' secondary: {' + '\\n' +\n- '\tblue: Color.rgb(0x35, 0x55, 0x6b),' + '\\n' +\n- '\torange: Color.rgb(0xc0, 0x66, 0x00),' + '\\n' +\n- '\tgreen: Color.rgb(0x7f, 0x79, 0x00),' + '\\n' +\n- '\tyellow: Color.rgb(0xc6, 0x92, 0x00)' + '\\n' +\n- ' },' + '\\n' +\n- '' + '\\n' +\n- ' neutral: {' + '\\n' +\n- '\tlightGray: Color.rgb(0xbd, 0xbe, 0xc0),' + '\\n' +\n- '\tgray: Color.rgb(0x80, 0x72, 0x77)' + '\\n' +\n- ' }' + '\\n});';\n- var result = this.sut.callOMeta('klassExtensionDef', src);\n- this.assertEquals(result.type, 'klassExtensionDef');\n- },\n- \n- testFailingKlassExtension3: function() {\n- var src = 'Morph.addMethods(\\{\\})\\}\\)';\n- var result = this.sut.callOMeta('klassExtensionDef', src);\n- this.assertEquals(result.type, 'klassExtensionDef');\n- },\n- \n- testFailingPropertyDef: function() {\n- var src = 'neutral: \\{' + '\\n' +\n- \t'lightGray: Color.rgb(0xbd, 0xbe, 0xc0),' + '\\n' +\n- \t'gray: Color.rgb(0x80, 0x72, 0x77)' + '\\n' + '\\},';\n- \tvar result = this.sut.callOMeta('propertyDef', src);\n-\t\tthis.assert(!result.isStatic());\n- this.assertEquals(result.type, 'propertyDef');\n- },\n- \n- testFailingUsing: function() { // from Main.js\n- var src = '/**\\n\\\n-* Main.js. System startup and demo loading.\\n\\\n-*/\\n\\\n-using(lively.lang.Execution).run(function(exec) {\\n\\\n-main.logCompletion(\"main\").delay(Config.mainDelay);\\n\\\n-}.logCompletion(\"Main.js\"));';\n- var result = this.sut.parseSource(src);\n- this.assertEquals(result.length, 2);\n- this.assertEquals(result[1].type, 'usingDef');\n- this.assertEquals(result[1].stopIndex, src.length-1);\n- this.assertEquals(result[1].subElements().length, 1);\n- },\n- \n-testParseModuledef: function() {\n- var src = 'module(\\'lively.TileScripting\\').requires(\\'lively.Helper\\').toRun(function(tests.ToolsTests) {\\n\\nMorph.addMethods({})\\n});';\n- var result = this.sut.parseSource(src);\n-\n- this.assertEquals(result.length, 1);\n- this.assertEquals(result[0].type, 'moduleDef');\n- this.assertEquals(result[0].name, 'lively.TileScripting');\n- this.assertEquals(result[0].startIndex, 0);\n- this.assertEquals(result[0].stopIndex, src.length-1);\n- },\n- \n-\ttestParseModuleAndClass: function() {\n- var src = 'module(\\'lively.xyz\\').requires(\\'abc.js\\').toRun(function(tests.ToolsTests) {\\n\\Object.subclass(\\'Abcdef\\', {\\n}); // this is a comment\\n});';\n- var result = this.sut.parseSource(src);\n-\n- this.assertEquals(result.length, 1);\n- this.assertEquals(result[0].type, 'moduleDef');\n- this.assertEquals(result[0].stopIndex, src.length-1);\n- },\n-\n- testParseModuleAndUsingDef: function() { // /* ... */ || // ...\n- var src = 'module(\\'lively.TileScripting\\').requires(\\'lively/Helper.js\\').toRun(function(tests.ToolsTests) {\\n\\\n-using().run(function() {\\nMorph.addMethods({})\\n})\\n});';\n- var result = this.sut.parseSource(src);\n- this.assertEquals(result.length, 1);\n- this.assertEquals(result[0].type, 'moduleDef');\n- this.assertEquals(result[0].subElements().length, 1);\n- this.assertEquals(result[0].subElements()[0].type, 'usingDef');\n- },\n-\n-\ttestFailingProperty: function() { // multiline properties\n-\t\tvar src = 'documentation: \\'Extended FileParser\\' +\\n\\t\\t\\t\\'bla\\','\n-\t\tvar result = this.sut.callOMeta('propertyDef', src);\n- this.assertEquals(result.type, 'propertyDef');\n-\t\tthis.assert(!result.isStatic());\n-\t\tthis.assertEquals(result.stopIndex, src.length-1);\n- },\n-\n-\ttestParseError: function() { // unequal number of curly bracktes\n-\t\tvar src = 'Object.subclass(\\'ClassAEdited\\', \\{';\n-\t\tvar result = this.sut.parseSource(src);\n-\t\t// y = result;\n-\t\t// FIXME currently Object.subclass is parsed as unknown --> create 'keywords' in parser\n-\t\t// this.assertEquals(result.length, 1); \n- this.assert(result[1].isError, 'no Error');\n- },\n-testFailingRegex: function() {\n-\t//var src = \"toSmalltalk: function() {\\nreturn Object.isString(this.value) ? '\\\\'' + this.value.replace(/'/g, '\\'\\'') + '\\'' : this.value;\\n},\";\n-\tvar src = \"toSmalltalk: function() { return /'/ },\";\n-\tvar result = this.sut.callOMeta('propertyDef', src);\n-\tthis.assert(result, 'not recognized');\n-\tthis.assertEquals(result.name, 'toSmalltalk');\n-\tthis.assertIdentity(result.startIndex, 0);\n-\tthis.assertIdentity(result.stopIndex, src.length - 1);\n-},\n-\n-\ttestParseGetter: function() { // xxx: function()...,\n- var src = 'get foo() { return 23 },';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'foo');\n- },\n-\ttestParseSetter: function() { // xxx: function()...,\n- var src = 'set foo(val) { this._val = val + 42 },';\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'foo');\n- },\n-testParseKlassWithTwoTraits: function() {\n-\t\tvar src = 'X.subclass(\\'Y\\', Trait1, Trait2, {\\n' +\n-\t\t\t\t'\tm1: function(),\\n' +\n-\t\t\t\t'});'\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.parseClass();\n-\t\tthis.assert(descriptor, 'no descriptor');\n-\n-\t\tthis.assertEquals('Y', descriptor.name);\n-\t\tthis.assertEquals('Trait1', descriptor.traits[0]);\n-\t\tthis.assertEquals('Trait2', descriptor.traits[1]);\n-\t\tthis.assertDescriptorsAreValid([descriptor]);\t\t\n-},\n-\ttestParseFailingMethodWithComment: function() {\n- var src =\n-\t\t\t// ' /**\\n' +\n-\t\t\t// ' * override b/c of parent treatement\\n' +\n-\t\t\t// ' */\\n' +\n-\t\t\t' relativize: function(pt) { \\n' +\n-\t\t\t' return 3;\\n' +\n-\t\t\t' },'\n-\n- this.sut.src = src;\n- var descriptor = this.sut.callOMeta('propertyDef');\n- this.assert(descriptor, 'no descriptor');\n- this.assertEquals(descriptor.name, 'relativize');\n-\t},\n-\n-\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.JsParserTest3', {\n-\n-\tshouldRun: false,\n-\t\n-\tdocumentation: 'Tests which directly access LK files. Tests are quite brittle because they will fail when th eline numbers of the used files change.',\n- \n- testParseWorldMorph: function() { // Object.subclass\n-\t\t// Class definition of Morph\n-\t\tvar src = this.srcFromLinesOfFile('Core.js', 4463, 5640 + 1);\n- var descriptor = this.sut.callOMeta('klassDef', src);\n- this.assertEquals(descriptor.type, 'klassDef');\n- },\n- \n-/* testParseOldFileParser: function() {\n-\t\t// Class definition of FileParser\n-\t\tvar src = this.srcFromLinesOfFile('Tools.js', 1223, 1481);\n- var descriptor = this.sut.callOMeta('klassDef', src);\n- this.assertEquals(descriptor.type, 'klassDef');\n- },\n- \n- testParseTest: function() {\n- var src = 'xyz: function() { \\'\\}\\' },'\n- var descriptor = this.sut.callOMeta('propertyDef', src);\n- this.assertEquals(descriptor.type, 'propertyDef');\n- this.assertEquals(descriptor.stopIndex, src.length-1);\n- },\n- \n- testParseTestKlass: function() {\n-\t\t// Class definition of JsParserTest1\n-\t\tvar src = this.srcFromLinesOfFile('tests/ToolsTests.js', 134, 367);\n- var descriptor = this.sut.callOMeta('klassDef', src);\n- this.assertEquals(descriptor.type, 'klassDef');\n- },\n-\n-\ttestParseFailingAddMethods: function() {\n-\t\t// addMethods of Morph\n-\t\tvar src = this.srcFromLinesOfFile('Core.js', 3056, 3084);\n-\t\tvar descriptor = this.sut.callOMeta('klassExtensionDef', src);\n-\t\tthis.assertEquals(descriptor.type, 'klassExtensionDef');\n-\t},\n-\n-\ttestParseSelectionMorph: function() {\n-\t\t// Widget.js -- SelectionMorph\n-\t\tvar src = this.srcFromLinesOfFile('Widgets.js', 465, 688);\n-\t\tvar descriptor = this.sut.callOMeta('klassDef', src);\n-\t\tthis.assertEquals(descriptor.type, 'klassDef');\n-\t},\n-\n-\ttestParseHandMorph: function() {\n-\t\t// Core.js -- HandMorph\n-\t\t//var src = this.srcFromLinesOfFile('Core.js', 4345, 4875);\n-\t\tvar src = 'Morph.subclass(\"HandMorph\", {\\ndocumentation: \"abc\\'s defs\",\\n});';\n-\t\tvar descriptor = this.sut.callOMeta('klassDef', src);\n-\t\tthis.assertEquals(descriptor.type, 'klassDef');\n-\t},\n-*/\n-\n-});\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.ContextJSParserTest', {\n-\ttest01ParseSimpleLayerDef: function() {\n-\tvar src = 'cop.create(\"TestLayer\");';\n-\tthis.sut.src = src;\n-\tvar descriptor = this.sut.callOMeta(\"copDef\");\n-\tthis.assert(descriptor, 'no descriptor');\n-\tthis.assertEquals(descriptor.name, 'TestLayer');\n- },\n-test02ParseCopAsFile: function() {\n-\tvar src = 'cop.create(\"TestLayer\");';\n-\tvar result = this.sut.parseSource(src);\n-\tthis.assertEquals(result.length, 1);\n-\tthis.assertEquals(result[0].type, 'copDef');\n-\tthis.assertEquals(result[0].subElements().length, 0);\n-},\n-test03ParseCopSubElements: function() {\n-\tvar src = 'cop.create(\"TestLayer\")\\n\\t.refineClass(Foo);';\n-\tthis.sut.src = src;\n-\tvar descriptor = this.sut.callOMeta(\"copDef\");\n-\tthis.assertEquals(descriptor.subElements().length, 1);\n-\tthis.assertEquals(descriptor.subElements()[0].name, 'Foo');\n-},\n-test04ParseCopSubElements2: function() {\n-\tvar src = '.refineObject(Foo, {m1: function() {},\\n\\t\\tm2: function() {},})';\n-\tthis.sut.src = src;\n-\tvar descriptor = this.sut.callOMeta(\"copSubElement\");\n-\tthis.assertEquals(descriptor.name, 'Foo');\n-\tthis.assertEquals(descriptor.subElements().length, 2);\n-\tthis.assertEquals(descriptor.subElements()[0].name, 'm1');\n-\tthis.assertEquals(descriptor.subElements()[1].name, 'm2');\n-},\n-test05ParseBeGlobal: function() {\n-\tvar src = '.beGlobal()';\n-\tthis.sut.src = src;\n-\tvar descriptor = this.sut.callOMeta(\"copSubElement\");\n-\tthis.assertEquals(descriptor.name, 'beGlobal()');\n-},\n-\n-\n-\n-\n-});\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.TraitsParserTest', {\n-\ttest01ParseSimpleTraitDef: function() {\n-\t\tvar src = 'Trait(\\'Foo\\');';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta(\"traitDef\");\n-\t\tthis.assert(descriptor, 'no descriptor');\n-\t\tthis.assertEquals(descriptor.name, 'Foo');\n- },\n-\ttest02ParseTraitAsFile: function() {\n-\t\tvar src = 'Trait(\\'Foo\\');';\n-\t\tvar result = this.sut.parseSource(src);\n-\t\tthis.assertEquals(result.length, 1);\n-\t\tthis.assertEquals(result[0].type, 'traitDef');\n-\t\tthis.assertEquals(result[0].subElements().length, 0);\n-\t},\n-\ttest03ParseTraitSubElements: function() {\n-\t\tvar src = 'Trait(\"Foo\",\\n {a: 1,})';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta(\"traitDef\");\n-\t\tthis.assertEquals(descriptor.subElements().length, 1);\n-\t},\n-\ttest04ParseTraitWithMethodCategories: function() {\n-\t\tvar src = 'Trait(\"Foo\",\\n \\'test1\\', {\\na: 1,\\nb: 2\\n},\\n\\'test2\\', {\\nc: 3\\n})';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta(\"traitDef\");\n-\t\tthis.assertEquals(descriptor.subElements().length, 3);\n-\t},\n-\n-\ttest05ParseApplyTo: function() {\n-\t\tvar src = '.applyTo(Bar, {exclude: [\"x\"],})';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta(\"traitSubElement\");\n-\t\tthis.assertEquals(descriptor.name, ' -> Bar');\n-\t\tthis.assertEquals(descriptor.subElements().length, 1);\n-\t},\n-\n-});\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.MethodCategoryParseTest', {\n-\n-\ttest01ParseAddMethodsWithCategory: function() {\n-\t\tthis.sut.debugMode = true\n-\t\tvar src = 'Foo.addMethods(\\'categoryA\\', { foo: function() { return 23 }, });';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta('klassExtensionDef');\n-\t\tthis.assert(descriptor, 'no descriptor');\n-\t\tthis.assert('Foo', descriptor.name);\n-\t\tthis.assertEquals(descriptor.subElements().length, 1);\n-\t\tthis.assertIdentity(descriptor.startIndex, 0);\n-\t\tthis.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'), 'stopIndex wrong');\n-\t\tthis.assertDescriptorsAreValid([descriptor]);\n-\t\tvar methodDescriptor = descriptor.subElements()[0];\n-\t\tthis.assertEquals('foo', methodDescriptor.name);\n-\n-\t\tthis.assertEquals('categoryA', methodDescriptor.category.getName());\n-\t\tthis.assertEquals(methodDescriptor.category.startIndex, 15);\n-\t\tthis.assertEquals(methodDescriptor.category.stopIndex, 61);\n-\t\t// this.assertEquals('\\'categoryA\\', { foo: function() { return 23 }, }',\n-\t\t\t// methodDescriptor.category.getSourceCode());\n-\n-\t\tthis.assertEquals(1, descriptor.categories.length);\n- },\n-test02ParseSubclassWithCategory: function() {\n-\t\tthis.sut.debugMode = true\n-\t\tvar src = 'Object.subclass(\\'Foo\\', \\'categoryA\\', { foo: function() { return 23 }, }, \\'categoryB\\', { foo2: function() { return 42 }, });';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta('klassDef');\n-\t\tthis.assert(descriptor, 'no descriptor');\n-\t\tthis.assert('Foo', descriptor.name);\n-\t\tthis.assertEquals(descriptor.subElements().length, 2);\n-\t\tthis.assertIdentity(descriptor.startIndex, 0);\n-\t\tthis.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'), 'stopIndex wrong');\n-\t\tthis.assertDescriptorsAreValid([descriptor]);\n-\n-\t\tvar methodDescriptor = descriptor.subElements()[0];\n-\t\tthis.assertEquals('foo', methodDescriptor.name);\n-\t\tthis.assertEquals('categoryA', methodDescriptor.category.getName());\n-\n-\t\tmethodDescriptor = descriptor.subElements()[1];\n-\t\tthis.assertEquals('foo2', methodDescriptor.name);\n-\t\tthis.assertEquals('categoryB', methodDescriptor.category.getName());\n- },\n-test03RecognizeCategoriesAsFileFragments: function() {\n-\t\tthis.sut.debugMode = true\n-\t\tvar src = 'Object.subclass(\\'Foo\\', \\'categoryA\\', { m1: function() {}, m2: function() {}, });';\n-\t\tthis.sut.src = src;\n-\t\tvar descriptor = this.sut.callOMeta('klassDef');\n-\t\tthis.assert(descriptor, 'no descriptor');\n-\t\tthis.assert('Foo', descriptor.name);\n-\t\tthis.assertEquals(descriptor.subElements().length, 2);\n-\t\tthis.assertIdentity(descriptor.startIndex, 0);\n-\t\tthis.assertIdentity(descriptor.stopIndex, src.lastIndexOf(';'), 'stopIndex wrong');\n-\t\tthis.assertDescriptorsAreValid([descriptor]);\n-\n-\t\tthis.assertEquals(1, descriptor.categories.length);\n-\t\t// var categoryDescriptor = descriptor.categories()[0];\n-\n- },\n-\n-\n-\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.OMetaParserTest', {\n-\n-\tdocumentation: 'For testing parsing of OMeta grammar definitions themselves',\n-\n-\tsetUp: function() {\n-\t\tthis.sut = new OMetaParser();\n-\t},\n-\n-\ttestParseBasicGrammar: function() {\n-\t\tvar src = 'ometa LKFileParser <: Parser {}';\n- var result = this.sut.callOMeta('ometaDef', src);\n- this.assertEquals(result.name, 'LKFileParser');\n- this.assertEquals(result.superclassName, 'Parser');\n- this.assertIdentity(result.startIndex, 0);\n- this.assertIdentity(result.stopIndex, src.length - 1);\n-\t},\n-\n-\ttestParseBasicGrammarWithoutInheritance: function() {\n-\t\tvar src = 'ometa LKFileParser {}';\n- var result = this.sut.callOMeta('ometaDef', src);\n- this.assertEquals(result.name, 'LKFileParser');\n-\t},\n-\n-\ttestParseBasicGrammarWithRules: function() {\n-\t\tvar src = 'ometa LKFileParser {\\n' +\n-\t\t\t'rule1 = abc,\\n' +\n-\t\t\t'rule2 :x = xyz,\\n' +\n-\t\t\t'rule3 = abcxyz -> { 1+2 }\\n' +\n-\t\t\t'}';\n- var result = this.sut.parseSource(src);\n- this.assertEquals(result[0].name, 'LKFileParser');\n-\t\tvar sub = result[0].subElements();\n-\t\tthis.assertEquals(sub.length, 3);\n-\t\tthis.assertEquals(sub[0].name, 'rule1');\n-\t\tthis.assertEquals(sub[0].type, 'ometaRuleDef');\n-\t\tthis.assertEquals(sub[1].name, 'rule2');\n-\t\tthis.assertEquals(sub[2].name, 'rule3');\n-\t},\n-\n-\ttestParseRule: function() {\n-\t\tvar src = 'abc :x :y = seq(\\'123\\') \\'1\\'\t-> {bla},'\n- var result = this.sut.callOMeta('ometaRuleDef', src);\n- this.assertEquals(result.name, 'abc');\n-\t\tthis.assertEqualState(result.parameters, ['x', 'y']);\n-\t\t/*this.assertEqualState(result.ometaPart, ' seq(\\'123\\') \\'1\\'\t');\n-\t\tthis.assertEqualState(result.jsPart, ' {bla}');*/\n-\t\tthis.assertIdentity(result.type, 'ometaRuleDef');\n- this.assertIdentity(result.startIndex, 0);\n- this.assertIdentity(result.stopIndex, src.length - 1);\n-\t},\n-\n-\ttestParseRule2: function() {\n-\t\tvar src = 'x = abc -> 1\\n\\t\\|xyz -> 2,';\n- var result = this.sut.callOMeta('ometaRuleDef', src);\n- this.assertEquals(result.name, 'x');\n- this.assertIdentity(result.startIndex, 0);\n- this.assertIdentity(result.stopIndex, src.length - 1);\n-\t},\n-\n-\ttestParseRule3: function() {\n-\t\tvar src = 'x = abc';\n- var result = this.sut.callOMeta('ometaRuleDef', src);\n- this.assertEquals(result.name, 'x');\n- this.assertIdentity(result.startIndex, 0);\n- this.assertIdentity(result.stopIndex, src.length - 1);\n-\t},\n-\n-\ttestParseRule4: function() {\n-\t\tvar src = 'x -> 2,';\n- var result = this.sut.callOMeta('ometaRuleDef', src);\n- this.assertEquals(result.name, 'x');\n- this.assertIdentity(result.startIndex, 0);\n- this.assertIdentity(result.stopIndex, src.length - 1);\n-\t},\n-\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.OMetaParserTestLKFile', {\n-\t\n-\tshouldRun: false,\n-\t\n-\tsetUp: function() {\n-\t\tthis.sut = new OMetaParser();\n-\t},\n-\n-\ttestParseLKFileParserTxt: function() {\n-\t\tvar fn = 'LKFileParser.txt';\n-\t\tvar src = this.srcFromLinesOfFile(fn, 0, 9999);\n-\t\tvar result = this.sut.parseSource(src, {fileName: fn});\n-\t\t//new ChangeList(fn, null, result).openIn(WorldMorph.current());\n- },\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.ChunkParserTest', {\n-\n-\tsetUp: function($super) {\n-\t\t$super();\n-\t\tthis.ometaParser = this.sut.ometaParser;\n-\t\tthis.chunkParser = Object.delegated(ChunkParser, {});\n-\t\tthis.debugFunction = function(src, grammarInstance, errorIndex) {\n-\t\t\tvar startIndex = Math.max(0, errorIndex - 100);\n- \tvar stopIndex = Math.min(src.length, errorIndex + 100);\n- \tvar str = src.substring(startIndex, errorIndex) + '<--Error-->' + src.substring(errorIndex, stopIndex);\n-\t\t\tconsole.log(str);\n-\t\t}\n-\t},\n-\n-\ttestParseChunkWithComment: function() {\n-\t\tvar src = '{/* abc */}'; // '{/}';\n-\t\tvar p = this.ometaParser;\n-\t\tvar result = p.matchAll(src, 'chunk', ['{', '}'], this.debugFunction.curry(src));\n-\t\tthis.assert(result, 'couldn\\'t parse');\n-\t\tthis.assertEquals(result.length, src.length);\n-\t},\n-\n-\ttestParseChunkWithComment2: function() {\n-\t\tvar src = '{// abc\\n }';\n-\t\tvar p = this.ometaParser;\n-\t\tvar result = p.matchAll(src, 'chunk', ['{', '}'], this.debugFunction.curry(src));\n-\t\tthis.assert(result, 'couldn\\'t parse');\t\n-\t\tthis.assertEquals(result.length, src.length);\n-\t},\n-\n-\ttestParseChunkWithString: function() {\n-\t\tvar src = '{\\'bl\\{a\\'}';\n-\t\tvar p = this.ometaParser;\n-\t\tvar result = p.matchAll(src, 'chunk', ['{', '}'], this.debugFunction.curry(src));\n-\t\tthis.assert(result, 'couldn\\'t parse');\n-\t\tthis.assertEquals(result.length, src.length);\n-\t},\n-\n-\ttestParseChunkWithString2: function() {\n-\t\tvar src = \"'a\\\\'b'\";\n-\t\tvar p = this.ometaParser;\n-\t\tvar result = p.matchAll(src, 'chunk', ['\\'', '\\''], this.debugFunction.curry(src));\n-\t\tthis.assert(result, 'couldn\\'t parse');\n-\t\tthis.assertEquals(result.length, src.length);\n-\t},\n-\n-\tXtestParseChunkWithTwoSlashes: function() {\n-\t\t// FIXME annoying bug\n-\t\t// how to decide if it is a regular expression or a / operator\n-\t\t// when we don't have a parse tree? Is it possible at all?\n-\t\tvar src = \"{ x / 3+ ' / ' }\";\n-\t\tvar p = this.ometaParser;\n-\t\tvar result = p.matchAll(src, 'chunk', ['{', '}'], this.debugFunction.curry(src));\n-\t\tthis.assert(result, 'couldn\\'t parse');\n-\t\tthis.assertEquals(result.length, src.length);\n-\t},\n-\n-});\n-\n-tests.ToolsTests.JsParserTest.subclass('lively.tests.ToolsTests.FileFragmentTest', {\n-\n-\tsetUp: function() {\n-\t\tthis.jsParser = new JsParser();\n-\t\t// we don't want to see alert\n-\t\tthis.oldAlert = WorldMorph.prototype.alert;\n-\t\tWorldMorph.prototype.alert = Functions.Null;\n-\n-\t\tthis.setUpSource();\n-\t},\n-\tsetUpSource: function() {\n-\t\t/* creates:\n-\t\tmoduleDef: foo.js (0-277 in foo.js, starting at line 1, 4 subElements)\n-\t\tklassDef: ClassA (55-123 in foo.js, starting at line 2, 1 subElements)\n-\t\tpropertyDef (proto): m1 (82-119 in foo.js, starting at line 3, 0 subElements)\n-\t\tpropertyDef (static): m3 (124-155 in foo.js, starting at line 8, 0 subElements)\n-\t\tfunctionDef: abc (156-179 in foo.js, starting at line 9, 0 subElements)\n-\t\tklassDef: ClassB (180-257 in foo.js, starting at line 10, 2 subElements)\n-\t\tpropertyDef (proto): m2 (209-230 in foo.js, starting at line 11, 0 subElements)\n-\t\tpropertyDef (proto): m3 (232-253 in foo.js, starting at line 12, 0 subElements)\n-\t\t*/\n-\t\tthis.db = new AnotherSourceDatabase();\n-\t\tthis.src = 'module(\\'foo.js\\').requires(\\'bar.js\\').toRun(function() {\\n' +\n-\t\t\t'Object.subclass(\\'ClassA\\', {\\n\\tm1: function(a) {\\n\\t\\ta*15;\\n\\t\\t2+3;\\n\\t},\\n});\\n' +\n-\t\t\t'ClassA.m3 = function() { 123 };\\n' +\n-\t\t\t'function abc() { 1+2 };\\n' +\n-\t\t\t'ClassA.subclass(\\'ClassB\\', {\\n\\tm2: function(a) { 3 },\\nm3: function(b) { 4 }\\n});\\n' +\n-\t\t\t'}); // end of module';\n-\t\tthis.root = this.db.prepareForMockModule('foo.js', this.src);\n-\t},\n-\n-\tsetUpAlternateSource: function() {\n-\t var src = 'Object.subclass(\"Dummy1\", {});\\n'+\n-\t 'Object.subclass(\"Dummy\", {\\ntest1: 1,\\ntest2: 2,\\n\\ntest2: 2,\\n});';\n-\t\tthis.db = new AnotherSourceDatabase();\n-\t\tthis.root = this.db.prepareForMockModule('foo2.js', src);\n-\t\tthis.src = src;\n-\t},\n-\n-\tsetUpAlternateSource2: function() {\n-\t\tvar src = 'module(\\'foo.js\\').requires(\\'bar.js\\').toRun(function() {\\n' +\n-\t\t'/*\\n' +\n-\t\t' * my comment\\n' +\n-\t\t' */\\n'+\n-\t\t'\\n' +\n-\t\t'// ClassA is so important\\n' +\n-\t\t'// foo bar\\n' +\n-\t\t'Object.subclass(\\'ClassA\\', {\\n\\n' +\n-\t\t'\\tm1: function(a) {\\n\\t\\ta*15;\\n\\t\\t2+3;\\n\\t},\\n});\\n\\n' +\n-\t\t'}); // end of module';\n-\t\tthis.db = new AnotherSourceDatabase();\n-\t\tthis.root = this.db.prepareForMockModule('foo.js', src);\n-\t\tthis.src = src;\n-\t},\n- \n-\ttearDown: function($super) {\n-\t\t$super();\n-\t\tWorldMorph.prototype.alert = this.oldAlert;\n-\t},\n-\n-\tfragmentNamed: function(name, optFilter) {\n-\t\treturn this.root.flattened().detect(function(ea) {\n-\t\t\tvar select = ea.name == name;\n-\t\t\tif (optFilter)\n-\t\t\t\tselect = select && optFilter(ea)\n-\t\t\treturn select;\n-\t\t});\n-\t},\n-\n-\ttestCorrectNumberOfFragments: function() {\n-\t\tthis.assertEquals(this.root.type, 'moduleDef');\n-\t\tthis.assertEquals(this.root.flattened().length, 8);\n-\t},\n-\n-\ttestFragmentsOfOwnFile: function() {\n-\t\tvar classFragment = this.fragmentNamed('ClassA');\n-\t\tthis.assertEquals(classFragment.fragmentsOfOwnFile().length, 8-1);\n-\t},\n-\n-\ttestPutNewSource: function() {\n-\t\tvar classFragment = this.fragmentNamed('ClassA');\n-\t\tclassFragment.putSourceCode('Object.subclass(\\'ClassA\\', { //thisHas17Chars\\n\\tm1: function(a) {\\n\\t\\ta*15;\\n\\t\\t2+3;\\n\\t}\\n});\\n');\n-\t\tthis.assertEquals(classFragment.startIndex, 55, 'classFrag1 start');\n-\t\tthis.assertEquals(classFragment.stopIndex, 123+17, 'classFrag1 stop');\n-\t\tthis.assertEquals(classFragment.subElements().length, 1);\n-\t\tthis.assertEquals(classFragment.subElements()[0].startIndex, 82, 'method1 start');\n-\t\tthis.assertEquals(classFragment.subElements()[0].stopIndex, 119+17, 'method1 stop');\n-\t\tvar otherClassFragment = this.fragmentNamed('ClassB');\n-\t\tthis.assertEquals(otherClassFragment.startIndex, 180+17, 'classFrag2 start');\n-\t\tthis.assertEquals(otherClassFragment.stopIndex, 257+17, 'classFrag2 stop');\n-\t\tthis.assertEquals(this.root.stopIndex, 277+17, 'root stop');\n-\t\t// this.assertEquals(this.root.subElements()[0].stopIndex, 277+17);\n-\t},\n-\n-\ttestGetSourceCodeWithoutSubElements: function() {\n-\t\tvar fragment = this.fragmentNamed('ClassB');\n-\t\tthis.assert(fragment, 'no fragment found');\n-\t\tvar expected = 'ClassA.subclass(\\'ClassB\\', {\\n\\n});\\n';\n-\t\tthis.assertEquals(fragment.getSourceCodeWithoutSubElements(), expected);\n-\t},\n-\n-\ttestRenameClass: function() {\n-\t\tvar fragment = this.fragmentNamed('ClassA');\n-\t\tvar newName = 'ClassARenamed';\n-\t\tfragment.putSourceCode('Object.subclass(\\'' + newName + '\\', {\\n\\tm1: function(a) {\\n\\t\\ta*15;\\n\\t\\t2+3;\\n\\t}\\n});\\n');\n-\t\tthis.assertEquals(fragment.name, newName);\n-\t\tvar foundAgain = this.fragmentNamed(newName);\n-\t\tthis.assertIdentity(foundAgain, fragment);\n-\t\tvar old = this.fragmentNamed('ClassA');\n-\t\tthis.assert(!old, 'old fragment still exisiting!');\n-\t},\n-\n-\ttestSourceWithErrorsWillNotBeSaved: function() {\n-\t\tvar fragment = this.fragmentNamed('ClassA');\n-\t\tvar newName = 'ClassAEdited';\n-\t\tfragment.putSourceCode('Object.subclass(\\'' + newName + '\\', \\{\\n');\n-\n-\t\tthis.assert(!this.db.getCachedText('foo.js').include('ClassAEdited'))\n-\t},\n-\n-\ttestReparse: function() {\n-\t\tvar fragment = this.fragmentNamed('ClassA');\n-\t\tvar result = fragment.reparse(fragment.getSourceCode());\n-\t\tthis.assertEquals(fragment.type, result.type);\n-\t\tthis.assertEquals(fragment.name, result.name);\n-\t\tthis.assertEquals(fragment.stopIndex, result.stopIndex);\n-\t\tthis.assertEquals(fragment.startIndex, result.startIndex);\n-\t\tthis.assertEquals(fragment.subElements().length, result.subElements().length);\n-\t},\n-\n-\ttestReparseCompleteFileFrag: function() {\n-\t\tvar src = '\\nfunction abc() { 1+2 }\\n\\n';\n-\t\tvar fileName = 'bar.js';\n-\t\tvar frag = new lively.ide.FileFragment(fileName, 'completeFileDef', 0, src.length-1, fileName, [], this.db);\n-\t\tthis.db.modules[fileName] = lively.ide.ModuleWrapper.forFile(fileName);\n-\t\tvar result = frag.reparse(src);\n-\t\tthis.assertEquals(frag.type, result.type);\n-\t\tthis.assert(result.subElements().length > 0);\n-\t\tthis.assertEquals(result.stopIndex, src.length-1);\n-\t},\n-\n-\ttestPutNewSourceWithChangingCompleteFileFrag: function() {\n-\t\tvar oldSrc = '\\nfunction abc() { 1+2 }\\n\\n';\n-\t\tvar fileName = 'bar.js';\t\t\n-\t\tvar frag = this.db.addModule(fileName, oldSrc).ast();\n-\t\tvar newSrc = 'module(\\'bar.js\\').requires().toRun({function() {' + oldSrc + '});';\n-\t\tfrag.putSourceCode(newSrc);\n-\t\tthis.assertEquals(frag.type, 'moduleDef');\n-\t},\n-\n-\tTODOtestReparseWithError: function() {\n-\t\t// TODO make this work\n-\t\t/*\n-\t\tvar fragment = this.fragmentNamed('ClassA');\n-\t\tvar newSrc = 'Object.subclass(\\'ClassAEdited\\', \\{\\n';\n-\t\tvar result = fragment.reparse(newSrc);\n-\t\tdbgOn(true)\n-\t\tthis.assert(result.isError, 'no errorFileFrag');\n-\t\t*/\n-\t},\n-\n-\ttestBuildNewSourceString: function() {\n-\t\tvar fragment = this.fragmentNamed('ClassA');\n-\t\tvar newString = 'Object.subclass(\\'ClassXYZ\\', {});\\n';\n-\t\tvar result = fragment.buildNewFileString(newString);\n-\t\tvar expected = 'module(\\'foo.js\\').requires(\\'bar.js\\').toRun(function() {\\n' +\n-\t\t'Object.subclass(\\'ClassXYZ\\', {});\\n' +\n-\t\t'ClassA.m3 = function() { 123 };\\n' +\n-\t\t'function abc() { 1+2 };\\n' +\n-\t\t'ClassA.subclass(\\'ClassB\\', {\\n\\tm2: function(a) { 3 },\\nm3: function(b) { 4 }\\n});\\n' +\n-\t\t'}); // end of module';\n-\t\tthis.assertEquals(expected, result);\n-\t},\n-\n-\ttestSourceCodeWithout: function() {\n-\t\tvar fragment = this.fragmentNamed('m1');\n-\t\tvar owner = this.fragmentNamed('ClassA');\n-\t\tvar result = owner.sourceCodeWithout(fragment);\n-\t\tvar expected = 'Object.subclass(\\'ClassA\\', {\\n\\n});\\n';\n-\t\tthis.assertEquals(expected, result);\n-\t},\n-\n-\ttestRemoveFragment: function() {\n-\t\tvar fragment = this.fragmentNamed('ClassA');\n-\t\tvar src = fragment.getSourceCode();\n-\t\tvar expectedLength = fragment.getFileString().length - fragment.getSourceCode().length;\n-\t\tfragment.remove();\n-\t\tthis.assert(!this.root.flattened().include(fragment), 'root still includes fragment');\n-\t\tvar fileString = this.db.getCachedText('foo.js');\n-\t\tthis.assert(!fileString.include(src), 'filestring includes fragments sourceCode');\n-\t\tthis.assertEquals(expectedLength, fileString.length, 'strange length');\n-\t},\n-\n-\ttestAddSibling: function() {\n-\t\tvar classFragment = this.fragmentNamed('ClassA');\n-\t\tvar oldNoOfSubelements = classFragment.findOwnerFragment().subElements().length;\n-\t\tvar src = 'Object.subclass(\\'ClassC\\', {});\\n'\n-\t\tvar newClassFragment = classFragment.addSibling(src);\n-\t\tthis.assertEquals(newClassFragment.getSourceCode(), src);\n-\t\tthis.assertEquals(newClassFragment.startIndex, classFragment.stopIndex+1, 'newcCassFrag1 start');\n-\t\tvar newNoOfSubelements = newClassFragment.findOwnerFragment().subElements().length;\n-\t\tthis.assertEquals(oldNoOfSubelements, newNoOfSubelements-1, 'no of subelems');\n-\t},\n-\ttestAddSibling2: function() {\n-\t\tvar fragment = this.fragmentNamed('m2');\n-\t\tvar next = this.fragmentNamed('m1');\n-\t\tvar owner = this.fragmentNamed('ClassA');\n-\t\tvar expectedLength = owner.getFileString().length + fragment.getSourceCode().length;\n-\t\tnext.addSibling(fragment.getSourceCode());\n-\t\tvar string = owner.getFileString();\n-\t\tthis.assertEquals(expectedLength+2, string.length, 'strange length');\n-\t\tthis.assertEquals(owner.subElements().length, 2);\n-\t\tthis.assertEquals(owner.subElements()[1].getSourceCode(), fragment.getSourceCode());\n-\t},\n-\ttestFindOwnerWhenSubelementsChange: function() {\n-\t\tvar fragment = this.fragmentNamed('m1');\n-\t\tvar owner = this.fragmentNamed('ClassA');\n-\t\tthis.assertEquals(fragment.findOwnerFragment(), owner, 1);\n-\t\towner.reparse(owner.getSourceCode());\n-\t\tthis.assertEquals(fragment.findOwnerFragment(), owner, 2);\n-\t},\n-\n-\ttestFindOwnerWithSimilarFragment: function() {\n-\t\tthis.setUpAlternateSource();\n-\t\tvar fragment = this.fragmentNamed('Dummy');\n-\t\tthis.assertEquals(fragment.subElements().length, 3);\n-\t\tvar f1 = fragment.subElements()[1];\n-\t\tvar f2 = fragment.subElements()[2];\n-\t\tthis.assertEquals(f1.getSourceCode(), f2.getSourceCode());\n-\t\tthis.assertEquals(f1.startIndex, 68, 1); this.assertEquals(f1.stopIndex, 76, 2);\n-\t\tthis.assertEquals(f2.startIndex, 79, 3); this.assertEquals(f2.stopIndex, 87, 4);\n-\n-\t\tthis.assertEquals(fragment.sourceCodeWithout(f2), 'Object.subclass(\"Dummy\", {\\ntest1: 1,\\ntest2: 2,\\n\\n\\n});');\n-\t\tthis.assertEquals(fragment.sourceCodeWithout(f1), 'Object.subclass(\"Dummy\", {\\ntest1: 1,\\n\\n\\ntest2: 2,\\n});');\n-\t},\n-\n-\ttestMoveFragment: function() {\n-\t\tthis.setUpAlternateSource();\n-\t\tvar o = this.fragmentNamed('Dummy');\n-\t\tvar f = o.subElements()[2];\n-\t\tf.moveTo(o.subElements()[0].startIndex);\n-\t\tvar newO = this.fragmentNamed('Dummy');\n-\t\tthis.assertEquals(f.getSourceCode(), newO.subElements()[0].getSourceCode(), 1);\n-\t\tthis.assertEquals(f.getSourceCode(), 'test2: 2,', 2);\n-\t\t//this.assert(newO.eq(o), 6);\n-\t\tthis.assert(f.findOwnerFragment().eq(newO), 3);\n-\t\tthis.assert(f.eq(newO.subElements()[0]), 4);\n-\t\tthis.assertEquals(newO.getSourceCode(), 'Object.subclass(\"Dummy\", {\\ntest2: 2,test1: 1,\\ntest2: 2,\\n\\n\\n});', 5);\n-\t},\n-\n-\ttestMoveFragment2: function() {\n-\t\tthis.setUpAlternateSource();\n-\t\tvar targetIndex = this.src.indexOf('}'); // Dummy1\n-\t\tvar f = this.fragmentNamed('test2'); // first one\n-\t\tf.moveTo(targetIndex);\n-\t\tthis.assertEquals(f.getSourceCode(), 'test2: 2,', 1);\n-\t\tthis.assertEquals(f.getFileString(), 'Object.subclass(\"Dummy1\", {test2: 2,});\\n'+\n-\t\t'Object.subclass(\"Dummy\", {\\ntest1: 1,\\n\\n\\ntest2: 2,\\n});');\n-\t},\n-\n-\ttestEq1: function() {\n-\t\tvar f = this.fragmentNamed('m2');\n-\t\tthis.assert(f.eq(f), 1);\n-\t\tvar f1 = this.jsParser.parseNonFile('m2: function() { bla bla }');\n-\t\tvar f2 = this.jsParser.parseNonFile('m2: function() { bla bla }');\n-\t\tthis.assert(f1.eq(f2), 2);\n-\t\tf1.type = 'unknown';\n-\t\tthis.assert(!f1.eq(f2), 3);\n-\t\tf1.type = f2.type;\n-\t\tf1._fallbackSrc = 'x' + f1._fallbackSrc;\n-\t\tthis.assert(!f1.eq(f2), 4);\n-\t\tf1._fallbackSrc = f2._fallbackSrc;\n-\t\tf1.startIndex++;\n-\t\tthis.assert(!f1.eq(f2), 5);\n-\t},\n-\ttestFindPrevFragment: function() {\n-\t\tthis.setUpAlternateSource2();\n-\t\tvar def = this.fragmentNamed('ClassA');\n-\t\tvar prev = def.prevElement();\n-\t\tthis.assertEquals('comment', prev.type);\n-\t},\n-\ttestGetComment: function() {\n-\t\tthis.setUpAlternateSource2();\n-\t\tvar def = this.fragmentNamed('ClassA');\n-\t\tvar comment = def.getComment();\n-\t\tthis.assertEquals('// ClassA is so important\\n// foo bar\\n', comment);\n-\t},\n-\ttestGetSubElementAtLine: function() {\n-\t\tthis.setUpSource();\n-\n-\t\tvar element = this.root.getSubElementAtLine(5, 10);\n-\n-\t\tthis.assert(element, 'no element found');\n-\n-\t\tthis.assertEquals(element.name, \"m1\", 'wrong name');\n-\n-\t},\n-\ttestGetSubElementAtIndex: function() {\n-\t\tthis.setUpSource();\n-\n-\t\tvar element = this.root.getSubElementAtIndex(90, 5);\n-\n-\t\tthis.assert(element, 'no element found');\n-\n-\t\tthis.assertEquals(element.name, \"m1\", 'wrong name');\n-\n-\t},\n-\n-\ttestGetOwnerNamePathRoot: function() {\n-\t\tthis.setUpSource();\n-\n-\t\tvar path = this.root.getOwnerNamePath();\n-\t\tthis.assertEquals(path.length , 1, 'root path length wrong');\n-\t\tthis.assertEquals(path[0] , \"foo.js\", 'root name wrong');\n-\n-\t},\n-\ttestGetOwnerNamePathOfMethod: function() {\n-\t\tthis.setUpSource();\n-\n-\t\tvar m1Node = this.root.getSubElementAtLine(5, 10);\n-\t\tvar path = m1Node.getOwnerNamePath();\n-\n-\t\tthis.assertEquals(path.length , 3, 'root path length wrong');\n-\t\tthis.assertEquals(path[0] , \"foo.js\", 'root name wrong');\n-\t\tthis.assertEquals(path[1] , \"ClassA\", 'class name wrong');\n-\t\tthis.assertEquals(path[2] , \"m1\", 'class name wrong');\n-\t},\n-\ttestCharsUpToLineInString: function() {\n-\t\tvar string = \"12345\\n12345\\n12345\\n12345\\n\";\n-\t\tthis.setUpSource()\n-\t\tvar fileFragment = this.root;\n-\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 0), 0, \"wrong chars for line 0\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 1), 6, \"wrong chars for line 1\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 2), 12, \"wrong chars for line 2\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 3), 18, \"wrong chars for line 3\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 4), 24, \"wrong chars for line 4\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 5), 25, \"wrong chars for line 5\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLineInString(string, 10), 25, \"wrong chars for line 10\")\n-\t},\n-\ttestCharsUpToLine: function() {\n-\t\tthis.setUpSource()\n-\t\tvar fileFragment = this.root;\n-\n-\t\tthis.assertEquals(fileFragment.charsUpToLine(0), 0, \"wrong... for 0\")\n-\t\tthis.assertEquals(fileFragment.charsUpToLine(5), 110, \"wrong...\")\n-\t},\n-\n-});\n-\n-tests.ToolsTests.FileFragmentTest.subclass('lively.tests.ToolsTests.FileFragmentNodeTests', {\n-\n-\tshouldRun: false,\n-\n-\tsetUp: function($super) {\n-\t\t$super();\n-\t\tthis.browser = {};\n-\t},\n-\n-\ttestFragmentsOfNodesDiffer: function() {\n-\t\t/* just use updating via registered browsers, no need for hasCurrentSource\n-\t\tvar class1Frag = this.fragmentNamed('ClassA');\n-\t\tvar node1 = new lively.ide.ClassFragmentNode(class1Frag, this.browser);\n-\t\tnode1.sourceString(); // 'show' node1\n-\t\tvar class2Frag = this.fragmentNamed('ClassB');\n-\t\tvar node2 = new lively.ide.ClassFragmentNode(class2Frag, this.browser);\n-\t\tnode2.sourceString(); // 'show' node2\n-\t\tthis.assert(node1.hasCurrentSource(), 'node1 hasCurrentSource');\n-\t\tthis.assert(node2.hasCurrentSource(), 'node2 hasCurrentSource');\n-\t\tnode1.newSource('Object.subclass(\\'ClassA\\', {});\\n');\n-\t\tthis.assert(node1.hasCurrentSource(), 'node1 hasCurrentSource 2');\n-\t\tthis.assert(!node2.hasCurrentSource(), 'node2 hasCurrentSource 2');\n-\t\t*/\n-\t},\n });\n \n TestCase.subclass('lively.tests.ToolsTests.ChangesTests',\n@@ -1998,7 +310,7 @@\n });\n \n TestCase.subclass('lively.tests.ToolsTests.ModuleWrapperTest', {\n-\t\n+\n \ttestCreateWrapper: function() {\n \t\tvar sut = lively.ide.ModuleWrapper.forFile('foobar.js');\n \t\tthis.assertEquals(sut.moduleName(), 'foobar');\n@@ -2008,7 +320,7 @@\n \t\tthis.assertEquals(sut.fileName(), 'lively/parser.ometa');\n \t\tthis.assertEquals(sut.type(), 'ometa');\n \t},\n-\t\n+\n });\n \n tests.SerializationTests.SerializationBaseTestCase.subclass('lively.tests.ToolsTests.ChangeSetTests',\n@@ -2172,7 +484,7 @@\n \t\tcs.addChange(c1);\n \t\tcs.addChange(c2);\n \t},\n-\t\n+\n \ttestModuleNamesInNamespace: function() {\n \t\tvar sut = ChangeSet.fromWorld(this.worldMorph), list = sut.moduleNamesInNamespace('apps');\n \t\tthis.assert(list.length > 0, \"nothing founds\");\n@@ -2181,27 +493,27 @@\n \ttestAddAndRemoveWorldRequirement: function() {\n \t\tvar sut = ChangeSet.fromWorld(this.worldMorph),\n \t\t\tlist = sut.getWorldRequirementsList().evaluate();\n-\t\tthis.assertEquals(list.length, 0, \"list is not empty\") \n+\t\tthis.assertEquals(list.length, 0, \"list is not empty\")\n \n \t\tsut.addWorldRequirement('lively.TestFramework')\n \t\tlist = sut.getWorldRequirementsList().evaluate();\n-\t\tthis.assertEquals(list.length, 1, \"add failed\") \n+\t\tthis.assertEquals(list.length, 1, \"add failed\")\n \n \t\tsut.removeWorldRequirement('lively.TestFramework')\n \t\tlist = sut.getWorldRequirementsList().evaluate();\n-\t\tthis.assertEquals(list.length, 0, \"remove failed\") \n+\t\tthis.assertEquals(list.length, 0, \"remove failed\")\n \t},\n-\t\n+\n });\n \n TestCase.subclass('lively.tests.ToolsTests.KeyboardTest', {\n- \n+\n shouldRun: false,\n- \n+\n testStartKeyWatcher: function() {\n \t\tvar keyWatcher = Morph.makeRectangle(0,0,100,20);\n \t\tkeyWatcher.setFill(Color.red);\n- \n+\n \t\tvar label = new TextMorph(keyWatcher.bounds().translatedBy(0,50));\n label.takesKeyboardFocus = Functions.False;\n label.onKeyDown = Functions.False;\n@@ -2214,12 +526,12 @@\n if (evt.rawEvent.ctrlKey) console.log('Ctrl key pressed');\n label.setTextString(evt.getKeyChar() + '---' + evt.getKeyCode());\n }\n- \n+\n keyWatcher.openInWorld();\n WorldMorph.current().hands.first().setKeyboardFocus(keyWatcher);\n },\n });\n- \n+\n TestCase.subclass('lively.tests.ToolsTests.MouseEventTest', {\n \tshouldRun: false,\n \ttestMouseEvents: function() {\n@@ -2251,7 +563,7 @@\n \t\t\tuniq = all.clone().uniq();\n \t\tthis.assertEquals(all.length, uniq.length, \"not unique\");\n \t},\n-\t\n+\n \ttestExtractLocalSymbols: function() {\n \t\tvar text = \"abc abbc\\nabbd\\tabbe\",\n \t\t\tall = lively.ide.AutoCompletion.TabCompletion.extractLocalSymbols(text)\n@@ -2291,7 +603,7 @@\n \t\tvar line = \" at TextMorph. (http://www.lively-kernel.org/repository/webwerkstatt/lively/ide/SyntaxHighlighting.js?fx1291814980471:347:20)\"\n \n \t\tvar errorParser = new lively.ide.ErrorViewer.ChromeErrorParser();\n-\t\t\n+\n \t\tvar result = errorParser.parseStackLine(line)\n \t\tthis.assert(result, \"no result\");\n \t\tthis.assert(result.url, \"no url\");\n@@ -2303,10 +615,10 @@\n \t},\n \ttestParseErrorStack: function() {\n \t\tvar errorStackString = this.errorStackString();\n-\t\t\n+\n \t\tvar errorParser = new lively.ide.ErrorViewer.ChromeErrorParser();\n \t\tvar result = errorParser.parseErrorStack(errorStackString)\n-\t\t\n+\n \t\tthis.assert(result, \"no result\");\n \t\tthis.assertEquals(result.length, 10, \"no result\");\n \t\tthis.assert(parseInt(result[0].line) > 0, \"wrong line number\");\n@@ -2315,11 +627,11 @@\n \ttestFileFragmentList: function() {\n \t\tvar errorStackString = this.errorStackString();\n \t\tvar errorParser = new lively.ide.ErrorViewer.ChromeErrorParser();\n-\t\tvar result = errorParser.fileFragmentList(errorStackString)\t\t\t\t\n+\t\tvar result = errorParser.fileFragmentList(errorStackString)\n \t\tthis.assert(result, \"no result\")\n \n \t\tthis.assert(result[0] instanceof lively.ide.FileFragment, \"no filefragment\")\n-\t\t\n+\n \t},\n \n \terrorStackString: function() {\n@@ -2338,12 +650,8 @@\n \t\tw.setErrorStack(this.errorStackString())\n \t},\n \n-\n-\n-\n-\n-\n });\n+\n TestCase.subclass('lively.tests.ToolsTests.CombinedModulesFileParserTest',\n 'default category', {\n \tsetUp: function() {\n@@ -2358,7 +666,7 @@\n \ttestCharPosOfLine: function() {\n \t\tvar s = \"a\\nb\\nc\";\n \t\tvar lines = this.sut.linesOfString(s);\n-\t\t\n+\n \t\tthis.assertEquals(this.sut.charPosOfLine(lines, 0), 0 , \"0,0\")\n \t\tthis.assertEquals(this.sut.charPosOfLine(lines, 1), 2 , \"1,0\")\n \t\tthis.assertEquals(this.sut.charPosOfLine(lines, 2), 4 , \"2,0\")\n@@ -2366,7 +674,7 @@\n \ttestLineOfCharPos: function() {\n \t\tvar s = \"a\\nb\\nc\";\n \t\tvar lines = this.sut.linesOfString(s);\n-\t\t\n+\n \t\tthis.assertEquals(this.sut.lineOfCharPos(lines, 0), 0 , \"0,0\")\n \t\tthis.assertEquals(this.sut.lineOfCharPos(lines, 2), 1 , \"1,0\")\n \t\tthis.assertEquals(this.sut.lineOfCharPos(lines, 4), 2 , \"2,0\")\n@@ -2378,7 +686,7 @@\n \ttestModuleForCombinedLineRef: function() {\n \n \t\tvar result = this.sut.moduleForCombinedLineRef(this.sut.getCombinedModulesContent(), 16291);\n-\t\t\n+\n \t\tthis.assert(result.file, 'no file')\n \t\tthis.assert(result.file, 'no offset')\n \n@@ -2390,14 +698,14 @@\n \t\tthis.assertEquals(simple.line, simpleTrans.line, \"normal modules did get transformed\")\n \t},\n \ttestTransformFileLineAndCharPosReferenceCombined: function() {\n-\t\t// TODOD should we generate the numbers from the real error? \n+\t\t// TODOD should we generate the numbers from the real error?\n \t\t// try {\n \t\t// var o = {};\n \t\t// o.foo()\n \t\t// } catch(error) {\n \t\t// LastError = error\n \t\t// }\n- \n+\n \t\tvar obj = {file: \"generated/combinedModules.js\", line: 16291, charPos: 3};\n \t\tvar objTrans = this.sut.transformFileLineAndCharPosReference(obj);\n \t\tthis.assert(obj.file != objTrans.file, \"object did not get transformed\")\n@@ -2406,6 +714,7 @@\n \n \n });\n+\n TestCase.subclass('lively.tests.ToolsTests.SimpleBrowserTest',\n 'testing', {\n \ttestBrowseAndModifyClockMorph: function() {\n@@ -2448,28 +757,5 @@\n \t\tpanel.owner.remove();\n \t},\n });\n-TestCase.subclass('lively.tests.ToolsTests.LivelyIdeBrowse',\n-'default category', {\n-\n- testLivelyIdeBrowse: function() { \n- var sut = lively.ide.browse(\"lively.morphic.Morph\", \"onMouseDown\", \"lively.morphic.Events\"); \n- \n- this.assert(sut, \"could not open browser\") \n- try {\n- this.assertEquals(sut.targetURL, URL.codeBase + \"lively/morphic/\")\n-\n- this.assert(sut.pane1Selection, \"no selection in Pane1\")\n- this.assertEquals(sut.pane1Selection.asString(), \"Events.js\")\n-\n- this.assert(sut.pane2Selection, \"no selection in Pane2\")\n- this.assertEquals(sut.pane2Selection.asString(), \"lively.morphic.Morph (extension)\")\n-\n- // this.assertEquals(sut.pane3Selection.asString(), \"event handling\")\n- this.assertEquals(sut.pane4Selection.asString(), \"onMouseDown (proto)\")\n- } finally {\n- if(sut) sut.view.remove() // close window\n- } \n- }\n-});\n \n }) // end of module\n","/core/lively/tests/ModuleSystemTests.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/tests/ModuleSystemTests.js\t2012-05-21 15:20:25.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/tests/ModuleSystemTests.js\t2012-04-14 21:45:38.000000000 +0200\n@@ -20,23 +20,8 @@\n this.assertRaises(function() {\n lively.Module.findAllInThenDo(url, function() {});\n }, /foo is not a directory/, 'no error on non-dir URL');\n- },\n- testUriWithRealtivePath: function() {\n- // FIXME this is for handling core in the namespace root\n- var m = module('../users/robertkrahn/foo.js'),\n- uri = m.uri(),\n- expected = URL.root.withFilename('users/robertkrahn/foo.js').toString();\n- this.assertEquals(expected, m.uri());\n- },\n- testRelativePathModule: function() {\n- this.assertEquals(module('../users/robertkrahn/foo.js').uri(),\n- module('users/robertkrahn/foo.js').uri());\n- this.assertEquals(module('users/robertkrahn/foo.js').uri(),\n- module('users.robertkrahn.foo').uri());\n }\n \n-\n-\n });\n \n TestCase.subclass('lively.tests.ModuleSystemTests.LoaderTest', {\n","/core/lively/tests/BootstrapTests.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/tests/BootstrapTests.js\t2012-02-22 23:15:12.000000000 +0100\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/tests/BootstrapTests.js\t2012-04-14 21:45:38.000000000 +0200\n@@ -2,65 +2,295 @@\n \n TestCase.subclass('lively.tests.BootstrapTests.WorldDataTest',\n 'accessing', {\n-\txmlDoc: function() {\n-var str = ' \\n\\\n-\\n\\\n- Lively Kernel \\n\\\n- \\n\\\n- \\n\\\n-\\n\\\n-\\n\\\n-'\n-return stringToXML(str).ownerDocument;\n-\t},\n+ doc: function() {\n+ // blank world\n+ var str = \"\\n\" +\n+ \"\\n\" +\n+ \" \\n\" +\n+ \" blank\\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \"
\\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \" \\n\" +\n+ \"\";\n+ return stringToXML(str).ownerDocument;\n+\t}\n \n-\tjsonDoc: function() {\n-\t\tvar webR = new WebResource(URL.codeBase.withFilename('blank.xhtml')).get(),\n-\t\t\tdoc = webR.contentDocument;\n-\t\treturn doc;\n-\t},\n },\n 'testing', {\n \n-\ttestGetChangesetAndWorldFromXML: function() {\n-\t\tvar doc = this.xmlDoc(),\n-\t\t\tsut = lively.Main.WorldDataAccessor.forDocument(doc),\n-\t\t\tcs = sut.getChangeSet(),\n-\t\t\tworld = sut.getWorld();\n-\t\tthis.assert(cs instanceof ChangeSet, 'ChangeSet not deserialized');\n-\t\tthis.assertEquals(3, cs.subElements().length)\n-\t\tthis.assert(world instanceof WorldMorph, 'World not deserialized');\n-\t},\n-\ttestGetChangesetAndWorldFromJSON: function() {\n-\t\tvar doc = this.jsonDoc(),\n-\t\t\tsut = lively.Main.WorldDataAccessor.forDocument(doc),\n-\t\t\tcs = sut.getChangeSet(),\n-\t\t\tworld = sut.getWorld();\n-\t\tthis.assert(cs instanceof ChangeSet, 'ChangeSet not deserialized');\n-\t\tthis.assertEquals(2, cs.subElements().length)\n-\t\tthis.assert(world instanceof WorldMorph, 'World not deserialized');\n-\t},\n+\t testGetChangesetAndWorldFromJSON: function() {\n+\t\t var doc = this.doc(),\n+ canvas = doc.getElementById('LivelyJSONWorld'),\n+\t\t\t sut = lively.Main.WorldDataAccessor.forCanvas(canvas),\n+\t\t\t cs = sut.getChangeSet(),\n+\t\t\t world = sut.getWorld();\n+\t\t this.assertEquals(ChangeSet, cs.constructor, 'ChangeSet not deserialized');\n+\t\t this.assertEquals(2, cs.subElements().length)\n+\t\t this.assertEquals(lively.morphic.World, world.constructor, 'World not deserialized');\n+\t }\n \n-})\n+});\n \n }) // end of module\n\\ No newline at end of file\n","/core/lively/tests/BaseTests.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/tests/BaseTests.js\t2012-06-12 21:34:53.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/tests/BaseTests.js\t2012-02-21 22:41:27.000000000 +0100\n@@ -1,7 +1,7 @@\n module('lively.tests.BaseTests').requires('lively.TestFramework').toRun(function() {\n \n TestCase.subclass('lively.tests.BaseTests.PointTest', {\n-\n+ \n testGriddedBy: function() {\n var p = pt(12, 26)\n var p2 = p.griddedBy(pt(5,5))\n@@ -15,7 +15,7 @@\n try {\n var p = pt(12, 42).subPt({x: 12, y: 42});\n this.assertEquals(p.toString(), pt(0,0).toString(), \"subPt failed\");\n- } catch (e) {\n+ } catch (e) { \n this.assert(false, \"subPt should not throw exception: \" + e.message);\n }\n },\n@@ -28,41 +28,10 @@\n try {\n var p = pt(12, 42).addPt({x: 12, y: 42});\n this.assertEquals(p.toString(), pt(24,84).toString(), \"subPt failed\");\n- } catch (e) {\n+ } catch (e) { \n this.assert(false, \"subPt should not throw exception: \" + e.message);\n }\n- }\n-});\n-\n-TestCase.subclass('lively.tests.BaseTests.StringsFormatTableTest', {\n-\n- testPrintTable: function() {\n- var testData = [\n- {expected: 'a b c',\n- input: [['a', 'b', 'c']]},\n- {expected: 'a b c\\nd e f',\n- input: [['a', 'b', 'c'], ['d', 'e', 'f']]},\n- {expected: 'aaa b c\\nd e f',\n- input: [['aaa', 'b', 'c'], ['d', 'e', 'f']]},\n- {expected: 'a|b|c',\n- input: [['a', 'b', 'c']],\n- options: {separator: \"|\"}},\n- {expected: 'a b c\\nd eee f',\n- input: [['a', 'b', 'c'], ['d', 'eee', 'f']],\n- options: {align: \"right\"}},\n- {expected: 'a b c\\nd eee f',\n- input: [['a', 'b', 'c'], ['d', 'eee', 'f']],\n- options: {align: \"right\"}},\n- {expected: 'a b c \\nd eee fff',\n- input: [['a', 'b', 'c '], ['d', 'eee', 'fff']],\n- options: {align: [\"left\", \"right\", \"left\"]}}];\n- testData.forEach(function(data, i) {\n- debugger\n- this.assertEquals(data.expected,\n- Strings.printTable(data.input, data.options),\n- 'for ' + i + ' ' + data.input);\n- }, this);\n- }\n+ },\n });\n \n }) // end of module\n\\ No newline at end of file\n","/core/lively/persistence/Serializer.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/persistence/Serializer.js\t2012-06-01 10:29:32.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/persistence/Serializer.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -273,7 +273,7 @@\n id = jsoObj.id;\n this.registry = this.createRealRegistry(jsoObj.registry);\n var result = this.recreateFromId(id);\n- this.letAllPlugins('deserializationDone', [jsoObj]);\n+ this.letAllPlugins('deserializationDone');\n this.cleanup();\n this.log('Deserializing done in ' + (new Date() - start) + 'ms');\n return result;\n@@ -1145,8 +1145,9 @@\n },\n \n serializeWorldToDocumentWithSerializer: function(world, doc, serializer) {\n- // this helper object was introduced to make the code that is browser dependent\n- // (currently IE9 vs the rest) easier to read. It sould be moved to dome general DOM abstraction layer\n+ // this helper object was introduced to make the code that is browser\n+ // dependent (currently IE9 vs the rest) easier to read. It sould be\n+ // moved to dome general DOM abstraction layer\n var domAccess = {\n getSystemDictNode: function(doc) {\n return (doc.getElementById ?\n@@ -1178,8 +1179,8 @@\n var head = domAccess.getHeadNode(doc);\n \n // FIXME remove previous meta elements - is this really necessary?\n- //var metaElement;\n- //while (metaElement = doc.getElementsByTagName('meta')[0])\n+ // var metaElement;\n+ // while (metaElement = doc.getElementsByTagName('meta')[0])\n // metaElement.parentNode.removeChild(metaElement)\n // removed 2012-01-5 fabian\n // doing this instead: remove old serialized data.. is it necessary or not?\n@@ -1187,9 +1188,7 @@\n var metaToBeRemoved = ['LivelyMigrationLevel', 'WorldChangeSet', 'LivelyJSONWorld'];\n metaToBeRemoved.forEach(function(ea) {\n var element = doc.getElementById(ea);\n- if (element) {\n- element.parentNode.removeChild(element);\n- }});\n+ if (element) { element.parentNode.removeChild(element); }});\n \n \n // FIXME remove system dictionary\n@@ -1222,8 +1221,8 @@\n return doc;\n },\n deserialize: function(json, optDeserializer) {\n- var deserializer = optDeserializer || this.createObjectGraphLinearizer();\n- var obj = deserializer.deserialize(json);\n+ var deserializer = optDeserializer || this.createObjectGraphLinearizer(),\n+ obj = deserializer.deserialize(json);\n return obj;\n },\n \n@@ -1268,6 +1267,11 @@\n },\n \n newMorphicCopy: function(obj) {\n+ // this method exists for compatibility\n+ return this.copy(obj);\n+ },\n+\n+ copy: function(obj) {\n var serializer = this.createObjectGraphLinearizerForCopy();\n serializer.showLog = false;\n var copyPlugin = new CopyOnlySubmorphsPlugin();\n","/core/lively/PartsBin.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/PartsBin.js\t2012-06-01 10:29:34.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/PartsBin.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -10,9 +10,8 @@\n this.name = partOrName;\n this.part = null;\n } else {\n- if (typeof(partOrName.getPartsBinMetaInfo === 'function'))\n- this.name = partOrName.getPartsBinMetaInfo().partName;\n- else\n+ this.name = Object.isFunction(partOrName.getPartsBinMetaInfo) ?\n+ this.name = partOrName.getPartsBinMetaInfo().partName :\n this.name = partOrName.name;\n this.part = partOrName;\n }\n@@ -51,7 +50,7 @@\n },\n \n setPartFromJSON: function(json, metaInfo, rev) {\n- var part = this.deserializePart(json, metaInfo); \n+ var part = this.deserializePart(json, metaInfo);\n part.partsBinMetaInfo.revisionOnLoad = rev;\n this.setPart(part);\n },\n@@ -92,8 +91,8 @@\n },\n 'serialization', {\n getSerializer: function() {\n- return Config.isNewMorphic ? \n- ObjectGraphLinearizer.forNewLivelyCopy() : \n+ return Config.isNewMorphic ?\n+ ObjectGraphLinearizer.forNewLivelyCopy() :\n ObjectGraphLinearizer.forLivelyCopy();\n },\n deserializePart: function(json, optMetaInfo) {\n@@ -137,6 +136,7 @@\n runAfterDeserializationHooks: function(part) {\n if (part.findAndSetUniqueName)\n part.findAndSetUniqueName();\n+\n if (part.onLoadFromPartsBin)\n part.onLoadFromPartsBin();\n },\n@@ -156,12 +156,12 @@\n json = serializer.serialize(part);\n htmlLogo = part.asHTMLLogo();\n } catch(e){\n- throw e \n+ throw e\n } finally {\n part.setPosition(oldPos);\n- // for fixing the bug that parts are shown in the world \n+ // for fixing the bug that parts are shown in the world\n // origin after copying them to the partsbin\n- if (part.owner) part.owner.addMorph(part); \n+ if (part.owner) part.owner.addMorph(part);\n }\n return {\n json: json,\n@@ -169,15 +169,14 @@\n metaInfo: this.serializeMetaInfo(part.getPartsBinMetaInfo())\n };\n },\n+\n serializeMetaInfo: function(metaInfo) {\n try {\n- var metaInfoJSON = this.getSerializer().serialize(metaInfo);\n- } catch(e){\n- throw e \n+ return this.getSerializer().serialize(metaInfo);\n+ } catch(e) {\n+ throw e;\n }\n- return metaInfoJSON;\n- },\n-\n+ }\n \n },\n 'upload and download', {\n@@ -234,7 +233,7 @@\n }\n connect(this, 'json', loadTrigger, 'jsonLoaded', {removeAfterUpdate: true});\n connect(this, 'loadedMetaInfo', loadTrigger, 'metaInfoLoaded', {removeAfterUpdate: true});\n- \n+\n this.load(isAsync, rev);\n this.loadPartMetaInfo(isAsync, rev)\n \n@@ -244,14 +243,14 @@\n \n loadPartVersions: function(isAsync) {\n var webR = new WebResource(this.getFileURL());\n- if (isAsync) webR.beAsync(); \n+ if (isAsync) webR.beAsync();\n connect(webR, 'versions', this, 'partVersions');\n webR.getVersions();\n return this;\n },\n loadPartMetaInfo: function(isAsync, rev) {\n var webR = new WebResource(this.getMetaInfoURL());\n- if (isAsync) webR.beAsync(); \n+ if (isAsync) webR.beAsync();\n connect(webR, 'content', this, 'loadedMetaInfo', {updater: function($upd, json) {\n if (!this.sourceObj.status.isSuccess()) return $upd(null);\n if (!this.sourceObj.status.isDone()) return;\n@@ -279,7 +278,7 @@\n del: function() {\n this.getPartsSpace().removePartItemNamed(this.name);\n new WebResource(this.getLogoURL()).beAsync().del();\n- new WebResource(this.getHTMLLogoURL()).beAsync().del(); \n+ new WebResource(this.getHTMLLogoURL()).beAsync().del();\n new WebResource(this.getFileURL()).beAsync().del();\n new WebResource(this.getMetaInfoURL()).beAsync().del();\n },\n@@ -292,7 +291,7 @@\n this.part.getPartsBinMetaInfo().setPartsSpace(this.getPartsSpace());\n var name = this.part.name,\n serialized = this.serializePart(this.part);\n- \n+\n var webR = new WebResource(this.getFileURL())\n .beAsync()\n .createProgressBar('Uploading ' + name);\n@@ -362,7 +361,7 @@\n \n askToOverwrite: function(url) {\n var self = this;\n- $world.confirm(String(url) + ' was changed since loading it. Overwrite?', \n+ $world.confirm(String(url) + ' was changed since loading it. Overwrite?',\n function (answer) {\n answer && self.uploadPart()\n })\n@@ -514,8 +513,8 @@\n },\n partsSpaceWithURL: function(url) {\n var rootPath = new URL(Config.rootPath),\n- name = url.isIn(rootPath) ? \n- url.relativePathFrom(rootPath) : \n+ name = url.isIn(rootPath) ?\n+ url.relativePathFrom(rootPath) :\n url.toString();\n return this.partsSpaceNamed(name);\n },\n@@ -556,7 +555,7 @@\n \n });\n \n-Trait('lively.PartsBin.PartTrait', { \n+Trait('lively.PartsBin.PartTrait', {\n copyToPartsBin: function(optPartsSpaceNamed) {\n if (!this.name) {\n alert('cannot copy to partsBin without a name');\n@@ -569,7 +568,7 @@\n if (optPartsSpaceNamed && Object.isString(optPartsSpaceNamed))\n this.getPartsBinMetaInfo().setPartsSpaceName(optPartsSpaceNamed);\n \n- if (this.getPartsBinMetaInfo().partsSpaceName && \n+ if (this.getPartsBinMetaInfo().partsSpaceName &&\n !this.getPartsBinMetaInfo().partsSpaceName.startsWith(\"PartsBin\")) {\n alertOK(\"resetting partsSpaceName of \" + this)\n delete this.getPartsBinMetaInfo().partsSpaceName\n@@ -577,7 +576,7 @@\n \n this.getPartsBinMetaInfo().migrationLevel = LivelyMigrationSupport.migrationLevel;\n this.getPartsBinMetaInfo().partName = this.name;\n- \n+\n this.getPartItem().uploadPart(true);\n },\n copyToPartsBinWithUserRequest: function() {\n@@ -588,7 +587,7 @@\n // FIXME this code was not yet refactored to work with the new PartsSpace/PartItem model\n var userName = lively.LocalStorage.get('UserName');\n if (!userName) throw Error('Cannot copyToMyPartsBin without userName')\n- \n+\n var userDir = URL.codeBase.withFilename(userName + '/MyPartsBin/');\n var wr = new WebResource(userDir);\n if (!wr.exists()) {\n@@ -665,7 +664,7 @@\n '\\n' +\n '';\n },\n asHTMLLogo: function() {\n","/core/lively/PartCaching.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/PartCaching.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/PartCaching.js\t2012-04-07 20:10:53.000000000 +0200\n@@ -73,16 +73,18 @@\n \n cop.create('PartCachingLayer').refineClass(lively.PartsBin.PartItem, {\n loadPart: function(isAsync, optCached, rev) {\n- connect(this, 'json', this, 'cachePartJSON');\n- connect(this, 'loadedMetaInfo', this, 'cachePartMetaInfo');\n- var cachedPart = Config.PartCachingEnabled && lively.PartCache.getPart(this.name, this.partsSpaceName);\n+ var cachedPart = lively.PartCache.getPart(this.name, this.partsSpaceName);\n if (!cachedPart) {\n return cop.proceed(isAsync, optCached, rev);\n } else {\n this.setPartFromJSON(cachedPart.json, cachedPart.metaInfo, rev);\n return this;\n }\n- },\n+ }\n+});\n+\n+cop.create('PartCachingControlsLayer')\n+.refineClass(lively.PartsBin.PartItem, {\n cachePartJSON: function(json) {\n lively.PartCache.setPartJSON(this.name, this.partsSpaceName, json);\n },\n@@ -92,6 +94,11 @@\n uploadPart: function() {\n lively.PartCache.invalidCachedVersion(this.name, this.partsSpaceName);\n return cop.proceed();\n+ },\n+ loadPart: function(isAsync, optCached, rev) {\n+ connect(this, 'json', this, 'cachePartJSON');\n+ connect(this, 'loadedMetaInfo', this, 'cachePartMetaInfo');\n+ return cop.proceed(isAsync, optCached, rev);\n }\n })\n .refineClass(lively.morphic.World, {\n@@ -100,9 +107,9 @@\n for(var i = 0; i < items.length; i++) {\n if (items[i][0] === \"Preferences\") {\n if (Config.PartCachingEnabled) {\n- items[i][1].push(['Disable part caching', function() { Config.PartCachingEnabled = false }]);\n+ items[i][1].push(['disable part caching', function() { Config.PartCachingEnabled = false }]);\n } else {\n- items[i][1].push(['Enable part caching', function() {\n+ items[i][1].push(['enable part caching', function() {\n Config.PartCachingEnabled = true;\n lively.PartCache.clearCache();\n }]);\n@@ -110,17 +117,23 @@\n }\n if (items[i][0] === \"Debugging\") {\n if (Config.PartCachingEnabled) {\n- items[i][1].splice(4, 0, ['Clear part cache', function() { lively.PartCache.clearCache(); }]);\n+ items[i][1].splice(4, 0, ['clear part cache', function() { lively.PartCache.clearCache(); }]);\n }\n }\n }\n return items;\n+ },\n+ loadPartItem: function (partName, optPartspaceName) {\n+ var layers = Config.PartCachingEnabled ? [PartCachingLayer] : [],\n+ result;\n+ cop.withLayers(layers, function() {result = cop.proceed(partName, optPartspaceName)});\n+ return result;\n }\n })\n \n \n Config.PartCachingEnabled = true; // default\n lively.PartCaching.setupCache();\n-PartCachingLayer.beGlobal();\n+PartCachingControlsLayer.beGlobal();\n \n }) // end of module\n\\ No newline at end of file\n","/core/lively/Ometa.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/Ometa.js\t2012-04-08 07:36:21.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/Ometa.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -24,23 +24,23 @@\n \n \n module('lively.Ometa').requires('lively.Network', 'ometa.ometa-base', 'ometa.lk-parser-extensions').toRun(function() {\n- \n+\n /*\n An Ometa Workspace like http://www.cs.ucla.edu/~awarth/ometa/.\n- Uses Alessandro Warth OMeta-js 2 to evalute text. \n+ Uses Alessandro Warth OMeta-js 2 to evalute text.\n */\n Object.subclass('OMetaSupport');\n \n Object.extend(OMetaSupport, {\n- \n- ometaGrammarDir: URL.codeBase, \n+\n+ ometaGrammarDir: URL.codeBase,\n \n fromFile: function(fileName) {\n var src = OMetaSupport.fileContent(fileName);\n var grammar = OMetaSupport.ometaEval(src);\n return grammar;\n },\n- \n+\n translateAndWrite: function(sourceFileName, destFileName, additionalRequirements) {\n \tvar requirementsString = additionalRequirements ? ',\\'' + additionalRequirements.join('\\',\\'') + '\\'' : '';\n var str = Strings.format('module(\\'%s\\').requires(\\'ometa.parser\\'%s).toRun(function() {\\n%s\\n});',\n@@ -52,7 +52,7 @@\n Strings.format('Successfully compiled OMeta grammar %s to %s',sourceFileName, destFileName),\n Color.green, 3);\n },\n- \n+\n ometaEval: function(src) {\n var jsSrc = OMetaSupport.translateToJs(src);\n return eval(jsSrc);\n@@ -73,7 +73,7 @@\n else errorFunc = OMetaSupport.handleErrorDebug;\n return grammar.matchAll(src, rule, null, errorFunc.curry(src, rule));\n },\n- \n+\n matchWithGrammar: function(grammar, rule, src, errorHandling) {\n // errorHandling can be undefined or a callback or true (own error handle is used)\n var errorFunc;\n@@ -82,7 +82,7 @@\n else errorFunc = OMetaSupport.handleErrorDebug;\n return grammar.match(src, rule, null, errorFunc.curry(src, rule));\n },\n- \n+\n handleErrorDebug: function(src, rule, grammarInstance, errorIndex) {\n var charsBefore = 500;\n var charsAfter = 250;\n@@ -97,9 +97,9 @@\n console.log(msg);\n return msg;\n },\n- \n+\n handleError: function(src, rule, grammarInstance, errorIndex) {},\n- \n+\n fileContent: function(fileName) {\n var url = URL.codeBase.withFilename(fileName);\n return new WebResource(url).get().content;\n","/core/lively/Network.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/Network.js\t2012-06-12 21:34:54.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/Network.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -505,15 +505,12 @@\n this._streamContentLength = allContent.length;\n }\n }\n-\n if (this.getReadyState() === this.Done) {\n this.setStatus(this.getStatus());\n if (this.transport.responseText !== undefined)\n this.setResponseText(this.getResponseText());\n-\n if (this.transport.responseXML !== undefined)\n this.setResponseXML(this.getResponseXML());\n-\n if (this.transport.getAllResponseHeaders() !== undefined)\n this.setResponseHeaders(this.getResponseHeaders());\n this.disconnectModel(); // autodisconnect?\n@@ -900,7 +897,7 @@\n if (!xml) return;\n /* The response contains the properties of the specified file or directory,\n e.g. the revision (= version-name) */\n- var revisionNode = lively.Data.XPathQuery.find('//lp1:version-name', xml);\n+ var revisionNode = xml.getElementsByTagName('version-name')[0];\n if (!revisionNode) return;\n this.setHeadRevision(Number(revisionNode.textContent));\n },\n@@ -1365,10 +1362,6 @@\n addContentType: function(contentType) {\n this.requestHeaders[\"Content-Type\"] = contentType || '';\n },\n- addNoCacheHeader: function() {\n- this.setRequestHeaders({\"Cache-Control\": 'no-cache'});\n- }\n-\n \n },\n 'HTTP methods', {\n@@ -1438,7 +1431,6 @@\n this.content = this.convertContent(content || '');\n if (requiredRevision) this.addHeaderForRequiredRevision(requiredRevision);\n if (contentType) this.addContentType(contentType)\n- this.addNoCacheHeader();\n var req = this.createXMLHTTPRequest('PUT');\n req.request(this.content);\n return this;\n@@ -1456,7 +1448,6 @@\n // this mehod intentionally not called delete because some JS engines\n // throw an error when parsing \"keywords\" as object key names\n var request = this.createNetRequest();\n- this.addNoCacheHeader();\n request.del(this.getURL());\n return this;\n },\n@@ -1623,7 +1614,6 @@\n },\n \n pvtProcessPropfindForSubElements: function(doc) {\n- //alert(doc.documentElement);\n if (!this.status.isSuccess())\n throw new Error('Cannot access subElements of ' + this.getURL());\n var davNs = this.ensureDavXmlNs(doc);\n","/core/lively/morphic/Widgets.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Widgets.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Widgets.js\t2012-06-14 10:17:32.000000000 +0200\n@@ -2,7 +2,6 @@\n \n lively.morphic.Morph.subclass('lively.morphic.Button',\n 'settings', {\n- isButton: true,\n style: {\n enableGrabbing: false,\n enableDropping: false,\n@@ -175,24 +174,6 @@\n return items;\n },\n },\n-'keyboard events', {\n- onKeyPress: function($super, evt) {\n- // The extent of iages should can be changed by using the + and - key\n- var key = evt.getKeyChar();\n-\n- switch (key) {\n- case \"-\": {\n- this.setExtent(this.getExtent().scaleBy(0.8))\n- return true;\n- }\n- case \"+\": {\n- this.setExtent(this.getExtent().scaleBy(1.1))\n- return true;\n- }\n- }\n- return $super(evt)\n- }\n-},\n 'inline image', {\n convertToBase64: function() {\n var urlString = this.getImageURL();\n@@ -285,35 +266,6 @@\n this.setChecked(this.isChecked());\n },\n });\n-lively.morphic.Morph.subclass('lively.morphic.PasswordInput',\n-'initializing', {\n- initialize: function($super, isChecked) {\n- $super(this.createShape());\n- },\n- createShape: function() {\n- var node = XHTMLNS.create('input');\n- node.type = 'password';\n- node.className = 'visibleSelection';\n- return new lively.morphic.Shapes.External(node);\n- },\n-},\n-'accessing', {\n- set value(string) {\n- // FIXME move to lively.morphic.HTML\n- var inputNode = this.renderContext().shapeNode;\n- if (inputNode) {\n- inputNode.value = string;\n- }\n-\n- lively.bindings.signal(this, 'value', string);\n- return string;\n- },\n- get value() {\n- // FIXME move to lively.morphic.HTML\n- var inputNode = this.renderContext().shapeNode;\n- return inputNode ? inputNode.value : '';\n- }\n-});\n \n lively.morphic.Box.subclass('lively.morphic.ProgressBar',\n 'settings', {\n@@ -514,11 +466,10 @@\n },\n \n createMenuItems: function(items) {\n- function createItem(string, value, idx, callback, callback2, isSubMenu) {\n+ function createItem(string, value, idx, callback, callback2) {\n return {\n isMenuItem: true,\n isListItem: true,\n-\t\t\t\tisSubMenu: isSubMenu,\n string: string,\n value: value,\n idx: idx,\n@@ -547,7 +498,7 @@\n if (Object.isArray(item) && Object.isArray(item[1])) {\n var name = item[0], subItems = item[1];\n result.push(createItem(name, name, i, null, function(evt) {\n- self.openSubMenu(evt, name, subItems) }, true));\n+ self.openSubMenu(evt, name, subItems) }));\n return;\n }\n // item = \"some string\"\n@@ -562,37 +513,10 @@\n var y = 0, x = 0, self = this;\n \n this.items.forEach(function(item) {\n- \n- // Always start menu items with a capital letter\n- var title = item.string //.substr(0,1).toUpperCase() + item.string.substr(1, item.string.length-1);\n- \n var itemHeight = 23,\n itemMorph = new lively.morphic.Text(\n- new Rectangle(0, y, this.getExtent().x, itemHeight), title);\n- \n- // If an item has a sub menu, add an arrow icon to it\n- if (item.isSubMenu) {\n- var arrowMorph = new lively.morphic.Text(\n- new Rectangle(0, 0, 10, itemHeight), \"▶\");\n- arrowMorph.setPosition(pt(this.getExtent().x, y));\n- arrowMorph.applyStyle({\n- clipMode: 'hidden',\n- fixedHeight: true,\n- fixedWidth: false,\n- borderWidth: 0,\n- fill: null,\n- handStyle: 'default',\n- enableGrabbing: false,\n- allowInput: false,\n- fontSize: 10,\n- padding: Rectangle.inset(3,2) });\n- itemMorph.addMorph(arrowMorph);\n- }\n- \n-\n+ new Rectangle(0, y, this.getExtent().x, itemHeight), item.string);\n this.itemMorphs.push(this.addMorph(itemMorph));\n- \n-\n itemMorph.applyStyle({\n clipMode: 'hidden',\n fixedHeight: true,\n@@ -629,13 +553,6 @@\n textColor: Color.white,\n borderRadius: 4\n })\n- \n- // if the item is a submenu, set its textColor to white\n- var arrow = itemMorph.submorphs.first();\n- if (arrow) {\n- arrow.applyStyle({textColor: Color.white});\n- }\n- \n self.overItemMorph = itemMorph;\n self.removeSubMenu()\n item.onMouseOverCallback && item.onMouseOverCallback(evt);\n@@ -651,12 +568,6 @@\n itemMorph.addScript(function deselect(evt) {\n this.isSelected = false;\n this.applyStyle({fill: null, textColor: Color.black});\n- \n- // if the item is a submenu, set its textColor back to black\n- var arrow = this.submorphs.first();\n- if (arrow) {\n- arrow.applyStyle({textColor: Color.black});\n- }\n })\n y += itemHeight;\n x = Math.max(x, itemMorph.getTextExtent().x);\n@@ -803,20 +714,14 @@\n },\n \n fitToItems: function() {\n- var offset = 10 + 20,\n+ var offset = 10,\n morphs = this.itemMorphs;\n if (this.title) morphs = morphs.concat([this.title]);\n var widths = morphs.invoke('getTextExtent').pluck('x');\n var width = Math.max.apply(Global, widths) + offset;\n var newExtent = this.getExtent().withX(width);\n this.setExtent(newExtent);\n- morphs.forEach(function(ea) { \n- ea.setExtent(ea.getExtent().withX(newExtent.x));\n- if (ea.submorphs.length>0) { \n- var arrow = ea.submorphs.first();\n- arrow.setPosition(arrow.getPosition().withX(newExtent.x-17));\n- }\n- })\n+ morphs.forEach(function(ea) { ea.setExtent(ea.getExtent().withX(newExtent.x)) })\n }\n \n });\n@@ -839,10 +744,9 @@\n },\n disableMorphMenu: function() { this.showsMorphMenu = false },\n openMorphMenuAt: function(pos, itemFilter) {\n- if (!(itemFilter instanceof Function)) {\n- itemFilter = function (items) { return items }\n- }\n- return lively.morphic.Menu.openAt(pos, this.name || this.toString(), itemFilter(this.morphMenuItems()));\n+ itemFilter = Object.isFunction(itemFilter) ? itemFilter : Functions.K;\n+ return lively.morphic.Menu.openAt(pos, this.name || this.toString(),\n+ itemFilter(this.morphMenuItems()));\n },\n showMorphMenu: function(evt) {\n this.openMorphMenuAt(evt.getPosition());\n@@ -870,17 +774,6 @@\n items.push([\"get halo on...\", morphs.collect(function(ea) {\n return [ea, function(evt) { ea.toggleHalos(evt)}]\n })])\n- var steppingItems = [];\n- \n- if (this.startSteppingScripts) {\n- steppingItems.push([\"start stepping\", function(){self.startSteppingScripts()}])\n- } \n- if (this.scripts.length != 0) {\n- steppingItems.push([\"stop stepping\", function(){self.stopStepping()}])\n- }\n- if (steppingItems.length != 0) {\n- items.push([\"stepping\", steppingItems])\n- } \n if (this.attributeConnections && this.attributeConnections.length > 0) {\n items.push([\"connections\", this.attributeConnections\n .reject(function(ea) { return ea.dependedBy}) // Meta connection\n@@ -910,14 +803,6 @@\n items.push([\"enable grabbing\", this.enableGrabbing.bind(this)])\n }\n \n- if (this.owner && this.owner.submorphs.length > 1) {\n- var arrange = [];\n- arrange.push([\"bring to front\", function(){self.bringToFront()}]);\n- arrange.push([\"send to back\", function(){self.sendToBack()}]);\n- items.push([\"arrange morph\", arrange]);\n- }\n- \n-\n if (this.submorphs.length > 0) {\n if (this.isLocked()) {\n items.push([\"unlock parts\", this.unlock.bind(this)])\n@@ -933,13 +818,8 @@\n }])\n }\n \n- if (this.reset)\n+ if (this.reset) {\n items.push(['reset', this.reset.bind(this)]);\n-\n- if (this.owner.owner) { // Is owner owner a Stack?\n- if (this.owner.owner.pageArray) {\n- this.owner.owner.stackMenuItems(this, items) // move between page and background\n- }\n }\n \n return items;\n@@ -956,11 +836,8 @@\n }\n return null;\n },\n-\n-\n-\n-\n });\n+\n lively.morphic.Text.addMethods(\n 'menu', {\n morphMenuItems: function($super) {\n@@ -1012,8 +889,7 @@\n return this.openPartItem('PartsBinBrowser', 'PartsBin/Tools');\n },\n openInspectorFor: function(object, evt) {\n- var name = Config.useObjectInspector ? \"ObjectInspector\" : \"Explorer\";\n- var part = this.openPartItem(name, 'PartsBin/Tools');\n+ var part = this.openPartItem('Explorer', 'PartsBin/Tools');\n part.explore(object);\n return part;\n },\n@@ -1098,13 +974,10 @@\n });\n return browser;\n },\n- browseCode: function(/*args*/) {\n+ browseCode: function(objectName, methodName, sourceModuleName) {\n // find code and browse it\n- // args can be objectName, methodName, sourceModuleName\n- // see lively.ide.browse for more options\n- var args = Array.from(arguments);\n require('lively.ide.SystemCodeBrowser').toRun(function() {\n- lively.ide.browse.apply(lively.ide, args);\n+ lively.ide.browse(objectName, methodName, sourceModuleName)\n });\n },\n \n@@ -1144,9 +1017,6 @@\n } finally {\n Config.rootPath = oldRootPath\n }\n- },\n- openSystemConsole: function() {\n- return this.openPartItem('SystemConsole', 'PartsBin/Tools');\n }\n },\n 'menu', {\n@@ -1184,9 +1054,9 @@\n \n debuggingMenuItems: function(world) {\n var items = [\n- ['Reset world scale', this.resetScale.bind(this)],\n- ['Reset title bars', this.resetAllTitleBars.bind(this)],\n- ['Reset button labels', this.resetAllButtonLabels.bind(this)],\n+ ['reset world scale', this.resetScale.bind(this)],\n+ ['reset title bars', this.resetAllTitleBars.bind(this)],\n+ ['reset button labels', this.resetAllButtonLabels.bind(this)],\n ['World serialization info', function() {\n require('lively.persistence.Debugging').toRun(function() {\n var json = lively.persistence.Serializer.serialize(world),\n@@ -1195,17 +1065,19 @@\n })}]];\n \n // world requirements\n- var changeSet = this.getChangeSet()\n- worldRequirementsChange = changeSet.getWorldRequirementsList(),\n- worldRequirements = worldRequirementsChange.evaluate(),\n- removeRequirement = function(name) {\n- changeSet.removeWorldRequirement(name);\n- alertOK(name + ' is not loaded at startup anymore');\n- },\n- menuItems = worldRequirements.collect(function(name) {\n- return [name, [['Remove', removeRequirement.curry(name)]]];\n- });\n- items.push(['Requirements', menuItems]);\n+ var changeSet = this.getChangeSet();\n+ if (changeSet) {\n+ var worldRequirementsChange = changeSet.getWorldRequirementsList(),\n+ worldRequirements = worldRequirementsChange.evaluate(),\n+ removeRequirement = function(name) {\n+ changeSet.removeWorldRequirement(name);\n+ alertOK(name + ' is not loaded at startup anymore');\n+ },\n+ menuItems = worldRequirements.collect(function(name) {\n+ return [name, [['remove', removeRequirement.curry(name)]]];\n+ });\n+ items.push(['requirements', menuItems]);\n+ }\n \n // method tracing items\n function disableGlobalTracing() {\n@@ -1264,28 +1136,6 @@\n });\n }]);\n }\n- if (Global.AdvancedSyntaxHighlighting && AdvancedSyntaxHighlighting.isGlobal()) {\n- items.push(['[X] Advanced Syntax Highlighting', function() {\n- AdvancedSyntaxHighlighting.beNotGlobal();\n- }]);\n- } else {\n- items.push(['[ ] Advanced Syntax Highlighting', function() {\n- require('lively.ast.StaticAnalysis').toRun(function() {\n- AdvancedSyntaxHighlighting.beGlobal();\n- });\n- }]);\n- }\n- if (Global.AutoIndentLayer && AutoIndentLayer.isGlobal()) {\n- items.push(['[X] Auto Indent', function() {\n- AutoIndentLayer.beNotGlobal();\n- }]);\n- } else {\n- items.push(['[ ] Auto Indent', function() {\n- require('users.cschuster.AutoIndent').toRun(function() {\n- AutoIndentLayer.beGlobal();\n- });\n- }]);\n- }\n return items;\n },\n \n@@ -1296,50 +1146,44 @@\n ['Parts', this.morphMenuDefaultPartsItems()],\n ['Tools', [\n ['Workspace', this.openWorkspace.bind(this)],\n-\t\t['System Code Browser', this.openSystemBrowser.bind(this)],\n+\t\t ['System Code Browser', this.openSystemBrowser.bind(this)],\n ['Object Editor', this.openObjectEditor.bind(this)],\n ['Test Runner', this.openTestRunner.bind(this)],\n ['Method Finder', this.openMethodFinder.bind(this)],\n- ['Text Editor', function() { new lively.morphic.TextEditor().openIn(world) }],\n- ['System Console', this.openSystemConsole.bind(this)]\n+ ['Text Editor', function() { new lively.morphic.TextEditor().openIn(world) }]\n ]],\n- ['Stepping', [\n- ['Start stepping', function() { world.submorphs.each(\n- function(ea) {ea.startSteppingScripts && ea.startSteppingScripts()})}],\n- ['Stop stepping', function() { world.submorphs.each(\n- function(ea) {ea.stopStepping && ea.stopStepping()})}],\n- ]], \n ['Preferences', [\n- ['Set username', this.askForUserName.bind(this)],\n- ['My user config', this.showUserConfig.bind(this)],\n- ['Set extent', this.askForNewWorldExtent.bind(this)],\n- ['Set background color', this.askForNewBackgroundColor.bind(this)]]\n+ ['set username', this.askForUserName.bind(this)],\n+ ['set extent', this.askForNewWorldExtent.bind(this)],\n+ ['set background color', this.askForNewBackgroundColor.bind(this)],\n+ ['show lively.Config', function() {\n+ world.addTextWindow({title: 'lively.Config', content: lively.Config.inspect() }); }]]\n ],\n ['Debugging', this.debuggingMenuItems(world)],\n ['Wiki', [\n- ['About this wiki', this.openAboutBox.bind(this)],\n- ['Bootstrap parts from webwerkstatt', this.openBootstrapParts.bind(this)],\n- ['View versions of this world', this.openVersionViewer.bind(this)],\n- ['Download world', function() {\n+ ['about this wiki', this.openAboutBox.bind(this)],\n+ ['bootstrap parts from webwerkstatt', this.openBootstrapParts.bind(this)],\n+ ['view versions of this world', this.openVersionViewer.bind(this)],\n+ ['download world', function() {\n require('lively.persistence.StandAlonePackaging').toRun(function() {\n lively.persistence.StandAlonePackaging.packageCurrentWorld();\n });\n }],\n- ['Upload world to Dropbox', function() {\n+ ['upload world to Dropbox', function() {\n require('apps.Dropbox').toRun(function() {\n DropboxAPI.uploadArchivedWorld();\n });\n }],\n- ['Delete world', this.interactiveDeleteWorldOnServer.bind(this)]\n+ ['delete world', this.interactiveDeleteWorldOnServer.bind(this)]\n ]],\n ['Documentation', [\n- [\"On short cuts\", this.openShortcutDocumentation.bind(this)],\n- [\"On connect data bindings\", this.openConnectDocumentation.bind(this)],\n-\t\t\t\t [\"On Lively's PartsBin\", this.openPartsBinDocumentation.bind(this)],\n- [\"More ...\", function() { window.open(Config.rootPath + 'documentation/'); }]\n+ [\"on short cuts\", this.openShortcutDocumentation.bind(this)],\n+ [\"on connect data bindings\", this.openConnectDocumentation.bind(this)],\n+\t\t\t\t [\"on Lively's PartsBin\", this.openPartsBinDocumentation.bind(this)],\n+ [\"more...\", function() { window.open(Config.rootPath + 'documentation/'); }]\n ]],\n- ['Save world as ...', this.interactiveSaveWorldAs.bind(this), 'synchron'],\n- ['Save world', this.saveWorld.bind(this), 'synchron']\n+ ['save world as ...', this.interactiveSaveWorldAs.bind(this), 'synchron'],\n+ ['save world', this.saveWorld.bind(this), 'synchron']\n ];\n return items;\n }\n@@ -1429,7 +1273,7 @@\n \n blockMorph.addMorph(d.panel);\n \n- if(activeWindow.targetMorph){\n+ if (activeWindow.targetMorph) {\n d.panel.align(d.panel.bounds().topRight(), pointOfAlign);\n } else {\n d.panel.align(d.panel.bounds().center(), pointOfAlign);\n@@ -1728,6 +1572,7 @@\n },\n \n });\n+\n lively.morphic.DropDownList.addMethods(\n 'initializing', {\n initialize: function($super, bounds, optItems) {\n@@ -1810,7 +1655,7 @@\n var cell = new Rectangle(0, 0, this.barHeight-5, this.barHeight-5);\n \n this.closeButton = this.addMorph(\n- new lively.morphic.WindowControl(cell, this.controlSpacing, \"X\", pt(-5,-4)));\n+ new lively.morphic.WindowControl(cell, this.controlSpacing, \"X\", pt(-4,-6)));\n this.closeButton.applyStyle({moveHorizontal: true});\n //this.closeButton.linkToStyles('titleBar_closeButton');\n this.menuButton = this.addMorph(\n@@ -1874,8 +1719,6 @@\n this.applyStyle({borderRadius: collapsed ? \"8px 8px 8px 8px\" : \"8px 8px 0px 0px\"});\n },\n \n-\n-\n },\n 'event handling', {\n onMouseDown: function (evt) {\n@@ -1886,7 +1729,7 @@\n onMouseUp: Functions.False,\n });\n \n-lively.morphic.Morph.subclass('lively.morphic.Window', Trait('WindowMorph'),\n+lively.morphic.Morph.subclass('lively.morphic.Window', Trait('WindowMorph')/*TODO get rid of this*/,\n 'documentation', {\n documentation: \"Full-fledged windows with title bar, menus, etc\",\n },\n@@ -2006,7 +1849,7 @@\n var self = this;\n itemFilter = function (items) {\n items[0] = [\n- 'Publish window', function(evt) {\n+ 'publish window', function(evt) {\n self.copyToPartsBinWithUserRequest();\n }]\n return items;\n@@ -2017,11 +1860,11 @@\n morphMenuItems: function($super) {\n var self = this, items = $super();\n items[0] = [\n- 'Publish window', function(evt) {\n+ 'publish window', function(evt) {\n self.copyToPartsBinWithUserRequest();\n }];\n items.push([\n- 'Set title', function(evt) {\n+ 'set title', function(evt) {\n $world.prompt('Enter new title', function(input) {\n if (input || input == '') self.setTitle(input);\n }, self.getTitle()); }]);\n@@ -2241,13 +2084,14 @@\n var bounds = new Rectangle(this.inset, this.inset, this.panel.getExtent().x - 2*this.inset, 18);\n this.label = this.panel.addMorph(new lively.morphic.Text(bounds, this.message));\n this.label.beLabel({fill: Color.white, fixedHeight: true, fixedWidth: false, padding: Rectangle.inset(0,0)});\n-// FIXME ugly hack for wide dialogs\n-(function fit() {\n- this.label.fit();\n- var labelWidth = this.label.getExtent().x, panelExtent = this.panel.getExtent();\n- if (labelWidth > panelExtent.x)\n- this.panel.setExtent(panelExtent.withX(labelWidth))\n-}).bind(this).delay(0);\n+ // FIXME ugly hack for wide dialogs\n+ (function fit() {\n+ this.label.fit();\n+ var labelWidth = this.label.getExtent().x, panelExtent = this.panel.getExtent();\n+ if (labelWidth > panelExtent.x) {\n+ this.panel.setExtent(panelExtent.withX(labelWidth));\n+ }\n+ }).bind(this).delay(0);\n this.label.disableDragging();\n this.label.disableGrabbing();\n },\n@@ -2318,8 +2162,8 @@\n var input = new lively.morphic.Text(this.label.bounds().insetByPt(pt(this.label.getPosition().x * 2, 0)), this.defaultInput || '');\n input.align(input.getPosition(), this.label.bounds().bottomLeft().addPt(pt(0,5)));\n input.beInputLine({fixedWidth: true});\n-\t\tinput.disableDragging();\n-\t\tinput.disableGrabbing();\n+\t\t input.disableDragging();\n+\t\t input.disableGrabbing();\n connect(input, 'savedTextString', this, 'result');\n connect(input, 'onEscPressed', this, 'result', {converter: function() { return null } });\n connect(this.panel, 'onEscPressed', this, 'result', {converter: function() { return null}});\n@@ -2355,6 +2199,7 @@\n return view;\n },\n });\n+\n lively.morphic.AbstractDialog.subclass('lively.morphic.EditDialog',\n // new lively.morphic.PromptDialog('Test', function(input) { alert(input) }).open()\n 'initializing', {\n@@ -2572,8 +2417,6 @@\n });\n },\n \n-\n-\n },\n 'aligning', {\n // Note: the next four methods should be removed after we have gridding, i think (DI)\n@@ -2647,8 +2490,6 @@\n // alert(\"grab \" + this.selectedMorphs[i])\n this.addMorph(this.selectedMorphs[i]);\n }\n-\n-\n },\n dropOn: function(morph) {\n // alert(\"drop \" + this + \" on \" + morph)\n@@ -2696,10 +2537,10 @@\n selectMorphs: function(selectedMorphs) {\n this.owner.selectionMorph.selectedMorphs = selectedMorphs\n \n-// finding pos, starting with max values\n- var topLeft = this.bounds().bottomRight();\n- var bottomRight = this.bounds().topLeft();\n- var self = this;\n+ // finding pos, starting with max values\n+ var topLeft = this.bounds().bottomRight(),\n+ bottomRight = this.bounds().topLeft(),\n+ self = this;\n \n this.removeSelecitonIndicators();\n selectedMorphs.forEach(function(ea) {\n@@ -2733,7 +2574,7 @@\n this.selectionIndicators.invoke('remove');\n this.selectionIndicators = [];\n },\n- makeGroup: function() {\n+ makeGroup: function() {\n if (!this.selectedMorphs) return;\n var group = new lively.morphic.Box(this.bounds());\n group.isGroup = true;\n@@ -2753,8 +2594,8 @@\n this.selectMorphs(all)\n },\n \n-\n });\n+\n Trait('SelectionMorphTrait',\n 'selection', {\n getSelectedMorphs: function() {\n@@ -2971,7 +2812,6 @@\n });\n \n \n-\n lively.morphic.Box.subclass('lively.morphic.HorizontalDivider', Trait('HorizontalDividerTrait'),\n 'settings', {\n style: {fill: Color.gray, enableDragging: true},\n@@ -3114,12 +2954,13 @@\n \n \n });\n+\n Object.extend(Array.prototype, {\n asListItemArray: function() {\n return this.collect(function(ea) {\n return {isListItem: true, string: ea.toString(), value: ea};\n });\n- },\n+ }\n })\n \n }) // end of module\n","/core/lively/morphic/TextCore.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/TextCore.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/TextCore.js\t2012-06-16 15:53:03.000000000 +0200\n@@ -79,11 +79,10 @@\n var chunkBeforeSpec = this.getChunkAndLocalIndex(fromSafe);\n if (!chunkBeforeSpec) return [];\n var chunkBefore = chunkBeforeSpec[0].splitBefore(chunkBeforeSpec[1]),\n- chunkAfter = chunkBefore.next(),\n idxInChunks = this.textChunks.indexOf(chunkBefore),\n newChunk = new lively.morphic.TextChunk('');\n- this.textChunks.pushAt(newChunk, idxInChunks + 1);\n- newChunk.addTo(this, chunkAfter);\n+ this.textChunks.pushAt(newChunk, idxInChunks+1);\n+ newChunk.addTo(this, chunkBefore.next());\n return [newChunk];\n } else {\n // split the chunks and retrieve chunks inbetween from-to\n@@ -226,7 +225,6 @@\n this.charsTyped = '';\n this.evalEnabled = false;\n this.fit();\n- if (this.prepareForTextMutationRecording) this.prepareForTextMutationRecording();\n }\n },\n 'styling', {\n@@ -427,10 +425,8 @@\n paddingHeight = padding.top() + padding.bottom(),\n width = this.fixedWidth ? extent.x : (textExtent.x + borderWidth*2 + paddingWidth),\n height = this.fixedHeight ? extent.y : (textExtent.y + borderWidth*2 + paddingHeight);\n- // if (width !== extent.x || height != extent.y) {\n- this.setExtent(pt(width, height));\n- // }\n- }\n+ this.setExtent(pt(width, height));\n+ },\n },\n 'text modes', {\n beLabel: function(customStyle) {\n@@ -525,6 +521,7 @@\n evt.stop();\n return true;\n },\n+\n onKeyPress: function(evt) {\n this.cachedTextString = null;\n \n@@ -544,6 +541,7 @@\n evt.stopPropagation()\n return true;\n },\n+\n onPaste: function (evt) {\n var htmlData = evt.clipboardData && evt.clipboardData.getData(\"text/html\"),\n textData = evt.clipboardData && evt.clipboardData.getData(\"text/plain\");\n@@ -553,18 +551,26 @@\n return false; // let HTML magic handle paste\n }\n \n- var data = htmlData || lively.morphic.HTMLParser.stringToHTML(textData), // own rich text\n+ // try to process own rich text\n+ var data = htmlData || lively.morphic.HTMLParser.stringToHTML(textData),\n richText = lively.morphic.HTMLParser.pastedHTMLToRichText(data);\n+ if (!richText) {\n+ this.insertAtCursor(textData, true, true);\n+ evt.stop()\n+ return true;\n+ }\n try {\n richText.replaceSelectionInMorph(this);\n } catch(e) {\n var world = this.world();\n- if (!world) return true;\n+ if (!world) { evt.stop(); return true; }\n var selRange = this.getSelectionRange(),\n- text = this;\n- function inspectCb() {\n- lively.morphic.inspect({richText: richText, text: text, selecitonRange: selRange});\n- }\n+ text = this,\n+ inspectCb = lively.morphic.inspect.curry({\n+ richText: richText,\n+ text: text,\n+ selecitonRange: selRange\n+ });\n world.setStatusMessage(\"Error in Text>>onPaste() @ replaceSelelectionInMorph\",\n Color.red, undefined, inspectCb);\n world.logError(e);\n@@ -572,6 +578,7 @@\n evt.stop()\n return true;\n },\n+\n onCut: function(evt) {\n this.fixChunksDelayed();\n },\n@@ -584,7 +591,6 @@\n if (evt.isShiftDown()) { // shifted commands here...\n switch (key) {\n case \"i\": { this.doInspect(); return true; }\n- case \"e\": { this.doEdit(); return true; }\n case \"d\": { this.doDebugit(); return true; }\n case \"p\": { this.doListProtocol(); return true; }\n case \"f\": { this.doBrowseImplementors(); return true; }\n@@ -644,12 +650,6 @@\n return false; }\n case \"v\": { // Just do the native paste\n return false; }\n- case \"z\": {\n- if (this.undo) {\n- this.undo();\n- return true;\n- }\n- return false; }\n }\n \n switch(evt.getKeyCode()) {\n@@ -709,8 +709,7 @@\n function(response) {\n if (!response) return;\n text.focus();\n- var start = text.getSelectionRange()[1];\n- (function() { text.searchForFind(response, start) }).delay(0);\n+ return text.searchForFind(response, text.getSelectionRange()[1]);\n }, this.lastSearchString);\n },\n \n@@ -741,11 +740,7 @@\n },\n doInspect: function() {\n var obj = this.evalSelection();\n- if (obj) this.world().openInspectorFor(obj);\n- },\n- doEdit: function() {\n- var obj = this.evalSelection();\n- if (obj) this.world().openObjectEditorFor(obj);\n+ if (obj) this.world().openInspectorFor(obj)\n },\n doBrowseSenders: function() {\n this.world().openBrowseSendersFor(this.getSelectionOrLineString())\n@@ -1376,6 +1371,7 @@\n },\n \n setSelectionRange: function(start, end) {\n+ if (!this.isFocused()) this.focus();\n if (start < 0) { start = 0; }\n if (start > this.textString.length) { start = this.textString.length; }\n if (end < 0) { end = 0; }\n@@ -1392,8 +1388,8 @@\n if (startBoundaryPoint === undefined) startBoundaryPoint = endBoundaryPoint;\n if (endBoundaryPoint === undefined) endBoundaryPoint = startBoundaryPoint;\n \n-// alert('selecting ' + startBoundaryPoint[0].textContent + '[' + startBoundaryPoint[1] + ']-'\n- // + endBoundaryPoint[0].textContent + '[' + endBoundaryPoint[1] + ']')\n+ // alert('selecting ' + startBoundaryPoint[0].textContent + '[' + startBoundaryPoint[1] + ']-'\n+ // + endBoundaryPoint[0].textContent + '[' + endBoundaryPoint[1] + ']')\n \n if (sel.setBaseAndExtent) {\n // setBaseAndExtent supports right-to-left selections (at least in Chrome...)\n@@ -1402,7 +1398,7 @@\n endBoundaryPoint[0], endBoundaryPoint[1]);\n } else { // e.g. FireFox does not support setBaseAndExtent\n // actually it should not be necessary to switch the values\n- // bot range does not work with right-to-left selections\n+ // but range does not work with right-to-left selections\n if (start > end) {\n var temp = endBoundaryPoint;\n endBoundaryPoint = startBoundaryPoint;\n@@ -1519,7 +1515,6 @@\n },\n \n selectWord: function(str, i1) { // Selection caret before char i1\n- if (!str) return i1;\n // Most of the logic here is devoted to selecting matching backets\n var rightBrackets = \"*)}]>'\\\"\";\n var leftBrackets = \"*({[<'\\\"\";\n@@ -1645,6 +1640,7 @@\n },\n 'searching', {\n searchForFind: function(str, start, noWrap) {\n+ // if (this.world()) this.focus();\n var i1 = this.textString.indexOf(str, start);\n if (i1 < 0 && !noWrap) i1 = this.textString.indexOf(str, 0); // wrap\n if (i1 >= 0) this.setSelectionRange(i1, i1+str.length);\n@@ -1967,17 +1963,6 @@\n var chunkAndIdx = this.getChunkAndLocalIndex(idx, true);\n return chunkAndIdx && chunkAndIdx[0].style;\n },\n-\t\n-\tinsertRichTextAt: function(string, style, index) {\n- var newChunk = this.sliceTextChunks(index, index)[0];\n- if (!newChunk) {\n- console.warn('insertRichtTextAt failed, found no text chunk!');\n- return;\n- }\n- newChunk.textString += string;\n- newChunk.styleText(style);\n- this.coalesceChunks();\n- },\n \n },\n 'status messages', {\n@@ -2042,10 +2027,10 @@\n tabspacesForCursorPos: function() {\n var cursorPos = this.getSelectionRange()[0]\n if (this.textString[cursorPos] == '\\n') return this.tab\n- var beginOfLine = this.textString.lastIndexOf('\\n', cursorPos);\n+ var beginOfLine = this.textString.lastIndexOf(\"\\n\", cursorPos);\n var column = this.textString.substring(beginOfLine + 1, cursorPos);\n // alertOK(\"tab \" + column.length)\n- return Strings.indent('', ' ', this.tab.length - column.length % this.tab.length )\n+ return Strings.indent(\"\", \" \", this.tab.length - column.length % this.tab.length )\n },\n },\n 'syntax highlighting', {\n@@ -2286,11 +2271,9 @@\n };\n \n // We dont care we want to have the right so use this as right and dont split\n- if (returnRight && myString.length === 0)\n- return this;\n+ if (returnRight && myString.length === 0) return this;\n // same thing\n- if (!returnRight && newString.length === 0)\n- return this;\n+ if (!returnRight && newString.length === 0) return this;\n \n this.textString = myString;\n var newChunk = this.createForSplit(newString),\n@@ -2304,7 +2287,8 @@\n \n return returnRight ? newChunk : this;\n },\n- createForSplit: function(str) { return new this.constructor(str, this.style.clone()) },\n+\n+ createForSplit: function(str) { return new this.constructor(str, this.style.clone()) }\n \n },\n 'joining', {\n@@ -2318,11 +2302,11 @@\n this.textString += next.textString;\n return true;\n },\n+\n joinWithNextIfEqualStyle: function() {\n var next = this.next();\n- if (next && this.style.equals(next.style))\n- return this.joinWithNext();\n- },\n+ return next && this.style.equals(next.style) ? this.joinWithNext() : null;\n+ }\n \n },\n 'styling', {\n@@ -2330,7 +2314,7 @@\n this.normalize();\n if (styleSpec) this.style.add(styleSpec);\n this.style.applyToHTML(this.getChunkNode(), this.debugMode);\n- },\n+ }\n },\n 'subnodes', {\n normalize: function() {\n@@ -2758,31 +2742,33 @@\n // creates DOM node from a snipped of HTML\n if (data.startsWith('' + data + '
';\n- string = string.replace(\"\", \"\")\n- string = string.replace(/
/g, \"
\")\n- var node = new DOMParser().parseFromString(string, \"text/xml\").documentElement;\n+ var string = '' + data + '
';\n+ string = string.replace(\"\", \"\");\n+ string = string.replace(/
/g, \"
\");\n+ var doc = new DOMParser().parseFromString(string, \"text/xml\"),\n+ errorOccurred = doc.getElementsByTagName('parsererror').length > 0;\n+ return !errorOccurred && doc.documentElement;\n+ }\n+ // it's a complete html document\n+ // we are currently cutting of everything excepts the body -- this means that\n+ // style can be lost\n+ var start = data.indexOf('');\n+ if (start > -1) {\n+ start += 6; // \"\"\n+ var end = data.indexOf('')\n+ var string = data.slice(start, end);\n+ string = Strings.removeSurroundingWhitespaces(string);\n } else {\n- // it's a cpmplete html document\n- // we are currently cutting of everything excepts the body -- this means that\n- // style can be lost\n- var start = data.indexOf('');\n- if (start > -1) {\n- start += 6; // \"\"\n- var end = data.indexOf('')\n- var string = data.slice(start, end);\n- string = Strings.removeSurroundingWhitespaces(string);\n- } else {\n- var string = data; // if no body tag just use the plain string\n- }\n- var node = XHTMLNS.create('div');\n- try {\n- node.innerHTML = this.sanitizeHtml(string);\n- } catch (e) {\n- // JENS: logError breaks browser under windows?\n- alert(\"PASTE ERROR: \" + e + '\\n could not paste: ' + string +'\\n'\n- + 'please report problem on: http://lively-kernel.org/trac')\n- }\n+ var string = data; // if no body tag just use the plain string\n+ }\n+ var node = XHTMLNS.create('div');\n+ try {\n+ node.innerHTML = this.sanitizeHtml(string);\n+ } catch (e) {\n+ // JENS: logError breaks browser under windows?\n+ alert(\"PASTE ERROR: \" + e + '\\n could not paste: ' + string +'\\n'\n+ + 'please report problem on: http://lively-kernel.org/trac')\n }\n return node\n },\n@@ -2807,16 +2793,16 @@\n })\n },\n \n-\n-\n pastedHTMLToRichText: function(data) {\n- // creates a rich text object from HTML snipped\n+ // creates a rich text object from HTML snippet\n var node = this.sourceToNode(data);\n+ if (!node) return;\n this.sanitizeNode(node);\n var richText = new lively.morphic.RichText(node.textContent);\n this.extractStylesAndApplyToRichText(node, richText, {styles: [], styleStart: 0})\n return richText;\n },\n+\n extractStylesAndApplyToRichText: function(element, richText, mem) {\n // private\n for (var i = 0; i < element.childNodes.length; i++) {\n@@ -2928,27 +2914,4 @@\n },\n });\n \n-Trait(\"lively.morphic.TextDiffTrait\", {\n- diff: function(string1, string2, options) {\n- options = options || {};\n- var asLines = options.lines,\n- insertAt = options.insertAt,\n- text = this;\n- if (insertAt === undefined) {\n- this.textString = \"\";\n- insertAt = 0;\n- }\n- require('apps.DiffMatchPatch').toRun(function() {\n- var diffs, dmp = new diff_match_patch();\n- if (asLines) {\n- diffs = dmp.diff_lineMode(string1, string2);\n- } else {\n- diffs = dmp.diff_main(string1, string2);\n- dmp.diff_cleanupSemantic(diffs);\n- }\n- dmp.showDiffsIn(diffs, text, insertAt);\n- });\n- },\n-}).applyTo(lively.morphic.Text);\n-\n-}) // end of modulerp\n\\ No newline at end of file\n+}) // end of module\n\\ No newline at end of file\n","/core/lively/morphic/tests/Morphic.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/tests/Morphic.js\t2012-05-05 12:34:44.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/tests/Morphic.js\t2012-06-16 15:53:03.000000000 +0200\n@@ -502,7 +502,6 @@\n this.assert(m.textString.indexOf(m.selectionString()) != -1);\n },\n \n-\n test06ModifySelectedLinesInsertsAtCorrectPosition: function() {\n var m = new lively.morphic.Text(new Rectangle(0,0, 100, 20));\n this.world.addMorph(m);\n@@ -589,7 +588,7 @@\n expected = [' var x = this.text(),', ' bla = this.bar.foo();'],\n result = [cleaner(lines[0], 0, lines), cleaner(lines[1], 1, lines)];\n this.assertEqualState(expected, result);\n- \n+\n },\n \n });\n","/core/lively/morphic/tests/Morphic2.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/tests/Morphic2.js\t2012-05-21 15:20:27.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/tests/Morphic2.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -652,13 +652,13 @@\n m1.getPartItem = getPartItemFactory;\n \n this.assertEquals(m1.findParentPartVersion().getPartsBinMetaInfo().revisionOnLoad, m1.getPartsBinMetaInfo().revisionOnLoad, 'Revision number of current revision was wrong.')\n- \n+\n this.assert(!m2.findParentPartVersion().getPartsBinMetaInfo().revisionOnLoad, \"Should't have found a match\");\n },\n \n \n testFindCurrentPartVersion: function() {\n- var m1 = Morph.makeRectangle(0,0,100,100);\n+ var m1 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n m1.getPartsBinMetaInfo().revisionOnLoad = 2;\n m1.getPartItem = function () {\n return {part: this,\n@@ -670,7 +670,7 @@\n }.bind(this)}\n };\n this.assertEquals(m1.getPartsBinMetaInfo().revisionOnLoad,\n- m1.findCurrentPartVersion().getPartsBinMetaInfo().revisionOnLoad, \n+ m1.findCurrentPartVersion().getPartsBinMetaInfo().revisionOnLoad,\n 'Wrong revision number')\n },\n \n@@ -699,8 +699,6 @@\n var m1 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n var m2 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n m1.addMorph(m2);\n- var m6 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n- m2.addMorph(m6);\n //simulate copyToPartsBin\n var m3 = m1.copy();\n //simulate copyFromPartsBin\n@@ -731,8 +729,8 @@\n var pbv = m1.copy();\n var m4 = pbv.copy(); // simulate copyToPartsBin\n \n- m4.isDirectDescendentOf = function () {return true}; \n- m4.submorphs[0].isDirectDescendentOf = function () {return true}; \n+ m4.isDirectDescendentOf = function () {return true};\n+ m4.submorphs[0].isDirectDescendentOf = function () {return true};\n \n this.assert(m4.existsAlreadyIn(pbv), \"Should exist in first generation\")\n this.assert(m4.submorphs[0].existsAlreadyIn(pbv), \"submorph should exist in first generation\");\n@@ -760,8 +758,6 @@\n this.assert(!m8.submorphs[0].findSiblingInRelative(m7, m4), 'Wrong submorph sibling with grand parent')\n },\n \n-\n-\n },\n 'diffing', {\n testCopy: function() {\n@@ -773,12 +769,13 @@\n var m1 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n var m2 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n m1.addMorph(m2);\n- //simulate copyToPartsBin\n+ // simulate copyToPartsBin\n var pbv = m1.copy();\n- //simulate copyFromPartsBin\n+ // simulate copyFromPartsBin\n var m3 = pbv.copy();\n var m4 = m3.copy();\n- //this.assert(!m4.diffTo(m3), \"found changes, but there weren't some\") //required in three way diff, therefore staying\n+ // this.assert(!m4.diffTo(m3), \"found changes, but there weren't some\")\n+ // required in three way diff, therefore staying\n var m5 = lively.morphic.Morph.makeRectangle(0,0,100,100);\n m4.addMorph(m5)\n \n@@ -795,7 +792,6 @@\n \n //modified morphs\n m6.setFill(Global.Color.red);\n- debugger\n this.assert(m6.diffTo(m4)[m6.id].modified['Fill'], \"no removal found\")\n \n //submorphsModified\n@@ -826,10 +822,18 @@\n this.assert(!a.equals(c),'the vectors should not have been the same');\n this.assert(!a.equals(d),'the colors should not have been the same');\n },\n+\n testMorphEquals: function() {\n- var m1 = $world.loadPartItem(\"Rectangle\", \"PartsBin/Basic\");\n- var m2 = $world.loadPartItem(\"Rectangle\", \"PartsBin/Basic\")\n- var m3 = m1.copy();\n+ var m1 = lively.morphic.Morph.makeRectangle(0,0,100,100),\n+ m2 = m1.copy();\n+ this.assert(m1.equals(m2), \"Morphs are not equal after copying\");\n+ },\n+\n+ testMorphEqualsWithPartsBinMorphs: function() {\n+ if (Config.serverInvokedTest) return; // Not yet PB access\n+ var m1 = $world.loadPartItem(\"Rectangle\", \"PartsBin/Basic\"),\n+ m2 = $world.loadPartItem(\"Rectangle\", \"PartsBin/Basic\"),\n+ m3 = m1.copy();\n this.assert(m1.equals(m2), \"Morphs that were both loaded from the same part are not equal\");\n this.assert(m1.equals(m3), \"Morphs are not equal after copying\");\n },\n","/core/lively/morphic/tests/HTMLText.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/tests/HTMLText.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/tests/HTMLText.js\t2012-05-05 12:34:36.000000000 +0200\n@@ -38,14 +38,6 @@\n this.assert(textNode.contenteditable, 'contenteditable not enabled by default');\n this.text.setInputAllowed(false);\n this.assert(!textNode.contenteditable, 'contenteditable not disabled');\n- },\n-\n- test04InsertRichTextAndCopy: function() {\n- this.text.textString = \"Heoe!\";\n- this.assertEquals(this.text.copy().textString, \"Heoe!\");\n- this.text.insertRichTextAt(\"y J\", {color:Color.red}, 2);\n- this.assertEquals(this.text.textString, \"Hey Joe!\", \"text after insert\");\n- this.assertEquals(this.text.copy().textString, \"Hey Joe!\", \"text after copy\");\n }\n });\n \n","/core/lively/morphic/tests/HTML.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/tests/HTML.js\t2012-05-21 15:20:27.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/tests/HTML.js\t2012-04-22 00:37:41.000000000 +0200\n@@ -92,24 +92,5 @@\n }\n \n });\n-lively.morphic.tests.TestCase.subclass('lively.morphic.tests.HTML.Fill',\n-'testing', {\n- test01SetCSSFill: function() {\n- this.morph.setFill(new lively.morphic.CSS.Fill('red'));\n- this.assertDOMState({\n- tagName: 'div',\n- childNodes: [{tagName: 'div', style: {background: 'red'}}]\n- }, this.morph);\n- },\n-\n- test02CSSFillResetsPreviousFill: function() {\n- this.morph.setFill(Color.green);\n- this.morph.setFill(new lively.morphic.CSS.Fill('red'));\n- this.assertDOMState({\n- tagName: 'div',\n- childNodes: [{tagName: 'div', style: {backgroundColor: 'red', background: 'red'}}]\n- }, this.morph);\n- }\n-});\n \n });\n\\ No newline at end of file\n","/core/lively/morphic/Shapes.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Shapes.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Shapes.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -35,9 +35,6 @@\n },\n setBorderWidth: function(width) { return this.shapeSetter('BorderWidth', width) },\n getBorderWidth: function() {\n- if (this.getBorderStylingMode && this.getBorderStylingMode()) {\n- return this.shapeGetter('ComputedBorderWidth') || 0;\n- }\n return this.shapeGetter('BorderWidth') || 0;\n },\n setBorderColor: function(fill) { return this.shapeSetter('BorderColor', fill) },\n@@ -76,28 +73,35 @@\n getPadding: function() {\n return this.shapeGetter('Padding') || this.setPadding(new Rectangle(0,0,0,0));\n },\n-\n- setNodeClass: function(value) {\n- //console.log(\"Shapes.js, setNodeClass(): Setting style class to \"+value);\n- return this.shapeSetter('NodeClass', value);\n- },\n- getNodeClass: function() {\n- return this.shapeGetter('NodeClass') || [];\n- },\n-\n- setNodeId: function(value) {\n- //console.log(\"Shapes.js, setNodeId(): Setting style id to \"+value);\n- return this.shapeSetter('NodeId', value);\n- },\n- getNodeId: function() {\n- return this.shapeGetter('NodeId') || \"\";\n- }\n-\n-\n },\n 'comparing', {\n-\n-\n+ equals: function (otherShape) {\n+ var diffsArray = this.getDiffsTo(otherShape)\n+ if(diffsArray.length > 0) return false;\n+ return true;\n+ },\n+ getDiffsTo: function (otherShape) {\n+ // returns a list of differences between two shapes.\n+ // TODO: refactor, adapt to morph diffing\n+ var self = this,\n+ blacklist = [\"get\"],\n+ diffsArray = Functions.all(this).withoutAll(blacklist).select(function (ea) {\n+ if (!ea.startsWith(\"get\") || !otherShape[ea]) return false;\n+ try {\n+ if (self[ea]() && typeof(self[ea]()) == 'object') {\n+ return !self[ea]().equals(otherShape[ea]());\n+ } else {\n+ return self[ea]() != otherShape[ea]();\n+ }\n+ } catch (ex) {\n+ return false;\n+ }\n+ });\n+ if (!this.name == otherShape.name) {\n+ diffsArray.push(\"constructor\");\n+ };\n+ return diffsArray;\n+ },\n \n });\n \n","/core/lively/morphic/Serialization.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Serialization.js\t2012-06-12 21:34:54.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Serialization.js\t2012-05-05 12:34:36.000000000 +0200\n@@ -119,8 +119,8 @@\n this.charsTyped = '';\n var chunks = this.getTextChunks();\n chunks.forEach(function(ea) {\n- ea.textString = ea.storedString;\n- });\n+ ea.textString = ea.storedString;\n+ });\n },\n prepareForNewRenderContext: function($super,renderCtx) {\n $super(renderCtx);\n@@ -220,7 +220,6 @@\n if(!Config.forceSyncSaving) { webR = webR.beAsync(); }\n var start = new Date().getTime();\n \t\tif (this.getUserName) this.getUserName(); // cgi saves user in localStorage\n- webR.setRequestHeaders({\"Cache-Control\": \"no-cache\"});\n webR.put(doc, null, checkForOverwrites ? this.revisionOnLoad : null);\n Config.lastSaveTransferTime = new Date().getTime() - start;\n },\n@@ -237,7 +236,6 @@\n if (status.isSuccess()) {\n this.tryToGetWorldRevision(); // update the rev used for overwrite check\n this.savedWorldAsURL = status.url;\n- lively.bindings.signal(this, 'savingDone', status.url);\n } else {\n this.alert('Problem saving ' + status.url + ': ' + status)\n }\n","/core/lively/morphic/ScriptingSupport.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/ScriptingSupport.js\t2012-04-24 19:31:49.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/ScriptingSupport.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -107,10 +107,7 @@\n this.partItem = partItem;\n this.setupLogo();\n this.disableDropping();\n- if(typeof this.disableSelection === \"function\") {\n- this.disableSelection();\n- } \n- \n+ if (Object.isFunction(this.disableSelection)) this.disableSelection();\n },\n \n setupLogo: function() {\n","/core/lively/morphic/Rendering.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Rendering.js\t2012-06-16 18:29:17.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Rendering.js\t2012-06-14 10:17:32.000000000 +0200\n@@ -165,12 +165,10 @@\n return node.setAttributeNS(null, name, String(value));\n },\n setFill: function(node, fill, shapeBounds) {\n- if (!fill) {\n- node.style.background = null;\n- } else if (this.isHTML(node)) {\n+ if (fill === undefined) return;\n+ if (this.isHTML(node)) {\n if (fill == null) fill = Color.rgba(0,0,0,0);\n if (fill.isGradient) { this.setHTMLGradient(node, fill, shapeBounds); return };\n- if (fill.isCSSFill) { fill.applyToNode(node); return };\n if (fill instanceof Color) {\n node.style.background = fill.toRGBAString()\n return;\n@@ -315,20 +313,16 @@\n }\n throw new Error('Cannot set MinWidth for node ' + node);\n },\n- setClassName: function(node, value) {\n- node.className = value;\n- },\n+\n setHTMLBorderRadiusPoint: function(node, radiusPt) {\n this.setHTMLBorderRadius(node, radiusPt.x, radiusPt.y)\n },\n+\n setHTMLBorderRadius: function(node, rx, ry) {\n- if (rx === null || ry === null) {\n- node.style.borderRadius = null;\n- } else {\n- var roundRectValue = Math.max(0, rx) + 'px /' + Math.max(0, ry) + 'px';\n- node.style.borderRadius = roundRectValue;\n- }\n+ var roundRectValue = Math.max(0, rx) + 'px /' + Math.max(0, ry) + 'px';\n+ node.style.borderRadius = roundRectValue;\n },\n+\n computeScrollBarExtentHTML: function() {\n var body = document.getElementsByTagName('body')[0],\n div = XHTMLNS.create('div');\n@@ -350,8 +344,7 @@\n return 0;\n }\n return result;\n- },\n-\n+ }\n \n });\n \n@@ -359,7 +352,7 @@\n 'settings', {\n domInterface: new lively.morphic.Rendering.DOMInterface(),\n shapeDispatchTable: {},\n- morphDispatchTable: {},\n+ morphDispatchTable: {}\n },\n 'creation', {\n newInstance: function() {\n@@ -483,9 +476,6 @@\n onRenderFinished: function(ctx) {\n this._isRendered = true;\n this.renderContextDispatch('onRenderFinished', ctx);\n-\n- // update the computed styles of the shape to adapt the extent\n- this.updateComputedStyles && this.updateComputedStyles();\n },\n \n isRendered: function() {\n","/core/lively/morphic/MorphAddons.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/MorphAddons.js\t2012-06-14 10:17:00.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/MorphAddons.js\t2012-06-14 10:17:32.000000000 +0200\n@@ -131,17 +131,6 @@\n this.remove();\n owner.addMorphFront(this);\n },\n- \n- sendToBack: function() {\n- // Hack: remove and re-add morph\n- var owner = this.owner;\n- if (!owner) {\n- return;\n- }\n- this.remove();\n- owner.addMorphBack(this);\n- },\n-\n indentedListItemsOfMorphNames: function (indent) {\n indent = indent || '';\n var items = [];\n@@ -241,26 +230,6 @@\n removeAllMorphs: function() {\n this.submorphs.clone().invoke('remove')\n },\n-\n- removeAndDropSubmorphs: function() {\n- // Removes the morph and lets all its child morphs drop to its owner\n-\n- \n- this.submorphs.each(function(submorph){\n- \n- \n- var supermorph = this.owner || $world; \n- supermorph.addMorph(submorph.copy());\n- //submorph.remove();\n- //this.submorphs = this.submorphs.without(submorph);\n- //submorph.owner = supermorph;\n- \n- }, this);\n- \n- this.removeAllMorphs();\n- this.remove();\n- \n- }\n },\n 'events', {\n takesKeyboardFocus: function() {},\n@@ -280,7 +249,6 @@\n getStyleClass: function() { return this.styleClass || [] },\n \n setStyleClass: function(value) {\n- \n // from good ol' SVG days\n var attr;\n if (value instanceof Array) {\n","/core/lively/morphic/Layout.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Layout.js\t2012-06-12 21:34:54.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Layout.js\t2012-05-05 12:34:36.000000000 +0200\n@@ -212,14 +212,13 @@\n return 0;\n },\n \n- getBorderSize: function(direction) {\n- if (!direction) return this.getBorderSize(\"left\");\n- if (Object.isNumber(this.borderSize)) return this.borderSize;\n- if (!this.borderSize) return this.borderSize = 10;\n- return this.borderSize[direction];\n+ getBorderSize: function() {\n+ if (!this.borderSize && this.borderSize != 0) {\n+ this.borderSize = 10;\n+ }\n+ return this.borderSize;\n },\n \n-\n getSpacing: function() {\n if (!this.spacing && this.spacing != 0) {\n this.spacing = 15;\n@@ -331,16 +330,16 @@\n var extent = container.getExtent(),\n width = extent.x,\n height = extent.y,\n+ borderWidth = this.getBorderSize(),\n spacing = this.getSpacing(),\n- childHeight = height - this.getBorderSize(\"top\") - this.getBorderSize(\"bottom\"),\n+ childHeight = height - 2*borderWidth,\n fixedChildrenWidth = submorphs.reduce(function (s, e) {\n return (!e.layout || !e.layout.resizeWidth) ? s + e.getExtent().x : s }, 0),\n varChildren = submorphs.select(function(e) {\n return e.layout && e.layout.resizeWidth; }),\n varChildrenCount = varChildren.size(),\n varChildrenWidth = extent.x - fixedChildrenWidth\n- - (submorphs.size() - 1) * spacing\n- - this.getBorderSize(\"left\") - this.getBorderSize(\"right\"),\n+ - (submorphs.size() - 1) * spacing - 2 * borderWidth,\n varChildWidth = varChildrenWidth / varChildrenCount;\n \n varChildren.forEach(function (each) {\n@@ -359,10 +358,9 @@\n if (extent.y < minHeight) height = minHeight;\n container.setExtent(pt(width, height));\n }\n- var borderSizeTop = this.getBorderSize(\"top\");\n \n submorphs.reduce(function (x, morph) {\n- morph.setPositionTopLeft(pt(x, borderSizeTop ));\n+ morph.setPositionTopLeft(pt(x, borderWidth));\n var newWidth = morph.getExtent().x,\n newHeight = (morph.layout != undefined && morph.layout.resizeHeight == true) ?\n childHeight :\n@@ -370,12 +368,12 @@\n if (morph.layout && morph.layout.resizeWidth) newWidth = varChildWidth;\n morph.setExtent(pt(newWidth, newHeight));\n return x + morph.getExtent().x + spacing;\n- }, this.getBorderSize(\"left\"));\n+ }, borderWidth);\n },\n \n getMinWidth: function(container, submorphs) {\n \n- return this.getBorderSize(\"left\") + this.getBorderSize(\"right\") +\n+ return 2 * this.getBorderSize() +\n (submorphs.size()-1) * this.getSpacing() +\n submorphs.reduce(function (s, e)\n \t\t {if (e.layout == undefined || e.layout.resizeWidth == false || e.layout.resizeWidth == undefined)\n@@ -385,7 +383,7 @@\n \n },\n \tgetMinHeight: function(container, submorphs) {\n- return this.getBorderSize(\"top\") + this.getBorderSize(\"bottom\") +\n+ return 2 * this.getBorderSize() +\n submorphs.reduce(function(h, morph)\n \t\t {if (morph.getMinHeight() > h)\n \t\t\t{return morph.getMinHeight();}\n@@ -441,12 +439,14 @@\n });\n lively.morphic.Layout.Layout.subclass('lively.morphic.Layout.VerticalLayout',\n 'default category', {\n+\n basicLayout: function(container, submorphs) {\n var extent = container.getExtent();\n var width = extent.x;\n var height = extent.y;\n+ var borderWidth = this.getBorderSize();\n var spacing = this.getSpacing();\n- var childWidth = width - this.getBorderSize(\"left\") - this.getBorderSize(\"right\");\n+ var childWidth = width - 2*borderWidth;\n \n var fixedChildrenHeight = submorphs.reduce(function(s, e) {\n return !e.layout || !e.layout.resizeHeight ?\n@@ -460,8 +460,7 @@\n var varChildrenHeight = extent.y -\n fixedChildrenHeight -\n (submorphs.size() - 1) * spacing -\n- this.getBorderSize(\"top\") -\n- this.getBorderSize(\"bottom\");\n+ 2 * borderWidth;\n \n var varChildHeight = varChildrenHeight / varChildrenCount;\n varChildren.forEach(function (each) {\n@@ -479,10 +478,9 @@\n if (extent.y < minHeight) height = minHeight;\n container.setExtent(pt(width, height));\n }\n- var borderSizeLeft = this.getBorderSize(\"left\");\n \n submorphs.reduce(function (y, morph) {\n- morph.setPositionTopLeft(pt(borderSizeLeft, y));\n+ morph.setPositionTopLeft(pt(borderWidth, y));\n var newHeight = morph.getExtent().y;\n var newWidth = (morph.layout && morph.layout.resizeWidth == true) ?\n childWidth :\n@@ -492,12 +490,12 @@\n }\n morph.setExtent(pt(newWidth, newHeight));\n return y + morph.getExtent().y + spacing;\n- }, this.getBorderSize(\"top\"));\n+ }, borderWidth);\n },\n \n \tgetMinHeight: function(container, submorphs) {\n \n- return this.getBorderSize(\"top\") + this.getBorderSize(\"bottom\") +\n+ return 2 * this.getBorderSize() +\n (submorphs.size()-1) * this.getSpacing() +\n submorphs.reduce(function (s, e)\n \t\t {if (e.layout == undefined || e.layout.resizeHeight == false || e.layout.resizeHeight == undefined)\n@@ -507,7 +505,7 @@\n \n },\n \tgetMinWidth: function(container, submorphs) {\n- return this.getBorderSize(\"left\") + this.getBorderSize(\"right\") +\n+ return 2 * this.getBorderSize() +\n submorphs.reduce(function(w, morph)\n \t\t {if (morph.getMinWidth() > w)\n \t\t\t{return morph.getMinWidth();}\n@@ -516,7 +514,7 @@\n },\n \n getEffectiveHeight: function(container, submorphs) {\n- return this.getBorderSize(\"top\") + this.getBorderSize(\"bottom\") +\n+ return 2 * this.getBorderSize() +\n (submorphs.size()-1) * this.getSpacing() +\n submorphs.reduce(function (s, e) {\n return s + e.getExtent().y}, 0);\n@@ -531,59 +529,6 @@\n \n });\n \n-lively.morphic.Layout.VerticalLayout.subclass('lively.morphic.Layout.VerticalScrollerLayout',\n-'default category', {\n- basicLayout: function(container, submorphs) {\n- // omitting container resize\n- var extent = container.getExtent();\n- var width = extent.x;\n- var height = extent.y;\n- var spacing = this.getSpacing();\n- var childWidth = width - this.getBorderSize(\"left\") - this.getBorderSize(\"right\");\n-\n- var fixedChildrenHeight = submorphs.reduce(function(s, e) {\n- return !e.layout || !e.layout.resizeHeight ?\n- s + e.getExtent().y : s;\n- }, 0);\n-\n- var varChildren = submorphs.select(function(e) {\n- return e.layout && e.layout.resizeHeight; }),\n- varChildrenCount = varChildren.size();\n-\n- var varChildrenHeight = extent.y -\n- fixedChildrenHeight -\n- (submorphs.size() - 1) * spacing -\n- this.getBorderSize(\"top\") -\n- this.getBorderSize(\"bottom\");\n-\n- var varChildHeight = varChildrenHeight / varChildrenCount;\n- varChildren.forEach(function (each) {\n- if (each.getMinHeight() > varChildHeight) {\n- varChildrenHeight -= each.getMinHeight();\n- varChildrenCount -= 1;\n- }\n- });\n- varChildHeight = varChildrenHeight / varChildrenCount;\n-\n-\n- var borderSizeLeft = this.getBorderSize(\"left\");\n-\n- submorphs.reduce(function (y, morph) {\n- morph.setPositionTopLeft(pt(borderSizeLeft, y));\n- var newHeight = morph.getExtent().y;\n- var newWidth = (morph.layout && morph.layout.resizeWidth == true) ?\n- childWidth :\n- morph.getExtent().x;\n- if (morph.layout && morph.layout.resizeHeight) {\n- newHeight = varChildHeight;\n- }\n- morph.setExtent(pt(newWidth, newHeight));\n- return y + morph.getExtent().y + spacing;\n- }, this.getBorderSize(\"top\"));\n-\n- }\n-});\n-\n lively.morphic.Layout.VerticalLayout.subclass('lively.morphic.Layout.JournalLayout',\n 'default category', {\n \n@@ -701,8 +646,6 @@\n subExtent = aSubmorph.getExtent();\n \n if (aMorph.isInLayoutCycle) { return; }\n-//debugger;\n-console.log(\"Layout: onSubmorphResized\")\n aMorph.isInLayoutCycle = true;\n if (aSubmorph.gridCoords) {\n for (var x = 0; x < this.numCols; x++) {\n@@ -745,7 +688,6 @@\n adjustRowAndColSizes: function() {\n this.colWidths = [];\n this.rowHeights = [];\n- console.log(\"Layout: adjustRowAndColSizes\")\n var x, y;\n for (x = 0; x < this.numCols; x++) {\n this.colWidths.push(this.getColWidth(x));\n@@ -931,12 +873,12 @@\n getMinWidth: function(container, submorphs) {\n return submorphs.reduce(function(s, e) {\n return (e.getExtent().x > s) ? e.getExtent().x : s; }, 0) +\n- this.getBorderSize(\"left\") + this.getBorderSize(\"right\");\n+ 2 * this.getBorderSize();\n },\n getMinHeight: function(container, submorphs) {\n return submorphs.reduce(function(s, e) {\n return (e.getExtent().y > s) ? e.getExtent().y : s; }, 0) +\n- this.getBorderSize(\"top\") + this.getBorderSize(\"bottom\");\n+ 2 * this.getBorderSize();\n },\n \n handlesSubmorphResized: function() {\n","/core/lively/morphic/HTML.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/HTML.js\t2012-06-14 10:17:00.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/HTML.js\t2012-06-14 10:17:32.000000000 +0200\n@@ -142,7 +142,6 @@\n focus: 'focusHTML',\n blur: 'blurHTML',\n setFocusable: 'setFocusableHTML',\n- setStyleSheet: 'setStyleSheetHTML'\n },\n },\n 'udpating', {\n@@ -227,11 +226,6 @@\n if (ctxt.morphNode)\n ctxt.morphNode.setAttribute('title', string)\n },\n-\n- setStyleSheetHTML: function(ctx, css) {\n- \n- }\n-\n },\n 'rendering', {\n renderWithHTML: function() {\n@@ -252,13 +246,8 @@\n this.setVisibleHTML(ctx, false);\n var tooltip = this.morphicGetter('ToolTip');\n tooltip && this.setToolTipHTML(ctx, tooltip);\n-\n- \n- \n if (UserAgent.fireFoxVersion)\n ctx.morphNode['-moz-user-modify'] = 'read-only'\n-\n-\n },\n appendHTML: function(ctx, optMorphAfter) {\n if (!ctx.morphNode) throw dbgOn(new Error('no ctx.morphNode!'));\n@@ -285,13 +274,10 @@\n }\n }\n \n-\n-\n var afterNode = optMorphAfter && optMorphAfter.renderContext().getMorphNode();\n this.insertMorphNodeInHTML(ctx, ctx.morphNode, parentNode, afterNode, ctx.shapeNode);\n \n this.getShape().renderUsing(ctx);\n-\n },\n insertMorphNodeInHTML: function(ctx, morphNode, parentNode, optAfterNode) {\n if (!optAfterNode || !$A(parentNode.childNodes).include(optAfterNode)) {\n@@ -335,21 +321,18 @@\n var node = ctx.morphNode;\n if (node && this.isFocused()) node.blur();\n },\n- setFocusableHTML: function(ctx, boolOrIndex) {\n+ setFocusableHTML: function(ctx, bool) {\n if (!ctx.morphNode) return;\n- if (typeof boolOrIndex === \"boolean\") {\n- ctx.morphNode.tabIndex = -1;\n- } else if (typeof boolOrIndex === \"number\") {\n- ctx.morphNode.tabIndex = boolOrIndex;\n- } else delete ctx.morphNode.tabIndex\n+ if (bool) ctx.morphNode.tabIndex = -1;\n+ else delete ctx.morphNode.tabIndex\n },\n });\n \n lively.morphic.World.addMethods(\n 'HTML render settings', {\n htmlDispatchTable: {\n- setScroll: 'setScrollHTML',\n- },\n+ setScroll: 'setScrollHTML'\n+ }\n },\n 'scrolling', {\n setScrollHTML: function(ctx, value) {\n@@ -653,9 +636,7 @@\n return idx;\n },\n deselectNodesHTML: function(ctx) {\n- if (ctx.subNodes) {\n- ctx.subNodes.forEach(function(ea) { ea.selected = false })\n- }\n+ ctx.subNodes.forEach(function(ea) { ea.selected = false })\n },\n },\n 'drop down support HTML', {\n@@ -675,7 +656,7 @@\n },\n deselectAtHTML: function(ctx, idx) {\n if (!ctx.listNode) return;\n- if (idx < 0 || idx >= this.itemList.length) reurn;\n+ if (idx < 0 || idx >= this.itemList.length) return;\n var node = ctx.subNodes[idx];\n if (node) node.selected = false;\n },\n@@ -728,15 +709,7 @@\n setStrokeOpacity: 'setStrokeOpacityHTML',\n setBorderRadius: 'setBorderRadiusHTML',\n setBorderStyle: 'setBorderStyleHTML',\n- setOpacity: 'setOpacityHTML',\n- setNodeClass: 'setNodeClassHTML',\n- setNodeId: 'setNodeIdHTML',\n- setStyleSheet: 'setStyleSheetHTML',\n- setAppearanceStylingMode: 'setAppearanceStylingModeHTML',\n- setBorderStylingMode: 'setBorderStylingModeHTML',\n- setComputedStyles: 'setComputedStylesHTML',\n- setComputedBorderWidth: 'setComputedBorderWidthHTML'\n- \n+ setOpacity: 'setOpacityHTML'\n },\n },\n 'initializing', {\n@@ -751,15 +724,6 @@\n this.setBorderWidthHTML(ctx, this.getBorderWidth()); // The other border props are initialized there as well\n this.setBorderStyleHTML(ctx, this.getBorderStyle());\n this.setPaddingHTML(ctx, this.getPadding()); // also sets extent\n-\n-\n- this.getNodeClass() && this.setNodeClassHTML(ctx, this.getNodeClass());\n- if (this.getNodeId()) { \n- this.setNodeIdHTML(ctx, this.getNodeId());\n- this.getStyleSheet && this.setStyleSheetHTML(ctx, this.getStyleSheet());\n- }\n- \n- \n if (UserAgent.fireFoxVersion)\n ctx.shapeNode['-moz-user-modify'] = 'read-only'\n },\n@@ -789,32 +753,24 @@\n realExtent = value\n .addXY(-2 * borderWidth, -2 * borderWidth)\n .addXY(-paddingWidth, -paddingHeight);\n- realExtent = realExtent.maxPt(pt(0,0));\n ctx.domInterface.setExtent(ctx.shapeNode, realExtent);\n return realExtent;\n },\n setFillHTML: function(ctx, value) {\n if (!ctx.shapeNode) return;\n- if (this.isStyleSheetAppearance){\n- ctx.domInterface.setFill(ctx.shapeNode, null, this.getBounds());\n- } else {\n- ctx.domInterface.setFill(ctx.shapeNode, value, this.getBounds());\n- }\n+ ctx.domInterface.setFill(ctx.shapeNode, value, this.getBounds());\n },\n setBorderColorHTML: function(ctx, fill) {\n var alpha;\n- if (this.getStrokeOpacity() != 1)\n+ if (this.getStrokeOpacity() != 1) {\n alpha = this.getStrokeOpacity();\n- else {\n- if (fill === null)\n- alpha = 0;\n- else\n- alpha = fill.a\n+ } else {\n+ alpha = fill === null ? 0 : fill.a;\n }\n return this.setBorderHTML(ctx, this.getBorderWidth(), fill, alpha)\n },\n setBorderStyleHTML: function(ctx, value) {\n- if (ctx.shapeNode) ctx.shapeNode.style.borderStyle = (this.isStyleSheetBorder)?null:value;\n+ if (ctx.shapeNode) ctx.shapeNode.style.borderStyle = value;\n },\n setBorderWidthHTML: function(ctx, width) {\n this.setBorderHTML(ctx, width, this.getBorderColor(), this.getStrokeOpacity());\n@@ -830,17 +786,10 @@\n },\n setBorderHTML: function(ctx, width, fill, opacity) {\n if (!ctx.shapeNode) return;\n- if (this.isStyleSheetBorder) {\n- ctx.shapeNode.style['border'] = null;\n- } else {\n- \n- if ((fill instanceof Color) && opacity) fill = fill.withA(opacity);\n- if (!fill) fill = Color.rgba(0,0,0,0);\n- \n- \n- ctx.shapeNode.style['border'] = this.getBorderStyle() + ' ' + width + 'px ' +\n- fill.toCSSString(this.getBounds(), ctx.domInterface.html5CssPrefix);\n- }\n+ if ((fill instanceof Color) && opacity) fill = fill.withA(opacity);\n+ if (!fill) fill = Color.rgba(0,0,0,0);\n+ ctx.shapeNode.style['border'] = this.getBorderStyle() + ' ' + width + 'px ' +\n+ fill.toCSSString(this.getBounds(), ctx.domInterface.html5CssPrefix);\n if (ctx.originNode) {\n this.compensateShapeNode(ctx);\n }\n@@ -861,7 +810,7 @@\n ctx.originNode.style.setProperty('margin-left', -this.getBorderWidth() + 'px', 'important');\n },\n setOpacityHTML: function(ctx, value) {\n- ctx.shapeNode.style.opacity = (this.isStyleSheetAppearance)?null:value;\n+ ctx.shapeNode.style.opacity = value;\n },\n setPaddingHTML: function(ctx, r) {\n if (r === undefined || !ctx.shapeNode) return r;\n@@ -871,84 +820,6 @@\n ctx.shapeNode.style.padding = s;\n return r;\n },\n- \n- setNodeClassHTML: function(ctx, value) {\n- //console.log(\"Ok, got it, setting shape HTML class to \"+value);\n- var a = value;\n- if (value instanceof Array) {\n- a = value.join(\" \");\n- }\n- \n-\n- ctx.shapeNode.className = a;\n- },\n- setNodeIdHTML: function(ctx, value) {\n- //console.log(\"HTML.js, setStyleIdHTML(): Ok, got it, setting shape HTML id to \"+value);\n- ctx.shapeNode.id = value;\n- },\n-\n- setStyleSheetHTML: function(ctx, value) {\n- var morphId = ctx.shapeNode.id;\n- if (!morphId) {\n- alert(\"Cannot set morph specific style sheet. Shape node was not assigned any id.\");\n- return false;\n- }\n-\n- var styleTagId = \"style-for-\"+morphId;\n-\n-\tvar css = $('#' + styleTagId);\n-\tcss.remove();\n-\n- if (value && value.length > 1) {\n-\n- \t //console.log(\"Setting CSS for shape \"+morphId+\" to \"+value);\t\n- specificCss = \"#\"+morphId+\" { \"+value+\" }\";\n-\n- if (less) {\n- new(less.Parser)().parse(specificCss, function(e, tree){\n- specificCss = tree.toCSS();\n- });\n- }\n-\n- \n-\t css = $('');\n-\t css.text(specificCss);\n-\t css.appendTo(document.head);\n- }\n- \n- }, \n-\n- setComputedStylesHTML: function(ctx) {\n- if (ctx.shapeNode) {\n- var style = window.getComputedStyle(ctx.shapeNode);\n- var borderWidth = parseInt(style[\"borderWidth\"].replace(\"px\",\"\"));\n- //console.log(\"BorderWidth = \"+borderWidth);\n- this.shapeSetter('ComputedBorderWidth', borderWidth );\n- \n- if (ctx.originNode) {\n- this.compensateShapeNode(ctx);\n- }\n- this.setExtentHTML(ctx, this.getExtent());\n- }\n- },\n-\n- setComputedBorderWidthHTML: function(ctx, width) {},\n-\n- \n- setAppearanceStylingModeHTML: function(ctx, value) {\n- this.isStyleSheetAppearance = value;\n- this.setFillHTML(ctx, this.shapeGetter(\"Fill\"));\n- this.setOpacityHTML(ctx, this.shapeGetter(\"Opacity\"));\n- } ,\n-\n- setBorderStylingModeHTML: function(ctx, value) {\n- this.isStyleSheetBorder = value;\n- this.setBorderHTML(ctx, this.getBorderWidth(), this.getBorderColor(), this.getStrokeOpacity());\n- this.setBorderRadiusHTML(ctx, this.getBorderRadius());\n- } \n-\n- \n-\n });\n \n lively.morphic.Shapes.Rectangle.addMethods(\n@@ -962,12 +833,11 @@\n },\n 'updating', {\n setBorderRadiusHTML: function(ctx, value) {\n- var borderRadius = (this.isStyleSheetBorder) ? null : value;\n if (Object.isString(value)) {\n // irregular border radius for windows e.g.\n- ctx.getShapeNode().style.borderRadius = borderRadius ;\n+ ctx.getShapeNode().style.borderRadius = value\n } else {\n- ctx.domInterface.setHTMLBorderRadius(ctx.getShapeNode(), borderRadius , borderRadius);\n+ ctx.domInterface.setHTMLBorderRadius(ctx.getShapeNode(), value, value)\n }\n },\n });\n@@ -1178,24 +1048,5 @@\n return pathNode && lively.Point.ensure(pathNode.getPointAtLength(totalLength));\n },\n });\n-Object.extend(lively.morphic, {\n- CSS: {}\n-});\n-Object.subclass('lively.morphic.CSS.Fill',\n-'settings', {\n- isCSSFill: true\n-},\n-'initializing', {\n- initialize: function(cssBackgroundString) {\n- this.cssBackgroundString = cssBackgroundString || \"\";\n- },\n-},\n-'rendering', {\n- applyToNode: function(node) {\n- if (node.style) {\n- node.style.background = this.cssBackgroundString;\n- }\n- }\n-});\n \n }) // end of module\n","/core/lively/morphic/Grid.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Grid.js\t2012-06-12 21:34:54.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Grid.js\t2012-05-05 12:34:36.000000000 +0200\n@@ -446,10 +446,6 @@\n }\n },\n 'default category', {\n- setExtent: function ($super,oPos) {\n- console.log(\"Cell setExtent\");\n- $super(oPos);\n- },\n addToGrid: function(aGrid) {\n this.grid = aGrid;\n this.grid.addMorph(this);\n","/core/lively/morphic/Graphics.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Graphics.js\t2012-05-21 15:20:27.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Graphics.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -1,8 +1,8 @@\n module('lively.morphic.Graphics').requires().toRun(function() {\n- \n-Object.subclass(\"Point\", \n+\n+Object.subclass(\"Point\",\n 'documentation', {\n- documentation: \"2D Point\", \n+ documentation: \"2D Point\",\n },\n 'initializing', {\n initialize: function(x, y) {\n@@ -17,7 +17,7 @@\n var array = string.slice(3, -1).split(',');\n this.x = lively.data.Coordinate.parse(array[0]);\n this.y = lively.data.Coordinate.parse(array[1]);\n- }, \n+ },\n },\n 'arithmetic', {\n toFixed: function(val) {\n@@ -30,22 +30,20 @@\n return new lively.Point(this.x + p.x, this.y + p.y);\n },\n \n-\n- \n addXY: function(dx, dy) {\n return new lively.Point(this.x + dx, this.y + dy);\n },\n- \n+\n midPt: function(p) {\n return new lively.Point((this.x + p.x) / 2, (this.y + p.y) / 2);\n },\n- \n+\n subPt: function(p) {\n if (arguments.length != 1) throw ('subPt() only takes 1 parameter.');\n \n return new lively.Point(this.x - p.x, this.y - p.y);\n },\n- \n+\n subXY: function(dx, dy) {\n return new lively.Point(this.x - dx, this.y - dy);\n }\n@@ -54,19 +52,19 @@\n scaleBy: function(scale) {\n return new lively.Point(this.x * scale, this.y * scale);\n },\n- \n+\n scaleByPt: function(scalePt) {\n return new lively.Point(this.x * scalePt.x, this.y * scalePt.y);\n },\n- \n+\n negated: function() {\n return new lively.Point(-this.x, -this.y);\n },\n- \n+\n inverted: function() {\n return new lively.Point(1.0 / this.x, 1.0 / this.y);\n },\n- \n+\n invertedSafely: function() {\n return new lively.Point(this.x && 1.0 / this.x, this.y && 1.0 / this.y);\n },\n@@ -75,33 +73,33 @@\n lessPt: function(p) {\n return this.x < p.x && this.y < p.y;\n },\n- \n+\n leqPt: function(p) {\n return this.x <= p.x && this.y <= p.y;\n },\n- \n+\n eqPt: function(p) {\n return this.x == p.x && this.y == p.y;\n },\n- \n+\n equals: function(p) {\n return this.eqPt(p);\n }\n },\n 'instance creation', {\n- \n+\n withX: function(x) {\n return lively.pt(x, this.y);\n },\n- \n+\n withY: function(y) {\n return lively.pt(this.x, y);\n },\n- \n+\n copy: function() {\n return new lively.Point(this.x, this.y);\n },\n- \n+\n minPt: function(p, acc) {\n if (!acc) acc = new lively.Point(0, 0);\n acc.x = Math.min(this.x, p.x);\n@@ -121,7 +119,7 @@\n var r = this.r();\n return lively.pt(this.x / r, this.y / r);\n },\n- \n+\n fastNormalized: function() {\n var r = this.fastR();\n return lively.pt(this.x / r, this.y / r);\n@@ -130,7 +128,7 @@\n dotProduct: function(p) {\n return this.x * p.x + this.y * p.y\n },\n- \n+\n matrixTransform: function(mx, acc) {\n // if no accumulator passed, allocate a fresh one\n if (!acc) acc = lively.pt(0, 0);\n@@ -155,7 +153,7 @@\n roundTo: function(quantum) {\n return new lively.Point(this.x.roundTo(quantum), this.y.roundTo(quantum));\n },\n- \n+\n dist: function(p) {\n var dx = this.x - p.x;\n var dy = this.y - p.y;\n@@ -177,15 +175,15 @@\n asRectangle: function() {\n return new Rectangle(this.x, this.y, 0, 0);\n },\n- \n+\n extent: function(ext) {\n return new Rectangle(this.x, this.y, ext.x, ext.y);\n },\n- \n+\n extentAsRectangle: function() {\n return new Rectangle(0, 0, this.x, this.y)\n },\n- \n+\n toTuple: function() {\n return [this.x, this.y];\n },\n@@ -213,7 +211,7 @@\n // direction\n return this.dist(lively.pt(0, 0));\n },\n- \n+\n fastR: function() {\n var a = this.x * this.x + this.y * this.y;\n var x = 17;\n@@ -221,7 +219,7 @@\n x = (x + a / x) / 2;\n return x;\n },\n- \n+\n theta: function() {\n return Math.atan2(this.y, this.x);\n }\n@@ -236,12 +234,12 @@\n }\n \n // FIXME: deprecated GLOBAL function\n-Global.pt = function(x, y) { \n+Global.pt = function(x, y) {\n // DEPRECATED: use lively.pt(x, y) instead\n return lively.pt(x, y);\n }\n- \n-Object.subclass('Rectangle', \n+\n+Object.subclass('Rectangle',\n 'documentation', {\n documentation: \"primitive rectangle, structually equivalent to SVGRect\",\n },\n@@ -265,59 +263,59 @@\n toFixed: function(val) {\n return new Rectangle(this.x.toFixed(val), this.y.toFixed(val), this.width.toFixed(val), this.height.toFixed(val));\n },\n- \n+\n withWidth: function(w) {\n return new Rectangle(this.x, this.y, w, this.height)\n },\n- \n+\n withHeight: function(h) {\n return new Rectangle(this.x, this.y, this.width, h)\n },\n- \n+\n withX: function(x) {\n return new Rectangle(x, this.y, this.width, this.height)\n },\n- \n+\n withY: function(y) {\n return new Rectangle(this.x, y, this.width, this.height)\n },\n- \n+\n withExtent: function(ext) {\n return new Rectangle(this.x, this.y, ext.x, ext.y);\n },\n- \n+\n withTopLeft: function(p) {\n return Rectangle.fromAny(p, this.bottomRight())\n },\n- \n+\n withTopRight: function(p) {\n return Rectangle.fromAny(p, this.bottomLeft())\n },\n- \n+\n withBottomRight: function(p) {\n return Rectangle.fromAny(p, this.topLeft())\n },\n- \n+\n withBottomLeft: function(p) {\n return Rectangle.fromAny(p, this.topRight())\n },\n- \n+\n withLeftCenter: function(p) {\n return new Rectangle(p.x, this.y, this.width + (this.x - p.x), this.height)\n },\n- \n+\n withRightCenter: function(p) {\n return new Rectangle(this.x, this.y, p.x - this.x, this.height)\n },\n- \n+\n withTopCenter: function(p) {\n return new Rectangle(this.x, p.y, this.width, this.height + (this.y - p.y))\n },\n- \n+\n withBottomCenter: function(p) {\n return new Rectangle(this.x, this.y, this.width, p.y - this.y)\n },\n- \n+\n insetBy: function(d) {\n return new Rectangle(this.x + d, this.y + d, this.width - (d * 2), this.height - (d * 2));\n },\n@@ -353,39 +351,39 @@\n topLeft: function() {\n return new lively.Point(this.x, this.y)\n },\n- \n+\n topRight: function() {\n return new lively.Point(this.maxX(), this.y)\n },\n- \n+\n bottomRight: function() {\n return new lively.Point(this.maxX(), this.maxY())\n },\n- \n+\n bottomLeft: function() {\n return new lively.Point(this.x, this.maxY())\n },\n- \n+\n leftCenter: function() {\n return new lively.Point(this.x, this.center().y)\n },\n- \n+\n rightCenter: function() {\n return new lively.Point(this.maxX(), this.center().y)\n },\n- \n+\n topCenter: function() {\n return new lively.Point(this.center().x, this.y)\n },\n- \n+\n bottomCenter: function() {\n return new lively.Point(this.center().x, this.maxY())\n },\n- \n+\n extent: function() {\n return new lively.Point(this.width, this.height);\n },\n- \n+\n center: function() {\n return new lively.Point(this.x + (this.width / 2), this.y + (this.height / 2))\n }\n@@ -394,15 +392,15 @@\n isNonEmpty: function(rect) {\n return this.width > 0 && this.height > 0;\n },\n- \n+\n containsRect: function(r) {\n return this.x <= r.x && this.y <= r.y && r.maxX() <= this.maxX() && r.maxY() <= this.maxY();\n },\n- \n+\n intersects: function(r) {\n return this.intersection(r).isNonEmpty();\n },\n- \n+\n containsPoint: function(p) {\n return this.x <= p.x && p.x <= this.x + this.width && this.y <= p.y && p.y <= this.y + this.height;\n }\n@@ -422,18 +420,18 @@\n // return a relative rect for this as a part of fullRect\n return new Rectangle((this.x - fullRect.x) / fullRect.width, (this.y - fullRect.y) / fullRect.height, this.width / fullRect.width, this.height / fullRect.height);\n },\n- \n+\n expandBy: function(delta) {\n return this.insetBy(0 - delta);\n },\n- \n+\n transformRectForInclusion: function(other) {\n var topLeft = this.topLeft().maxPt(other.topLeft()),\n newBottomRight = topLeft.addPt(other.extent()),\n innerBottomRight = this.bottomRight().minPt(newBottomRight);\n return lively.rect(topLeft, innerBottomRight);\n },\n- \n+\n insetByRect: function(r) {\n return new Rectangle(this.x + r.left(), this.y + r.top(), this.width -\n (r.left() + r.right()), this.height - (r.top() + r.bottom()));\n@@ -462,12 +460,12 @@\n var p2 = rect.closestPointToPt(p1);\n return p1.dist(p2);\n },\n- \n+\n relativeToAbsPoint: function(relPt) {\n return new lively.Point(\n this.x + this.width * relPt.x, this.y + this.height * relPt.y)\n },\n- \n+\n closestPointToPt: function(p) {\n // Assume p lies outside me; return a point on my perimeter\n return lively.pt(Math.min(Math.max(this.x, p.x), this.maxX()), Math.min(Math.max(this.y, p.y), this.maxY()));\n@@ -485,25 +483,25 @@\n realWidth: function() {\n return this.x < 0 ? -this.x + this.width : this.width\n },\n- \n+\n realHeight: function() {\n return this.y < 0 ? -this.y + this.height : this.height\n },\n- \n+\n randomPoint: function() {\n return lively.Point.random(lively.pt(this.width, this.height)).addPt(this.topLeft());\n },\n- \n+\n constrainPt: function(pt) {\n return pt.maxPt(this.topLeft()).minPt(this.bottomRight());\n- } \n+ }\n },\n 'SVG interface', {\n // modeled after the CSS box model: http://www.w3.org/TR/REC-CSS2/box.html\n left: function() {\n return this.x;\n },\n- \n+\n right: function() {\n return this.maxX();\n },\n@@ -529,9 +527,9 @@\n return result.invoke('roundTo', d || 0.01);\n },\n \n- toLiteral: function() { \n- return {x: this.x, y: this.y, width: this.width, height: this.height}; \n- } \n+ toLiteral: function() {\n+ return {x: this.x, y: this.y, width: this.width, height: this.height};\n+ }\n },\n 'part support', {\n partNamed: function(partName) {\n@@ -576,11 +574,11 @@\n },\n \n polar: function(r, theta) {\n- // theta=0 is East on the screen, \n+ // theta=0 is East on the screen,\n // increases in counter-clockwise direction\n return new lively.Point(r * Math.cos(theta), r * Math.sin(theta));\n },\n- \n+\n random: function(scalePt) {\n return new lively.Point(scalePt.x.randomSmallerInteger(), scalePt.y.randomSmallerInteger());\n },\n@@ -710,17 +708,17 @@\n // Note the ambiguity with negative scales is resolved by assuming\n // scale x is positive\n var r = Math.atan2(-this.c, this.a).toDegrees();\n- \n+\n // don't bother with values very close to 0\n- return Math.abs(r) < this.eps ? 0 : r; \n+ return Math.abs(r) < this.eps ? 0 : r;\n },\n \n getScale: function() {\n // Note the ambiguity with negative scales and rotation is resolved by assuming scale x is positive\n var a = this.a, c = this.c, s = Math.sqrt(a * a + c * c);\n- \n+\n // don't bother with values very close to 1\n- return Math.abs(s - 1) < this.eps ? 1 : s; \n+ return Math.abs(s - 1) < this.eps ? 1 : s;\n },\n \n getScalePoint: function() {\n@@ -733,7 +731,7 @@\n sx = Math.sqrt(a * a + c * c),\n r = Math.atan2(-c, a), // radians\n // avoid div by 0\n- sy = (Math.abs(b) > Math.abs(d)) ? b / Math.sin(r) : d / Math.cos(r); \n+ sy = (Math.abs(b) > Math.abs(d)) ? b / Math.sin(r) : d / Math.cos(r);\n return pt(sx, sy);\n },\n \n@@ -761,7 +759,7 @@\n \n return attr;\n },\n- \n+\n toCSSValue: function(bounds) {\n var attr = '';\n \n@@ -778,7 +776,7 @@\n }\n \n var theta = this.getRotation();\n- if (theta != 0.0) attr += \" rotate(\" \n+ if (theta != 0.0) attr += \" rotate(\"\n + round(this.getRotation()) +\"deg)\";\n \n if (bounds) {\n@@ -795,7 +793,7 @@\n \n return attr;\n },\n- \n+\n toCSSTransformString: function() {\n var rot = this.getRotation(),\n scale = this.getScale();\n@@ -806,7 +804,7 @@\n toString: function() {\n return this.toCSSValue();\n },\n- \n+\n toMatrix: function() {\n return this.copy();\n },\n@@ -880,7 +878,7 @@\n this.matrix_ = this.toMatrix();\n return this;\n },\n- \n+\n invert: function() {\n var m = this.copy();\n \n@@ -896,7 +894,7 @@\n \n return this;\n },\n- \n+\n inverse: function() {\n var matrix = this.matrix_ || this.toMatrix();\n var result = new this.constructor(matrix);\n@@ -908,14 +906,14 @@\n ensureNumber: function(value) {\n // note that if a,b,.. f are not numbers, it's usually a\n // problem, which may crash browsers (like Safari) that don't\n- // do good typechecking of SVGMatrix properties \n+ // do good typechecking of SVGMatrix properties\n if (isNaN(value)) { throw dbgOn(new Error('not a number'));}\n return value;\n },\n });\n \n \n-Object.subclass(\"Color\", \n+Object.subclass(\"Color\",\n 'documentation', {\n documentation: \"Fully portable support for RGB colors. A bit of rgba support is also included.\",\n },\n@@ -962,7 +960,7 @@\n \n return \"rgb(\" + floor(this.r) + \",\" + floor(this.g) + \",\" + floor(this.b) + \")\";\n },\n- \n+\n toRGBAString: function() {\n function floor(x) { return Math.floor(x*255.99) };\n return \"rgba(\" + floor(this.r) + \",\" + floor(this.g) + \",\" + floor(this.b) + \",\" + this.a + \")\";\n@@ -988,26 +986,26 @@\n if (max == 0)\n s = 0\n else\n- s = (max - min) / max; \n- return [h, s, b]; \n- } \n+ s = (max - min) / max;\n+ return [h, s, b];\n+ }\n },\n 'instance creation', {\n withA: function(a) {\n return new Color(this.r, this.g, this.b, a)\n },\n- \n+\n mixedWith: function(other, proportion) {\n // Mix with another color -- 1.0 is all this, 0.0 is all other\n var p = proportion,\n q = 1.0 - p;\n return new Color(this.r*p + other.r*q, this.g*p + other.g*q, this.b*p + other.b*q, this.a*p + other.a*q);\n },\n- \n+\n // FIXME: invert sounds like mutation, versus createInverse or similar\n invert: function() {\n return Color.rgb(255 * (1 - this.r), 255 * (1 - this.g), 255 * (1 - this.b));\n- } \n+ }\n },\n 'serializing', {\n deserialize: function(importer, colorStringOrTuple) {\n@@ -1021,7 +1019,7 @@\n this.b = color.b;\n if (!color.a && color.a !== 0) color.a = 1;\n this.a = color.a;\n- } \n+ }\n }\n );\n \n@@ -1073,11 +1071,6 @@\n return new Color(r/255, g/255, b/255);\n },\n \n- rgbHex: function(str) {\n- var c = this.parseHex(str);\n- return new Color(c[0],c[1],c[2]);\n- },\n-\n rgba: function(r, g, b, a) {\n return new Color(r/255, g/255, b/255, a);\n },\n@@ -1119,16 +1112,12 @@\n \n parseHex: function(str) {\n var rHex, gHex, bHex;\n- if (str.length == 7) { \n+ if (str.length == 7) {\n // like #CC0000\n rHex = str.substring(1,3);\n gHex = str.substring(3,5);\n bHex = str.substring(5,7);\n- } else if (str.length == 6) {\n- rHex = str.substring(0,2);\n- gHex = str.substring(2,4);\n- bHex = str.substring(4,6);\n- } else if (str.length == 4) { \n+ } else if (str.length == 4) {\n // short form like #C00\n rHex = str.substring(1,2);\n rHex += rHex;\n@@ -1167,7 +1156,7 @@\n darkGray: Color.rgb(102,102,102),\n lightGray: Color.rgb(230,230,230),\n veryLightGray: Color.rgb(243,243,243),\n- \n+\n // FIXME: are the following palettes used!?\n primary: {\n // Sun palette\n","/core/lively/morphic/Events.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Events.js\t2012-06-14 10:17:00.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Events.js\t2012-06-16 15:53:03.000000000 +0200\n@@ -4,7 +4,7 @@\n createKeyboardEvent: function(spec) {\n var evt = document.createEvent(\"KeyboardEvent\");\n evt.initKeyboardEvent(spec.type || \"keypress\", true, true, window,\n- spec.ctrl || false, spec.alt || false, spec.shift || false, spec.meta || false,\n+ spec.ctrl || 0, spec.alt || 0, spec.shift || 0, spec.meta || 0,\n 0, spec.charCode || (spec.charPressed && spec.charPressed.charCodeAt(0)) || 0);\n return evt;\n },\n@@ -14,7 +14,7 @@\n spec.targetNode = targetNode ? targetNode : spec.targetNode;\n var evt = this.createKeyboardEvent(spec),\n result = spec.targetNode.dispatchEvent(evt);\n- return [result, evt];\n+ return result;\n },\n createMouseEvent: function(type, pos, button, keys) {\n // event.initMouseEvent(type, canBubble, cancelable, view,\n@@ -667,24 +667,6 @@\n },\n \n onMouseDownEntry: function(evt) {\n- \n- // check if mouse is on the scrollbar\n- if ((this.showsVerticalScrollBar() || this.showsHorizontalScrollBar()) && this.grabbingEnabled) {\n- \n- var scrollbarExtent = this.getScrollBarExtent();\n- var extent = this.getExtent();\n- //console.log(\"You clicked on: \"+this.name);\n- //console.log(this.grabbingEnabled);\n- //console.log(\"evt.offsetX: \"+ (evt.offsetX) + \" extent.x- scrollbarExtent.x: \" +(extent.x- scrollbarExtent.x));\n- //console.log(\"evt.offsetY: \"+ (evt.offsetY)+\" extent.y- scrollbarExtent.y: \"+(extent.y- scrollbarExtent.y));\n- // FIXME: not the perfect solution for text edit scroll morphs\n- if ((evt.offsetX> extent.x- scrollbarExtent.x) && (evt.offsetX < extent.x) || \n- (evt.offsetY> extent.y- scrollbarExtent.y) && (evt.offsetY < extent.y)) {\n- return false;\n- }\n- \n- }\n-\n if (this.showsMorphMenu\n && evt.isRightMouseButtonDown() // only world morph is present?\n && this.world().morphsContainingPoint(evt.getPosition()).length === 1) {\n@@ -711,11 +693,8 @@\n \n },\n \n- onMouseUp: function(evt) { \n- return false; \n- },\n+ onMouseUp: function(evt) { return false; },\n onMouseUpEntry: function(evt) {\n- \n var world = evt.world,\n completeClick = world.clickedOnMorph === this,\n internalCompleteClick = evt.hand.internalClickedOnMorph === this;\n@@ -959,11 +938,11 @@\n isFocused: function() { return lively.morphic.Morph.prototype._focusedMorph === this },\n focus: function() { return this.renderContextDispatch('focus') },\n blur: function() { return this.renderContextDispatch('blur') },\n- enableFocus: function(optTabIndex) { return this.morphicSetter('Focusable', optTabIndex || true) },\n+ enableFocus: function() { return this.morphicSetter('Focusable', true) },\n disableFocus: function() { return this.morphicSetter('Focusable', false) },\n isFocusable: function() {\n var val = this.morphicGetter('Focusable');\n- return val === undefined || val >= 0 ? true : val;\n+ return val === undefined ? true : val;\n },\n \n },\n@@ -993,9 +972,9 @@\n placeholderPosition = this.placeholder.getPosition();\n }\n aMorph.addMorph(this);\n- this.onDropOn(aMorph);\n delete this.previousOwner;\n delete this.previousPosition;\n+ this.onDropOn(aMorph);\n if (placeholderPosition) {\n delete(this.placeholder);\n this.setPosition(placeholderPosition.subPt(this.getOrigin())); //.subPt(pt(1,1)));\n@@ -1073,7 +1052,6 @@\n },\n correctForDragOffset: function(evt) {\n // do I respond to onSelectStart in a meaningful way?\n- if (this.dragTriggerDistance === 0) return false;\n if (this.getWindow()) return false;\n if (this.lockOwner() && this.isLocked()) return false;\n return true;\n@@ -1174,18 +1152,6 @@\n }\n },\n 'event handling', {\n- onSelectStart: function(evt) {\n- if (this.eventsAreIgnored)\n- evt.stop();\n- // alert(this.getSelectionRange())\n- // if (!this.bounds().containsPoint(evt.getPosition()))\n- // evt.preventDefault();\n- // just do the normal thing\n-\n- // Allow HTML selection\n- return true;\n- },\n-\n onBlur: function($super, evt) {\n $super(evt);\n delete this.constructor.prototype.activeInstance;\n@@ -1234,7 +1200,6 @@\n return false;\n },\n onMouseUp: function (evt) {\n-\n if (evt.isLeftMouseButtonDown()) {\n var idx = this.renderContextDispatch('getItemIndexFromEvent', evt);\n // don't update when selection can't be found\n@@ -1250,8 +1215,6 @@\n this.selectAt(idx);\n }\n }\n-\n- evt.stop();\n return true;\n },\n onMouseUpEntry: function ($super, evt) {\n@@ -1315,7 +1278,8 @@\n \n lively.morphic.DropDownList.addMethods(\n 'properties', {\n- isDropDownList: 'true', // triggers correct rendering\n+ // triggers correct rendering\n+ isDropDownList: 'true'\n },\n 'mouse events', {\n onMouseDown: function(evt) {\n@@ -1323,7 +1287,6 @@\n evt.preventDefault()\n return false;\n }\n-\n this.changeTriggered = false; // see onBlur\n return true;\n },\n@@ -1335,6 +1298,7 @@\n this.changeTriggered = true; // see onBlur\n return false;\n },\n+\n onBlur: function(evt) {\n // drop down lists are stupid\n // onChange is not triggered when the same selection is choosen again\n@@ -1345,13 +1309,10 @@\n this.updateSelectionAndLineNoProperties(idx);\n },\n \n-\n-\n registerForOtherEvents: function($super, handleOnCapture) {\n $super(handleOnCapture)\n if (this.onBlur) this.registerForEvent('blur', this, 'onBlur', handleOnCapture);\n- },\n-\n+ }\n \n });\n \n@@ -1445,7 +1406,6 @@\n case \"s\": { this.saveWorld(); return true; }\n case \"b\": {this.openSystemBrowser(evt); return true; }\n case \"k\": { this.openWorkspace(evt); return true; }\n- case \"o\": { this.openObjectEditor(evt); return true; }\n case \"p\": { this.openPartsBin(evt); return true; }\n }\n \n@@ -1617,33 +1577,27 @@\n return true\n },\n \n- onSelectStart: function(evt) {\n- if (this.clickedOnMorph && !this.clickedOnMorph.isText && !this.clickedOnMorph.isList)\n- evt.stop();\n- if (this.clickedOnMorph && this.clickedOnMorph.isText && !this.clickedOnMorph.allowInput)\n- evt.stop()\n- return false;\n- },\n onHTML5DragEnter: function(evt) {\n evt.stop();\n return true;\n },\n+\n onHTML5DragOver: function(evt) {\n evt.stop();\n return true;\n },\n+\n onHTML5Drop: function(evt) {\n // see https://developer.mozilla.org/en/Using_files_from_web_applications\n evt.stop();\n var files = evt.dataTransfer.files;\n if (files && files.length > 0) {\n new lively.FileUploader().handleDroppedFiles(files, evt);\n- } else if (false) { // currently disabled because self-drops are annoying\n+ } else if (evt.dataTransfer && evt.dataTransfer.types) {\n // this needs to be extracted!\n- var supportedTypes = ['text/plain', \"text/uri-list\", 'text/html', 'text'],\n- type = supportedTypes.detect(function(type) {\n- return evt.dataTransfer.types.include(type);\n- });\n+ var types = Array.from(evt.dataTransfer.types),\n+ supportedTypes = ['text/plain', \"text/uri-list\", 'text/html', 'text'],\n+ type = supportedTypes.detect(function(type) { return types.include(type); });\n if (type) {\n var data = evt.dataTransfer.getData(type);\n this.addTextWindow({\n@@ -1655,8 +1609,6 @@\n }\n return true;\n }\n-\n-\n },\n 'window related', {\n onWindowResize: function(evt) {\n@@ -1973,15 +1925,10 @@\n return this.grabMorphs([morph], evt)\n },\n grabMorphs: function(morphs, evt) {\n- \n- \n if (this.submorphs.length > 0) return false;\n this.carriesGrabbedMorphs = true;\n morphs.forEach(function(morph) {\n-\n- if (morph.grabByHand) { \n- morph.grabByHand(this);\n- }\n+ if (morph.grabByHand) morph.grabByHand(this)\n else this.addMorphWithShadow(morph)\n }, this)\n evt && evt.stop();\n@@ -2051,11 +1998,6 @@\n }\n },\n });\n-Object.extend(lively.morphic.Events, {\n- MutationObserver: window.MutationObserver\n- || window.WebKitMutationObserver\n- || window.MozMutationObserver\n-});\n \n // FIXME remove!!!\n module('lively.morphic.EventExperiments').load();\n","/core/lively/morphic/DiffMerge.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/DiffMerge.js\t2012-06-12 21:34:54.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/DiffMerge.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -138,9 +138,7 @@\n },\n findCurrentPartVersion: function () {\n // returns the current version in PartsBin as morph\n- var partItem = this.getPartItem();\n- if (new WebResource(partItem.getFileURL()).exists())\n- return partItem.loadPart(false).part\n+ return this.getPartItem().loadPart(false).part;\n },\n findDerivationParent: function (optScope) {\n //returns the nearest ancestor in line that can be found in scope or world\n@@ -152,17 +150,14 @@\n self = this;\n \n scope.withAllSubmorphsDo(function (ea) {\n- var idsShouldContain = [ea.id].concat(ea.derivationIds || []);\n- // var tempCommonIds = self.derivationIds.intersect(ea.derivationIds);\n- // if (tempCommonIds.equals(ea.derivationIds)\n- // && tempCommonIds.length <= self.derivationIds.length\n- // && tempCommonIds.length > commonIds.length) {\n- // commonIds = tempCommonIds;\n- // result = ea;\n- // }\n- if (self.derivationIds.intersect(idsShouldContain).length == idsShouldContain.length)\n- result = ea\n- })\n+ var tempCommonIds = self.derivationIds.intersect(ea.derivationIds);\n+ if (tempCommonIds.equals(ea.derivationIds)\n+ //&& tempCommonIds.length <= self.derivationIds.length\n+ && tempCommonIds.length > commonIds.length) {\n+ commonIds = tempCommonIds;\n+ result = ea;\n+ }\n+ })\n \n return result;\n },\n@@ -172,14 +167,10 @@\n var scope = optScope || $world,\n result = undefined,\n commonIds = new Array(),\n- myIds = this.derivationIds.concat([this.id]);\n-\n- // todo: implement a limit\n- \n+ self = this;\n \n optScope.withAllSubmorphsDo(function (ea) {\n- var otherIds = ea.derivationIds.concat([ea.id])\n- var tempCommonIds = myIds.intersect(otherIds);\n+ var tempCommonIds = self.derivationIds.intersect(ea.derivationIds);\n if (tempCommonIds.length > commonIds.length) {\n commonIds = tempCommonIds;\n result = ea;\n","/core/lively/morphic/Core.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Core.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Core.js\t2012-06-14 10:17:32.000000000 +0200\n@@ -1,14 +1,9 @@\n module('lively.morphic.Core').requires('lively.morphic.Shapes', 'lively.Traits').toRun(function() {\n \n-if (!Config.isNewMorphic) {\n- var list = module('lively.morphic.Core').traceDependendModules()\n- console.warn(\"WARNING LOADED NEW MORPHIC IN OLD ONE\\n\" + Strings.printNested(list));\n-};\n-\n Object.subclass('lively.morphic.Morph',\n 'properties', {\n style: {enableDropping: true, enableHalos: true},\n- isMorph: true,\n+ isMorph: true\n },\n 'initializing', {\n isMorph: true,\n@@ -17,29 +12,21 @@\n this.submorphs = [];\n this.scripts = [];\n this.shape = shape || this.defaultShape();\n- \n this.setNewId();\n- //console.log(\"Initializing morph \"+this.id);\n- //this.shape.styleClassName=this.constructor.name;\n- //this.shape.styleId = this.id;\n- //console.log(\"Shape Style ID: \" + this.shape.styleId);\n-\n this.prepareForNewRenderContext(this.defaultRenderContext());\n- \n this.applyStyle(this.getStyle());\n- this.setNodeClass(this.getNodeClass());\n- this.setNodeId(this.id);\n },\n setNewId: function(optId) {\n if (this.derivationIds == undefined) this.derivationIds = [];\n this.derivationIds.push(this.id);\n- this.id = optId || (new UUID).id;\n+ this.id = optId || new UUID().id;\n },\n \n defaultShape: function(optBounds) {\n return new lively.morphic.Shapes.Rectangle(optBounds || new Rectangle(0,0,0,0));\n },\n- defaultRenderContext: function() { return new lively.morphic.HTML.RenderContext() },\n+\n+ defaultRenderContext: function() { return new lively.morphic.HTML.RenderContext() }\n \n },\n 'accessing -- shapes', {\n@@ -49,9 +36,7 @@\n },\n },\n 'accessing -- morph properties', {\n- setPosition: function(value) { \n- if (value.x != null && value.y != null) return this.morphicSetter('Position', value);\n-},\n+ setPosition: function(value) { return this.morphicSetter('Position', value) },\n getPosition: function() { return this.morphicGetter('Position') || pt(0,0) },\n setRotation: function(value) { return this.morphicSetter('Rotation', value) },\n getRotation: function() { return this.morphicGetter('Rotation') || 0 },\n@@ -188,39 +173,6 @@\n \n getOpacity: function() { return this.shape.getOpacity() },\n setOpacity: function(o) { return this.shape.setOpacity(o) },\n- \n-\n- setNodeClass: function(value) {\n- //console.log(\"Core.js, Morph, setNodeClass(): Setting style class to \"+value);\n- var a = [];\n- if (value instanceof Array) {\n- a = value;\n- }\n- else {\n- a = value.split(/[\\s,]+/);\n- }\n- var type = this.constructor;\n- \n- while (type != Object) {\n- a.unshift(type.name);\n- type = type.superclass;\n- } \n-\n- var result = [];\n- a.each(function(item){result.push( item.toLowerCase());});\n- result = result.uniq();\n- return this.shape.setNodeClass(result);\n- },\n- getNodeClass: function() {\n- return this.shape.getNodeClass();\n- },\n- setNodeId: function() {\n- //console.log(\"Core.js, Morph, setNodeId(): Setting style id to \"+value);\n- return this.shape.setNodeId(\"morph-\"+this.id.toLowerCase());\n- },\n- getNodeId: function() {\n- return this.shape.getNodeId();\n- },\n \n \n setVertices: function(v) { this.shape.setVertices(v) },\n@@ -272,12 +224,6 @@\n if (this.getLayouter()) {\n this.getLayouter().onSubmorphAdded(this, morph, this.submorphs);\n }\n- if (morph.owner.owner) { // Is owner owner a stack?\n- if (morph.owner.owner.pageArray) {\n- morph.pageSpecific = true; // dropped morph is only on this page\n- // call Stack.beInBackground to place in background\n- }\n- }\n return morph\n },\n withAllSubmorphsDo: function(func, context, depth) {\n@@ -350,12 +296,15 @@\n },\n },\n 'morph removal', {\n+\n remove: function() {\n this.suspendSteppingAll();\n if (this.showsHalos) this.removeHalos();\n this.renderContextDispatch('remove');\n },\n+\n removeMorph: function(morph) {\n+ // PRIVATE! do *not* call directly\n this.submorphs = this.submorphs.without(morph);\n morph.owner = null;\n if (this.getLayouter()) {\n@@ -363,7 +312,6 @@\n }\n },\n \n-\n },\n 'transformation', {\n localize: function(point) {\n@@ -427,9 +375,6 @@\n },\n 'prototypical scripting', {\n addScript: function(funcOrString, optName) {\n- if (funcOrString == undefined)\n- return false\n-\n var func = Function.fromString(funcOrString);\n return func.asScriptOf(this, optName);\n },\n@@ -607,7 +552,7 @@\n enableMorphMenu: true,\n enableDragging: true\n },\n- isWorld: true,\n+ isWorld: true\n },\n 'accessing -- morphic relationship', {\n addMorph: function($super, morph, optMorphBefore) {\n@@ -617,46 +562,41 @@\n this.updateScrollFocus();\n return r;\n },\n- topMorph: function() { return this.submorphs.withoutAll(this.hands).last() },\n+ topMorph: function() { return this.submorphs.withoutAll(this.hands).last() }\n \n },\n 'accessing', {\n world: function() { return this },\n firstHand: function() { return this.hands && this.hands[0] },\n windowBounds: function () {\n- var canvas = this.renderContext().getMorphNode(),\n- topmost = document.documentElement,\n- body = document.body,\n- scale = 1 / this.getScale(),\n- topLeft = pt(body.scrollLeft - (canvas.offsetLeft || 0), body.scrollTop - (canvas.offsetTop || 0)),\n- width, height;\n- if(UserAgent.isTouch){\n- width = window.innerWidth * scale;\n- height = window.innerHeight * scale;\n- } else {\n- width = topmost.clientWidth * scale;\n- height = topmost.clientHeight * scale;\n- }\n- return topLeft.scaleBy(scale).extent(pt(width, height));\n+ var canvas = this.renderContext().getMorphNode(),\n+ topmost = document.documentElement,\n+ body = document.body,\n+ scale = 1 / this.getScale(),\n+ topLeft = pt(body.scrollLeft - (canvas.offsetLeft || 0), body.scrollTop - (canvas.offsetTop || 0)),\n+ width, height;\n+ if (UserAgent.isTouch){\n+ width = window.innerWidth * scale;\n+ height = window.innerHeight * scale;\n+ } else {\n+ width = topmost.clientWidth * scale;\n+ height = topmost.clientHeight * scale;\n+ }\n+ return topLeft.scaleBy(scale).extent(pt(width, height));\n },\n \n visibleBounds: function () {\n // the bounds call seems to slow down halos...\n // return this.windowBounds().intersection(this.bounds());\n return this.windowBounds().intersection(this.innerBounds());\n- },\n- setNodeId: function() {\n- // FIXME: maybe it would be more intelligent to really \n- // generate an ID for the world so we avoid conflicts \n- // when multiple worlds are displayed in the same browser window\n- return this.shape.setNodeId(\"the-world\");\n- },\n+ }\n },\n 'rendering', {\n displayOnCanvas: function(domElement) {\n this.renderContext().setParentNode(domElement);\n this.renderContextDispatch('append');\n },\n+\n hideHostMouseCursor: function () {\n if (!Config.hideSystemCursor) return;\n // FIXME\n@@ -675,7 +615,7 @@\n this.hands.push(hand);\n hand.addToWorld(this);\n this.addMorph(hand);\n- },\n+ }\n },\n 'changes', {\n setChangeSet: function(changeSet) { this.changeSet = changeSet },\n@@ -683,7 +623,9 @@\n });\n \n Object.extend(lively.morphic.World, {\n+\n current: function() { return this.currentWorld },\n+\n createOn: function(domElement, bounds) {\n var world = new this();\n bounds = bounds || new Rectangle(0,0,400,400);\n@@ -693,7 +635,7 @@\n world.addHandMorph();\n this.currentWorld = world;\n return world;\n- },\n+ }\n });\n \n lively.morphic.Morph.subclass('lively.morphic.Box',\n@@ -713,7 +655,7 @@\n 'initializing', {\n initialize: function($super, initialBounds) {\n $super(initialBounds);\n- this.applyStyle({clipMode: 'scroll'});\n+ this.applyStyle({clipMode: 'scroll'})\n },\n });\n \n","/core/lively/morphic/Connectors.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Connectors.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Connectors.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -215,7 +215,7 @@\n \n var debugging = items.detect(function(ea) { return ea[0] == \"Debugging\"})\n if (debugging) {\n- debugging[1].splice(4, 0, [\"Show connectors\",\n+ debugging[1].splice(4, 0, [\"show connectors\",\n function() {\n this.submorphs.select(function(ea) {\n return ea.isPath && ea.con\n@@ -238,7 +238,7 @@\n builder.setPosition(pt(0,0));\n }]\n });\n- return cop.proceed().concat([[\"Connect ...\", connectionItems]]);\n+ return cop.proceed().concat([[\"connect...\", connectionItems]]);\n },\n })\n .beGlobal();\n@@ -449,7 +449,7 @@\n 'Editor for ' + con.targetObj.name + ' -> ' + con.sourceObj.name :\n 'Editor for converter function';\n var window = $world.addFramedMorph(editor, title)\n- return window \n+ return window\n },\n showConnection: function(con) {\n var source = con.sourceObj,\n@@ -470,20 +470,20 @@\n visualConnector.addScript(function morphMenuItems() {\n var visualConnector = this, con = this.con, world = $world;\n var items = [\n- ['Edit converter', function() {\n+ ['edit converter', function() {\n var window = lively.bindings.editConnection(con);\n window.align(window.bounds().topCenter(),\n visualConnector.bounds().bottomCenter())\n }],\n- ['Hide', function() {\n+ ['hide', function() {\n visualConnector.disconnectFromMagnets();\n visualConnector.remove();\n }],\n- ['Disconnect', function() {\n+ ['disconnect', function() {\n alertOK('Disconnected ' + visualConnector.con);\n visualConnector.con.visualDisconnect();\n }],\n- ['Cancel', function() {}],\n+ ['cancel', function() {}],\n ];\n return items;\n })\n@@ -540,7 +540,7 @@\n items = [];\n items.push(this.underMorphMenu(pos, builder.sourceMorph));\n items.pushAll(this.propertiesMenuForTarget(target));\n- show(target);\n+ newShowMorph(target);\n lively.morphic.Menu.openAtHand('Connect to ' + (target.name || target), items)\n },\n underMorphMenu: function(position, sourceMorph, sourceAttribute) {\n@@ -568,15 +568,15 @@\n scriptMenuItems.push([scriptName, function() {\n (that.createConnectFuncFor(aMorph))(scriptName);}]);\n });\n- menu.push([\"Scripts ...\", scriptMenuItems]);\n+ menu.push([\"scripts...\", scriptMenuItems]);\n // Custom\n- menu.push([\"Custom ...\", function() {\n+ menu.push([\"custom...\", function() {\n world.prompt('Enter name of connection point', function(input) {\n if (!input) return;\n (that.createConnectFuncFor(aMorph))(input);\n })\n }])\n- menu.push(['Cancel', function() {}]);\n+ menu.push(['cancel', function() {}]);\n return menu;\n },\n createConnectFuncFor: function(targetMorph) {\n","/core/lively/morphic/Canvas.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/Canvas.js\t2012-04-14 21:45:44.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/Canvas.js\t2012-05-13 22:32:29.000000000 +0200\n@@ -16,7 +16,7 @@\n },\n 'accessing', {\n getCanvas: function() { return this.canvas },\n- getGraphicContext: function() { \n+ getGraphicContext: function() {\n if (this._graphicContext) return this._graphicContext;\n var canvas = this.getCanvas();\n if (!canvas || !canvas.getContext) throw new Error('Cannot access canvas or drawing context');\n@@ -137,7 +137,7 @@\n this.getShape().renderCANVAS(ctx);\n \n this.drawSubmorphsOnCANVAS(ctx);\n- \n+\n graphicContext.restore();\n },\n drawSubmorphsOnCANVAS: function(ctx) {\n","/core/lively/morphic/AdditionalMorphs.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/morphic/AdditionalMorphs.js\t2012-06-01 10:29:34.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/morphic/AdditionalMorphs.js\t2012-05-05 12:34:36.000000000 +0200\n@@ -539,7 +539,6 @@\n this.setExtent(newExtent);\n this.setBorderWidth(1);\n this.setBorderColor(Color.gray);\n- this.layout = {adjustForNewBounds: true};\n tabBarStrategy.applyTo(this);\n },\n \n@@ -786,7 +785,6 @@\n this.setFill(Color.gray);\n this.setBorderWidth(1);\n this.setBorderColor(Color.gray);\n- this.layout = {adjustForNewBounds: true};\n this.initializePane(this.getTabContainer().getTabPaneExtent());\n this.initializeLabel('Tab');\n this.draggingEnabled = this.grabbingEnabled = false;\n@@ -904,7 +902,6 @@\n closer.setExtent(pt(20,20))\n this.addMorph(closer)\n closer.setPosition(pt(this.getExtent().x - 23,6))\n- closer.layout = {moveHorizontal: true};\n connect(closer, \"fire\", this, \"closeTab\", {});\n this.closeButton = closer;\n return this;\n@@ -936,7 +933,7 @@\n this.setBorderWidth(1);\n this.setBorderColor(Color.gray);\n this.setExtent(extent);\n- this.layout = {adjustForNewBounds: true, resizeWidth: true, resizeHeight: true};\n+\n this.draggingEnabled = this.grabbingEnabled = false;\n \n },\n@@ -1063,7 +1060,6 @@\n adjustTabBar: function(aTabBar) {\n aTabBar.setPosition(pt(0,0));\n aTabBar.setRotation(0);\n- aTabBar.layout = {adjustForNewBounds: true, resizeWidth: true};\n aTabBar.setExtent(pt(aTabBar.getTabContainer().getTabPaneExtent().x, aTabBar.getDefaultHeight()));\n },\n \n@@ -1137,7 +1133,6 @@\n adjustTabBar: function(aTabBar) {\n aTabBar.setPosition(pt(0, aTabBar.getTabContainer().getTabPaneExtent().y));\n aTabBar.setRotation(0);\n- aTabBar.layout = {adjustForNewBounds: true, resizeWidth: true};\n aTabBar.setExtent(pt(aTabBar.getExtent().x, aTabBar.getDefaultHeight()));\n },\n \n","/core/lively/Main.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/lively/Main.js\t2012-06-16 15:53:04.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/lively/Main.js\t2012-06-16 15:53:03.000000000 +0200\n@@ -226,15 +226,33 @@\n \n browserSpecificFixes: function() {\n if (Global.navigator.appName == 'Opera') window.onresize();\n- // selection style of morphs/texts/lists etc.\n- if (UserAgent.fireFoxVersion) return;\n- var cssDef = ':focus {outline:none;}\\n.visibleSelection:focus {';\n- if (UserAgent.webKitVersion) {\n- cssDef += ' outline: 2px auto -webkit-focus-ring-color;';\n- } else {\n- cssDef += ' outline: 2px auto blue;';\n- }\n- cssDef += '}';\n+ var cssDef = \"\";\n+ // 1. Don't DOM-select arbitrary elements on mouse move\n+ // none is different to -moz-none:\n+ // none has the same meaning as in display rule, none of the\n+ // sub-elements can overwrite it whereas -moz-none allows\n+ // child elements to overwrite -moz-user-select\n+ cssDef += \"*:not(:focus) {\\n\"\n+ + \" -moz-user-select: -moz-none;\\n\"\n+ + \" -webkit-user-select: none;\\n\"\n+ + \" -ms-user-select: none;\\n\"\n+ + \" user-select: none;\\n\"\n+ + \"}\"\n+ + \".visibleSelection:focus, .visibleSelection:focus * {\\n\"\n+ + \" -moz-user-select: element;\\n\"\n+ + \" -webkit-user-select: auto;\\n\"\n+ + \" -ms-user-select: auto;\\n\"\n+ + \" user-select: auto;\\n\"\n+ + \"}\\n\";\n+ // 2. selection style of morphs/texts/lists etc.\n+ // suppress focus highlight for most elements\n+ // only texts, lists, etc should show the real focus\n+ cssDef += ':focus {\\n'\n+ + ' outline:none;\\n'\n+ + '}\\n'\n+ + '.visibleSelection:focus {\\n'\n+ + ' outline: 2px auto ' + (UserAgent.webKitVersion ? '-webkit-focus-ring-color' : 'blue') + ';\\n'\n+ + '}\\n';\n XHTMLNS.addCSSDef(cssDef);\n },\n \n@@ -290,7 +308,6 @@\n cb(world);\n });\n }\n- lively.whenLoaded = function(callback) { callback.call(world) }\n console.log(\"The world is now completely loaded.\");\n },\n \n@@ -365,21 +382,24 @@\n // uses demo flags from defaultconfig.js and localconfig.js\n Object.subclass('lively.Main.Examples', {\n \n- showStar: function(world) {\n- if (Config.showStar) { // Make a star\n- var makeStarVertices = function(r,center,startAngle) {\n- var vertices = [];\n- var nVerts = 10;\n- for (var i=0; i <= nVerts; i++) {\n- var a = startAngle + (2*Math.PI/nVerts*i);\n- var p = lively.Point.polar(r,a);\n- if (i%2 == 0) p = p.scaleBy(0.39);\n- vertices.push(p.addPt(center));\n- }\n- return vertices;\n+ createStar: function() {\n+ var makeStarVertices = function(r,center,startAngle) {\n+ var vertices = [];\n+ var nVerts = 10;\n+ for (var i=0; i <= nVerts; i++) {\n+ var a = startAngle + (2*Math.PI/nVerts*i);\n+ var p = lively.Point.polar(r,a);\n+ if (i%2 == 0) p = p.scaleBy(0.39);\n+ vertices.push(p.addPt(center));\n }\n+ return vertices;\n+ }\n+ return lively.morphic.Morph.makePolygon(makeStarVertices(50,pt(0,0),0), 1, Color.black, Color.yellow);\n+ },\n \n- widget = Morph.makePolygon(makeStarVertices(50,pt(0,0),0), 1, Color.black, Color.yellow);\n+ showStar: function(world) {\n+ if (Config.showStar) { // Make a star\n+ widget = this.createStar()\n widget.setPosition(pt(125, 275));\n world.addMorph(widget);\n \n","/core/ometa/lib.js":"--- /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/ww/core/ometa/lib.js\t2012-06-12 21:34:54.000000000 +0200\n+++ /home/robert/webwerkstatt/coreDiff/lk-scripts/workspace/lk/core/ometa/lib.js\t2012-02-21 22:41:27.000000000 +0100\n@@ -38,7 +38,7 @@\n // make Arrays print themselves sensibly\n \n // Object.prototype.printOn = function(ws) { ws.nextPutAll(this.toString()) }\n-//\n+// \n // Array.prototype.toString = function() { var ws = \"\".writeStream(); this.printOn(ws); return ws.contents() }\n // Array.prototype.printOn = function(ws) {\n // ws.nextPutAll(\"[\")\n@@ -73,7 +73,7 @@\n // }\n \n // Object.prototype.hasProperty = function(p) { return this[p] != undefined }\n-//\n+// \n // isImmutable = function(x) { return x === null || x === undefined || x.isImmutable() }\n // Object.prototype.isImmutable = function() { return false }\n // Boolean.prototype.isImmutable = function() { return true }\n@@ -82,20 +82,20 @@\n \n // Object.prototype.isNumber = function() { return false }\n // Number.prototype.isNumber = function() { return true }\n-//\n+// \n // Object.prototype.isString = function() { return false }\n // String.prototype.isString = function() { return true }\n-//\n+// \n // Object.prototype.isCharacter = function() { return false }\n-//\n+// \n // String.prototype.isCharacter = function() { return this.length == 1 }\n // String.prototype.isSpace = function() { return this.isCharacter() && this.charCodeAt(0) <= 32 }\n // String.prototype.isDigit = function() { return this.isCharacter() && this >= \"0\" && this <= \"9\" }\n // String.prototype.isLower = function() { return this.isCharacter() && this >= \"a\" && this <= \"z\" }\n // String.prototype.isUpper = function() { return this.isCharacter() && this >= \"A\" && this <= \"Z\" }\n-//\n+// \n // String.prototype.digitValue = function() { return this.charCodeAt(0) - \"0\".charCodeAt(0) }\n-//\n+// \n // Object.prototype.isSequenceable = false\n // Array.prototype.isSequenceable = true\n // String.prototype.isSequenceable = true\n@@ -108,14 +108,14 @@\n // r[idx] = f(this[idx])\n // return r\n // }\n-//\n+// \n // Array.prototype.reduce = function(f, z) {\n // var r = z\n // for (var idx = 0; idx < this.length; idx++)\n // r = f(r, this[idx])\n // return r\n // }\n-//\n+// \n // Array.prototype.delimWith = function(d) {\n // return this.reduce(\n // function(xs, x) {\n@@ -152,8 +152,6 @@\n return charCode > 255 ? String.fromCharCode(charCode) : escapeStringFor[charCode]\n }\n \n-window._unescape = window.unescape;\n-\n function unescape(s) {\n if (s[0] == '\\\\')\n switch (s[1]) {\n"},"24":{"onFire":{"__isSmartRef__":true,"id":25},"processJSO":{"__isSmartRef__":true,"id":29},"lkOnlySelected":{"__isSmartRef__":true,"id":33},"wwOnlySelected":{"__isSmartRef__":true,"id":37},"diffFile":{"__isSmartRef__":true,"id":41},"processChangeList":{"__isSmartRef__":true,"id":45},"processChangeDiff":{"__isSmartRef__":true,"id":49}},"25":{"varMapping":{"__isSmartRef__":true,"id":26},"source":"function onFire() {\n var baseURL = 'http://lively-kernel.org/nodejs/CoreDiffInterfaceServer/',\n diffURL = baseURL + 'getDiff',\n getter = new URL(diffURL).asWebResource(),\n changesURL = baseURL + '',\n wwChangesGetter = new URL(changesURL).asWebResource(),\n changesDiffURL = baseURL + '',\n wwChangesDiffGetter = new URL(changesDiffURL).asWebResource();\n this.get('reset').onFire();\n connect(getter, 'content', this, 'processJSO', {updater:\n function($upd, json) {\n if (this.sourceObj.status.isDone()) {\n try {\n $upd(JSON.parse(json));\n } catch(e) {\n alert('Error in update: ' + e);\n }\n }\n }});\n getter.beAsync().get();\n wwChangesGetter.beAsync.get();\n wwChangesDiffGetter.beAsync.get();\n alertOK('Getting diff between Webwerkstatt and Lively core...');\n}","funcProperties":{"__isSmartRef__":true,"id":27},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"26":{"this":{"__isSmartRef__":true,"id":1}},"27":{"timestamp":{"__isSmartRef__":true,"id":28},"user":"conradcalmez","tags":[]},"28":{"isSerializedDate":true,"string":"Sun Dec 02 2012 22:59:42 GMT+0100 (CET)"},"29":{"varMapping":{"__isSmartRef__":true,"id":30},"source":"function processJSO(jso) {\n this.lastResult = jso;\n this.get('onlyInWWList').setList(jso.onlyin.ww);\n this.get('onlyInLKList').setList(jso.onlyin.lk);\n this.get('diffingList').setList(jso.diffingFiles);\n this.get('lastDiffDate').textString = 'last diff requested on\\n' + new Date()\n}","funcProperties":{"__isSmartRef__":true,"id":31},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"30":{"this":{"__isSmartRef__":true,"id":1}},"31":{"timestamp":{"__isSmartRef__":true,"id":32},"user":"robertkrahn","tags":[]},"32":{"isSerializedDate":true,"string":"Wed Feb 22 2012 01:14:44 GMT+0100 (CET)"},"33":{"varMapping":{"__isSmartRef__":true,"id":34},"source":"function lkOnlySelected(path) {\n window.open('https://github.com/LivelyKernel/LivelyKernel/tree/master' + path);\n}","funcProperties":{"__isSmartRef__":true,"id":35},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"34":{"this":{"__isSmartRef__":true,"id":1}},"35":{"timestamp":{"__isSmartRef__":true,"id":36},"user":"conradcalmez","tags":[]},"36":{"isSerializedDate":true,"string":"Sun Dec 02 2012 22:50:18 GMT+0100 (CET)"},"37":{"varMapping":{"__isSmartRef__":true,"id":38},"source":"function wwOnlySelected(path) {\n window.open('http://lively-kernel.org/repository/webwerkstatt' + path);\n}","funcProperties":{"__isSmartRef__":true,"id":39},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"38":{"this":{"__isSmartRef__":true,"id":1}},"39":{"timestamp":{"__isSmartRef__":true,"id":40},"user":"robertkrahn","tags":[]},"40":{"isSerializedDate":true,"string":"Tue Feb 21 2012 23:39:22 GMT+0100 (CET)"},"41":{"varMapping":{"__isSmartRef__":true,"id":42},"source":"function diffFile(filePath) {\n if (!this.lastResult) {\n alert('no diff result!');\n return;\n }\n var diff = this.lastResult.fileDiffs[filePath];\n if (!diff) {\n alert('found no diff for ' + filePath);\n return;\n }\n this.get('diffText').textString = diff;\n this.get('diffText').emphasizeRegex(/\\n\\+.*/g, {backgroundColor: Color.green});\n this.get('diffText').emphasizeRegex(/\\n\\-.*/g, {backgroundColor: Color.red, color: Color.white});\n}","funcProperties":{"__isSmartRef__":true,"id":43},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"42":{"this":{"__isSmartRef__":true,"id":1}},"43":{"timestamp":{"__isSmartRef__":true,"id":44},"user":"robertkrahn","tags":[]},"44":{"isSerializedDate":true,"string":"Wed Feb 22 2012 01:35:54 GMT+0100 (CET)"},"45":{"varMapping":{"__isSmartRef__":true,"id":46},"source":"function processChangeList(changedFiles) {\n this.get(\"wwChangedFiles\").setTextString(changedFiles);\n}","funcProperties":{"__isSmartRef__":true,"id":47},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"46":{"this":{"__isSmartRef__":true,"id":1}},"47":{"timestamp":{"__isSmartRef__":true,"id":48},"user":"conradcalmez","tags":[]},"48":{"isSerializedDate":true,"string":"Sun Dec 02 2012 23:10:48 GMT+0100 (CET)"},"49":{"varMapping":{"__isSmartRef__":true,"id":50},"source":"function processChangeDiff(changeDiff) {\n this.get(\"wwChangeDiff\").setTextString(changeDiff);\n}","funcProperties":{"__isSmartRef__":true,"id":51},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"50":{"this":{"__isSmartRef__":true,"id":1}},"51":{"timestamp":{"__isSmartRef__":true,"id":52},"user":"conradcalmez","tags":[]},"52":{"isSerializedDate":true,"string":"Sun Dec 02 2012 23:10:31 GMT+0100 (CET)"},"53":{"submorphs":[],"scripts":[],"id":"5A1E1420-010F-4711-B44A-981C94B47E1F","shape":{"__isSmartRef__":true,"id":54},"droppingEnabled":true,"halosEnabled":true,"itemList":[],"showsHalos":false,"name":"onlyInWWList","partsBinMetaInfo":{"__isSmartRef__":true,"id":55},"_ClipMode":"auto","eventHandler":{"__isSmartRef__":true,"id":56},"derivationIds":[2860],"attributeConnections":[{"__isSmartRef__":true,"id":57}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"changeTriggered":true,"prevScroll":[0,96],"__serializedExpressions__":["_Position","distanceToDragEvent"],"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":58},"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core","_Position":"lively.pt(37.0,93.0)","distanceToDragEvent":"lively.pt(261.0,-13.0)"},"54":{"_BorderWidth":0,"_BorderRadius":0,"_Opacity":1,"_BorderStyle":"solid","__serializedExpressions__":["position","_Extent","_BorderColor","_Fill","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(442.0,144.0)","_BorderColor":"Color.rgb(255,255,255)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"55":{"partsSpaceName":"PartsBin/Inputs","migrationLevel":2,"partName":"List","comment":"a list morph","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"56":{"morph":{"__isSmartRef__":true,"id":53},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"57":{"sourceObj":{"__isSmartRef__":true,"id":53},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1},"targetMethodName":"wwOnlySelected","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"58":{"reset":{"__isSmartRef__":true,"id":59}},"59":{"varMapping":{"__isSmartRef__":true,"id":60},"source":"function reset() {\n connect(this, 'selection', this.get('updater'), 'wwOnlySelected');\n}","funcProperties":{"__isSmartRef__":true,"id":61},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"60":{"this":{"__isSmartRef__":true,"id":53}},"61":{"timestamp":{"__isSmartRef__":true,"id":62},"user":"robertkrahn","tags":[]},"62":{"isSerializedDate":true,"string":"Tue Feb 21 2012 23:36:35 GMT+0100 (CET)"},"63":{"submorphs":[],"scripts":[],"id":"ACBA924F-F0E5-42C7-A954-3DC5F468DD1D","shape":{"__isSmartRef__":true,"id":64},"droppingEnabled":true,"halosEnabled":true,"itemList":[],"selectedLineNo":5,"showsHalos":false,"name":"onlyInLKList","partsBinMetaInfo":{"__isSmartRef__":true,"id":65},"_ClipMode":"auto","eventHandler":{"__isSmartRef__":true,"id":66},"derivationIds":[2860,"5A1E1420-010F-4711-B44A-981C94B47E1F"],"attributeConnections":[{"__isSmartRef__":true,"id":67}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"changeTriggered":true,"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"prevScroll":[0,64],"selection":"/core/lively/LocalStorage.js","__serializedExpressions__":["_Position","distanceToDragEvent"],"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":68},"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core","_Position":"lively.pt(495.0,94.0)","distanceToDragEvent":"lively.pt(297.0,-10.0)"},"64":{"_BorderWidth":0,"__serializedExpressions__":["position","_Extent","_BorderColor","_Fill","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(442.0,144.0)","_BorderColor":"Color.rgb(0,0,0)","_Fill":"Color.rgb(243,243,243)","_Padding":"lively.rect(0,0,0,0)"},"65":{"partsSpaceName":"PartsBin/Inputs","migrationLevel":2,"partName":"List","comment":"a list morph","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"66":{"morph":{"__isSmartRef__":true,"id":63},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"67":{"sourceObj":{"__isSmartRef__":true,"id":63},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1},"targetMethodName":"lkOnlySelected","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"68":{"reset":{"__isSmartRef__":true,"id":69}},"69":{"varMapping":{"__isSmartRef__":true,"id":70},"source":"function reset() {\n connect(this, 'selection', this.get('updater'), 'lkOnlySelected');\n}","funcProperties":{"__isSmartRef__":true,"id":71},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"70":{"this":{"__isSmartRef__":true,"id":63}},"71":{"timestamp":{"__isSmartRef__":true,"id":72},"user":"robertkrahn","tags":[]},"72":{"isSerializedDate":true,"string":"Tue Feb 21 2012 23:36:50 GMT+0100 (CET)"},"73":{"submorphs":[],"scripts":[],"id":"D47E9E58-37EB-4BBE-BDE2-CEFFD136DABE","shape":{"__isSmartRef__":true,"id":74},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":false,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":null,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":10,"name":"Text1","partsBinMetaInfo":{"__isSmartRef__":true,"id":75},"textChunks":[{"__isSmartRef__":true,"id":76}],"charsReplaced":"some text ","lastFindLoc":10,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":78},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355],"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":0},"_MinTextWidth":null,"_MinTextHeight":null,"_Rotation":0,"_Scale":1,"previousSelection":[5,5],"__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(193.0,241.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(85.0,-16.0)"},"74":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(118.0,15.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"75":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"76":{"style":{"__isSmartRef__":true,"id":77},"morph":{"__isSmartRef__":true,"id":73},"chunkOwner":{"__isSmartRef__":true,"id":73},"storedString":"only in webwerkstatt","_id":"_2","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"77":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"78":{"morph":{"__isSmartRef__":true,"id":73},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"79":{"submorphs":[],"scripts":[],"id":"28A4C06C-1118-42BD-AE2A-CED6D2F9DACF","shape":{"__isSmartRef__":true,"id":80},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":false,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":null,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":10,"name":"Text2","partsBinMetaInfo":{"__isSmartRef__":true,"id":81},"textChunks":[{"__isSmartRef__":true,"id":82}],"charsReplaced":"webwerkstatt","lastFindLoc":20,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":84},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355,"D47E9E58-37EB-4BBE-BDE2-CEFFD136DABE"],"_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":null,"_MinTextHeight":null,"previousSelection":[10,10],"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(672.0,244.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(53.0,-9.0)"},"80":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(67.0,15.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"81":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"82":{"style":{"__isSmartRef__":true,"id":83},"morph":{"__isSmartRef__":true,"id":79},"chunkOwner":{"__isSmartRef__":true,"id":79},"storedString":"only in core","_id":"_3","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"83":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"84":{"morph":{"__isSmartRef__":true,"id":79},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"85":{"submorphs":[],"scripts":[],"id":"20A99EE1-12AD-4764-B372-354B16AFEC2A","shape":{"__isSmartRef__":true,"id":86},"droppingEnabled":true,"halosEnabled":true,"itemList":[],"showsHalos":false,"name":"diffingList","partsBinMetaInfo":{"__isSmartRef__":true,"id":87},"_ClipMode":"auto","eventHandler":{"__isSmartRef__":true,"id":88},"derivationIds":[2860,"5A1E1420-010F-4711-B44A-981C94B47E1F","ACBA924F-F0E5-42C7-A954-3DC5F468DD1D"],"attributeConnections":[{"__isSmartRef__":true,"id":89}],"doNotSerialize":["$$selection"],"doNotCopyProperties":["$$selection"],"changeTriggered":true,"prevScroll":[0,96],"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"__serializedExpressions__":["_Position","distanceToDragEvent"],"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":90},"__LivelyClassName__":"lively.morphic.List","__SourceModuleName__":"Global.lively.morphic.Core","_Position":"lively.pt(36.0,274.0)","distanceToDragEvent":"lively.pt(297.0,-10.0)"},"86":{"_BorderWidth":0,"__serializedExpressions__":["position","_Extent","_BorderColor","_Fill","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(442.0,144.0)","_BorderColor":"Color.rgb(0,0,0)","_Fill":"Color.rgb(243,243,243)","_Padding":"lively.rect(0,0,0,0)"},"87":{"partsSpaceName":"PartsBin/Inputs","migrationLevel":2,"partName":"List","comment":"a list morph","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"88":{"morph":{"__isSmartRef__":true,"id":85},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"89":{"sourceObj":{"__isSmartRef__":true,"id":85},"sourceAttrName":"selection","targetObj":{"__isSmartRef__":true,"id":1},"targetMethodName":"diffFile","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"90":{"reset":{"__isSmartRef__":true,"id":91}},"91":{"varMapping":{"__isSmartRef__":true,"id":92},"source":"function reset() {\n connect(this, 'selection', this.get('updater'), 'diffFile');\n}","funcProperties":{"__isSmartRef__":true,"id":93},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"92":{"this":{"__isSmartRef__":true,"id":85}},"93":{"timestamp":{"__isSmartRef__":true,"id":94},"user":"robertkrahn","tags":[]},"94":{"isSerializedDate":true,"string":"Tue Feb 21 2012 23:53:46 GMT+0100 (CET)"},"95":{"submorphs":[],"scripts":[],"id":"6013CCE0-E9C5-4A21-A013-ADF916AF8F1D","shape":{"__isSmartRef__":true,"id":96},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":432,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":10,"name":"lastDiffDate","partsBinMetaInfo":{"__isSmartRef__":true,"id":97},"textChunks":[{"__isSmartRef__":true,"id":98}],"charsReplaced":"s","lastFindLoc":6,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":100},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355],"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":0},"_MinTextWidth":432,"_MinTextHeight":null,"_Rotation":0,"_Scale":1,"previousSelection":[47,47],"_Align":"center","__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(269.0,17.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(294.0,-17.0)"},"96":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(432.0,15.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"97":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"98":{"style":{"__isSmartRef__":true,"id":99},"chunkOwner":{"__isSmartRef__":true,"id":95},"_id":"_821","storedString":"...","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"99":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"100":{"morph":{"__isSmartRef__":true,"id":95},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"101":{"submorphs":[],"scripts":[],"id":"BABA2F8B-048E-4D60-8CA9-D4729B58972C","shape":{"__isSmartRef__":true,"id":102},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":false,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Courier ","registeredForMouseEvents":true,"_MaxTextWidth":null,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":"11","name":"diffText","partsBinMetaInfo":{"__isSmartRef__":true,"id":103},"textChunks":[{"__isSmartRef__":true,"id":104}],"charsReplaced":"s","lastFindLoc":6,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":106},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355],"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":0},"_MinTextWidth":null,"_MinTextHeight":null,"_Rotation":0,"_Scale":1,"isBeingDragged":false,"__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"priorSelectionRange":[1,1],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(499.0,277.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(68.0,-11.0)"},"102":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(27.0,17.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"103":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"104":{"style":{"__isSmartRef__":true,"id":105},"chunkOwner":{"__isSmartRef__":true,"id":101},"_id":"_822","storedString":"...","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"105":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"106":{"morph":{"__isSmartRef__":true,"id":101},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"107":{"submorphs":[{"__isSmartRef__":true,"id":108}],"scripts":[],"id":"9DBDEDED-E9D3-44DB-9D33-C961B8E36283","shape":{"__isSmartRef__":true,"id":113},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"registeredForMouseEvents":true,"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":114},"lighterFill":{"__isSmartRef__":true,"id":119},"label":{"__isSmartRef__":true,"id":108},"name":"reset","showsHalos":false,"partsBinMetaInfo":{"__isSmartRef__":true,"id":124},"attributeConnections":[{"__isSmartRef__":true,"id":125}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"eventHandler":{"__isSmartRef__":true,"id":126},"derivationIds":[2588],"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"_ClipMode":"visible","isPressed":false,"__serializedExpressions__":["_Position","distanceToDragEvent"],"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":127},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(494.0,64.0)","distanceToDragEvent":"lively.pt(71.0,-10.0)"},"108":{"submorphs":[],"scripts":[],"id":"96A34A90-6284-4BC1-B249-03AD3507BA63","shape":{"__isSmartRef__":true,"id":109},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","registeredForMouseEvents":true,"_MaxTextWidth":101,"_MaxTextHeight":null,"textStyle":null,"owner":{"__isSmartRef__":true,"id":107},"isLabel":true,"eventsAreIgnored":true,"_ClipMode":"hidden","textChunks":[{"__isSmartRef__":true,"id":110}],"_Align":"center","eventHandler":{"__isSmartRef__":true,"id":112},"_HandStyle":"default","_PointerEvents":"none","derivationIds":[2589],"_MinTextWidth":101,"_MinTextHeight":null,"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_WordBreak":"break-all","__serializedExpressions__":["_Position","padding","_Padding"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(0.0,0.0)","padding":"lively.rect(5,5,0,0)","_Padding":"lively.rect(0,0,0,0)"},"109":{"_BorderWidth":0,"_Fill":null,"_ClipMode":"hidden","__serializedExpressions__":["position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(101.0,21.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,3,0,0)"},"110":{"style":{"__isSmartRef__":true,"id":111},"chunkOwner":{"__isSmartRef__":true,"id":108},"storedString":"reset","_id":"_6","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"111":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"112":{"morph":{"__isSmartRef__":true,"id":108},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"113":{"_BorderWidth":1.1840000000000002,"_Fill":{"__isSmartRef__":true,"id":114},"_BorderRadius":5.2,"_ClipMode":"visible","__serializedExpressions__":["position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(101.0,21.0)","_BorderColor":"Color.rgb(214,214,214)","_Padding":"lively.rect(0,0,0,0)"},"114":{"stops":[{"__isSmartRef__":true,"id":115},{"__isSmartRef__":true,"id":116},{"__isSmartRef__":true,"id":117},{"__isSmartRef__":true,"id":118}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"115":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(245,245,245)"},"116":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(209,209,209)"},"117":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(209,209,209)"},"118":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(240,240,240)"},"119":{"stops":[{"__isSmartRef__":true,"id":120},{"__isSmartRef__":true,"id":121},{"__isSmartRef__":true,"id":122},{"__isSmartRef__":true,"id":123}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"120":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(250,250,250)"},"121":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"122":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"123":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(248,248,248)"},"124":{"partsSpaceName":"PartsBin/Inputs","migrationLevel":2,"partName":"ScriptableButton","comment":"Has a script that is called on button press","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"125":{"sourceObj":{"__isSmartRef__":true,"id":107},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":107},"targetMethodName":"onFire","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"126":{"morph":{"__isSmartRef__":true,"id":107},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"127":{"onFire":{"__isSmartRef__":true,"id":128}},"128":{"varMapping":{"__isSmartRef__":true,"id":129},"source":"function onFire() {\n this.get('onlyInWWList').setList([]);\n this.get('onlyInLKList').setList([]);\n this.get('diffingList').setList([]);\n this.get('lastDiffDate').textString = '...';\n this.get('diffText').textString = '...';\n}","funcProperties":{"__isSmartRef__":true,"id":130},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"129":{"this":{"__isSmartRef__":true,"id":107}},"130":{"timestamp":{"__isSmartRef__":true,"id":131},"user":"robertkrahn","tags":[]},"131":{"isSerializedDate":true,"string":"Wed Feb 22 2012 01:19:25 GMT+0100 (CET)"},"132":{"submorphs":[],"scripts":[],"id":"E026F5D7-E2A6-4583-9535-84A2D65A941F","shape":{"__isSmartRef__":true,"id":133},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":false,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":null,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":10,"name":"Text3","partsBinMetaInfo":{"__isSmartRef__":true,"id":134},"textChunks":[{"__isSmartRef__":true,"id":135}],"charsReplaced":"","lastFindLoc":8,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":137},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355,"D47E9E58-37EB-4BBE-BDE2-CEFFD136DABE","28A4C06C-1118-42BD-AE2A-CED6D2F9DACF"],"_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":null,"_MinTextHeight":null,"previousSelection":[10,10],"owner":{"__isSmartRef__":true,"id":0},"_Align":"center","_Rotation":0,"_Scale":1,"__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(174.0,421.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(37.0,-16.0)"},"133":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(154.0,60.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"134":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"135":{"style":{"__isSmartRef__":true,"id":136},"morph":{"__isSmartRef__":true,"id":132},"chunkOwner":{"__isSmartRef__":true,"id":132},"storedString":"diffing\ngreen lines are added in core, red lines are removed in core","_id":"_7","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"136":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"137":{"morph":{"__isSmartRef__":true,"id":132},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"138":{"submorphs":[{"__isSmartRef__":true,"id":139}],"scripts":[],"id":"57ADDCAD-4B08-41FD-A6C2-92B0FAB10D53","shape":{"__isSmartRef__":true,"id":144},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"registeredForMouseEvents":true,"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":145},"lighterFill":{"__isSmartRef__":true,"id":150},"label":{"__isSmartRef__":true,"id":139},"name":"Button","showsHalos":false,"partsBinMetaInfo":{"__isSmartRef__":true,"id":155},"attributeConnections":[{"__isSmartRef__":true,"id":164}],"doNotSerialize":["$$fire"],"doNotCopyProperties":["$$fire"],"eventHandler":{"__isSmartRef__":true,"id":165},"derivationIds":[7251,"3F26258D-0EE1-4A94-8419-5EE2BB6065A6","B624295D-42E3-4E0A-B370-844C2B43F4F0","F5D160C8-1C2F-47D9-9BE1-2FD26C53BFB3"],"_ClipMode":"visible","owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"__serializedExpressions__":["_Position","distanceToDragEvent"],"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":166},"__LivelyClassName__":"lively.morphic.Button","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(208.0,559.0)","distanceToDragEvent":"lively.pt(73.0,-16.0)"},"139":{"submorphs":[],"scripts":[],"id":"116D6111-958D-4555-BE52-B49F4D3E0E97","shape":{"__isSmartRef__":true,"id":140},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"_WhiteSpaceHandling":"pre-wrap","fixedHeight":true,"allowInput":false,"_FontFamily":"Helvetica","registeredForMouseEvents":true,"_MaxTextWidth":101,"_MaxTextHeight":null,"textStyle":null,"owner":{"__isSmartRef__":true,"id":138},"isLabel":true,"eventsAreIgnored":true,"_ClipMode":"hidden","textChunks":[{"__isSmartRef__":true,"id":141}],"_Align":"center","eventHandler":{"__isSmartRef__":true,"id":143},"_HandStyle":"default","_PointerEvents":"none","attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"derivationIds":[7252,"4881773E-A824-4992-B814-33C8D37580C6","EE955AA4-D648-4DFC-8E2D-08881D605170","7EC413DD-D34D-449D-B448-2F3904B04FA5"],"_MinTextWidth":101,"_MinTextHeight":null,"_FontSize":10,"_WordBreak":"break-all","__serializedExpressions__":["_Position","padding","_Padding","_TextColor"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(0.0,0.0)","padding":"lively.rect(5,5,0,0)","_Padding":"lively.rect(0,0,0,0)","_TextColor":"Color.rgb(0,0,0)"},"140":{"_BorderWidth":0,"_Fill":null,"_ClipMode":"hidden","__serializedExpressions__":["position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(101.0,21.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,3,0,0)"},"141":{"style":{"__isSmartRef__":true,"id":142},"chunkOwner":{"__isSmartRef__":true,"id":139},"storedString":"add","_id":"_8","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"142":{"textShadow":"0px 1px 0 rgba(255,255,255,1)","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"143":{"morph":{"__isSmartRef__":true,"id":139},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"144":{"_BorderWidth":1.1840000000000002,"_Fill":{"__isSmartRef__":true,"id":145},"_BorderRadius":5.2,"_ClipMode":"visible","__serializedExpressions__":["position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(101.0,21.0)","_BorderColor":"Color.rgb(214,214,214)","_Padding":"lively.rect(0,0,0,0)"},"145":{"stops":[{"__isSmartRef__":true,"id":146},{"__isSmartRef__":true,"id":147},{"__isSmartRef__":true,"id":148},{"__isSmartRef__":true,"id":149}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"146":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(245,245,245)"},"147":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(209,209,209)"},"148":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(209,209,209)"},"149":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(240,240,240)"},"150":{"stops":[{"__isSmartRef__":true,"id":151},{"__isSmartRef__":true,"id":152},{"__isSmartRef__":true,"id":153},{"__isSmartRef__":true,"id":154}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"151":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(250,250,250)"},"152":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"153":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"154":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(248,248,248)"},"155":{"partsSpaceName":"PartsBin/Inputs","migrationLevel":4,"partName":"Button","comment":"Has a script that is called on button press","changes":[{"__isSmartRef__":true,"id":156},{"__isSmartRef__":true,"id":158},{"__isSmartRef__":true,"id":160},{"__isSmartRef__":true,"id":162}],"revisionOnLoad":169199,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"156":{"date":{"__isSmartRef__":true,"id":157},"author":"undefined","message":"","id":"7074B413-6CF0-4892-9D18-52009A2A2E03"},"157":{"isSerializedDate":true,"string":"Fri Apr 13 2012 21:04:01 GMT+0200 (CEST)"},"158":{"date":{"__isSmartRef__":true,"id":159},"author":"sstamm","message":"reverted button","id":"9B7AA90A-42FC-4DE8-A4DE-51AB903A740E"},"159":{"isSerializedDate":true,"string":"Mon Apr 16 2012 10:36:21 GMT+0200 (CEST)"},"160":{"date":{"__isSmartRef__":true,"id":161},"author":"robertkrahn","message":"no comment","id":"97D17254-EAC6-4494-8330-A347909590D6"},"161":{"isSerializedDate":true,"string":"Sat Apr 21 2012 14:08:58 GMT+0200 (CEST)"},"162":{"date":{"__isSmartRef__":true,"id":163},"author":"robertkrahn","message":"no comment","id":"DDE22D44-9A6D-4485-80F3-262D5DA0CC07"},"163":{"isSerializedDate":true,"string":"Tue Jun 05 2012 14:03:19 GMT+0200 (CEST)"},"164":{"sourceObj":{"__isSmartRef__":true,"id":138},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":138},"targetMethodName":"doAction","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"165":{"morph":{"__isSmartRef__":true,"id":138},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"166":{"doAction":{"__isSmartRef__":true,"id":167}},"167":{"varMapping":{"__isSmartRef__":true,"id":168},"source":"function doAction() {\n var textToAdd = this.get('changesPerFile').textString,\n fileName = this.get('diffingList').selection,\n changeMorph = this.get('allChanges');\n textToAdd = fileName + ':\\n' + textToAdd;\n changeMorph.textString = textToAdd + '\\n\\n' + changeMorph.textString;\n}","funcProperties":{"__isSmartRef__":true,"id":169},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"168":{"this":{"__isSmartRef__":true,"id":138}},"169":{"timestamp":{"__isSmartRef__":true,"id":170},"user":"robertkrahn","tags":[]},"170":{"isSerializedDate":true,"string":"Sat Jun 16 2012 18:54:41 GMT+0200 (CEST)"},"171":{"submorphs":[],"scripts":[],"id":"6FB186E8-3DA5-4176-9782-E715B7F93724","shape":{"__isSmartRef__":true,"id":172},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":true,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":414.07796099999985,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":11,"name":"changesPerFile","partsBinMetaInfo":{"__isSmartRef__":true,"id":173},"textChunks":[{"__isSmartRef__":true,"id":184}],"charsReplaced":"Some Text","lastFindLoc":9,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":186},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"scroll","derivationIds":[355,"1EB1674F-8BF2-419B-B054-86129ED70335","63698904-DC05-4341-A9B6-5CC4A219CD04","F6A714BA-4735-41ED-8A2A-45CB153FBDF8"],"_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":414.07796099999985,"_MinTextHeight":null,"isBeingDragged":false,"moved":true,"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1.002003004005006,"priorSelectionRange":[0,0],"_WordBreak":"break-all","__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(40.0,495.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(91.0,-18.0)"},"172":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(437.1,61.9)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(4,2,0,0)"},"173":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","changes":[{"__isSmartRef__":true,"id":174},{"__isSmartRef__":true,"id":176},{"__isSmartRef__":true,"id":178},{"__isSmartRef__":true,"id":180},{"__isSmartRef__":true,"id":182}],"revisionOnLoad":160159,"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"174":{"date":{"__isSmartRef__":true,"id":175},"author":"robertkrahn","message":"text click was broken?","id":"9D065E14-9653-4B2A-9A2E-3AD84EBBC3E0"},"175":{"isSerializedDate":true,"string":"Sat Apr 21 2012 16:30:30 GMT+0200 (CEST)"},"176":{"date":{"__isSmartRef__":true,"id":177},"author":"undefined","message":"Set the inset as: this.setPadding(Rectangle.inset(4,2)). This gives it a more pleasing appearance with a border, and also makes it easier to select near the bounds.","id":"BD5B0E4C-4830-4863-A013-35BB66D5AD6F"},"177":{"isSerializedDate":true,"string":"Mon Feb 27 2012 06:20:38 GMT+0100 (CET)"},"178":{"date":{"__isSmartRef__":true,"id":179},"author":"tessi","message":"TextBubble calls its disappear() function after showBubbleTime() milliseconds now","id":"0F4DE333-A551-4961-B29D-70270977EBEF"},"179":{"isSerializedDate":true,"string":"Sat Apr 21 2012 07:31:43 GMT+0200 (CEST)"},"180":{"date":{"__isSmartRef__":true,"id":181},"author":"tessi","message":"TextBubble calls its disappear() function after showBubbleTime() milliseconds now","id":"785D95BD-7858-43EB-90E6-A1C085E2F2B9"},"181":{"isSerializedDate":true,"string":"Sat Apr 21 2012 07:32:09 GMT+0200 (CEST)"},"182":{"date":{"__isSmartRef__":true,"id":183},"author":"timfelgentreff","message":"better text","id":"B904F9AC-6EA0-4A8A-83C9-AFC85AADC194"},"183":{"isSerializedDate":true,"string":"Tue May 08 2012 14:18:18 GMT+0200 (CEST)"},"184":{"style":{"__isSmartRef__":true,"id":185},"chunkOwner":{"__isSmartRef__":true,"id":171},"storedString":"foo","_id":"_9","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"185":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"186":{"morph":{"__isSmartRef__":true,"id":171},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"187":{"submorphs":[{"__isSmartRef__":true,"id":188},{"__isSmartRef__":true,"id":194},{"__isSmartRef__":true,"id":265}],"scripts":[],"shape":{"__isSmartRef__":true,"id":293},"derivationIds":[null],"id":"18DA232C-AF14-4091-A5FD-C881791BA4E0","eventHandler":{"__isSmartRef__":true,"id":294},"_ClipMode":"visible","droppingEnabled":false,"halosEnabled":true,"draggingEnabled":true,"layout":{"__isSmartRef__":true,"id":295},"LK2":true,"targetMorph":{"__isSmartRef__":true,"id":188},"reframeHandle":{"__isSmartRef__":true,"id":265},"titleBar":{"__isSmartRef__":true,"id":194},"collapsedTransform":null,"collapsedExtent":null,"expandedTransform":null,"expandedExtent":null,"ignoreEventsOnExpand":false,"owner":{"__isSmartRef__":true,"id":0},"highlighted":false,"isBeingDragged":false,"_Rotation":0,"_Scale":1,"showsHalos":false,"__serializedExpressions__":["_Position","contentOffset","prevDragPos"],"prevScroll":[0,0],"__LivelyClassName__":"lively.morphic.Window","__SourceModuleName__":"Global.lively.morphic.Widgets","withoutLayers":["Global.lively.morphic.GrabbingLayer"],"_Position":"lively.pt(32.0,588.0)","contentOffset":"lively.pt(0.0,21.0)","prevDragPos":"lively.pt(369.0,592.0)"},"188":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":189},"derivationIds":[null],"id":"4EA0CB84-982E-4659-B1BB-316CCF9B5B62","_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":190}],"eventHandler":{"__isSmartRef__":true,"id":192},"_ClipMode":"auto","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":true,"_InputAllowed":true,"allowInput":true,"_FontFamily":"Monaco,monospace","_FontSize":8,"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":187},"_MaxTextWidth":447,"_MinTextWidth":447,"_MaxTextHeight":null,"_MinTextHeight":null,"layout":{"__isSmartRef__":true,"id":193},"syntaxHighlightingWhileTyping":false,"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_syntaxHighlightTimeout":null,"parseErrors":null,"lastSyntaxHighlightTime":9,"accessibleInInactiveWindow":true,"showsHalos":false,"name":"allChanges","priorSelectionRange":[34,34],"_WordBreak":"break-all","__serializedExpressions__":["_Position"],"prevScroll":[0,0],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(0.0,21.0)"},"189":{"_BorderWidth":1,"_NodeClass":["morph","text"],"_NodeId":"morph-4ea0cb84-982e-4659-b1bb-316ccf9b5b62","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor","_Fill"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(457.0,149.0)","_Padding":"lively.rect(4,2,0,0)","_BorderColor":"Color.rgb(95,94,95)","_Fill":"Color.rgb(243,243,243)"},"190":{"style":{"__isSmartRef__":true,"id":191},"chunkOwner":{"__isSmartRef__":true,"id":188},"storedString":"","_id":"_15","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"191":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"192":{"morph":{"__isSmartRef__":true,"id":188},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"193":{"resizeWidth":true,"resizeHeight":true},"194":{"submorphs":[{"__isSmartRef__":true,"id":195},{"__isSmartRef__":true,"id":201},{"__isSmartRef__":true,"id":224},{"__isSmartRef__":true,"id":241}],"scripts":[],"shape":{"__isSmartRef__":true,"id":259},"derivationIds":[null],"id":"D89F6083-0FCB-4B92-A98E-52871935E05E","eventHandler":{"__isSmartRef__":true,"id":263},"_ClipMode":"visible","droppingEnabled":false,"halosEnabled":true,"layout":{"__isSmartRef__":true,"id":264},"windowMorph":{"__isSmartRef__":true,"id":187},"label":{"__isSmartRef__":true,"id":195},"closeButton":{"__isSmartRef__":true,"id":201},"menuButton":{"__isSmartRef__":true,"id":224},"collapseButton":{"__isSmartRef__":true,"id":241},"owner":{"__isSmartRef__":true,"id":187},"showsHalos":false,"__serializedExpressions__":["_Position"],"prevScroll":[0,0],"__LivelyClassName__":"lively.morphic.TitleBar","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(0.0,0.0)"},"195":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":196},"derivationIds":[null],"id":"1E50A43A-0F6D-4D17-8610-D79DF84709E0","_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":197}],"eventHandler":{"__isSmartRef__":true,"id":199},"_ClipMode":"hidden","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":true,"_InputAllowed":false,"allowInput":false,"_FontFamily":"Helvetica","_FontSize":10,"evalEnabled":false,"isLabel":true,"_HandStyle":"default","layout":{"__isSmartRef__":true,"id":200},"_Align":"center","eventsAreIgnored":true,"owner":{"__isSmartRef__":true,"id":194},"_MaxTextWidth":398,"_MinTextWidth":398,"_MaxTextHeight":null,"_MinTextHeight":null,"showsHalos":false,"_WordBreak":"break-all","__serializedExpressions__":["_TextColor","_Position"],"prevScroll":[0,0],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_TextColor":"Color.rgb(102,102,102)","_Position":"lively.pt(20.0,3.0)"},"196":{"_BorderWidth":0,"_Fill":null,"_NodeClass":["morph","text"],"_NodeId":"morph-1e50a43a-0f6d-4d17-8610-d79df84709e0","_BorderRadius":0,"__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(398.0,17.0)","_Padding":"lively.rect(0,0,0,0)","_BorderColor":"Color.rgb(0,0,0)"},"197":{"style":{"__isSmartRef__":true,"id":198},"chunkOwner":{"__isSmartRef__":true,"id":195},"storedString":"Changes","_id":"_10","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"198":{"textShadow":"0px 1px 0 rgba(255,255,255,1)","fontWeight":"normal","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"199":{"morph":{"__isSmartRef__":true,"id":195},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"200":{"resizeWidth":true},"201":{"submorphs":[{"__isSmartRef__":true,"id":202}],"scripts":[],"shape":{"__isSmartRef__":true,"id":207},"derivationIds":[null],"id":"8943575D-F355-47C3-AC0D-372454F06A98","eventHandler":{"__isSmartRef__":true,"id":213},"_ClipMode":"visible","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"accessibleInInactiveWindow":true,"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":208},"lighterFill":{"__isSmartRef__":true,"id":214},"label":{"__isSmartRef__":true,"id":202},"owner":{"__isSmartRef__":true,"id":194},"layout":{"__isSmartRef__":true,"id":219},"attributeConnections":[{"__isSmartRef__":true,"id":220},{"__isSmartRef__":true,"id":222}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__serializedExpressions__":["_Position"],"__LivelyClassName__":"lively.morphic.WindowControl","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(437.0,3.0)"},"202":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":203},"derivationIds":[null],"id":"0A3751B7-7BF0-4B88-B375-13527F699115","_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":204}],"eventHandler":{"__isSmartRef__":true,"id":206},"_ClipMode":"hidden","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":true,"_InputAllowed":false,"allowInput":false,"_FontFamily":"Helvetica","_FontSize":8,"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":201},"isLabel":true,"_HandStyle":"default","eventsAreIgnored":true,"_MaxTextWidth":null,"_MinTextWidth":null,"_MaxTextHeight":null,"_MinTextHeight":null,"_WordBreak":"break-all","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"203":{"_BorderWidth":0,"_Fill":null,"_NodeClass":["morph","text"],"_NodeId":"morph-0a3751b7-7bf0-4b88-b375-13527f699115","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(15.0,17.0)","_Padding":"lively.rect(4,2,0,0)","_BorderColor":"Color.rgb(0,0,0)"},"204":{"style":{"__isSmartRef__":true,"id":205},"chunkOwner":{"__isSmartRef__":true,"id":202},"storedString":"X","_id":"_11","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"205":{"textShadow":"0px 1px 0 rgba(255,255,255,1)","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"206":{"morph":{"__isSmartRef__":true,"id":202},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"207":{"_BorderWidth":0,"_Fill":{"__isSmartRef__":true,"id":208},"_StrokeOpacity":0,"_BorderRadius":5,"_NodeClass":["morph","button","windowcontrol"],"_NodeId":"morph-8943575d-f355-47c3-ac0d-372454f06a98","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(17.0,17.0)","_Padding":"lively.rect(0,0,0,0)","_BorderColor":"Color.rgb(189,190,192)"},"208":{"stops":[{"__isSmartRef__":true,"id":209},{"__isSmartRef__":true,"id":210},{"__isSmartRef__":true,"id":211},{"__isSmartRef__":true,"id":212}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"209":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(245,245,245)"},"210":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(209,209,209)"},"211":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(209,209,209)"},"212":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(240,240,240)"},"213":{"morph":{"__isSmartRef__":true,"id":201},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"214":{"stops":[{"__isSmartRef__":true,"id":215},{"__isSmartRef__":true,"id":216},{"__isSmartRef__":true,"id":217},{"__isSmartRef__":true,"id":218}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"215":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(250,250,250)"},"216":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"217":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"218":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(248,248,248)"},"219":{"moveHorizontal":true},"220":{"sourceObj":{"__isSmartRef__":true,"id":201},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":187},"targetMethodName":"getCloseHelp","converterString":null,"updaterString":null,"varMapping":{"__isSmartRef__":true,"id":221},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"221":{"source":{"__isSmartRef__":true,"id":201},"target":{"__isSmartRef__":true,"id":187}},"222":{"sourceObj":{"__isSmartRef__":true,"id":201},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":187},"targetMethodName":"initiateShutdown","converterString":null,"updaterString":null,"varMapping":{"__isSmartRef__":true,"id":223},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"223":{"source":{"__isSmartRef__":true,"id":201},"target":{"__isSmartRef__":true,"id":187}},"224":{"submorphs":[{"__isSmartRef__":true,"id":225}],"scripts":[],"shape":{"__isSmartRef__":true,"id":230},"derivationIds":[null],"id":"FBF76797-FAE9-4F09-A856-225F8F3C2D93","eventHandler":{"__isSmartRef__":true,"id":231},"_ClipMode":"visible","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"accessibleInInactiveWindow":true,"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":208},"lighterFill":{"__isSmartRef__":true,"id":232},"label":{"__isSmartRef__":true,"id":225},"owner":{"__isSmartRef__":true,"id":194},"attributeConnections":[{"__isSmartRef__":true,"id":237},{"__isSmartRef__":true,"id":239}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__serializedExpressions__":["_Position"],"__LivelyClassName__":"lively.morphic.WindowControl","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(3.0,3.0)"},"225":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":226},"derivationIds":[null],"id":"A9339E4E-49AB-42E7-9243-00E8F643EE8F","_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":227}],"eventHandler":{"__isSmartRef__":true,"id":229},"_ClipMode":"hidden","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":true,"_InputAllowed":false,"allowInput":false,"_FontFamily":"Helvetica","_FontSize":8,"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":224},"isLabel":true,"_HandStyle":"default","eventsAreIgnored":true,"_MaxTextWidth":null,"_MinTextWidth":null,"_MaxTextHeight":null,"_MinTextHeight":null,"_WordBreak":"break-all","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"226":{"_BorderWidth":0,"_Fill":null,"_NodeClass":["morph","text"],"_NodeId":"morph-a9339e4e-49ab-42e7-9243-00e8f643ee8f","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(17.0,17.0)","_Padding":"lively.rect(4,2,0,0)","_BorderColor":"Color.rgb(0,0,0)"},"227":{"style":{"__isSmartRef__":true,"id":228},"chunkOwner":{"__isSmartRef__":true,"id":225},"storedString":"M","_id":"_12","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"228":{"textShadow":"0px 1px 0 rgba(255,255,255,1)","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"229":{"morph":{"__isSmartRef__":true,"id":225},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"230":{"_BorderWidth":0,"_Fill":{"__isSmartRef__":true,"id":208},"_StrokeOpacity":0,"_BorderRadius":5,"_NodeClass":["morph","button","windowcontrol"],"_NodeId":"morph-fbf76797-fae9-4f09-a856-225f8f3c2d93","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(17.0,17.0)","_Padding":"lively.rect(0,0,0,0)","_BorderColor":"Color.rgb(189,190,192)"},"231":{"morph":{"__isSmartRef__":true,"id":224},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"232":{"stops":[{"__isSmartRef__":true,"id":233},{"__isSmartRef__":true,"id":234},{"__isSmartRef__":true,"id":235},{"__isSmartRef__":true,"id":236}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"233":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(250,250,250)"},"234":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"235":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"236":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(248,248,248)"},"237":{"sourceObj":{"__isSmartRef__":true,"id":224},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":187},"targetMethodName":"getMenuHelp","converterString":null,"updaterString":null,"varMapping":{"__isSmartRef__":true,"id":238},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"238":{"source":{"__isSmartRef__":true,"id":224},"target":{"__isSmartRef__":true,"id":187}},"239":{"sourceObj":{"__isSmartRef__":true,"id":224},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":187},"targetMethodName":"showTargetMorphMenu","converterString":null,"updaterString":null,"varMapping":{"__isSmartRef__":true,"id":240},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"240":{"source":{"__isSmartRef__":true,"id":224},"target":{"__isSmartRef__":true,"id":187}},"241":{"submorphs":[{"__isSmartRef__":true,"id":242}],"scripts":[],"shape":{"__isSmartRef__":true,"id":247},"derivationIds":[null],"id":"2BBE966B-CF4B-4188-B07E-BA2BF8976743","eventHandler":{"__isSmartRef__":true,"id":248},"_ClipMode":"visible","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"accessibleInInactiveWindow":true,"value":false,"toggle":false,"isActive":true,"normalFill":{"__isSmartRef__":true,"id":208},"lighterFill":{"__isSmartRef__":true,"id":249},"label":{"__isSmartRef__":true,"id":242},"owner":{"__isSmartRef__":true,"id":194},"layout":{"__isSmartRef__":true,"id":254},"attributeConnections":[{"__isSmartRef__":true,"id":255},{"__isSmartRef__":true,"id":257}],"doNotSerialize":["$$getHelpText","$$fire"],"doNotCopyProperties":["$$getHelpText","$$fire"],"__serializedExpressions__":["_Position"],"__LivelyClassName__":"lively.morphic.WindowControl","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(418.0,3.0)"},"242":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":243},"derivationIds":[null],"id":"103F05FB-B831-413C-A35B-49D01B025855","_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":244}],"eventHandler":{"__isSmartRef__":true,"id":246},"_ClipMode":"hidden","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":true,"_InputAllowed":false,"allowInput":false,"_FontFamily":"Helvetica","_FontSize":8,"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":241},"isLabel":true,"_HandStyle":"default","eventsAreIgnored":true,"_MaxTextWidth":null,"_MinTextWidth":null,"_MaxTextHeight":null,"_MinTextHeight":null,"_WordBreak":"break-all","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore"},"243":{"_BorderWidth":0,"_Fill":null,"_NodeClass":["morph","text"],"_NodeId":"morph-103f05fb-b831-413c-a35b-49d01b025855","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(14.0,17.0)","_Padding":"lively.rect(4,2,0,0)","_BorderColor":"Color.rgb(0,0,0)"},"244":{"style":{"__isSmartRef__":true,"id":245},"chunkOwner":{"__isSmartRef__":true,"id":242},"storedString":"–","_id":"_13","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"245":{"textShadow":"0px 1px 0 rgba(255,255,255,1)","__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"246":{"morph":{"__isSmartRef__":true,"id":242},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"247":{"_BorderWidth":0,"_Fill":{"__isSmartRef__":true,"id":208},"_StrokeOpacity":0,"_BorderRadius":5,"_NodeClass":["morph","button","windowcontrol"],"_NodeId":"morph-2bbe966b-cf4b-4188-b07e-ba2bf8976743","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(17.0,17.0)","_Padding":"lively.rect(0,0,0,0)","_BorderColor":"Color.rgb(189,190,192)"},"248":{"morph":{"__isSmartRef__":true,"id":241},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"249":{"stops":[{"__isSmartRef__":true,"id":250},{"__isSmartRef__":true,"id":251},{"__isSmartRef__":true,"id":252},{"__isSmartRef__":true,"id":253}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"250":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(250,250,250)"},"251":{"offset":0.4,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"252":{"offset":0.6,"__serializedExpressions__":["color"],"color":"Color.rgb(232,232,232)"},"253":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(248,248,248)"},"254":{"moveHorizontal":true},"255":{"sourceObj":{"__isSmartRef__":true,"id":241},"sourceAttrName":"getHelpText","targetObj":{"__isSmartRef__":true,"id":187},"targetMethodName":"getCollapseHelp","converterString":null,"updaterString":null,"varMapping":{"__isSmartRef__":true,"id":256},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"256":{"source":{"__isSmartRef__":true,"id":241},"target":{"__isSmartRef__":true,"id":187}},"257":{"sourceObj":{"__isSmartRef__":true,"id":241},"sourceAttrName":"fire","targetObj":{"__isSmartRef__":true,"id":187},"targetMethodName":"toggleCollapse","converterString":null,"updaterString":null,"varMapping":{"__isSmartRef__":true,"id":258},"__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"258":{"source":{"__isSmartRef__":true,"id":241},"target":{"__isSmartRef__":true,"id":187}},"259":{"_BorderWidth":1,"_Fill":{"__isSmartRef__":true,"id":260},"_StrokeOpacity":1,"_BorderRadius":"8px 8px 0px 0px","_NodeClass":["morph","box","titlebar"],"_NodeId":"morph-d89f6083-0fcb-4b92-a98e-52871935e05e","__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(457.0,22.0)","_Padding":"lively.rect(0,0,0,0)","_BorderColor":"Color.rgb(102,102,102)"},"260":{"stops":[{"__isSmartRef__":true,"id":261},{"__isSmartRef__":true,"id":262}],"__serializedExpressions__":["vector"],"__LivelyClassName__":"lively.morphic.LinearGradient","__SourceModuleName__":"Global.lively.morphic.Shapes","vector":"lively.rect(0,0,0,1)"},"261":{"offset":0,"__serializedExpressions__":["color"],"color":"Color.rgb(255,255,255)"},"262":{"offset":1,"__serializedExpressions__":["color"],"color":"Color.rgb(163,163,163)"},"263":{"morph":{"__isSmartRef__":true,"id":194},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"264":{"resizeWidth":true,"adjustForNewBounds":true},"265":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":266},"derivationIds":[null],"id":"7B7BDBCC-3492-4BEA-AEE3-B4D65513C598","eventHandler":{"__isSmartRef__":true,"id":270},"_ClipMode":"visible","droppingEnabled":true,"halosEnabled":true,"owner":{"__isSmartRef__":true,"id":187},"dragStartPoint":null,"originalTargetExtent":null,"_Rotation":0,"_Scale":1,"__serializedExpressions__":["_Position"],"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":271},"__LivelyClassName__":"lively.morphic.Path","__SourceModuleName__":"Global.lively.morphic.AdditionalMorphs","_Position":"lively.pt(443.0,156.0)"},"266":{"dontChangeShape":false,"cachedVertices":null,"_PathElements":[{"__isSmartRef__":true,"id":267},{"__isSmartRef__":true,"id":268},{"__isSmartRef__":true,"id":269}],"_BorderWidth":0,"_BorderColor":null,"_NodeClass":["morph","path"],"_NodeId":"morph-7b7bdbcc-3492-4bea-aee3-b4d65513c598","__serializedExpressions__":["_Position","_Extent","_Padding","_Fill"],"__LivelyClassName__":"lively.morphic.Shapes.Path","__SourceModuleName__":"Global.lively.morphic.PathShapes","_Position":"lively.pt(-1.0,-1.0)","_Extent":"lively.pt(15.0,15.0)","_Padding":"lively.rect(0,0,0,0)","_Fill":"Color.rgb(204,204,204)"},"267":{"isAbsolute":true,"x":14,"y":0,"__LivelyClassName__":"lively.morphic.Shapes.MoveTo","__SourceModuleName__":"Global.lively.morphic.PathShapes"},"268":{"isAbsolute":true,"x":14,"y":14,"__LivelyClassName__":"lively.morphic.Shapes.LineTo","__SourceModuleName__":"Global.lively.morphic.PathShapes"},"269":{"isAbsolute":true,"x":0,"y":14,"__LivelyClassName__":"lively.morphic.Shapes.LineTo","__SourceModuleName__":"Global.lively.morphic.PathShapes"},"270":{"morph":{"__isSmartRef__":true,"id":265},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"271":{"onDragStart":{"__isSmartRef__":true,"id":272},"onDrag":{"__isSmartRef__":true,"id":279},"onDragEnd":{"__isSmartRef__":true,"id":286}},"272":{"varMapping":{"__isSmartRef__":true,"id":273},"source":"function onDragStart(evt) {\n this.dragStartPoint = evt.mousePoint;\n this.originalTargetExtent = this.owner.getExtent();\n }","funcProperties":{"__isSmartRef__":true,"id":278},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"273":{"this":{"__isSmartRef__":true,"id":265},"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":274}},"274":{"$super":{"__isSmartRef__":true,"id":275}},"275":{"varMapping":{"__isSmartRef__":true,"id":276},"source":"function () {\n try {\n return obj.constructor.prototype[name].apply(obj, arguments)\n } catch (e) {\n if ($world) \n $world.logError(e, 'Error in $super call')\n else\n alert('Error in $super call: ' + e + '\\n' + e.stack);\n return null;\n }\n }","funcProperties":{"__isSmartRef__":true,"id":277},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"276":{"obj":{"__isSmartRef__":true,"id":265},"name":"onDragStart"},"277":{},"278":{},"279":{"varMapping":{"__isSmartRef__":true,"id":280},"source":"function onDrag(evt) {\n var moveDelta = evt.mousePoint.subPt(this.dragStartPoint)\n if (evt.isShiftDown()) {\n var maxDelta = Math.max(moveDelta.x, moveDelta.y);\n\t moveDelta = pt(maxDelta, maxDelta);\n };\n this.owner.setExtent(this.originalTargetExtent.addPt(moveDelta));\n this.align(this.bounds().bottomRight(), this.owner.getExtent());\n }","funcProperties":{"__isSmartRef__":true,"id":285},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"280":{"this":{"__isSmartRef__":true,"id":265},"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":281}},"281":{"$super":{"__isSmartRef__":true,"id":282}},"282":{"varMapping":{"__isSmartRef__":true,"id":283},"source":"function () {\n try {\n return obj.constructor.prototype[name].apply(obj, arguments)\n } catch (e) {\n if ($world) \n $world.logError(e, 'Error in $super call')\n else\n alert('Error in $super call: ' + e + '\\n' + e.stack);\n return null;\n }\n }","funcProperties":{"__isSmartRef__":true,"id":284},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"283":{"obj":{"__isSmartRef__":true,"id":265},"name":"onDrag"},"284":{},"285":{},"286":{"varMapping":{"__isSmartRef__":true,"id":287},"source":"function onDragEnd(evt) {\n this.dragStartPoint = null;\n this.originalTargetExtent = null;\n }","funcProperties":{"__isSmartRef__":true,"id":292},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"287":{"this":{"__isSmartRef__":true,"id":265},"__serializedLivelyClosures__":{"__isSmartRef__":true,"id":288}},"288":{"$super":{"__isSmartRef__":true,"id":289}},"289":{"varMapping":{"__isSmartRef__":true,"id":290},"source":"function () {\n try {\n return obj.constructor.prototype[name].apply(obj, arguments)\n } catch (e) {\n if ($world) \n $world.logError(e, 'Error in $super call')\n else\n alert('Error in $super call: ' + e + '\\n' + e.stack);\n return null;\n }\n }","funcProperties":{"__isSmartRef__":true,"id":291},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"290":{"obj":{"__isSmartRef__":true,"id":265},"name":"onDragEnd"},"291":{},"292":{},"293":{"_BorderWidth":0,"_Fill":null,"_StrokeOpacity":0,"_BorderRadius":0,"_NodeClass":["morph","window"],"_NodeId":"morph-18da232c-af14-4091-a5fd-c881791ba4e0","__serializedExpressions__":["_Padding","_Extent"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Padding":"lively.rect(0,0,0,0)","_Extent":"lively.pt(457.0,170.0)"},"294":{"morph":{"__isSmartRef__":true,"id":187},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"295":{"adjustForNewBounds":true},"296":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":297},"_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":298}],"eventHandler":{"__isSmartRef__":true,"id":300},"_ClipMode":"visible","derivationIds":[],"id":"5351CF1B-C887-4DDA-935A-693A70AB382C","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"_WordBreak":"break-all","fixedHeight":true,"_InputAllowed":true,"_HandStyle":null,"allowInput":true,"_FontFamily":"Helvetica","_FontSize":10,"__serializedExpressions__":["_TextColor","_Position","distanceToDragEvent"],"evalEnabled":false,"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"showsHalos":false,"name":"wwChangedFiles","__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_TextColor":"Color.rgb(64,64,64)","_Position":"lively.pt(33.0,871.0)","distanceToDragEvent":"lively.pt(142.0,-10.0)"},"297":{"__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor","_Fill"],"_BorderWidth":1,"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(472.0,340.0)","_Padding":"lively.rect(4,2,0,0)","_BorderColor":"Color.rgb(0,0,0)","_Fill":"Color.rgb(243,243,243)"},"298":{"style":{"__isSmartRef__":true,"id":299},"chunkOwner":{"__isSmartRef__":true,"id":296},"_id":"_3282","storedString":"","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"299":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"300":{"morph":{"__isSmartRef__":true,"id":296},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"301":{"submorphs":[],"scripts":[],"shape":{"__isSmartRef__":true,"id":302},"_WhiteSpaceHandling":"pre-wrap","textChunks":[{"__isSmartRef__":true,"id":303}],"eventHandler":{"__isSmartRef__":true,"id":305},"_ClipMode":"visible","derivationIds":["5351CF1B-C887-4DDA-935A-693A70AB382C"],"id":"5C6DDD48-6EF5-4FFD-8DCF-8B02650A7A3D","grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"_WordBreak":"break-all","fixedHeight":true,"_InputAllowed":true,"_HandStyle":null,"allowInput":true,"_FontFamily":"Helvetica","_FontSize":10,"evalEnabled":false,"showsHalos":false,"name":"wwChangeDiff","__serializedExpressions__":["_TextColor","_Position","distanceToDragEvent"],"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"prevScroll":[0,0],"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_TextColor":"Color.rgb(64,64,64)","_Position":"lively.pt(518.0,871.0)","distanceToDragEvent":"lively.pt(138.0,-15.0)"},"302":{"_BorderWidth":1,"__serializedExpressions__":["_Position","_Extent","_Padding","_BorderColor","_Fill"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(742.0,409.0)","_Padding":"lively.rect(4,2,0,0)","_BorderColor":"Color.rgb(0,0,0)","_Fill":"Color.rgb(243,243,243)"},"303":{"style":{"__isSmartRef__":true,"id":304},"chunkOwner":{"__isSmartRef__":true,"id":301},"_id":"_29307","storedString":"","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"304":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"305":{"morph":{"__isSmartRef__":true,"id":301},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"306":{"submorphs":[],"scripts":[],"id":"4664D6FA-2D34-4ECA-AD7D-B025368FA491","shape":{"__isSmartRef__":true,"id":307},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":false,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":null,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":10,"name":"Text5","partsBinMetaInfo":{"__isSmartRef__":true,"id":308},"textChunks":[{"__isSmartRef__":true,"id":309}],"charsReplaced":"diffing\ngreen lines are added in core, red lines are removed in core","lastFindLoc":68,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":311},"_ClipMode":"visible","derivationIds":[355,"D47E9E58-37EB-4BBE-BDE2-CEFFD136DABE","28A4C06C-1118-42BD-AE2A-CED6D2F9DACF","E026F5D7-E2A6-4583-9535-84A2D65A941F","A1CEF290-4883-4E1A-968F-845676F034E8"],"_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":null,"_MinTextHeight":null,"previousSelection":[15,15],"_Align":"center","__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"owner":{"__isSmartRef__":true,"id":0},"_Rotation":0,"_Scale":1,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(802.0,840.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(180.0,-16.0)"},"307":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(263.0,19.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"308":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"309":{"style":{"__isSmartRef__":true,"id":310},"morph":{"__isSmartRef__":true,"id":306},"chunkOwner":{"__isSmartRef__":true,"id":306},"storedString":"changes since last synchronization in code","_id":"_7","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"310":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"311":{"morph":{"__isSmartRef__":true,"id":306},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"312":{"submorphs":[],"scripts":[],"id":"A1CEF290-4883-4E1A-968F-845676F034E8","shape":{"__isSmartRef__":true,"id":313},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":false,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"_MaxTextWidth":null,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":10,"name":"Text4","partsBinMetaInfo":{"__isSmartRef__":true,"id":314},"textChunks":[{"__isSmartRef__":true,"id":315}],"charsReplaced":"diffing\ngreen lines are added in core, red lines are removed in core","lastFindLoc":68,"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":317},"_ClipMode":"visible","derivationIds":[355,"D47E9E58-37EB-4BBE-BDE2-CEFFD136DABE","28A4C06C-1118-42BD-AE2A-CED6D2F9DACF","E026F5D7-E2A6-4583-9535-84A2D65A941F"],"_WhiteSpaceHandling":"pre-wrap","_MinTextWidth":null,"_MinTextHeight":null,"_Align":"center","__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"owner":{"__isSmartRef__":true,"id":0},"isBeingDragged":false,"_Rotation":0,"_Scale":1,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(104.0,837.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(242.0,-13.0)"},"313":{"fill":null,"_BorderWidth":0,"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(350.0,22.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"314":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"315":{"style":{"__isSmartRef__":true,"id":316},"morph":{"__isSmartRef__":true,"id":312},"chunkOwner":{"__isSmartRef__":true,"id":312},"storedString":"files changed in Webwerkstatt since last synchronization","_id":"_7","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"316":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"317":{"morph":{"__isSmartRef__":true,"id":312},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"318":{"submorphs":[],"scripts":[],"id":226,"shape":{"__isSmartRef__":true,"id":319},"grabbingEnabled":false,"droppingEnabled":false,"showsMorphMenu":false,"halosEnabled":false,"registeredForMouseEvents":true,"_world":{"__isSmartRef__":true,"id":0},"owner":{"__isSmartRef__":true,"id":0},"carriesGrabbedMorphs":false,"_Scale":1,"_Rotation":0,"eventHandler":{"__isSmartRef__":true,"id":320},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"clickedOnMorph":{"__isSmartRef__":true,"id":0},"lastScrollTime":1354487213019,"prevScroll":[0,0],"_ClipMode":"visible","__serializedExpressions__":["_Position"],"__LivelyClassName__":"lively.morphic.HandMorph","__SourceModuleName__":"Global.lively.morphic.Events","withLayers":["Global.NoMagnetsLayer"],"_Position":"lively.pt(1057.0,265.0)"},"319":{"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_Fill","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(2.0,2.0)","_Fill":"Color.rgb(204,0,0)","_Padding":"lively.rect(0,0,0,0)"},"320":{"morph":{"__isSmartRef__":true,"id":318},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"321":{"_ClipMode":"visible","__serializedExpressions__":["_Position","_Extent","_Fill","_Padding"],"__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(2800.0,2900.0)","_Fill":"Color.rgb(255,255,255)","_Padding":"lively.rect(0,0,0,0)"},"322":{"name":"Local code","__LivelyClassName__":"ChangeSet","__SourceModuleName__":"Global.lively.ChangeSet"},"323":{"sourceObj":{"__isSmartRef__":true,"id":0},"sourceAttrName":"savedWorldAsURL","targetObj":{"__isSmartRef__":true,"id":0},"targetMethodName":"visitNewPageAfterSaveAs","varMapping":{"__isSmartRef__":true,"id":324},"updaterString":"function ($upd, v) {\n if (v && v.toString() !== URL.source.toString()) { $upd(v); }\n }","__LivelyClassName__":"AttributeConnection","__SourceModuleName__":"Global.lively.bindings.Core"},"324":{"source":{"__isSmartRef__":true,"id":0},"target":{"__isSmartRef__":true,"id":0}},"325":{"morph":{"__isSmartRef__":true,"id":0},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"326":{"submorphs":[{"__isSmartRef__":true,"id":327}],"scripts":[],"id":"ADE5D178-45D1-4367-BC3F-E88A6762762A","shape":{"__isSmartRef__":true,"id":338},"droppingEnabled":true,"halosEnabled":true,"registeredForMouseEvents":true,"__serializedExpressions__":["_Position","distanceToDragEvent"],"showsHalos":false,"name":"LoadingMorph","partsBinMetaInfo":{"__isSmartRef__":true,"id":339},"eventHandler":{"__isSmartRef__":true,"id":437},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"derivationIds":[127,"59692BC3-6C7B-4E23-B820-8699260EA722","486BB935-1313-4103-B2A8-642B19437478","18AFFD44-46CD-489E-B1D6-DED43E2B6B06","2608C892-2204-4981-9A87-8E749F8944AB","5535861F-4EA2-44AB-8A40-0538124E0AAC","16C292B3-86E8-4622-B516-27C48263B8CC","87731A20-D455-44D0-97E5-98A7CFD4E417","A17081E7-E597-47ED-BD32-6E4D206BD7D7","CFB4A44C-BFEA-4584-BCBA-AE2A56739200","76B3DD9B-8D01-42BA-A574-AB99D5F899BB","1EBC5512-8F54-4B24-998C-69A285EC8533","DD1165C7-6C1A-4361-A4AE-FCF6F31152FD","4D6D36E8-48F3-408A-B03C-202E4DC182BD","5F3B3E0F-BBC6-4DDA-BAA0-7EFC05FF2011","E0A6B33B-767A-4532-9021-892414520200","F5F5E2B1-5FF0-4E09-B323-AE88A3920B8D","0C7E832A-A741-430F-B295-8BC181D066FE","472AED3B-CB76-49BD-BF49-354A2D568F86","A7C52F65-D140-4791-880F-F7584C7BB570","3516412B-8B36-4E52-9416-6B7FB358BDC2","1840CACC-078C-4795-AD3F-E9D6F8D557A0","1FEDCA25-0131-46FA-840F-DC5F1B05C6CA","C620CED3-0AE9-4097-9AA7-2706A042F9C9","679A861B-40E0-4DB2-B22F-95B454C6978D","FEF39B3C-E634-4825-BAB8-2D44FE647B03"],"isBeingDragged":false,"layout":{"__isSmartRef__":true,"id":438},"prevScroll":[0,0],"moved":true,"_Rotation":0,"_Scale":1,"headRevision":146469,"_ClipMode":"visible","__serializedLivelyClosures__":{"__isSmartRef__":true,"id":439},"__LivelyClassName__":"lively.morphic.Box","__SourceModuleName__":"Global.lively.morphic.Core","_Position":"lively.pt(0.0,0.0)","distanceToDragEvent":"lively.pt(171.0,-13.0)"},"327":{"submorphs":[{"__isSmartRef__":true,"id":328}],"scripts":[],"shape":{"__isSmartRef__":true,"id":334},"id":"7AB1D9DD-C56B-4728-8EDB-B4F3B2641236","eventHandler":{"__isSmartRef__":true,"id":335},"droppingEnabled":true,"halosEnabled":true,"__serializedExpressions__":["_Position","distanceToDragEvent"],"name":"ProgressIndicator","showsHalos":false,"partsBinMetaInfo":{"__isSmartRef__":true,"id":336},"derivationIds":[520,"071F18BE-FF28-40F5-ACAD-1916E0D25C38","DF185A10-743D-45FC-B9C2-76E12D908BCF","BF125D2C-596A-4C1E-A5F8-DAE4801E9497","3CEE8CFF-B8F1-4B4B-A405-CB583080252A","D0652878-8F9C-4591-8A82-296898AACDB6","31441DDF-2220-43BE-A99F-69E1FEC68030","14A90039-0D3E-46DC-8445-D42B8E02EB42","681EF5DE-A344-4114-B2F3-B96CE3872524","C0381116-5116-4F33-B082-A411D0E4534E","24E9581E-B008-46EE-9CBC-D5190E100D98","C69D1041-2C5E-48FE-B04C-04E66450658A","4830945B-4FFF-4564-9424-34D7995DAE60","8602C233-B3E7-4682-9B0E-D7549761D934","B4E0E11F-2BED-462E-B708-89D63971856E","EE0144C2-D016-4390-8A67-4E7DEF171C83","F44DF6E4-5F27-440E-AB5F-3721C0A10CA6","73FC6648-DAAF-4673-8CF4-7DA219513F22","B78EB1B5-780C-45F7-B0A7-B988B52B1FF1","DFDB8CD1-72F7-40F4-849B-1F9B866277AB","66111105-B1FC-41F7-BF70-D45118C9E09F","02420416-1E35-4831-AABB-91CD0460CA1A","7C6B2EB2-4510-4A8E-BAFF-5CF0040DD7F5","0503F5A1-1732-4610-9A5A-920D658CA766","07C5AE03-36AD-4849-BACD-27D7D9A2CCF2","9FFF9D73-931C-404C-AA4B-5AC2E7C53504"],"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"owner":{"__isSmartRef__":true,"id":326},"isBeingDragged":false,"layout":{"__isSmartRef__":true,"id":337},"prevScroll":[0,0],"_Rotation":0,"_Scale":1,"_ClipMode":"visible","__LivelyClassName__":"lively.morphic.Image","__SourceModuleName__":"Global.lively.morphic.Widgets","_Position":"lively.pt(113.5,81.0)","distanceToDragEvent":"lively.pt(39.0,-11.0)"},"328":{"submorphs":[],"scripts":[],"id":"24BE24AB-19EE-49CE-8574-A93280471F0A","shape":{"__isSmartRef__":true,"id":329},"grabbingEnabled":false,"droppingEnabled":false,"halosEnabled":true,"fixedWidth":true,"fixedHeight":false,"allowsInput":true,"_FontFamily":"Arial, sans-serif","registeredForMouseEvents":true,"__serializedExpressions__":["_Position","textColor","_Padding","distanceToDragEvent"],"_MaxTextWidth":257,"_MaxTextHeight":null,"showsHalos":false,"_FontSize":14,"name":"loadedMorphName","partsBinMetaInfo":{"__isSmartRef__":true,"id":330},"textChunks":[{"__isSmartRef__":true,"id":331}],"charsReplaced":"MorphName","lastFindLoc":18,"priorSelectionRange":[9,0],"prevScroll":[0,0],"eventHandler":{"__isSmartRef__":true,"id":333},"attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"_ClipMode":"visible","derivationIds":[355,"023045B3-2D6B-4425-89FB-F4806D527BE0","DC0C2365-868C-41AE-8369-51C31E91493E","C6D9D314-86A1-4015-970B-F6787F535E1A","6AA4552E-2E85-447E-9033-99D5AA1A94BC","D94BE49C-8A3E-4F1F-BF28-FEDD9B40D213","AA8F0470-654C-4AA2-8135-4607F5429AC5","E0BAABCC-FFB2-4EDF-BAE5-C63CC99B6A97","1A86AE17-73AE-442E-AB36-DD90C6DFC8BC","EF750075-E964-4CD3-B6A4-161511E1D058","CED69CBF-FFA5-45E7-B333-FBACE4F278AC","E56978C1-7424-4C10-8168-11FD3237B540","D5AB2532-A4DC-42D6-AF17-99CBBCEAA848","245866CB-598A-4172-A3A0-A06D4D26C6AD","43B0F12E-5793-43AA-80E1-496774E0EBA6","1B776A8C-0413-475F-8EBD-120BBD91D2BB","F84F2C9A-8003-4E81-833A-83F48C92F3B8","3124B389-9FA4-4348-BC5D-0DFF9C59CD1B","1A1BCBAC-D7CC-4BAE-B8C2-7C693F7327A1","1CB201BA-5E0B-4771-821A-139FA2AEFBC2","195520FA-4816-47A4-B0F5-BA890AFD9DF9","0D15F28A-24C9-46B7-89C5-6D2354728AC1","316FE9D3-62EC-4FD6-9B0F-FFA622B79575","739F3743-9BE1-48C8-813D-C0BFB0DCACA6","01877B3B-7DA7-4222-B011-7B5F4E501862","B8FE7DEE-9568-4BE6-BA12-EA674BA79E08"],"_WhiteSpaceHandling":"pre-wrap","owner":{"__isSmartRef__":true,"id":327},"_MinTextWidth":257,"_MinTextHeight":null,"previousSelection":[6,6],"_Align":"center","isBeingDragged":false,"_Rotation":0,"_Scale":1,"__LivelyClassName__":"lively.morphic.Text","__SourceModuleName__":"Global.lively.morphic.TextCore","_Position":"lively.pt(-109.0,38.0)","textColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(5,5,0,0)","distanceToDragEvent":"lively.pt(179.0,-11.0)"},"329":{"fill":null,"__serializedExpressions__":["_Position","_Extent","_BorderColor","_Padding"],"_BorderWidth":0,"_ClipMode":"visible","_BorderRadius":0,"_Opacity":1,"_BorderStyle":"solid","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(257.0,23.0)","_BorderColor":"Color.rgb(0,0,0)","_Padding":"lively.rect(0,0,0,0)"},"330":{"partsSpaceName":"PartsBin/Basic","migrationLevel":4,"comment":"a simple text morph","partName":"Text","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"331":{"style":{"__isSmartRef__":true,"id":332},"chunkOwner":{"__isSmartRef__":true,"id":328},"storedString":"loading part","_id":"_1","__LivelyClassName__":"lively.morphic.TextChunk","__SourceModuleName__":"Global.lively.morphic.TextCore"},"332":{"__LivelyClassName__":"lively.morphic.TextEmphasis","__SourceModuleName__":"Global.lively.morphic.TextCore"},"333":{"morph":{"__isSmartRef__":true,"id":328},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"334":{"__serializedExpressions__":["_Position","_Extent","_Padding"],"_ImageURL":"data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==","attributeConnections":[],"doNotSerialize":[],"doNotCopyProperties":[],"isLoaded":true,"_ClipMode":"visible","_BorderWidth":0,"_BorderRadius":0,"_Opacity":1,"_BorderStyle":"solid","__LivelyClassName__":"lively.morphic.Shapes.Image","__SourceModuleName__":"Global.lively.morphic.Shapes","_Position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(31.0,31.0)","_Padding":"lively.rect(0,0,0,0)"},"335":{"morph":{"__isSmartRef__":true,"id":327},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"336":{"partName":"ProgressIndicator","requiredModules":[],"migrationLevel":2,"partsSpaceName":"PartsBin/Widgets/","__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"337":{"centeredHorizontal":true,"centeredVertical":true},"338":{"__serializedExpressions__":["position","_Extent","_BorderColor","_Fill","_Padding"],"_BorderWidth":1,"_ClipMode":"visible","_BorderRadius":8.515,"_Opacity":0.8146,"_BorderStyle":"solid","__LivelyClassName__":"lively.morphic.Shapes.Rectangle","__SourceModuleName__":"Global.lively.morphic.Shapes","position":"lively.pt(0.0,0.0)","_Extent":"lively.pt(266.0,223.0)","_BorderColor":"Color.rgb(0,0,0)","_Fill":"Color.rgb(214,214,214)","_Padding":"lively.rect(0,0,0,0)"},"339":{"partsSpaceName":"PartsBin/iPadWidgets","comment":"This is a placeholder to indicate that a morph is being loaded. It will be replaced by the morph as soon as the requested morph finished loading.","migrationLevel":4,"partName":"LoadingMorph","changes":[{"__isSmartRef__":true,"id":340},{"__isSmartRef__":true,"id":342},{"__isSmartRef__":true,"id":344},{"__isSmartRef__":true,"id":346},{"__isSmartRef__":true,"id":348},{"__isSmartRef__":true,"id":350},{"__isSmartRef__":true,"id":352},{"__isSmartRef__":true,"id":354},{"__isSmartRef__":true,"id":356},{"__isSmartRef__":true,"id":358},{"__isSmartRef__":true,"id":360},{"__isSmartRef__":true,"id":362},{"__isSmartRef__":true,"id":364},{"__isSmartRef__":true,"id":366},{"__isSmartRef__":true,"id":368},{"__isSmartRef__":true,"id":370},{"__isSmartRef__":true,"id":372},{"__isSmartRef__":true,"id":374},{"__isSmartRef__":true,"id":376},{"__isSmartRef__":true,"id":378},{"__isSmartRef__":true,"id":380},{"__isSmartRef__":true,"id":382},{"__isSmartRef__":true,"id":384},{"__isSmartRef__":true,"id":386},{"__isSmartRef__":true,"id":388},{"__isSmartRef__":true,"id":390},{"__isSmartRef__":true,"id":392},{"__isSmartRef__":true,"id":394},{"__isSmartRef__":true,"id":396},{"__isSmartRef__":true,"id":398},{"__isSmartRef__":true,"id":400},{"__isSmartRef__":true,"id":402},{"__isSmartRef__":true,"id":404},{"__isSmartRef__":true,"id":406},{"__isSmartRef__":true,"id":408},{"__isSmartRef__":true,"id":410},{"__isSmartRef__":true,"id":412},{"__isSmartRef__":true,"id":414},{"__isSmartRef__":true,"id":416},{"__isSmartRef__":true,"id":418},{"__isSmartRef__":true,"id":420},{"__isSmartRef__":true,"id":422},{"__isSmartRef__":true,"id":424},{"__isSmartRef__":true,"id":426},{"__isSmartRef__":true,"id":428},{"__isSmartRef__":true,"id":430},{"__isSmartRef__":true,"id":432},{"__isSmartRef__":true,"id":434}],"revisionOnLoad":151069,"lastModifiedDate":{"__isSmartRef__":true,"id":436},"__LivelyClassName__":"lively.PartsBin.PartsBinMetaInfo","__SourceModuleName__":"Global.lively.PartsBin"},"340":{"date":{"__isSmartRef__":true,"id":341},"author":"sstamm","message":"","id":"1C1391AE-5722-4707-BE52-F0094FC56829"},"341":{"isSerializedDate":true,"string":"Wed Feb 22 2012 14:02:04 GMT+0100 (CET)"},"342":{"date":{"__isSmartRef__":true,"id":343},"author":"sstamm","message":"","id":"663F147A-9084-4AC3-81A7-1E7BA6547F08"},"343":{"isSerializedDate":true,"string":"Wed Feb 22 2012 12:43:10 GMT+0100 (CET)"},"344":{"date":{"__isSmartRef__":true,"id":345},"author":"sstamm","message":"","id":"F72B746E-B170-4EFB-9074-5E8770640B8A"},"345":{"isSerializedDate":true,"string":"Wed Feb 22 2012 12:36:14 GMT+0100 (CET)"},"346":{"date":{"__isSmartRef__":true,"id":347},"author":"sstamm","message":"","id":"568D2EFD-C535-43AE-8944-6D8B967129F5"},"347":{"isSerializedDate":true,"string":"Wed Feb 22 2012 12:23:04 GMT+0100 (CET)"},"348":{"date":{"__isSmartRef__":true,"id":349},"author":"sstamm","message":"","id":"AB2484A6-0707-4E13-845E-F0A5F48BBA3D"},"349":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:59:45 GMT+0100 (CET)"},"350":{"date":{"__isSmartRef__":true,"id":351},"author":"sstamm","message":"","id":"97D20633-F76C-46A5-A32A-FFE9BC83CAB3"},"351":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:59:10 GMT+0100 (CET)"},"352":{"date":{"__isSmartRef__":true,"id":353},"author":"sstamm","message":"","id":"8A697DF5-9A45-4A84-B709-9719BF55083E"},"353":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:56:54 GMT+0100 (CET)"},"354":{"date":{"__isSmartRef__":true,"id":355},"author":"sstamm","message":"","id":"F2157D66-1571-4B9A-B325-6FA96488260F"},"355":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:51:05 GMT+0100 (CET)"},"356":{"date":{"__isSmartRef__":true,"id":357},"author":"sstamm","message":"","id":"E5E808CA-06AB-47DC-A9C9-CA7967591545"},"357":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:47:19 GMT+0100 (CET)"},"358":{"date":{"__isSmartRef__":true,"id":359},"author":"sstamm","message":"","id":"009DC4E0-23CA-485A-A796-801AA0F75049"},"359":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:46:25 GMT+0100 (CET)"},"360":{"date":{"__isSmartRef__":true,"id":361},"author":"sstamm","message":"","id":"C0CE1397-6E2E-4E8C-AEFF-9017E24BB7E4"},"361":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:45:05 GMT+0100 (CET)"},"362":{"date":{"__isSmartRef__":true,"id":363},"author":"sstamm","message":"","id":"FFE16986-548D-4AC2-A627-CF6416282BC4"},"363":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:37:15 GMT+0100 (CET)"},"364":{"date":{"__isSmartRef__":true,"id":365},"author":"sstamm","message":"","id":"57213D63-7147-4057-ADC9-30994443B066"},"365":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:35:29 GMT+0100 (CET)"},"366":{"date":{"__isSmartRef__":true,"id":367},"author":"sstamm","message":"","id":"75A31364-B380-4312-BB5B-F8F2DA1CE824"},"367":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:31:52 GMT+0100 (CET)"},"368":{"date":{"__isSmartRef__":true,"id":369},"author":"sstamm","message":"","id":"5AA50B7E-7D33-44C4-807B-BF1ABA31D530"},"369":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:14:10 GMT+0100 (CET)"},"370":{"date":{"__isSmartRef__":true,"id":371},"author":"sstamm","message":"","id":"BCDCC505-534C-45E5-9BB2-5238959A5AD0"},"371":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:02:56 GMT+0100 (CET)"},"372":{"date":{"__isSmartRef__":true,"id":373},"author":"sstamm","message":"","id":"890D14F4-E89D-4E05-BFB9-875D6AB6C765"},"373":{"isSerializedDate":true,"string":"Wed Feb 22 2012 11:01:50 GMT+0100 (CET)"},"374":{"date":{"__isSmartRef__":true,"id":375},"author":"sstamm","message":"","id":"B6FE0805-0D24-4267-8238-8B332352617E"},"375":{"isSerializedDate":true,"string":"Wed Feb 22 2012 10:55:44 GMT+0100 (CET)"},"376":{"date":{"__isSmartRef__":true,"id":377},"author":"sstamm","message":"callbacks are working","id":"9348260A-3B55-4659-BC85-440BFBD98EA4"},"377":{"isSerializedDate":true,"string":"Fri Feb 10 2012 09:45:55 GMT+0100 (CET)"},"378":{"date":{"__isSmartRef__":true,"id":379},"author":"sstamm","message":"made it more opaque","id":"1B84264C-2822-407F-A58F-19217BCD2762"},"379":{"isSerializedDate":true,"string":"Wed Feb 08 2012 11:41:50 GMT+0100 (CET)"},"380":{"date":{"__isSmartRef__":true,"id":381},"author":"sstamm","message":"","id":"0FB41D7D-2A52-4782-814B-A66C24FCE569"},"381":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:13:49 GMT+0100 (CET)"},"382":{"date":{"__isSmartRef__":true,"id":383},"author":"sstamm","message":"","id":"A0C2D7C1-04AF-493A-A7D7-70750F7D3E2F"},"383":{"isSerializedDate":true,"string":"Thu Feb 02 2012 17:22:07 GMT+0100 (CET)"},"384":{"date":{"__isSmartRef__":true,"id":385},"author":"sstamm","message":"trollolol","id":"F6CFAD78-AC72-4DE2-9F38-79776C2E9462"},"385":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:55:14 GMT+0100 (CET)"},"386":{"date":{"__isSmartRef__":true,"id":387},"author":"sstamm","message":"should be centered now","id":"EE366B4D-C272-477F-8C28-4EAE5A7EC7CB"},"387":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:54:35 GMT+0100 (CET)"},"388":{"date":{"__isSmartRef__":true,"id":389},"author":"sstamm","message":"initial commit","id":"8920D925-DD16-4667-B8C7-FB74D78C2424"},"389":{"isSerializedDate":true,"string":"Thu Feb 02 2012 13:26:01 GMT+0100 (CET)"},"390":{"date":{"__isSmartRef__":true,"id":391},"author":"sstamm","message":"changed text morph name","id":"80E88A3C-5AF3-48F2-A600-710877630997"},"391":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:04:01 GMT+0100 (CET)"},"392":{"date":{"__isSmartRef__":true,"id":393},"author":"sstamm","message":"added loading script","id":"EE9B8F4D-1F03-4232-82E6-794046974F8F"},"393":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:28:30 GMT+0100 (CET)"},"394":{"date":{"__isSmartRef__":true,"id":395},"author":"sstamm","message":"added disconnection","id":"11F19267-924E-4087-99ED-998245576BD2"},"395":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:32:58 GMT+0100 (CET)"},"396":{"date":{"__isSmartRef__":true,"id":397},"author":"sstamm","message":"removed connections before deletion","id":"35A88218-6864-4D52-83A2-BFF7B9A6907C"},"397":{"isSerializedDate":true,"string":"Thu Feb 02 2012 14:41:00 GMT+0100 (CET)"},"398":{"date":{"__isSmartRef__":true,"id":399},"author":"sstamm","message":"now able to load parts by name and category as well as per partItem","id":"F36A5782-461D-4813-95F8-0207990A261C"},"399":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:24:30 GMT+0100 (CET)"},"400":{"date":{"__isSmartRef__":true,"id":401},"author":"sstamm","message":"now with round corners","id":"F42C39CB-CC37-467D-BF10-D362241F047E"},"401":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:26:23 GMT+0100 (CET)"},"402":{"date":{"__isSmartRef__":true,"id":403},"author":"sstamm","message":"loadingMorph is sync now","id":"12ACFFC9-BA53-4A2A-ABD4-894A5ECE1145"},"403":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:48:04 GMT+0100 (CET)"},"404":{"date":{"__isSmartRef__":true,"id":405},"author":"sstamm","message":"display the loadingMorph in new thread","id":"2BA51E30-F02B-4AF0-B3BE-52DD4ED522CC"},"405":{"isSerializedDate":true,"string":"Thu Feb 02 2012 15:53:49 GMT+0100 (CET)"},"406":{"date":{"__isSmartRef__":true,"id":407},"author":"sstamm","message":"","id":"DF0AE4EA-1B08-4556-8BBE-E6488F23B8A3"},"407":{"isSerializedDate":true,"string":"Thu Feb 02 2012 16:49:48 GMT+0100 (CET)"},"408":{"date":{"__isSmartRef__":true,"id":409},"author":"sstamm","message":"","id":"220821B3-C589-41C9-A324-8E7E6D9D6CEB"},"409":{"isSerializedDate":true,"string":"Thu Feb 02 2012 16:58:43 GMT+0100 (CET)"},"410":{"date":{"__isSmartRef__":true,"id":411},"author":"sstamm","message":"","id":"DEBFACE2-7EC5-4A86-AD46-5A0A88A73707"},"411":{"isSerializedDate":true,"string":"Thu Feb 02 2012 17:04:28 GMT+0100 (CET)"},"412":{"date":{"__isSmartRef__":true,"id":413},"author":"sstamm","message":"load request in new thread if loading should be async","id":"18282D28-D6D4-48C9-A508-6E3244449BD8"},"413":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:10:27 GMT+0100 (CET)"},"414":{"date":{"__isSmartRef__":true,"id":415},"author":"sstamm","message":"added benchmarking output","id":"249CFF90-DDF5-4A83-9759-0289E96D7D58"},"415":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:31:50 GMT+0100 (CET)"},"416":{"date":{"__isSmartRef__":true,"id":417},"author":"sstamm","message":"","id":"882082E1-29B6-418D-9B8B-672729D60619"},"417":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:38:26 GMT+0100 (CET)"},"418":{"date":{"__isSmartRef__":true,"id":419},"author":"sstamm","message":"","id":"5179AEF9-E19F-4B0C-BBD8-556C5687988A"},"419":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:44:11 GMT+0100 (CET)"},"420":{"date":{"__isSmartRef__":true,"id":421},"author":"sstamm","message":"","id":"1159C5B4-724E-4124-9D7B-5CD5DC4A8EE3"},"421":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:48:14 GMT+0100 (CET)"},"422":{"date":{"__isSmartRef__":true,"id":423},"author":"sstamm","message":"","id":"2A718D1F-1036-41D6-999A-336F2B14E65D"},"423":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:49:47 GMT+0100 (CET)"},"424":{"date":{"__isSmartRef__":true,"id":425},"author":"sstamm","message":"","id":"EB6BDD0C-7EEC-4124-B77F-2F106A601538"},"425":{"isSerializedDate":true,"string":"Tue Feb 07 2012 11:59:48 GMT+0100 (CET)"},"426":{"date":{"__isSmartRef__":true,"id":427},"author":"sstamm","message":"","id":"63EC8D07-AB6A-450A-BB84-9B4D37E03647"},"427":{"isSerializedDate":true,"string":"Tue Feb 07 2012 12:02:33 GMT+0100 (CET)"},"428":{"date":{"__isSmartRef__":true,"id":429},"author":"sstamm","message":"","id":"19CE12E4-5AA5-48DC-B1D1-B0EB0EDF1CB9"},"429":{"isSerializedDate":true,"string":"Tue Feb 07 2012 12:03:42 GMT+0100 (CET)"},"430":{"date":{"__isSmartRef__":true,"id":431},"author":"sstamm","message":"first attempt to introduce callback functions to part loading","id":"22BD0B95-8948-411A-A56E-AD7CBE445F1D"},"431":{"isSerializedDate":true,"string":"Thu Feb 09 2012 20:20:11 GMT+0100 (CET)"},"432":{"date":{"__isSmartRef__":true,"id":433},"author":"sstamm","message":"","id":"A216DFD2-9D1F-4E62-A22F-6B5472823E1B"},"433":{"isSerializedDate":true,"string":"Fri Mar 16 2012 15:37:34 GMT+0100 (CET)"},"434":{"date":{"__isSmartRef__":true,"id":435},"author":"sstamm","message":"","id":"464E723A-08DC-433C-AA5C-CEC850DBAF0B"},"435":{"isSerializedDate":true,"string":"Fri Mar 16 2012 15:42:29 GMT+0100 (CET)"},"436":{"isSerializedDate":true,"string":"Fri Sep 07 2012 04:04:46 GMT+0200 (CEST)"},"437":{"morph":{"__isSmartRef__":true,"id":326},"__LivelyClassName__":"lively.morphic.EventHandler","__SourceModuleName__":"Global.lively.morphic.Events"},"438":{"adjustForNewBounds":true},"439":{"loadPart":{"__isSmartRef__":true,"id":440},"loadFinished":{"__isSmartRef__":true,"id":444},"loadPartByName":{"__isSmartRef__":true,"id":448}},"440":{"varMapping":{"__isSmartRef__":true,"id":441},"source":"function loadPart(partItem, isAsync) {\n this.partItem = partItem;\n \n this.openInWorld();\n if(partItem.part) {\n this.setExtent(partItem.part.getExtent());\n }\n this.align(this.bounds().center(), $world.visibleBounds().center());\n \n \n if(typeof isAsync === \"function\") {\n this.callback = isAsync;\n }\n\n connect(partItem, 'part', this, \"loadFinished\");\n\n partItem.loadPart(isAsync);\n\n return partItem.part;\n\n}","funcProperties":{"__isSmartRef__":true,"id":442},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"441":{"this":{"__isSmartRef__":true,"id":326}},"442":{"timestamp":{"__isSmartRef__":true,"id":443},"user":"sstamm","tags":[]},"443":{"isSerializedDate":true,"string":"Fri Mar 16 2012 15:42:18 GMT+0100 (CET)"},"444":{"varMapping":{"__isSmartRef__":true,"id":445},"source":"function loadFinished(part) {\n if(this.owner === $world.firstHand()) {\n $world.firstHand().removeAllMorphs();\n } else {\n this.owner.addMorph(part);\n part.align(part.bounds().center(), this.bounds().center());\n this.remove();\n }\n disconnect(this.partItem, 'part', this, \"loadFinished\");\n if(this.callback) {\n this.callback(part);\n }\n}","funcProperties":{"__isSmartRef__":true,"id":446},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"445":{"this":{"__isSmartRef__":true,"id":326}},"446":{"timestamp":{"__isSmartRef__":true,"id":447},"user":"sstamm","tags":[]},"447":{"isSerializedDate":true,"string":"Wed Feb 22 2012 14:01:53 GMT+0100 (CET)"},"448":{"varMapping":{"__isSmartRef__":true,"id":449},"source":"function loadPartByName(partName, optPartsSpaceName, isAsync) {\n var partItem = lively.PartsBin.getPartItem(partName, optPartsSpaceName);\n return this.loadPart(partItem, isAsync);\n}","funcProperties":{"__isSmartRef__":true,"id":450},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"449":{"this":{"__isSmartRef__":true,"id":326}},"450":{"timestamp":{"__isSmartRef__":true,"id":451},"user":"sstamm","tags":[]},"451":{"isSerializedDate":true,"string":"Thu Feb 02 2012 17:03:18 GMT+0100 (CET)"},"452":{"protocol":"http:","hostname":"lively-kernel.org","pathname":"/repository/webwerkstatt/users/conradcalmez/coreDiff.xhtml","__LivelyClassName__":"URL","__SourceModuleName__":"Global.lively.Network"},"453":{"traitName":"users.robertkrahn.WorldMenuTrait","options":{"__isSmartRef__":true,"id":454}},"454":{"override":["morphMenuItems"]},"455":{"isSerializedDate":true,"string":"Sun Dec 02 2012 23:10:13 GMT+0100 (CET)"},"456":{"bottom":{"__isSmartRef__":true,"id":457},"force":{"__isSmartRef__":true,"id":460}},"457":{"varMapping":{"__isSmartRef__":true,"id":458},"source":"function bottom() {\n return this.get('bottom').bounds().top()\n}","funcProperties":{"__isSmartRef__":true,"id":459},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"458":{"this":{"__isSmartRef__":true,"id":0}},"459":{},"460":{"varMapping":{"__isSmartRef__":true,"id":461},"source":"function force(obj) {\n // a = delta_v / delta_t\n obj.velocity = $world.acceleration * 0.1 + obj.velocity;\n}","funcProperties":{"__isSmartRef__":true,"id":462},"__LivelyClassName__":"lively.Closure","__SourceModuleName__":"Global.lively.lang.Closure"},"461":{"this":{"__isSmartRef__":true,"id":0}},"462":{},"isSimplifiedRegistry":true}}]]>