<?xml version="1.0"?>

<st-source>
<!-- 
Name: SeasideLearningCenter
Notice: All rights reserved
BundleName: SeasideLearningCenter
BundleStructure: a Store.BundleForParcel
Comment: Seaside learning center

Seaside Learning Center
Including an Ajax Web Class Browser component based on Scriptaculous.
Was shown on at the Cincom Smalltalk User Conference Frankfurt 2006.
Tested with Safari and Opera on Mac OS X. Other browsers may show various problems.

Goto http://localhost:8008/seaside/go/learning

Contributors: Michel Bany

Keywords: Web, Continuations,  HTML, XML, AJAX, Javascript, Internet, Squeak

Port from (none)

DevelopmentPrerequisites: #(#(#any 'SeasideScriptaculous' '') #(#any 'SeasideAsync' '') #(#any 'SeasideRSRSS' '') #(#any 'SeasideComet' '') #(#any 'SeasideSeaChart' ''))
Parcel: #('SeasideLearningCenter')
ParcelName: SeasideLearningCenter
PrerequisiteParcels: #(#('SeasideScriptaculous' '') #('SeasideAsync' '') #('SeasideRSRSS' '') #('SeasideComet' '') #('SeasideSeaChart' ''))
Version: 1.6
Date: 4:28:49 pm January 25, 2007
 -->
<time-stamp>From VisualWorks®, 7.4.1 of May 30, 2006 on January 25, 2007 at 4:28:49 pm</time-stamp>


<do-it>(Dialog confirm: 'You are filing-in a Parcel source file!\\While this is possible it will not have\the same effect as loading the parcel.\None of the Parcel''s prerequisites will\be loaded and none of its load actions\will be performed.\\Are you sure you want to file-in?' withCRs) ifFalse: [self error: 'Parcel file-in abandoned.  Choose terminate or close.']</do-it>

<class>
<name>SULearningStep</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>renderer scriptRenderer listOfDemos selectedDemo demoText isGenerated child data </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningHtmlCanvas</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SUFullClassBrowser</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>leftComponents left rightComponents right bottom isReadOnly message browser contents </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SULearningCenterLibrary</name>
<environment>Seaside</environment>
<super>Seaside.WAFileLibrary</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningScriptaculous</name>
<environment>Seaside</environment>
<super>Seaside.SULearningStep</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>generatedText generatedScript </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningRSS</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>feed </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SUPermissiveBrowser</name>
<environment>Seaside</environment>
<super>Squeak.Browser</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>component </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SUUnknownVariable</name>
<environment>Seaside</environment>
<super>Core.Error</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>varName </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SULearningStepDecoration</name>
<environment>Seaside</environment>
<super>Seaside.WADecoration</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>title </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningHtml</name>
<environment>Seaside</environment>
<super>Seaside.SULearningStep</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>generatedHtml message </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningHtmlCompound</name>
<environment>Seaside</environment>
<super>Seaside.SULearningHtml</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningExit</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningComet</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SUScriptaculousAndAsyncTest</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>component </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningStepChooser</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>builder components </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningReflection</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SUWorkflow</name>
<environment>Seaside</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>steps current filters </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningSessionBuilder</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>workflow dialog </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningHtmlCallbacks</name>
<environment>Seaside</environment>
<super>Seaside.SULearningHtml</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningTask</name>
<environment>Seaside</environment>
<super>Seaside.WATask</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>workflow component startWith filter </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SUClassBrowserPane</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>componentName main </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SUClassBrowserRightPane</name>
<environment>Seaside</environment>
<super>Seaside.SUClassBrowserPane</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SUClassBrowserLeftPane</name>
<environment>Seaside</environment>
<super>Seaside.SUClassBrowserPane</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SUClassBrowserSourcePane</name>
<environment>Seaside</environment>
<super>Seaside.SUClassBrowserPane</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>sourceCode </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideTools-Browser</category>
<attributes>
<package>SeasideLearningCenter-Browser</package>
</attributes>
</class>

<class>
<name>SULearningUtilities</name>
<environment>Seaside</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SUNot</name>
<environment>Seaside</environment>
<super>Seaside.SUStatement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Extensions</category>
<attributes>
<package>SeasideLearningCenter-Extensions</package>
</attributes>
</class>

<class>
<name>SULearningElement</name>
<environment>Seaside</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>title snippet sample initializer actualSnippet actualSample </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningCSS</name>
<environment>Seaside</environment>
<super>Seaside.SULearningHtml</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<class>
<name>SULearningCometChat</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>SeasideFrankfurt-Demo</category>
<attributes>
<package>SeasideLearningCenter-Core</package>
</attributes>
</class>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="genericStyle">genericStyle
	^'
#xh-selected {
	width: 13em;
	font-size: 100%;
	float: left;
}
#xh-edit {
	float: left;
	margin-left: 1em;
}
#xh-edit textarea {
	border: 1px solid #888;
	font-size: 100%;
}
#xh-generated {
	padding-top: 1em;
	width: 90%;
	margin: auto;
	clear: both;
}
#xh-sample {
	padding-left: 1em;
	padding-top: 0.5em;
	clear: both;
	background-color: #e9fff5;
	border: 1px dashed #888;
	word-wrap: break-word;
	margin-top: 10px;
}
#xh-sample pre {
	margin-left: 2em;
	margin-top: 0.5em;
	font-family: Lucida;
	font-size: 120%;
}
#xh-demo {
	padding: 1em;
	clear: both;
	background-color: #e9f5ff;
	border: 1px dashed #888;
	word-wrap: break-word;
	margin-top: 10px;
}
'</body>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html
	isGenerated ifFalse: [self generate].
	(html div)
		id: self idForSelectBox;
		with: [self renderDemoListOn: html].
	(html div)
		id: self idForEditBox;
		with: [self renderEditorOn: html].
	(html div)
		id: self idForGeneratedBox;
		with: [self renderGeneratedOn: html]</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListOn:">renderDemoListOn: html 
	^(html select)
		id: self idForSelect;
		list: self listOfDemos;
		size: 10;
		selected: selectedDemo;
		labels: [:v | v title];
		callback: [:v | selectedDemo := v];
		onClick: ((html evaluator)
					triggerFormElement: self idForSelect;
					callback: 
							[:script | 
							scriptRenderer := script copy.
							self setInitialDemoText.
							(script element)
								id: self idForEditBox;
								render: [:r | self renderEditorOn: r].
							self elementsToHide do: 
									[:each | 
									(script element)
										id: each;
										remove].
							self generate.
							(script element)
								id: self idForGeneratedBox;
								render: [:r | self renderGeneratedOn: r]])</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoOn:">renderDemoOn: html 
	self subclassResponsibility</body>

<body package="SeasideLearningCenter-Core" selector="renderEditorOn:">renderEditorOn: html 
	selectedDemo isNil ifTrue: [^nil].
	(html form)
		id: self idForEditForm;
		with: 
				[(html textArea)
					id: self idForTextArea;
					value: demoText;
					rows: 8;
					columns: 50;
					callback: [:v | demoText := v]].
	(html submitButton)
		addShortcut: 'Ctrl-s';
		addShortcut: 'Ctrl-S';
		onClick: ((html evaluator)
					triggerForm: self idForEditForm;
					callback: 
							[:script | 
							self generate.
							(script element)
								id: self idForGeneratedBox;
								render: [:r | self renderGeneratedOn: r]]);
		text: 'Update (Ctrl-S)'</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="renderGeneratedOn:">renderGeneratedOn: html 
	demoText isNil ifTrue: [^nil].
	(html div)
		id: self idForSample;
		with: 
				[html strong: 'renderContentOn: html'.
				html preformatted: selectedDemo sampleGenerated].
	(html div)
		id: self idForDemo;
		with: 
				["This method is dynamically generated !!"

				self renderDemoOn: html]</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>demos</category>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	self subclassResponsibility</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Core" selector="addDemoMethodUsing:">addDemoMethodUsing: methodText 
	| save storeRegistry |
	storeRegistry := #{Store.Registry} value.
	save := storeRegistry currentPackage.
	storeRegistry currentPackage: nil.
	self class compile: 'renderDemoOn: html
"This method has been generated and will be rewritten when regenerated"

' , methodText classified: 'rendering'.
	storeRegistry currentPackage: save</body>

<body package="SeasideLearningCenter-Core" selector="compile:">compile: aString 
	^Compiler 
		evaluate: aString
		for: self
		logged: false</body>

<body package="SeasideLearningCenter-Core" selector="generate">generate
	self subclassResponsibility</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>ids</category>

<body package="SeasideLearningCenter-Core" selector="idForDemo">idForDemo
	^'xh-demo'</body>

<body package="SeasideLearningCenter-Core" selector="idForEditBox">idForEditBox
	^'xh-edit'</body>

<body package="SeasideLearningCenter-Core" selector="idForEditForm">idForEditForm
	^'xh-form'</body>

<body package="SeasideLearningCenter-Core" selector="idForGeneratedBox">idForGeneratedBox
	^'xh-generated'</body>

<body package="SeasideLearningCenter-Core" selector="idForSample">idForSample
	^'xh-sample'</body>

<body package="SeasideLearningCenter-Core" selector="idForSelect">idForSelect
	^'xh-selected'</body>

<body package="SeasideLearningCenter-Core" selector="idForSelectBox">idForSelectBox
	^'xh-list'</body>

<body package="SeasideLearningCenter-Core" selector="idForTextArea">idForTextArea
	^'xh-text'</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="listOfDemos">listOfDemos
	^listOfDemos</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>services</category>

<body package="SeasideLearningCenter-Core" selector="children">children
	^child isNil ifTrue: [#()] ifFalse: [Array with: child]</body>

<body package="SeasideLearningCenter-Core" selector="data:">data: aValue
	data := aValue.</body>

<body package="SeasideLearningCenter-Core" selector="elementsToHide">elementsToHide
	^Array with: self idForSample with: self idForDemo</body>

<body package="SeasideLearningCenter-Core" selector="setInitialDemoText">setInitialDemoText
	selectedDemo isNil ifTrue: [^nil].
	demoText := selectedDemo snippet.
	selectedDemo initialize.
	isGenerated := false.</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep</class-id> <category>initialize-release</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	| context callbacks |
	listOfDemos := self demos.
	context := WARenderingContext new document: ((WAHtmlStreamDocument new)
						bodyStream;
						yourself).
	callbacks := WACallbackRegistry context: context owner: self.
	renderer := WARenderCanvas context: context callbacks: callbacks.
	selectedDemo := self listOfDemos first.
	self setInitialDemoText.</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: aRoot
	super updateRoot: aRoot.
	renderer context actionUrl: aRoot context actionUrl copy.
	aRoot addStyle: self genericStyle.</body>
</methods>

<methods>
<class-id>Seaside.SULearningStep class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^false</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCanvas</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	(html canvas)
		id: 'canvas';
		height: 150;
		width: 150;
		style: 'border: 1px solid black'.
	self renderMozillaLinkOn: html.
	html script: 'basicDraw()'.
	html submitButton
		onClick: 'squares()';
		text: 'Squares'.
	html submitButton
		onClick: 'circles()';
		text: 'Circles'.</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="renderMozillaLinkOn:">renderMozillaLinkOn: html 
	html paragraph: 
			[html text: 'See more at '.
			(html anchor)
				url: 'http://developer.mozilla.org/en/docs/Canvas_tutorial';
				newTarget;
				text: 'http://developer.mozilla.org/en/docs/Canvas_tutorial']</body>

<body package="SeasideLearningCenter-Core" selector="script">script
	^'
function basicDraw() {

	var canvas = $("canvas");

	if (canvas.getContext) {
		var ctx = canvas.getContext("2d");

		ctx.fillStyle = "#345ba8";
		ctx.strokeStyle = "#ba8345";

		ctx.fillRect(25,25,100,100);
		ctx.clearRect(45,45,60,60);
		ctx.strokeRect(50,50,50,50);
		ctx.strokeRect(20,20,110,110);
	}
}

function squares() {

	var canvas = $("canvas");

	if (canvas.getContext) {
		var ctx = canvas.getContext("2d");
		ctx.clearRect(0,0,150,150);
		for ( i = 0; i &lt; 6; i++ ) {
			for (	j = 0; j &lt; 6; j++ ) {
				ctx.fillStyle = "rgb(" + Math.floor(255-42.5 * i) + "," + Math.floor(255-42.5 * j) + ", 0)";
				ctx.fillRect(j * 25 , i * 25 , 25 , 25);
			}
		}
	}
}

function circles() {

	var canvas = $("canvas");

	if (canvas.getContext) {
		var ctx = canvas.getContext("2d");
		ctx.clearRect(0,0,150,150);
		for ( i = 0; i &lt; 6; i++ ) {
			for (	j = 0; j &lt; 6; j++ ) {
				ctx.strokeStyle = "rgb(0," + Math.floor(255-42.5 * i) + "," + Math.floor(255-42.5 * j) + ")";
				ctx.beginPath();
				ctx.arc(12.5 + j * 25 , 12.5 + i * 25 , 10 , 0 , Math.PI * 2 , true);
				ctx.stroke();
			}
		}
	}
}
'</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCanvas class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCanvas class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'HTML Canvas element'</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#Javascript</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>browser callbacks</category>

<body package="SeasideLearningCenter-Browser" selector="bindingOf:">bindingOf: aString
	"Here when an unknown variable is used in a method"
	(SUUnknownVariable new)
		varName: aString;
		signal</body>

<body package="SeasideLearningCenter-Browser" selector="notify:at:in:">notify: aString at: location in: sourceStream
	"Here when there was a compile error"
	message := aString allButLast: 3</body>

<body package="SeasideLearningCenter-Browser" selector="selectionInterval">selectionInterval
	^1 to: 1</body>

<body package="SeasideLearningCenter-Browser" selector="update:">update: aSymbol
	aSymbol == #contents ifTrue:
		["Here when the source pane has changed"
		message := nil.
		self contents: self browser contents]</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Browser" selector="bottom">bottom
	"Answer the value of bottom"

	^ bottom</body>

<body package="SeasideLearningCenter-Browser" selector="bottom:">bottom: anObject
	"Set the value of bottom"

	bottom := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="browser">browser
	"Answer the value of browser"

	^ browser</body>

<body package="SeasideLearningCenter-Browser" selector="browser:">browser: anObject
	"Set the value of browser"

	browser := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="contents">contents
	"Answer the value of contents"

	^ contents</body>

<body package="SeasideLearningCenter-Browser" selector="contents:">contents: anObject
	"Set the value of contents"

	contents := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="isReadOnly">isReadOnly
	"Answer the value of isReadOnly"

	^ isReadOnly</body>

<body package="SeasideLearningCenter-Browser" selector="isReadOnly:">isReadOnly: anObject
	"Set the value of isReadOnly"

	isReadOnly := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="left">left
	"Answer the value of left"

	^ left</body>

<body package="SeasideLearningCenter-Browser" selector="left:">left: anObject
	"Set the value of left"

	left := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="leftComponents">leftComponents
	"Answer the value of leftComponents"

	^ leftComponents</body>

<body package="SeasideLearningCenter-Browser" selector="leftComponents:">leftComponents: anObject
	"Set the value of leftComponents"

	leftComponents := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="message">message
	"Answer the value of message"

	^ message</body>

<body package="SeasideLearningCenter-Browser" selector="message:">message: anObject
	"Set the value of message"

	message := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="right">right
	"Answer the value of right"

	^ right</body>

<body package="SeasideLearningCenter-Browser" selector="right:">right: anObject
	"Set the value of right"

	right := anObject.
	self right = 'Class' 
		ifTrue: [self browser indicateClassMessages]
		ifFalse: [self browser indicateInstanceMessages].</body>

<body package="SeasideLearningCenter-Browser" selector="rightComponents">rightComponents
	"Answer the value of rightComponents"

	^ rightComponents</body>

<body package="SeasideLearningCenter-Browser" selector="rightComponents:">rightComponents: anObject
	"Set the value of rightComponents"

	rightComponents := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="text">text
	^ Text fromString: ''</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>navigation</category>

<body package="SeasideLearningCenter-Browser" selector="bottomComponent">bottomComponent
	^bottom
		main: self;
		yourself</body>

<body package="SeasideLearningCenter-Browser" selector="leftComponent">leftComponent
	^(leftComponents at: self left)
		main: self;
		componentName: self left;
		yourself</body>

<body package="SeasideLearningCenter-Browser" selector="leftOptions">leftOptions
	^leftComponents keys</body>

<body package="SeasideLearningCenter-Browser" selector="rightComponent">rightComponent
	^(rightComponents at: self right)
		main: self;
		componentName: self right;
		yourself</body>

<body package="SeasideLearningCenter-Browser" selector="rightOptions">rightOptions
	^rightComponents keys</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>model</category>

<body package="SeasideLearningCenter-Browser" selector="canRemoveSourceCode">canRemoveSourceCode
	"May remove classes with this tool"
	^self selectedClass notNil.</body>

<body package="SeasideLearningCenter-Browser" selector="canRenameSourceCode">canRenameSourceCode
	"May rename a method category"
	^self protocol notNil.</body>

<body package="SeasideLearningCenter-Browser" selector="canSaveSourceCode">canSaveSourceCode
	"Can save new classes with this tool"
	^self package notNil</body>

<body package="SeasideLearningCenter-Browser" selector="classes">classes
	^self browser classList</body>

<body package="SeasideLearningCenter-Browser" selector="package">package
	self browser systemCategoryListIndex = 0 ifTrue: [^nil].
	^self packages at: self browser systemCategoryListIndex</body>

<body package="SeasideLearningCenter-Browser" selector="package:">package: anObject
	^self browser systemCategoryListIndex: (self packages indexOf: anObject)</body>

<body package="SeasideLearningCenter-Browser" selector="packages">packages
	^self browser systemCategoryList</body>

<body package="SeasideLearningCenter-Browser" selector="protocol">protocol
	self browser messageCategoryListIndex = 0 ifTrue: [^nil].
	^self protocols at: self browser messageCategoryListIndex</body>

<body package="SeasideLearningCenter-Browser" selector="protocol:">protocol: anObject
	^self browser messageCategoryListIndex: (self protocols indexOf: anObject)</body>

<body package="SeasideLearningCenter-Browser" selector="protocols">protocols
	^self browser messageCategoryList</body>

<body package="SeasideLearningCenter-Browser" selector="removeText">removeText
	self selector notNil
		ifTrue: [^'method'].
	self protocol notNil
		ifTrue: [^'method category'].
	self selectedClass notNil
		ifTrue: [^'class'].</body>

<body package="SeasideLearningCenter-Browser" selector="renameText">renameText
	self protocol notNil
		ifTrue: [^'method category'].</body>

<body package="SeasideLearningCenter-Browser" selector="selectedClass">selectedClass
	self browser classListIndex = 0 ifTrue: [^nil].
	^self classes at: self browser classListIndex</body>

<body package="SeasideLearningCenter-Browser" selector="selectedClass:">selectedClass: anObject
	^self browser classListIndex: (self classes indexOf: anObject)</body>

<body package="SeasideLearningCenter-Browser" selector="selector">selector
	self browser messageListIndex = 0 ifTrue: [^nil].
	^self selectors at: self browser messageListIndex</body>

<body package="SeasideLearningCenter-Browser" selector="selector:">selector: anObject
	^self browser messageListIndex: (self selectors indexOf: anObject)</body>

<body package="SeasideLearningCenter-Browser" selector="selectors">selectors
	self protocol isNil ifTrue: [^Array new].
	^self browser messageList</body>

<body package="SeasideLearningCenter-Browser" selector="sourceCode">sourceCode
	^self contents</body>

<body package="SeasideLearningCenter-Browser" selector="sourceTitle">sourceTitle
	self selector notNil 
		ifTrue: [^self selectedClass asString , ' &gt;&gt; ' , self selector].
	self protocol notNil 
		ifTrue: [^self selectedClass asString , ' &gt;&gt; template for new method'].
	self selectedClass notNil 
		ifTrue: [^self selectedClass asString , ' class definition'].
	self package notNil
		ifTrue: [^'Template for new class definition'].
	^nil</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Browser" selector="children">children
	^Array 
		with: self leftComponent
		with: self rightComponent
		with: self bottomComponent</body>

<body package="SeasideLearningCenter-Browser" selector="renderContentOn:">renderContentOn: html 
	(html div)
		id: 'class-browser';
		with: 
				[(html div)
					id: 'left';
					with: 
							[(html div)
								class: 'nav-options';
								id: 'left-options';
								with: [self renderLeftOptionsOn: html].
							html render: self leftComponent].
				(html div)
					id: 'right';
					with: 
							[(html div)
								class: 'nav-options';
								id: 'right-options';
								with: [self renderRightOptionsOn: html].
							html render: self rightComponent].
				html div class: 'clear'.
				html render: self bottomComponent]</body>

<body package="SeasideLearningCenter-Browser" selector="rendererClass">rendererClass
	^ WARenderCanvas</body>

<body package="SeasideLearningCenter-Browser" selector="renderLeftOptionsOn:">renderLeftOptionsOn: html 
	(html unorderedList)
		list: self leftOptions;
		selected: self left;
		callback: [:v | self left: v]</body>

<body package="SeasideLearningCenter-Browser" selector="renderRightOptionsOn:">renderRightOptionsOn: html 
	(html unorderedList)
		list: self rightOptions;
		selected: self right;
		callback: [:v | self right: v]</body>

<body package="SeasideLearningCenter-Browser" selector="style">style
	^ '
div#class-browser {
	font-family: Verdana;
}
div#lightbox {
	background: url(http://scriptaculous.seasidehosting.st/resources/demo.gif) repeat white;
	border: 1px solid #e8a400;
	padding: 2em;
	width: 50%;
	font-family: Verdana;
}
div#left, div#right {
	float: left;
	width: 49.9%;
}
div#packages, div#classes, div#protocols, div#selectors {
	float: left;
	width: 49.9%;
}
div.clear {
	clear: both;
	height: 1em;
}
div#packages select, div#classes select, div#protocols select, div#selectors select {
	width: 100%;
}
div#source {
	width: 93%;
	padding: 1em;
	border: 1px solid #dddddd;
	background-color: #f5f5f5;
}
textarea#contents {
	width: 100%;
	height: 20em;
	margin-top: 1em;
	margin-bottom: 1em;
}
div#message, div#title {
	font-weight: bold;
}
div#message {
	color: red;
}


div.nav-options {
	border-bottom : 1px solid #ccc;
	margin : 0;
	padding-bottom : 19px;
	padding-left : 10px;
}
div.nav-options ul, div.nav-options li	{
	display : inline;
	list-style-type : none;
	margin : 0;
	padding : 0;
}
div.nav-options a:link, div.nav-options a:visited	{
	background : #E8EBF0;
	border : 1px solid #ccc;
	color : #666;
	float : left;
	font-size : small;
	font-weight : normal;
	line-height : 14px;
	margin-right : 8px;
	padding : 2px 10px 2px 10px;
	text-decoration : none;
}

div.nav-options a:link.active, div.nav-options a:visited.active	{
	background : #fff;
	border-bottom : 1px solid #fff;
	color : #000;
}

div.nav-options ul a:hover	{
	color : #f00;
}

div.nav-options .option-selected a {
	background : #fff;
	border-bottom : 1px solid #fff;
	color : #000;
}


'</body>

<body package="SeasideLearningCenter-Browser" selector="updateRoot:">updateRoot: anHtmlRoot
	super updateRoot: anHtmlRoot.
	(self session application libraries includes: SULibrary) ifFalse:
		[SULibrary updateRoot: anHtmlRoot].</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>lightbox</category>

<body package="SeasideLearningCenter-Browser" selector="confirm:">confirm: aString
	^self lightbox: (WAYesOrNoDialog new addMessage: aString)</body>

<body package="SeasideLearningCenter-Browser" selector="inform:">inform: aString
	self lightbox: (WAFormDialog new addMessage: aString)</body>

<body package="SeasideLearningCenter-Browser" selector="request:label:default:">request: requestString label: labelString default: initialString
	^ self lightbox:
		((WAInputDialog new
			label: labelString;
			default: initialString;
			yourself)
				addMessage: requestString)</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>initialize-release</category>

<body package="SeasideLearningCenter-Browser" selector="initialize">initialize
	super initialize.
	self browser: SUPermissiveBrowser new.
	self browser component: self.
	self browser addDependent: self.
	self contents: self browser contents.
	isReadOnly := false.
	leftComponents := (Dictionary new)
				at: 'Categories' put: SUClassBrowserLeftPane new;
				yourself.
	self left: 'Categories'.
	rightComponents := (Dictionary new)
				at: 'Instance' put: SUClassBrowserRightPane new;
				at: 'Class' put: SUClassBrowserRightPane new;
				yourself.
	self right: 'Instance'.
	bottom := SUClassBrowserSourcePane new.</body>

<body package="SeasideLearningCenter-Browser" selector="setClass:selector:">setClass: aClass selector: aSymbol
	self browser setClass: aClass selector: aSymbol.</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>constants</category>

<body package="SeasideLearningCenter-Browser" selector="listSize">listSize
	^15</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>private</category>

<body package="SeasideLearningCenter-Browser" selector="pause">pause
	"Activate this code to demo ajax interactivity"
	"(Delay forSeconds: 1) wait."</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Browser" selector="removeSourceCode">removeSourceCode
	self selector notNil
		ifTrue: [^self browser removeMessage].
	self protocol notNil
		ifTrue: [^self browser removeMessageCategory].
	self selectedClass notNil
		ifTrue: [^self browser removeClass].</body>

<body package="SeasideLearningCenter-Browser" selector="renameSourceCode">renameSourceCode
	^self browser renameCategory</body>

<body package="SeasideLearningCenter-Browser" selector="saveSourceCode:">saveSourceCode: aString 
	| saveProtocol saveSelector saveMessage |
	SeasidePlatformSupport ensureAuthorInitials: [self request: 'Please enter your initials:'].
	message := nil.
	saveProtocol := self protocol.
	saveSelector := self selector.
	[self browser contents: aString notifying: self]
		on: SUUnknownVariable
		do: [:error | message := error messageText].
	saveMessage := message.
	self protocol: saveProtocol.
	self selector: saveSelector.
	self contents: aString.
	message := saveMessage</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>ajax updates</category>

<body package="SeasideLearningCenter-Browser" selector="updateClassesOn:">updateClassesOn: script 
	self pause.
	(script element)
		id: self elementClasses;
		render: [:r | self leftComponent renderClassesOn: r].
	self updateProtocolsOn: script</body>

<body package="SeasideLearningCenter-Browser" selector="updateProtocolsOn:">updateProtocolsOn: script 
	self pause.
	(script element)
		id: self elementProtocols;
		render: [:r | self rightComponent renderProtocolsOn: r].
	self updateSelectorsOn: script</body>

<body package="SeasideLearningCenter-Browser" selector="updateSelectorsOn:">updateSelectorsOn: script 
	self pause.
	(script element)
		id: self elementSelectors;
		render: [:r | self rightComponent renderSelectorsOn: r].
	self updateSourceOn: script</body>

<body package="SeasideLearningCenter-Browser" selector="updateSourceOn:">updateSourceOn: script 
	self pause.
	(script element)
		id: self elementSource;
		render: [:r | self bottomComponent renderSourceOn: r]</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser</class-id> <category>css ids</category>

<body package="SeasideLearningCenter-Browser" selector="elementClasses">elementClasses
	^'classes'</body>

<body package="SeasideLearningCenter-Browser" selector="elementPackages">elementPackages
	^'packages'</body>

<body package="SeasideLearningCenter-Browser" selector="elementProtocols">elementProtocols
	^'protocols'</body>

<body package="SeasideLearningCenter-Browser" selector="elementSelectors">elementSelectors
	^'selectors'</body>

<body package="SeasideLearningCenter-Browser" selector="elementSource">elementSource
	^'source'</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Browser" selector="canBeRoot">canBeRoot
	^true</body>

<body package="SeasideLearningCenter-Browser" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser class</class-id> <category>halo plugin</category>

<body package="SeasideLearningCenter-Browser" selector="haloElementsFor:inHalo:">haloElementsFor: aTarget inHalo: aHalo
	^ 1 = 1 ifTrue:
		[#()]
	ifFalse:
		["This will install an additional icon in the halo"
		OrderedCollection new
			add: ((Dictionary new)
				at: #image put: 'Halo-Debug';
				at: #action put: [SUFullClassBrowser fullOnClass: aTarget class];
				at: #title put: 'System Browser (Ajax)';
				yourself);
			yourself]</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser class</class-id> <category>class initialization</category>

<body package="SeasideLearningCenter-Browser" selector="initialize">initialize
	WAHalo addPlugin: self.
	(self registerAsApplication: 'tools/classbrowser-scriptaculous') addLibrary: SULibrary</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser class</class-id> <category>instance creation</category>

<body package="SeasideLearningCenter-Browser" selector="fullOnClass:">fullOnClass: aClass
	^self fullOnClass: aClass selector: nil</body>

<body package="SeasideLearningCenter-Browser" selector="fullOnClass:selector:">fullOnClass: aClass selector: aSelector
	^(self new)
		setClass: aClass selector: aSelector;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SUFullClassBrowser class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Browser" selector="description">description
	^'Ajax Smalltalk class browser (four panes) with Scriptaculous updaters'</body>

<body package="SeasideLearningCenter-Browser" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SULearningCenterLibrary</class-id> <category>uploaded</category>

<body package="SeasideLearningCenter-Core" selector="browseGif">browseGif
	^ ByteArray fromPackedString:
'Q4%FNC%!FP@Y@O\@L_???&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?&gt;?7?=[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[V3-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1-[N1&amp;/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?6/F?3D)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JSD)JP"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0"%?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0BL?0@@@B0@@@@@FP@Y@@@H1 AMJED"$NC@   OJ#SHLFGC!P8KC&amp;P8T^KB"QT)B)R8D^MF"1#]7M)F\-,-M1$1Y#P!4$6@%3AE7(KXTX%L&amp;C!#.$G9\JAK''IJB9 00D2SK''3BCR!(*T&amp;GAV4N#0-2VT,&amp;6''D*WC*WJ4^)P)UF)Z+2JU^!V#0M/PPU*E._I#2GKZ''V+$.EN-&amp;5I&lt;*P8DZ''T&amp;Q]++(5:\*=A#"I_."D94*S!. U?''*1K&amp;Z&lt;R*IM;5$P+TN7#*$8%Y([H.[KE"A(O5-0LL+VR @@;'</body>

<body package="SeasideLearningCenter-Core" selector="exitGif">exitGif
	^ ByteArray fromPackedString:
'Q4%FNC%!D@@P@O\@L_?????????????????VR/?VR/?VR.?V+^?V+^?FV.?FV.?FV._V+^_V+^_V+^_N)^_N)^_N)^_F''N_F''N_F''N^=X&gt;^=X&gt;^=X=;F%M;F%M;F#M;F#M;F#M:=%M:=%M:=%M:=#M:=#M:=!M:=!M:=!M:5#M:5#M:5#M:5!M:5!M:5V-:5V-:5V-Z5!MZ5!MZ5!MZ5^=Z5^=Z-^=Z-^=Z-^=Z-\=Z-\=Z-\=Z-Z=Z-Z=Z-Z=Z%\=Z%\=Z%X=Z%X=Z\\=Z\\=Z\\=Z\Z=Z\Z=Z\Z&lt;:%Z&lt;:%Z&lt;:%X&lt;:%X&lt;:\X&lt;:\X&lt;:\X&lt;:\V,:\V,:\V,:TX&lt;:TX&lt;:TV,:TV,:TV,ZTT,ZTT,ZTT,ZLV,ZLV,ZLV,ZLT,ZLT,ZLT+6TV+6TV+6LT+6LT+6LR+6LR+6LP+6LP+6LP+6DR+6DR+6DR+VLT+VLT+VLT+VLR+VLR+VLR+VDP+VDP+U;P+U;P+U;N[U;NZ6DP*6DP*6DP*5;P*5;P*5;P*5;NZ5;NZ5;NZ53LZ53LZ53LZV%)ZV%)ZV%)ZU+JZU+JZU+HZU+HZU+HY3V%I3V%I3V%I3N#I3N#I3N#I2\''I2\''I2\''I1#HY1#HY1#FI1#FI1#FISN#ISN#ISN#IQZDIQZDIQZBIQZBIQZBH3N!H3N!H3F!H3F!H3F!H1RBH1RBH1RBHSF^8SF^8SF^8RD!HRD!HRD!G/F\7/F\7/F\7-;^7-;^7-;^7M3\7M3\7M3\6N%V&amp;N%V&amp;N%V&amp;M#X6M#X6M#X5*\T%*\T%*\T%*TT%*TT%)ZV%)ZV%)ZV%JTR%JTR%JTR%I;T%I;T%I;T%IRT%IRT%IRT$*TR$*TR$*TP$*TP$*TP$*LR$*LR$*LP$*LP$*LP$*LNT*LNT*LNT*DP$*DP$)JR$)JR$)JR$JLNTJLNTJLNTJDNTJDNTJDNTI;P$I;P$I;P$I3NTI3NTI3NTIBP$IBP$IBP#&amp;DLS&amp;DLS&amp;DLS%;LS%;LS%3NS%3NS%3NS%3LS%3LS%3LSE;LSE;LSE;LSE3JSE3JSE3JP@@@BG9A@D@@@@@K@@@@@@P@A@@@@#S@@DHGD!0(A@!RP(*?IDD1I^D@ESA&amp;# 1%00!HA8&lt;&gt;OIEHJ1GHDO&gt;4H"!09\+G!&lt;QB?$(2XLNGQ2FRW%MV$"WHF@8#MO,6#U7-&amp;2UB=P2I 0YW?Y\R&lt;RT4R]^9Q9=0W@4PY4=4!"]Z,W5EKE#U3+H*DB C"E4''=J6&gt;%P.W*@8GX($*VCVW[2;9_HF^ ,""]&lt;:$ S&amp;^%PN7]9G^FPT:YHDC2VA0PHY7!-(#00&amp;SK+T4PS9LFUIL!PW0ZO)TZ9 7EJ+%+Q''C980^3 +EB!I$65R%D EA@@;'</body>

<body package="SeasideLearningCenter-Core" selector="feediconPng">feediconPng
	^ ByteArray fromPackedString:
'"UANQ04JF (@@@@MRT!DT @@@H@@@@B@B@X@@@CCO&amp;GK@@@@A&amp;IKQ4P@?0C?@O&gt; /Z^S@@@@A7QISTTG5 LWEQ4Y@3_%H0@@GK)IQDET^I3-''W%8GNV]93?/V5U=:[P%6YI%&gt;\H''O/@E!A-;BL8ASI"DH0P;$N0\!DC2$M''M!&amp;P''YKICY)%!''&amp;SHIM%9Y _FA HN09HM!N@DBD]HCCZ6,SGFI"C9$&amp;1K-*9.]W\];?;Q)8:V.+)K,&amp;S:&gt;326*-9::75?UY=_5?/V^9W@X67]4E"#J?L2!U(-XK8R3@]*TIPC%U;'']8Z*F4D/4BDT&gt;1W,E8!-%#A^N''?#$P8/L1I^IOK&amp;#[WSGE6,Q7@=,A2PW*Q[4"@90D8T&amp;:V%M*5&lt;+O5(,P$V9PC[5$&lt;=W0!5-5K*J Y@E4I"AO38P"E4''0&gt;)R8S01M?N^B&amp;%\B0GJ18''G(% Q&amp;L(9P2L9  !''%YJ7K-:4;F-!^YUDIG-:6,VJRV?#&gt;CJ;GA?VX"J6%)B5UTDJ".Q,/P &lt;DJN81C-;"[R6TUO^3.1\JQ?ALTVHY2/+-+T&lt;X;[-E490H.73@)T6NE/ ; K%@=@BDE5_S5U4&gt;(I%I^;3[&gt;$@!S-;ZW+ZA.][V4()YJ!H ;*''7*4,.&gt;,^Z 9&amp;&amp;=Z^S/@#)/*9-&amp;R3P"VP0I&lt;UTL=-SNZ4O7&gt;@[DUU%&lt;\J13A#,Z1(3D\24H)TKZMDJ&amp;\A^%RPYC\E%''[*]5DVN)O2&amp;(!QMY6?2-JE3]CGA_Y@]%)=(,+A.WW_7?0&lt;_86"J3+3FD;6_FS]49HD)^%(XRA$ XJO0"=_4S@",U(O7"H+-X,Q5C,5A2.W?G("PO$([0\XO/:J^,TZ#OIV''20,(J)&lt;&gt;\QJB/+[5A_#M")[.I]OR#KG#J''D/3\&lt;O/EGW!LRA0Q@!EBBZO_J]E0&amp;FO;C=CW7YLJ:!ZH:5]-N/8\H6!DA="6(_X&amp;%G0P%@&lt;AMT7S*Y45*==EVK4QH"]NX_UF!$:$AK=H&gt;J$?"P!J&gt;GD(Q8''L$5\)QW-3L16GC(LBDGFD\&gt;/*#^6OL(2F]XC-M=]&gt;S &amp;1BQAR$3P,WD!E[T7:.FNZ!E/[L[-:Q&lt;2!AM&lt;[&gt;M%2YABGR$AK!?V4]=B:[1&gt;N;P@((]S:UP&gt;7O4HN9WR@[Y&gt;_\"TN/0C%$;)N49J3BUYU)X?G.7(HG3&amp;A,.5\RYS C6U_]/(L"C/06CC0L?,RQ5S!DD0_:./*8-B^/S"VAX 8$*-W?&lt;_1KP2!HQ5 1455&lt;62M[TB%%IK)R9\P*$;BU1A.N4F,/WN(T0\[W8H?Z/B3&lt;7@(02[3@854]''E8=18\10G(5&amp;1VC5T1GOR"_.BN.W9[87F D DMY2=J05]J4W.0-PQ?''LDG$BJL1"&amp;REPAB5UT4''K4(EZ_R5''#&lt;0A53A;:.CWZ@+,:.^8@U$J#0U]QLS!1PDC;TQ+1;&amp;OH&gt;6&lt;@R?CFC''=*V( =]YG:\ESVS*V&amp;Z''-)]$VP;UIHI[[.%Y"F6_@,0 )TU3E!&gt;S/("0$]ODN,(?_KIN#:^8J_2UD+!*D11(IS"8L9]*U]DD&lt;5Y-/*!#''6)\?(?@R39@&lt;@PP#A5?+34Q\P;^4/0I0!&lt;E@ UQ**&gt;]G VR2OINJ64@;21(^X&lt;$&amp;7;5]LZ4(4&lt;#&amp;$RO''*\XUVBO6; J4V"F*@:@P.@PE$Y5]LZT.]]&gt;\ZF&amp;/MR9:X]PB!1]2*1&amp;*Z&amp;]NK!(&gt;6%U;6,81LA/%HJ8S H*2,]+:Z)JV5_"#T$GVC''!))FDE\CUM_W(?-=PJJE312.4%^BO2;!)?ZED4T8LPA4/8?*&gt;/+T&amp;U\''&amp;B\]0ESZ95K[UP75:P3:#)&lt;$)4+013U&lt;T)6DU''_:''B26L,$\OYF.. G@G0(Q*D!4:U)=T\10G4L*C?#S;-.E"$]P- UJ(ZH=NKD0J-2ID4''&gt;:3&amp;A_^(HS&amp;\+]-]Q''I;6D''0O8R_BX.CDP_(HUIS#C8VHQRH)9/_)V3\45*C"20D*:&amp;+S&amp;\P:^1!R&gt;_;2@^DKY^0NUVV5V@&lt;-EX= GW&lt;_&gt;=!&gt;+FLG,H&gt;?!7W4GYRU*-E&amp;9YL]THJ_@7823H:@SAS+EWV51E(N@"3_.*F1Q)^N^S$"&lt;_!OM?^""@?%@O''BG7!!^T+8P!#S%6ALW9HI]F2,5''5X!7]!G-*E6_H:=GVW8N\KW8D2&gt;1AFER@R#E,@$MH1K=^ETJ-R"P\*D8M6+[:8M?79W$!*:H6K4Q,WD3#?I%@N5-D=&amp;N&gt;=!/''&gt;Z=!-&gt;0B''AC&lt;W_@T(B60SMA&gt;A2,)4V$J(U[*BAPH0 ,G4FC9+8I"340U?J@&amp;I7+ L/WDY0\/&gt;B*_''NNZ;31M?9=_XQ7]''[L*2&gt;&lt;LMO1%&amp;11BZC2$%Q#AHOAIA0PI]0G0@W3CS''V!G88LM]@M?-I4 R;I"B/;U''&lt;V?&gt;+L87\^H;74V&lt;:6_87P]3-"X-.%CB%&gt;A,L54&amp;+9@ G $ (C9N(KIJMA=/''PDN1++[:AK&gt;FH,ORAK,''H* X?\P.@#''&lt;]*6TY&lt;=5MXA58D1&lt;3X&amp;[PQO#30@YQ-))MN#&gt;DTSMZSL7ZPV*ZN;%!V\_AOC?&lt;,B_RY9:KOOA_U^8K8#,^I;?:?DN79\LIW FN%44:3U)QK$ L=,2&lt;2]VH1#S3#QZJ&lt;C/&lt;%W:[&lt;39?F/?Z/D^USO''30%TH9J)6&gt;5ML?=,(!Y698L''Q;''D$XPW3K+:_&lt;B4?"/?1+"KHZO#S0E^A$Y!XI&amp;\%0R@_0*''%7WD+3XR2? [I[''&lt;I?2Q6HPDT"?D2F''7W.P@4=]&gt;-L!Y&lt;-7X&gt;1&lt;&amp;ZB:9?@VOXY!MSNZO#J%PLTBW&lt;"SPHU0V)&lt;%?5W@#],QD9[\^[B3&gt;DA.X.@5@TW@''?"&lt;D=K5,0%\N6O&lt;Z69F&gt;F/NNO .70B&lt;JFB''9E@V7PM?,&lt;&gt;!#Y''SW[0FP$_!*$C^MJ_O4D%P#W85''4O71W_P_#K30#8+)8@G6[86]K&amp;+\M?7\OH&gt;&amp;TSG78NA=BGC"8R/(CH*0&lt;%=#TC8P,"?FWH4BQD*A)YM!%YW,-D$J"(1?^''O&lt;GZ?.=X[?8;"UUZI"C&lt;GH&gt;@(Q6 RO @$^\_:G=S&gt;*TG0/@#*:X!I3V"596EM&amp;T.V-5\-K(9HGO89^&amp;R$N"+?0-22-&amp;XK70[8+4SC'':.H&amp;CHN54,?G2F\R$+#''62F^]$L=[;/4/G%XX_+W81^-M2=N''K4Y)VH(3@4MZO,^RLB?G=6TNX/?$F*"M+&amp;-5D N&gt;.BFAT8___;1=WVWF,H3.0#&gt;0 I C]!=:4D&amp;O6A^#35"@+F7JZOAXR%X78+/''_&amp;L??C\;AU2\L?E1O@N4/3"&amp;;A2ATUTWY)F(@X*]N''Q[8:[)G= 5TM*+3LE[KG8"?&gt;S!V2&gt;&lt;!G$YV5"M&lt;?U\(FSMI@&gt;6,J2CV#S*1]6K@U6ATI_#6]W\SNYVX:SU4DSA^8O_[E2@TS.,^X&amp;5;"K7:P809E6D,&gt;QSZ+@-@#OFJYDJ"W? 5QFT#=-Y?I$52''LKOKB[UW3$+ ^LO? A;%HW519^07''&lt;IVST]X&lt;VM:H..P/!BP5;RZD%[\"OBW8''52-&gt;Q^$N@"PD_!&amp;,HR/9MW\28 -?OA(G*O$K&lt;9_/)^&gt; Z8''?8BR*VX4#;JD''N&gt;0S:&amp;.&gt;BMIK6#TO8NW1 :HZ =G?#G796_;:J=6A-^9C()&amp;,17? 7"H^G/.)Q$I2=E/5O/(_P_NLR_*:G0CC]0QLK_''Y\E^/A^.O_"C;&lt;ZZ2=O8_A2:2N"&amp;SSQV"W_1^DM/; .7H@I";&lt;[O-T-AO3)^&lt;Q^&gt;HV''MZ].R;UT&lt;&amp;Y%:I_&gt;#^@GE_0\=TC\/PESG386SX:;_.IOWT[9,/7IU+1Q%''2+B/QK?;:.H\O0;4ETA3&lt;8@V_S60;I"+V"8)6(_*:\G*N([+[1 1&gt;Y%=!;74R)&gt;TU#L.&gt; Y118YBW;)V4!]_ ]A7F^''L#L@; 9?BA''B6A1_;2 6/.2G%3%M&amp;G\&gt;( 3,&amp;CNB^[\T85X1=9B:_76B#A30R)2@''"378M[_F''LR:8D3P_(2W#?M-PO\^0=/?*-LOO=Q@X,R&lt; ,U?@X7&lt;XBRNHM&amp;TA6)PE?\J]T8^0C6?CN+PM9?@6UNRT)?@3F0);;1L8+V?"&gt;&gt;#7DMT3!3^8X@%&lt;Z;&gt;E:#6A]W#;.HLOH?PEPGE%/%/IRT7HRT4XR:&lt;EEL:1_Y#;'',W^/0TUOST8G0*A'';U=: O"S74A8;I/HV^/J\3($RPM_N/&gt;C//1V7B:648_?A1NLOI+XK?=3GF/8P=%!I2:BO=%]1G:8-LD++8__]:_HCR_I?CS3]5&amp;AOL77&lt;Q:8&lt;_$/D-ER P''D_#D72\Z"$8W_C]/@U@\_L=GAT$][][E&gt;C=6K&lt;E[''&lt;D8=8/HPFYY5HK!):V0]67D_O9[XL\YC\$)"?B/&gt;V&gt;''CW8.5&lt;;=F !E0O_Z@;I,B5Q"''O\WACX&lt;!WGA;X#P)@DQ7LKOGEL_/HC92=,!5,U(2E!&lt;C\Z"#9&lt;^&gt;J:J@B N?.#13&lt; H(Z=XS&gt;C&amp;)3@./",=%K-P&gt;B''S5_D=&amp;L=&lt;B]W'':]_Y4/J/?S*2\-+X02&gt;,C)CY]0M?KO"'')_/Q%5:O?;N[4Q]&lt;$$DF.HB_$.)&lt;G&gt;.WW4K5G/O\WNDKD_3D]0D9)/A]EPEPIO01=XB$C\EIFF/&gt;A;8??SE"&lt;%%)V1M?&lt;(^_K ::C&amp;K?:,.(&lt;@"+)AX [])R?A]&lt;\V3!.7$BSCS86YHM2?E?^"O:^W&lt;ET"&lt;HO"S*PT;7XZ1__PTUGVF]9@HT&gt;L"-ZKU31 :&gt;6;^@(.B_Y"]@Z. +[,E73T&lt;PEUO;G&lt;,S_*+)5#''U#O''KN;7/P=@L !?;I  9I/C]EPEE0#?]?ENRT9Y WO,_2A$WIPI\0$?]\J]=O?D-7&lt;C+[&amp;V=\Q''&gt;%]^MCW1WQP@TA7&gt;&lt;^@@ @%TX:?8A?XJ/ IB.8Z_6;\M/XK;2#9;[E;3&lt;]&amp;SY9MFG;&lt;XAON''RGU\RZD-.1K#";4G7Y0]''M/LX1&amp;V=?RSVV8=;Z9$/%N 8F6W8;((@J@;&gt;^NN_%I19B\[G_0@C)''&gt;;F\LW_&gt;4A;MY]''-+%W?YI-HZ3Q1^&gt;.2]@\_CGJW&lt;@1MQ3LC;1H4P(LS_Q=PAN22S6;M6("H\MQTIR-.:/Q1^&gt;&amp;;^@(.DK"K&gt;1DWOW33C7O(558G'',(;-P_Z_\7IYQ$9 &lt;E?6*_4UVSGLGO1''&amp;=KXS?_U7L1D&lt;$CG#GG0KK!5S&gt;CCB/@@(CC9@?G\?3JQE)#=_&gt;B,P$6Z 5\9C&amp;;8J6[ JD\)&lt;#WR,IL([4M[=@N\W_8;*:&lt;0[_*+11/; M^H;G,^78$[O[B)[^1.1_Z&lt;$PG(LO9\O9CD$3C7&lt;$XY.\&gt;1-+NM/X&gt;5=B"DDX-I,-E$W(\7?NKK&amp;+AE.$7\R%]OQO?*O&amp;L?\ SH#^\MO[\]^?RG:3H&lt; I&lt;?21A:=_ G&gt;QV.I;/%M4 @O8[.*@3@:&lt;@_GSV2(T1= ;W2X6N[OD].&lt;G&amp;/WS5F13I\.Q%M22&amp;JL]_^ALE3AA5A&amp;''K8-?1L/60_J5/9%8"ZN@W3HY8VP9BZYHD?!$1TF8GP\0O3=C8 =?B&amp;,+_&gt;B:!/&amp;,3T^RT9[#WG9-=3AS8YY!7\Q7?&amp;$Y;[(T&gt;_"''7^19?A3EPD9%8$;G_C;1ST#VC,7DW/4V*3W/)&lt;(N$YQ6+15:D..\0T?ER_:4 =10-:=EXP.6YCLBN? .7$KNN70,8=YLZ0=#1G__BO6 V\3U3TJL"::D5&amp;;0AU&lt;EC"1LMFW_&gt;2YG[89*3DZE(8:_L!#[.A)!Y&gt;=GS&amp;I=].?1W3:]%SO4Y0WUIR$ V?]/P"#OF?8*[CX+/&gt;W?G*IM0)]\+N''&lt;M4U@^LL_''ZW+-N: ?"S''&lt;])^W''(J2)R,&amp;(:/+W_\@T?&lt;]\!&lt;,H?^6YGXN$U2FBU]?C]5PDX%?CSL'',1_?55;M_.S78L0%/)&lt;:9@W;@._?#INNXG+6N6[O_DA*G;BZ:&lt;Z%S!P595 GDFW6S&gt;6N&lt;&lt; _W\WV@N&gt;LZQA?I_&lt;%VD+21/&gt;B$X_[?5+"8PN.=Z;&gt;B;^PILAO#)H.G(M,1''/00^#=(QYSW8K+3MEW2%0F3Y ]'',3UM@+9&gt;K+6&amp;1I?A]3P:^JOAS@Z+=G\1''?-K3&lt;W.&gt;9Y=A5,7OF78*S-=+F363H[C"X:LFG524@81W&gt;F%5G&lt;KZ\)^7P;^DIG#E_0\%&lt;(ZO -#&gt;U;EO/N&gt;IB\E%U0J2^O".J(DSCG:*R5^]?BO&amp;\7^AEQ72, *QM&amp;4)&gt;-1K&lt;8Z_ZD!R=O7!LV?2+9:J[?X9Q\M7=Q(8D^F''K-I)68790#4LV?U5*\@EW&lt; _O(''-/%7O(.K^UD:C238:J/CA1\RP"P@?]^G6A;?E^,.[W2B@5''@61.33&lt;8Z/EJ!(&amp;N#.KY;$G5!&lt;RRK)X.B;J HX@?!RH./NQ).;C&amp;7Y#V!K[4SN/QIQ-0"R'';@-AG9*7?3=#7BN/Y7+&lt;%0+\NDW&lt;8Z_B./[?''MO&lt;-Y+Y:CUMATE7=UB$ZLIW5P6("&gt;?FS''+\$Q00LSN%K5=)5@-K6F?=SB*9&lt;" -OLZ1*ULX%.&gt;R^BFQ31YT%Z_,QI=&gt;#&amp;XA7_&amp;AQ?@[M&amp;E7]&amp;FU%5_]O:AQQ_S^&gt;J'''',JGDR^G^ !_L=@/.AO?CX&gt;!K[(6I70@DY2DWO )#L?&lt;EN6&lt;N4@7L,]\#NES7Z6XV?&lt;5Y39.9U==_];0TZ@\QWS7+37IN;C(P,?!P3:_#_L@/ !N1''_5#=BW7YQ^SSL/RPM-:T4XG?&lt;WQGB2&gt;0F\B,27_([S_&amp;B8WOJV[?9%8B/KC792L;++NT?2=)&gt;5"-Q]KP"&gt;.3*@!;=&lt;W3&amp;&gt;*19@S%6Z8=IF%)"2EO5#C:BLL%_0TZA,&amp;="K=9G3C+"100# W7QE7/AQXA9&gt;F:^7&gt;DD-L%"N4WAV0_A3W_4HW0:%2CI_8E-;S6Z6[!DR$&gt;Z W?)-%AK904&lt;&gt;L.4#.;C^^:%(F0C&lt;9702&amp;]''H&lt;ALUQ$W,7]=9$?^\9Y;BA5_]0^8+_M*\-\"YE0&gt;S/S/IFQ\#Y:=1AS&gt;5GW?=PT=,LFZ.PJ-*2@=&gt;\#/6;&amp;.^9N4?Z6UVW";!.2,BJO9US6+(9=&gt;VL?%B)Y=;F=%+&lt;\KH&lt;@F,-''^0&amp;''=_/@EB8%/&lt;4[3!(2C:7./E90/8&amp;!Y9B!?\KA^_]V3H.@NN2V$+DYWS\&gt;]\(DS%]DSCR%_0T6F15;7))OGMO#]/&gt;@)0.#.06 &lt;V''Z&lt;1]QY(1)C9# S_WQ4 ?U?!KW3Z3D-3YE&amp;&lt;T&amp;&amp;;G\A)-V3G:S1R]O;F3NV :W''AS8WGO?A ,V*)XSSLJP2&gt;*2K@ &gt;Y]NWWI4C%:HE&amp;?1CW&lt;MH"7''24:_&gt;D/09"6NF?8B("7/EU4/ B&gt;:P,= 0?9+ALH+.DKAISU9\:5RH&amp;2. K I&lt;K"^99!6C.R)7133$5&amp;1H#0TV@^6U=4'' C:5E'')_M7@]3T 1H.NGYF=$JOGD/:* .B#EO[IP="-;1Q- &gt;&gt;,\?NF#8I8:7-Y3&gt;7BY]P5^PX_!'',K HK!@:#(:B26&amp;D:;@O")NF[K-*I-4A,V9@5_@R(Z1#)Y?GA6/VZZY?@!#8T",?_3!P=@&gt;LR0FQ\#ES9QLG2%0F0.7 E$*@)QU)4W?ER8]ZJ%:G356,[L#!/8N_1 &gt;HZ +G5W&lt;@G''&gt;I:!\?Q@]./. .F#0F)9D12+ZC/46%%900^0N()?@=D*I"M&lt;@]_0\34GQ/;ZX G0D^@\_FWD)@.U=_;KA\MGJY18G5[[.4W[(]_M3!.&gt;T&amp;A7^CN#RR._;@%&lt;2JLNT@!&lt;@MW:I*+;&lt;KCIE2J''&lt;1C6(^4E04=-617EM&lt;1(-SO2!(&lt;B:5Q[4W$B2H)$U;([&gt;F:J@BU$T_@E KJ1-7$7RRJ%&gt;N=&gt;!KK-!I4E0%\J;AOMQ]."5&lt;7LF3:@7^OMUG]YU.TZ/-B53BD;,9:AAK(G''"2J!Y?\]#98L_FE[X=$/_&lt;J9/8WRM!K0_AQXGT4E66OKJ?IF;9R8HR=&amp;[2"%RT&gt;@.7&amp;%2&gt;4CC@''80C]D$E/H-ANQ1A(*P62@)M?&lt;(N_BEAXK7&lt;G]Z+8L_IN11&gt;I?.+[ B(Z/%HJ&gt;6S11YLLU^TMG:T&lt;\0@Y*''PEW0FZK3O:K&lt;5Z4B-Q''@R08)$/YR!!^@@?&gt;S_^"?W\''Z##.?N&lt;/LF2V=&lt;"&lt;,S-"\?O^P@_PLW:B+X''IY%&lt;C\0GO(@]=''CYF1_0TZBGL -$V+EX:.AI*V@?PK0/\4MT=+B-X.BSZEUT$P;LW=:N/_-Q];M9[QM3&gt;2MD_/X%UNR$Y?AQ8DP=&gt;J:0).\MO3.&lt;VD%?JI%&amp;_/@A#OJL@&lt;R#4]S1?[*@]0GL/#8\14EJ"RHY6P/8*_]52&lt;S:00MX[?&lt;''&gt;+J[$[L/G7YT,OW^"9#[M&amp;D''^&gt;&gt;&lt;!J&lt;TDB-&gt;4(X0@*; *;!GL9Z$]@T_0E&gt;]FA''-N@9&amp;&lt;,\.8E5]J[E]"LSP)V!7M:G*Z!@:B@$87,CO!-A5!O#K?0-^? ]$7\KD&amp;HG 9HSQ8YOX''X]0#+4C#%O4*59N&gt;@*\ZB?!%1&lt;\?J,\8&amp;Z&amp;L, U7"??KG,G!U,VW\?=''2GRFFCFDD&gt;J[JA=;&gt;7*]6@$&gt;MJ''8:-H?J"#7]6YX%BI;VK+!,XZS\VO@;I69 1*Y&lt;4DPJ!NMB_"KW05&lt;DXM#DO"O&lt;V(0!&gt;UQQ!G C=\/ V7;^\AG:A&lt;&gt;"R*92W&amp;I+P7-=C^\!C@,XU/"#1?89DNXB]@38''6+MMBI_!''@G2@TG6&amp;Y3ZK&lt;\;3M1;)$H%31NL@,T"DZD="^+TR/$1]@D+0I2!&lt;_7THW4TP F!OK;EHIA$?0U0BFLI&gt;AG@@.%(33YVNJD=,%NAORO @%[M*4=-Y[I4$&lt;8PCKM?X\PSTK0@:6=*0X($6@RW&lt;NBH@%NAOQO#A. +&lt;$1J5_2,V);L-9PC*E0''&amp;VW4AR*!;T1%6GC*TS,PQUX%(I_#=&lt;&lt;&gt;2]6C8^H@/]H6*^Y$OY''T\N)QNK&lt;TZ,!3 7H4]+:OX@-A9-IU(NMUP("V]HIU25&amp;XI?*C0&lt;P@_XOK&lt;^''Q?($D/F ;S^[P5]^JV\3]6)B\*=N&lt;M5I6/@JYR"&amp;O;C:RM\@#"TEZBO4G %3]NI#"5L)5VE$,32S"-_ :0&gt;*FN_\C=@G7]O[P7M:^O6US!$J0O%N@OB!&lt;/&lt;HMSJ*"^M2V=7=;\SE=7^*G-&gt;9NL41(4G*B*..(^X@]@1:GC=GQ$&gt;+A-MP%E,@Q?PO"8 U=W0^QE#ZQV&gt;N#)ND''G(WR/988$678Z6MRS"G%S7S1[X1-PJZU$&gt;-H%!J(3=PBMK(PJ%&gt;B''&lt;3+=&lt;L.''S:I:;-P4?D!''E8]7;&lt;E1GHA.3V[5"$]OCE((X\ QPR,^OWD@JZ8CDW\\!&lt;M/;:V/J3OL6:XJQ43BPYS ''6[8P-^(V]2XZN)M0.?+:.K067.S&lt;DT\JZ8[B#;$^@J$-O7&amp;6,&lt;)HSXAP&amp;*R!(TK*Z#M?,BS![B;DWY_9$IJ&lt;L\L_+B.$*)9T=J5_XB^= 9Z=&gt;5K#_)QP*''5*19._6S(EDY0@HA-F6)/P,$GP_$PTML4''])Y,?+MG!INCN1.,FL%&gt;FL@73&gt;)#L*YM^%F''%QZ;\7M"SI_@X 80+%5=\[6Q0^''$MFHC B0__6T]P*5FZ DBEYVLGW&gt;O@I%@5[_\$200""+K3G./ P?X1O4@&gt;(V//S)!N(*BSUT8Z,H$J5(NL21?P^2Z?/]@''G=*$7GQ52 JB&lt;G FSETKHY0WIH/@)VM]QSN:LI7^&lt;_DE.AX:F,JM &amp;2#YQ#(U2EC!NB_80\XV.HSRA9-OQP7:L\#?&gt;:+I$_79?WEX,Q//AP7R5-&amp;W[-UM3.C9W&amp;S=P^S,@0H.73@)T6NE/ ; K%@&lt;R#%A]W4?U-G(B9^U.$".)PDU;^&gt;$:6$Y''V1Y8QA3TO?U(Y]=Y&lt;5A37$NOWC%@R-/W521RR''8_0YWY8_:2DAV5-XR**0!TU"K%2ANOR!)Y#.LP;^8&amp;4-%ES7,;,_B@8V2JKTH8W565*\O5-N^BGBB%[^.''''"&gt;D.%,)]QTCW"&amp;E$A AO;9PBM7''P&gt;(RJSVD5GJ$U!J@\&amp;0\1&lt;Z1GJ18''G $ !&amp;M(PY?''MHQP#2-%K!7=ZY#V0/M+2 GRN''MF6.''N[)X#&gt;A:XC''93C$,*Q@90D8T&amp;:V%M*5&lt;+K7(2XZ^NDB6-&amp;9(+MFU^Y%B+QX0W0''&amp;@3T(2$&amp;&gt;QYP4(+*SD7X:!FJ? /4B,\4R1$/IHW2^:_&lt;C0([4,2/7O1 @@@@@RTUNQJ9BXHHb'</body>

<body package="SeasideLearningCenter-Core" selector="homeGif">homeGif
	^ ByteArray fromPackedString:
'Q4%FNC%!F @Y@O\@L_??????????=???=??7=??7=??/^??/\??/Z??''Z??''X??^P/?VN__7=?_7;?_7;?_/;?_''\?_''Z?_''X?_''X?_^Z?_^X?_^V/_^V/_VT/_VR/_VP/_VP/_VN__VL__NL__NL^?7?&gt;?7?&gt;?/;&gt;?/9&gt;?''9&gt;?^Z&gt;?VX&gt;?NV.?NR.?NN^?FN^?FL^?FJ^&gt;=J^&gt;=H^&gt;=H^_7=&gt;_/=&gt;_/=&gt;_/;&gt;_'';&gt;_''9&gt;_NX&gt;^=H^^=H];^9=;^7-;^7-;FV-;FV-:=T-['';=[^;=[^9=[V7-[V5-[V3-[N3-[N3-[N1-Z=T-Z=T,;^;&lt;;V7,;V5,;N5,;N1,;F1,;F/\[^;&lt;[V9&lt;[V9&lt;[N5,[N3,[F3,[F3,[F/\[F-\Z=/\Z=-\Z%P,Z%P+7V9;7N9;7N7+7F5+6=3+6=3+6=1+6=-[65-[65-[65+[6-''K6\N[6TN[WN7+WF5+WF3+V=3+V=3+V=1+V=1+V5/[V5+[V-''KV-''KV\!KV\!KVTN[VTNZ65/Z6-/Z6-/Z6-+Z6%''J6%%J6\#J6\!J6LLZ6DLZ6DLZV=5*V=3*V=3*V51*V51*V-/ZV--ZV%-ZVT!JVT^:VLZ:U;LY2-1)2-/Y2%-Y2%+Y2\)Y2T%I2T%I2L^92L^92DX92DX913HYR%1)R%-YR%-YR\+YR\)YRL!IQ;Z9Q3P)Q+HYQ#HX2\/X2\+X2\+X2T)X2T''H2T''H1+NX1+NX1#HX1#FH1#FHR\/XR\-XRT-XRL)XRL''HRL%HRD%HQ;^8Q;\8Q;\8Q3T(Q3T(Q+P(QZHXQZHXQZFHQZDG/N?7/N?7.L+W.L+W.D''G.D''G.D%G.D#G-;#G-;#G-;^7-3X7-+R''-+R''-#T''-ZLW-ZJW-RDG-RDGN=;7N=;7M;%GM;!GM#T&amp;-;%F-3%F-+\6-#Z6-ZP&amp;-RLV-JHV-JHV-BBF-BBFM3%FM3%FM3!FM+^6M+\6M#\6M#\6MBFE)#Z5)#Z5(9DEJ-7%IZX5H9DEH1BEH1BD*\3$*\3$)RV$)JT$)JT#%BP#D1NSD1NP@@@B0@@@@@F @Y@@@H?0BKFCD"$NC@   OJ#Q(,D T!6*,VW,%JUH$MV(\D(224^CC!4X 2TI 8L^OMV,&lt;''R(G:ZGCH"&lt;[E(E42(RAE@,.(K!08T^5\(A\\!PXD&lt;&lt;)$"*R.''B!8$Z,U,?*)REX\N!LS0 PLECJ5DP,T)X(\R(7]N!@OHPL&amp;EB1]Z$JD8QJT_+S!5H4]5D&gt;0(P$2\RE+T+_+(%F2\2X,G3B/[IZYE!VER4".6#Q&lt;1W]LD2X=NGCQ90/$D&lt;$2[)!X(FJ)RY.UJN+8186A6?F#DET+&gt;W@I&gt;B,+SE!@*]WPFNJ@IEWCLBHI6&gt;L_J,WUFB:X=M"?Z @E=J[I2MB#IC!X@^@GVF:Q_&lt;CQCP])VOI*!D")N&amp;I$1D;Q,@_8P@B@A7_&gt;JPQ&gt;JR[#DN**MHLMD9 Q9&lt;CC(1 !@L@2@A@M6%0YDPT?(DQ1"R))JIC_ABL@H8&gt;?_PC@HLO?/DRD=&lt;@&lt;\TWXBBR"''32@\BOO/+0@4@HM78SHUG&gt;+Q#F#?IA$J@&gt;;;2#38 @OL#GP4&lt;&lt;&lt;\4RN''3181/FHS!BO-=&lt;\&gt;RHHTA(E"W)KKGD#6E(Q1&lt;@&lt;3SS3C1II)&amp;_Q!MR4,4XX8ZA(I@! ILNJV0:8JBWLC64AR[]/CE&amp;%_Q= 0,.8BP9 !LPM$''PD7''=4P4%SES)I#OI)JMJM&lt;&gt;),.MATS1!!*VT@FDDH)\$4&lt;41+U /\,$_Y*S1Q1)OSA S)VZ$4&lt;01%&lt;1:Z1))&amp;FF,FW%Q-QE?TV1A[KGF%"))+)IFDQ@@N0@a'</body>

<body package="SeasideLearningCenter-Core" selector="nextGif">nextGif
	^ ByteArray fromPackedString:
'Q4%FNC%!FP@Z@O\@L_???&gt;??5.??5._?5._?5-;?3-;?3-;?3-[?1-[?1-[V3-[V3-[N1-[N1-[N1,;?/\;?/\;7/\;7/\;N1,;N1,;F/\;F/\[?/\[?/\[?-\[?-\[N/\[N/\[N/\[F/\[F/\[F-\[F-\Z=/\Z=/\Z=-\Z=-[7?+[7?+[7N-[7N-[6=-[6=-[65+[65+[W?+[W?+[W?)[W?)[WF+[WF+[V5+[V5+Z65)Z65)ZW?''JW?''JW7''JW7''JW/''JW/''JV=''JV=''JV=''I3?%I3?%I3?#I3?#I37#I37#I3/%I3/%I3/%IS?^9S?^9S7#IS7#IS7!IS7!IR-#IR-#H3?^83?^83?\83?\837^837^837\837\83/!H3/!H3/^83/^8S?^8S?^8S?\8S?\8S7^8S7^8S7\8S7\8S/\8S/\8SV^8SV^8R5^8R5^7/?\7/?\7/?Z7/?Z7/?Z7/7\7/7\7/7Z7/7Z7/7Z7.5\7.5\7.5\7O7Z7O7Z7O7X7O7X7O/Z7O/Z7O/X7O/X7O''Z7O''Z7O''X7O''X7O''V''O''V''O^Z7O^Z7N-Z7N-Z7N%Z7N%Z6/7Z6/7Z6/7X6/7X6//X6//X6/''V&amp;/''V&amp;/^V&amp;/^V&amp;/^T&amp;/^T&amp;O7X6O7X6O/V&amp;O/V&amp;O''V&amp;O''V&amp;O^T&amp;O^T&amp;OVV&amp;OVV&amp;OVT&amp;OVT&amp;OFV&amp;OFV&amp;N-V&amp;N-V&amp;N%X6N%X5+7V%+7V%+/R%+/R%+/R%+VT%+VT%+VR%+VR%+NT%+NT%+NR%+NR%*%T%*%T%*%T%K/R%K/R%K^R%K^R%KVR%KVR%KNR%KNR%KNP%KNP%KNP%J5R%J5R$+VP$+VP$+NP$+NP$+FP$+FP$*=P$*=P$*%P$*%P$*%P$J\P$J\P#''^NS''^NS&amp;=LS&amp;=LS&amp;-LS&amp;-LS&amp;-LSGFJSGFJSF%LSF%LR&amp;%HR&amp;%HRGVHRGVHRGVHRF-HRF-HRF\HRF\HRF\FBF\FBFTHRFTHQ"5FA"5FA"TDA"TDAB%DAB%DABTDABTD@"%B@"%B@"%B@"TB@"TB@B\@@B\@@BT@@BT@@BT@@@@@B0@@@@@FP@Z@@@H?0@ULF@ $NC@   OJ#Q(\HI@!01$OI3H@BID !LFY%RPDY&lt;]#Q!A\!SI,BJ&gt;]:\\Y#P8$.CC""DY8G-0[%*E%2,59''1)L$@AV.&lt;*[LP(TDGQ(RO1ESAQHAT&gt;G24+E)PJ\:WRO$LJ(OF(\Z(B_N&amp;2"Q4+-$B_O&amp;0^GG&amp;WB&amp;GFB#L_EI!K-&lt;@CK&amp;8"QSI1IM.4#A,''3A3R!8.T07"9MN+SZMJ$HT^.''QN*\RXW09#]JG[S^AH,V8]8NG/''@2H&gt;G$+N\.''#)''T_19U$6UJ&amp;#MXQV/#^8#OA)YBTRUKN="%T*S"-6,9,Z\F-0.RQ,9O\QB=^7IZ-3&lt;)J\[''6C$)30TN8QJCBN;3O(^J_Y1?*@&gt;:\CQD"SGI!P5?K9\I\+L=F@2/^MAX*"O@PO PVZFA&gt;-TVBCC:)*JCBR &gt;1HJDMD;J@32R5SWHM ?AU@IIND8RX$P#8JC!IN?!@@Q= QP4D48_8HMMJO^:1TLEMG;;8(VC"8INMCR(HUQADQ%W%X$_88NI "CC!MMRQ@3DH(H9TLQQXP22,:BIGK2T44)AEP-''RR@DA@C,b'</body>

<body package="SeasideLearningCenter-Core" selector="niftyJs">niftyJs
	^ '
function NiftyCheck(){
if(!document.getElementById || !document.createElement)
    return(false);
var b=navigator.userAgent.toLowerCase();
if(b.indexOf("msie 5")&gt;0 &amp;&amp; b.indexOf("opera")==-1)
    return(false);
return(true);
}

function Rounded(selector,bk,color,size){
var i;
var v=getElementsBySelector(selector);
var l=v.length;
for(i=0;i&lt;l;i++){
    AddTop(v[i],bk,color,size);
    AddBottom(v[i],bk,color,size);
    }
}

function RoundedTop(selector,bk,color,size){
var i;
var v=getElementsBySelector(selector);
for(i=0;i&lt;v.length;i++)
    AddTop(v[i],bk,color,size);
}

function RoundedBottom(selector,bk,color,size){
var i;
var v=getElementsBySelector(selector);
for(i=0;i&lt;v.length;i++)
    AddBottom(v[i],bk,color,size);
}

function AddTop(el,bk,color,size){
var i;
var d=document.createElement("b");
var cn="r";
var lim=4;
if(size &amp;&amp; size=="small"){ cn="rs"; lim=2}
d.className="rtop";
d.style.backgroundColor=bk;
for(i=1;i&lt;=lim;i++){
    var x=document.createElement("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    d.appendChild(x);
    }
el.insertBefore(d,el.firstChild);
}

function AddBottom(el,bk,color,size){
var i;
var d=document.createElement("b");
var cn="r";
var lim=4;
if(size &amp;&amp; size=="small"){ cn="rs"; lim=2}
d.className="rbottom";
d.style.backgroundColor=bk;
for(i=lim;i&gt;0;i--){
    var x=document.createElement("b");
    x.className=cn + i;
    x.style.backgroundColor=color;
    d.appendChild(x);
    }
el.appendChild(d,el.firstChild);
}

function getElementsBySelector(selector){
var i;
var s=[];
var selid="";
var selclass="";
var tag=selector;
var objlist=[];
if(selector.indexOf(" ")&gt;0){  //descendant selector like "tag#id tag"
    s=selector.split(" ");
    var fs=s[0].split("#");
    if(fs.length==1) return(objlist);
    return(document.getElementById(fs[1]).getElementsByTagName(s[1]));
    }
if(selector.indexOf("#")&gt;0){ //id selector like "tag#id"
    s=selector.split("#");
    tag=s[0];
    selid=s[1];
    }
if(selid!=""){
    objlist.push(document.getElementById(selid));
    return(objlist);
    }
if(selector.indexOf(".")&gt;0){  //class selector like "tag.class"
    s=selector.split(".");
    tag=s[0];
    selclass=s[1];
    }
var v=document.getElementsByTagName(tag);  // tag selector like "tag"
if(selclass=="")
    return(v);
for(i=0;i&lt;v.length;i++){
    if(v[i].className==selclass){
        objlist.push(v[i]);
        }
    }
return(objlist);
}
'</body>

<body package="SeasideLearningCenter-Core" selector="previousGif">previousGif
	^ ByteArray fromPackedString:
'Q4%FNC%!FP@Y@O\@L_???&gt;_?5._?5-;?3-;?3-;?1-;?1-;?1-[?1-[?1-[?/][?/][V3-[V3-[N1-[N1-[N1,;?/\;?/\;7-\;7-\;N1,;N1,[?-\[?-\[?+\[?+\[N/\[N/\[F/\[F/\Z=-\Z=-[7?-[7?-[7?+[7?+[77+[77+[7F-[7F-[6=-[6=-[65+[65+[W?+[W?+[W?)[W?)[W?''KW?''KW/)[W/)[V5+[V5+[V5+Z7?)Z7?)Z7?''J7?''J7?%J7?%J7/''J7/''J7F)Z7F)ZW?''JW?''JW?#JW?#JV=''JV=''I3?!I3?!I3?^93?^937#I37#I37!I37!IS?!IS?!IS?^9S?^9S?^9S7!IS7!IS7^9S7^9R=#IR=#H37!H37!H37^837^837\837\83V!H3V!H25!H25!HS7^8S7^8S7\8S7\8S7Z8S7Z8S/^8S/^8S/Z8S/Z8R5^8R5^8R5^7/7Z7/7Z7/7Z7//^7//^7//\7//\7//Z7//Z7//Z7O/Z7O/Z7O/X7O/X7O''X7O''X7OVX7OVX7N5\7N5\7N5Z7N5Z6//Z6//Z6//X6//X6//V&amp;//V&amp;/''V&amp;/''V&amp;/^V&amp;/^V&amp;/VX6/VX6/FX6/FX6.-X6.-X6O/V&amp;O/V&amp;O''X6O''X6O^V&amp;O^V&amp;O^T&amp;O^T&amp;OVV&amp;OVV&amp;OVT&amp;OVT&amp;N-V&amp;N-V&amp;N-V%+/V%+/V%+/T%+/T%+''T%+''T%+^T%+^T%+VT%+VT%+VR%+VR%+NT%+NT%K''T%K''T%KVR%KVR%KNR%KNR%KNP%KNP%J=R%J=R%J=R%J5R%J5R%J%R%J%R$+''R$+''R$+''R$+''P$+''P$+NP$+NP$+FP$+FP$*%P$*%P$K''NTK''NTJ=NTJ=NTJ5NTJ5NS''FLS''FLS''FLSF%LSF%LSF\LSF\LSF\LR&amp;-JR&amp;-JR&amp;%JR&amp;%JR&amp;\JR&amp;\JR&amp;\HR&amp;\HRGVFBGVFBF\HRF\HQ"5FA"5FA"%FA"%FA"\FA"\FA"TFA"TFA"TFAB\DAB\DABTDABTD@"-B@"-B@"TB@"TB@B\@@B\@@BT@@BT@@BT@@@@@B0@@@@@FP@Y@@@H?0@YNG@ $NC@   OJ#SH(@IA!04_@+G$,HI@"080G''RX&lt;ZDCP&gt;GZ)^BH$VSD# T7BMNV@]&gt;JCPUQL&amp;S(\DN8W LB.IS)\VAG#$C0$P(0X8CK"!%OL!CH-DHV_FDF1E"#8J!O''2^QF&amp;+''P8DOIV,"8A-K]&amp;0;[Q@MM.,6P0FRMF/ZJH 0H&lt;JH.2M0#LC70Z]M[A%&amp;JA''\Y 7XMWTD9TD$*X8O%0JA-N,U8^,Z067Z9L''C"MF)U*6HR]I!-Y6 DT J =V&lt;&amp;AF"U)=[IY.5YZ^C])Q"+L:&lt;&amp;SL"RJ5&amp;9T+VZ1ZR(01V-LO&amp;H7U/3(0 9YIN_GZ]''QYS!N.6A(%"QMD%PYPZC6&amp;V&lt;E''WU5",6F2](B7 Y4EB''J]N[4Q9HM''&gt;ZP''_*SVP1IIKF6VU5T88:!''$41/8QIM_K(28-LJDED:X $\$FXGON-F]8-IHG5QPPX "2%QPAR&amp;4X4&lt;,311E4$@\0W#RPA,4 4&lt;:U+4H(8II0[ AJVL%^IFBR5U4TUZD-JL^Q1FUQNQUO''40T(=T2, $T%C2YEE@@C,b'</body>

<body package="SeasideLearningCenter-Core" selector="styleCss">styleCss
	^ '
body {
	font-size: 90%;
}
.demo-titlebar {
	background-color: #d4d0c8; 
	padding-top: 3px;
	margin-bottom: 1em;
}
.demo-button {
	display: inline;
	height: 20px;
	padding-left: 10px;
}
.demo-button a:hover {
	cursor: pointer;
}
.demo-title {
	display: block;
	padding-left: 20%;
	width: 50%;
	margin-top: -20px;
	padding-bottom: 1em;
}
.demo-content {
	width: 80%;
	margin: auto;
	clear: both;
	padding: 15px;
	overflow: auto;
	scroll: auto;
}
.demo-spacer {
	height: 2em;
}
.demo-content fieldset {
	background-color: white;
	min-height: 250px;
	min-width: 700px;
	padding: 0 0 2em 5em;
}
'</body>

<body package="SeasideLearningCenter-Core" selector="tableCss">tableCss
	^ '
/* Nifty corners */
.rtop, .rbottom {
	display: block;
}
.rtop *, .rbottom * {display: block; height: 1px; overflow: hidden}
.r1 {margin: 0 5px}
.r2 {margin: 0 3px}
.r3 {margin: 0 2px}
.r4 {margin: 0 1px; height: 2px}

.rs1 {margin: 0 20px}
.rs2 {margin: 0 1px}

/* Table container */
div.scrollableTable {
	width: 100%; 
	border: 1px solid #aaa; 
	clear: both;
	overflow: auto; 
}
/* Reset overflow value to hidden for all non-IE browsers. */
html&gt;body div.scrollableTable  {
	overflow: hidden;  
	width: 100%;
}

/* Table */
table.scrollTable {
	border-collapse: collapse;
}
/* define width of table. IE browsers only                 */
div.scrollableTable table.scrollTable {
	width: 95%
}
/* define width of table. Add 16px to width for scrollbar.           */
/* All other non-IE browsers.                                        */
html&gt;body div.scrollableTable  table.scrollTable {
	width: 100%
}

/* Table header */
table.scrollTable thead.fixedHeader {
	display: block;
	width: 100%;
}
/* set table header to a fixed position. WinIE 6.x only                                       */
/* In WinIE 6.x, any element with a position property set to relative and is a child of       */
/* an element that has an overflow property set, the relative value translates into fixed.    */
/* Ex: parent element DIV with a class of tableContainer has an overflow property set to auto */
table.scrollTable thead.fixedHeader tr {
	position: relative;
}

/* set THEAD element to have block level attributes. All other non-IE browsers            */
/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */
html&gt;body table.scrollTable  thead.fixedHeader tr {
	background: #aaa;
	display: block; 
	width: 100%;
}

/* Table header cells */
table.scrollTable thead.fixedHeader th {
	background: #aaa;
	padding: 4px 3px;
	text-align: left;
	color: #eef;
}
/* Table body, scrollable */
table.scrollTable tbody.scrollContent {
	display: block;
	height: 300px;
	overflow-y: scroll; 
	overflow-x: hidden; 
}
/* define the table content to be scrollable                                              */
/* set TBODY element to have block level attributes. All other non-IE browsers            */
/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */
/* induced side effect is that child TDs no longer accept width: auto                     */
html&gt;body table.scrollTable tbody.scrollContent {
	display: block; 
	height: 300px;
	overflow: auto;  
	width: 100%
}
/* Table body rows, alternate colors */
table.scrollTable tbody.scrollContent tr.even {
	background-color: #f5ffe9;
}
table.scrollTable tbody.scrollContent  tr.odd {
	background-color: #c0f4f4;
}
/* Table body cells */
table.scrollTable tbody.scrollContent  td {
	vertical-align: top;
	padding-right: 1em;
	padding-top: 0.5em;
	padding-bottom: 0.5em;
}
'</body>
</methods>

<methods>
<class-id>Seaside.SULearningCenterLibrary class</class-id> <category>class initialization</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	self register</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous</class-id> <category>demos</category>

<body package="SeasideLearningCenter-Core" selector="demo001">demo001
	^(SULearningElement new)
		title: 'Shake this';
		snippet: 'html effect shake';
		sample: 'html div
	script: (&lt;1s&gt;);
	with: ''Shaked when page is refreshed''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo002">demo002
	^(SULearningElement new)
		title: 'Shake id';
		snippet: 'html effect
	id: ''shaked-div'';
	shake';
		sample: 'html div
	id: ''shaked-div'';
	with: ''Shaked when anchor is clicked''.
html anchor
	onClick: (&lt;1s&gt;);
	with: ''Click to shake it''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo003">demo003
	^(SULearningElement new)
		title: 'Pulsate id';
		snippet: 'html effect 
	id: ''pulsated-box''; 
	pulsate;
	pulses: 5';
		sample: 'html div
	id: ''pulsated-box'';
	with: ''Pulsated div when button clicked''.
html submitButton
	onClick: (&lt;1s&gt;);
	text: ''Click to pulsate it''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo004">demo004
	^(SULearningElement new)
		title: 'Updater';
		snippet: 'html updater
	id: ''access-mode'';
	callback: [:r | r render: ''Administrator'']';
		sample: 'html span
	id: ''access-mode'';
	with: ''Normal''.
html break.
html submitButton
	onClick: (&lt;1s&gt;);
	text: ''Administrator mode''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo005">demo005
	^(SULearningElement new)
		title: 'Request';
		snippet: 'html request
	callback: [Transcript cr; show: ''Hello world'']';
		sample: 'html div
	onClick: (&lt;1s&gt;);
	with: ''Click me''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo006">demo006
	^(SULearningElement new)
		title: 'Request with trigger';
		snippet: 'html request
	triggerForm: ''input-form'';
	callback: [Transcript cr; show: data]';
		sample: 'html form
	id: ''input-form'';
	with: [html textInput 
			value: data; 
			callback: [:v | data := v]].
html anchor
	onClick: (&lt;1s&gt;);
	text: ''Submit''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo007">demo007
	^(SULearningElement new)
		title: 'Evaluator';
		snippet: 'html evaluator
	callback: [:script |
	script element id: ''smalltalk'';
	    render: ''Smalltalk everywhere''.
	script element id: ''clickable'';
	    remove]';
		sample: 'html div
	id: ''smalltalk'';
	with: ''Smalltalk in Frankfurt''.
html div
	id: ''clickable'';
	onClick: (&lt;1s&gt;);
	with: ''Click me''.
';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo008">demo008
	^(SULearningElement new)
		title: 'Evaluator with HTML';
		snippet: 'html evaluator
	callback: [:script |
	    script element id: ''smalltalk'';
	        render: 
	            [:r |
	            r anchor newTarget
	                url: ''http://www.cincomsmalltalk.com''; 
	                text: ''Smalltalk everywhere'']]';
		sample: 'html div
	id: ''smalltalk'';
	with: ''Smalltalk in Frankfurt''.
html div
	id: ''clickable'';
	onClick: (&lt;1s&gt;);
	with: ''Click me''.
';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo009">demo009
	^(SULearningElement new)
		title: 'Evaluator with effect';
		snippet: 'html evaluator
	callback: [:script |
	    script element id: ''smalltalk'';
	        render: [:r |
	            r strong: ''Smalltalk everywhere''].
	    script effect id: ''clickable'';
	        shake]';
		sample: 'html div
	id: ''smalltalk'';
	with: ''Smalltalk in Frankfurt''.
html div
	id: ''clickable'';
	onClick: (&lt;1s&gt;);
	with: ''Click me''.
';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo010">demo010
	^(SULearningElement new)
		title: 'Evaluator with morph';
		snippet: 'html evaluator
	callback: [:script |
	    script element id: ''smalltalk'';
	        render: [:r |
	            r strong: ''Smalltalk everywhere''].
	    script effect morph
	        id: ''smalltalk'';
	        style: ''font-size: 42pt; margin-left: -2em; margin-top: -5em'']';
		sample: 'html div
	id: ''smalltalk'';
	with: ''Smalltalk in Frankfurt''.
html div
	id: ''clickable'';
	onClick: (&lt;1s&gt;);
	with: ''Click me''.
';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo011">demo011
	^(SULearningElement new)
		title: 'Evaluator with condition';
		snippet: 'html evaluator
	callback: [:script | | statements |
	    script element id: ''access-mode''; 
	        addClassName: ''was-admin'';
	        condition: (SUElement new id: ''access-mode''; hasClassName: ''admin'').
	    statements := SUScript new.
	    statements element id: ''access-mode''; 
	        render: ''Administrator''.
	    statements element id: ''access-mode''; 
	        addClassName: ''admin''.
	    statements not: (SUElement new id: ''access-mode''; hasClassName: ''was-admin'').
	    script add: statements.
	    statements := SUScript new.
	    statements element id: ''access-mode''; 
	        render: ''Normal''.
	    statements element id: ''access-mode''; 
	        removeClassName: ''admin''.
	    statements condition: (SUElement new id: ''access-mode''; hasClassName: ''was-admin'').
	    script add: statements.
	    script element id: ''access-mode''; 
	        removeClassName: ''was-admin''.
]';
		sample: 'html span
	id: ''access-mode'';
	with: ''Normal''.
html break.
html submitButton
	onClick: (&lt;1s&gt;);
	text: ''Change mode''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo012">demo012
	^(SULearningElement new)
		title: 'Slider';
		snippet: 'html slider
	handleId: ''handle'';
	trackId: ''track'';
	value: data;
	range: (0 to: 100);
	onChange: (html updater
	    id: ''position'';
	    triggerSliderCallback: [ :v | data := v asInteger ];
	    callback: [ :r | r render: data ])';
		initializer: [self data: 50];
		sample: '
	html div id: ''track''; with: [ html div id: ''handle'' ].
	html paragraph id: ''position''; with: data.
	html script: (&lt;1s&gt;)';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	^(OrderedCollection new)
		add: self demo001;
		add: self demo002;
		add: self demo003;
		add: self demo005;
		add: self demo006;
		add: self demo004;
		add: self demo007;
		add: self demo008;
		add: self demo009;
		add: self demo010;
		add: self demo011;
		add: self demo012;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="genericStyle">genericStyle
	^super genericStyle , '
#js-script {
	padding: 1em;
	background-color: #f5ffe9;
	border: 1px dashed #888;
	word-wrap: break-word;
	margin-top: 10px;
}
'</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoOn:">renderDemoOn: html

	html div id: 'track'; with: [ html div id: 'handle' ].
	html paragraph id: 'position'; with: data.
	html script: (html slider
		handleId: 'handle';
		trackId: 'track';
		value: data;
		range: (0 to: 100);
		onChange: (html updater
		    id: 'position';
		    triggerSliderCallback: [ :v | data := v asInteger ];
		    callback: [ :r | r render: data ]))</body>

<body package="SeasideLearningCenter-Core" selector="renderGeneratedOn:">renderGeneratedOn: html 
	generatedText isNil ifTrue: [^nil].
	super renderGeneratedOn: html.
	(html div)
		id: self idForScript;
		with: 
				[html text: generatedText.
				generatedScript notNil 
					ifTrue: 
						[html
							break;
							break.
						html text: generatedScript]].</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous</class-id> <category>ids</category>

<body package="SeasideLearningCenter-Core" selector="idForScript">idForScript
	^'js-script'</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous</class-id> <category>services</category>

<body package="SeasideLearningCenter-Core" selector="elementsToHide">elementsToHide
	^Array with: self idForSample with: self idForDemo with: self idForScript</body>

<body package="SeasideLearningCenter-Core" selector="internalScript">internalScript
	| aStream result depth char |
	aStream := demoText readStream.
	result := String new writeStream.
	depth := 0.
	[aStream atEnd] whileFalse: 
			[char := aStream next.
			char == $[ ifTrue: [depth := depth + 1].
			depth &gt; 0 ifTrue: [result nextPut: char].
			char == $] ifTrue: [depth := depth - 1]].
	^result contents</body>

<body package="SeasideLearningCenter-Core" selector="style">style
	^'
div#track {
	width: 200px; height: 11px;
	border: 1px solid black;
	background-color: #eee;
}
div#handle {
	width: 3px; height: 10px;
	border: 1px solid black;
	background-color: red;
	cursor: move;
}
'.</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Core" selector="generate">generate
	"Assume success"

	| sourceCode scriptText aStream methodText |
	selectedDemo actualSnippet: demoText.
	methodText := selectedDemo actualSample.
	sourceCode := '[:html | ' , demoText , ']'.
	generatedText := [(self compile: sourceCode) value: renderer] on: Error
				do: 
					[:ex | 
					methodText := String new.
					ex description].
	scriptText := self internalScript.
	generatedScript := (scriptText notEmpty 
				and: [(scriptText copyFrom: 1 to: 8) = '[:script']) 
					ifTrue: 
						[scriptRenderer initialize setCanvas: renderer.
						
						[(self compile: scriptText) value: scriptRenderer.
						aStream := String new writeStream.
						scriptRenderer printContentOn: aStream.
						aStream contents] 
								on: Error
								do: 
									[:ex | 
									methodText := String new.
									ex description]]
					ifFalse: [nil].
	self addDemoMethodUsing: methodText</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'Scriptaculous Javascript generation Workspace'</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SULearningScriptaculous class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SULearningRSS</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	(html div)
		id: #icon;
		with: 
				[(html anchor)
					url: ((WAUrl new addToPath: WADispatcher default basePath)
								addToPath: '/changes.rss';
								yourself);
					newTarget;
					with: 
							[(html image)
								width: 25 px;
								url: (self resources addToPath: 'feedicon.png')]].
	(html div)
		id: #desc;
		with: 
				[html strong: 'Recent changes made to this VisualWorks image'.
				(html div)
					id: #source;
					with: 
							[(html anchor)
								callback: 
										[self call: ((SUFullClassBrowser fullOnClass: RRChangesDemo
													selector: #renderContentOn:)
													addDecoration: ((WAWindowDecoration new)
																title: 'RRChangesDemo';
																yourself);
													yourself)];
								text: 'View source']]</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="style">style
	^'
div#icon {
	float: left;
}
div#desc {
	margin-left: 5em;
	float: left;
}
div#source {
	margin-top: 2em;
	font-size: 80%;
}
'</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: anHtmlRoot 
	| entryPoints |
	super updateRoot: anHtmlRoot.
	entryPoints := WADispatcher default genuineEntryPoints select: [:each | each isFeed].
	entryPoints do: [:each | anHtmlRoot linkToRss: each basePath title: each description ]</body>
</methods>

<methods>
<class-id>Seaside.SULearningRSS</class-id> <category>initialize</category>

<body package="SeasideLearningCenter-Core" selector="children">children
	^Array with: feed</body>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	feed := RRChangesDemo new.</body>
</methods>

<methods>
<class-id>Seaside.SULearningRSS</class-id> <category>accessing-url</category>

<body package="SeasideLearningCenter-Core" selector="resources">resources
	^ WAUrl new addToPath: WADispatcher default basePath , '/files/SULearningCenterLibrary/'</body>
</methods>

<methods>
<class-id>Seaside.SULearningRSS class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'RSS demo, feed and anchor'</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#RSS</body>
</methods>

<methods>
<class-id>Seaside.SULearningRSS class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUPermissiveBrowser</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Browser" selector="component">component
	^ component</body>

<body package="SeasideLearningCenter-Browser" selector="component:">component: anObject
	component := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="systemNavigation">systemNavigation</body>
</methods>

<methods>
<class-id>Seaside.SUPermissiveBrowser</class-id> <category>confirm</category>

<body package="SeasideLearningCenter-Browser" selector="confirm:">confirm: aString
	^self component confirm: aString</body>

<body package="SeasideLearningCenter-Browser" selector="confirmRemovalOf:on:">confirmRemovalOf: aSelector on: aClass
	^1</body>

<body package="SeasideLearningCenter-Browser" selector="request:initialAnswer:">request: aString initialAnswer: anotherString
	^self component request: aString default: anotherString</body>
</methods>

<methods>
<class-id>Seaside.SUUnknownVariable</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Browser" selector="messageText">messageText
	"Return an exception's message text."

	^'Undefined variable ' , varName printString</body>

<body package="SeasideLearningCenter-Browser" selector="varName">varName
	"Answer the value of varName"

	^ varName</body>

<body package="SeasideLearningCenter-Browser" selector="varName:">varName: anObject
	"Set the value of varName"

	varName := anObject</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepDecoration</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	self renderTitleBarOn: html.
	self renderDemoContentOn: html</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoContentOn:">renderDemoContentOn: html 
	(html div)
		class: 'demo-content';
		with: 
				[(html fieldSet)
					legend: self component class name;
					with: 
							[html div: [(html div)
								class: 'demo-spacer';
								with: ''.
							self renderOwnerOn: html]]]</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="renderTitleOn:">renderTitleOn: html 
	html text: self component class description</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: aHtmlRoot
	super updateRoot: aHtmlRoot.
	aHtmlRoot title: 'Cincom Smalltalk User Conference - Frankfurt 2006'.
	aHtmlRoot stylesheet url: (self scriptaculousResources addToPath: 'style.css').
	aHtmlRoot stylesheet url: (self resources addToPath: 'style.css').
	(self component class libraries select:
		[ :library | library notNil and:
			[ (self application libraries includes: library) not ] ] )
		do: [ :library | library updateRoot: aHtmlRoot ]</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepDecoration</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Core" selector="browse">browse
	^self component 
		call: ((SUFullClassBrowser fullOnClass: self component class
				selector: #renderContentOn:)
				addDecoration: ((WAWindowDecoration new)
							title: self component class name;
							yourself);
				yourself)</body>

<body package="SeasideLearningCenter-Core" selector="exit">exit
	^self component answer: #exit</body>

<body package="SeasideLearningCenter-Core" selector="home">home
	^self component answer: #home</body>

<body package="SeasideLearningCenter-Core" selector="next">next
	^self component answer: #next</body>

<body package="SeasideLearningCenter-Core" selector="previous">previous
	^self component answer: #previous</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepDecoration</class-id> <category>rendering title-bar</category>

<body package="SeasideLearningCenter-Core" selector="renderButtonAction:on:">renderButtonAction: aSelector on: html 
	(html anchor)
		callback: [self perform: aSelector];
		title: (self tooltipFor: aSelector);
		with: 
				[(html image)
					width: 25 px;
					url: (self resources addToPath: aSelector asString , '.gif')]</body>

<body package="SeasideLearningCenter-Core" selector="renderTitleBarOn:">renderTitleBarOn: html 
	(html div)
		class: 'demo-titlebar';
		with: 
				[#(#previous #next #home #browse #exit) do: 
						[:each | 
						(html div)
							class: 'demo-button';
							with: [self renderButtonAction: each on: html]].
				(html div)
					class: 'demo-title';
					with: [self renderTitleOn: html]]</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepDecoration</class-id> <category>resources</category>

<body package="SeasideLearningCenter-Core" selector="basePath">basePath
	^WADispatcher default basePath</body>

<body package="SeasideLearningCenter-Core" selector="resources">resources
 	^ WAUrl new addToPath: self basePath, '/files/SULearningCenterLibrary/'.</body>

<body package="SeasideLearningCenter-Core" selector="scriptaculousResources">scriptaculousResources
	^ WAUrl new addToPath: self basePath , '/files/SUAllTestLibrary/'</body>

<body package="SeasideLearningCenter-Core" selector="tooltipFor:">tooltipFor: aSymbol
	^self tooltips at: aSymbol ifAbsent: ['']</body>

<body package="SeasideLearningCenter-Core" selector="tooltips">tooltips
	^(Dictionary new)
		at: #previous put: 'Previous learning step';
		at: #next put: 'Next learning step';
		at: #home put: 'Build learning steps';
		at: #browse put: 'Class browser';
		at: #exit put: 'Terminate';
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml</class-id> <category>demos</category>

<body package="SeasideLearningCenter-Core" selector="demo001">demo001
	^(SULearningElement new)
		title: 'Just a simple span';
		snippet: 'html span
	with: ''This is a span''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo002">demo002
	^(SULearningElement new)
		title: 'Spans, space, break, strong';
		snippet: 'html span: ''Visit our''.
html space.
html span: ''site''.
html break.
html strong: ''Cincom Smalltalk''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo003">demo003
	^(SULearningElement new)
		title: 'Span with style';
		snippet: 'html span
	class: ''label'';
	style: ''font-weight: bold'';
	style: ''font-size: 120%; color: blue'';
	with: ''This is a styled span''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo004">demo004
	^(SULearningElement new)
		title: 'Span, space, anchor';
		snippet: 'html span
	class: ''label'';
	style: ''color: red'';
	with: ''Visit our site''.
html space.
html anchor
	url: ''http://www.cincomsmalltalk.com'';
	with: ''Cincom Smalltalk''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo005">demo005
	^(SULearningElement new)
		title: 'Headings';
		snippet: 'html heading: ''Chapter 1'' level: 1.
html heading: ''Chapter 2''.
html heading: ''Section 2.1'' level: 2.';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo006">demo006
	^(SULearningElement new)
		title: 'Pictures';
		snippet: 'html image
	width: 100; 
	url: ''http://www.cincomsmalltalk.com/images/cst_logo.png''.
html space.
html image url: ''./files/SULearningCenterLibrary/home.gif''.
html space.
html image document: Seaside.SULearningCenterLibrary new nextGif'; yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo007">demo007
	^(SULearningElement new)
		title: 'Nested div &amp; span';
		snippet: 'html div with:
	[html span: ''Visit our site''.
	html break.
	html span id: ''site-name''; with: ''Cincom'']';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo008">demo008
	^(SULearningElement new)
		title: 'Anchor &amp; picture';
		snippet: 'html anchor
	newTarget;
	url: ''http://seaside.st'';
	with:
		[html image
			width: 400; 
			document: SeasidePlatformSupport seasideBanner]';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo009">demo009
	^(SULearningElement new)
		title: 'Table';
		snippet: 'html table:
	[html tableRow:
		[html tableData: ''Row1 Column1''.
		html tableData: ''R1 C2''].
	html tableRow:
		[html tableData: ''R2 C1''.
		html tableData: ''Row2 Column2'']]';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo010">demo010
	^(SULearningElement new)
		title: 'Table with style';
		snippet: 'html style: ''table {border-collapse: collapse} td{border: 1px solid black; padding: 5px 50px 5px 50px}''.
html table:
	    [html tableRow:
		[html tableData: ''Row1 Column1''.
		html tableData: ''R1 C2''].
	    html tableRow:
		[html tableData: ''R2 C1''.
		html tableData: ''Row2 Column2'']]';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo011">demo011
	^(SULearningElement new)
		title: 'Table, head, body';
		snippet: 'html style: ''table {border-collapse: collapse}
	th{background: #345ba8; color: white; padding: 5px}
	td{border: 1px solid #345ba8; padding: 5px}''.
html table:
	    [html tableHead:
		[html tableRow:
		    [html tableHeading: ''Column 1''.
		    html tableHeading: ''Column 2'']].
	    html tableBody:
		[html tableRow:
		    [html tableData: ''R1 C1''.
		    html tableData: ''R1 C2''].
	        html tableRow:
		     [html tableData: ''R2 C1''.
		    html tableData: ''R2 C2'']]]';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	^(OrderedCollection new)
		add: self demo001;
		add: self demo002;
		add: self demo003;
		add: self demo004;
		add: self demo005;
		add: self demo006;
		add: self demo007;
		add: self demo008;
		add: self demo009;
		add: self demo010;
		add: self demo011;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="genericStyle">genericStyle
	^super genericStyle , '
#xh-html {
	padding: 1em;
	background-color: #f5ffe9;
	border: 1px dashed #888;
	word-wrap: break-word;
	margin-top: 10px;
}
'</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoOn:">renderDemoOn: html
"This method has been generated and will be rewritten when regenerated"

html span: 'Visit our'.
html space.
html span: 'site'.
html break.
html strong: 'Cincom Smalltalk'</body>

<body package="SeasideLearningCenter-Core" selector="renderGeneratedOn:">renderGeneratedOn: html
	generatedHtml isNil ifTrue: [^nil].
	super renderGeneratedOn: html.
	(html div)
		id: self idForHtml;
		with: 
				[html text: generatedHtml].</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Core" selector="generate">generate
	| methodText sourceCode aStream |
	methodText := String new.
	demoText isNil 
		ifFalse: 
			[selectedDemo actualSnippet: demoText.
			[child := self compile: demoText] on: Error do: [:ex | nil].
			sourceCode := '[:html | ' , selectedDemo actualSample, ']'.
			aStream := String new writeStream.
			renderer context document stream: aStream.
			renderer forgetCurrentBrush.
			generatedHtml := 
					[(self compile: sourceCode) value: renderer.
					methodText := selectedDemo actualSample.
					renderer close.
					aStream contents] 
							on: Error
							do: [:ex | ex description]].
	self addDemoMethodUsing: methodText.
	isGenerated := true.</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml</class-id> <category>services</category>

<body package="SeasideLearningCenter-Core" selector="elementsToHide">elementsToHide
	^Array with: self idForSample with: self idForDemo with: self idForHtml</body>

<body package="SeasideLearningCenter-Core" selector="message:">message: aValue
	message := aValue.</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml</class-id> <category>ids</category>

<body package="SeasideLearningCenter-Core" selector="idForHtml">idForHtml
	^'xh-html'</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'XHTML generation Workspace'</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#XHTML</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtml class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCompound</class-id> <category>demos</category>

<body package="SeasideLearningCenter-Core" selector="demo001">demo001
	^(SULearningElement new)
		title: 'Date';
		snippet: 'html form:
	[html dateInput
	    value: data;
	    callback: [:v | data := v].
	html submitButton
	    text: ''OK''].
html div: data';
		initializer: [self data: Date today];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo002">demo002
	^(SULearningElement new)
		title: 'Time';
		snippet: 'html form:
	[html timeInput
	    value: data;
	    callback: [:v | data := v].
	html submitButton
	    text: ''OK''].
html div: data';
		initializer: [self data: Time now];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo010">demo010
	^(SULearningElement new)
		title: 'Simple component';
		snippet: 'WACounter new';
		sample: 'html render: (&lt;1s&gt;)';
		actualSample: 'html render: child';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo011">demo011
	^(SULearningElement new)
		title: 'Tree of components';
		snippet: 'WAMultiCounter new';
		sample: 'html render: (&lt;1s&gt;)';
		actualSample: 'html render: child';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	^(OrderedCollection new)
		add: self demo001;
		add: self demo002;
		add: self demo010;
		add: self demo011;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCompound</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderDemoOn:">renderDemoOn: html
"This method has been generated and will be rewritten when regenerated"

html form:
	[html timeInput
	    value: data;
	    callback: [:v | data := v].
	html submitButton
	    text: 'OK'].
html div: data</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCompound class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'XHTML composition Workspace'</body>
</methods>

<methods>
<class-id>Seaside.SULearningExit</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	(html div)
		class: 'bigger';
		with: 
				[html div: '"It''s more like'.
				html div: 'Web 3.0"'].
	(html div)
		class: 'smaller';
		with: 'Lukas Renggli'</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="style">style
	^'
body {
	font-family:  Arial;
	color: #345ba8
}
.bigger {
	margin-top: 2em;
	font-size: 500%;
	font-weight: bold;
}
.bigger div {
	margin: auto;
	clear: both;
	text-align: center;
}
.smaller {
	margin-top: 5em;
	float: right;
	margin-right: 20%;
	font-style: italic;
}
'</body>
</methods>

<methods>
<class-id>Seaside.SUScriptaculousAndAsyncTest</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="children">children
	^Array with: component</body>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	(html select)
		list: #(#one #two);
		selected: #one;
		liveCallback: 
				[:anObject :h | 
				(h div)
					id: 'xxlive';
					with: 
							[anObject = #two 
								ifTrue: [h render: component	"a SUAutocompleterTest instance"]]].
	(html div)
		id: 'xxlive';
		with: ''.
	html div
			style: 'background-color: lightgray; border: 1px dashed darkgray; padding: 10px; margin: 100px';
			script: (html effect shake);
			with: 'Shaked when page is refreshed'</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WAAsyncRenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: anHtmlRoot
	super updateRoot: anHtmlRoot.
	anHtmlRoot stylesheet url: './files/MyClass/toto.css'.</body>
</methods>

<methods>
<class-id>Seaside.SUScriptaculousAndAsyncTest</class-id> <category>initialization</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	component := SUAutocompleterTest new.</body>
</methods>

<methods>
<class-id>Seaside.SUScriptaculousAndAsyncTest class</class-id> <category>class initialization</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	(self registerAsApplication: 'async-scriptaculous')
		addLibrary: SULibrary;
		addLibrary: WAAsyncScripts</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepChooser</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="availableDemos">availableDemos
	^self builder availableDemos 
		asSortedCollection: [:a :b | a name &lt;= b name]</body>

<body package="SeasideLearningCenter-Core" selector="builder">builder
	^builder</body>

<body package="SeasideLearningCenter-Core" selector="builder:">builder: anObject
	builder := anObject</body>

<body package="SeasideLearningCenter-Core" selector="components">components
	^components</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepChooser</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Core" selector="addComponents">addComponents
	self components notEmpty 
		ifTrue: [self components do: [:each | self builder addDemo: each new]]</body>

<body package="SeasideLearningCenter-Core" selector="isDemoSelected:">isDemoSelected: each 
	^self components includes: each</body>

<body package="SeasideLearningCenter-Core" selector="modifyOkButtonOn:">modifyOkButtonOn: aScript 
	(aScript formElement)
		id: 'choose-ok';
		perform: (self components isEmpty ifTrue: [#disable] ifFalse: [#enable])</body>

<body package="SeasideLearningCenter-Core" selector="selectDemo:">selectDemo: aDemo
	(self isDemoSelected: aDemo) ifTrue: [^nil].
	self components add: aDemo</body>

<body package="SeasideLearningCenter-Core" selector="unselectDemo:">unselectDemo: aDemo 
	(self isDemoSelected: aDemo) ifFalse: [^nil].
	^self components remove: aDemo</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepChooser</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="formid">formid
	^'choose-form'</body>

<body package="SeasideLearningCenter-Core" selector="renderButtonsOn:">renderButtonsOn: html 
	(html div)
		id: 'choose-buttons';
		with: 
				[(html submitButton)
					id: 'choose-ok';
					attributeAt: 'disabled' put: self components isEmpty;
					onClick: ((html updater)
								id: 'demo-dialog';
								callback: 
										[:h | 
										self addComponents.
										h text: ' '];
								onSuccess: ((html updater)
											id: 'demo-list';
											evalScripts: true;
											on: #renderDemoListOn: of: builder));
					text: 'Add'.
				(html submitButton)
					onClick: ((html updater)
								id: 'demo-dialog';
								callback: [:h | h text: ' ']);
					text: 'Cancel']</body>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	html div id: 'overlay'.
	(html div)
		id: 'lightbox';
		class: 'nifty';
		with: [self renderFormOn: html].
	html 
		script: 'Rounded("div#lightbox","#999","#e8f3ff");updateLightbox();window.onresize=function(){updateLightbox();};'</body>

<body package="SeasideLearningCenter-Core" selector="renderDemo:on:">renderDemo: aDemo on: html 
	html tableData: 
			[(html checkbox)
				value: (self isDemoSelected: aDemo);
				callback: 
						[:v | 
						v ifTrue: [self selectDemo: aDemo] ifFalse: [self unselectDemo: aDemo]];
				onClick: ((html evaluator)
							triggerForm: self formid;
							callback: [:s | self modifyOkButtonOn: s])].
	html tableData: aDemo name.
	html tableData: '(' , (aDemo topic ifNil: 'Any') , ') ' , aDemo description</body>

<body package="SeasideLearningCenter-Core" selector="renderDemo:withClass:on:">renderDemo: aDemo withClass: aString on: html 
	^(html tableRow)
		class: aString;
		with: 
				[html tableData: 
						[(html checkbox)
							value: (self isDemoSelected: aDemo);
							callback: 
									[:v | 
									v ifTrue: [self selectDemo: aDemo] ifFalse: [self unselectDemo: aDemo]];
							onClick: ((html evaluator)
										triggerForm: self formid;
										callback: [:s | self modifyOkButtonOn: s])].
				html tableData: aDemo name.
				html tableData: aDemo description]</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListBodyOn:">renderDemoListBodyOn: html 
	(html tableBody)
		class: 'scrollContent';
		with: 
				[self availableDemos keysAndValuesDo: 
						[:x :each | 
						(html tableRow)
							class: (x odd ifTrue: ['odd'] ifFalse: ['even']);
							class: 'normalRow';
							with: [self renderDemo: each on: html]]]</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListHeaderOn:">renderDemoListHeaderOn: html 
	(html tableHead)
		class: 'fixedHeader';
		with: 
				[(html tableRow)
					class: 'headerRow';
					with: 
							[html tableHeading: 'Select'.
							html tableHeading: 'Component'.
							html tableHeading: 'Description']]</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListOn:">renderDemoListOn: html 
	(html table)
		class: 'scrollTable';
		with: 
				[self renderDemoListHeaderOn: html.
				self renderDemoListBodyOn: html]</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WAAsyncRenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="renderFormOn:">renderFormOn: html 
	components := components 
				select: [:each | self availableDemos includes: each].
	(html div)
		id: 'choose-frame';
		with: 
				[html heading: 'Select the demos you want to add' level: 3.
				(html form)
					id: self formid;
					with: 
							[(html div)
								id: 'choose-list';
								class: 'scrollableTable';
								with: [self renderDemoListOn: html]].
				self renderButtonsOn: html]</body>

<body package="SeasideLearningCenter-Core" selector="script">script
	^ 'Object.extend(Position, {
	windowBounds: function() {
		var x = window.innerWidth 
			|| document.documentElement.clientWidth
			|| document.body.clientWidth
			|| 0;
		var y = window.innerHeight
			|| document.documentElement.clientHeight
			|| document.body.clientHeight
			|| 0;
		return [x, y]; 
	}
});
Object.extend(Element, {
	fullscreen: function(element) {
		element = $(element);
		var bounds = Position.windowBounds();
		element.style.position = "absolute";
		element.style.left = element.style.top = 0;
		element.style.width = bounds[0] + "px";
		element.style.height = bounds[1] + "px";
	},
	center: function(element) {
		element = $(element);
		var extent = Element.getDimensions(element);
		var bounds = Position.windowBounds();
		var x = (bounds[0] - extent.width) / 2;
		var y = (bounds[1] - extent.height) / 2;
		x = x &lt; 0 ? 0 : x; y = y &lt; 0 ? 0 : y;
		element.style.position = "absolute";
		element.style.left = x + "px";
		element.style.top = y + "px";
	}
});
function updateLightbox() {
	if ($("overlay")) {
		Element.fullscreen("overlay");
		Element.center("lightbox");
	}
};'</body>

<body package="SeasideLearningCenter-Core" selector="style">style
	^ '
html { 
	overflow: hidden; 
}
body {
	overflow: hidden; 

}
div#overlay {
	z-index: 9998;
	background-color: black;
	filter: alpha(opacity=40);
	-moz-opacity: 0.4;
	opacity: 0.4;
}
div#overlay[id] {
	position: fixed;
}
div#lightbox {
	z-index: 9999; 
	width: 60%;
	font-size: 80%;
	clear: both;
	margin: auto;
	background-color: #e8f3ff;
	color: #345ba8
}
div#choose-frame {
	padding: 1em 3em 2em 3em;
	color: #333;
}
div#choose-list thead.fixedHeader th {
	width: 5em;
}
div#choose-list thead.fixedHeader th + th {
	width: 20em;
}
div#choose-list thead.fixedHeader th + th + th {
	width: 20em;
}
div#choose-list tbody.scrollContent td {
	width: 10%;
}
div#choose-list tbody.scrollContent td + td {
	width: 30%;
}
div#choose-list tbody.scrollContent td + td + td {
	width: 60%;
}
div#choose-buttons {
	margin: auto;
	padding-top: 2em;
}
div#choose-buttons input {
	margin-right: 2em;
}
'</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepChooser</class-id> <category>initialization</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	components := Set new.</body>
</methods>

<methods>
<class-id>Seaside.SULearningStepChooser class</class-id> <category>instance creation</category>

<body package="SeasideLearningCenter-Core" selector="forBuilder:">forBuilder: aBuilder 
	^(self new)
		builder: aBuilder;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningReflection</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderAttentionOn:">renderAttentionOn: html 
	html table: 
			[html tableRow: 
					[#(20 40 60 80 100) do: 
							[:opacity | 
							html tableData: 
									[(html image)
										class: 'reflect';
										class: 'rheight' , opacity asString;
										class: 'ropacity' , opacity asString;
										url: (self reflectionResources addToPath: 'attention.png') asString]]]]</body>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	self session addLoadScript: 'addReflections()'.
	(html div)
		id: #frame;
		class: #nifty;
		with: 
				[(html div)
					id: #innerFrame;
					with: 
							[html div: [self renderSeasideOn: html].
							html div: [self renderAttentionOn: html]]].
	self session 
		addLoadScript: 'Rounded("div#frame","#FFF","#000");'</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="renderSeasideOn:">renderSeasideOn: html 
	(html image)
		class: 'reflect';
		class: 'rheight100';
		class: 'ropacity100';
		width: 300 px;
		document: SeasidePlatformSupport seasideBanner</body>

<body package="SeasideLearningCenter-Core" selector="style">style
	^'
body {
	background-color: white;
}
div#frame {
	background-color: black;
	width: 90%;
}
div#innerFrame {
	padding: 5em;
}
/* Nifty corners */
.rtop, .rbottom {
	display: block;
}
.rtop *, .rbottom * {display: block; height: 1px; overflow: hidden}
.r1 {margin: 0 5px}
.r2 {margin: 0 3px}
.r3 {margin: 0 2px}
.r4 {margin: 0 1px; height: 2px}

.rs1 {margin: 0 20px}
.rs2 {margin: 0 1px}


'</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: anHtmlRoot 
	super updateRoot: anHtmlRoot.
	anHtmlRoot linkToStyle: (self reflectionResources addToPath: 'rfdemo.css').
	anHtmlRoot linkToScript: (self resources addToPath: 'nifty.js').
	RFReflectionLibrary updateRoot: anHtmlRoot</body>
</methods>

<methods>
<class-id>Seaside.SULearningReflection</class-id> <category>resources</category>

<body package="SeasideLearningCenter-Core" selector="reflectionResources">reflectionResources
	^ WAUrl new
		addToPath: WADispatcher default basePath , '/files/RFDemoFileLibrary/';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="resources">resources
	^ WAUrl new
		addToPath: WADispatcher default basePath , '/files/SULearningCenterLibrary/';
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningReflection class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^RFReflectionDemo description</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#Javascript</body>
</methods>

<methods>
<class-id>Seaside.SULearningReflection class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUWorkflow</class-id> <category>workflow</category>

<body package="SeasideLearningCenter-Core" selector="exit">exit
	self start.
	^nil</body>

<body package="SeasideLearningCenter-Core" selector="filterWith:">filterWith: aString
	aString isNil ifTrue: [^nil]. 
	(self basicCategories includes: aString asSymbol) 
		ifTrue: [filters := Set with: aString asSymbol]</body>

<body package="SeasideLearningCenter-Core" selector="home">home
	self start.
	^self next.</body>

<body package="SeasideLearningCenter-Core" selector="next">next
	| component |
	
	[current = steps size ifTrue: [^self home].
	component := steps at: (current := current + 1).
	self isVisible: component] 
			whileFalse.
	^component</body>

<body package="SeasideLearningCenter-Core" selector="previous">previous
	| component |
	
	[current = 1 ifTrue: [^self home].
	component := steps at: (current := current - 1).
	self isVisible: component] 
			whileFalse.
	^component</body>

<body package="SeasideLearningCenter-Core" selector="start">start
	current := 0.</body>

<body package="SeasideLearningCenter-Core" selector="startWith:">startWith: aString 
	| component |
	self home.
	"Start look-up at the second step"
	[component := self next.
	component == steps first] 
			whileFalse: [component class name == aString asSymbol ifTrue: [^component]].
	"Back to first step with no match, answer the first step"
	^component.</body>
</methods>

<methods>
<class-id>Seaside.SUWorkflow</class-id> <category>maintaining</category>

<body package="SeasideLearningCenter-Core" selector="addDemo:">addDemo: aComponent
	aComponent isNil ifTrue: [^nil].
	^steps add: aComponent.</body>

<body package="SeasideLearningCenter-Core" selector="addDemo:afterIndex:">addDemo: aComponent afterIndex: anInteger 
	aComponent isNil ifTrue: [^nil].
	^steps add: aComponent after: (steps at: anInteger)</body>

<body package="SeasideLearningCenter-Core" selector="availableDemos">availableDemos
	^(WAComponent allSubclasses select: [:each | each isDemo]) 
		reject: [:each | steps anySatisfy: [:demo | demo class == each]]</body>

<body package="SeasideLearningCenter-Core" selector="moveDemo:over:">moveDemo: aDemo over: anotherDemo 
	self removeDemo: aDemo.
	steps add: aDemo before: anotherDemo</body>

<body package="SeasideLearningCenter-Core" selector="removeDemo:">removeDemo: aDemo
	steps remove: aDemo.</body>
</methods>

<methods>
<class-id>Seaside.SUWorkflow</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="addFilter:">addFilter: aSymbol 
	filters add: aSymbol</body>

<body package="SeasideLearningCenter-Core" selector="basicCategories">basicCategories
	^ #(#XHTML #CSS #Javascript #RSS #Ajax #Comet)</body>

<body package="SeasideLearningCenter-Core" selector="categories">categories
	^ self basicCategories</body>

<body package="SeasideLearningCenter-Core" selector="hasFilter:">hasFilter: aSymbol
	^filters includes: aSymbol</body>

<body package="SeasideLearningCenter-Core" selector="isVisible:">isVisible: aComponent 
	| topic |
	^(topic := aComponent class topic) isNil or: [filters includes: topic]</body>

<body package="SeasideLearningCenter-Core" selector="removeFilter:">removeFilter: aSymbol
	filters remove: aSymbol ifAbsent: []</body>

<body package="SeasideLearningCenter-Core" selector="setFilter:to:">setFilter: aSymbol to: aBoolean
	aBoolean ifTrue:
		[self addFilter: aSymbol]
	ifFalse:
		[self removeFilter: aSymbol]</body>

<body package="SeasideLearningCenter-Core" selector="steps">steps
	^steps select: [:each | self isVisible: each]</body>
</methods>

<methods>
<class-id>Seaside.SUWorkflow</class-id> <category>initialize-release</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	filters := self basicCategories asSet.
	steps := OrderedCollection new.
	current := 0.</body>
</methods>

<methods>
<class-id>Seaside.SUWorkflow class</class-id> <category>instance creation</category>

<body package="SeasideLearningCenter-Core" selector="new">new
	^super new initialize</body>
</methods>

<methods>
<class-id>Seaside.SULearningSessionBuilder</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	(html div)
		id: 'demo-head';
		with: 'List of learning steps'.
	self renderGarbageBinOn: html.
	self renderFiltersOn: html.
	self renderInstructionsOn: html.
	(html div)
		id: 'demo-list';
		with: [self renderDemoListOn: html].
	(html div)
		class: 'demo-more';
		onClick: ((html updater)
					id: 'demo-dialog';
					evalScripts: true;
					callback: [:h | h render: dialog]);
		with: 'More learning steps...'.
	(html div)
		id: 'demo-dialog';
		with: ''</body>

<body package="SeasideLearningCenter-Core" selector="renderDemo:on:">renderDemo: aDemoComponent on: html 
	aDemoComponent == self demos first 
		ifTrue: 
			[html span: aDemoComponent class name.
			^nil].
	(html span)
		passenger: aDemoComponent;
		class: 'demo-step';
		script: ((html draggable)
					scroll: true;
					revert: true);
		script: ((html droppable)
					accept: 'demo-step';
					hoverclass: 'hover';
					onDrop: ((html updater)
								id: 'demo-list';
								evalScripts: true;
								triggerPassenger: [:value | self moveDemo: value over: aDemoComponent];
								callback: [:renderer | self renderDemoListOn: renderer]));
		with: aDemoComponent class name</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListBodyOn:">renderDemoListBodyOn: html 
	html tableBody: 
			[self demos keysAndValuesDo: 
					[:x :each | 
					(html tableRow)
						class: (x odd ifTrue: ['odd'] ifFalse: ['even']);
						with: 
								[html tableData: [self renderDemo: each on: html].
								html tableData: each class description]]]</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListHeaderOn:">renderDemoListHeaderOn: html 
	html tableHead: 
			[html tableRow: 
					[html tableHeading: 'Component'.
					html tableHeading: 'Description']]</body>

<body package="SeasideLearningCenter-Core" selector="renderDemoListOn:">renderDemoListOn: html
	html table: 
			[self renderDemoListHeaderOn: html.
			self renderDemoListBodyOn: html]</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WARenderCanvas</body>

<body package="SeasideLearningCenter-Core" selector="renderFiltersOn:">renderFiltersOn: html 
	| input |
	input := Dictionary new.
	(html form)
		id: 'filters';
		with: 
				[workflow categories do: 
						[:each | 
						(html checkbox)
							value: (workflow hasFilter: each);
							callback: [:v | input at: each put: v];
							onClick: ((html evaluator)
										triggerForm: 'filters';
										callback: 
												[:script | 
												input 
													keysAndValuesDo: [:filter :value | workflow setFilter: filter to: value].
												(script element)
													id: 'demo-list';
													render: [:r | self renderDemoListOn: r]]).
						(html span)
							style: 'margin-left: 1em; margin-right: 2em';
							with: each]]</body>

<body package="SeasideLearningCenter-Core" selector="renderGarbageBinOn:">renderGarbageBinOn: html 
	(html div)
		id: 'demo-garbage';
		script: ((html droppable)
					accept: 'demo-step';
					hoverclass: 'hover-garbage';
					onDrop: ((html updater)
								id: 'demo-list';
								evalScripts: true;
								triggerPassenger: [:value | self removeDemo: value];
								callback: [:renderer | self renderDemoListOn: renderer]));
		with: 'Drop here to remove steps'</body>

<body package="SeasideLearningCenter-Core" selector="renderInstructionsOn:">renderInstructionsOn: html 
	(html span)
		class: 'instruction';
		with: 'Use drag and drop to re-order the steps. Use checkboxes above for filtering the list on desired topics.'</body>

<body package="SeasideLearningCenter-Core" selector="style">style
	^ '
body {
	color: #345ba8
}
span.demo-step {
	cursor: move;
}
div.demo-more {
	margin: 3em;
	cursor: pointer;
	width: 13em;
}
div#demo-head {
	font-size: 160%;
	font-weight: bold;
	margin-bottom: 1em;
	float: left;
}
span.instruction {
	color: #b6b8ba;
}
div#demo-garbage {
	padding: 0.5em;
	width: 15em;
	border: 1px dashed #c2c8ca;
	color: #b6b8ba;
	margin-right: 5.5em;
	float: right;
}
.hover-garbage {
	background-color: #efefd2;
	color: yellow;
}
.hover {
	background-color: #e2cfcf;
}
div#demo-list {
	width: 90%;
	font-size: 90%;
}
div#demo-list table {
	width: 100%;
	border: 1px solid #aaa;
	clear: both;
	overflow: auto;
	border-collapse: collapse;
}
div#demo-list thead tr {
	background: #888;
}
div#demo-list thead th {
	color: #eef;
	padding-left: 1em;
	padding-right: 5em;
}
div#demo-list thead th + th {
}
div#demo-list tbody td {
	padding: 0.4em 0 0.4em 0.5em;
	width: 15%;
}
div#demo-list tbody td + td {
	width: 85%;
}
div#demo-list tbody tr.even {
	background-color: #f5ffe9;
}
div#demo-list tbody tr.odd {
	background-color: #c0f4f4;
}
form#filters {
	clear: both;
}
'</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: aHtmlRoot
	super updateRoot: aHtmlRoot.
	aHtmlRoot stylesheet url: (self resources addToPath: 'table.css').
	aHtmlRoot javascript url: (self resources addToPath: 'nifty.js').</body>
</methods>

<methods>
<class-id>Seaside.SULearningSessionBuilder</class-id> <category>resources</category>

<body package="SeasideLearningCenter-Core" selector="basePath">basePath
	^WADispatcher default basePath</body>

<body package="SeasideLearningCenter-Core" selector="resources">resources
 	^ WAUrl new addToPath: self basePath, '/files/SULearningCenterLibrary/'.</body>
</methods>

<methods>
<class-id>Seaside.SULearningSessionBuilder</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="availableDemos">availableDemos
	^self workflow availableDemos</body>

<body package="SeasideLearningCenter-Core" selector="children">children
	^Array with: dialog</body>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	^self workflow steps</body>

<body package="SeasideLearningCenter-Core" selector="workflow">workflow
	^workflow</body>

<body package="SeasideLearningCenter-Core" selector="workflow:">workflow: anObject
	workflow := anObject.</body>
</methods>

<methods>
<class-id>Seaside.SULearningSessionBuilder</class-id> <category>actions</category>

<body package="SeasideLearningCenter-Core" selector="addDemo:">addDemo: aDemo
	self workflow addDemo: aDemo afterIndex: 1</body>

<body package="SeasideLearningCenter-Core" selector="moveDemo:over:">moveDemo: aDemo over: anotherDemo
	self workflow moveDemo: aDemo over: anotherDemo</body>

<body package="SeasideLearningCenter-Core" selector="removeDemo:">removeDemo: aDemo
	self workflow removeDemo: aDemo</body>
</methods>

<methods>
<class-id>Seaside.SULearningSessionBuilder</class-id> <category>initialization</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	dialog := SULearningStepChooser forBuilder: self</body>
</methods>

<methods>
<class-id>Seaside.SULearningSessionBuilder class</class-id> <category>instance creation</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'Learning session builder (with Scriptaculous drag &amp; drop)'</body>

<body package="SeasideLearningCenter-Core" selector="for:">for: aWorkflow 
	^(self new)
		workflow: aWorkflow;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCallbacks</class-id> <category>demos</category>

<body package="SeasideLearningCenter-Core" selector="demo001">demo001
	^(SULearningElement new)
		title: 'Anchor';
		snippet: 'html anchor
	callback: [Transcript cr; show: ''Hello world!''];
	with: ''Click me''';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo002">demo002
	^(SULearningElement new)
		title: 'Two anchors';
		snippet: 'html anchor
	callback: [data := ''Smalltalk in Frankfurt''];
	with: ''Click me first''.
html space: 10.
html anchor
	callback: [data := nil];
	with: ''Click me next''.
html div: data';
		initializer: [self data: nil];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo003">demo003
	^(SULearningElement new)
		title: 'Form, text-input';
		snippet: 'html form:
	[html textInput
	    value: data;
	    callback: [:v | data := v]].
html div: data';
		initializer: [self data: 'Smalltalk'];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo004">demo004
	^(SULearningElement new)
		title: 'Form, submit button';
		snippet: 'html form:
	[html textInput
	    value: data;
	    callback: [:v | data := v].
	html submitButton
	    callback: [data := data asUppercase];
	    text: ''OK''].
html div: data';
		initializer: [self data: 'Cincom'];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo005">demo005
	^(SULearningElement new)
		title: 'Form, cancel button';
		snippet: 'html form:
	[html textInput
	    value: data;
	    callback: [:v | data := v].
	html submitButton
	    callback: [data := data asUppercase. message := nil];
	    text: ''OK''.
	html cancelButton
	    callback: [message := ''Cancelled''];
	    text: ''Cancel''].
html div: data.
html div: message';
		initializer: 
				[self data: 'Smalltalk'.
				self message: nil];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo006">demo006
	^(SULearningElement new)
		title: 'Checkbox';
		snippet: 'html form:
	[html checkbox
	    value: (data = ''Yes'');
	    callback: [:v | data := v ifTrue: [''Yes''] ifFalse: [''No'']].
	html submitButton].
html div: data';
		initializer: [self data: 'Yes'];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo007">demo007
	^(SULearningElement new)
		title: 'Radio';
		snippet: 'html form:
	[ | group |
	group := html radioGroup.
	html radioButton group: group;
	    selected: (data = ''Boy'');
	    callback: [data := ''Boy''].
	html text: ''Boy''.
	html radioButton group: group;
	    selected: (data = ''Boy'') not;
	    callback: [data := ''Girl''].
	html text: ''Girl''.
	html submitButton].
html div: data';
		initializer: [self data: 'Boy'];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo008">demo008
	^(SULearningElement new)
		title: 'Select';
		snippet: 'html form:
	[html select list: #(Choose Smalltalk Java Mantis Cobol Any);
	    selected: data;
	    callback: [:v | data := v].
	html submitButton].
html div: data';
		initializer: [self data: #Choose];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo009">demo009
	^(SULearningElement new)
		title: 'Multi-select';
		snippet: 'html form:
	[html select list: #(Smalltalk Java Ruby Mantis Python Cobol Pascal Delphi);
	    beMultiple;
	    selected: data;
	    callback: [:v | data := v asArray].
	html submitButton].
html div: data printString';
		initializer: [self data: #()];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo010">demo010
	^(SULearningElement new)
		title: 'Text area';
		snippet: 'html form:
	[html textArea
	    rows: 3;
	    columns: 50;
	    value: data;
	    callback: [:v | data := v].
	html submitButton].
html preformatted: data';
		initializer: [self data: 'Smalltalk is cool.
Seaside is cool too.'];
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	^(OrderedCollection new)
		add: self demo001;
		add: self demo002;
		add: self demo003;
		add: self demo004;
		add: self demo005;
		add: self demo006;
		add: self demo007;
		add: self demo008;
		add: self demo009;
		add: self demo010;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCallbacks</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderDemoOn:">renderDemoOn: html
"This method has been generated and will be rewritten when regenerated"

html anchor
	callback: [data := 'Smalltalk in Frankfurt'];
	with: 'Click me first'.
html space: 10.
html anchor
	callback: [data := nil];
	with: 'Click me next'.
html div: data</body>
</methods>

<methods>
<class-id>Seaside.SULearningHtmlCallbacks class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'XHTML callbacks Workspace'</body>
</methods>

<methods>
<class-id>Seaside.SULearningTask</class-id> <category>initialization</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	workflow := SUWorkflow new.
	workflow
		addDemo: (SULearningSessionBuilder for: workflow);
		addDemo: SULearningHtml new;
		addDemo: SULearningHtmlCallbacks new;
		addDemo: SULearningHtmlCompound new;
		addDemo: SULearningCSS new;
		addDemo: SULearningReflection new;
		addDemo: FIDemo new;
		addDemo: CFDemo new;
		addDemo: PKLabelDemo new;
		addDemo: SULearningHtmlCanvas new;
		addDemo: SULearningRSS new;
		addDemo: WABrowser new;
		addDemo: SUFullClassBrowser new;
		addDemo: SULearningScriptaculous new;
		addDemo: SUEffectsTest new;
		addDemo: SUDragDropTest new;
		addDemo: SUAutocompleterTest new;
		addDemo: SULearningCometChat new;
		yourself.
	self restartWorkflow</body>

<body package="SeasideLearningCenter-Core" selector="initialRequest:">initialRequest: aRequest
	startWith := aRequest fields at: 'demo' ifAbsent: [nil].
	filter := aRequest fields at: 'type' ifAbsent: [nil].</body>

<body package="SeasideLearningCenter-Core" selector="restartWorkflow">restartWorkflow
	workflow start.</body>
</methods>

<methods>
<class-id>Seaside.SULearningTask</class-id> <category>task</category>

<body package="SeasideLearningCenter-Core" selector="go">go
	| answer |
	workflow filterWith: filter.
	startWith isNil 
		ifTrue: [component := workflow home]
		ifFalse: [component := workflow startWith: startWith].

	
	[
	[answer := self call: (component
						addDecoration: SULearningStepDecoration new;
						yourself).
	component removeDecoration.
	component := workflow perform: answer.
	component notNil] 
			whileTrue] 
			on: Error
			do: [:ex | self restartWorkflow].
	self call: SULearningExit new</body>
</methods>

<methods>
<class-id>Seaside.SULearningTask class</class-id> <category>class initialization</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'Learning center (Cincom Smalltalk User Conference 2006)'</body>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	| app |
	app := self registerAsApplication: 'learning'.
	app addLibrary: SULibrary.</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserPane</class-id> <category>delegation</category>

<body package="SeasideLearningCenter-Browser" selector="canRemoveSourceCode">canRemoveSourceCode
	^self main canRemoveSourceCode</body>

<body package="SeasideLearningCenter-Browser" selector="canRenameSourceCode">canRenameSourceCode
	^self main canRenameSourceCode</body>

<body package="SeasideLearningCenter-Browser" selector="canSaveSourceCode">canSaveSourceCode
	^self main canSaveSourceCode</body>

<body package="SeasideLearningCenter-Browser" selector="classes">classes
	^self main classes</body>

<body package="SeasideLearningCenter-Browser" selector="isReadOnly">isReadOnly
	^self main isReadOnly</body>

<body package="SeasideLearningCenter-Browser" selector="isReadOnly:">isReadOnly: aBoolean
	^self main isReadOnly: aBoolean</body>

<body package="SeasideLearningCenter-Browser" selector="listSize">listSize
	^self main listSize</body>

<body package="SeasideLearningCenter-Browser" selector="package">package
	^self main package</body>

<body package="SeasideLearningCenter-Browser" selector="package:">package: anObject
	^self main package: anObject</body>

<body package="SeasideLearningCenter-Browser" selector="packages">packages
	^self main packages</body>

<body package="SeasideLearningCenter-Browser" selector="pause">pause
	^self main pause</body>

<body package="SeasideLearningCenter-Browser" selector="protocol">protocol
	^self main protocol</body>

<body package="SeasideLearningCenter-Browser" selector="protocol:">protocol: anObject
	^self main protocol: anObject</body>

<body package="SeasideLearningCenter-Browser" selector="protocols">protocols
	^self main protocols</body>

<body package="SeasideLearningCenter-Browser" selector="selectedClass">selectedClass
	^self main selectedClass</body>

<body package="SeasideLearningCenter-Browser" selector="selectedClass:">selectedClass: anObject
	^self main selectedClass: anObject</body>

<body package="SeasideLearningCenter-Browser" selector="selector">selector
	^self main selector</body>

<body package="SeasideLearningCenter-Browser" selector="selector:">selector: anObject
	^self main selector: anObject</body>

<body package="SeasideLearningCenter-Browser" selector="selectors">selectors
	^self main selectors</body>

<body package="SeasideLearningCenter-Browser" selector="sourceCode">sourceCode
	^self main sourceCode</body>

<body package="SeasideLearningCenter-Browser" selector="sourceTitle">sourceTitle
	^self main sourceTitle</body>

<body package="SeasideLearningCenter-Browser" selector="templateSourceCode">templateSourceCode
	^self main templateSourceCode</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserPane</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Browser" selector="componentName">componentName
	"Answer the value of componentName"

	^ componentName</body>

<body package="SeasideLearningCenter-Browser" selector="componentName:">componentName: anObject
	"Set the value of componentName"

	componentName := anObject</body>

<body package="SeasideLearningCenter-Browser" selector="main">main
	"Answer the value of main"

	^ main</body>

<body package="SeasideLearningCenter-Browser" selector="main:">main: anObject
	"Set the value of main"

	main := anObject</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserPane</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Browser" selector="rendererClass">rendererClass
	^ WARenderCanvas</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserRightPane</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Browser" selector="renderContentOn:">renderContentOn: html 
	(html div)
		id: main elementProtocols;
		with: [self renderProtocolsOn: html].
	(html div)
		id: main elementSelectors;
		with: [self renderSelectorsOn: html].</body>

<body package="SeasideLearningCenter-Browser" selector="renderProtocolsOn:">renderProtocolsOn: html 
	(html select)
		size: self listSize;
		id: 'protocolList';
		selected: self protocol;
		list: self protocols;
		callback: [:value | self protocol: value];
		onChange: ((html evaluator)
					triggerFormElement: 'protocolList';
					callback: [:script | main updateSelectorsOn: script])</body>

<body package="SeasideLearningCenter-Browser" selector="renderSelectorsOn:">renderSelectorsOn: html 
	(html select)
		size: self listSize;
		id: 'selectorList';
		selected: self selector;
		list: self selectors;
		callback: [:value | self selector: value];
		onChange: ((html evaluator)
					triggerFormElement: 'selectorList';
					callback: [:script | main updateSourceOn: script])</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserLeftPane</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Browser" selector="renderClassesOn:">renderClassesOn: html 
	(html select)
		size: self listSize;
		id: 'classList';
		selected: self selectedClass;
		list: self classes;
		callback: [:value | self selectedClass: value];
		onChange: ((html evaluator)
					triggerFormElement: 'classList';
					callback: [:script | main updateProtocolsOn: script])</body>

<body package="SeasideLearningCenter-Browser" selector="renderContentOn:">renderContentOn: html 
	(html div)
		id: main elementPackages;
		with: [self renderPackagesOn: html].
	(html div)
		id: main elementClasses;
		with: [self renderClassesOn: html]</body>

<body package="SeasideLearningCenter-Browser" selector="renderPackagesOn:">renderPackagesOn: html 
	(html select)
		size: self listSize;
		id: 'packageList';
		selected: self package;
		list: self packages;
		callback: [:value | self package: value];
		onChange: ((html evaluator)
					triggerFormElement: 'packageList';
					callback: [:script | main updateClassesOn: script])</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserSourcePane</class-id> <category>button text</category>

<body package="SeasideLearningCenter-Browser" selector="removeButtonText">removeButtonText
	^'Remove this ' , self main removeText , ' (Ctrl-X)'</body>

<body package="SeasideLearningCenter-Browser" selector="renameButtonText">renameButtonText
	^'Rename this ' , self main renameText , ' (Ctrl-R)'</body>

<body package="SeasideLearningCenter-Browser" selector="saveButtonText">saveButtonText
	^'Accept (Ctrl-S)'</body>
</methods>

<methods>
<class-id>Seaside.SUClassBrowserSourcePane</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Browser" selector="renderContentOn:">renderContentOn: html 
	(html div)
		id: main elementSource;
		with: [self renderSourceOn: html].</body>

<body package="SeasideLearningCenter-Browser" selector="renderMessageOn:">renderMessageOn: html 
	main message notNil 
		ifTrue: 
			[(html div)
				id: 'message';
				with: main message]
		ifFalse: 
			[(html div)
				id: 'title';
				with: self sourceTitle]</body>

<body package="SeasideLearningCenter-Browser" selector="renderReadOnlySourceOn:">renderReadOnlySourceOn: html 
	| stream lines |
	lines := OrderedCollection new.
	stream := sourceCode readStream.
	[stream atEnd] whileFalse: [lines add: stream nextLine].
	lines := lines readStream.
	html bold: lines next.
	[lines atEnd] whileFalse: 
			[html break.
			stream := lines next readStream.
			[stream atEnd] whileFalse: 
					[stream peek == Character tab 
						ifTrue: 
							[html space: 3.
							stream next]
						ifFalse: [html text: stream upToEnd]]]</body>

<body package="SeasideLearningCenter-Browser" selector="renderRemoveButtonOn:">renderRemoveButtonOn: html 
	self canRemoveSourceCode ifTrue:
		[(html submitButton)
			addShortcut: 'Ctrl-X';
			addShortcut: 'Ctrl-x';
			callback: [main removeSourceCode];
			text: self removeButtonText]</body>

<body package="SeasideLearningCenter-Browser" selector="renderRenameButtonOn:">renderRenameButtonOn: html 
	self canRenameSourceCode ifTrue:
		[(html submitButton)
			addShortcut: 'Ctrl-R';
			addShortcut: 'Ctrl-r';
			callback: [main renameSourceCode];
			text: self renameButtonText]</body>

<body package="SeasideLearningCenter-Browser" selector="renderSaveButtonOn:">renderSaveButtonOn: html 
	self canSaveSourceCode ifTrue:
		[(html submitButton)
			addShortcut: 'Ctrl-S';
			addShortcut: 'Ctrl-s';
			callback: [main saveSourceCode: sourceCode];
			text: 'Accept (Ctrl-S)']</body>

<body package="SeasideLearningCenter-Browser" selector="renderSourceOn:">renderSourceOn: html 
	sourceCode := self sourceCode ifNil: [^html space].
	self isReadOnly ifTrue: [^self renderReadOnlySourceOn: html].
	self renderMessageOn: html.
	html form: 
			[(html textArea)
				id: #contents;
				callback: [:v | sourceCode := v];
				value: sourceCode.
			self renderSaveButtonOn: html.
			self renderRenameButtonOn: html.
			self renderRemoveButtonOn: html.]</body>
</methods>

<methods>
<class-id>Seaside.SULearningUtilities class</class-id> <category>huge font</category>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	| style cStyle |
	cStyle := VariableCharacterAttributes newWithDefaultAttributes.
	cStyle setDefaultQuery: (FontDescription new
			family: #('helv' 'helvetica' 'arial' '*');
			manufacturer: #('adobe' '*');
			fixedWidth: false;
			serif: false;
			italic: false;
			boldness: 0.5;
			pixelSize: 12 "The actual value will be set later").
	style := VariableSizeTextAttributes new.
	style setCharacterAttributes: cStyle.
	style scalingFactor: 1.6.
	style install.
	TextAttributes styleNamed: #huge put: style.</body>

<body package="SeasideLearningCenter-Core" selector="useHugeFont">useHugeFont
	"(self useHugeFont)"
	TextAttributes
		setDefaultTo: #huge;
		resetViews</body>

<body package="SeasideLearningCenter-Core" selector="useRegularFont">useRegularFont
	"(self useRegularFont)"
	TextAttributes
		setDefaultTo: #default;
		resetViews</body>
</methods>

<methods>
<class-id>Seaside.SUNot</class-id> <category>printing</category>

<body package="SeasideLearningCenter-Extensions" selector="printContentOn:">printContentOn: aStream
	aStream nextPutAll: 'if(!'; javascript: self statement; nextPutAll: '){'.
	super printContentOn: aStream.
	aStream nextPut: $}</body>
</methods>

<methods>
<class-id>Seaside.SULearningElement</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="actualSample">actualSample
	^actualSample ifNil: [self sampleGenerated]</body>

<body package="SeasideLearningCenter-Core" selector="actualSample:">actualSample: anObject
	actualSample := anObject</body>

<body package="SeasideLearningCenter-Core" selector="actualSnippet">actualSnippet
	^actualSnippet ifNil: [self snippet]</body>

<body package="SeasideLearningCenter-Core" selector="actualSnippet:">actualSnippet: anObject
	actualSnippet := anObject</body>

<body package="SeasideLearningCenter-Core" selector="initialize">initialize
	initializer ifNotNil: [initializer value].</body>

<body package="SeasideLearningCenter-Core" selector="initializer">initializer
	^initializer</body>

<body package="SeasideLearningCenter-Core" selector="initializer:">initializer: anObject
	initializer := anObject</body>

<body package="SeasideLearningCenter-Core" selector="sample">sample
	^sample ifNil: [self snippet]</body>

<body package="SeasideLearningCenter-Core" selector="sample:">sample: anObject
	sample := anObject</body>

<body package="SeasideLearningCenter-Core" selector="sampleGenerated">sampleGenerated
	^self sampleWithSnippet: self actualSnippet</body>

<body package="SeasideLearningCenter-Core" selector="snippet">snippet
	^snippet</body>

<body package="SeasideLearningCenter-Core" selector="snippet:">snippet: anObject
	snippet := anObject</body>

<body package="SeasideLearningCenter-Core" selector="title">title
	^title</body>

<body package="SeasideLearningCenter-Core" selector="title:">title: anObject
	title := anObject</body>
</methods>

<methods>
<class-id>Seaside.SULearningElement</class-id> <category>private</category>

<body package="SeasideLearningCenter-Core" selector="sampleWithSnippet:">sampleWithSnippet: aString
	| text |
	sample isNil ifTrue: [^aString].
	text := aString copyReplaceAll: (String with: Character tab)
				with: (String with: Character tab with: Character tab).
	^self sample expandMacrosWithArguments: (Array with: text)</body>
</methods>

<methods>
<class-id>Seaside.SULearningCSS</class-id> <category>demos</category>

<body package="SeasideLearningCenter-Core" selector="demo001">demo001
	^(SULearningElement new)
		title: 'Progress bar (default)';
		snippet: 'BGProgressBar new
	progress: 35;
	yourself';
		sample: 'html render: (&lt;1s&gt;)';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo002">demo002
	^(SULearningElement new)
		title: 'Progress bar (styled)';
		snippet: 'BGProgressBar new
	progress: 85;
	barColor: (Color fromString: ''#345ba8'');
	textColor: (Color white);
	yourself';
		sample: 'html render: (&lt;1s&gt;)';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo003">demo003
	^(SULearningElement new)
		title: 'Good/bad chart';
		snippet: 'BGGoodBadChart new
	add: ''Smalltalk'' value: 75;
	yourself';
		sample: 'html render: (&lt;1s&gt;)';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo004">demo004
	^(SULearningElement new)
		title: 'Good/bad chart many';
		snippet: 'BGGoodBadChart new
	add: ''Javascript'' value: 25;
	add: ''CSS'' value: 55;
	add: ''Smalltalk'' value: 75;
	yourself';
		sample: 'html render: (&lt;1s&gt;)';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo005">demo005
	^(SULearningElement new)
		title: 'Star rating';
		snippet: 'SRStarRater default 
	clickable: false; 
	rating: 3.6;
	yourself';
		sample: 'html render: (&lt;1s&gt;)';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo006">demo006
	^(SULearningElement new)
		title: 'Star rating clickable';
		snippet: 'data := SRStarRater alternative: 10';
		sample: 'html render: (&lt;1s&gt;).
html div with: data rating';
		actualSample: 'html style: child personalStyle.
html render: child.
html div with: child rating';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demo007">demo007
	^(SULearningElement new)
		title: 'Star rating callback';
		snippet: 'data := (SRStarRater alternative: 10)
	callback: [:v | Transcript cr; print: v];
	yourself';
		sample: 'html render: (&lt;1s&gt;).
html div with: data rating';
		initializer: [self data: (SRStarRater alternative: 10)];
		actualSample: 'html style: child personalStyle.
html render: child.
html div with: child rating';
		yourself</body>

<body package="SeasideLearningCenter-Core" selector="demos">demos
	^(OrderedCollection new)
		add: self demo001;
		add: self demo002;
		add: self demo003;
		add: self demo004;
		add: self demo005;
		add: self demo006;
		add: self demo007;
		yourself</body>
</methods>

<methods>
<class-id>Seaside.SULearningCSS</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderDemoOn:">renderDemoOn: html
"This method has been generated and will be rewritten when regenerated"

html render: (BGGoodBadChart new
		add: 'Smalltalk' value: 75;
		yourself)</body>

<body package="SeasideLearningCenter-Core" selector="updateRoot:">updateRoot: anHtmlRoot
	super updateRoot: anHtmlRoot.
	(self session application libraries includes: BGGoodBadStyles) ifFalse:
		[BGGoodBadStyles updateRoot: anHtmlRoot].
	(self session application libraries includes: SRStyles) ifFalse:
		[SRStyles updateRoot: anHtmlRoot].</body>
</methods>

<methods>
<class-id>Seaside.SULearningCSS class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'CSS vizualisations workspace'</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#CSS</body>
</methods>

<methods>
<class-id>Seaside.SULearningCSS class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SULearningCometChat</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Core" selector="renderContentOn:">renderContentOn: html 
	html 
		anchorWithPopupUrl: 'http://localhost:8008/seaside/stream/comet/counter'
		extent: 200 @ 200
		text: 'Counter'.
	html space.
	html text: 'Comet counter'.
	html break.
	html break.
	html 
		anchorWithPopupUrl: 'http://localhost:8008/seaside/stream/comet/chat'
		extent: 400 @ 600
		text: 'Chat'.
	html space.
	html text: 'Comet chat'.
	4 timesRepeat: [html break].
	html text: 'Try these in a workspace :'.
	html preformatted: '

	CTCounter count value: 999.

	CTChat messageToAll: ''Please logout''.

'</body>

<body package="SeasideLearningCenter-Core" selector="rendererClass">rendererClass
	^WAHtmlRenderer</body>
</methods>

<methods>
<class-id>Seaside.SULearningCometChat class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Core" selector="description">description
	^'Comet chat demo'</body>

<body package="SeasideLearningCenter-Core" selector="topic">topic
	^#Comet</body>
</methods>

<methods>
<class-id>Seaside.SULearningCometChat class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Core" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Refactory.Browser.RefactoringBrowser class</class-id> <category>interface specs</category>

<body package="BiggerRB" selector="defaultSize">defaultSize
	^#( 940 720 )</body>
</methods>

<methods>
<class-id>Refactory.Browser.RefactoringBrowser class</class-id> <category>interface opening</category>

<body package="BiggerRB" selector="openOnEnvironment:type:state:hierarchy:">openOnEnvironment: anEnvironment type: aNavigatorTypeSymbol state: aNavigatorState hierarchy: aBoolean 
	| browser type |
	type := aNavigatorState categories isEmpty 
				ifTrue: 
					[aNavigatorState parcels isEmpty 
						ifTrue: 
							[aNavigatorState pundles isEmpty 
								ifTrue: [aNavigatorTypeSymbol]
								ifFalse: [#Package]]
						ifFalse: [#Parcel]]
				ifFalse: [#Category].
	browser := self onEnvironment: anEnvironment type: type.
	browser allButOpenInterface: #windowSpecWithSizesAdjusted.
	aNavigatorState hasSelection 
		ifTrue: 
			[(anEnvironment isSelector and: [anEnvironment numberSelectors = 1]) 
				ifTrue: [browser toggleZoom].
			browser navigator updateWithState: aNavigatorState].
	browser finallyOpen.
	"The following redundant update request works around Wrapper bug to ensure
	that any selection of the navigator state is displayed in the new browser."
	aNavigatorState hasSelection 
		ifTrue: 
			[(anEnvironment isSelector and: [anEnvironment numberSelectors = 1]) 
				ifTrue: [browser toggleZoom].
			browser navigator updateWithState: aNavigatorState].
	aBoolean ifTrue: [browser navigator beHierarchy].
	^browser</body>
</methods>

<methods>
<class-id>Refactory.Browser.RefactoringBrowser class</class-id> <category>interface specs</category>

<body package="BiggerRB" selector="windowSpecWithSizesAdjusted">windowSpecWithSizesAdjusted
	| spec spec3 |
	spec := self windowSpec copy.
	spec at: 3 put: (spec3 := (spec at: 3) copy).
	spec3 at: 7 put: #( #{Graphics.Rectangle} 0 0 ), self defaultSize.
	^spec</body>
</methods>

<methods>
<class-id>Seaside.CFDemo class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.CFDemo class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Javascript</body>
</methods>

<methods>
<class-id>Seaside.SUEvaluatorTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous evaluator demo'</body>
</methods>

<methods>
<class-id>Seaside.SUEvaluatorTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUEvaluatorTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUEffectsTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous effects'</body>
</methods>

<methods>
<class-id>Seaside.SUEffectsTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUEffectsTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUSortableTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous sortable demo'</body>
</methods>

<methods>
<class-id>Seaside.SUSortableTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUSortableTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUMorphTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous morph demo'</body>
</methods>

<methods>
<class-id>Seaside.SUMorphTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUMorphTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.FIDemo class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.FIDemo class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Javascript</body>
</methods>

<methods>
<class-id>Seaside.SUTogglesTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous effects, toggles'</body>
</methods>

<methods>
<class-id>Seaside.SUTogglesTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUTogglesTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUTreeTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous tree demo'</body>
</methods>

<methods>
<class-id>Seaside.SUTreeTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUTreeTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUFormTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous form elements demo'</body>
</methods>

<methods>
<class-id>Seaside.SUFormTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUFormTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.ShoreBrowser class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^false</body>
</methods>

<methods>
<class-id>Seaside.SUPeriodicalTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous periodical demo'</body>
</methods>

<methods>
<class-id>Seaside.SUPeriodicalTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUPeriodicalTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUUpdaterTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous updater demo'</body>
</methods>

<methods>
<class-id>Seaside.SUUpdaterTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUUpdaterTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.WAFullClassBrowser class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Ajax Smalltalk class browser (four panes) with SeasideAsync updaters'</body>
</methods>

<methods>
<class-id>Seaside.WAFullClassBrowser class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.WAFullClassBrowser class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.BGBarDemo class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.BGBarDemo class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#CSS</body>
</methods>

<methods>
<class-id>Seaside.PKLabelDemo class</class-id> <category>registration</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Plotkit chart based on javascript and XHTML canvas'</body>
</methods>

<methods>
<class-id>Seaside.PKLabelDemo class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.PKLabelDemo class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Javascript</body>
</methods>

<methods>
<class-id>Seaside.WAComponent class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^false</body>

<body package="SeasideLearningCenter-Extensions" selector="libraries">libraries
	"CFDemo libraries"

	| app |
	app := WAApplication allInstances 
				select: [:each | each rootComponent == self].
	app isEmpty ifTrue: [^#()].
	^app first libraries</body>
</methods>

<methods>
<class-id>Seaside.WAComponent class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^nil</body>
</methods>

<methods>
<class-id>Seaside.WAComponent</class-id> <category>convenience</category>

<body package="SeasideLearningCenter-Extensions" selector="removeDecoration">removeDecoration
	decoration := nil.</body>
</methods>

<methods>
<class-id>Seaside.WABrowser class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Non-Ajax class browser component'</body>
</methods>

<methods>
<class-id>Seaside.WABrowser class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.WABrowser class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.WABrowser</class-id> <category>rendering</category>

<body package="SeasideLearningCenter-Extensions" selector="style">style

	^ '

	#contents {width: 40em; height: 20em; font-family: Tahoma, Helvetica, Sans; font-size: 110%}

	.column-choice select {width: 12em; font-size: 90%}

	'</body>
</methods>

<methods>
<class-id>Seaside.SUDragDropTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous drag and drop demo'</body>
</methods>

<methods>
<class-id>Seaside.SUDragDropTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUDragDropTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUAutocompleterTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous autocompletion demo'</body>
</methods>

<methods>
<class-id>Seaside.SUAutocompleterTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUAutocompleterTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUInPlaceEditorTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous in-place editor demo'</body>
</methods>

<methods>
<class-id>Seaside.SUInPlaceEditorTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUInPlaceEditorTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUCounterTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous version of the minimal counter application'</body>
</methods>

<methods>
<class-id>Seaside.SUCounterTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUCounterTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SUSliderTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="description">description
	^'Scriptaculous slider demo'</body>
</methods>

<methods>
<class-id>Seaside.SUSliderTest class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SUSliderTest class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#Ajax</body>
</methods>

<methods>
<class-id>Seaside.SRDemo class</class-id> <category>testing</category>

<body package="SeasideLearningCenter-Extensions" selector="isDemo">isDemo
	^true</body>
</methods>

<methods>
<class-id>Seaside.SRDemo class</class-id> <category>accessing</category>

<body package="SeasideLearningCenter-Extensions" selector="topic">topic
	^#CSS</body>
</methods>

<methods>
<class-id>Seaside.SUObject</class-id> <category>decorations</category>

<body package="SeasideLearningCenter-Extensions" selector="not:">not: anObject
	"Treat anObject as a condition to the execution of the receiver."

	self addDecoration: (SUNot on: anObject)</body>
</methods>

<initialize>
<class-id>Seaside.SUFullClassBrowser</class-id>
</initialize>

<initialize>
<class-id>Seaside.SULearningCenterLibrary</class-id>
</initialize>

<initialize>
<class-id>Seaside.SUScriptaculousAndAsyncTest</class-id>
</initialize>

<initialize>
<class-id>Seaside.SULearningTask</class-id>
</initialize>

<initialize>
<class-id>Seaside.SULearningUtilities</class-id>
</initialize>

<do-it>"Imported Classes:"</do-it>

<do-it>self error: 'Attempting to file-in parcel imports.  Choose terminate or close'</do-it>

<class>
<name>Object</name>
<environment>Core</environment>
<super></super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Kernel-Objects</category>
<attributes>
<package>Kernel-Objects</package>
</attributes>
</class>

<class>
<name>WAFileLibrary</name>
<environment>Seaside</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Seaside-Libraries</category>
<attributes>
<package>Seaside-Libraries</package>
</attributes>
</class>

<class>
<name>SUObject</name>
<environment>Seaside</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>decoration canvas </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Scriptaculous-Core</category>
<attributes>
<package>Scriptaculous-Core</package>
</attributes>
</class>

<class>
<name>WADecoration</name>
<environment>Seaside</environment>
<super>Seaside.WAPresenter</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>next </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Seaside-Component</category>
<attributes>
<package>Seaside-Component</package>
</attributes>
</class>

<class>
<name>Browser</name>
<environment>Squeak</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>systemCategories classNames methodCategories selectors contents displayOption isClassComment namespace </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Squeak</category>
<attributes>
<package>Squeak-ClassBrowser</package>
</attributes>
</class>

<class>
<name>WAComponent</name>
<environment>Seaside</environment>
<super>Seaside.WAPresenter</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>decoration </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Seaside-Component</category>
<attributes>
<package>Seaside-Component</package>
</attributes>
</class>

<class>
<name>WATask</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Seaside-Component</category>
<attributes>
<package>Seaside-Component</package>
</attributes>
</class>

<class>
<name>WABrowser</name>
<environment>Seaside</environment>
<super>Seaside.WAComponent</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>contents model message </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Seaside-Components-Tools</category>
<attributes>
<package>Seaside-Components-Tools</package>
</attributes>
</class>

<class>
<name>Error</name>
<environment>Core</environment>
<super>Core.Exception</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Kernel-Exception Handling</category>
<attributes>
<package>Kernel-Exception Handling</package>
</attributes>
</class>

<class>
<name>SUStatement</name>
<environment>Seaside</environment>
<super>Seaside.SUDecoration</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>statement </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Scriptaculous-Decoration</category>
<attributes>
<package>Scriptaculous-Decoration</package>
</attributes>
</class>

</st-source>
