<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
[[WASH-SE]]
[[Issues]]
{{{
var o=null;
var p=null;

if (argv[1]==='-v' && argv[2]) {
  // process verbose...
  Console.print("Describing '" + argv[2] + "':\n\n");
  o = eval(argv[2]);
  for (p in o) { Console.print('  '+p+': ' + o[p] + "\n"); }
} else if (argv[1]) {
  // or just dump the property and method names...
  Console.print("Describing '" + argv[1] + "':\n\n");
  o = eval(argv[1]);
  for (p in o) { Console.print('  '+p+"\n"); }
} else {
  Console.print("Error.\n");
}
}}}
* [[WASH-SE (Simplified Edition)|http://psema4.com/blog/blog1.php/2008/09/07/wash-se#more30]] doesn't natively support multiple consoles
* Need VFS support so WASH can access tiddlers as if they were microfiles
* Need to hijack the close buttons for garbage collection (on window.Console)?
[[WASH-SE]]
[[Issues]]
[[PluginWASH]]
/***
|Name|PluginWASH|
|Created by|ScottElcomb|
|Location|http://projects.psema4.com/wash-se/tw_plus_wash-se.html|
|Version|1.0.1|
|Requires|~TW2.x|
!Description
Adds the Web Application SHell (Simplified Edition) to TiddlyWiki.

!History
* September 14 2008, version 1.0.1:
** Added the &lt;&lt;WASH&gt;&gt; macro
** Added code to target a tiddler as the container for the WASH panel
** Adjusted CSS position and sizing for embedding into tiddlers.
** Edit [[WASH Launcher]] to see how to instantiate a shell.
** Added [[jsin/insmod|http://psema4.com/blog/blog1.php/2008/09/13/wash-se-jsin-insmod]] support
** Hacked in some support for tiddlers:
*** Command execution.  Tiddler must be tagged 'code'...  See [[SampleCode]] or [[DescribeObject]]
*** ls lists tiddlers available in window.store.  (Shadow tiddlers not included)
*** cat prints the contents of a tiddler available from window.store
* September 7 2008, version 1.0.0:
** Initial version

!Notes
* This plugin provides a basic runtime command line interface to a TiddlyWiki.
* Add the console to any tiddler with the &lt;&lt;WASH&gt;&gt; macro but please note that WASH-SE does not fully support multiple consoles.

!Code
***/

//{{{
window.WASH = function(optsObj) {
  this.opts = (optsObj) ? optsObj : {};

  this.init = function(optsObj) {
    var opts = (optsObj) ? optsObj : {};
    var top = (opts.top) ? opts.top : 0;
    var left = (opts.left) ? opts.left : 0;
    var width = (opts.width) ? opts.width : "98%";
    var height = (opts.height) ? opts.height : 400;

    // Modified for TiddlyWiki plugin 1.0.1
    var panelTarget = (opts.target) ? opts.target : document.getElementsByTagName('body')[0];
    if (! panelTarget.tagName) {
      if (story && story.getTiddler(opts.target)) {
        panelTarget = story.getTiddler(opts.target);
      } else {
        panelTarget = document.getElementsByTagName('body')[0];
      }
    }
    // END: New for plugin 1.0.1

    this.panel = document.createElement('div');
    this.stdout = document.createElement('textarea');
    this.stdin = document.createElement('input');

    this.panel.id = 'PANEL';
    this.panel.style.position = 'relative'; // Modified for plugin 1.0.1
    this.panel.style.top = top + 'px';
    this.panel.style.left = left + 'px';
    if (width.match(/%/)) {
      this.panel.style.width = width;
    } else {
      this.panel.style.width = width + 'px';
    }
    this.panel.style.height = height + 'px';
    this.panel.style.padding = '4px';
    this.panel.style.backgroundColor = '#ddd';
    this.panel.style.border = '2px outset #ddd';

    if (opts && opts.show) {
      this.panel.style.visibility = 'visible';
    } else {
      this.panel.style.visibility = 'hidden';
    }

    this.stdout.id = 'STDOUT';
    this.stdout.style.width = '100%';
    this.stdout.style.height = (height - 40) + 'px';
    this.stdout.style.backgroundColor = '#ddd';

    this.stdin.id = 'STDIN';
    this.stdin.type = 'text';
    this.stdin.style.width = '100%';

    this.panel.appendChild(this.stdout);
    this.panel.appendChild(this.stdin);
    if (panelTarget) { panelTarget.appendChild(this.panel); }

    this.panel.component = this;
    this.stdin.onkeypress = this.panel.component.keyHandler;
    this.print("Welcome to WASH SE, the Web Application SHell - Simplified Edition\n");
    this.print("(C)2004,2008 psema4Technologies\n");
    this.print("Licensed under the LGPL v2.1\n\n");
    this.print("Type ? for help.\n\n");
    if (opts && opts.show) { this.stdin.focus(); }
  }

  this.show = function() {
    this.panel.style.visibility = 'visible';
    this.stdin.focus();
  }

  this.hide = function() {
    this.panel.style.visibility = 'hidden';
  }

  this.print = function(buf) {
    this.stdout.value += buf;
    this.stdout.scrollTop = this.stdout.scrollHeight;
  }

  this.keyHandler = function(evt) {
    // NOTE: In this routine the keyword 'this' points to the element that received the event -
    //        not the WASH object.
    var e = (evt) ? evt : window.event;

    if (e.keyCode && e.keyCode === 13) {
      var Console = this.parentNode.component;
      if (Console) {
        Console.exec(Console.stdin.value);
        Console.stdin.value = '';
        Console.print("\n");
      } else {
        alert('WASH.keyHandler(): NO CONSOLE!');
      }
    }
  }

  this.exec = function(cmdline) {
    var argv = cmdline.split(/\s+/);
    var cmd = (argv[0]) ? argv[0] : 'NOP';
    var args = '';
    for (var i=1; i<argv.length; i++) { args += argv[i] + ' '; }
    args = args.replace(/\s+$/, '');

    if (cmd.toLowerCase() === 'nop') { return; }
    this.print(cmdline + "\n");

    switch(cmd.toLowerCase()) {
      case 'cat':
        var microFile = document.getElementById(argv[1]);
        if (microFile
            && (microFile.className === 'code'
             || microFile.className === 'data')
            && microFile.childNodes[0].nodeType === 3
           ) { 
          var code = microFile.childNodes[0].data + ''
          code = code.replace(/&lt;/g, '<'); // fix html entities
          this.print(code + "\n");
        } else { // check for tiddlers...
          if (store && store.getTiddler(argv[1])) {
            this.print(store.getTiddlerText(argv[1]));
          }
        }

        break;

      case 'clear':
        this.stdout.value = '';
        break;

      case 'echo':
        this.print(args + "\n");
        break;

      case 'eval':
        var retval = eval(args+'');
        if (retval !== undefined) { this.print(retval + "\n"); }
        break;

      case 'go':
        window.Console.print("Going to '" + argv[1] + "'\n");
        window.location = argv[1];
        break;

      case '?':
      case 'help':
        this.print("WASH Builtins\n\n");
        this.print("  [filename] .................. Read and execute (if possible) a microfile\n");
        this.print("  cat [filename] .............. Dumps the contents of a microfile\n");
        this.print("  clear ....................... Clears the console output\n");
        this.print("  echo [text] ................. Echoes [text] to the console output\n");
        this.print("  eval [expression] ........... Evaluates a JavaScript [expression]\n");
        this.print("  go [url] .................... Go to a new URL.  Warning: Replaces this web page!\n");
        this.print("  help, ? ..................... Displays the WASH Builtins help screen\n");
        this.print("  jsin [file], insmod [file] .. Imports a Javascript [file]\n");
        this.print("  ls .......................... Lists microfiles in this HTML document\n");
        this.print("  reboot ...................... Reload the current URL.  Warning for 'go' applies here too.\n");
        break;

      case 'jsin':
      case 'insmod':
        Console.print("loading js script.. " + argv[1] + "\n");
        var d=document;
        var s=d.createElement('script');
        try {
          s.type='application/javascript';
          s.src= argv[1];
          d.getElementsByTagName('head')[0].appendChild(s);
        } catch(e) {
          Console.print("Error in loading..\n");
        }
        Console.print("loaded..");
        break;

      case 'ls':
        var files = new Array();
        var els = document.getElementsByTagName('div');
        this.print("Listing microfiles:\n\n");

        for (var i=0; i < els.length; i++) {
          if (els[i].className === 'code' || els[i].className === 'data') { files.push(els[i]); }
        }
        for (var i=0; i < files.length; i++) {
          Console.print("  " + files[i].id + "\n");
        }

        if (store) {
          this.print("\nListing tiddlers:\n\n");
          store.forEachTiddler(function(t,tiddler) {
            Console.print(" " + t + "\n");
          });
        }
        break;

      case 'reboot':
        window.location = window.location + '';
        break;

      default:
        var microFile = document.getElementById(cmd);
        var code = null;

        if (microFile) {
          if (microFile.className === 'code' && microFile.childNodes[0].nodeType === 3) {
            code = microFile.childNodes[0].data + ''
            code = code.replace(/&lt;/g, '<'); // fix html entities
          } else {
            this.print("Command not executable.\n");
          }

        // Check for tiddlers tagged 'code'
        } else if (store && store.getTiddler(cmd)) {
          var t = store.getTiddler(cmd);
          for (var i=0; i<t.tags.length; i++) {
            if (t.tags[i].toLowerCase() === 'code') {
              code = store.getTiddlerText(cmd);
            }
          }
          if (! code) { this.print("Tiddler not executable.\n"); }

        } else {
          this.print("Command not found.\n");
        }

        if (code) {
          var retval = eval(code);
          if (retval !== undefined) { this.print(retval + "\n"); }
        }
    }
  }

  this.init(this.opts);
}

config.macros.WASH = {
  handler: function (place, macroName, params, wikifier, paramString, tiddler)
  {
      window.Console = new WASH({show:true, target: tiddler.title});
  }
};

//}}}
{{{
Console.print("This is SampleCode!\n");
}}}
A Plugin For [[TiddlyWiki|http://www.tiddlywiki.com/]]
[[WASH-SE|http://psema4.com/blog/blog1.php/2008/09/07/wash-se#more30]]: 
<<WASH>>
{{{
if (argv[1]) {
  var title = argv[1];
  try {
    story.displayTiddler(null, argv[1], DEFAULT_EDIT_TEMPLATE);
  } catch (e) {
    Console.print(e.message + "\n");
  }
}
}}}
{{{
if (argv[1]) {
  var title = argv[1];
  try {
    story.displayTiddler(null, argv[1], DEFAULT_VIEW_TEMPLATE);
  } catch (e) {
    Console.print(e.message + "\n");
  }
}
}}}