Software requirement: Javascript. Please wait then continue

NemWiki Guru Meditation ... #00000000.0000002A
My TiddlyWiki - a reusable non-linear personal web notebook
	



Software requirement: Javascript. Please wait then continue

NemWiki Guru Meditation ... #00000000.0000002A
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 excludeLists'></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>>
/*{{{*/

// may be required for mikes comments plugi
//window.saveChanges = function(){};

setStylesheet(
	"label {width:8em; float:left; text-align:right; width:9em; font-size:1.1em; padding:3px;  height:1.5em: top:-20px; margin: 0px -2px 0 0;}"+ 
//	"div.wizardFooter {padding-left:0em}"+ 
	"div.wizardStep > input {display:fixed; padding:3px; margin-bottom:5px; margin-top:0px; margin-right:0px}",
'labelStyles');




config.backstageTasks.remove("upgrade");
config.backstageTasks.remove("save");
config.backstageTasks.remove("sync");


//  ccAutoSave config//

config.options.chkAutoSave = true;

if(!config.extensions) { config.extensions = {}; } //# obsolete from v2.4.2
config.extensions.ServerSideSavingPlugin = {
	adaptor: config.adaptors.cctiddly
};


window.ccTiddlyVersion = '1.8.5';
window.workspacePermission= {};
window.url = "http://nemo.house.cx/";
window.workspace = "";
window.fullUrl = window.url;	
window.useModRewrite = 1;
//if (config.options.txtTheme == "")
//config.options.txtTheme = 'purpleTheme';
workspacePermission.anonC = 0 ;
workspacePermission.anonR = 1; 
workspacePermission.anonU = 0;
workspacePermission.anonD = 0;

workspacePermission.userC = 1 ;
workspacePermission.userR = 1; 
workspacePermission.userU = 1;
workspacePermission.userD = 0;
workspacePermission.canCreateWorkspace = 0;

// hide new journal
config.macros.newJournal.handler=function(place,macroName,params,wikifier,paramString,tiddler){};
// hide new tiddler 
config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler){};

window.workspace_delete = "D";
window.workspace_udate = "D";

var serverside={
	url:"http://nemo.house.cx/",		//server url, for use in local TW or TW hosted elsewhere
	workspace:"",
	queryString:"",
	debug:0,		//debug mode, display alert box for each action
	passwordTime:0,		//defines how long password variable store in cookie. 0 = indefinite
	messageDuration:5000,				//displayMessage autoclose duration (in milliseconds), 0=leave open
	loggedIn:0,
	can_create_account:"0",
	openId:"0"
};

config.defaultCustomFields = {"server.host":window.url, "server.type":"cctiddly", "server.workspace":window.workspace};
config.shadowTiddlers.OptionsPanel = "[[help|Help]] <br />[[settings|AdvancedOptions]]<br /><<ccOptions>>";

readOnly =false;
config.options.chkHttpReadOnly = false;		//make it HTTP writable by default
config.options.chkSaveBackups = false;		//disable save backup
//config.options.chkAutoSave = true;			//disable autosave
config.options.chkUsePreForStorage = false;

/*}}}*/
powerpapepowerpape
<<taggedTabs loginBox>>
<<ccChangePassword>>
<div class='toolbar' macro='toolbar closeTiddler closeOthers'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<<ccFile>>
[[Login]]
<<ccLogin>>
|~ViewToolbar|closeTiddler closeOthers > editTiddler +collapseTiddler collapseOthers permalink ! fields syncing  revisions references ! jump < |
|~CollapsedToolbar|+expandTiddler collapseOthers closeTiddler closeOthers |
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddlerHosted|
handle/proxy.php?feed=
<<ccUpload>>
<<taggedTabs loginBox>>
<<ccCreateWorkspace>>
<<ccStats>>
<<ccEditWorkspace>>
powerpape


Please see the TiddlyWiki community wiki documentation : http://tiddlywiki.org/wiki/TiddlyWiki_Markup


!!!{{{<<ccUpload>>}}}
If enabled on the server users can upload files to the ccTiddly server

!!!{{{<<ccLogin>>}}}
Displays the login box if the users is not logged in, if the user is logged in they are shown a logout button

!!!{{{<<ccLoginStatus>>}}}
As with {{{<<ccLogin>>}}} except this displays a link to the login tiddler so can be used where space is tight. 

!!!{{{<<ccCreateWorkspace>>}}}
Allows users with permission to create a workspace and define its permissions.

!!!{{{<<ccEditWorkspace>>}}}
Allows admin users to change the permission of a workspace.

!!!{{{<<ccAdmin>>}}}
Allows admin users to add and remove admin users for a workspace.

!!!{{{<<ccVersion>>}}}
Allows users to confirm which version of ccTiddly they are using.
~TiddlyWiki is a single html file containing all the characteristics of a wiki - all the content, all the functionality (including editing, saving, tagging and searching) and the style sheet. Because it's a single file, it's very portable - you can email it, put it on a web server or share it via a USB stick. ccTiddly provides a serverside backend to ~TiddlyWiki so you can store your content on the web and access it from anywhere. 

Together the two provide a powerful combination which allows you to collaborate with your colleages online, you can then tear a copy of all the work to take on a plane or train journey.  When you have found an internet connection again you can sync your changes with the online copy and you will be notified of any conflicts. 

Some things you could do with ccTiddly workspace include: 

	* A team/public Website
	* A Blog
    * A personal notebook
    * A GTD ("Getting Things Done") productivity tool
    * A collaboration/communication tool
	* A TeamTasks implementation
    * For building websites (this site is a TiddlyWiki file!)
    * For rapid prototyping
    * ...and much more!

You can import and export data to and from all sorts of places. Check out the backstage > import options. There's a more detailed list of features here.

<<slider cctHelpIntro [[ccTiddly Introduction]] "ccTiddly Introduction »" "A introduction to the basics of TiddlyWiki.">>
<<slider cctHelpFormatting [[TiddlyWiki Formatting Guide]] "Tiddly Wiki Formatting Guide »" "A basic guide to TiddlyWiki formatting.">>
<<slider cctHelpccTiddlyMacros [[ccTiddly Macros]] "ccTiddly Macros »" "A Guide to all the ccTiddly Macros">>
<<slider cctHelpTiddlyWikiMacros [[TiddlyWiki Macros]] "TiddlyWiki Macros »" "A Guide to all the TiddlyWiki Macros">>

!!!{{{<<today>>}}}
Shows current date.

!!!{{{<<version>>}}} 
This macro shows the version number of the current TiddlyWiki document.

!!!{{{<<Alltags>>}}}
Lists all tags. Clicking on a tag lists all the tiddlers assigned that tag. 

!!!{{{<<List [type]>>}}} 
Parameters : (all (default), missing, orphans, shadowed, touched, filter)

!!!{{{<<Timeline [date] [length] [format]>>}}} 
 The timeline macro creates a list of tiddlers sorted by a date specified.

Example : 
{{{<<timeline "modified" "0" "ddd, YYYY-0MM-0DD">>}}}

Produces : 
<<timeline "modified" "0" "ddd, YYYY-0MM-0DD">>
!!!{{{<<Slider cookie tiddler label tooltip>>}}}
The slider macro allows embedding tiddlers within another tiddler, with the option to toggle the visibility of the transcluded contents.

    * cookie: variable to save the state of the slider
    * tiddler: name of the tiddler to include in the slider
    * label: title text of the slider
    * tooltip: tooltip text of the slider 

 Example
{{{<<slider chkTestSlider [[OptionsPanel]] "Options" "Open advanced options">>}}}

Produces : 
<<slider chkTestSlider [[OptionsPanel]] "Options" "Open advanced options">>
!!!{{{<<Tabs>>}}}
The tabs macro creates an area where it displays one of several tiddlers alternately, as the user clicks on the tab labels at the top.

It is used like this:

{{{<<tabs ID Label1 Tip1 Tiddler1 Label2 Tip2 Tiddler2 [Label3 ...]>>}}}

produces :
<<tabs ID Label1 Tip1 Tiddler1 Label2 Tip2 Tiddler2 [Label3 ...]>>

    * ID: specifies the name of a cookie used to save the information about which tab was displayed last.
    * Label1, Label2, ... define the labels that are displayed at the top of the area for each tab
    * Tip1, Tip2, ... define tooltips that explain, somewhat more verbosely than the labels, what you can expect to find on each tab.
    * Tiddler1, Tiddler2, ... name the tiddlers that are displayed on each tab. 

Obviously, there must be exactly three strings for each tab.

The syntax for the tabs macro looks like this:

{{{<<tabs txt[cookieName]
	"[label]" "[title]" [[tiddler]]
	"[label]" "[title]" [[tiddler]]
	...
     >>}}}

produces :

<<tabs txt[cookieName]
	"[label]" "[title]" [[tiddler]]
	"[label]" "[title]" [[tiddler]]
	...
     >>

!!!{{{<<Tagging [tag]>>}}}
This macro generates a list of tiddlers that carry the specified tag.

<<tagging [tag]>>

If the tag parameter is not specified, the current tiddler's name will be used instead.
!!!{{{<<Tagchooser>>}}}
!!!{{{<<NewJournal>>}}}
This macro generates a button to create a journal tiddler, using the current time and date as title.

It is otherwise identical to the NewTiddler macro.

Example : 
{{{<<newJournal [date format]>>}}}

Produces : 
<<newJournal [date format]>>

The optional parameter can be used to specify a custom date format.

In addition, all of the NewTiddler macro's parameters are valid.

!!!{{{<<NewTiddler>>}}}

 Usage

<<newTiddler [parameters]>>

Parameters

This macro uses named parameters. All parameters are optional.
|Parameter|Description|
|label |button label|
|prompt|button tooltip|
|title|title for the new tiddler (defaults to "New Tiddler")|
|text|contents for the new tiddler|
|tag|tag to be applied to the new tiddler (parameter can be used repeatedly to specify multiple tags)|
|accessKey|single letter to use as access key to trigger the button|
|focus|which of the editable fields to default the focus to (e.g. "title", "text", "tags")|
|template|template tiddler to use to display the new tiddler (defaults to EditTemplate)|
|fields|custom fields to be assigned to the new tiddler, in name:value;name:value; format|

Only fields contained as input fields in the specified template can be primed with an initial value.
[edit] Example

<<newTiddler
	label:"New Tiddler"
	text:"Hello world."
	tag:"test"
	tag:"an example"
	accessKey:"1"
	focus:"tags"
>>



!!!{{{<<Savechanges>>}}}



!!!{{{<<Search>>}}}

This macro creates an input field to perform full-text searches on a TiddlyWiki document's tiddler contents.
[edit] Usage

Example : 
{{{<<search [value]>>}}}

Produces : 

<<search [value]>>

By specifiying the value parameter, the search form can be "preloaded" with the desired term.
[edit] Options
This section is still incomplete. You can help by contributing to its expansion.
Please improve the article, or discuss the issue on the talk page.

    * case-sensitive
    * regular expressions 


!!!{{{<<Gradient>>}}}

The Gradient macro allows simple horizontal and vertical coloured gradients. They are constructed from coloured HTML elements, and don't require any images to work.
The Gradient macro is an extended macro that processes the text after it up until the next '

>>

' sequence. It looks like this:
Example : 
{{{<<gradient vert #ffffff #ffdddd #ff8888>>gradient fill>>}}}

Produces : 
<<gradient vert #ffffff #ffdddd #ff8888>>gradient fill>>

The first parameter can be vert or horiz to indicate the direction of the gradient. The following parameters are two or more colours (CSS RGB(r,g,b) format is also acceptable). The macro constructs a smooth linear gradient between each of the colours in turn.

Inline CSS definitions can be added to gradient fills like this:


Example : 
{{{<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>}}}

Produces : 
<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>

!!!{{{<<Closeall>>}}}
!!!{{{<<Permaview>>}}}
Changes the browser address bar to a permalink to the current Tiddler or the set of open tiddlers. It is used with the ToolbarMacro like this:

Example : 
{{{<<toolbar permalink>>}}}
Produces : 
<<toolbar permalink>>

!!!{{{<<Toolbar>>}}}
The ToolbarMacro is used in the TemplateMechanism to define the toolbar that appearthat appear either in EditMode or in ViewMode. The arguments to the ToolbarMacro is a list of command names, as discussed in the CommandMechanism..

You can precede a command name with a "+" to specify a default command that is automatically chosen when a tiddler is double-clicked, or the ctrl-Enter key combination pressed. Similarly, precede it with "-" to specify a command to be chosen when the Escape key is pressed.
!!!{{{<<Annotations>>}}}

!!!{{{<<Edit>>}}}
The command <<edit>> switches from ViewMode to EditMode. The EditMacro is either a double mouse click inside the tiddler or the entry 'edit' in the tiddler's Toolbar. It is used in ViewTemplate as ToolbarMacro like this:
Example : 
{{{<<toolbar +editTiddler>>}}}
Produces : 
<<toolbar +editTiddler>>

!!!{{{<<Message>>}}}
!!!{{{<<Refreshdisplay>>}}}
!!!{{{<<View fieldname how...>>}}}
Retrieves a specified field (given by fieldname) from the tiddler to be displayed and outputs its value in one of the following ways (the optional //how// parameter):

    * (unspecified): render as is (without formatting)
    * link: format as a link (using createTiddlyLink)
    * wikified: format using all the normal rendering rules
    * date: expects a value of the form YYYYMMDDHHMM and outputs it using either a specified format (...) or config.views.wikified.dateFormat 

The standard field names are:

    * title - the tiddler title
    * tiddler - the tiddler title (as well)
    * text - the text of the tiddler
    * modifier - the person who last modified it
    * modified - date&time of last modification
    * created - when it was created
    * tags - the tiddler tags 

If your tiddlers contain custom fields, they could be specified as well.

The view macro is used extensively in the standard tiddler rendering templates (ViewTemplate and EditTemplate).



More info on Osmosoft can be found at [[osmosoft.com|http://osmosoft.com/]]
(this content is a work in progress)

!!!ccTiddly Tiddlers 

[[AnonDefaultTiddlers]]

Allows you to specify a different set of tiddlers to be loaded for anonymous users. Logged in users will be shown the [[DefaultTiddlers]].

[[ccAssignments]]

!!! Predefined ccTiddly Tags 

!!!!wizard
Displays the tiddler without showing the date editor tags or title. 

!!!!private
Only administrators of a workspace can read tiddlers tagged private.

!!! Working Offline : 
To take a copy of a ccTiddly workspace offline add &standalone=1 to the end of the URI and you will be prompted to download an offline file.

<<ccAdmin>>
powerpape
|''Description:''|TiddlyThemes |
|''Type:''|tiddlywiki|
|''URL:''|http://tiddlythemes.com|
|''Workspace:''|Main|
|''Description:''|MonkeyPirate|
|''Type:''|tiddlywiki|
|''URL:''|http://mptw.tiddlyspot.com/empty.html|
|''Workspace:''|Main|
|''Description:''|TeamTasks |
|''Type:''|tiddlywiki|
|''URL:''|http://getteamtasks.com/teamtasks.html|
|''image:''|http://127.0.0.1/teamtasks.jpg|
|''Workspace:''|Main|
|''Description:''|Visual TW |
|''Type:''|tiddlywiki|
|''URL:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Workspace:''|Main|
|''Description:''|Life Stream |
|''Type:''|tiddlywiki|
|''URL:''|http://simonmcmanus.com|
|''image:''|http://127.0.0.1/simonmcmanustheme.jpg|
|''Workspace:''|Main|
|''Description:''|LocalccTiddly|
|''Type:''|cctiddly|
|''URL:''|http://127.0.0.1/Trunk/|
|''Workspace:''|martin|
|''Description:''|TiddlyVault |
|''Type:''|TiddlyWiki|
|''URL:''|http://tiddlyvault.tiddlyspot.com/|
|''Workspace:''|Main|
|''Description:''|TiddlyTools |
|''Type:''|TiddlyWiki|
|''URL:''|http://tiddlytools.com|
|''Workspace:''|Main|
powerpape
/***
|''Name:''|smmTheme|
|''Author:''|Saq Imtiaz and Simon McManus|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/Trunk/tiddlers/themes/smmTheme.tiddler|
|''~CodeRepository:''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/Trunk/tiddlers/themes/smmTheme.tiddler|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.4.1|
|''~PageTemplate:''|##PageTemplate|
|''~tabs:''|##tabs|
|''~OptionsPanel:''|##OptionsPanel|
|''~StyleSheet:''|##StyleSheet|
|''~taskViewTemplate:''|##taskViewTemplate|
|''~taskEditTemplate:''|##taskEditTemplate|
|''~EditTemplate:''|##EditTemplate|
|''~ViewTemplate:''|##ViewTemplate|
***/


!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert #111 #222'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span><div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
</div>
<div id='bodywrapper'>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' force='true' tiddler='smmTheme##SideBarOptions'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<div id='contentFooter'  macro='gradient vert #222 #111'></div>
</div>
<!--}}}-->

!taskViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'>Task : </div>
<div class='task'>
	<table>
	<tr>
		<td class='taskbody' width=100%><div class='viewer' macro='view text wikified'></div></td>
		<td class='taskControls' valign='top'><div class='taskControls' macro='tiddler TaskTiddlerControls'></td>
	</tr>
	</table>
</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='tagClear'></div>
<!--}}}-->

!taskEditTemplate
<!--{{{-->
<div class="editor">
<div class='toolbar' macro='toolbar[[ToolbarCommands::EditToolbar]]'></div>
<div class='title edit' macro='edit title'></div>
<div class='task'>
	<table>
	<tr>
		<td class='taskbody' width=100% height=100%><div class='viewer edit' macro='edit text wikified'></div></div></td>
		<td class='taskControls' valign=top><div class='taskControls' macro='tiddler TaskTiddlerControls'></td>
	</tr>
	</table>
</div>
<div class='subtitle'>Last edited by: <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='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<div class='tagClear'></div>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></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>
<!--}}}-->

!ViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='subtitle'>Last edited by: <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='tagClear'></div>
<!--}}}-->

!wizardViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!OptionsPanel
[[help|Help]] <br />[[settings|AdvancedOptions]]<br /><<ccOptions>>

!tabs
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>

!SideBarOptions
<<search {{config.options.search}}>><<closeAll>><<newTiddler label:{{config.macros.newTiddler.label}} text:{{config.macros.newTiddler.text}} title:{{config.macros.newTiddler.title}} tag:"">
<<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel  {{config.macros.ccOptions.options}} 'change TiddlyWiki Options'>><<slider 'chkLoginStatus' 'LoginStatus' {{config.macros.ccLoginStatus.status}} 'Login to make changes'>><<slider chkSliderTabs SideBarTabs {{config.theme.contentTiddler}} {{config.theme.contentTiddlerTooltip}}>>


!StyleSheet
/***
General
***/
/*{{{*/
.tiddler .button:hover {
	background-color:#222;
}
.tiddler .button {
	border:1px solid black;
	line-height:2;
	margin:5px;
	padding:8px;
}

#contentWrapper .tiddler .button {
	margin-left:20px;
}
body .chkOptionInput {
	width:auto;
	float:right;
}

#contentWrapper .wizard .txtOptionInput {
	width:7em;
}

body{
	background: #111;
	color:white;
//	 background-image:url(http://friendster.bigoo.ws/content/layout/film-cartoon/film-cartoon_111.jpg);
//	 background-image:url(http://g.editingmyspace.com/shay773/halloweenbackgrounds/BG1.gif);
}

#backstageCloak {
	opacity:0.9; filter:'alpha(opacity:90)';
	background:#222;
}

#messageArea {
	border:0px;
	color:white;
	background-color:#222;
}

#messageArea .button{
	background:none;
}

#mainMenu br {
	display:none;
}

h1 {
	color:white;
}

#contentWrapper{
	position:relative;
	margin: 2.5em auto;
	width:780px;
	line-height: 1.6em;
	border:1px solid #111;
	font-size: 11px;
	font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif;
	height:1%;
	background-color:#222;
}

.clearAll{
	clear:both;
}

.tagClear{
	clear:none;
}
/*}}}*/

/*{{{*/

.siteTitle {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight: bold;
	position:relative;
	top:20px;
	left :20px;
	font-size: 32px;
	color:#eee;
}

.siteSubtitle {
	padding-top:15px;
	font-size: 1.0em;
	display:block; 
	color: #999; margin-top:0.5em !important; margin-top:1em; margin-left:3em;
}

#displayArea {
	margin-left:1.35em;
	margin-right:16.3em;
	margin-top:0;
	padding-top:1em;
	padding-bottom:10px;
}

.tabUnselected {
	background:#222 none repeat scroll 0%;
	color:#999;
}

#sidebar {
	position:inherit;
	float:right;
	display:inline;
}

#tiddlerDisplay .tagging, #tiddlerDisplay .tagged {
	background-color:#222;
	border:none;
	float:none;
}

.sliderPanel .tabsetWrapper .tabContents {
	border-right:none;
	border-color:#999;
	background-color:#111;
}

#sidebarOptions .sliderPanel a{
	padding:3px;
	margin:0px;
	border:2px;
	background-color:#111;
}

.tabsetWrapper {
	position :relative;
}

#sidebar {
	padding-left:0.5em;
	background-color:#222;
	padding-top:1em;
}

#sidebarOptions a {
	margin:17px;
	display:block;
	margin:0.5em 0em;
	padding:0.3em 0.6em;
}

.popup li a {
	padding:12px;
}

#tiddlerDisplay .toolbar a.button, #sidebarOptions a, .toolbar .popup li a, #mainMenu a, #sidebarOptions .sliderPanel input {
	background-color:#111;
	color:#999;
	border:1px solid #111;
}

.wizard  .txtOptionInput {
	text-align:right;
}

a:hover {
	background-color:#222;
	color:#eee
}

#tiddlerDisplay .toolbar a.button:hover, #sidebarOptions a:hover, #mainMenu a:hover, #sidebarOptions .sliderPanel input:hover {
	border:1px dotted #000;
	background-color:#222;
	color:white;
}

#mainMenu a {
	padding:8px 15px 8px 15px;
	margin:10px;
	line-height:40px;
	border:0px solid #eee;
}

#contentWrapper #mainMenu { 
	position:static;
	width:100%;
	float:left;
	text-align:left;
	padding-top:20px;

}
.editor textarea, .editor input,  input, body select {
	border:1px solid #222;
	background-color:#333;
	color:#999;
	padding:3px;
	margin:3px;
}

#sidebarOptions input {
	border:1px solid #999;
	background-color:#00000;
	width:10em;
}

#sidebarTabs {
	margin:0px;
	padding:0px
}

#sidebarTabs .tabContents {
	color:#eee;
	background:#111;
}
.tagged li
{
	display: inline;
}

.tiddler .button {
	color:white;
	padding:0.4em 0.9em 0.4em 0.9em;
	margin:0px 0px 0px 7px;
}

#sideBarOptions .searchButton {
	display:none;
}

#sidebar .sliderPanel {
	border-color:-moz-use-text-color #222 -moz-use-text-color -moz-use-text-color;
	border-style:none solid none none;
	border-width:0 1px 0 0;
	margin-bottom:0.8em;
	margin-left:5px;
	padding:0;
	margin-left:0px;
}

#sidebarOptions .searchButton {
	display:none;
}

.title {
	color:#C0C0C0;
}

.subtitle, .subtitle a {
	color: #999;
	font-size: 1em;margin:0.2em;
	font-variant: small-caps;
}

.wizard .button:hover{
	background-color:#333;
	border:1px solid #444;
	color:white;
}
.selected .toolbar a {
	color:#999;
}

.selected .toolbar a:hover {
	color:#222;
	background:transparent;
	border:1px solid #fff;
}

.viewer pre {
	background:#111111 none repeat scroll 0 0;
	border:1px solid #FFEE88;
}

* html .viewer pre {
	margin-left: 0em;
}

* html .editor textarea, * html .editor input {
	width: 98%;
}

a,#sidebarOptions .sliderPanel a, #topMenu a, #topMenu .button {
	color:green;
	background-color:transparent;
}

#sidebarOptions .sliderPanel a:hover, #topMenu a, #topMenu .button:hover {
	color:white;
	background-color:transparent;
	border:0px;
}

#topMenu a, #topMenu .button, .wizard .button {
	padding: 5px 15px;
	margin:9px;
	border:1px solid #999;
	font-weight:bold;
	line-height:40px;
	top:1em;
	color:#eee;
	background-color:#222;
}

#topMenu br {
	display:none;
}

#topMenu a:hover, #topMenu .button:hover {
	background-color:#222;
}

.tagging, .tagged {
	border: 1px solid #eee;
}

.highlight, .marked {
	background:transparent;
	color:#111;
	border:none;
	text-decoration:underline;
}

.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {
	border: none;
	background:transparent;
	text-decoration:underline;
	color:#222;
}

.tiddler {
	padding-bottom: 40px;
}

.viewer th, thead td {
	background: #222;
	border:none;
	color: #fff;
}

.viewer table {
	border:1px dotted #222;
}

table.twtable {
	border-collapse:seperate;
}

.viewer pre {
	border: 1px solid #999;
}

.viewer hr {
	border-top: dashed 1px #999;
}

.tabSelected {
	background:#111 none repeat scroll 0%;
	border:1px solid #111;
	border-bottom:1px solid black;
	color:#999;
}

.tabContents {
	background:#f7f7f7;
	border:0px;
}

.viewer code {
	background:##222 none repeat scroll 0%;
color:#999;
}

h1,h2,h3,h4,h5 {
	color: #555; border-color:#333; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif;
}

h1 {
	font-size:18px;
}

h2 {
	font-size:16px;
}

h3 {
	font-size: 14px;
}

#contentFooter {
	background:#999;
	clear: both;
	padding: 0.5em 1em;
}

.wizard input {
	border:1px solid #333;
}
#sidebarOptions input {
	border: 1px solid #222;
}

.annotation {
	background-color:green;
	border:1px solid white;
	color:white;
}

.wizardFooter .button{
	background:#222;
	margin:3px;
	padding:0.5em;
	padding-left:1.5em;
	padding-right:1.5em;
	color:white;
	border:1px solid #333;
}
table, .viewer td, .viewer tr, .twtable td, .twtable tr {
	border:0px solid #666666;
}

.tagging .listTitle, .tagged .listTitle, .txtMainTab .tabContents li {
	color:white;
}

body .wizardFooter {
	background:none;
	font-weight:bold;}

.wizardStep {
	border:none;
	background-color:none;
}

body .wizard {
	width:80%;
	padding:10px;
	border:1px solid #EBE6F5;
}

.wizard  th{
	background:#222;
	color:#888;
	padding:3px;
	margin:40px;
};

.wizard, listView twtable {
	border:0px;
};

.wizard {
	padding : 4px 14px 4px 14px;
	font-weight:bold;
	color:#292929;
	border:solid 0px #292929;
	margin-top:1px;
}

.viewer .wizard, body .wizard{
	background:#111;
	margin:2em;
	border:0px;
	border:1px solid #333;
	color:#777;
}

.wizard h1{
	color:#999;
}

.wizard h2{
	padding:4px;
	color:white;
}

body .wizardStep{
	color:#999;
	border:0px;
	margin:0m;
	background:none;
}

body select {
	border:0px;
	padding:3px;
	margin:4px;
}

#backstagePanel {
	border:0px;
	background:none;
	width:60%;
	position:fixed
	padding:0px;
	margin:0px;
	margin-top:-36px;
}

#sidebar .sliderPanel {
	background-color:#222;
	font-size:1em;
}

.viewer .wizardStep table {
	border:0px;
}

.viewer th, .viewer td, .viewer tr, .viewer caption, .twtable th, .twtable td, .twtable tr, .twtable caption {
	border:0px;
	padding:0px;
	margin:0px;
}

.viewer .sortable td  {
	padding:12px;
	margin:21px;
}

.title {
	color:#C0C0C0;
	padding:10px;
}

.viewer table, table.twtable {
	border-collapse:seperated;
	border:0px;
}

.viewer th, .viewer thead td, .twtable th, .twtable thead td {
	border:0px;
	color:white;
}

.twtable th{
	background-color:#333;
	padding:15px;
	margin:15px;
}

table.sortable td.sortedCol {
	background-color:#333;
}

#backstageArea a:hover, #backstageArea a.backstageSelTab {
	background-color:#111;
	color:white;
}
/*}}}*/

[[StyleSheet]]

/***
|''Name:''|purpleTheme|
|''Description:''|A theme with lots of white space and a clean and elegant purple presentation|
|''Author:''|Saq Imtiaz and Simon McManus|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''Source''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/Trunk/tiddlers/themes/purpleTheme.tiddler|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/Trunk/tiddlers/themes/purpleTheme.tiddler|
|''~CoreVersion:''|2.4.1|
|''~PageTemplate:''|##PageTemplate|
|''~tabs:''|##tabs|
|''~OptionsPanel:''|##OptionsPanel|
|''~SideBarTabs:''|##SideBarTabs|
|''~StyleSheet:''|##StyleSheet|
|''~taskViewTemplate:''|##taskViewTemplate|
|''~taskEditTemplate:''|##taskEditTemplate|
|''~EditTemplate:''|##EditTemplate|.wizzz
|''~ViewTemplate:''|##ViewTemplate|
***/
!PageTemplate
<!--{{{-->
<div id='bodywrapper'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' force='true' tiddler='purpleTheme##SideBarOptions'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<div id='contentFooter'  macro='gradient vert #eee #ccc'></div>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></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>
<!--}}}-->

!ViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='tagClear'></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>
<hr />
<!--}}}-->

!tabs
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>


!SideBarOptions
<<search {{config.options.search}}>><<closeAll>><<newTiddler label:{{config.macros.newTiddler.label}} text:{{config.macros.newTiddler.text}} title:{{config.macros.newTiddler.title}} tag:"">
<<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel  {{config.macros.ccOptions.options}} 'change TiddlyWiki Options'>><<slider 'chkLoginStatus' 'LoginStatus' {{config.macros.ccLoginStatus.status}} 'Login to make changes'>><<slider chkSliderTabs SideBarTabs {{config.theme.contentTitle}} {{config.theme.contentTiddlerTooltip}}>>

!StyleSheet
/***
General
***/
/*{{{*/

body, html{
	background-color: #999999;
	color:#333;
//	background:url(http://www.thefabricdeli.com/assets/images/qud21112-purple.jpg);
//	background:url(http://mr-pc.org/inc/paisleyTileSmall.png);
}

#backstageCloak {
	opacity:0.8; filter:'alpha(opacity:70)';
	background:black;
}
.tiddler .button {
	line-height:4;
	margin:5px;
	padding:8px;
}

body .chkOptionInput {
	width:auto;
	float:right;
}

#contentWrapper .wizard .txtOptionInput {
	width:7em;
}

.wizard  .txtOptionInput{
text-align:right;
	border:1px solid #ccc;
}

#contentWrapper .sliderPanel .tabsetWrapper .tabContents {
	border:0px;
	background-color:white;
}

.header {
	background-color:#eee;
}

#messageArea {
	border:1px solid white;
	background-color:#eee;
}

#messageArea .button {
	background:none;
}

h1 {
	color:black;
}

#contentWrapper {
	position:relative;
	margin: 2.5em auto;
	width:780px;
	line-height: 1.6em;
	border:1px solid #ccc;
	font-size: 11px;
	font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif;
	height:1%;
//	display:table;
	background-color:#eee;
}

.clearAll{
	clear:both;
}

.tagClear{
	clear:none;
}
/*}}}*/

/*{{{*/
.siteTitle {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight: bold;
	position:relative;
	top:20px;
	left :20px;
	font-size: 32px;
	color:Purple;
}

.siteSubtitle {
	padding-top:15px;
	font-size: 1.0em;
	display:block;
	color: #999; margin-top:0.5em !important; margin-top:1em; margin-left:3em;
	padding-top:3em;
}

#displayArea {
	margin-left:1.35em;
	margin-right:16.3em;
	margin-top:0;
	padding-top:1em;
	padding-bottom:10px;
}

#sidebarOptions input {
	border:1px solid #ddd;
}

div.tabset {
	margin-bottom:1px;
}

.tabUnselected {
	background:#ddd none repeat scroll 0%;
	color:#999;
	border:1px solid #ccc;
}

#sidebar {
	position:inherit;
	float:right;
	display:inline;
}

#tiddlerDisplay .tagging, #tiddlerDisplay .tagged {
	background-color:#eee;
	border:none;
	float:none;
}

.sliderPanel .tabsetWrapper .tabContents {
	border-right:none;
	border-color:#999;
	background-color:#999;
}

#sidebarOptions .sliderPanel a {
	padding:3px;
	margin:0px;
	border:2px;
	background-color:#999;
}

.tabsetWrapper {
	position :relative;
}

#sidebar{
	padding-left:0.5em;
	background-color:#eee;
	padding-top:1em;
}

#sidebarOptions a {
	margin:17px;
	display:block;
	margin:0.5em 0em;
	padding:0.3em 0.6em;
}

.popup li a {
	margin:0px;
	padding:0px;
	display:inline;
	color:black;
}

.popup {
	background-color:white;
	border:1px solid purple;
}

.popup li a:hover {
	display:inline;
	margin:0px;
	padding:0px;
	background-color:white;
	color:purple;
}

.popup li {
	margin:0px;
	padding:5px;
	background-color:#eee;
}
.popup li:hover {
	background-color:white;
}

#tiddlerDisplay .toolbar a.button, #sidebarOptions a, .toolbar .popup li a, #mainMenu a, .tiddler .button, #sidebarOptions .sliderPanel input {
	border:1px solid white;
	background-color:white;
	color:purple;
}

#tiddlerDisplay .toolbar a.button:hover, #sidebarOptions a:hover,  #mainMenu a:hover, .tiddler .button, #sidebarOptions .sliderPanel input:hover
{
	border:1px solid #ccc;
}

#sidebarOptions a:hover {
border-right:1px solid white;
}

.tagged ul {
	list-style: none;
}

.tagged li {
	display: inline;
}

.zoomer {
	background:none; color:#ddd;
	border:2px solid #ddd;
}

a:active{
	border:1px solid red;
	background-color:#eee;
	color:[[ColorPalette::smmLight1]]
}

a:hover {
	background-color:#eee;
	color:[[ColorPalette::smmLight1]]
}

#backstageArea,#backstageArea a {
	background:transparent;
	color:white;
}

#mainMenu a {
	padding:8px 15px 8px 15px;
	margin:10px;
	line-height:40px;
	border:1px solid #eee;
}

#contentWrapper #mainMenu{
	position:static;
	width:100%;
	float:left;
	text-align:left;
	padding-top:20px;
}

.editor textarea, .editor input, input, body select {
	border:1px solid #ccc;
	background-color:white;
	color:#999;
	padding:3px;
	margin:3px;
}

#sidebarOptions input {
	width:85%;
	margin-left:-0.1em;}

#sidebarTabs {
	margin:0px;
	padding:0px
}

#sidebarTabs .tabContents {
	color:[[ColorPalette::smmLight1]];
	background:#999;
}

#contentWrapper .tiddler .button {
margin:0.4em;
padding:0.4em 0.8em;
}

#sideBarOptions .searchButton{
	display:none;
}

#sidebar .sliderPanel {
	margin-left:5px;
	border:0px;
	padding:0em;
	border-right:1px solid #eee;
	margin-bottom:0.8em;
}

#sidebarOptions .searchButton {
	display:none;
}

.title {
	color:#C0C0C0;
}

.subtitle, .subtitle a {
	color: #999;
	font-size: 1em;margin:0.2em;
	font-variant: small-caps;
}

* html .viewer pre {
	margin-left: 0em;
}

* html .editor textarea, * html .editor input {
	width: 98%;
}

a,#sidebarOptions .sliderPanel a, #topMenu a, #topMenu .button {
	color:purple;
	background-color:transparent;
}

#sidebarOptions .sliderPanel a:hover, #topMenu a, #topMenu .button:hover {
	color:black;
	background-color:transparent;
	border:0px;
}

 
#topMenu a, #topMenu .button {
	padding: 5px 15px;
	margin:9px;
	border:1px solid #999;
	font-weight:bold;
	line-height:40px;
	top:1em;
	color:[[ColorPalette::smmLight1]];
	background-color:#eee;
}

#topMenu br {
	display:none;
}

#topMenu a:hover, #topMenu .button:hover {
	background-color:#eee;
}

.tagging, .tagged {
	border: 0px dotted [[ColorPalette::smmLight1]];
}

.highlight, .marked {
	background:transparent;
	color:#999;
	border:none;
	text-decoration:underline;
}

.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {
	border: none;
	background:transparent;
	text-decoration:underline;
	color:#eee;
}

.viewer th, thead td {
	background: #eee;
	border:none;
	color: #fff;
}

.viewer table {
	border:1px solid #eee;
}

table.twtable {
	border-collapse:seperate;
}

.viewer pre {
	background-color:white;
	border: 1px dotted #999;
}

hr {
	border: dotted 1px #ccc;
}

#sidebarOptions .sliderPanel .tabUnselected {
	background:#eee none repeat scroll 0%;
	border:0px solid #999;
	color:#999;
}

.tabSelected, #sidebarOptions .sliderPanel .tabSelected {
	background:white none repeat scroll 0%;
	border:1px solid #ddd;
	border-bottom:1px solid white;
	color:#999;
}

.tabContents {
	background:#f7f7f7;
	border:0px;
}

.viewer code {
	background:##eee none repeat scroll 0%;
	color:#999;
}

h1,h2,h3,h4,h5 {
	color: #555; 
	border-color:#333; 
	background: transparent; 
	padding-bottom:2px; 
	font-family: Arial, Helvetica, sans-serif;
}

h1 {
	font-size:18px;
}

h2 {
	font-size:16px;
	border-bottom:1px solid #FFF;
}

h3 {
	font-size: 14px;
	border-bottom:1px solid #FFF;
}

.annotation {
	background-color:purple;
	border:1px solid white;
	color:white;
}

#contentFooter {
	background:#999;
	clear: both;
	padding: 0.5em 1em;
}

.button, .wizard .button:hover {
	border:0px;
}

.sliderPanel input  {
	border:1px solid #777;
	background-color:white;
	color:#777;	
}

#contentWrapper .tiddler .button:hover {
	border:1px solid;
}

table, .viewer td, .viewer tr, .twtable td, .twtable tr {
	border:0px solid #666666;
}

body .wizardFooter {
	margin:0px;
	padding-top:0px;
	background:white;
	font-weight:bold;
	padding-left:10em;
}

.wizardStep {
	padding:0px;
	border:none;
	background-color:none;
} 
	
.wizard  th{
	background:white;
	color:#888;
	padding:3px;
	margin:40px;
};

.wizard, listView twtable {
	border:0px; 
};

.wizard {
	color:#292929;
}

.viewer .wizard, body .wizard{
	background:white;
	margin:2em;
	border:1px solid #CCCCCC;
	color:#999;
}

.wizard h1 {
	color:#999;
	padding-top:10px;
	padding-bottom:10px;
}

.wizard h2 {
	color:black;
}

body .wizardStep {
	color:#999;
	border:0px;
	margin:0m;
	background:white;	
}

body select {
	border:0px;
	padding:3px;
	margin:4px;
}

#backstageArea a:hover {
	background-color:white;
}

#backstagePanel {
	background:none;
	width:60%;
	position:fixed
	padding:0px;
	margin:0px;
	margin-top:-36px;
}

#backstageToolbar a.backstageSelTab {
	background-color:white;
	border:1px solid white;
}

#sidebar .sliderPanel {
	background-color:#eee;
	font-size:1em;
}

.viewer .wizardStep table {
	border:0px;
}

.viewer th, .viewer td, .viewer tr, .viewer caption, .twtable th, .twtable td, .twtable tr, .twtable caption {
	border:0px;
	padding:0px;
	margin:0px;
}

.viewer .sortable td {
	padding:12px;
	margin:21px;
}

.title {
	color:#777;
	padding:0px;
}

.viewer table, table.twtable {
	border-collapse:seperated;
	border:0px;
}

.viewer th, .viewer thead td, .twtable th, .twtable thead td {
	border:0px;
	background-color:white;
	color:black;
}

.twtable th{
	background-color:#eee;
	padding:15px;
	margin:15px;
}

table.sortable td.sortedCol {
	background-color:white;
}
/*}}}*/

[[StyleSheet]]
powerpape
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
	
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
 url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }

 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.4.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.'' 
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2008.08.29 [1.4.1] corrected handling for tiddlers with no matching tagged template when non-default theme is in effect (e.g., use "MyTheme##ViewTemplate").
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 4, revision: 1, date: new Date(2008,8,29)};

Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// get default template from core
	var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);

	// if the tiddler doesn't exist yet or is untagged, return core result
	var tiddler=store.getTiddler(title);
	if (!tiddler || !tiddler.tags.length)
		return coreTemplate;
	// split core template into theme prefix and template name
	var theme="";
	var template=coreTemplate;
	var parts=template.split(config.textPrimitives.sectionSeparator);
	if (parts[1]) { theme=parts[0]; template=parts[1]; }
	else theme=config.options.txtTheme||""; // fallback if theme is not specified
	theme+=config.textPrimitives.sectionSeparator;

	// look for template whose prefix matches a tag on this tiddler (if any)
	for (i=0; i<tiddler.tags.length; i++) {
		var t=tiddler.tags[i]+template; // add tag prefix to template
		var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
		if (store.getTiddlerText(theme+t))	{ return theme+t; } // theme##tagTemplate
		if (store.getTiddlerText(theme+c))	{ return theme+c; } // theme##TagTemplate
		if (store.getTiddlerText(t)) 		{ return t; }	     // tagTemplate
		if (store.getTiddlerText(c))		{ return c; }	     // TagTemplate
	}
	return coreTemplate; // no matching tag, return core result
}
//}}}
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.4.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.'' 
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2008.08.29 [1.4.1] corrected handling for tiddlers with no matching tagged template when non-default theme is in effect (e.g., use "MyTheme##ViewTemplate").
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
	
version.extensions.TaggedTemplateTweak= {major: 1, minor: 4, revision: 1, date: new Date(2008,8,29)};

Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// get default template from core
	var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);

	// if the tiddler doesn't exist yet or is untagged, return core result
	var tiddler=store.getTiddler(title);
	if (!tiddler || !tiddler.tags.length)
		return coreTemplate;

	// split core template into theme prefix and template name
	var theme="";
	var template=coreTemplate;
	var parts=template.split(config.textPrimitives.sectionSeparator);
	if (parts[1]) { theme=parts[0]; template=parts[1]; }
	else theme=config.options.txtTheme||""; // fallback if theme is not specified
	theme+=config.textPrimitives.sectionSeparator;

	// look for template whose prefix matches a tag on this tiddler (if any)
	for (i=0; i<tiddler.tags.length; i++) {
		var t=tiddler.tags[i]+template; // add tag prefix to template
		var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
		if (store.getTiddlerText(theme+t))	{ return theme+t; } // theme##tagTemplate
		if (store.getTiddlerText(theme+c))	{ return theme+c; } // theme##TagTemplate
		if (store.getTiddlerText(t)) 		{ return t; }	     // tagTemplate
		if (store.getTiddlerText(c))		{ return c; }	     // TagTemplate
	}
	return coreTemplate; // no matching tag, return core result
}

/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.3.2|
|''Status''|@@experimental@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Requires''|[[ServerConfig]]|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated configuration plugin to be present.
The specific nature of this plugins depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* attempt to determine default adaptor (and defaultCustomFields) from systemServer tiddlers
* handle deleting/renaming (e.g. by hijacking the respective commands and creating a log)
!Code
***/
//{{{
if(!version.extensions.ServerSideSavingPlugin) { //# ensure that the plugin is only installed once
version.extensions.ServerSideSavingPlugin = { installed: true };

if(!config.extensions) { config.extensions = {}; } //# obsolete from v2.4.2

(function(plugin) { //# set up alias

if(!plugin || !plugin.adaptor) {
	throw "Missing dependency: ServerConfig";
}

plugin = {
	adaptor: plugin.adaptor, //# N.B.: expects config.extensions.ServerSideSavingPlugin.adaptor to be set
	locale: {
		saved: "%0 saved successfully",
		saveError: "Error saving %0: %1",
		deleted: "Removed %0",
		deleteError: "Error removing %0: %1",
		deleteLocalError: "Error removing %0 locally",
		removedNotice: "This tiddler has been deleted."
	},

	sync: function() {
		store.forEachTiddler(function(title, tiddler) {
			if(tiddler.fields.deleted) {
				plugin.removeTiddler(tiddler);
			} else if(tiddler.isTouched() && tiddler.getServerType() && tiddler.fields["server.host"]) {
				plugin.saveTiddler(tiddler);
			}
		});
	},

	saveTiddler: function(tiddler) {
		var adaptor = new this.adaptor();
		var context = {
			tiddler: tiddler,
			changecount: tiddler.fields.changecount
		};
		context.workspace = tiddler.fields["server.workspace"];
		var req = adaptor.putTiddler(tiddler, context, {}, this.saveTiddlerCallback);
		return req ? tiddler : false;
	},

	saveTiddlerCallback: function(context, userParams) {
		var tiddler = context.tiddler;
		if(context.status) {
			if(tiddler.fields.changecount == context.changecount) { //# check for changes since save was triggered
				tiddler.clearChangeCount();
			} else if(tiddler.fields.changecount > 0) {
				tiddler.fields.changecount -= context.changecount;
			}
			displayMessage(plugin.locale.saved.format([tiddler.title]));
			store.setDirty(false);
		} else {
			displayMessage(plugin.locale.saveError.format([tiddler.title, context.statusText]));
		}
	},

	removeTiddler: function(tiddler) {
		var adaptor = new this.adaptor();
		context = { tiddler: tiddler };
		context.workspace = tiddler.fields["server.workspace"];
		var req = adaptor.deleteTiddler(tiddler, context, {}, this.removeTiddlerCallback);
		return req ? tiddler : false;
	},

	removeTiddlerCallback: function(context, userParams) {
		var tiddler = context.tiddler;
		if(context.status) {
			if(tiddler.fields.deleted) {
				store.deleteTiddler(tiddler.title);
			} else {
				displayMessage(plugin.locale.deleteError.format([tiddler.title]));
			}
			displayMessage(plugin.locale.deleted.format([tiddler.title]));
			store.setDirty(false);
		} else {
			displayMessage(plugin.locale.deleteLocalError.format([tiddler.title, context.statusText]));
		}
	}
};

config.macros.saveToWeb = { // XXX: hijack existing sync macro?
	locale: {
		btnLabel: "save to web",
		btnTooltip: "synchronize changes",
		btnAccessKey: null
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		createTiddlyButton(place, this.locale.btnLabel, this.locale.btnTooltip,
			plugin.sync, null, null, this.locale.btnAccessKey);
	}
};

// hijack saveChanges to trigger remote saving
plugin.saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(window.location.protocol == "file:") {
		plugin.saveChanges.apply(this, arguments);
	} else {
		plugin.sync();
	}
};

// override removeTiddler to flag tiddler as deleted
TiddlyWiki.prototype.removeTiddler = function(title) { // XXX: should override deleteTiddler instance method?
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
		tiddler.text = plugin.locale.removedNotice;
		tiddler.fields.deleted = true; // XXX: rename to removed/tiddlerRemoved?
		tiddler.incChangeCount();
		this.notify(title, true);
		this.setDirty(true);
	}
};

})(config.extensions.ServerSideSavingPlugin); //# end of alias

// override saveTiddler to fix core bug (ticket #769) -- XXX: to be fixed in TiddlyWiki v2.4.2
Story.prototype.saveTiddler = function(title,minorUpdate)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem) {
		var fields = {};
		this.gatherSaveFields(tiddlerElem,fields);
		var newTitle = fields.title || title;
		if(!store.tiddlerExists(newTitle))
			newTitle = newTitle.trim();
		if(store.tiddlerExists(newTitle) && newTitle != title) {
			if(!confirm(config.messages.overwriteWarning.format([newTitle.toString()])))
				return null;
		}
		if(newTitle != title)
			this.closeTiddler(newTitle,false);
		tiddlerElem.id = this.tiddlerId(newTitle);
		tiddlerElem.setAttribute("tiddler",newTitle);
		tiddlerElem.setAttribute("template",DEFAULT_VIEW_TEMPLATE);
		tiddlerElem.setAttribute("dirty","false");
		if(config.options.chkForceMinorUpdate)
			minorUpdate = !minorUpdate;
		if(!store.tiddlerExists(newTitle))
			minorUpdate = false;
		var newDate = new Date();
		var extendedFields = store.tiddlerExists(newTitle) ? store.fetchTiddler(newTitle).fields : (newTitle!=title && store.tiddlerExists(title) ? store.fetchTiddler(title).fields : merge({},config.defaultCustomFields));
		for(var n in fields) {
			if(!TiddlyWiki.isStandardField(n))
				extendedFields[n] = fields[n];
		}
		var tiddler = store.saveTiddler(title,newTitle,fields.text,minorUpdate ? undefined : config.options.txtUserName,minorUpdate ? undefined : newDate,fields.tags,extendedFields);
		autoSaveChanges(null,[tiddler]);
		return newTitle;
	}
	return null;
};

} //# end of "install only once"
//}}}
config.macros.taggedTabs={};

config.macros.taggedTabs.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
	var params = paramString.parseParams("taggedTabset",null,true,false,false);
	var tagged = store.getTaggedTiddlers(params[1].value,"title").reverse();
	var cookie = "taggedTabs";
	var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper taggedTabset" + cookie);
	var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
	var validTab = false;
	tabset.setAttribute("cookie",cookie);
	for(var t=0; t<tagged.length; t++) {
		var label = tagged[t].title;
		if(label=='ccLogin') 
			tabLabel = config.macros.ccLogin.buttonLogin;
		else
			tabLabel = label;
		var prompt = tagged[t].title;
		var tab = createTiddlyButton(tabset,tabLabel,prompt,config.macros.tabs.onClickTab,"tab tabUnselected");
		tab.setAttribute("tab",label);
		tab.setAttribute("content",label);
		if(config.options[cookie] == label)
			validTab = true;
	}
	if(!validTab)
		config.options[cookie] = tagged[0].title;
	place.appendChild(wrapper);
	config.macros.tabs.switchTab(tabset, config.options[cookie]);
	
	setStylesheet("div.tiddler .tab {font-size:1.2em;  font-weight:bold;padding-left:2em; padding-right:2em; margin-left:0px; margin-right:1em; padding-bottom:2px}"+
	"div.tiddler .wizard { margin:0px; }"+
	" div.tabContents .wizard { margin:0px; }"+
	".tabsetWrapper .wizard h1 {display:none}"+
	".tabsetWrapper .wizard h2 {padding:0.5em}"+
	".viewer {float:right; width:90%;}"+

"div.viewer  div.tabsetWrapper{width:90%}"+
	"a.tabSelected{ filter:'alpha(opacity:60)'; }"+
	"div.tabset {padding:0px}"+
	"div.tabContents {padding:0px; background:transparent}",
	 "taggedTabs");
	
};



//}}}
powerpape

// ccStats //

//{{{
	
config.macros.ccStats={};	
	
config.macros.ccStats.handler = function(place,macroName,params,wikifier,paramString,tiddler){
	var params;
	params.place = place;
	doHttp('POST',url+'/handle/workspaceAdmin.php','action=LISTWORKSPACES',null,null,null,config.macros.ccStats.listWorkspaces,params);
}

config.macros.ccStats.simpleEncode = function(valueArray,maxValue){
	var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
	var chartData = ['s:'];
	  for (var i = 0; i < valueArray.length; i++){
	    var currentValue = valueArray[i];
	    if (!isNaN(currentValue) && currentValue >= 0){
	    	chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue)));
	    }else{
	      chartData.push('_');
	    }
	  }
	return chartData.join('');
}

config.macros.ccStats.max = function(array){
	return Math.max.apply(Math, array);
}

config.macros.ccStats.dataCallback = function(status,params,responseText,uri,xhr){
	me = config.macros.ccStats;
	if(xhr.status==401){
		createTiddlyElement(params.container, "h4", null, null, me.errorPermissionDenied.format([params.title], [workspace]));
		return false;
	}
	var res = eval("[" + responseText + "]");
	var d=[];
	var l="";
	for(var c=0; c<res.length; c++){
		d[c]= res[c].hits;
		l+=res[c].date+"|";
	}
	var maxValue = config.macros.ccStats.max(d);
 	params.gData = config.macros.ccStats.simpleEncode(d,maxValue);
	params.XLabel = l.substring(0, l.length -1);
	params.YLabel = "0|"+maxValue+"|";
	var image = 'http://chart.apis.google.com/chart?cht=lc&chs=100x75&chd='+params.gData+'&chxt=x,y&chxl=0:||1:|';
	var div = createTiddlyElement(params.container, "div", null, "div_button");
	setStylesheet(".div_button:hover{opacity:0.7; cursor: pointer} .div_button{ width:100%; padding:5px;color:#555;background-color:white;} ", "DivButton");
	div.onclick = function(){
		var full = "http://chart.apis.google.com/chart?cht=lc&chs=800x375&chd="+params.gData+"&chxt=x,y&chxl=1:|"+params.YLabel+"0:|"+params.XLabel+"&chf=c,lg,90,EEEEEE,0.5,ffffff,20|bg,s,FFFFFF&&chg=10.0,10.0&";
		setStylesheet(
		"#errorBox .button{padding:0.5em 1em; border:1px solid #222; background-color:#ccc; color:black; margin-right:1em;}\n"+
		"html > body > #backstageCloak{height:"+window.innerHeight*2+"px;}"+
		"#errorBox{border:1px solid #ccc;background-color: #fff; color:#111;padding:1em 2em; z-index:9999;}",'errorBoxStyles');
		var box = document.getElementById('errorBox') || createTiddlyElement(document.body,'div','errorBox');
		box.innerHTML =  "<a style='float:right' href='javascript:onclick=ccTiddlyAdaptor.hideError()'>"+ccTiddlyAdaptor.errorClose+"</a><h3>"+params.title+"</h3><br />";
		box.style.position = 'absolute';
		box.style.height= "460px";
		box.style.width= "800px";
		var img = createTiddlyElement(box, "img");
		img.src = full;
		ccTiddlyAdaptor.center(box);
		ccTiddlyAdaptor.showCloak();
	}
	var img = createTiddlyElement(div, "h2", null, null, params.title);
	var img = createTiddlyElement(div, "img");
	img.src = image;
	var span = createTiddlyElement(div, "div", null, "graph_label", params.desc);
	setStylesheet(".graph_label{  position:relative; width:300px; top:-80px; left:130px;}");
}

config.macros.ccStats.switchWorkspace = function(params){
	removeChildren(params.container);
	config.macros.ccStats.refresh(params);	
}

config.macros.ccStats.refresh = function(params){
	var me = config.macros.ccStats;
	var select = params.w.formElem.workspaces;
	if(select[select.selectedIndex].value!="")
		workspace = select[select.selectedIndex].value;
	params ={ container: params.container, url: window.url+"/handle/stats.php?graph=minute&workspace="+workspace,title:me.graph20MinsTitle, desc:me.graph20MinsDesc};
	doHttp('GET',params.url,null, null, null, null, config.macros.ccStats.dataCallback,params);
	params ={ container:params.container, url:  window.url+"/handle/stats.php?graph=hour&workspace="+workspace,title:me.graph24HourTitle, desc:me.graph24HourDesc};
	doHttp('GET',params.url,null, null, null, null, config.macros.ccStats.dataCallback,params);
	params ={ container: params.container, url:  window.url+"/handle/stats.php?graph=day&workspace="+workspace,title:me.graph7DaysTitle, desc:me.graph7DaysDesc};
	doHttp('GET',params.url,null, null, null, null, config.macros.ccStats.dataCallback,params);
	params ={ container: params.container, url:  window.url+"/handle/stats.php?graph=month&workspace="+workspace,title:me.graph5MonthsTitle, desc:me.graph5MonthsDesc};
	doHttp('GET',params.url,null, null, null, null, config.macros.ccStats.dataCallback,params);	
}

config.macros.ccStats.listWorkspaces = function(status,params,responseText,uri,xhr){
	params.container=createTiddlyElement(null, "div", "container");
	var me = config.macros.ccStats;
	var w = new Wizard();
	w.createWizard(params.place,me.stepTitle);
	w.addStep(null, "<select name='workspaces'></select><input name='stats_hol' type='hidden'></input>");
	var s = w.formElem.workspaces;	
	s.onchange = function(){config.macros.ccStats.switchWorkspace(params) ;};
	var workspaces = eval('[ '+responseText+' ]');
	for(var d=0; d < workspaces.length; d++){
		var i = createTiddlyElement(s,"option",null,null,workspaces[d]);
		i.value = workspaces[d];
		if (workspace == workspaces[d]){
			i.selected = true;
		}
	}
	params.w = w; 
	w.formElem.stats_hol.parentNode.appendChild(params.container);
	config.macros.ccStats.refresh(params);
}
//}}}
// ccAdaptorCommandsPlugin //
function ccTiddlyAdaptor(){}
merge(ccTiddlyAdaptor,{ 
	errorTitleNotSaved:"<h1>Your changes were NOT saved.</h1>", 
	errorTextSessionExpired:"Your Session has expired. <br /> You will need to log into the new window and then copy your changes from this window into the new window. ", 
	errorTextConfig:"There was a conflict when saving. <br /> Please open the page in a new window to see the changes.",
	errorTextUnknown:"An unknown error occured.",
	errorClose:"close",
	buttonOpenNewWindow:"Open a Window where I can save my changes	.... ",
	buttonHideThisMessage:"Hide this message", 
	msgErrorCode:"Error Code : "
});


if(!config.extensions) { config.extensions = {}; } //# obsolete from v2.4.2
config.extensions.ServerSideSavingPlugin = {
	adaptor: config.adaptors.cctiddly
};

//{{{
	
	config.commands.revisions = {};
	merge(config.commands.revisions,{
		text: "revisions",
		tooltip: "View another revision of this tiddler",
		loading: "loading...",
		done: "Revision downloaded",
		revisionTooltip: "View this revision",
		popupNone: "No revisions",
		revisionTemplate: "%0 r:%1 m:%2",
		dateFormat:"YYYY mmm 0DD 0hh:0mm"	
	});

	config.commands.deleteTiddlerHosted = {};
	merge(config.commands.deleteTiddlerHosted,{
		text: "delete",
		tooltip: "Delete this tiddler",
		warning: "Are you sure you want to delete '%0'?",
		hideReadOnly: true,
		done: "Deleted "
	});
	
	
// Ensure that the plugin is only installed once.
if(!version.extensions.AdaptorCommandsPlugin) {
	version.extensions.AdaptorCommandsPlugin = {installed:true};



// implementing closeTiddler without the clearMessage();
Story.prototype.closeTiddler = function(title,animate,unused)
{
	var tiddlerElem = this.getTiddler(title);
	if(tiddlerElem) {
		this.scrubTiddler(tiddlerElem);
		if(config.options.chkAnimate && animate && anim && typeof Slider == "function")
			anim.startAnimating(new Slider(tiddlerElem,false,null,"all"));
		else {
			removeNode(tiddlerElem);
			forceReflow();
		}
	}
};

function getServerType(fields)
{
	if(!fields)
		return null;
	var serverType = fields['server.type'];
	if(!serverType)
		serverType = fields['wikiformat'];
	if(!serverType)
		serverType = config.defaultCustomFields['server.type'];
	if(!serverType && typeof RevisionAdaptor != 'undefined' && fields.uuid)
		serverType = RevisionAdaptor.serverType;
	return serverType;
}

function invokeAdaptor(fnName,param1,param2,context,userParams,callback,fields)
{
	var serverType = getServerType(fields);
	if(!serverType)
		return null;
	var adaptor = new config.adaptors[serverType];
	if(!adaptor)
		return false;
	if(!config.adaptors[serverType].prototype[fnName])
		return false;
	adaptor.openHost(fields['server.host']);
	adaptor.openWorkspace(fields['server.workspace']);
	var ret = false;
	if(param1)
		ret = param2 ? adaptor[fnName](param1,param2,context,userParams,callback) : adaptor[fnName](param1,context,userParams,callback);
	else
		ret = adaptor[fnName](context,userParams,callback);
	return ret;
}

//# Returns true if function fnName is available for the serverType specified in fields
//# Used by (eg): config.commands.download.isEnabled
function isAdaptorFunctionSupported(fnName,fields)
{
	var serverType = getServerType(fields);
	if(!serverType || !config.adaptors[serverType])
		return false;
	if(!config.adaptors[serverType].isLocal && !fields['server.host'])
		return false;
	var fn = config.adaptors[serverType].prototype[fnName];
	return fn ? true : false;
}

config.commands.revisions.isEnabled = function(tiddler)
{
	return isAdaptorFunctionSupported('getTiddlerRevisionList',tiddler.fields);
};

config.commands.revisions.handler = function(event,src,title)
{
	var tiddler = store.fetchTiddler(title);
	userParams = {};
	userParams.tiddler = tiddler;
	userParams.src = src;
	userParams.dateFormat = config.commands.revisions.dateFormat;
	var revisionLimit = 10;
	if(!invokeAdaptor('getTiddlerRevisionList',title,revisionLimit,null,userParams,config.commands.revisions.callback,tiddler.fields))
		return false;
	event.cancelBubble = true;
	if(event.stopPropagation)
		event.stopPropagation();
	return true;
};

config.commands.revisions.callback = function(context,userParams)
// The revisions are returned as tiddlers in the context.revisions array
{
	var revisions = context.revisions;
	popup = Popup.create(userParams.src);
	Popup.show(popup,false);
	if(revisions.length==0) {
		createTiddlyText(createTiddlyElement(popup,'li',null,'disabled'),config.commands.revisions.popupNone);
	} else {
		revisions.sort(function(a,b) {return a.modified < b.modified ? +1 : -1;});
		for(var i=0; i<revisions.length; i++) {
			var tiddler = revisions[i];
			var modified = tiddler.modified.formatString(context.dateFormat||config.commands.revisions.dateFormat);
			var revision = tiddler.fields['server.page.revision'];
			var btn = createTiddlyButton(createTiddlyElement(popup,'li'),
					config.commands.revisions.revisionTemplate.format([modified,revision,tiddler.modifier]),
					tiddler.text||config.commands.revisions.revisionTooltip,
					function() {
						config.commands.revisions.getTiddlerRevision(this.getAttribute('tiddlerTitle'),this.getAttribute('tiddlerModified'),this.getAttribute('tiddlerRevision'),this);
						return false;
						},
					'tiddlyLinkExisting tiddlyLink');
			btn.setAttribute('tiddlerTitle',userParams.tiddler.title);
			btn.setAttribute('tiddlerRevision',revision);
			btn.setAttribute('tiddlerModified',tiddler.modified.convertToYYYYMMDDHHMM());
			if(userParams.tiddler.fields['server.page.revision'] == revision || (!userParams.tiddler.fields['server.page.revision'] && i==0))
				btn.className = 'revisionCurrent';
		}
	}
};

config.commands.revisions.getTiddlerRevision = function(title,modified,revision)
{
	var tiddler = store.fetchTiddler(title);
	var context = {modified:modified};
	return invokeAdaptor('getTiddlerRevision',title,revision,context,null,config.commands.revisions.getTiddlerRevisionCallback,tiddler.fields);
};

config.commands.revisions.getTiddlerRevisionCallback = function(context,userParams)
{
	if(context.status) {
		var tiddler = context.tiddler;
		store.addTiddler(tiddler);
		store.notify(tiddler.title, true);
		story.refreshTiddler(tiddler.title,1,true);
	} else {
		displayMessage(context.statusText);
	}
};

config.commands.deleteTiddlerHosted.handler = function(event,src,title)
{
	var tiddler = store.fetchTiddler(title);
		if(!tiddler)
			return false;
		var deleteIt = true;
		if(config.options.chkConfirmDelete)
		        deleteIt = confirm(this.warning.format([title]));
		if(deleteIt) {
			var ret = invokeAdaptor('deleteTiddler',title,null,null,null,config.commands.deleteTiddlerHosted.callback,tiddler.fields);
			if(ret){
				store.removeTiddler(title);
				story.closeTiddler(title,true);
			}
		}
		return false;

};

config.commands.deleteTiddlerHosted.callback = function(context,userParams)
{
	if(context.status) {
		displayMessage(config.commands.deleteTiddlerHosted.done + context.title);
	} else {
		if (context.statusText.indexOf("Not Found") == -1)
			displayMessage(context.statusText);
	}
};

}//# end of 'install only once'
//}}}


// ccAdaptor //

//{{{

	window.isLoggedIn = function(){
		return (window.loggedIn == '1') 
	}

	ccTiddlyAdaptor.prototype = new AdaptorBase();

	ccTiddlyAdaptor.mimeType = 'application/json';
	ccTiddlyAdaptor.serverType = 'cctiddly'; // MUST BE LOWER CASE
	ccTiddlyAdaptor.serverParsingErrorMessage = "Error parsing result from server";
	ccTiddlyAdaptor.errorInFunctionMessage = "Error in function ccTiddlyAdaptor.%0";

	ccTiddlyAdaptor.minHostName = function(host){
		return host ? host.replace(/^http:\/\//,'').replace(/\/$/,'') : '';
	};

	// Convert a page title to the normalized form used in uris
	ccTiddlyAdaptor.normalizedTitle = function(title){
		return title;
	};

	// Convert a date in YYYY-MM-DD hh:mm format into a JavaScript Date object
	ccTiddlyAdaptor.dateFromEditTime = function(editTime){
		var dt = editTime;
		return new Date(Date.UTC(dt.substr(0,4),dt.substr(5,2)-1,dt.substr(8,2),dt.substr(11,2),dt.substr(14,2)));
	};

	ccTiddlyAdaptor.prototype.login = function(context,userParams,callback){
		if(window.location.search.substring(1))
			var uriParams = window.location.search.substring(1);
		else
			var uriParams = "";
		context = this.setContext(context,userParams,callback);
		var uriTemplate = '%0/handle/loginFile.php?cctuser=%1&cctpass=%2&'+uriParams;
		var uri = uriTemplate.format([context.host,context.username,context.password]);
		var req = httpReq('GET',uri,ccTiddlyAdaptor.loginCallback,context);
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.loginCallback = function(status,context,responseText,uri,xhr){
		if(xhr.status==401){
			context.status = false;
		}else{
			context.status = true;
			var c='sessionToken'+"="+responseText;
				c+="; expires=Fri, 1 Jan 2811 12:00:00 UTC; host=*";
				document.cookie=c;
		}
		if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.prototype.register = function(context,userParams,callback){
		context = this.setContext(context,userParams,callback);
		var uriTemplate = '%0/handle/register.php';
		var uri = uriTemplate.format([context.host,context.username,Crypto.hexSha1Str(context.password)]);
		var dataTemplate = 'username=&0&reg_mail=%1&password=%2&password2=%3';
		var data = dataTemplate.format([context.username,context.password1,context.password2]);
		var req = httpReq('POST', uri,ccTiddlyAdaptor.registerCallback,context,null,data);
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.prototype.rename = function(context, userParams, callback){
		if(window.location.search.substring(1))
			var postParams = "&"+window.location.search.substring(1);
		else
			var postParams = "";
		context = this.setContext(context,userParams,callback);
		var uri = window.url+"handle/renameTiddler.php?otitle="+context.title+"&ntitle="+context.newTitle+"&workspace="+window.workspace+postParams;;
		httpReq('POST', uri,ccTiddlyAdaptor.renameCallback,context,null,null);
	};

	ccTiddlyAdaptor.renameCallback = function(status,context,responseText,uri,xhr){
		if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.registerCallback = function(status,context,responseText,uri,xhr){
		if(status){
			context.status = true;
		}else{
			context.status = false;
		}
		if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.prototype.getWorkspaceList = function(context,userParams,callback){
	 	context = this.setContext(context,userParams,callback);
		var uriTemplate = '%0/handle/listWorkspaces.php';
		var uri = uriTemplate.format([context.host]);
		var req = httpReq('GET', uri,ccTiddlyAdaptor.getWorkspaceListCallback,context,{'accept':'application/json'});
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.getWorkspaceListCallback = function(status,context,responseText,uri,xhr){
		context.status = false;
		context.workspaces = [];
		context.statusText = ccTiddlyAdaptor.errorInFunctionMessage.format(['getWorkspaceListCallback']);
		if(status){
		try{
			eval('var workspaces=' + responseText);
		}catch (ex){
			context.statusText = exceptionText(ex,ccTiddlyAdaptor.serverParsingErrorMessage);
			if(context.callback)
				context.callback(context,context.userParams);
				return;
			}
			for (var i=0; i < workspaces.length; i++){
				context.workspaces.push({title:workspaces[i]})
			}
			context.status = true;
		}else{
				context.statusText = xhr.statusText;
		}
		if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.prototype.getTiddlerList = function(context,userParams,callback){
		context = this.setContext(context,userParams,callback);
		var uriTemplate = '%0/handle/listTiddlers.php?workspace=%1';
		var uri = uriTemplate.format([context.host,context.workspace]);
		var req = httpReq('GET', uri,ccTiddlyAdaptor.getTiddlerListCallback,context,{'accept':'application/json'});
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.getTiddlerListCallback = function(status,context,responseText,uri,xhr){
		context.status = false;
		context.statusText = ccTiddlyAdaptor.errorInFunctionMessage.format(['getTiddlerListCallback']);
		if(status){
			try{
				eval('var tiddlers=' + responseText);
			}catch (ex){
				context.statusText = exceptionText(ex,ccTiddlyAdaptor.serverParsingErrorMessage);
				if(context.callback)
					context.callback(context,context.userParams);
				return;
			}
			var list = [];
			for(var i=0; i < tiddlers.length; i++){
				var tiddler = new Tiddler(tiddlers[i]['title']);
				tiddler.fields['server.page.revision'] = tiddlers[i]['revision'];
				list.push(tiddler);
			}
			context.tiddlers = list;
			context.status = true;
		}else{
			context.statusText = xhr.statusText;
		}
		if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.prototype.generateTiddlerInfo = function(tiddler){
		var info ={};
		var host = this && this.host ? this.host : this.fullHostName(tiddler.fields['server.host']);
		var bag = tiddler.fields['server.bag']
		var workspace = tiddler.fields['server.workspace']
		var uriTemplate = '%0/%1/#%2';
		info.uri = uriTemplate.format([host,workspace,tiddler.title]);
		return info;
	};

	ccTiddlyAdaptor.prototype.getTiddlerRevision = function(title,revision,context,userParams,callback){
		context = this.setContext(context,userParams,callback);
		if(revision)
			context.revision = revision;
		return this.getTiddler(title,context,userParams,callback);
	};

	ccTiddlyAdaptor.prototype.getTiddler = function(title,context,userParams,callback){
		context = this.setContext(context,userParams,callback);
		if(title)
			context.title = title;
		   if(context.revision){
		         var uriTemplate = '%0/handle/revisionDisplay.php?title=%2&workspace=%1&revision=%3';
		  }else{
				var uriTemplate = '%0/handle/getTiddler.php?title=%2&workspace=%1';
		  }

		uri = uriTemplate.format([context.host,context.workspace,ccTiddlyAdaptor.normalizedTitle(title),context.revision]);
		context.tiddler = new Tiddler(title);
		context.tiddler.fields['server.type'] = ccTiddlyAdaptor.serverType;
		context.tiddler.fields['server.host'] = ccTiddlyAdaptor.minHostName(context.host);
		context.tiddler.fields['server.workspace'] = context.workspace;
		var req = httpReq('GET', uri,ccTiddlyAdaptor.getTiddlerCallback,context,{'accept':'application/json'});
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.getTiddlerCallback = function(status,context,responseText,uri,xhr){
	        context.status = false;
	        context.statusText = ccTiddlyAdaptor.errorInFunctionMessage.format(['getTiddlerCallback']);
	        if(status){
	                var info=[]
	                try{
	                    eval('info=' + responseText);
	                }catch (ex){
	                        context.statusText = exceptionText(ex,ccTiddlyAdaptor.serverParsingErrorMessage);
	                        if(context.callback)
	                                context.callback(context,context.userParams);
	                        return;
	                }
	                context.tiddler.text = info['text'];
					context.tiddler.tags = info['tags'].split(" ");
	                context.tiddler.fields['server.page.revision'] = info['server.page.revision'];
					context.tiddler.fields['server.id'] = info['id'];
					context.tiddler.fields = merge(info['fields'], context.tiddler.fields);
				    context.tiddler.modifier = info['modifier'];
	                context.tiddler.modified = Date.convertFromYYYYMMDDHHMM(info['modified']);
	                context.tiddler.created = Date.convertFromYYYYMMDDHHMM(info['created']);
	                context.status = true;
	        }else{
	                context.statusText = xhr.statusText;
	                if(context.callback)
	                        context.callback(context,context.userParams);
	                return;
	        }
	        if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.prototype.getTiddlerRevisionList = function(title,limit,context,userParams,callback){
		context = this.setContext(context,userParams,callback);
		context.title = title;
		context.revisions = [];
		var tiddler = store.fetchTiddler(title);
		var encodedTitle = encodeURIComponent(title);
		var uriTemplate = '%0/handle/revisionList.php?workspace=%1&title=%2';
		var host = this.fullHostName(this.host);
		var workspace = context.workspace ? context.workspace : tiddler.fields['server.workspace'];
		var uri = uriTemplate.format([host,workspace,encodedTitle]);
		var req = httpReq('GET', uri,ccTiddlyAdaptor.getTiddlerRevisionListCallback,context);
	};

	ccTiddlyAdaptor.getTiddlerRevisionListCallback = function(status,context,responseText,uri,xhr){
		if(responseText.indexOf('<!DOCTYPE html')==1)
			status = false;
		if(xhr.status=="204")
			status = false;
		context.status = false;
		if(status){
			var r =  responseText;
			if(r != '-' && r.trim() != 'revision not found'){
				var revs = r.split('\n');
				for(var i=0; i<revs.length; i++){
					var parts = revs[i].split(' ');
					if(parts.length>1){
						var tiddler = new Tiddler(context.title);
						tiddler.modified = Date.convertFromYYYYMMDDHHMM(parts[0]);
						tiddler.fields['server.page.revision'] = String(parts[1]);
						tiddler.modifier = String(parts[2]);
						tiddler.fields['server.host'] = ccTiddlyAdaptor.minHostName(context.host);
						tiddler.fields['server.type'] = ccTiddlyAdaptor.serverType;
						context.revisions.push(tiddler);
					}
				}
			}
			context.revisions.sort(function(a,b){return a.modified<b.modified?+1:-1;});
			context.status = true;
		}else{
			context.statusText = xhr.statusText;
		}
		if(context.callback)
			context.callback(context,context.userParams);
	};

	ccTiddlyAdaptor.prototype.putTiddler = function(tiddler,context,userParams,callback){
		context = this.setContext(context,userParams,callback);
		context.title = tiddler.title;
		if(window.location.search.substring(1))
			var postParams = window.location.search.substring(1);
		else
			var postParams = "";
		var recipeuriTemplate = '%0/handle/save.php';
		var host = context.host ? context.host : this.fullHostName(tiddler.fields['server.host']);
		var uri = recipeuriTemplate.format([host,context.workspace,tiddler.title]);
		var d = new Date();
		d.setTime(Date.parse(tiddler['modified']));
		d = d.convertToYYYYMMDDHHMM();

		//  SEO Code

		if(workspace)
		 	var breaker = "/";
		else
			var breaker = "";
		var el = createTiddlyElement(document.body, "div", "ccTiddlyTMP", null, null, { "style.display": "none" });
		el.style.display = "none";  // Just in case the above command is ignored
		var formatter = new Formatter(config.formatters);
		var wikifier = new Wikifier(tiddler.text,formatter,null,tiddler);
			wikifier.isStatic = true;
			wikifier.subWikify(el);
		delete formatter;
		var links = el.getElementsByTagName("a");
		for(var i = 0; i < links.length; i++) {
			var tiddlyLink = links[i].getAttribute("tiddlyLink");
		    if(tiddlyLink) {
		        if(hasClass(links[i], "tiddlyLinkNonExisting")) { // target tiddler does not exist
		            links[i].href = "#";
		        } else {
		            links[i].href = url+ workspace + breaker +tiddlyLink + ".html";
		        }
		    }
		}	
		// End SEO Code 

		var fieldString = "";
		for (var name in tiddler.fields){
			if (String(tiddler.fields[name]) && name != "server.page.revision" && name != "changecount")
				fieldString += name +"='"+tiddler.fields[name]+"' ";
		}
		if(!tiddler.fields['server.page.revision'])
			tiddler.fields['server.page.revision'] = 0;		
		else
			tiddler.fields['server.page.revision'] = parseInt(tiddler.fields['server.page.revision'],10);
		context.revision = tiddler.fields['server.page.revision'];
		if(!context.otitle)
			var otitle = tiddler.title;
		else
			var otitle = context.otitle;
		var payload = "workspace="+window.workspace+"&otitle="+encodeURIComponent(otitle)+"&title="+encodeURIComponent(tiddler.title) + "&modified="+tiddler.modified.convertToYYYYMMDDHHMM()+"&modifier="+tiddler.modifier + "&tags="+encodeURIComponent(tiddler.getTags())+"&revision="+encodeURIComponent(tiddler.fields['server.page.revision']) + "&fields="+encodeURIComponent(fieldString)+
	"&body="+encodeURIComponent(tiddler.text)+"&wikifiedBody="+encodeURIComponent(el.innerHTML)+"&id="+tiddler.fields['server.id']+"&"+postParams;
		var req = httpReq('POST', uri,ccTiddlyAdaptor.putTiddlerCallback,context,{'Content-type':'application/x-www-form-urlencoded', "Content-length": payload.length},payload,"application/x-www-form-urlencoded");
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.putTiddlerCallback = function(status,context,responseText,uri,xhr){
		
		if(xhr.status != 201){
			ccTiddlyAdaptor.handleError(xhr.status);
		}else{
			context.status = true;
			if(responseText!="") {
				context.tiddler.fields['server.id'] = responseText;
			}
			context.tiddler.fields['server.page.revision'] = context.revision + 1;
		}
		if(context.callback){
			context.callback(context,context.userParams);
		}
	};
	
	
	ccTiddlyAdaptor.center  = function(el){
		var size = this.getsize(el);
		el.style.left = (Math.round(findWindowWidth()/2) - (size.width /2) + findScrollX())+'px';
		el.style.top = (Math.round(findWindowHeight()/2) - (size.height /2) + findScrollY())+'px';
	}

	ccTiddlyAdaptor.getsize = function (el){
		var x ={};
		x.width = el.offsetWidth || el.style.pixelWidth;
		x.height = el.offsetHeight || el.style.pixelHeight;
		return x;
	}

	ccTiddlyAdaptor.showCloak = function(){
		var cloak = document.getElementById('backstageCloak');
		if (config.browser.isIE){
			cloak.style.height = Math.max(document.documentElement.scrollHeight,document.documentElement.offsetHeight);
			cloak.style.width = document.documentElement.scrollWidth;
		}
		cloak.style.display = "block";
	}

	ccTiddlyAdaptor.hideError = function(){
		var box = document.getElementById('errorBox');
		box.parentNode.removeChild(box);
		document.getElementById('backstageCloak').style.display = "";
	}

	ccTiddlyAdaptor.handleError = function(error_code){
		setStylesheet(
		"#errorBox .button{padding:0.5em 1em; border:1px solid #222; background-color:#ccc; color:black; margin-right:1em;}\n"+
		"html > body > #backstageCloak{height:100%;}"+
		"#errorBox{border:1px solid #ccc;background-color: #eee; color:#111;padding:1em 2em; z-index:9999;}",'errorBoxStyles');
		var box = document.getElementById('errorBox') || createTiddlyElement(document.body,'div','errorBox');
		var error = ccTiddlyAdaptor.errorTitleNotSaved;
		switch(error_code){
			case 401:
				error += ccTiddlyAdaptor.errorTextSessionExpired;
				break;
			case 409:
				error += "\n\n"+ccTiddlyAdaptor.errorTextConfig+"\n \n error code : "+error_code+" \n";
				break;

			default:
				error += ccTiddlyAdaptor.errorTextUnknown+"<br />"+error_code;
		}
		box.innerHTML = " <a style='float:right' href='javascript:onclick=ccTiddlyAdaptor.hideError()'>"+ccTiddlyAdaptor.errorClose+"</a><p>"+error+"</p><br/><br/>";
		createTiddlyButton(box,ccTiddlyAdaptor.buttonOpenNewWindow,null,function(e){ window.open (window.location,"mywindow");	 return false;});
		createTiddlyElement(box,"br");
		createTiddlyElement(box,"br");
		createTiddlyButton(box,ccTiddlyAdaptor.buttonHideThisMessage,null,function(){ccTiddlyAdaptor.hideError();});
		box.style.position = 'absolute';
		ccTiddlyAdaptor.center(box);
		ccTiddlyAdaptor.showCloak();
	}

	ccTiddlyAdaptor.prototype.deleteTiddler = function(title,context,userParams,callback){	
		context = this.setContext(context,userParams,callback);
		context.title = title;
		title = encodeURIComponent(title);
		var uri = tiddler.fields['server.host']+'/handle/delete.php'
		var data = "workspace="+workspace+"&title="+title;
		
		var req = httpReq('POST', uri,ccTiddlyAdaptor.deleteTiddlerCallback,context, null, data);
		return typeof req == 'string' ? req : true;
	};

	ccTiddlyAdaptor.deleteTiddlerCallback = function(status,context,responseText,uri,xhr){
		if(status){
			context.status = true;
		}else{
			context.status = false;
			context.statusText = xhr.statusText;
		}
		if(context.callback)
			context.callback(context,context.userParams);
	};

	config.adaptors[ccTiddlyAdaptor.serverType] = ccTiddlyAdaptor;
//}}}


//}}}


// ccAdmin //
//{{{
config.macros.ccAdmin = {}
config.macros.ccAdmin.handler = function(place,macroName,params,wikifier,paramString,tiddler, errorMsg){
	var w = new Wizard();
	w.createWizard(place,config.macros.ccAdmin.WizardTitleText);
	config.macros.ccAdmin.refresh(w);
};

config.macros.ccAdmin.refresh= function(w){
	params = {};
	params.w = w;
	params.e = this;
	me = config.macros.ccAdmin;
	doHttp('POST',url+'/handle/workspaceAdmin.php','action=LISTALL&workspace='+workspace,null,null,null,config.macros.ccAdmin.listAllCallback,params);
	w.setButtons([
		{caption: me.buttonDeleteText, tooltip: me.buttonDeleteTooltip, onClick: function(w){ 
			config.macros.ccAdmin.delAdminSubmit(null, params);
		 	return false;
		}}, 
		{caption: me.buttonAddText, tooltip: me.buttonAddTooltip, onClick: function(w){
			config.macros.ccAdmin.addAdminDisplay(null, params); return false } }]);
};

config.macros.ccAdmin.delAdminSubmit = function(e, params){
	var listView = params.w.getValue("listView");
	var rowNames = ListView.getSelectedRows(listView);
	var delUsers = "";
	for(var e=0; e < rowNames.length; e++) 
		delUsers += rowNames[e]+",";
	doHttp('POST',url+'/handle/workspaceAdmin.php','action=DELETEADMIN&username='+delUsers+'&workspace='+workspace,null,null,null,config.macros.ccAdmin.addAdminCallback,params);
	return false; 
};

config.macros.ccAdmin.addAdminDisplay = function(e, params){
	doHttp('POST',url+'/handle/workspaceAdmin.php','action=LISTWORKSPACES',null,null,null,config.macros.ccAdmin.listWorkspaces,params);
};

config.macros.ccAdmin.listWorkspaces = function(status,params,responseText,uri,xhr){
	var frm = createTiddlyElement(null,'form',null,null);
	var me = config.macros.ccAdmin;
	frm.onsubmit = config.macros.ccAdmin.addAdminSubmit;	
	params.w.addStep(me.stepAddTitle,"<input type='hidden' name='admin_placeholder'/>"+me.labelUsername+"<input name=adminUsername><br />"+me.labelWorkspace+"<select name=workspaceName />");
	var workspaces = eval('[ '+responseText+' ]');
	for(var t=0; t<workspaces.length; t++) {
		var o = createTiddlyElement(params.w.formElem.workspaceName, "option", null, null, workspaces[t]);
		o.value=workspaces[t];
		if(workspaces[t] == workspace)
			o.selected = true;
	}
	params.w.formElem.admin_placeholder.parentNode.appendChild(frm);
	params.w.setButtons([
		{caption: me.buttonCancelText, tooltip: me.buttonCancelTooltip, onClick: function(w){ config.macros.ccAdmin.refresh(params.w) } },
		{caption: me.buttonCreateText, tooltip: me.buttonCreateTooltip, onClick: function(){config.macros.ccAdmin.addAdminSubmit(null, params);  } }
	]);
};

config.macros.ccAdmin.addAdminSubmit = function(e, params){
	doHttp('POST',url+'/handle/workspaceAdmin.php','&add_username='+params.w.formElem.adminUsername.value+'&action=addNew&workspace='+params.w.formElem.workspaceName[params.w.formElem.workspaceName.selectedIndex].value,null,null,null,config.macros.ccAdmin.addAdminCallback,params);
	return false; 
};

config.macros.ccAdmin.listAllCallback = function(status,params,responseText,uri,xhr) {
	var me = config.macros.ccAdmin;
	var out = "";
	var adminUsers = [];
	if(xhr.status == 403){
		var html ='';
		params.w.addStep(me.stepErrorText+workspace, me.stepErrorTitle);
		params.w.setButtons([]);
		return false;
	}
	try{
		var a = eval(responseText);
		for(var e=0; e < a.length; e++){
			out += a[e].username;
			adminUsers.push({
			name: a[e].username,
			lastVisit:a[e].lastVisit});
		}
	}catch(ex){
			params.w.addStep(" "+workspace, me.stepNoAdminTitle);
			params.w.setButtons([
				{caption: me.buttonCreateText, tooltip: me.buttonCreateTooltip, onClick: function(){ config.macros.ccAdmin.addAdminDisplay(null, params)}}]);
			return false;
	}
	var html ='<input type="hidden" name="markList"></input>';
	params.w.addStep(me.stepManageWorkspaceTitle+workspace, html);
	var markList = params.w.getElement("markList");
	var listWrapper = document.createElement("div");
	markList.parentNode.insertBefore(listWrapper,markList);
	var listView = ListView.create(listWrapper,adminUsers,config.macros.ccAdmin.listAdminTemplate);
	params.w.setValue("listView",listView);
};

config.macros.ccAdmin.addAdminCallback = function(status,params,responseText,uri,xhr) {
	config.macros.ccAdmin.refresh(params.w);
};
//{{{

config.macros.ccCreateWorkspace = {};

config.macros.ccCreateWorkspace.setStatus=function(w,element,text){
	var label_var = w.getElement(element);
	removeChildren(label_var.previousSibling);
	var label = document.createTextNode(text);
	label_var.previousSibling.insertBefore(label,null);
}

config.macros.ccCreateWorkspace.workspaceNameKeyPress=function(w){
	params={};
	params.w = w;
	doHttp('POST',url+'/handle/lookupWorkspaceName.php',"ccWorkspaceLookup="+w.formElem["workspace_name"].value+"&free=1",null,null,null,config.macros.ccCreateWorkspace.workspaceNameCallback,params);	
	return false;
};
 	
config.macros.ccCreateWorkspace.workspaceNameCallback=function(status,params,responseText,uri,xhr){
	var me = config.macros.ccCreateWorkspace;
	if(responseText > 0){{
			config.macros.register.setStatus(params.w, "workspace_error", me.errorWorkspaceNameInUse);
			config.macros.register.setStatus(params.w, "workspace_url", "");
	}}else{
		config.macros.register.setStatus(params.w, "workspace_error", me.msgWorkspaceAvailable);
		if (window.useModRewrite == 1)
			config.macros.register.setStatus(params.w, "workspace_url", url+''+params.w.formElem["workspace_name"].value);			 
		else
			config.macros.register.setStatus(params.w, "workspace_url", url+'?workspace='+params.w.formElem["workspace_name"].value);
	}
};

config.macros.ccCreateWorkspace.handler =  function(place,macroName,params,wikifier,paramString,tiddler, errorMsg){
	if (window.workspacePermission.canCreateWorkspace!=1) {
		createTiddlyElement(place,'div', null, "annotation",  config.macros.ccCreateWorkspace.errorPermissions);
		return null;
	}
	var me = config.macros.ccCreateWorkspace;
	var w = new Wizard();
	w.createWizard(place,me.wizardTitle);
	if(config.macros.ccCreateWorkspace.createWorkspaceAdvanced)
		me.stepCreateHtml += config.macros.ccCreateWorkspace.createWorkspaceAdvanced();

	w.addStep(me.stepTitle, me.stepCreateHtml);
	w.formElem["workspace_name"].onkeyup=function() {me.workspaceNameKeyPress(w);};
	w.formElem.onsubmit = function() { config.macros.ccCreateWorkspace.createWorkspaceOnSubmit(w);  return false;};
	w.setButtons([
		{caption: me.buttonCreateWorkspaceText, tooltip: me.buttonCreateWorkspaceTooltip, onClick:function(){config.macros.ccCreateWorkspace.createWorkspaceOnSubmit(w);}
	}]);
};

config.macros.ccCreateWorkspace.createWorkspaceOnSubmit = function(w){
	var params = {}; 
	params.w = w;	
	if(window.useModRewrite == 1)
		params.url = url+w.formElem["workspace_name"].value; 
	else
		params.url = url+'?workspace='+w.formElem["workspace_name"].value;
	var loginResp = doHttp('POST',url+'?&workspace='+w.formElem["workspace_name"].value+"/",'&ccCreateWorkspace=' + encodeURIComponent(w.formElem["workspace_name"].value)+'&amp;ccAnonPerm='+encodeURIComponent("AADD"),null,null,null,config.macros.ccCreateWorkspace.createWorkspaceCallback,params);
	return false; 
};

config.macros.ccCreateWorkspace.createWorkspaceCallback = function(status,params,responseText,uri,xhr) {
	if(xhr.status==201){
		params.w.addStep("Please wait", "This could take afew minutes depending on your internet connection.<img src='http://www.ajaxload.info/cache/FF/FF/FF/00/00/00/37-0.gif'/>"+"<br/><br/><input width='300' name='statusMarker'/>");
		params.w.setButtons([]);
		if(params.selectedPackage) {
	   		var url = store.getTiddlerSlice(params.selectedPackage,'URL');
			loadRemoteFile(url,config.macros.ccCreateWorkspace.fetchFileCallback ,params);
		} else {
			window.location = params.url;
		}
	}else if(xhr.status == 200){
		displayMessage(config.macros.ccCreateWorkspace.errorWorkspaceNameInUse);
	}else if(xhr.status == 403){
		displayMessage(config.macros.ccCreateWorkspace.errorPermissions);	
	}else{
			displayMessage("sd"+responseText);	
	}
};

//}}}


// ccEditWorkspace //


//{{{
config.macros.ccEditWorkspace={};			
config.macros.ccEditWorkspace.handler = function(place, macroName, params, wikifier, paramString, tiddler){
	var me = config.macros.ccEditWorkspace;
	if(workspacePermission.owner !=1){
		createTiddlyElement(place,'div', null, "annotation",  me.errorTextPermissionDenied);
		return null;
	}
	var w = new Wizard();
	w.createWizard(place, this.WizardTitleText);
	var booAdmin = false;
	var booUser = false;
	var booAnon = false;
	// Check which colums to display
	for(i = 0; i <= params.length - 1; i++){
		switch (params[i].toLowerCase()) {
			case 'admin':
				booAdmin = true;
				break;
			case 'user':
				booUser = true;
				break;
			case 'anon':
				booAnon = true;
				break;
		}
	}
	// if nothing passed show all
	if(!booAdmin && !booUser && !booAnon){
		booAdmin = true;
		booUser = true;
		booAnon = true;
	}
	var tableBodyBuffer = new Array();
	tableBodyBuffer.push('<table border=0px class="listView twtable">');
	tableBodyBuffer.push('<tr">');
	tableBodyBuffer.push('<th>' + this.stepLabelPermission + '</th>');
	if(booAnon){
		tableBodyBuffer.push('<th>' + this.stepLabelAnon + '</th>');
	}
	if(booUser){
		tableBodyBuffer.push('<th>' + this.stepLabelUser + '</th>');
	}
	if(booAdmin){
		tableBodyBuffer.push('<th>' + this.stepLabelAdmin + '</th>');
	}
	tableBodyBuffer.push('</tr>');
	tableBodyBuffer.push('<tr>')
	tableBodyBuffer.push('<th align="right">'+this.stepLabelRead+'</th>');
	if(booAnon){
		tableBodyBuffer.push('<td><input name="anR" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.anonR == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booUser){
		tableBodyBuffer.push('<td><input name="usR" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.userR == 1 ? 'checked' : '');
		tableBodyBuffer.push('></input></td>');
	}
	if(booAdmin){
		tableBodyBuffer.push('<td><input name="adR" class="checkInput" type="checkbox" checked disabled></input></td>');
	}
	tableBodyBuffer.push('</tr>');
	tableBodyBuffer.push('<tr>');
	tableBodyBuffer.push('<th  align="right">' + this.stepLabelCreate + '</th>');
	if(booAnon){
		tableBodyBuffer.push('<td><input name="anC" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.anonC == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booUser){
		tableBodyBuffer.push('<td><input name="usC" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.userC == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booAdmin){
		tableBodyBuffer.push('<td><input name="adC" class="checkInput" type="checkbox" checked disabled></input></td>');
	}
	tableBodyBuffer.push('</tr>');
	tableBodyBuffer.push('<tr>');
	tableBodyBuffer.push('<th  align="right">' + this.stepLabelUpdate + '</th>');
	if(booAnon){
		tableBodyBuffer.push('<td><input name="anU" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.anonU == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booUser){
		tableBodyBuffer.push('<td><input name="usU" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.userU == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booAdmin){
		tableBodyBuffer.push('<td><input name="adU" class="checkInput" type="checkbox" checked disabled></input></td>');
	}
	tableBodyBuffer.push('</tr>');
	tableBodyBuffer.push('<tr>');
	tableBodyBuffer.push('<th  align="right">' + this.stepLabelDelete + '</th>');
	if(booAnon){
		tableBodyBuffer.push('<td><input name="anD" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.anonD == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booUser){
		tableBodyBuffer.push('<td><input name="usD" class="checkInput" type="checkbox" ');
		tableBodyBuffer.push(workspacePermission.userD == 1 ? 'checked' : '');
		tableBodyBuffer.push(' ></input></td>');
	}
	if(booAdmin){
		tableBodyBuffer.push('<td><input name="adD" class="checkInput" type="checkbox" checked disabled></input></td>');
	}
	tableBodyBuffer.push('</tr>');
	tableBodyBuffer.push('</table>');
	var stepHTML = tableBodyBuffer.join('');
	w.addStep(this.stepEditTitle,stepHTML);
	w.setButtons([
		{caption: this.buttonSubmitCaption, tooltip: this.buttonSubmitToolTip, onClick: function() {me.ewSubmit(place, macroName, params, wikifier, paramString, tiddler,w,booAnon,booUser);}
	}]);

};

config.macros.ccEditWorkspace.ewSubmit = function(place, macroName, params2, wikifier, paramString, tiddler,w, booAnon, booUser){
	var trueStr = "A";
	var falseStr = "U";
	var anon = '';
	var user = '';
	if(booAnon){
		var anonBuffer = new Array();
		anonBuffer.push(w.formElem['anR'].checked ? trueStr : falseStr);
		anonBuffer.push(w.formElem['anC'].checked ? trueStr : falseStr);
		anonBuffer.push(w.formElem['anU'].checked ? trueStr : falseStr);
		anonBuffer.push(w.formElem['anD'].checked ? trueStr : falseStr);
		anon = anonBuffer.join('');
	}
	if(booUser){
		var userBuffer = new Array();
		userBuffer.push(w.formElem['usR'].checked ? trueStr : falseStr);
		userBuffer.push(w.formElem['usC'].checked ? trueStr : falseStr);
		userBuffer.push(w.formElem['usU'].checked ? trueStr : falseStr);
		userBuffer.push(w.formElem['usD'].checked ? trueStr : falseStr);
		user = userBuffer.join('');
	}
	var params = new Array();
	params.w = w;
	params.u = user;
	params.a = anon;
	params.p = place;
	params.m =  macroName;
	params.pr = params2;
	params.wi = wikifier;
	params.ps = paramString;
	params.t = tiddler;
	doHttp('POST', url + '/handle/updateWorkspace.php', 'ccCreateWorkspace=' + encodeURIComponent(workspace) + '&ccAnonPerm=' + encodeURIComponent(anon) + '&ccUserPerm=' + encodeURIComponent(user), null, null, null, config.macros.ccEditWorkspace.editWorkspaceCallback, params);
	return false;
}
config.macros.ccEditWorkspace.editWorkspaceCallback = function(status,params,responseText,uri,xhr){
	var w = params.w;
	var me = config.macros.ccEditWorkspace;
	if(xhr.status == 200){
		// use the incoming parameters to set the workspace permission variables.
		if (params.a != ''){
			workspacePermission.anonR = (params.a.substr(0,1)=='A'?1:0);
			workspacePermission.anonC = (params.a.substr(1,1)=='A'?1:0);
			workspacePermission.anonU = (params.a.substr(2,1)=='A'?1:0);
			workspacePermission.anonD = (params.a.substr(3,1)=='A'?1:0);
		}
		if (params.u != ''){
			workspacePermission.userR = (params.u.substr(0,1)=='A'?1:0);
			workspacePermission.userC = (params.u.substr(1,1)=='A'?1:0);
			workspacePermission.userU = (params.u.substr(2,1)=='A'?1:0);
			workspacePermission.userD = (params.u.substr(3,1)=='A'?1:0);
		}
		w.addStep('',responseText);
		// want to set a back button here
		w.setButtons([
			{caption: me.button1SubmitCaption, tooltip: me.button1SubmitToolTip, onClick: function() {config.macros.ccEditWorkspace.refresh(params.p,	params.m,	params.pr,	params.wi,	params.ps,	params.t);}}
		]);
	}else{
		w.addStep(me.step2Error+': ' + xhr.status,config.macros.ccEditWorkspace.errorUpdateFailed);
	}
	return false;
};
config.macros.ccEditWorkspace.refresh = function(place, macroName, params, wikifier, paramString, tiddler){
	removeChildren(place);
	config.macros.ccEditWorkspace.handler(place, macroName, params, wikifier, paramString, tiddler);
}
//}}}

// ccLogin //

//{{{

config.macros.ccLogin={sha1:true};
	
function isLoggedIn() {
	if(window.loggedIn)
	 	return true;
	else 
		return false;
}

config.macros.saveChanges.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	if(isLoggedIn()){
		createTiddlyButton(place, config.macros.ccLogin.buttonLogout, config.macros.ccLogin.buttonLogoutToolTip, function(){
				if (window.fullUrl.indexOf("?") >0)
					window.location = window.fullUrl+"&logout=1";
				else
					window.location = window.fullUrl+"?logout=1";
			return false;
		},null,null,this.accessKey);
	}else{
		createTiddlyButton(place,config.macros.ccLogin.buttonlogin, config.macros.ccLogin.buttonLoginToolTip, function() {
			story.displayTiddler(null, "Login");
		},null,null,this.accessKey);
	}
};

var loginState=null;
var registerState=null;

config.macros.ccLogin.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	var params = paramString.parseParams('reload',null,true);
	config.macros.ccLogin.refresh(place, params[0].reload);
};
 
config.macros.ccLogin.refresh=function(place, reload, error){
	removeChildren(place);
	var w = new Wizard();
	if (isLoggedIn()){
		w.createWizard(place,this.stepLogoutTitle);
		w.addStep(null, this.stepLogoutText+decodeURIComponent(cookieString(document.cookie).txtUserName)+"<br /><br />");
		w.setButtons([
			{caption: this.buttonLogout, tooltip: this.buttonLogoutToolTip, onClick: function() {window.location=fullUrl+"?&logout=1"}
		}]);
		return true;
	}
	w.createWizard(place,this.WizardTitleText);
	w.setValue('reload', reload);


	var me=config.macros.ccLogin;
	var oldForm = w.formElem.innerHTML;
	var form = w.formElem;
	if (error!==undefined)
		this.stepLoginTitle=error;	
	w.addStep(this.stepLoginTitle,me.stepLoginIntroTextHtml);
	txtPassword = w.formElem.txtPassword;
	w.formElem.password.style.display="none";
	txtPassword.onkeyup = function() {
		if(me.sha1 == true){
			w.formElem.password.value = Crypto.hexSha1Str(w.formElem.txtPassword.value);
		} else { 
			w.formElem.password.value = w.formElem.txtPassword.value;
		}
	};
	txtPassword.onchange = txtPassword.onkeyup;
	w.formElem.method ="POST";
	w.formElem.onsubmit = function() {config.macros.ccLogin.doLogin(w.formElem["username"].value, w.formElem["password"].value, this, place); return false;};
	var submit = createTiddlyElement(null, "input");
	submit.type="submit";
	submit.style.display="none";
	w.formElem.appendChild(submit);
	var cookieValues=findToken(document.cookie);
	if (cookieValues.txtUserName!==undefined){
		w.formElem["username"].value=decodeURIComponent(cookieValues.txtUserName) ;
	}
	var footer = findRelated(form,"wizardFooter","className");
	createTiddlyButton(w.footer,this.buttonLogin,this.buttonLoginToolTip,function() {
		if (w.formElem["username"].value==""){
			displayMessage(me.msgNoUsername);
			return false;
		}
		if (w.formElem["password"].value==""){
			displayMessage(me.msgNoPassword);
			return false;
		}
		config.macros.ccLogin.doLogin(w.formElem["username"].value, w.formElem["password"].value, this, place);
	});
	
	
	createTiddlyButton(w.footElem,this.buttonLogin,this.buttonLoginToolTip,function() {
		config.macros.ccLogin.doLogin(w.formElem["username"].value, w.formElem["password"].value, this, place);
	},null, null, null,  {tabindex:'3'});

	if(config.macros.register!==undefined){		
		var li_register = createTiddlyElement(w.footElem, "li");
		createTiddlyButton(li_register,config.macros.register.buttonRegister,config.macros.register.buttonRegisterToolTip,function() {
				config.macros.register.displayRegister(place, w, this);
		},"nobox", null, null,  {tabindex:4});
	}
	var li_forgotten = createTiddlyElement(w.footElem, "li");
	createTiddlyButton(li_forgotten,this.buttonForgottenPassword,this.buttonForgottenPasswordToolTip,function() {
		config.macros.ccLogin.displayForgottenPassword(this, place);
	},"nobox", null, null,  {tabindex:5});

};

config.macros.ccLogin.doLogin=function(username, password, item, place){
	var w = new Wizard(item);
	var me = config.macros.ccLogin;
	var userParams = {};
	userParams.place = place;
	var adaptor = new config.adaptors[config.defaultCustomFields['server.type']];
	var context = {};
	context.reload = w.getValue("reload");
	context.host = window.url;
	context.username = username;
	context.password = password;
	adaptor.login(context,userParams,config.macros.ccLogin.loginCallback)
	var html = me.stepDoLoginIntroText; 
	w.addStep(me.stepDoLoginTitle,html);
	w.setButtons([
		{caption: this.buttonCancel, tooltip: this.buttonCancelToolTip, onClick: function() {config.macros.ccLogin.refresh(place);}
	}]);
}

config.macros.ccLogin.loginCallback=function(context,userParams){

	if(!context.status)
	{
		config.macros.ccLogin.refresh(userParams.place, config.macros.ccLogin.msgLoginFailed);
	}else{
		if(context.reload=="false"){
				window.loggedIn = true;
				var $ = jQuery;
				story.refreshTiddler(story.findContainingTiddler(userParams.place).id.replace("tiddler", ""), null, true);			
		}else{
							window.location.reload();	
		}
	}	 
};

config.macros.ccLogin.displayForgottenPassword=function(item, place){	
	var w = new Wizard(item);
	var me = config.macros.ccLogin;
	w.addStep(me.stepForgotPasswordTitle,me.stepForgotPasswordIntroText);
	w.setButtons([
		{caption: this.buttonCancel, tooltip: this.buttonCancelToolTip, onClick: function() {me.refresh(place);}}
	]);
};

//config.macros.ccLogin.sendForgottenPassword=function(item, place){	
//	var w = new Wizard(item);
//	var me = config.macros.ccLogin;
//}

config.macros.toolbar.isCommandEnabled=function(command,tiddler){	
	var title=tiddler.title;
	if (workspace_delete=="D"){
		// REMOVE OPTION TO DELETE TIDDLERS 
		if (command.text=='delete')
			return false;
	}
	if (workspace_udate=="D"){
		// REMOVE EDIT LINK FROM TIDDLERS 
		if (command.text=='edit')
			return false;
	}
	var ro=tiddler.isReadOnly();
	var shadow=store.isShadowTiddler(title) && !store.tiddlerExists(title);
	return (!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow);
};

// Returns output var with output.txtUsername and output.sessionToken
function findToken(cookieStash){
	var output={};
	if (!cookieStash)
		return false;	
	//  THIS IS VERY HACKY AND SHOULD BE REFACTORED WHEN TESTS ARE IN PLACE
	var cookies=cookieStash.split('path=/');
	for(var c=0; c < cookies.length ; c++){
		var cl =cookies[c].split(";");
		for(var e=0; e < cl.length; e++){ 
			var p=cl[e].indexOf("=");
			if(p!=-1){
				var name=cl[e].substr(0,p).trim();
				var value=cl[e].substr(p+1).trim();       
				if (name=='txtUserName'){
					output.txtUserName=value;
				}
				if (name=='sessionToken'){
					output.sessionToken=value;
				}
			}
		}
	}	
	return output;
};

function cookieString(str){	
	var cookies = str.split(";");
	var output = {};
	for(var c=0; c < cookies.length; c++){
		var p = cookies[c].indexOf("=");
		if(p != -1) {
			var name = cookies[c].substr(0,p).trim();
			var value = cookies[c].substr(p+1).trim();
			if (name=='txtUserName'){
				output.txtUserName=value;
			}
			if (name=='sessionToken'){
				output.sessionToken=value;
			}
		}
	}
	return output;
}


//}}}
// Allows users to change the default tiddlers for anonymous users by setting the AnonDefaultTiddlers tiddler.

// also requires overide of restart. 

Story.prototype.displayDefaultTiddlers = function(){
 	var tiddlers="";
	if(isLoggedIn()){        
		var url = window.location;        
		url = url.toString();        
		var bits = url.split('#');        
		if(bits.length == 1){            
			tiddlers = store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"));            
			story.displayTiddlers(null, tiddlers);
		}
	}else{         
		tiddlers=store.filterTiddlers(store.getTiddlerText("AnonDefaultTiddlers"));        
		story.displayTiddlers(null, tiddlers);   
	}    
};
// ccRegister //

//{{{
config.macros.register={};	
	
config.macros.register.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	//config.macros.login.refresh(place);
};

config.macros.register.displayRegister=function(place, w, item){
	var me = config.macros.register;
	var w = new Wizard(item);
	w.addStep(me.stepRegisterTitle, me.stepRegisterHtml);
	w.formElem["reg_username"].onkeyup=function() {me.isUsernameAvailable(w);};
	w.setButtons([
		{caption: me.buttonRegister, tooltip: me.buttonRegisterToolTip, onClick:function() { me.doRegister(place, w)}},
		{caption: me.buttonCancel, tooltip: me.buttonCancelToolTip, onClick: function() { config.macros.ccLogin.refresh(place)}}
	]);
	var h1 = createTiddlyElement(null, "h1", null, null, "hahahaha");
	//	w.footElem.appendChild(h1, w.footElem);
	w.footElem.firstChild.parentNode.appendChild(h1, w.footElem);
	//w.footElem.firstChild.insertBefore(h1, w.footElem);
}

config.macros.register.setStatus=function(w, element, text){
	var label_var = w.getElement(element);
	removeChildren(label_var.previousSibling);
	var label = document.createTextNode(text);
	label_var.previousSibling.insertBefore(label,null);
}

config.macros.register.doRegister=function(place, w){
	var me = config.macros.register;
	if(w.formElem["reg_username"].value==''){
		me.setStatus(w, "username_error", me.msgNoUsername);
	}else {
		me.setStatus(w, "username_error", "");
	}
	if(me.emailValid(w.formElem["reg_mail"].value)){
		me.setStatus(w, "mail_error", me.msgEmailOk);
	}else{
		me.setStatus(w, "mail_error", "invalid email address");
		return false;
	}
	if(w.formElem["reg_password1"].value==''){
		me.setStatus(w, "pass1_error", me.msgNoPassword);
		return false;
	}else{
		me.setStatus(w, "pass1_error", "");
	}
	if(w.formElem["reg_password2"].value==''){
		me.setStatus(w, "pass2_error", me.msgNoPassword);
		return false;
	}
	if(w.formElem["reg_password1"].value != w.formElem["reg_password2"].value ){
		me.setStatus(w, "pass1_error", me.msgDifferentPasswords);
		me.setStatus(w, "pass2_error", me.msgDifferentPasswords);
		return false;
	}
 	var params ={};
	params.p = Crypto.hexSha1Str(w.formElem['reg_password1'].value);
	params.u = w.formElem['reg_username'].value;
	params.place = place;
	params.w = w;
	var loginResp=doHttp('POST',url+'/handle/register.php',"username="+w.formElem['reg_username'].value+"&reg_mail="+w.formElem['reg_mail'].value+"&password="+Crypto.hexSha1Str(w.formElem['reg_password1'].value)+"&password2="+Crypto.hexSha1Str(w.formElem['reg_password2'].value),null,null,null,config.macros.register.registerCallback,params);
	w.addStep(me.step2Title, me.msgCreatingAccount);
	w.setButtons([
		{caption: me.buttonCancel, tooltip: me.buttonCancelToolTip, onClick: function() {config.macros.ccLogin.refresh(place);}
	}]);
}

config.macros.register.emailValid=function(str){
	if((str.indexOf(".") > 0) && (str.indexOf("@") > 0))
		return true;
	else
		return false;
};

config.macros.register.usernameValid=function(str){
	if((str.indexOf("_") > 0) && (str.indexOf("@") > 0))
		return false;
	else
		return true;
};

config.macros.register.registerCallback=function(status,params,responseText,uri,xhr){
	var userParams = {};
	userParams.place = params.place;
	if (xhr.status==304){
		params.w.addStep(config.macros.register.errorRegisterTitle, config.macros.register.errorRegister);
		return false;
	}	
	var adaptor = new config.adaptors[config.defaultCustomFields['server.type']];
	var context = {};
	context.host = window.url;
	context.username = params.u;
	context.password = params.p;
	adaptor.login(context,userParams,config.macros.ccLogin.loginCallback);
	return true;
}

config.macros.register.isUsernameAvailable=function(w){
	var params = {};
	params.w = w;
	doHttp('POST',url+'/handle/register.php',"username="+w.formElem["reg_username"].value+"&free=1",null,null,null,config.macros.register.isUsernameAvailabeCallback,params);
	return false;
};

config.macros.register.isUsernameAvailabeCallback=function(status,params,responseText,uri,xhr){
	var me = config.macros.register;
	var resp = (responseText > 0) ? me.msgUsernameTaken : me.msgUsernameAvailable;
	config.macros.register.setStatus(params.w, "username_error", resp);
};
//}}}
config.backstageTasks.push("about");
merge(config.tasks,{about:{text: config.macros.ccAbout.buttonBackstageText,tooltip: config.macros.ccAbout.buttonBackstageTooltip,content: '<<ccAbout>>'}});

if (isLoggedIn()){
	config.backstageTasks.push("logout");
	merge(config.tasks,{logout:{text: config.macros.ccLogin.buttonLogout,tooltip: config.macros.ccLogin.buttonLogoutToolTip,content: '<<ccLogin>>'}});

//	config.backstageTasks.push("create");
//	merge(config.tasks,{create: {text: config.macros.ccCreateWorkspace.buttonCreateText, tooltip: config.macros.ccCreateWorkspace.buttonCreateTooltip, content:'<<ccCreateWorkspace>>'}});

}else{
	config.backstageTasks.push("login");
	merge(config.tasks,{login:{text: config.macros.ccLogin.buttonlogin,tooltip: config.macros.ccLogin.buttonLoginToolTip,content: '\r\n\r\n<<tiddler Login>>'}});	
}

// ccFile //


//{{{
	
config.macros.ccFile = {};
var iFrameLoad=function(w){
	var uploadIframe = document.getElementById('uploadIframe');
	var a = createTiddlyElement(null, "div");
	a.innerHTML = uploadIframe.contentDocument.body.innerHTML;
	removeChildren(w.formElem.placeholder);
	w.formElem.placeholder.parentNode.appendChild(a);
	var statusArea = w.formElem.placeholder;
	document.getElementById("ccfile").value=""; 
};

config.macros.ccFile.handler=function(place,macroName,params,wikifier,paramString,tiddler, errorMsg){
	var w = new Wizard();
	w.createWizard(place,config.macros.ccFile.wizardTitleText);
	config.macros.ccFile.refresh(w);
};

config.macros.ccFile.refresh=function(w){
	params = {};
	params.w = w;
	params.e = this;
	var me = config.macros.ccFile;
	doHttp('GET',url+'/handle/listFiles.php?workspace='+workspace,'',null,null,null,config.macros.ccFile.listAllCallback,params);
	w.setButtons([
		{caption: me.buttonDeleteText, tooltip: me.buttonDeleteTooltip, onClick: function(w){ 
			config.macros.ccFile.delFileSubmit(null, params);
			 return false;
		}}, 
		{caption: me.buttonUploadText, tooltip: me.buttonUploadTooltip, onClick: function(e){ 
			config.macros.ccFile.addFileDisplay(null, params); return false 
			} }
	]);
};

config.macros.ccFile.delFileSubmit=function(e, params) {
	var listView = params.w.getValue("listView");
	var rowNames = ListView.getSelectedRows(listView);
	for(var e=0; e < rowNames.length; e++) 
	doHttp('POST',url+'/handle/listFiles.php','action=DELETEFILE&file='+rowNames[e]+'&workspace='+workspace,null,null,null,config.macros.ccFile.delFileCallback,params);
	return false; 
};

config.macros.ccFile.delFileCallback=function(status,params,responseText,uri,xhr){
	config.macros.ccFile.refresh(params.w);
};

config.macros.ccFile.addFileDisplay = function(e, params){
	var frm = params.w.formElem;
	if(navigator.appName=="Microsoft Internet Explorer"){
		encType = frm.getAttributeNode("enctype");
	    encType.value = "multipart/form-data";
	}
	frm.setAttribute("enctype","multipart/form-data");
	frm.setAttribute("method","POST");
	frm.action=window.url+"/handle/upload.php"; 
	frm.id="ccUpload";
	frm.target="uploadIframe";
	frm.name = "uploadForm";
	frm.parentNode.appendChild(frm);
	params.w.addStep("ss", "<input id='ccfile' class='input' type='file' name='userFile'/>"+"<input type='hidden' name='placeholder'/>");
	var workspaceName=createTiddlyElement(null,'input','workspaceName','workspaceName');				
	workspaceName .setAttribute('name','workspace');
	workspaceName.type="HIDDEN";
	workspaceName.value=workspace;
	frm.appendChild(workspaceName);
	createTiddlyElement(frm,'br');
	var saveTo=createTiddlyElement(null,"input","saveTo","saveTo");	
	var iframe=document.createElement("iframe");
	iframe.style.display="none";
	iframe.id='uploadIframe';
	iframe.name='uploadIframe';
	iframe.onload = function() {
		iFrameLoad(params.w);
	}	
	frm.appendChild(iframe);
	createTiddlyElement(frm,"div",'uploadStatus');
	params.w.setButtons([
	{caption: config.macros.ccFile.buttonCancelText, tooltip: config.macros.ccFile.buttonCancelTooltip, onClick: function(){config.macros.ccFile.refresh(params.w);}
	},
	{caption: config.macros.ccFile.buttonUploadText, tooltip: config.macros.ccFile.buttonUploadTooltip, onClick: function(){params.w.formElem.submit();}
	}]);
};

function addOption(selectbox,text,value ){
	var optn = document.createElement("OPTION");
	optn.text = text;
	optn.value = value;
	selectbox.options.add(optn);
}

config.macros.ccFileImageBox = function(image){
	var full = image.src;
	setStylesheet(
	"#errorBox .button {padding:0.5em 1em; border:1px solid #222; background-color:#ccc; color:black; margin-right:1em;}\n"+
	"html > body > #backstageCloak {height:"+window.innerHeight*2+"px;}"+
	"#errorBox {border:1px solid #ccc;background-color: #fff; color:#111;padding:1em 2em; z-index:9999;}",'errorBoxStyles');
	var box = document.getElementById('errorBox') || createTiddlyElement(document.body,'div','errorBox');
	box.innerHTML =  "<a style='float:right' href='javascript:onclick=ccTiddlyAdaptor.hideError()'>"+ccTiddlyAdaptor.errorClose+"</a><h3>"+image.src+"</h3><br />";
	box.style.position = 'absolute';
	box.style.width= "800px";
	var img = createTiddlyElement(box, "img");
	img.src = full;
	ccTiddlyAdaptor.center(box);
	ccTiddlyAdaptor.showCloak();
}

config.macros.ccFile.listAllCallback = function(status,params,responseText,uri,xhr){
	var me = config.macros.ccFile;
	var out = "";
	var adminUsers = [];
	if(xhr.status!=200){
		params.w.addStep(me.errorPermissionDeniedTitle, me.errorPermissionDeniedView);
		return true;
	}
	try{
		var a = eval(responseText);
		for(var e=0; e < a.length; e++){ 		
		out += a[e].username;	
			adminUsers.push({
				htmlName: "<html><a href='"+a[e].url+"' target='new'>"+a[e].filename+"</a></html>",
				name: a[e].filename,
				wikiText:'<html><img onclick="config.macros.ccFileImageBox(this)"; src="'+a[e].url+'" style="width: 70px; "/></html>',
				URI:a[e].url,
				lastVisit:a[e].lastVisit,
				fileSize:a[e].fileSize
			});
		}
	}catch (ex){
		params.w.setButtons([
			{caption: me.buttonUploadText, tooltip: me.buttonUploadTooltip, onClick: function(w){				
				config.macros.ccFile.addFileDisplay(e, params);
			} }]);
	}
	params.w.addStep(me.wizardStepText+workspace, "<input type='hidden' name='markList'></input>");
	var markList = params.w.getElement("markList");
	var listWrapper = document.createElement("div");
	markList.parentNode.insertBefore(listWrapper,markList);
	var listView = ListView.create(listWrapper,adminUsers,config.macros.ccFile.listAdminTemplate);
	//params.w.setValue("listAdminView",listAdminView);
	params.w.setValue("listView",listView);
};

config.macros.ccFile.addFileCallback = function(status,params,responseText,uri,xhr){	
	config.macros.ccFile.refresh(params.w);
};

//}}}

// Import Override - ensures imported tiddlers have cctiddly server type. 
config.macros.importTiddlers.onGetTiddler = function(context,wizard)
{
	
	if(!context.status)
		displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
	var tiddler = context.tiddler;
	if(store.tiddlerExists(tiddler.title)) {
		var t = store.getTiddler(tiddler.title);
		tiddler.fields = t.fields;
	}
	store.suspendNotifications();
	tiddler.fields['server.type'] = 'cctiddly';
	tiddler.fields['server.host'] = window.url;
	tiddler.fields['workspace']= window.workspace;
	store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, false, tiddler.created);// local 
//	config.extensions.ServerSideSavingPlugin.saveTiddler(tiddler); // remote save. 
	if(!wizard.getValue("sync")) {
		store.setValue(tiddler.title,'server',null);
	}
	store.resumeNotifications();
	if(!context.isSynchronous)
		store.notify(tiddler.title,true);
	var remainingImports = wizard.getValue("remainingImports")-1;
	wizard.setValue("remainingImports",remainingImports);
	if(remainingImports == 0) {
		if(context.isSynchronous) {
			store.notifyAll();
			refreshDisplay();
		}
		wizard.setButtons([
				{caption: config.macros.importTiddlers.doneLabel, tooltip: config.macros.importTiddlers.donePrompt, onClick: config.macros.importTiddlers.onClose}
			],config.macros.importTiddlers.statusDoneImport);
		autoSaveChanges();
	}
};
//{{{
	
//  ccAbout //
config.macros.ccAbout={};

config.macros.ccAbout.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
	var w = new Wizard();
	var me = config.macros.ccAbout;
	w.createWizard(place,me.stepAboutTitle);
	w.addStep(null, me.stepAboutTextStart + window.ccTiddlyVersion + "<br /><br />" + me.stepAboutTextEnd);
};
//}}}
// ccLoginStatus //

//{{{


config.macros.ccLoginStatus={};
	
config.macros.ccLoginStatus.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	var loginDiv=createTiddlyElement(place,"div",null,"loginDiv",null);
	this.refresh(loginDiv);
};
	
config.macros.ccLoginStatus.refresh=function(place,errorMsg){
       var me = config.macros.ccLoginStatus;
       var loginDivRef=document.getElementById ("LoginDiv");
       removeChildren(loginDivRef);
       var wrapper=createTiddlyElement(place,"div");
       var str = (workspace == "" ? me.textDefaultWorkspaceLoggedIn :(me.textViewingWorkspace+workspace))+"\r\n\r\n";
       if (isLoggedIn()){
			name = cookieString(document.cookie).txtUserName;
			str += me.textLoggedInAs+decodeURIComponent(name)+".\r\n\r\n";
			if (workspacePermission.owner==1){
				str += me.textAdmin;
			}
       }else{
               str += me.textNotLoggedIn;
       }
       wikify(str,wrapper);
};
//}}}

// ccOptions //
//{{{
config.macros.ccOptions={};		
config.macros.ccOptions.handler=function(place,macroName,params,wikifier,paramString,tiddler){
	var me = config.macros.ccOptions;
	if(workspacePermission.owner==1)
		wikify("[["+me.linkManageUsers+"|Manage Users]]<br />[["+me.linkPermissions+"|Permissions]]<br />[["+me.linkStats+"|Statistics]]<br />", place);
	if (isLoggedIn())
		wikify("[["+me.linkFiles+"|files]]<br />", place);
		if (isLoggedIn()){
			if (workspacePermission.canCreateWorkspace==1)
				wikify("[["+me.linkCreate+"|CreateWorkspace]]<br />", place);
			// append url function required 
			wikify("[["+me.linkPassword+"|Password]]<br />", place);
			if (window.fullUrl.indexOf("?") >0)
				wikify("[["+me.linkOffline+"|"+fullUrl+"&standalone=1]]<br />", place);
			else 
				wikify("[["+me.linkOffline+"|"+fullUrl+"?standalone=1]]<br />", place);	
		}
};

//}}}





/*
// Displays the default tiddlers alongside the login box when users are not logged in.
window.restart = function(){
	story.displayDefaultTiddlers();
	invokeParamifier(params,"onstart");
	window.scrollTo(0,0); 
	});
};
*/
// ccChangePassword //

// {{{
	
	config.macros.ccChangePassword={};
	
	config.macros.ccChangePassword.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
		var w = new Wizard();
		var me = config.macros.ccChangePassword;
		w.createWizard(place,me.title);
		w.addStep(me.subTitle+cookieString(document.cookie).txtUserName,me.step1Html);
		w.setButtons([
			{caption: me.buttonChangeText, tooltip: me.buttonChangeToolTip, onClick: function(){config.macros.ccChangePassword.doPost(w);  } }
		]);
	};

	config.macros.ccChangePassword.doPost = function (w) {
		me = config.macros.ccChangePassword;
		if(!w.formElem.new1.value || !w.formElem.new2.value || !w.formElem.old.value) {
			displayMessage(me.noticePasswordUpdateFailed);
			return false;
		}
		if(w.formElem.new1.value != w.formElem.new2.value){
			displayMessage(me.noticePasswordsNoMatch);
			return false;
		}
		doHttp("POST", url+"handle/changePassword.php", "&new1="+Crypto.hexSha1Str(w.formElem.new1.value)+"&new2="+Crypto.hexSha1Str(w.formElem.new2.value)+"&old1="+Crypto.hexSha1Str(w.formElem.old.value),null,null,null,config.macros.ccChangePassword.callback);	
	}

	config.macros.ccChangePassword.callback = function(status,context,responseText,uri,xhr) {
		if(xhr.status == 304)
			displayMessage(me.noticePasswordUpdateFailed);
		else
			displayMessage(me.noticePasswordUpdated);
	}

	//}}}
powerpape
merge(config.options, {search:"search.."})


config.theme = {
	contentTitle : ' ssss »',
	contentToolTip : 'aaaa',
	contentTiddler : 'Content »',
	contentTiddlerTooltip : 'click to view TiddlyWiki content'
};
merge(config.macros.ccAbout,{
	buttonBackstageText:"about",
	buttonBackstageTooltip:"Find out more about ccTiddly ",
	stepAboutTitle:"About",
	stepAboutTextStart:"You are running ccTiddly ",
	stepAboutTextEnd:"More info about ccTiddly can be found  at <a  target=new href=http://www.tiddlywiki.org/wiki/CcTiddly>http://www.tiddlywiki.org/wiki/CcTiddly</a><br/><br/>  More information about TiddlyWiki can be found at <a target=new href=http://www.tiddlywiki.com>http://www.tiddlywiki.com</a><br/>"
});

merge(config.macros.ccChangePassword,{
	title:"Change Password", 
	subTitle : "for user ", 
	step1Html: " <label for='old'>Old Password </label><input name='old' type='password'/><br/> <label for='new1'>New Password </label> <input  name='new1' type='password' /><br /><label for='new2'>Repeat Password</label> <input  name='new2' type='password' /> ",   
	buttonChangeText:"Change Password",
	buttonChangeToolTip:"Click to change your password", 
	buttonCancelText:"Cancel",
	buttonCancelToolTip:"Click to cancel",
	noticePasswordsNoMatch : "Your new passwords do not match", 
	noticePasswordWrong : "Your password is incorrect.",
	noticePasswordUpdated : "Your Password has been updated", 
	noticePasswordUpdateFailed : "Your Password was NOT updated." 
});

merge(config.macros.ccAdmin,{
	stepAddTitle:"Add a new Workspace Administrator",
	WizardTitleText:"Workspace Administration.",
	buttonDeleteText:"Delete Users",
	buttonDeleteTooltip:"Click to delete users.",
	buttonAddText:"Add User",
	buttonAddTooltip:"Click to add user.",
	buttonCancelText:"Cancel",
	buttonCalcelTooltip:"Calcel adding user.",
	buttonCreateText:"Make User Admin",
	buttonCreateTooltip:"Click to make user admin.",
	labelWorkspace:"Workspace: ",
	labelUsername:"Username  : ",
	stepErrorTitle:"You need to be an administrator of this workspace.",
	stepErrorText:"Permission Denied to edit workspace : ",
	stepNoAdminTitle:"There are no admins of this workspace.",
	stepManageWorkspaceTitle:"",
	listAdminTemplate: {
	columns: [	
		{name: 'Selected', field: 'Selected', rowName: 'name', type: 'Selector'},
		{name: 'Name', field: 'name', title: "Username", type: 'String'},	
		{name: 'Last Visit', field: 'lastVisit', title: "Last Login", type: 'String'}
	],
	rowClasses: [
		{className: 'lowlight', field: 'lowlight'}
	]}
});
/*
merge(ccTiddlyAutoSave,{
	msgSaved:"Saved ",
	msgError:"There was an error saving "
});
*/

merge(config.macros.ccCreateWorkspace, {
	wizardTitle:"Create Workspace",
	buttonCreateText:"create",
	buttonCreateWorkspaceText:"Create Workspace",
	buttonCreateTooltip:'Create new workspace',
	errorPermissions:"You do not have permissions to create a workspace.  You may need to log in.",
	msgPleaseWait:"Please wait, your workspace is being created.",
	msgWorkspaceAvailable:"Workspace name is available.",
	errorWorkspaceNameInUse:"Workspace name is already in use.",
	stepTitle:"Please enter workspace name",
	stepCreateHtml:"<input class='input' id='workspace_name' name='workspace_name' value='' tabindex='1' /><span></span><input type='hidden' name='workspace_error'></input><h2></h2><input type='hidden' name='workspace_url'></input>"
});

merge(config.macros.ccEditWorkspace,{
	WizardTitleText:"Edit Workspace Permissions",
	stepEditTitle:null,
	stepLabelCreate:'Create',
	stepLabelRead:'Read',
	stepLabelUpdate:'Edit',
	stepLabelDelete:'Delete',
	stepLabelPermission:'',
	stepLabelAnon:'  Anonymous   ',
	stepLabelUser:' Authenticated   ',
	stepLabelAdmin:' Admin  ',
	buttonSubmitCaption:"Update Workspace Permissions",
	buttonSubmitToolTip:"Update workspace permissions",
	button1SubmitCaption:"ok",
	button1SubmitToolTip:"review permissions",
	step2Error:"Error", 
	errorTextPermissionDenied:"You do not have permissions to edit this workspace permissions.  You may need to log in.",
	errorUpdateFailed:"Permissions Not changed"
});

merge(config.macros.ccFile,{
	wizardTitleText:"Manage Files",
	wizardStepText:"Manage files in workspace ",
	buttonDeleteText:"Delete Files",
	buttonDeleteTooltip:"Click to Delete files.",
	buttonUploadText:"Upload File",
	buttonUploadTooltip:"Click to Upload files.",
	buttonCancelText:"Cancel",
	buttonCancelTooltip:"Click to cancel.",
	labelFiles:"Existing Files ",
	errorPermissionDeniedTitle:"Permission Denied",
	errorPermissionDeniedUpload:"You do not have permissions to create a file on this server. ",
	errorPermissionDeniedView:"You do not have permissions to view files in this workspace. ",
	listAdminTemplate: {
	columns: [	
	{name: 'wiki text', field: 'wikiText', title: "", type: 'WikiText'},
	{name: 'Selected', field: 'Selected', rowName: 'name', type: 'Selector'},
	{name: 'Name', field: 'name', title: "File", type: 'WikiText'},
	{name: 'URI', field: 'URI', title: "URI", type: 'WikiText'},
	{name: 'Size', field: 'fileSize', title: "size", type: 'String'}
	],
	rowClasses: [
	{className: 'lowlight', field: 'lowlight'}
	]}
});

merge(config.macros.ccLogin,{
	WizardTitleText:null,
	usernameRequest:"Username",
	passwordRequest:"Password",
	stepLoginTitle:null,
	stepLoginIntroTextHtml:"<label>username</label><input name=username id=username tabindex='1'><br /><label>password</label><input type='password' tabindex='2' name='txtPassword' class='txtPassword'><input   name='password'>",
	stepDoLoginTitle:"Logging you in",
	stepDoLoginIntroText:"we are currently trying to log you in.... ",
	stepForgotPasswordTitle:"Password Request",
	stepForgotPasswordIntroText:"Please contact your system administrator or register for a new account.  <br /><input id='forgottenPassword' type='hidden' name='forgottenPassword'/>",
	stepLogoutTitle:"Logout",
	stepLogoutText:"You are currently logged in as ",
	buttonLogout:"logout",
	buttonLogoutToolTip:"Click here to logout.",
	buttonLogin:"Login",
	buttonlogin:"login",
	buttonLoginToolTip:"Click to Login.",	
	buttonCancel:"Cancel",
	buttonCancelToolTip:"Cancel transaction ",
	buttonForgottenPassword:"Forgotten Password",	
	buttonSendForgottenPassword:"Mail me a New Password",
	buttonSendForgottenPasswordToolTip:"Click here if you have forgotten your password",
	buttonForgottenPasswordToolTip:"Click to be reminded of your password",
	msgNoUsername:"Please enter a username", 
	msgNoPassword:"Please enter a password",
	msgLoginFailed:"Login Failed, please try again. ", 
	configURL:window.url+"/handle/login.php", 
	configUsernameInputName:"cctuser",
	configPasswordInputName:"cctpass",
	configPasswordCookieName:"cctPass"
});

merge(config.macros.ccLoginStatus,{
	textDefaultWorkspaceLoggedIn:"Viewing default workspace",
	textViewingWorkspace:"Viewing Workspace : ",
	textLoggedInAs:"Logged in as ",
	status:"status »",
	textNotLoggedIn:"You are not logged in.",
	textAdmin:"You are an Administrator."
});

merge(config.macros.ccOptions, {
	linkManageUsers:"users",
	linkPermissions:"permissions",
	linkFiles:"files",
	linkPassword:"password",
	linkCreate:"create",
	linkOffline:"offline",
	linkStats:"statistics",
	options:"options »"	
});

merge(config.macros.register,{
	usernameRequest:"username",
	passwordRequest:"password",
	passwordConfirmationRequest:"confirm password",
	emailRequest:"email",
	stepRegisterTitle:"Register for an account.",
	stepRegisterIntroText:"Hi, please register below.... ",
	stepRegisterHtml:"<label> username</label><input class='input' id='reg_username' name='reg_username' tabindex='1'/><span></span><input type='hidden'  name='username_error'></input><br /><label>email</label><input class='input' name=reg_mail id='reg_mail' tabindex='2'/><span> </span><input type='hidden' name='mail_error'></input><br/><label>password</label><input type='password' class='input' id='password1' name='reg_password1' tabindex='3'/><span> </span><input type='hidden'  name='pass1_error'></input><br/><label>confirm password</label><input type='password' class='input' id='password2' name='reg_password2' tabindex='4'/><span> </span><input type='hidden'  name='pass2_error'></input>",
	buttonCancel:"Cancel",
	buttonCancelToolTip:"Cancel transaction ",
	buttonRegister:"Register",	
	buttonRegisterToolTip:"click to register",
	msgCreatingAccount:"Attempting to create the account for you.", 
	msgNoUsername:"No username entered", 
	msgEmailOk:"Email address is OK.",
	msgNoPassword:"no password entered.",
	msgDifferentPasswords:"Your Passwords do not match.",
	msgUsernameTaken:"The username requested has been taken.",
	msgUsernameAvailable:"The username is available.",
	step2Title:"",
	step2Html:"Please wait while we create you an account...",
	errorRegisterTitle:"Error",
	errorRegister:"User not created, please try again with a different username."
});

merge(config.macros.ccStats,{
	graph24HourTitle:"Last 24 hours",
	graph24HourDesc:"The number of views of this workspace in the past 24 hours",
	graph20MinsTitle:"Last 20 Minutes",
	graph20MinsDesc:"The number of views of this workspace in the last 20 minutes",
	graph7DaysTitle:"Last 7 days",
	graph7DaysDesc:"The number of views of this workspace in the last 7 days.",
	graph5MonthsTitle:"Last 5 months",
	graph5MonthsDesc:"The number of views of this workspace in the past 30 days.",
	errorPermissionDenied:"Permissions Denied to data for %0 You need to be an administrator on the %1 workspace.",
	stepTitle:"Workspace Statistics"
});


// GENERAL NON CCT CONTENT 

config.theme = {
	contentTitle:"content »",
	contentToolTip : "View the TiddlyWiki tabs",
	help : "Help"
};

merge(config.macros.importTiddlers, {
	wizardTitle: "Import tiddlers",
	step1Title: "Step 1: Locate the server or TiddlyWiki file",
	step1Html: "Specify the type of the server: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL here: <input type='text' size=50 name='txtPath'><br><input type='hidden' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>"
});

merge(config.optionsDesc,{
	txtUserName: "",
	chkRegExpSearch: "Enable regular expressions for searches",
	chkCaseSensitiveSearch: "Case-sensitive searching",
	chkIncrementalSearch: "Incremental key-by-key searching",
	chkAnimate: "Enable animations",
	chkSaveBackups: "",
	chkAutoSave: "",
	txtTheme: "Change the TiddlyWiki theme being used",
	chkGenerateAnRssFeed: "",
	chkSaveEmptyTemplate: "",
	chkOpenInNewWindow: "Open external links in a new window",
	chkToggleLinks: "Clicking on links to open tiddlers causes them to close",
	chkHttpReadOnly: "",
	chkForceMinorUpdate: "",
	chkConfirmDelete: "Require confirmation before deleting tiddlers",
	chkInsertTabs: "Use the tab key to insert tab characters instead of moving between fields",
	txtBackupFolder: "",
	txtMaxEditRows: "Maximum number of rows in edit boxes",
	txtFileSystemCharSet: "Default character set for saving changes (Firefox/Mozilla only)"});

merge(config.macros.options,{
	wizardTitle: "Change Settings",
	step1Title: "",
	step1Html: '<input type="hidden" name="markList"></input><br><input type="hidden" checked="false" name="chkUnknown"></input>These options are saved in a cookie.'
});

merge(config.macros.options,{
	wizardTitle:"Advanced settings",
	step1Title:null,
		unknownDescription: "//(unknown)//",
	listViewTemplate: {
		columns: [
			{name: 'Option', field: 'option', title: "", type: 'String'},
			{name: 'Description', field: 'description', title: "", type: 'WikiText'}
			],
			rowClasses: [
						{className: 'lowlight', field: 'lowlight'}
						]
}
});
config.macros.seo = {};
config.macros.seo.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	createTiddlyButton(place, "Generate HTML files", "Click to generate HTML files.", config.macros.seo.click);
};

config.macros.seo.click = function() {
	var tiddlers=store.getTiddlers("modified","excludeLists").reverse();
	for(var i=0; i<tiddlers.length; i++){
	       store.saveTiddler(tiddlers[i].title);
	}
	
};
<link rel='alternate' type='application/rss+xml' title='RSS Feed for NemWiki' href='http://nemo.house.cx/index.xml'/>
<link rel='shortcut icon' href='/favicon.png' />
To get started with this workspace, you'll need to modify the following tiddlers:
* SiteTitle &amp; 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 workspace is opened when a user is logged in.
* AnonDefaultTiddlers: Contains the names of the tiddlers that you want to appear when the worksace is opened when a user who is not logged in.  This should contain  the login tiddler. [[Login]]
* You can change the permission of this workspace at anytime by opening the [[Manage Users]] and [[Permissions]] tiddlers.<<ccEditWorkspace>>
~NemWiki
.../nemo maelstrom thorx
[img[http://nemo.house.cx/uploads/workspace/default/nemlogo_rv.png]]
[ [[Nemo]] | [[NemWiki]] ]
!!!
<<tabs txtNavTab "Tags" "All the tags... in a cloud!" TagCloud "Recent" "Last 20 changes" TabTimelineLimited20>>
----
{{credit{
page loaded at:
 <<today "YYYY-0MM-0DD 0hh:0MM:0ss">>
(a <<today ddd>> in <<today MMM>>)
}}}
So on a news report I misread "fundraiser" as "funkraiser". 

24 Hour Funk-a-thon, here we come!
self proclaimed title, of sorts. 
[[Nemo]]
[[Nemo]]
System tag
ccTiddly runs this whole sh'bang. Provided by [[Osmosoft]]
System tag
System tag
System tag
System tag
System tag
System tag
System Tag
[[♡?]]

Don't you just think that Kitten Zagnog is a perfect name for a supervillian? (But she's not. She's more like my little sister)
There are many people I know. Some will be mentioned here. Some may even be contributors to here. They should all be tagged as 'people' :)

Not all tagged here are contributors to NemWiki, and vice versa
Ok, so I just setup nemo.house.cx today as a ccTiddly install. I have had a long geek affair with wikis in general, and with TiddlyWIki specifically, just of late. 

This is a server-based install of Tiddlywiki, running ccTiddly codebase. Let's see how it runs

.../[[Nemo]]
I run several sites, each targetted at a specific niche. Here is how it breaks down:
!!! Professional
thorx.net is my "professional" face. Nothing there should be anything I wouldn't be happy to show an employer. There is both a blog and a wiki, with the wiki intending to act as workshop/drafting ground and idea storage before the blog, which acts as the 'PR' and advertised site.
* ThorxBlog - I put this on my resume. 
* ThorxWiki - I would have no hesitation mentioning this in a job interview
!!! Personal
house.cx is my "personal" face. Note that it's personal, but not private, hence its existance online. Stuff here should be of concern to myself, family and friends. Writings or ideas may move from here to ~ThorxWiki over time, according to quality and the nature of my evolving professional face. 
* NemWiki - where you are now!
* "[[page at ~nemo]]" - This is my "//homepage, reimagined//". It's a "lifestream" - that is, a page dedicated to being an RSS aggregator for all my other sites (those listed above, and also my livejournal, facebook, twitter, deviantart, last.fm, flickr, etc). Takes all the mystery out of cyberstalking me. And no, it's not yet existing...
!!!Projects
These are wiki workspaces relative to NemWiki, and may be public or private according to preference. 
* SlumberWiki - public
* Light - private
* HHG - private
!!! Private
Finally, my private wiki - a wiki-on-a-stick, using the original [[TiddlyWiki|http://tiddlywiki.org]] software. It exists only on my harddrive, but should be consulted in case I ever die, so I mention it here in the hopes it is at least known about. It's called...
:"NemoBrain'' ~OnAStick
!!!...and finally...
As a footnote, I have a notable internet presence which is outside mere websites I run myself. Details of this presence can be found on my [[Contact]] page. 
* http://www.thorx.net/
* http://wiki.thorx.net/
{{center{
I am [[online|Contact]].
I am a [[native of earth|earthnative]].
Am I a ''N''etwork.''E''nhanced.''M''acro-''O''rganism?}}}
----
Whatever.
Hi there...  and welcome! So what is this, I might hear you ask? And well ask you might!

I am [[Nemo]], and this is my [[wiki|NemWiki]]

...that is, Nemo's ''personal site'' (as opposed to some [[others sites I have|NemoWeb]]). 

Personal can have a subtext of 'private', but it doesn't always. My name is personal. My hair colour is personal. My height is personal. My taste in clothes is personal. Yet all these things, and more, are public. Most people adorn their workplace with personal photos (family, pets, etc), and those too are public. ...And so it is with my website. 

So I invite you to get started with my LifeStory, or just browse <<tag nemo "everything tagged 'nemo'">>

{{center{
[img[http://nemo.house.cx/uploads/workspace/default/nemo_graffiti.jpg][Nemo]]

"Nemo mortalium omnibus horis sapit" -- Latin for "No mortal is wise at all hours"
}}}
I have been getting itchy feet lately, to live by myself. 

It's something I've long stated is a goal - to live wholly and truly by myself. I've been saying that it's a goal for years. But it has never felt urgent before. Never felt like it was... Important To Do. 

Now it does. I enjoy living here, but the need to have my own house-sized space is growing by the week.

Current goal: pay off loan by end of year (= 10months early), and then channel same monies into savings for purpose of bond and appliances for a house, such as I might need more than I have now. (likely)
* URL forthcoming. Site in development
config.macros.OpenID={};
merge(config.macros.OpenID,{
	titleOpenID:"",
	buttonOpenIDText:"Login",
	buttonOpenIDToolTip:"Click to use OpenID Login" 
});

config.macros.OpenID.handler=function(place,macroName,params,wikifier,paramString,tiddler,errorMsg){
	var w = new Wizard();
	var me = config.macros.OpenID;
	w.createWizard(place,me.titleOpenID);
	w.addStep(null,"<!--<img width='150px' src='http://openid.net/wp-content/uploads/2007/10/openid_big_logo_text.png'/><br />--><input name='open_id_login' value='%0' size=40 style='background: rgb(255, 255, 255) url(http://www.openid.net/login-bg.gif) no-repeat scroll 0pt 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: rgb(0, 0, 0); padding-left: 18px;'/>".format([decodeURIComponent(cookieString(document.cookie).txtUserName)]));
	w.setButtons([
		{caption: me.buttonOpenIDText, tooltip: me.buttonOpenIDToolTip, onClick: function(){config.macros.OpenID.login(w);  } }
	]);
};

config.macros.OpenID.login = function (w) {
	var iframe = document.createElement("iframe");
	iframe.style.display = "none";
	iframe.src = url+"plugins/OpenID/files/openid/try_auth.php?action=verify&openid_identifier="+w.formElem.open_id_login.value;
	document.body.appendChild(iframe);
	iframe.onload = function() {
		// this is not working properly.
		if(iframe.src.indexOf("finish_auth.php")){
			window.location = iframe.src;	
		}
	};
	document.body.appendChild(iframe);
}

//}}}


[[Kitten|Kitten Zagnog]]'s tag. Now it has a webpage too
Siteware [[ccTiddly]]
Content [[©|Copyright]] [[Nemo]] and [[others|people]]
[img[http://i.creativecommons.org/l/by-nc-sa/3.0/80x15.png]]
<<search>><<closeAll>><<permaview>>
<<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">><<slider chkSliderAdminPanel AdminPanel "admin »" "Admin functions">><<slider chkSliderContentTabs SideBarContentTabs "content »" "View TiddlyWiki Tabs">>
----
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
http://nemo.house.cx/
All content on NemWiki is copyright to Nemo by default. Why? Because it's his site. So nyer. 

Actually, it's not quite so draconian as that...
!!Copyright detail
;Content created by Nemo:
:Copyright Nemo, regardless of subsequent edits by any alternate user.
;Content first created by a second party alternate user (as determined by login):
:Joint copyright to second party user and Nemo, regardless of subsequent edits by the original creator, lack of edits by Nemo, or edits by any third party alternate user. 
* Any content sourced from other sites retain their own copyright however (please acknowledge appropriately the origin so this can be traced). Third party content is assumed to be under a license appropriate to its usage here.
Speaking of licenses...
!! License
Despite the copyright, it is licensed thus:
!!! Creative Commons - ~Attribution-Noncommercial-Share Alike 3.0
This work is licensed under a [[Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License|http://creativecommons.org/licenses/by-nc-sa/3.0/]]
[IMG(176px,)[http://mirrors.creativecommons.org/presskit/buttons/88x31/png/by-nc-sa.png]]
----
!!!! Summary
''You may''
* Share this file (pass it on)
* Modify this file (adapt it to your own needs)
''So long as you''
* Maintain original creator attribution (do not claim derivatives as original)
* Do not use file for commercial purposes (do not make money from it)
* Use this license for derivative works (pass this license on)
See the links above for full details at the [[Creative Commons|http://creativecommons.org]] site

And finally, I would strongly appreciate being notified of any use. 
re: commercial use - I ''will'' waive the NC clause one you let me know of your intent.
----
And finally... please remember, IANAL :)
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #f93
PrimaryMid: #ee9
PrimaryDark: #dda
SecondaryPale: #111
SecondaryLight: #442
SecondaryMid: #663
SecondaryDark: #ffc
TertiaryPale: #222
TertiaryLight: #444
TertiaryMid: #999
TertiaryDark: #ccc
Error: #f88
    *  Background: page background, text in title and subtitle
    * Foreground: ordinary text
    * PrimaryPale: options box
    * PrimaryLight: top part of the header gradient
    * PrimaryMid: text in MainMenu, links, lists of tiddlers and tags, bottom part of the header gradient
    * PrimaryDark: text of items at the top of right hand menu, text of buttons on the tiddlers
    * SecondaryPale: background of code blocks
    * SecondaryLight: highlighted tiddler buttons, highlighted sidebar items
    * SecondaryMid: table headers, message area, selected tiddler buttons
    * SecondaryDark: tiddler titles
    * TertiaryPale: sidebar background, tag box on tiddlers
    * TertiaryLight: unselected tabs behind the list of tags, tiddlers at the bottom of the sidebar
    * TertiaryMid: borders around the sidebar
    * TertiaryDark: tiddler subtitles
    * Error: error messages 
@@margin:0 1em;padding:0 4em;background-color:$1; @@ @@padding-right:1em;{{{$1}}}@@ [[$2|$3]]
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','Background')}} Background>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','Foreground')}} Foreground>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryPale')}} PrimaryPale>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryLight')}} PrimaryLight>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryMid')}} PrimaryMid>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','PrimaryDark')}} PrimaryDark>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryPale')}} SecondaryPale>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryLight')}} SecondaryLight>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryMid')}} SecondaryMid>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','SecondaryDark')}} SecondaryDark>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryPale')}} TertiaryPale>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryLight')}} TertiaryLight>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryMid')}} TertiaryMid>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','TertiaryDark')}} TertiaryDark>>
<<tiddler [[TemplateShowColor]] with:{{store.getTiddlerSlice('ColorPalette','Error')}} Error>>
/***
!! We'll have some custom styles, thanks
Makes changes to
* StyleSheetColors
* StyleSheetLayout
* StyleSheetLocale
* StyleSheetPrint
Also, see these for help:
* ColorPaletteView
* ColorPaletteHelp
!!! Let's have a custom body setup. Larger font and other tweaks
***/
/*{{{*/
body {font-size:.8em; font-family:arial,helvetica; margin:0; padding:0;}
#displayArea {
 padding: 1em;
 margin: 0.7em 16.3em 1em 13.5em;
 border-left:1px solid [[ColorPalette::PrimaryLight]];
 border-right: 1px solid [[ColorPalette::PrimaryLight]];
}

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

#tiddlerDisplay {
 padding: 0.5em 0em 0.5em 0em;
 border-top: 1px solid [[ColorPalette::SecondaryDark]];
 border-bottom: 1px solid [[ColorPalette::SecondaryDark]];
 margin: 0.5em 0em 0.5em 0em;
}

.highlight, .marked {border-top: 1px solid [[ColorPalette::PrimaryLight]];}

/*}}}*/
/***
!!!I can't make the main menu lose dots on lists without losing them in all listLink (where else is that used tho ... tag and tagging lists. ?)
***/
/*{{{*/
#mainMenu {width:11em; text-align:center;}
#mainMenu .listTitle, .listLink {list-style: none; text-align: left;}
.listTitle {
  border-bottom: 1px solid;
  border-top: 1px solid;
}
input { color: [[ColorPalette::Background]]; background: [[ColorPalette::TertiaryDark]]; border: [[ColorPalette::PrimaryDark]]; }
textarea { color: [[ColorPalette::Background]]; background: [[ColorPalette::TertiaryDark]]; border: [[ColorPalette::PrimaryDark]]; }
/*}}}*/
/***
!!! make the tabs headers different
***/
/*{{{*/
.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::TertiaryMid]];
	background:[[ColorPalette::Background]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
/*}}}*/
/***
!!!Tiddlers get borders. Invisible when not hovered.
***/
/*{{{*/
.tiddler {border: 1px solid [[ColorPalette::Background]]; margin: 1px; }
.selected { border: 1px solid [[ColorPalette::SecondaryLight]]; }
/*}}}*/
/***
!!!Custom subtitle now that I place it at the bottom of each tiddle. 
***/
/*{{{*/
.subtitle {font-size:0.7em; text-align:right; padding:0.2em 1em 0.2em 0.2em; border-top:1px solid; margin-top: 0.5em; margin-bottom: 1.5em;}
.subtitle {color:[[ColorPalette::TertiaryLight]]; }
.subtitle a {color:[[ColorPalette::SecondaryLight]]; }
.selected .subtitle {color:[[ColorPalette::TertiaryMid]]; }
.selected .subtitle a {color:[[ColorPalette::PrimaryDark]]; }
.selected .subtitle a:hover {background-color:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
a img {border:0;}
/*}}}*/
/***
!!!Backstage looks like...
***/
/*{{{*/
#backstageCloak {background:[[ColorPalette::Background]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/***
!!!With a dark colourscheme, we want the buttons looking like this:
***/
/*{{{*/
.wizard .button {
  color:[[ColorPalette::Foreground]];
  background:[[ColorPalette::SecondaryLight]];
  border: 1px solid [[ColorPalette::SecondaryDark]];
}
.wizard .button:hover {
  color:[[ColorPalette::Background]];
  background:[[ColorPalette::PrimaryMid]];
  border: 1px solid [[ColorPalette::PrimaryLight]];
}
.wizard .button:active {
  color:[[ColorPalette::Foreground]];
  background:[[ColorPalette::PrimaryLight]];
  border: 1px solid [[ColorPalette::Background]];
}

/*}}}*/
/***
!!!Some custom formattings...rightaligned, toc, sliders, small, center
***/
/*{{{*/
.intelliTaggerSuggestions {background: [[ColorPalette::TertiaryPale]]; }
.justifyright { text-align: right; }
.center { text-align: center;}
.small { font-size: 80%; }
.big { font-size: 120%; }
.border { border: 1px solid; }
.credit {
 text-align: right;
 padding-left: 15%;
 font-size: 80%;
}
.sectionTOC {
 border: 1px solid [[ColorPalette::TertiaryPale]];
 margin: 6px 6px 0px 0px;
  padding: 0em;
}
.sliderPanel {
  border: 1px solid [[ColorPalette::TertiaryPale]];
  margin: 0.5em;
  padding: 0.5em;
}

.tagging {margin:0; margin-top:1em; float:right; 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;}
.tagging li {float:left; padding-left: 0.4em; padding-right: 0.4em;}
.tagClear {clear:both;}

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

/*}}}*/
/***
<<sectionTOC>>
***/
/*{{{*/
n. a Wiki for [[Nemo]]
!!Raison d'être
This site is for, about and by Nemo. That isn't to say that others cannot use this wiki as well, but your default assumption here is that content is by, about or for Nemo. Thus, for example, the <<tag nemo>> tag should only be used for pages that are actually ABOUT nemo. Stuff merely 'by' Nemo (eg: <<tag writing>> or <<tag poetry>> need not be tagged. If someone else puts their own writings on here, then those SHOULD be tagged <<tag notnemo>> to make the distinction however. Other pages will be tagged as Nemo sees fit.
!!How this site works
If you're reading this, then you've already waded through the long download. Sorry about that! But there is a bonus - ALL site content is now downloaded, so all navigation here is now at the speed of your local computer. Yay! The theme is intended to be a nod towards old school text terminals (the amber ones, not the green ones obviously :) Tags will pop up a menu of pages for that tag - so either use the tag navigation cloud to the left, or follow the tags listed on each content block (called a "tiddler"). Use the 'close' or 'close others' links on each tiddler to help ease congestion.
!!!Editing
To prevent bots from editing, editing is restricted to logged in accounts. To prove you are sentient, please understand the following sentance: You can login and edit using the guest account created for this purpose: Login: "tribble", password "guest". 

Beyond that - explore this site! :)
!!History
NemWiki originally ran in 2001/2002 using ~UseModWiki software. It then went offline for a long period, and the content later imported to fill ThorxWiki in 2007. 

Circa 2009, Nemo started implementing his plan of seperating the content on ThorxWiki into professional content (for ThorxWiki), and personal content (to move to NemWiki). 

Due to formatting differences, the histories of pages from ThorxWiki are unlikely to be transferred (they will exist only in the deletelog of ThorxWiki, sadly). Other content may also be transferred however - such as previous news posts from earlier websites (dating as far back as [[NAFS|http://wiki.thorx.net/wiki/NAFS]] in 2000!)

So, welcome to this wiki. Whilst you can edit it if you have a login, please do not [[abuse it|WikiAbuse]]. Note also that as is intended as Nemo's site, so unless explicitly stated otherwise, all content in the first person refers to him - that is, me - Nemo. 
A demonstration, using tags...

Link loops and [[recursion]] are easy in a TIddlyWiki based system. Almost encouraged, given the right mindset (mine!)
/***

''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''

|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.

!Installation
Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.

!Customizing
Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.

!History
* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release

!Code
***/
//{{{
window.old_lewcid_splash_restart=window.restart;

window.restart = function()
{   if (document.getElementById("SplashScreen"))
        document.getElementById("SplashScreen").style.display = "none";
      if (document.getElementById("contentWrapper"))
        document.getElementById("contentWrapper").style.display = "block";
    
    window.old_lewcid_splash_restart();
   
    if (splashScreenInstall)
       {if(config.options.chkAutoSave)
			{saveChanges();}
        displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
        }
}


var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
   {var siteTitle = store.getTiddlerText("SiteTitle");
   var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
   if (! store.tiddlerExists("MarkupPreHead"))
       {var myTiddler = store.createTiddler("MarkupPreHead");}
   else
      {var myTiddler = store.getTiddler("MarkupPreHead");}
      myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
      store.setDirty(true);
      var splashScreenInstall = true;
}
//}}}
/***
|Name|CoreTweaks|
|Source|http://www.TiddlyTools.com/#CoreTweaks|
|Version|use with TW2.4.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2.0|
|Type|plugin|
|Requires||
|Overrides|various|
|Description|a small collection of overrides to TW core functions|
This tiddler contains changes TW core functions to provide minor changes in standard features or behavior.  It is hoped that some of these tweaks may someday be added into the TW core, so that these adjustments will be available without needing these add-on definitions.
>''Note: the changes contained in this tiddler are generally applicable for version 2.4.3 of TiddlyWiki.''
>Please view [[CoreTweaksArchive]] for tweaks that may be used with earlier versions of TiddlyWiki.
***/
//{{{
// calculate TW version number - used to determine which tweaks should be applied
var ver=version.major+version.minor/10+version.revision/100;
//}}}
/***
----

***/
// // open tickets:
// // {{block{
/***
!!!890 add conditional test to """<<tiddler>>""" macro
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/890 - OPEN
This tweak extends the {{{<<tiddler>>}}} macro syntax so you can include a javascript-based //test expression// to determine if the tiddler transclusion should be performed:
{{{
<<tiddler TiddlerName if:{{...}} with: param param etc.>>
}}}
If the test is ''true'', then the tiddler is transcluded as usual.  If the test is ''false'', then the transclusion is skipped and //no output is produced//.
***/
//{{{
config.macros.tiddler.if_handler = config.macros.tiddler.handler;
config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
	params = paramString.parseParams('name',null,true,false,true);
	if (!getParam(params,'if',true)) return;
	this.if_handler.apply(this,arguments);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!831 backslash-quoting for embedding newlines in 'line-mode' formats
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/831 - OPEN
This tweak pre-processes source content to convert 'double-backslash-newline' into {{{<br>}}} before wikify(), so that literal newlines can be embedded in line-mode wiki syntax (e.g., tables, bullets, etc.)
***/
//{{{
window.coreWikify = wikify;
window.wikify = function(source,output,highlightRegExp,tiddler)
{
	if (source) arguments[0]=source.replace(/\\\\\n/mg,'<br>');
	coreWikify.apply(this,arguments);
}
//}}}
// // }}}}}}// // {{block{
/***
!!!829 """<<tag>>""" macro - sortby parameter
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/829 - OPEN
This tweak adds an optional 'sortby' parameter to the """<<tag tagname label tip sortby>>""" macro, as well as the """<<allTags excludeTag sortby>>""" macro used to generate the sidebar contents 'tags' list.  Specify the field on which the contents of each tag popup is to be sorted, with a '+' or '-' prefix to indicate ascending/descending order, respectively.

Example: """<<tag systemConfig "plugins" "list plugins by date, most recent first" "-modified">>"""
Try it: <<tag systemConfig "plugins" "list plugins by date, most recent first" "-modified">>

Similarly, to change the sort order used by the popups from all tags shown in the sidebar contents, edit the [[TagTags]] shadow tiddler and enter: """<<allTags excludeLists -modified>>"""
***/
//{{{
// hijack tag handler() to add 'sortby' attribute to tag button
config.macros.tag.CoreTweaksSortTags_handler=config.macros.tag.handler;
config.macros.tag.handler = function(place,macroName,params)
{
	this.CoreTweaksSortTags_handler.apply(this,arguments);
	var btn=place.lastChild;
	if (params[3]) btn.setAttribute('sortby',params[3]);
}

// tweak <<allTags>> macro to add 'sortby' attribute to each tag button
var fn=config.macros.allTags.handler;
var lines=fn.toString().split('\n');
lines.splice(lines.length-2,0,['if(params[1]) btn.setAttribute("sortby",params[1]);']);
fn=lines.join('\n');
eval('config.macros.allTags.handler='+fn);

// tweak tag event handler to:
// * use tag filtering (only if '[' is present in tag value)
// * use optional 'sortby' attribute
// * save 'sortby' value in 'open all' command (for displaying tiddlers in sorted order)
var fn=onClickTag;
fn=fn.toString().replace(
	/store.getTaggedTiddlers\(tag\);/g,
	'(tag.indexOf("[")==-1?store.getTaggedTiddlers(tag):store.filterTiddlers(tag));'
	+'var sortby=this.getAttribute("sortby");'
	+'if(sortby&&sortby.length) store.sortTiddlers(tagged,sortby);'
);
fn=fn.toString().replace(
	/openAll.setAttribute\("tag",\s*tag\);/g,
	'openAll.setAttribute("tag",tag); openAll.setAttribute("sortby",sortby);'
);
eval(fn);

// tweak 'open all' event handler to use 'sortby' attribute
var fn=onClickTagOpenAll;
fn=fn.toString().replace(
	/story.displayTiddlers\(this,\s*tiddlers\);/g,
	'var sortby=this.getAttribute("sortby");'
	+'if(sortby&&sortby.length) store.sortTiddlers(tiddlers,sortby);'
	+'story.displayTiddlers(this,tiddlers);'
);
eval(fn);
//}}}
// // }}}}}}// // {{block{
/***
!!!824 ~WindowTitle - alternative to combined ~SiteTitle/~SiteSubtitle in window titlebar
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/824 - OPEN
This tweak allows definition of an optional [[WindowTitle]] tiddler that, when present, provides alternative text for display in the browser window's titlebar, instead of using the combined text content from [[SiteTitle]] and [[SiteSubtitle]] (which will still be displayed as usual in the TiddlyWiki document header area).

Note: this ticket replaces http://trac.tiddlywiki.org/ticket/401 (closed), which proposed using a custom [[PageTitle]] tiddler for this purpose.  ''If you were using the previous '401 ~PageTitle' tweak, you will need to rename [[PageTitle]] to [[WindowTitle]] to continue to use your custom window title text''
***/
//{{{
config.shadowTiddlers.WindowTitle='<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>';
window.getPageTitle=function() { return wikifyPlain('WindowTitle'); }
store.addNotification('WindowTitle',refreshPageTitle); // so title stays in sync with tiddler changes
//}}}
// // }}}}}}// // {{block{
/***
!!!784 allow tiddler sections in TiddlyLinks to be used as anchor points for intra-tiddler scrolling.  
>http://trac.tiddlywiki.org/ticket/784 - OPEN - Please see separate [[SectionLinksPlugin]]
!!!683 FireFox3 Import bug: 'browse' button replacement
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/683 - OPEN
The web standard 'type=file' input control that has been used as a local path/file picker for TiddlyWiki no longer works as expected in FireFox3, which has, for security reasons, limited javascript access to this control so that *no* local filesystem path information can be revealed, even when it is intentional and necessary, as it is with TiddlyWiki.  This tweak provides alternative HTML source that patches the backstage import panel.  It replaces the 'type=file' input control with a text+button combination of controls that invokes a system-native secure 'file-chooser' dialog box to provide TiddlyWiki with access to a complete path+filename so that TW functions properly locate user-selected local files.
>Note: ''This tweak also requires http://trac.tiddlywiki.org/ticket/604 - cross-platform askForFilename()''
***/
//{{{
if (window.Components) {
	var fixhtml='<input name="txtBrowse" style="width:30em"><input type="button" value="..."'
		+' onClick="window.browseForFilename(this.previousSibling,true)">';
	var cmi=config.macros.importTiddlers;
	cmi.step1Html=cmi.step1Html.replace(/<input type='file' size=50 name='txtBrowse'>/,fixhtml);
}

merge(config.messages,{selectFile:'Please enter or select a file'}); // ready for I18N translation

window.browseForFilename=function(target,mustExist) { // note: both params are optional
	var msg=config.messages.selectFile;
	if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
	// get local path for current document
	var path=getLocalPath(document.location.href);
	var p=path.lastIndexOf('/'); if (p==-1) p=path.lastIndexOf('\\'); // Unix or Windows
	if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
	var file=''
	var result=window.askForFilename(msg,path,file,mustExist); // requires #604
	if (target && result.length) // set target field and trigger handling
		{ target.value=result; target.onchange(); }
	return result; 
}
//}}}
// // }}}}}}// // {{block{
/***
!!!604 cross-platform askForFilename()
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/604 - OPEN
invokes a system-native secure 'file-chooser' dialog box to provide TiddlyWiki with access to a complete path+filename so that TW functions properly locate user-selected local files.
***/
//{{{
window.askForFilename=function(msg,path,file,mustExist) {
	var r = window.mozAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = window.ieAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = window.javaAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = prompt(msg,path+file);
	return r||'';
}

window.mozAskForFilename=function(msg,path,file,mustExist) {
	if(!window.Components) return false;
	try {
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
		var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
		picker.init(window, msg, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
		var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
		thispath.initWithPath(path);
		picker.displayDirectory=thispath;
		picker.defaultExtension='html';
		picker.defaultString=file;
		picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
		if (picker.show()!=nsIFilePicker.returnCancel)
			var result=picker.file.persistentDescriptor;
	}
	catch(ex) { displayMessage(ex.toString()); }
	return result;
}

window.ieAskForFilename=function(msg,path,file,mustExist) {
	if(!config.browser.isIE) return false;
	try {
		var s = new ActiveXObject('UserAccounts.CommonDialog');
		s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
		s.FilterIndex=3; // default to HTML files;
		s.InitialDir=path;
		s.FileName=file;
		return s.showOpen()?s.FileName:'';
	}
	catch(ex) { displayMessage(ex.toString()); }
	return result;
}

window.javaAskForFilename=function(msg,path,file,mustExist) {
	if(!document.applets['TiddlySaver']) return false;
	// TBD: implement java-based askFile(...) function
	try { return document.applets['TiddlySaver'].askFile(msg,path,file,mustExist); } 
	catch(ex) { displayMessage(ex.toString()); }
}
//}}}
// // }}}}}}// // {{block{
/***
!!!657 wrap tabs onto multiple lines
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/657 - OPEN
This tweak inserts an extra space element following each tab, allowing them to wrap onto multiple lines if needed.
***/
//{{{
config.macros.tabs.handler = function(place,macroName,params)
{
	var cookie = params[0];
	var numTabs = (params.length-1)/3;
	var wrapper = createTiddlyElement(null,'div',null,'tabsetWrapper ' + cookie);
	var tabset = createTiddlyElement(wrapper,'div',null,'tabset');
	tabset.setAttribute('cookie',cookie);
	var validTab = false;
	for(var t=0; t<numTabs; t++) {
		var label = params[t*3+1];
		var prompt = params[t*3+2];
		var content = params[t*3+3];
		var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,'tab tabUnselected');
		createTiddlyElement(tab,'span',null,null,' ',{style:'font-size:0pt;line-height:0px'}); // ELS
		tab.setAttribute('tab',label);
		tab.setAttribute('content',content);
		tab.title = prompt;
		if(config.options[cookie] == label)
			validTab = true;
	}
	if(!validTab)
		config.options[cookie] = params[1];
	place.appendChild(wrapper);
	this.switchTab(tabset,config.options[cookie]);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!628 hide 'no such macro' errors
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/628 - OPEN
When invoking a macro that is not defined, this tweak prevents the display of the 'error in macro... no such macro' message.  This is useful when rendering tiddler content or templates that reference macros that are defined by //optional// plugins that have not been installed in the current document.

<<option chkHideMissingMacros>> hide 'no such macro' error messages
***/
//{{{
if (config.options.chkHideMissingMacros===undefined)
	config.options.chkHideMissingMacros=false;

window.coreTweaks_missingMacro_invokeMacro = window.invokeMacro;
window.invokeMacro = function(place,macro,params,wikifier,tiddler) {
	if (!config.macros[macro] || !config.macros[macro].handler)
		if (config.options.chkHideMissingMacros) return;
	window.coreTweaks_missingMacro_invokeMacro.apply(this,arguments);
}
//}}}
// // }}}}}}// // {{block{
/***
!!!608/609/610 toolbars - toggles, separators and transclusion
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/608 - OPEN (more/less toggle)
http://trac.tiddlywiki.org/ticket/609 - OPEN (separators)
http://trac.tiddlywiki.org/ticket/610 - OPEN (wikify tiddler/slice/section content)

This combination tweak extends the """<<toolbar>>""" macro to add use of '<' to insert a 'less' menu command (the opposite of '>' == 'more'), as well as use of '*' to insert linebreaks and "!" to insert a vertical line separator between toolbar items.  In addition, this tweak add the ability to use references to tiddlernames, slices, or sections and render their content inline within the toolbar, allowing easy creation of new toolbar commands using TW content (such as macros, links, inline scripts, etc.)

To produce a one-line style, with "less" at the end, use
| ViewToolbar| foo bar baz > yabba dabba doo < |
resulting in:
{{{
foo bar baz more
   and
foo bar baz yabba dabba doo less
}}}
or to use the CoreTweaks? two-line style:
| ViewToolbar| foo bar baz > < * yabba dabba doo |
which would produce:
{{{
foo bar baz more
   and
foo bar baz less
yabba dabba doo
}}}
''see [[ToolbarCommands]] for examples of how these features can be used''
***/
//{{{
merge(config.macros.toolbar,{
	moreLabel: 'more\u25BC',
	morePrompt: 'Show additional commands',
	lessLabel: '\u25C4less',
	lessPrompt: 'Hide additional commands',
	separator: '|'
});
config.macros.toolbar.onClickMore = function(ev) {
	var e = this.nextSibling;
	e.style.display = 'inline'; // show menu
	this.style.display = 'none'; // hide button
	return false;
};
config.macros.toolbar.onClickLess = function(ev) {
	var e = this.parentNode;
	var m = e.previousSibling;
	e.style.display = 'none'; // hide menu
	m.style.display = 'inline'; // show button
	return false;
};
config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	for(var t=0; t<params.length; t++) {
		var c = params[t];
		switch(c) {
			case '!':  // ELS - SEPARATOR (added)
				createTiddlyText(place,this.separator);
				break;
			case '*':  // ELS - LINEBREAK (added)
				createTiddlyElement(place,'BR');
				break;
			case '<': // ELS - LESS COMMAND (added)
				var btn = createTiddlyButton(place,
					this.lessLabel,this.lessPrompt,config.macros.toolbar.onClickLess,'moreCommand');
				break;
			case '>':
				var btn = createTiddlyButton(place,
					this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore,'moreCommand');
				var e = createTiddlyElement(place,'span',null,'moreCommand');
				e.style.display = 'none';
				place = e;
				break;
			default:
				var theClass = '';
				switch(c.substr(0,1)) {
					case '+':
						theClass = 'defaultCommand';
						c = c.substr(1);
						break;
					case '-':
						theClass = 'cancelCommand';
						c = c.substr(1);
						break;
				}
				if(c in config.commands)

					this.createCommand(place,c,tiddler,theClass);
				else { // ELS - WIKIFY TIDDLER/SLICE/SECTION (added)
					if (c.substr(0,1)=='~') c=c.substr(1); // ignore leading ~
					var txt=store.getTiddlerText(c);
					if (txt) {
						// trim any leading/trailing newlines
						txt=txt.replace(/^\n*/,'').replace(/\n*$/,'');
						// trim PRE format wrapper if any
						txt=txt.replace(/^\{\{\{\n/,'').replace(/\n\}\}\}$/,'');
						// render content into toolbar
						wikify(txt,createTiddlyElement(place,'span'),null,tiddler);
					}
				} // ELS - end WIKIFY CONTENT
				break;
		}
	}
};
//}}}
// // }}}}}}// // {{block{
/***
!!!529 IE fixup - case-sensitive element lookup of tiddler elements
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/529 - OPEN
This tweak hijacks the standard browser function, document.getElementById(), to work-around the case-INsensitivity error in Internet Explorer (all versions up to and including IE7) //''Note: This tweak is only applied when using IE, and only for lookups of rendered tiddler elements within the containing 'tiddlerDisplay' element.''//
***/
//{{{
if (config.browser.isIE) {
document.coreTweaks_coreGetElementById=document.getElementById;
document.getElementById=function(id) {
	var e=document.coreTweaks_coreGetElementById(id);
	if (!e || !e.parentNode || e.parentNode.id!='tiddlerDisplay') return e;
	for (var i=0; i<e.parentNode.childNodes.length; i++)
		if (id==e.parentNode.childNodes[i].id) return e.parentNode.childNodes[i];
	return null;
};
}
//}}}
// // }}}}}}// // {{block{
/***
!!!471 'creator' field for new tiddlers
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/471 - OPEN
This tweak HIJACKS the core's saveTiddler() function to automatically add a 'creator' field to a tiddler when it is FIRST created. You can use """<<view creator>>""" (or """<<view creator wikified>>""" if you prefer) to show this value embedded directly within the tiddler content, or {{{<span macro="view creator"></span>}}} in the ViewTemplate and/or EditTemplate to display the creator value in each tiddler.  
***/
//{{{
// hijack saveTiddler()
TiddlyWiki.prototype.CoreTweaks_creatorSaveTiddler=TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler=function(title,newTitle,newBody,modifier,modified,tags,fields)
{
	var existing=store.tiddlerExists(title);
	var tiddler=this.CoreTweaks_creatorSaveTiddler.apply(this,arguments);
	if (!existing) store.setValue(title,'creator',config.options.txtUserName);
	return tiddler;
}
//}}}
// // }}}}}}
// // closed: won't fix //(leave as core tweaks)//
// // {{block{
/***
!!!637 TiddlyLink tooltip - custom formatting
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/637 - CLOSED: WON'T FIX
This tweak modifies the tooltip format that appears when you mouseover a link to a tiddler.  It adds an option to control the date format, as well as displaying the size of the tiddler (in bytes)

Tiddler link tooltip format:
{{stretch{<<option txtTiddlerLinkTootip>>}}}
^^where: %0=title, %1=username, %2=modification date, %3=size in bytes, %4=description slice^^
Tiddler link tooltip date format:
{{stretch{<<option txtTiddlerLinkTooltipDate>>}}}
***/
//{{{
config.messages.tiddlerLinkTooltip='%0 - %1, %2 (%3 bytes) - %4';
config.messages.tiddlerLinkTooltipDate='DDD, MMM DDth YYYY 0hh12:0mm AM';

config.options.txtTiddlerLinkTootip=
	config.options.txtTiddlerLinkTootip||config.messages.tiddlerLinkTooltip;
config.options.txtTiddlerLinkTooltipDate=
	config.options.txtTiddlerLinkTooltipDate||config.messages.tiddlerLinkTooltipDate;

Tiddler.prototype.getSubtitle = function() {
	var modifier = this.modifier;
	if(!modifier) modifier = config.messages.subtitleUnknown;
	var modified = this.modified;
	if(modified) modified = modified.formatString(config.options.txtTiddlerLinkTooltipDate);
	else modified = config.messages.subtitleUnknown;
	var descr=store.getTiddlerSlice(this.title,'Description')||'';
	return config.options.txtTiddlerLinkTootip.format([this.title,modifier,modified,this.text.length,descr]);
};
//}}}
// // }}}}}}// // {{block{
/***
!!!607 add HREF link on permaview command
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/607 - CLOSED: WON'T FIX
This tweak automatically sets the HREF for the 'permaview' sidebar command link so you can use the 'right click' context menu for faster, easier bookmarking.  Note that this does ''not'' automatically set the permaview in the browser's current location URL... it just sets the HREF on the command link.  You still have to click the link to apply the permaview.
***/
//{{{
config.macros.permaview.handler = function(place)
{
	var btn=createTiddlyButton(place,this.label,this.prompt,this.onClick);
	addEvent(btn,'mouseover',this.setHREF);
	addEvent(btn,'focus',this.setHREF);
};
config.macros.permaview.setHREF = function(event){
	var links = [];
	story.forEachTiddler(function(title,element) {
		links.push(String.encodeTiddlyLink(title));
	});
	var newURL=document.location.href;
	var hashPos=newURL.indexOf('#');
	if (hashPos!=-1) newURL=newURL.substr(0,hashPos);
	this.href=newURL+'#'+encodeURIComponent(links.join(' '));
}
//}}}
// // }}}}}}// // {{block{
/***
!!!458 add permalink-like HREFs on internal TiddlyLinks
***/
// // {{groupbox small{
/***
http://trac.tiddlywiki.org/ticket/458 - CLOSED: WON'T FIX
This tweak assigns a permalink-like HREF to internal Tiddler links (which normally do not have any HREF defined).  This permits the link's context menu (right-click) to include 'open link in another window/tab' command.  Based on a request from Dustin Spicuzza.
***/
//{{{
window.coreTweaks_createTiddlyLink=window.createTiddlyLink;
window.createTiddlyLink=function(place,title,includeText,theClass,isStatic,linkedFromTiddler,noToggle)
{
	// create the core button, then add the HREF (to internal links only)
	var link=window.coreTweaks_createTiddlyLink.apply(this,arguments);
	if (!isStatic)
		link.href=document.location.href.split('#')[0]+'#'+encodeURIComponent(String.encodeTiddlyLink(title));
	return link;
}
//}}}
// // }}}}}}
// // <<foldHeadings>>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>

<div class='tagged' macro='tags'></div>
<div class='sectionTOC'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagging' macro='tagging'></div>
<div class='tagClear'></div>
<div class='subtitle'> - <span macro='view editsummary'></span> - <span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view creator'></span> <span macro='view created date'></span>)</div>
<!--}}}-->
<!--{{{-->
<style type="text/css">
#contentWrapper {display:none;}
body { background-color:#000; }
</style>

<div id="SplashScreen" style="border: 8px solid red; display: block; text-align: center; width: 640px; margin: 100px auto; padding: 50px; color:red; font-size: 18px; font-family:monospace; background-color:black; white-space:nowrap;">
<b>Software requirement: Javascript. Please wait then continue<br>
<img src="/uploads/workspace/default/kitt.gif" alt="" width=320 height=16><br>
NemWiki Guru Meditation <blink>...</blink> #00000000.0000002A</b></div>

<!--}}}-->
<<tabs txtTagsTab "All" "All tags" TabTagsAll "Main" "Main navigation tags" TabTagsExcludeLists "Cloud" "All tags as a cloud" TabTagsCloudAll>>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]] wikibar'></div>
<div class='wikibar' macro='wikibar'></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='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<div class='editor' macro='edit tags'></div>
<br>
<div class='editor' macro='edit editsummary'>Edit summary</div>
<br>
<div class='toolbar2' macro='toolbar [[ToolbarCommands::EditToolbar]]'>
<span class='toolbar2' macro='toolbar previewTiddler'></span></div>
<br>
<div macro='preview hide fieldname height'></div>
<!--}}}-->
/***
|Name|PreviewPlugin|
|Source|http://www.TiddlyTools.com/#PreviewPlugin|
|Documentation|http://www.TiddlyTools.com/#PreviewPluginInfo|
|Version|1.8.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|add key-by-key wikified preview to any textarea input field|
Provides key-by-key ''LIVE PREVIEW'' of //formatted// tiddler content as you type input into a textarea (multi-line) edit field.
!!!!!Documentation
>see [[PreviewPluginInfo]]
!!!!!Configuration
<<<
Automatically freeze preview updates when a tiddler takes more than <<option txtPreviewAutoFreeze>> milliseconds to render.
<<<
!!!!!Revisions
<<<
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.11.18 [1.8.1] in config.commands.previewTiddler, changed alt command text to use character-based "psuedo-checkbox" instead of embedded html fragment
2007.09.27 [1.8.0] split TidIDE preview functionality into separate stand-alone plugin (see [[TidIDEPlugin]]).  
|please see [[TidIDEPluginInfo]] for additional revision details|
2006.04.15 [0.5.0] Initial ALPHA release. Converted from inline script.
<<<
!!!!!Code
***/
// // version info
//{{{
version.extensions.PreviewPlugin= {major: 1, minor: 8, revision: 1, date: new Date(2007,11,18)};
//}}}

// //  macro definition
//{{{
if (config.options.txtPreviewAutoFreeze==undefined)
	config.options.txtPreviewAutoFreeze=250; // limit (in milliseconds) for auto-freezing preview display

config.macros.preview = {
	renderMsg: "rendering preview...",
	timeoutMsg: " (> %0ms)",
	freezeMsg: " - preview is frozen.  Press [refresh] to re-display.",
	handler: function(place,macroName,params) {
		var hide=params[0]=="hide"; if (hide) params.shift();
		var field=params[0];
		var height=params[1]; if (!height) height=15;
		var here=this.findContainingForm(place);
		if (!here) here=story.findContainingTiddler(place);
		if (!here) here=place.parentNode;
		if (!here) here=place;
		var elems=here.getElementsByTagName("textarea");
		if (field) for (var e=0; e<elems.length; e++)  // find matching textarea (by fieldname)
			if (elems[e].getAttribute("edit")==field) var ta=elems[e];
		else
			if (elems.length) var ta=elems[elems.length-1]; // default to last rendered text area
		if (!ta) {
			var elems=here.getElementsByTagName("input");
			if (field) for (var e=0; e<elems.length; e++)  // find matching input field (by fieldname)
				if (elems[e].getAttribute("edit")==field) var ta=elems[e];
			else
				if (elems.length) var ta=elems[elems.length-1]; // default to last rendered input field
		}
		if (!ta) return false; // no textarea or input field found... do nothing...
		var id=(new Date().getTime()).toString()+Math.random(); // unique instance ID
		ta.id=id+"_edit";
		ta.setAttribute("previewid",id+"_preview");
		ta.saved_onkeyup=ta.onkeyup;
		ta.onkeyup=function(ev) {
			if (this.saved_onkeyup) this.saved_onkeyup.apply(this,arguments);
			config.macros.preview.render(this.id,this.getAttribute("previewid"));
		}
		var html=this.html.replace(/%previd%/g,id+"_preview")
		html=html.replace(/%srcid%/g,id+"_edit");
		html=html.replace(/%hide%/g,hide?"none":"block");
		html=html.replace(/%limit%/g,config.options.txtPreviewAutoFreeze);
		html=html.replace(/%frozen%/g,hide?"checked":"");
		html=html.replace(/%height%/g,height);
		html=html.replace(/%halfheight%/g,height/2);
		createTiddlyElement(place,"span").innerHTML=html;
		this.render(id+"_edit",id+"_preview");
	},
	findContainingForm: function(e) {
		while (e && e.nodeName.toLowerCase()!="form") e=e.parentNode;
		return e;
	},
	render: function(srcid,previd,force) {
		var value=document.getElementById(srcid).value;
		var panel=document.getElementById(previd);
		var f=this.findContainingForm(panel);
		if (!f || (f.freeze.checked && !force)) return;
		var p=panel.firstChild; var d=f.domview; var h=f.htmlview; if (!p||!d||!h) return;
		p.innerHTML="";
		f.status.value=this.renderMsg;
		var start=new Date();
		wikify(value.replace(/\r/g,''),p);
		var end=new Date();
		this.renderDOM(previd);
		this.renderHTML(previd);
		f.status.value="elapsed: "+(end-start+1)+"ms";
		// automatically suspend preview updates for slow rendering tiddlers
		if (end-start+1>config.options.txtPreviewAutoFreeze) {
			f.freeze.checked=true;
			f.status.value+=this.timeoutMsg.format([config.options.txtPreviewAutoFreeze]);
		}
		if (f.freeze.checked) f.status.value+=this.freezeMsg;
	},
	renderDOM: function(id) {
		var panel=document.getElementById(id);
		var f=this.findContainingForm(panel); if (!f) return;
		var p=panel.firstChild; var d=f.domview; var h=f.htmlview; if (!p||!d||!h) return;
		var height=p.getAttribute("height");
		p.style.height=((f.dom.checked||f.html.checked)?height/2:height)+"em";
		if (f.dom.checked) d.value=this.getNodeTree(p,"|  ");
		if (!d.style||!h.style) return;
		d.style.height=height/2+"em";
		d.style.display=f.dom.checked?"inline":"none";
		d.style.width=f.html.checked?"49.5%":"100%";
		h.style.width=f.dom.checked?"49.5%":"100%";
	},
	renderHTML: function(id) {
		var panel=document.getElementById(id);
		var f=this.findContainingForm(panel); if (!f) return;
		var p=panel.firstChild; var d=f.domview; var h=f.htmlview; if (!p||!d||!h) return;
		var height=p.getAttribute("height");
		p.style.height=((f.dom.checked||f.html.checked)?height/2:height)+"em";
		if (f.html.checked) h.value=this.formatHTML(p.innerHTML);
		if (!h.style||!d.style) return;
		h.style.height=height/2+"em";
		h.style.display=f.html.checked?"inline":"none";
		h.style.width=f.dom.checked?"49.5%":"100%";
		d.style.width=f.html.checked?"49.5%":"100%";
	},
	formatHTML: function(txt) {
		if (config.browser.isIE) return txt; // BYPASS - 4/24/2006 due to IE hang problem.  Will fix later...
		var out="";
		var indent="";
		var level=0;
		for (var i=0;i<txt.length;i++) {
			var c=txt.substr(i,1);
			if (c=="<") {
					if (txt.substr(i+1,1)=="/")  indent=indent.substr(0,indent.length-2);
				out+="\n"+indent;
				if (txt.substr(i+1,1)!="/" && txt.substr(i+1,3)!="br>" && txt.substr(i+1,2)!="p>" && txt.substr(i+1,3)!="hr>")  indent+="  ";
			}
			out+=c;
				if (c=="\n")
				out+=indent;
			if (c==">" && txt.substr(i+1,1)!="<")
				out+="\n"+indent;
		}
		return out;
	},
	getNodeTree: function(theNode,theIndent,showPath,inline,thePrefix,thePath)
	{
		if (!theNode) return "";
		if (!thePrefix) thePrefix="";
		if (!thePath) thePath="";
		var mquote='"'+(inline?"{{{":"");
		var endmquote=(inline?"}}}":"")+'"';
		// generate output for this node
		var out = thePrefix;
		if (showPath && thePath.length)
				out += (inline?"//":"")+thePath.substr(1)+":"+(inline?"//":"")+"\r\n"+thePrefix;
		if (theNode.className=="DOMViewer")
			return out+'[DOMViewer]\r\n'; // avoid self-referential recursion
		out += (inline?"''":"")+theNode.nodeName.toUpperCase()+(inline?"''":"");
		if (theNode.nodeName=="#text")
			out += ' '+mquote+theNode.nodeValue.replace(/\n/g,'\\n')+endmquote;
		if (theNode.className)
			out += ' class='+mquote+theNode.className+endmquote;
		if (theNode.type)
			out += ' type='+mquote+theNode.type+endmquote;
		if (theNode.id)
			out += ' id='+mquote+theNode.id+endmquote;
		if (theNode.name)
			out += " "+theNode.name+(theNode.value?"="+mquote+theNode.value+endmquote:"");
		if (theNode.href)
			out += ' href='+mquote+theNode.href+endmquote;
		if (theNode.src)
			out += ' src='+mquote+theNode.src+endmquote;
		if (theNode.attributes && theNode.getAttribute("tiddlyLink")!=undefined)
			out += ' tiddler='+mquote+theNode.getAttribute("tiddlyLink")+endmquote;
		out += "\r\n";
		// recursively generate output for child nodes
		thePath=thePath+"."+theNode.nodeName.toLowerCase();
		thePrefix=theIndent+thePrefix;
		for (var i=0;i<theNode.childNodes.length;i++)
		{
			var thisChild=theNode.childNodes.item(i);
			var theNum=(inline?"~~":"(")+(i+1)+(inline?"~~":")");
			out += this.getNodeTree(thisChild,theIndent,showPath,inline,thePrefix,thePath+theNum);
		}
		return out;
	},
	html: " <form style='width:100%'><span id='%previd%' editID='%srcid%' style='display:%hide%'><div class='viewer' \
			height='%height%' style='margin:0;margin-top:.5em;height:%height%em;overflow:auto;white-space:normal'> \
			&nbsp; \
			</div> \
		<!-- DOM and HTML viewers --> \
		<textarea name=domview cols=60 rows=12 wrap=off \
			onfocus='this.select()' style='display:none;width:100%;height:%halfheight%em;'></textarea><!-- \
		--><textarea name=htmlview cols=60 rows=12 wrap=off \
			onfocus='this.select()' style='display:none;width:100%;height:%halfheight%em;'></textarea> \
		<!-- status line, preview option checkboxes, run/refresh buttons --> \
		<table width='100%' style='border:0;padding:0;margin:0'><tr style='border:0;padding:0;margin:0'> \
		<td style='border:0;padding:0;margin:0'><!-- \
			--><input type=text name=status style='padding:0;width:100%;' \
				title='ELAPSED: time (in milliseconds) used to render tiddler content in preview display'><!-- \
		--></td><td style='width:1%;border:0;padding:0;margin:0;'><!-- \
			--><input type=text name=limit size='6' maxlength='6' style='padding:0;width:5em;text-align:center' \
				value='%limit%ms' title='TIME LIMIT: maximum rendering time (in milliseconds) before auto-freezing preview' \
				onfocus='this.select()' \
				onchange='var val=this.value.replace(/[^0-9]/g,\"\"); if (!val.length) val=this.defaultValue; \
					this.value=val+\"ms\"; config.options.txtPreviewAutoFreeze=val; saveOptionCookie(\"txtPreviewAutoFreeze\"); \
					this.form.freeze.checked=false; config.macros.preview.render(\"%srcid%\",\"%previd%\",true);'><!-- \
		--></td><td style='width:1%;border:0;padding:0;margin:0;'><!-- \
			--><input type=text name=height size='4' maxlength='4' style='padding:0;width:4em;text-align:center' \
				value='%height%em' title='HEIGHT: size (in \"ems\") of preview area, including controls' \
				onfocus='this.select()' \
				onchange='var val=this.value.replace(/[^0-9]/g,\"\");  if (!val.length) val=this.defaultValue; \
					this.value=val+\"em\"; document.getElementById(\"%previd%\").firstChild.setAttribute(\"height\",val); \
					config.macros.preview.render(\"%srcid%\",\"%previd%\",true)'><!-- \
		--></td><td style='width:1%;border:0;padding:0;margin:0;text-align:right;white-space:nowrap'> \
			<input type=checkbox name=dom style='display:inline;width:auto;margin:1px;' \
				title='show Document Object Model (DOM) information' \
				onclick='config.macros.preview.renderDOM(\"%previd%\");'>DOM \
			<input type=checkbox name=html style='display:inline;width:auto;margin:1px;' \
				title='show rendered HTML' \
				onclick='config.macros.preview.renderHTML(\"%previd%\");'>HTML \
			<input type=checkbox name=freeze style='display:inline;width:auto;margin:1px;' %frozen% \
				title='do not update preview display as changes are made' \
				onclick='var p=document.getElementById(\"%previd%\");  \
					if (this.checked) this.form.status.value+=config.macros.preview.freezeMsg; \
					else config.macros.preview.render(\"%srcid%\",\"%previd%\",true);'>freeze \
			<input type=button style='display:inline;width:auto;' value='refresh' \
				title='update preview display' \
				onclick='config.macros.preview.render(\"%srcid%\",\"%previd%\",true)'> \
		</td></tr></table> \
		</span></form>"
}
//}}}

// // toolbar definition
//{{{
config.commands.previewTiddler = {
	text: 'preview',
	tooltip: 'show key-by-key preview',
	text_alt: '\u221Apreview',
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var elems=here.getElementsByTagName("span");
		for (var e=0; e<elems.length; e++) {
			if (elems[e].getAttribute("editid")) {
				var show=elems[e].style.display=="none";
				src.innerHTML=show?this.text_alt:this.text;
				elems[e].style.display=show?"block":"none";
				config.macros.preview.findContainingForm(elems[e]).freeze.checked=!show;
				if (show) config.macros.preview.render(elems[e].getAttribute("editid"),elems[e].id);
			}
		}
		return false;
	}
};
//}}}
/***
|Name|PreviewPluginInfo|
|Source|http://www.TiddlyTools.com/#PreviewPlugin|
|Documentation|http://www.TiddlyTools.com/#PreviewPluginInfo|
|Version|1.8.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for PreviewPlugin|
Provides key-by-key ''LIVE PREVIEW'' of //formatted// tiddler content as you type input into a textarea (multi-line) edit field.
!!!!!Usage
<<<
Syntax: (in tiddler content)
{{{
<<preview hide fieldname height>>
}}}
//OR// (in [[EditTemplate]])
{{{
<span macro='preview hide fieldname height'></span>
}}}
where:
* 'hide' (optional)<br>is a keyword that causes the preview display to be initially hidden when created.  This is typically used in an [[EditTemplate]] definition, in conjunction with the 'previewTiddler' toolbar syntax (see below).
* fieldname (optional)<br>specifies the name of the tiddler field that is being previewed.  It corresponds to the fieldname specified in the {{{<span class='editor' macro='edit fieldname height'></span>}}} syntax used to define the textarea edit field, and is used to locate and access the source content that is to be previewed.  When omitted, the previewer will automatically associate itself with the last textarea control that precedes it in the rendered tiddler editor display.
* height (optional)<br>defines the total height of the previewer display (including the status line and controls), using CSS "em" (line height) measurements.  The default height value is "15em" (i.e., approximately 15 lines of standard-sized text)

In addition to the preview macro itself, you can place the following in your [[EditTemplate]] to add a tiddler toolbar command that enables you to toggle the preview display once it has been created:
{{{
<span class='toolbar' macro='toolbar previewTiddler'></span>
}}}
when clicked, this command will show/hide ALL preview controls that are displayed in the current tiddler.  Note that, when desired, you can also embed this toolbar command directly into a tiddler by entering the "{{{<<toolbar previewTiddler>>}}}" syntax in the tiddler source.
<<<
!!!!!Examples
<<<
in [[EditTemplate]]:
{{{
<div class='editor' macro='edit foobar 5'></div>
<div class='editor' macro='preview hide foobar 10'></div>
}}}
OR, embedded in tiddler content:
{{{
<<edit foobar 5>><<preview foobar 10>>
}}}
{{smallform{
<<edit foobar 5>><<preview foobar 10>>}}}
By default, the preview display is automatically rendered each time a key is typed into the tiddler content edit field.  As soon as changes are entered, they will be instantly visible within the preview display.  Unfortunately, the partial tiddler source definitions that occur //during// editing may somtimes cause rendering problems, and some exceptionally complex tiddlers make take an unusually long amount of time to completely render their content.   In such cases, key-by-key display updates are undesirable or impractical.

You can select the ''freeze'' checkbox to suspend automatic key-by-key preview display updates.  The preview display will not be re-rendered again until you press the ''refresh'' button or clear the 'freeze' checkbox.  The preview display will also automatically freeze whenever the //rendering time// exceeds a pre-determined time limit (see configuration section), specified in milliseconds.  Note: the ''actual elapsed time'' used to process and render any given content is reported in the preview "status bar" whenever that content is previewed.

In addition to a 'wikified' preview, the previewer display can show a ''DOM viewer'' and/or an ''HTML viewer'' that are also updated with each keystroke.  These text-based displays can be helpful while attempting to correct or enhance the formatting of tiddler content, especially when complex combinations of wiki-syntax produce unexpected or undesired results.
<<<
System Tag
System Tag
<<allTags excludeLists>>
System tag
System tag
<<timeline>>
/%
|Name|BreadcrumbsCommand|
|Source|http://www.TiddlyTools.com/#BreadcrumbsCommand|
|Version|1.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|BreadcrumbsPlugin|
|Overrides||
|Description|"crumbs" command displays current breadcrumbs list in a popup|

%/<html><hide linebreaks><a href="javascript:;" class="TiddlyLink" title="tiddlers viewed during this session"
	onclick="var p=Popup.create(this); if (!p) return;
		var d=createTiddlyElement(p,'div');
		d.style.whiteSpace='normal'; d.style.width='auto'; d.style.padding='2px';
	wikify('\<\<breadcrumbs [[\<html\>\<hr\>\</html\>]] [[<br>]]\>\>',d);
		Popup.show(); event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation();
		return(false);"
>crumbs</a></html>
/***
|Name|BreadcrumbsPlugin|
|Author|Eric Shulman|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|Documentation|http://www.TiddlyTools.com/#BreadcrumbsPluginInfo|
|Version|2.1.0|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler,TiddlyWiki.prototype.deleteTiddler|
|Options|##Configuration|
|Description|list/jump to tiddlers viewed during this session plus "back" button/macro|
This plugin provides a list of links to all tiddlers opened during the session, creating a "trail of breadcrumbs" from one tiddler to the next, allowing you to quickly navigate to any previously viewed tiddler, or select 'home' to reset the display to the initial set of tiddlers that were open at the start of the session (i.e., when the document was loaded into the browser).
!!!!!Documentation
<<<
see [[BreadcrumbsPluginInfo]]
<<<
!!!!!Configuration
<<<
<<option chkCreateDefaultBreadcrumbs>> automatically create breadcrumbs display (if needed)
<<option chkShowBreadcrumbs>> show/hide breadcrumbs display
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
<<option chkBreadcrumbsHideHomeLink>> omit 'Home' link from breadcrumbs display
<<option chkBreadcrumbsSave>> prompt to save breadcrumbs when 'Home' link is pressed
<<option chkShowStartupBreadcrumbs>> show breadcrumbs for 'startup' tiddlers
<<option chkBreadcrumbsReverse>> show breadcrumbs in reverse order (most recent first)
<<option chkBreadcrumbsLimit>> limit breadcrumbs display to {{twochar{<<option txtBreadcrumbsLimit>>}}} items
<<option chkBreadcrumbsLimitOpenTiddlers>> limit open tiddlers to {{twochar{<<option txtBreadcrumbsLimitOpenTiddlers>>}}} items

<<<
!!!!!Revisions
<<<
2009.03.22 [2.1.0] added 'save breadcrumbs to tiddler' feature
| Please see [[BreadcrumbsPluginInfo]] for previous revision details |
2006.02.01 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.BreadcrumbsPlugin= {major: 2, minor: 1, revision: 0, date: new Date("March 2, 2009")};

var co=config.options; // abbreviation

// show/hide display option (default is to SHOW breadcrumbs)
if (co.chkShowBreadcrumbs===undefined) co.chkShowBreadcrumbs=true;

// REORDER breadcrumbs when visiting previously viewed tiddler (default)
if (co.chkReorderBreadcrumbs===undefined) co.chkReorderBreadcrumbs=true;

// create default breadcrumbs display as needed (default is to CREATE)
if (co.chkCreateDefaultBreadcrumbs===undefined) co.chkCreateDefaultBreadcrumbs=true;

// show breadcrumbs for 'startup' tiddlers (default is FALSE = only show crumbs for tiddlers opened after startup)
if (co.chkShowStartupBreadcrumbs===undefined) co.chkShowStartupBreadcrumbs=false;

// show crumbs in reverse order (most recent first)
if (co.chkBreadcrumbsReverse===undefined) co.chkBreadcrumbsReverse=false;

// limit number of crumbs displayed
if (co.chkBreadcrumbsLimit===undefined) co.chkBreadcrumbsLimit=false;
if (co.txtBreadcrumbsLimit===undefined) co.txtBreadcrumbsLimit=5;

// limit number of open tiddlers
if (co.chkBreadcrumbsLimitOpenTiddlers===undefined) co.chkBreadcrumbsLimitOpenTiddlers=false;
if (co.txtBreadcrumbsLimitOpenTiddlers===undefined) co.txtBreadcrumbsLimitOpenTiddlers=3;

// omit home link from breadcrumbs display
if (co.chkBreadcrumbsHideHomeLink===undefined) co.chkBreadcrumbsHideHomeLink=false;

// prompt for 'save crumbs' when 'home' button is pressed
if (co.chkBreadcrumbsSave===undefined) co.chkBreadcrumbsSave=false;

config.macros.breadcrumbs =  {
	crumbs: [], // the list of current breadcrumbs
	askMsg: "Save current breadcrumbs before clearing?\nPress OK to save, or CANCEL to continue without saving.",
	saveMsg: 'Enter the name of a tiddler in which to save the current breadcrumbs',
	saveTitle: 'SavedBreadcrumbs',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var area=createTiddlyElement(place,"span",null,"breadCrumbs",null);
		area.setAttribute("homeSep",params[0]?params[0]:this.homeSeparator); // custom home separator
		area.setAttribute("crumbSep",params[1]?params[1]:this.crumbSeparator); // custom crumb separator
		this.render(area);
	},
	add: function (title) {
		var thisCrumb = title;
		var ind = this.crumbs.indexOf(thisCrumb);
		if(ind === -1)
			this.crumbs.push(thisCrumb);
		else if (config.options.chkReorderBreadcrumbs)
			this.crumbs.push(this.crumbs.splice(ind,1)[0]); // reorder crumbs
		else
			this.crumbs=this.crumbs.slice(0,ind+1); // trim crumbs
		if (config.options.chkBreadcrumbsLimitOpenTiddlers)
			this.limitOpenTiddlers();
		this.refresh();
		return false;
	},
	getAreas: function() {
		var crumbAreas=[];
		// find all DIVs with classname=="breadCrumbs"
		// Note: use try/catch to avoid "Bad NPObject as private data" fatal error  caused when
		// some versions of embedded QuickTime player element is accessed by hasClass() function.
		var all=document.getElementsByTagName("*");
		for (var i=0; i<all.length; i++)
			try{ if (hasClass(all[i],"breadCrumbs")) crumbAreas.push(all[i]); } catch(e) {;}
		// find single DIV w/fixed ID (backward compatibility)
		var byID=document.getElementById("breadCrumbs")
		if (byID && !hasClass(byID,"breadCrumbs")) crumbAreas.push(byID);
		if (!crumbAreas.length && config.options.chkCreateDefaultBreadcrumbs) {
			// no existing crumbs display areas... create one...
			var defaultArea = createTiddlyElement(null,"span",null,"breadCrumbs",null);
		 	defaultArea.style.display= "none";
			var targetArea= document.getElementById("tiddlerDisplay");
		 	targetArea.parentNode.insertBefore(defaultArea,targetArea);
			crumbAreas.push(defaultArea);
		}
		return crumbAreas;
	},
	refresh: function() {
		var crumbAreas=this.getAreas();
		for (var i=0; i<crumbAreas.length; i++) {
			crumbAreas[i].style.display = config.options.chkShowBreadcrumbs?"block":"none";
			removeChildren(crumbAreas[i]);
			this.render(crumbAreas[i]);
		}
	},
	render: function(here) {
		var co=config.options; var out=""
		var homeSep=here.getAttribute("homeSep"); if (!homeSep) homeSep=this.homeSeparator;
		var crumbSep=here.getAttribute("crumbSep"); if (!crumbSep) crumbSep=this.crumbSeparator;
		if (!co.chkBreadcrumbsHideHomeLink) {
			createTiddlyButton(here,"Home",null,this.home,"tiddlyLink tiddlyLinkExisting");
			out+=homeSep;
		}
		for (c=0; c<this.crumbs.length; c++) // remove non-existing tiddlers from crumbs
			if (!store.tiddlerExists(this.crumbs[c]) && !store.isShadowTiddler(this.crumbs[c]))
				this.crumbs.splice(c,1);
		var count=this.crumbs.length;
		if (co.chkBreadcrumbsLimit && co.txtBreadcrumbsLimit<count) count=co.txtBreadcrumbsLimit;
		var list=[];
		for (c=this.crumbs.length-count; c<this.crumbs.length; c++) list.push('[['+this.crumbs[c]+']]');
		if (co.chkBreadcrumbsReverse) list.reverse();
		out+=list.join(crumbSep);
		wikify(out,here);
	},
	home: function() {
		var cmb=config.macros.breadcrumbs;
		if (config.options.chkBreadcrumbsSave && confirm(cmb.askMsg)) cmb.saveCrumbs();
		story.closeAllTiddlers(); restart();
		cmb.crumbs = []; var crumbAreas=cmb.getAreas();
		for (var i=0; i<crumbAreas.length; i++) crumbAreas[i].style.display = "none";
		return false;
	},
	saveCrumbs: function() {
		var tid=prompt(this.saveMsg,this.saveTitle); if (!tid||!tid.length) return; // cancelled by user
		var t=store.getTiddler(tid);
		if(t && !confirm(config.messages.overwriteWarning.format([tid]))) return;
		var who=config.options.txtUserName;
		var when=new Date();
		var text='[['+this.crumbs.join(']]\n[[')+']]';
		var tags=t?t.tags:[]; tags.pushUnique('story');
		var fields=t?t.fields:{};
		store.saveTiddler(tid,tid,text,who,when,tags,fields);
		story.displayTiddler(null,tid);
		story.refreshTiddler(tid,null,true);
		displayMessage(tid+' has been '+(t?'updated':'created'));
	},
	limitOpenTiddlers: function() {
		var limit=config.options.txtBreadcrumbsLimitOpenTiddlers; if (limit<1) limit=1;
		for (c=this.crumbs.length-1; c>=0; c--) {
			var tid=this.crumbs[c];
			var elem=document.getElementById(story.idPrefix+tid);
			if (elem) { // tiddler is displayed
				if (limit <=0) { // display limit has been reached
					if (elem.getAttribute("dirty")=="true") { // tiddler is being edited
						var msg="'"+tid+"' is currently being edited.\n\n";
						msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
						if (confirm(msg)) { story.saveTiddler(tid); story.closeTiddler(tid); }
					}
					else
						story.closeTiddler(this.crumbs[c]);
				}
				limit--;
			}
		}
	}
};
if (config.macros.breadcrumbs.homeSeparator==undefined) // note: not a cookie
	config.macros.breadcrumbs.homeSeparator=" | ";
if (config.macros.breadcrumbs.crumbSeparator==undefined)  // note: not a cookie
	config.macros.breadcrumbs.crumbSeparator=" > ";

config.commands.previousTiddler = {
	text: 'back',
	tooltip: 'view the previous tiddler',
	hideReadOnly: false,
	dateFormat: 'DDD, MMM DDth YYYY hh:0mm:0ss',
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var crumbs=config.macros.breadcrumbs.crumbs;
		if (crumbs.length>1) {
			var crumb=crumbs[crumbs.length-2];
			story.displayTiddler(here,crumb);
		}
		else
			config.macros.breadcrumbs.home();
		return false;
	}
};

config.macros.previousTiddler= {
	label: 'back',
	prompt: 'view the previous tiddler',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var label=params.shift(); if (!label) label=this.label;
		var prompt=params.shift(); if (!prompt) prompt=this.prompt;
		createTiddlyButton(place,label,prompt,function() {
			var crumbs=config.macros.breadcrumbs.crumbs;
			if (crumbs.length>1) {
				var crumb=crumbs[crumbs.length-2];
				story.displayTiddler(place,crumb);
			}
			else
				config.macros.breadcrumbs.home();
		});
	}
}

// hijack story.displayTiddler() so crumbs can be refreshed when a tiddler is displayed
if (Story.prototype.breadCrumbs_coreDisplayTiddler==undefined)
	Story.prototype.breadCrumbs_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	this.breadCrumbs_coreDisplayTiddler.apply(this,arguments);
	// if not displaying tiddler during document startup, then add it to the breadcrumbs
	// note: 'startingUp' flag is a global, set/reset by the core init() function
	if (!startingUp || config.options.chkShowStartupBreadcrumbs) config.macros.breadcrumbs.add(title);
}

// hijack store.removeTiddler() so crumbs can be refreshed when a tiddler is deleted
if (TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined)
	TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler= function(title)
{
	this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);
	config.macros.breadcrumbs.refresh();
}
//}}}
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Options|##Configuration|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 [1.0.0] Initial Release.  Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 6, date: new Date(2008,10,17)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
	config.options.chkSinglePageMode=eval(v);
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
		config.lastURL = window.location.hash;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined)
	config.options.chkSinglePageMode=false;
if (config.options.chkSinglePagePermalink==undefined)
	config.options.chkSinglePagePermalink=true;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
	config.options.chkSinglePageKeepFoldedTiddlers=false;
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
	config.options.chkSinglePageKeepEditedTiddlers=false;
if (config.options.chkTopOfPageMode==undefined)
	config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined)
	config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined)
	config.options.chkSinglePageAutoScroll=false;
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
	if (!config.options.chkSinglePageMode)
		{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
	if (config.lastURL == window.location.hash) return; // no change in hash
	var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
	if (tids.length==1) // permalink (single tiddler in URL)
		story.displayTiddler(null,tids[0]);
	else { // restore permaview or default view
		config.lastURL = window.location.hash;
		if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
		story.closeAllTiddlers();
		story.displayTiddlers(null,tids);
	}
}


if (Story.prototype.SPM_coreDisplayTiddler==undefined)
	Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already displayed
	var opt=config.options;
	var single=opt.chkSinglePageMode && !startingUp;
	var top=opt.chkTopOfPageMode && !startingUp;
	var bottom=opt.chkBottomOfPageMode && !startingUp;
	if (single) {
		story.forEachTiddler(function(tid,elem) {
			// skip current tiddler and, optionally, tiddlers that are folded.
			if (	tid==title
				|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
				return;
			// if a tiddler is being edited, ask before closing
			if (elem.getAttribute("dirty")=="true") {
				if (opt.chkSinglePageKeepEditedTiddlers) return;
				// if tiddler to be displayed is already shown, then leave active tiddler editor as is
				// (occurs when switching between view and edit modes)
				if (tiddlerElem) return;
				// otherwise, ask for permission
				var msg="'"+tid+"' is currently being edited.\n\n";
				msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
				if (!confirm(msg)) return; else story.saveTiddler(tid);
			}
			story.closeTiddler(tid);
		});
	}
	else if (top)
		arguments[0]=null;
	else if (bottom)
		arguments[0]="bottom";
	if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
	if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		if (!isTopTiddler && (single || top))
			tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
		else if (bottom)
			tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
		else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	} else
		this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=document.getElementById(story.idPrefix+title);
	if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
		// scroll to top of page or top of tiddler
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
		// if animating, defer scroll until after animation completes
		var delay=opt.chkAnimate?config.animDuration+10:0;
		setTimeout("window.scrollTo(0,"+yPos+")",delay); 
	}
}

if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
	Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
	// suspend single/top/bottom modes when showing multiple tiddlers
	var opt=config.options;
	var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
	var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
	var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
	this.SPM_coreDisplayTiddlers.apply(this,arguments);
	opt.chkBottomOfPageMode=saveBPM;
	opt.chkTopOfPageMode=saveTPM;
	opt.chkSinglePageMode=saveSPM;
}
//}}}
/***
|Name|BreadcrumbsPluginInfo|
|Author|Eric Shulman|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|Documentation|http://www.TiddlyTools.com/#BreadcrumbsPluginInfo|
|Version|2.1.0|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler,TiddlyWiki.prototype.removeTiddler|
|Description|Documentation for BreadcrumbsPlugin|
This plugin provides a list of links to all tiddlers opened during the session, creating a "trail of breadcrumbs" from one tiddler to the next, allowing you to quickly navigate to any previously viewed tiddler, or select 'home' to reset the display to the initial set of tiddlers that were open at the start of the session (i.e., when the document was loaded into the browser).
!!!!!Usage
<<<
syntax:
{{{
<<breadcrumbs homeSeparator crumbSeparator>>
}}}
By default, the breadcrumbs are displayed as a continuous, //horizontal// word-wrapped line of text, using default character sequences for ''homeSeparator'' (" | ") and ''crumbSeparator'' (" > ").  The //optional// ''homeSeparator'' and ''crumbSeparator'' macro parameters allow you to specify alternative separators.  For example, to display the breadcrumbs //vertically// (in a stack, rather than a row), set the separator values to use {{{[[<br>]]}}}... and, to display a horizontal line as the home separator, use {{{[[<html><hr></html>]]}}}.
<<<
!!!!!Examples:
<<<
{{{
<<breadcrumbs>>
}}}
<<breadcrumbs>>
{{{
<<breadcrumbs [[<html><hr></html>]] [[<br>]]>>
}}}
<<breadcrumbs [[<html><hr></html>]] [[<br>]]>>
<<<
!!!!!Customization
<<<
Using CSS and a few of the plugin configuration options (see below), you can make the breadcrumbs display resemble browser tabs by adding the following to your [[StyleSheet]]:
{{{
.breadCrumbs { border-bottom:1px solid; }
.breadCrumbs a {
	border: 1px solid; padding: 0px 1em;
	-moz-border-radius-topleft:.5em; -moz-border-radius-topright:.5em;
	-webkit-border-top-left-radius:.5em; -webkit-border-top-right-radius:.5em;
}
}}}
and this in [[ConfigTweaks]] (tagged with systemConfig, of course):
{{{
config.options.chkShowStartupBreadcrumbs=true;
config.options.chkBreadcrumbsLimitOpenTiddlers=true;
config.options.txtBreadcrumbsLimitOpenTiddlers=1;
config.macros.breadcrumbs.homeSeparator=" ";
config.macros.breadcrumbs.crumbSeparator=" ";
}}}
<<<
!!!!!Configuration
<<<
__''display placement:''__
<<option chkCreateDefaultBreadcrumbs>> automatically create breadcrumbs display (if needed)
{{{<<option chkCreateDefaultBreadcrumbs>>}}}
>By default, the plugin automatically creates the "breadCrumbs" display element at the top of the story column, just above the tiddlerDisplay area.  To manually control the display and placement of the breadcrumbs display, you can define a DIV with class="breadCrumbs" in a custom [[PageTemplate]] or embed the {{{<<breadcrumbs>>}}} macro in specific tiddler content.
>
>For example, to add the breadcrumbs below the mainMenu, change this:
{{{
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
}}}
>to:
{{{
<div id='mainMenu'>
	<div refresh='content' tiddler='MainMenu'></div>
	<div id='breadCrumbs' class='breadCrumbs'></div>
</div>
}}}
>You can also block automatic creation of the breadcrumbs display by setting
{{{
config.options.chkCreateDefaultBreadcrumbs=false;
}}}
>in a [[CookieJar]]/[[ConfigTweaks]] plugin tiddler.

__''other settings:''__
<<option chkShowBreadcrumbs>> show/hide breadcrumbs display
{{{<<option chkShowBreadcrumbs>>}}}
>This checkbox toggles the visibility of the breadcrumbs display.  However, the display is not updated until the next crumb is added (or a previous crumb is clicked on).  For immediate effect, the [[ToggleBreadcrumbs]] script uses [[InlineJavascriptPlugin]] to synchronize the checkbox setting and the breadcrumbs display.
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
{{{<<option chkReorderBreadcrumbs>>}}}
>When visiting a previously viewed tiddler, the title of the most-recently displayed tiddler is simply moved to the end of the list and individual breadcrumbs are not removed from the list unless the underlying tiddler is deleted.  When ''re-ordering'' is disabled, the breadcrumbs list is ''trimmed'' so that all crumbs following that tiddler are removed from the list.
<<option chkBreadcrumbsHideHomeLink>> omit 'Home' link from breadcrumbs display
{{{<<option chkBreadcrumbsHideHomeLink>>}}}
>Enabling this option suppresses the automatic display of the "Home" link (and home separator).  To manually add the home link elsewhere in your document, use the following HTML:
{{{
<html><a href="javascript:;" onclick="config.macros.breadcrumbs.home()">home</a></html>
}}}
<<option chkBreadcrumbsSave>> prompt to save breadcrumbs when 'Home' link is pressed
{{{<<option chkBreadcrumbsSave>>}}}
>Whenever you press the 'home' button, you can be prompted to save the current breadcrumbs in a tiddler as a space-separated list of tiddler links (default title="SavedBreadcrumbs").  
<<option chkShowStartupBreadcrumbs>> show breadcrumbs for 'startup' tiddlers
{{{<<option chkShowStartupBreadcrumbs>>}}}
>Breadcrumbs are usually only added for tiddlers that are opened after the document has been loaded, and not for tiddlers displayed during initial startup (e.g., [[DefaultTiddlers]]).  Enabling this option displays breadcrumbs for all viewed tiddlers, regardless of when they are opened.
<<option chkBreadcrumbsReverse>> show breadcrumbs in reverse order
{{{<<option chkBreadcrumbsReverse>>}}}
>As tiddlers are displayed, breadcrumbs are usually added to the //end// of the list.  Enabling this option displays breadcrumbs in reverse order, so that the most recently visited tiddlers are listed first.
<<option chkBreadcrumbsLimit>> limit breadcrumbs display to {{twochar{<<option txtBreadcrumbsLimit>>}}} items
{{{<<option chkBreadcrumbsLimit>>}}} and {{{<<option txtBreadcrumbsLimit>>}}}
>By default, breadcrumbs are displayed for all tiddlers that have been visited (unless the list is being 'trimmed' by disabling the chkReorderBreadcrumbs option above).  Enabling this option limits the display of the list to a maximum specified number of breadcrumbs.
<<option chkBreadcrumbsLimitOpenTiddlers>> limit open tiddlers to {{twochar{<<option txtBreadcrumbsLimitOpenTiddlers>>}}} items
{{{<<option chkBreadcrumbsLimitOpenTiddlers>>}}} and {{{<<option txtBreadcrumbsLimitOpenTiddlers>>}}}
>By default, tiddlers remain open (e.g., displayed in the story column) until you explicitly close them.  When this option is enabled, only the most recently opened tiddlers will remain open: ''any tiddlers in excess of the specified limit are automatically closed.''  //Note: for 'data safety', if a tiddler is being edited, you will be asked for permission to "save-and-close" that tiddler or leave it open (even if that would exceed the specified limit).//
<<<
!!!!!Revisions
<<<
2009.03.22 [2.1.0] added 'save breadcrumbs to tiddler' feature
2008.05.01 [2.0.0] added 'limit open tiddlers' feature (with safety check for tiddler in edit mode)
2008.04.06 [1.9.1] corrected 'limit' logic so that //last// N crumbs are shown instead of //first// N crumbs.  Also, added chkBreadcrumbsHideHomeLink
2008.04.04 [1.9.0] added chkBreadcrumbsReverse and chk/txtBreadcrumbsLimit
2008.03.29 [1.8.4] in displayTiddler(), get title from tiddler object (if needed).  Fixes errors caused when calling function passes a tiddler *object* instead of a tiddler *title*
2008.03.24 [1.8.3] include shadow tiddlers in breadcrumbs list.  Also changed settings so that "reordering" breadcrumbs is the default, instead of "trimming" the list
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.10.26 [1.8.2] documentation cleanup
2007.10.18 [1.8.1] in GetAreas(), use try/catch to avoid "Bad NPObject as private data" fatal error caused when embedded QuickTime player element is accessed by hasClass() function.
2007.10.02 [1.8.0] major documentation and code cleanup.  Moved config.breadCrumbs.* to config.macros.breadcrumbs.* to consolidate objects.  Also, fixed homeSeparator and crumbSeparator default handling.
2007.10.02 [1.7.0] added config.options.chkShowStartupBreadcrumbs option
2007.09.16 [1.6.1] in getAreas(), removed errant use of 'place' (was causing fatal error when creating default breadcrumbs display element).  Also, added chkCreateDefaultBreadcrumbs configuration setting to enable/disable automatic creation of a default breadcrumbs display.
2007.09.16 [1.6.0] re-wrote refresh() to enable multiple display instances, by finding elements with "breadCrumbs" classname.  Fallback to fixed ID (="breadCrumbs") is still used for backward-compatibility.  move rendering code from refresh() to separate render() function, and added definition for {{{<<breadCrumbs>>}}} macro to support embedding breadcrumbs displays in tiddler content.
2007.09.15 [1.5.9.1] updated documentation
2007.09.15 [1.5.9] defined homeSeparator (" | ") and crumbSeparator (" > ") as object properties so that they can be redefined as desired for different layouts (e.g., using 'newline' for the crumbSeparator will arrange crumbs in a column rather than a row.
2007.06.21 [1.5.8.1] in home(), return false to prevent IE from attempting to navigate away...
2007.05.26 [1.5.8] added support for {{{<<option chkReorderBreadcrumbs>>}}} to toggle trim vs. re-order behavior when visiting previously viewed tiddlers
2007.05.25 [1.5.7] added support for {{{<<option chkShowBreadcrumbs>>}}} to toggle //display// of breadcrumbs
2007.05.24 [1.5.6] in refresh(), remove non-existing tiddler titles from crumb list.  Also, hijack removeTiddler() so crumbs can be updated after tiddler is deleted.
2007.04.11 [1.5.5] added optional params to previousTiddler macro handler() to allow alternative label and tooltip text (instead of default "back")
2007.03.02 [1.5.4] in refresh(), for TW2.2, look for "storyDisplay" instead of "tiddlerDisplay" but keep fallback to "tiddlerDisplay" for TW2.1 or earlier
2007.02.24 [1.5.3] changed from hijack of onClickTiddlerLink to hijack of displayTiddler() so that ALL displayed tiddlers are recorded in the crumbs, including programmatically displayed tiddlers opened by macros, scripts, etc., (such as [[GotoPlugin]], among many others) in addition to those opened by clicks on links.
2007.02.24 [1.5.2.0] eliminated global space clutter by moving function and data declarations so they are contained inside config.breadCrumbs object.
2007.02.06 [1.5.1] added "previousTiddler" macro (for use in sidebar)
2007.02.05 [1.5.0] added "previousTiddler" toolbar command (aka, "back")
2006.08.04 [1.4.0.1] change spaces to tabs
2006.08.04 [1.4.0] modified from 1.4.0 distro: in refresh(), set {{{display:none/block}}} instead of {{{visibility:hidden/visible}}}.  In home(), check for valid crumbArea before setting style.
2006.08.02 [1.4.0] Fixed bug, the redefined onClickTiddlerLink_orig_breadCrumbs works incorrectly on IE
2006.07.20 [1.3.0] Runs compatibly with TW 2.1.0 (rev #403+)
2006.02.07 [1.2.0] change global array breadCrumbs to config.breadCrumbs by Eric's suggestion
2006.02.04 [1.1.0] JSLint checked
2006.02.01 [1.0.0] initial release
<<<
/***
|Name:|TrashPlugin|
|Version:|1.2.0|
|Source:|http://www.TiddlyTools.com/#TrashPlugin|
|Author:|Eric Shulman|
|OriginalSource:|http://ido-xp.tiddlyspot.com/#TrashPlugin|
|OriginalAuthor:|Ido Magal (idoXatXidomagalXdotXcom)|
|License:|[[BSD open source license]]|
|CoreVersion:|2.1.0|
|Description|add 'Trash' tag to tiddlers instead of deleting them|
!!!!!Documentation
<<<
When TrashPlugin is installed and you click on the 'delete' command in the tiddler toolbar, rather than directly removing the tiddler from the system, it will be tagged with the following tags:
{{{
Trash excludeLists excludeMissing excludeSearch systemConfigDisable
}}}
As a result, although the tiddler still exists within the document, it is ''hidden from view and will not be searched or invoked as a plugin.''
*{{block{
To view a list of all tiddlers tagged with {{{Trash}}}, simply open the [[Trash]] tiddler (aka, the "trash can").}}}
*{{block{
To reclaim a tiddler from the [[Trash]], click on a title in the trash can to open that tiddler.  Then, edit it to remove the Trash tag (as well as the other tags noted above).}}}
*{{block{
To empty the trash can (i.e. actually //delete// the tiddlers), click on the ''//"empty trash"//'' button that appears in the [[Trash]] tiddler.  You can also add this button to your [[SideBarOptions]] or any other desired location by using the following macro:
{{{
<<emptyTrash>>
}}}
}}}
*{{block{
To ''bypass the trash can'' and use the normal delete handling (with the usual confirmation messages, if chkConfirmDelete is enabled), hold CTRL while clicking 'delete'}}}
*{{block{
To ''bypass both the trash can //and// the confirmation message'' and //immediately delete// the tiddler without any further interaction, hold CTRL+SHIFT while clicking 'delete'}}}
<<<
!!!!!Revisions
<<<
2009.05.20 [1.2.0] documentation rewrite and code cleanup/reduction
2009.05.12 [1.1.0.5] refactored code to add entry point: {{{config.commands.deleteTiddler.sendToTrash(title)}}}
2008.11.14 [1.1.0.4] added SHIFT-CLICK = bypass trash and delete immediately WITHOUT CONFIRMATION
2008.10.14 [1.1.0.3] return FALSE from emptyTrash() handler (fixes IE page transition error)
2008.05.18 [1.1.0.2] when creating the Trash tiddler, pass an empty tags array [] instead of a null value, so other plugins (e.g., InstantTimestampPlugin) won't fail
2006.12.21 [1.1.0.1] only call setDirty() when actually removing tiddlers from trash
2006.12.12 [1.1.0.0] added movedMsg (feedback when tiddler is tagged as Trash).   Make sure tiddler actually exists before tagging it with 'Trash'.  Fetch correct tiddler before checking for 'systemConfig' tag
2006.12.11 [1.0.3.1] Don't create Trash tiddler until needed. Remove Trash tiddler when no trash remains. Don't tag Trash tiddler with 'TrashPlugin'. Moved all user-visible strings to variables so they can be translated by 'lingo' plugins. Use displayMessage() instead of alert()
2006.12.11 [1.0.3] Fixed broken reference to core deleteTiddler. Now storing reference to core deleteTiddler in emptyTrash macro. Reduced deleteTiddler hijacking to only the handler.
2006.12.11 [1.0.2] EmptyTrash now uses removeTiddler instead of deleteTiddler. Supports trashing systemConfig tiddlers (adds systemConfigDisable tag).
2006.12.10 [1.0.1] Replaced TW version with proper Core reference. Now properly hijacking deleteTiddler command.
2006.12.10 [1.0.0] First draft.
<<<
!!!!!Code
***/
//{{{
version.extensions.TrashPlugin= {major: 1, minor: 2, revision: 0, date: new Date(2009,5,20)};
//}}}
//{{{
config.macros.emptyTrash = {
	tag: 'Trash',
	movedMsg: "'%0' has been tagged as %1",
	label: 'empty trash',
	tooltip: 'Delete all items tagged as %0',
	tooltipOlder: 'Delete items tagged as %0 that are older than %1 days old',
	emptyMsg: 'The trash is empty',
	noneToDeleteMsg: 'There are no items in the trash older than %0 days',
	confirmMsg: "The following tiddlers will be deleted:\n\n'%0'\n\nOK to proceed?",
	deletedMsg: "Deleted '%0'",
	handler: function ( place,macroName,params,wikifier,paramString,tiddler ) {
		var namedParams = (paramString.parseParams(daysOld))[0];
		var daysOld = namedParams['daysOld'] ? namedParams['daysOld'][0] : 0; // default
		var buttonTitle = namedParams['title'] ? namedParams['title'][0] : this.label;
		var buttonTip=this.tooltip.format([this.tag])
		if (daysOld) buttonTip=this.tooltipOlder.format([this.tag,daysOld])
		var b=createTiddlyButton(place,buttonTitle,buttonTip,this.emptyTrash);
		b.setAttribute('daysOld',daysOld);
	},
	emptyTrash: function() {
		var cme=config.macros.emptyTrash; // abbrev
		var daysOld=this.getAttribute('daysOld');
		var compareDate=new Date(); compareDate.setDate(compareDate.getDate()-daysOld);
		var collected=[];
		store.forEachTiddler(function(title,tiddler) {
			if (tiddler.isTagged(cme.tag) && tiddler.modified<compareDate)
				collected.push(title);
		});
		if (!collected.length)
			displayMessage(daysOld ? cme.noneToDeleteMsg.format([daysOld]) : cme.emptyMsg);
		else if (confirm(cme.confirmMsg.format([collected.join("', '")]))) {
			for (var i=0;i<collected.length;i++) {
				store.removeTiddler(collected[i]);
				store.setDirty(true);
				displayMessage(cme.deletedMsg.format([collected[i]]));
			}
		}
		if (!store.getTaggedTiddlers(cme.tag).length) // remove Trash if empty
			{ story.closeTiddler(cme.tag,true,false); store.removeTiddler(cme.tag); }
		else
			story.refreshTiddler(cme.tag,false,true); // refresh Trash if visible
		return false;
	}
}
//}}}
// // hijack delete command
//{{{
config.commands.deleteTiddler.orig_handler=config.commands.deleteTiddler.handler;
config.commands.deleteTiddler.handler=function(event,src,title) {
	// BYPASS TRASH: CTRL=normal delete, CTRL+SHIFT=without confirmation
	if (event.ctrlKey) {
		if (event.shiftKey) { var temp=config.options.chkConfirmDelete; config.options.chkConfirmDelete=false; }
		config.commands.deleteTiddler.orig_handler.apply(this,arguments);
		if (event.shiftKey) config.options.chkConfirmDelete=temp;
		story.refreshTiddler(config.macros.emptyTrash.tag,false,true);
		return false;
	}
	config.commands.deleteTiddler.sendToTrash(title);
	return false;
};

config.commands.deleteTiddler.sendToTrash = function(title) {
	var cme=config.macros.emptyTrash; // abbrev
	if (!store.tiddlerExists(title)) return; // make sure tiddler actually exists
	if (!store.tiddlerExists(cme.tag)) // make sure Trash tiddler exists
		store.saveTiddler(cme.tag,cme.tag,'<<emptyTrash>>','TrashPlugin',new Date(),[],{});
	store.setTiddlerTag(title,1,cme.tag);
	store.setTiddlerTag(title,1,'excludeLists');
	store.setTiddlerTag(title,1,'excludeMissing');
	store.setTiddlerTag(title,1,'excludeSearch');
	if (store.getTiddler(title).isTagged('systemConfig'))
		store.setTiddlerTag(title,1,'systemConfigDisable');
	story.closeTiddler(title,true);
	if(config.options.chkAutoSave) saveChanges();
	displayMessage(cme.movedMsg.format([title,cme.tag]));
	story.refreshTiddler(cme.tag,false,true);
};
//}}}
/***
|Name|SinglePageModePluginInfo|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for SinglePageModePlugin|
Normally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.  SinglePageModePlugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time.
!!!!!Usage
<<<
When the plugin is enabled, only one tiddler will be displayed at a time and the browser window's titlebar is updated to include the current tiddler title.  The browser's location URL is also updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.  Alternatively, even when displaying multiple tiddlers //is// permitted, you can still reduce the potential for confusion by forcing  tiddlers to always open at the top (or bottom) of the page instead of being displayed following the tiddler containing the link that was clicked.
<<<
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

Notes:
* {{block{
The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}. You can also use {{{SPM:expression}}}, where 'expression' is any javascript statement that evaluates to true or false.  This allows you to create hard-coded links in other documents that can selectively enable/disable the use of this option based on various programmatic conditions, such as the current username. For example, using
&nbsp;&nbsp;&nbsp;{{{#SPM:config.options.txtUserName!="SomeName"}}}
enables 'one tiddler at a time' display for all users //other than// "~SomeName")}}}
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false
2008.06.12 [2.9.5] corrected 'scroll to top of page' logic in auto-scroll handling
2008.06.11 [2.9.4] added chkSinglePageKeepEditedTiddlers option
2008.06.05 [2.9.3] in displayTiddler(), bypass single/top/bottom mode handling if startingUp.  Allows multiple tiddlers to be displayed during startup processing (e.g., #story:DefaultTiddlers), even if single/top/bottom mode is enabled.
2008.04.18 [2.9.2] in displayTiddler() and checkLastURL(), handling for Unicode in tiddler titles (remove explicit conversion between Unicode and UTF, as this is apparently done automatically by encode/decodeURIComponent, resulting in double-encoding!
2008.04.08 [2.9.1] don't automatically add options to AdvancedOptions shadow tiddler
2008.04.02 [2.9.0] in displayTiddler(), when single-page mode is in use and a tiddler is being edited, ask for permission to save-and-close that tiddler, instead of just leaving it open.
2008.03.29 [2.8.3] in displayTiddler(), get title from tiddler object (if needed).  Fixes errors caused when calling function passes a tiddler *object* instead of a tiddler *title*
2008.03.14 [2.8.2] in displayTiddler(), if editing specified tiddler, just move it to top/bottom of story *without* re-rendering (prevents discard of partial edits).
2008.03.06 [2.8.1] in paramifier handler, start 'checkURL' timer if chkSinglePageMode is enabled
2008.03.06 [2.8.0] added option, {{{config.options.chkSinglePageKeepFoldedTiddlers}}}, so folded tiddlers won't be closed when using single-page mode.  Also, in checkURL(), if hash is a ''permaview'' (e.g., "#foo bar baz"), then display multiple tiddlers rather than attempting to display "foo bar baz" as a single tiddler
2008.03.05 [2.7.0] added support for "SPM:" URL paramifier
2008.03.01 [2.6.0] in hijack of displayTiddler(), added 'title' argument to closeAllTiddlers() so that target tiddler isn't closed-and-reopened if it was already displayed.  Also, added config.options.chkSinglePageAutoScrolloption to bypass automatic 'scroll into view' logic (note: core still does it's own ensureVisible() handling)
2007.12.22 [2.5.3] in checkLastURL(), use decodeURIComponent() instead of decodeURI so that tiddler titles with commas (and/or other punctuation) are correctly handled.
2007.10.26 [2.5.2] documentation cleanup
2007.10.08 [2.5.1] in displayTiddler(), when using single-page or top-of-page mode, scrollTo(0,0) to ensure that page header is in view.
2007.09.13 [2.5.0] for TPM/BPM modes, don't force tiddler to redisplay if already shown.  Allows transition between view/edit or collapsed/view templates, without repositioning displayed tiddler.
2007.09.12 [2.4.0] added option to disable automatic permalink feature.  Also, Safari is now excluded from permalinking action to avoid bug where tiddlers don't display after hash is updated.
2007.03.03 [2.3.1] fix typo when adding BPM option to AdvancedOptions (prevented checkbox from appearing)
2007.03.03 [2.3.0] added support for BottomOfPageMode (BPM) based on request from DaveGarbutt
2007.02.06 [2.2.3] in Story.prototype.displayTiddler(), use convertUnicodeToUTF8() for correct I18N string handling when creating URL hash string from tiddler title (based on bug report from BidiX)
2007.01.08 [2.2.2] use apply() to invoke hijacked core functions
2006.07.04 [2.2.1] in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.
2006.06.01 [2.2.0] added chkTopOfPageMode (TPM) handling
2006.02.04 [2.1.1] moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals
2005.12.27 [2.1.0] hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list).  Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers
2005.12.27 [2.0.0] Update for TW2.0
2005.11.24 [1.1.2] When the back and forward buttons are used, the page now changes to match the URL.  Based on code added by Clint Checketts
2005.10.14 [1.1.1] permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them
2005.10.14 [1.1.0] added automatic setting of window title and location bar ('auto-permalink').  feature suggestion by David Dickens.
2005.10.09 [1.0.1] combined documentation and code in a single tiddler
2005.08.15 [1.0.0] Initial Release
<<<
<!--{{{-->
<!--
|Name|CollapsedTemplate|
|Source|http://www.TiddlyTools.com/#CollapsedTemplate|
|Version||
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|template|
|Requires|ToolbarCommands|
|Overrides||
|Description|alternative to ViewTemplate, used by CollapseTiddlersPlugin to display tiddler when 'folded'|
-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::CollapsedToolbar]]'></div>
<div class='title' macro='view title'></div>

<div class='tagClear'></div>
<div class='subtitle'> - <span macro='view editsummary'></span> - <span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view creator'></span> <span macro='view created date'></span>)</div>
<!--}}}-->
/***
|Name|CollapseTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#CollapseTiddlersPlugin|
|Version|2.0.0|
|Author|Eric Shulman|
|OriginalAuthor|Bradley Meck - http://gensoft.revhost.net/Collapse.html|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|CollapsedTemplate|
|Overrides||
|Description|show/hide content of a tiddler while leaving tiddler title visible|
!!!Revisions
<<<
2009.05.04 [2.0.0] standardized documentation and added version #
2008.10.05 collapseAll() and expandAll(): added "return false" to button handlers to prevent IE page transition
2008.03.06 refactored all code for size reduction, readability, and I18N/L10N-readiness.  Also added 'folded' flag to tiddler elements (for use by other plugins that need to know if tiddler is folded (e.g., [[SinglePageModePlugin]]
2007.10.11 moved [[FoldFirst]] inline script and converted to {{{<<foldFirst>>}}} macro
2007.12.09 suspend/resume SinglePageMode (SPM/TPM/BPM) when folding/unfolding tiddlers
2007.05.06 add "return false" at the end of each command handler to prevent IE 'page transition' problem.
2007.03.30 add a shadow definition for CollapsedTemplate.  Tweak ViewTemplate shadow so "fold/unfold" and "focus" toolbar items automatically appear when using default templates.  Remove error check for "CollapsedTemplate" existence, since shadow version will now always work as a fallback.
2006.02.24 added fallback to "CollapsedTemplate" if "WebCollapsedTemplate" is not found
2006.02.06 added check for 'readOnly' flag to use alternative "WebCollapsedTemplate"
<<<
!!!Code
***/
//{{{
version.extensions.CollapseTiddlersPlugin= {major: 2, minor: 0, revision: 0, date: new Date(2009,5,4)};

config.shadowTiddlers.CollapsedTemplate=
	"<!--{{{-->\
	<div class='toolbar' macro='toolbar expandTiddler collapseOthers closeTiddler closeOthers +editTiddler permalink references jump'></div>\
	<div class='title' macro='view title'></div>\
	<!--}}}-->";

// automatically tweak shadow ViewTemplate to add "collapseTiddler collapseOthers" commands
config.shadowTiddlers.ViewTemplate=config.shadowTiddlers.ViewTemplate.replace(/closeTiddler/,"collapseTiddler collapseOthers closeTiddler");

config.commands.collapseTiddler = {
	text: "fold",
	tooltip: "Collapse this tiddler",
	collapsedTemplate: "CollapsedTemplate",
	webCollapsedTemplate: "WebCollapsedTemplate",
	handler: function(event,src,title) {
		var e = story.findContainingTiddler(src); if (!e) return false;
		// don't fold tiddlers that are being edited!
		if(story.isDirty(e.getAttribute("tiddler"))) return false;
		var t=config.commands.collapseTiddler.getCollapsedTemplate();
		config.commands.collapseTiddler.saveTemplate(e);
		config.commands.collapseTiddler.display(title,t);
		e.setAttribute("folded","true");
		return false;
	},
	getCollapsedTemplate: function() {
		if (readOnly&&store.tiddlerExists(this.webCollapsedTemplate))
			return this.webCollapsedTemplate;
		else
			return this.collapsedTemplate
	},
	saveTemplate: function(e) {
		if (e.getAttribute("savedTemplate")==undefined)
			e.setAttribute("savedTemplate",e.getAttribute("template"));

	},
	// fold/unfold tiddler with suspend/resume of single/top/bottom-of-page mode
	display: function(title,t) {
		var opt=config.options;
		var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
		var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
		var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
		story.displayTiddler(null,title,t);
		opt.chkBottomOfPageMode=saveBPM;
		opt.chkTopOfPageMode=saveTPM;
		opt.chkSinglePageMode=saveSPM;
	}
}

config.commands.expandTiddler = {
	text: "unfold",
	tooltip: "Expand this tiddler",
	handler: function(event,src,title) {
		var e = story.findContainingTiddler(src); if (!e) return false;
		var t = e.getAttribute("savedTemplate");
		config.commands.collapseTiddler.display(title,t);
		e.setAttribute("folded","false");
		return false;
	}
}

config.macros.collapseAll = {
	text: "collapse all",
	tooltip: "Collapse all tiddlers",
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		createTiddlyButton(place,this.text,this.tooltip,function(){
			story.forEachTiddler(function(title,tiddler){
				if(story.isDirty(title)) return;
				var t=config.commands.collapseTiddler.getCollapsedTemplate();


				config.commands.collapseTiddler.saveTemplate(tiddler);
				config.commands.collapseTiddler.display(title,t);
				tiddler.folded=true;
			});
			return false;
		})
	}
}

config.macros.expandAll = {
	text: "expand all",
	tooltip: "Expand all tiddlers",
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		createTiddlyButton(place,this.text,this.tooltip,function(){
			story.forEachTiddler(function(title,tiddler){
				var t=config.commands.collapseTiddler.getCollapsedTemplate();
				if(tiddler.getAttribute("template")!=t) return; // re-display only if collapsed
				var t=tiddler.getAttribute("savedTemplate");
				config.commands.collapseTiddler.display(title,t);
				tiddler.folded=false;
			});
			return false;
		})
	}
}

config.commands.collapseOthers = {
	text: "focus",
	tooltip: "Expand this tiddler and collapse all others",
	handler: function(event,src,title) {
		var e = story.findContainingTiddler(src); if (!e) return false;
		story.forEachTiddler(function(title,tiddler) {
			if(story.isDirty(title)) return;
			var t=config.commands.collapseTiddler.getCollapsedTemplate();
			if (e==tiddler) t=e.getAttribute("savedTemplate");
			config.commands.collapseTiddler.saveTemplate(tiddler);
			config.commands.collapseTiddler.display(title,t);
			tiddler.folded=(e!=tiddler);
		})
		return false;
	}
}

// {{{<<foldFirst>>}}} macro forces tiddler to be folded when *initially* displayed.
// Subsequent re-render does NOT re-fold tiddler, but closing/re-opening tiddler DOES cause it to fold first again.
config.macros.foldFirst = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		var e=story.findContainingTiddler(place);
		if (e.getAttribute("foldedFirst")=="true") return; // already been folded once
		var title=e.getAttribute("tiddler")
		var t=config.commands.collapseTiddler.getCollapsedTemplate();
		config.commands.collapseTiddler.saveTemplate(e);
		config.commands.collapseTiddler.display(title,t);
		e.setAttribute("folded","true");
		e.setAttribute("foldedFirst","true"); // only when tiddler is first rendered
		return false;
	}
}
//}}}
System tag
System tag
System tag
System tag
<<timeline "modified" "20">>
See also MarkupCheatSheet2

!Inline Formatting
|!Option|!Syntax|!Output|
|bold font|{{{''bold''}}}|''bold''|
|italic type|{{{//italic//}}}|//italic//|
|underlined text|{{{__underlined__}}}|__underlined__|
|strikethrough text|{{{--strikethrough--}}}|--strikethrough--|
|superscript text|{{{^^super^^script}}}|^^super^^script|
|subscript text|{{{~~sub~~script}}}|~~sub~~script|
|highlighted text|{{{@@highlighted@@}}}|@@highlighted@@|
|preformatted text|<html><code>{{{preformatted}}}</code></html>|{{{preformatted}}}|
!Block Elements
!!Headings
{{{
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
}}}
<<<
!Heading 1
!!Heading 2
!!!Heading 3
!!!!Heading 4
!!!!!Heading 5
<<<
!!Lists
{{{
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description
}}}
<<<
* unordered list, level 1
** unordered list, level 2
*** unordered list, level 3

# ordered list, level 1
## ordered list, level 2
### unordered list, level 3

; definition list, term
: definition list, description
<<<
!!Blockquotes
{{{
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

<<<
blockquote
<<<
}}}
<<<
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3

> blockquote
<<<
!!Preformatted Text
<html><pre>
{{{
preformatted (e.g. code)
}}}
</pre></html>
<<<
{{{
preformatted (e.g. code)
}}}
<<<
!!Tables
showing headers, footers and captions also
{{{
|CssClass|h
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |f
|caption|c
}}}
''Annotation:''
* The {{{>}}} marker creates a "colspan", causing the current cell to merge with the one to the right.
* The {{{~}}} marker creates a "rowspan", causing the current cell to merge with the one above.
<<<
|CssClass|h
|!heading column 1|!heading column 2|
|row 1, column 1|row 1, column 2|
|row 2, column 1|row 2, column 2|
|>|COLSPAN|
|ROWSPAN| … |
|~| … |
|CssProperty:value;…| … |f
|caption|c
<<<

{|
| style="background: #333366;" |Alternatively...
|
* Note that mediawiki table syntax is also valid, through MediaWikiTableFormatterPlugin
* It allows for multiline content, and per-cell styles
|}



!!Images /% TODO %/
cf. [[TiddlyWiki.com|http://www.tiddlywiki.com/#EmbeddedImages]]
!Hyperlinks
* [[WikiWords|WikiWord]] are automatically transformed to hyperlinks to the respective tiddler
** the automatic transformation can be suppressed by preceding the respective WikiWord with a tilde ({{{~}}}): {{{~WikiWord}}}
* [[PrettyLinks]] are enclosed in square brackets and contain the desired tiddler name: {{{[[tiddler name]]}}}
** optionally, a custom title or description can be added, separated by a pipe character ({{{|}}}): {{{[[title|target]]}}}<br>'''N.B.:''' In this case, the target can also be any website (i.e. URL).
!Custom Styling
* {{{@@CssProperty:value;CssProperty:value;…@@}}}<br>''N.B.:'' CSS color definitions should use lowercase letters to prevent the inadvertent creation of WikiWords.
* <html><code>{{customCssClass{…}}}</code></html>
* raw HTML can be inserted by enclosing the respective code in HTML tags: {{{<html> … </html>}}}
!Special Markers
* {{{<br>}}} forces a manual line break
* {{{----}}} creates a horizontal ruler
* [[HTML entities|http://www.tiddlywiki.com/#HtmlEntities]]
* {{{<<macroName>>}}} calls the respective [[macro|Macros]]
* To hide text within a tiddler so that it is not displayed, it can be wrapped in {{{/%}}} and {{{%/}}}.<br/>This can be a useful trick for hiding drafts or annotating complex markup.
* To prevent wiki markup from taking effect for a particular section, that section can be enclosed in three double quotes: e.g. {{{"""WikiWord"""}}}.

!! Sliders
{{{<<slider chkCookieName "Transcluded Tiddler" "slider button text" "slider button mouseover text">>}}}
This is a tag for content on NemWiki which links to external sites, (or discusses external sites)
These are the journals of Nemo. SO THERE!
<<tabs chkTimeline "Recent" "Recent history only" TabTimelineLimited40 "All" "All of history" TabTimelineAll>>
!!this is sand. play in it?

<<generate>>

{{{
<<forEachTiddler
    sortBy 
        tiddler.modifier
    descending

    write 
        '(index < 10) ? "* [["+tiddler.title+"]]\n" : ""'
>>
}}}

''//Result://''
<<forEachTiddler
    sortBy 
        tiddler.modifier
    descending

    write 
        '(index < 10) ? "* [["+tiddler.title+"]], "+tiddler.modifier+"\n" : ""'
>>

----
! include test
<<include "http://tiddlywiki.abego-software.de/" hide:true>>
<<include "http://nemo.house.cx/House" hide:true>>

this is a test of a {{border{border}}}. How about that huh?

----
! list filters
a
<<list filter [modifier[nemo]]>>
b
<<list filter [tag[TODO]][tag[nemo]][sort[-created]]>>
c
<<list touched>>
----

|>|header line|h
|table|more table?|
|this is row 2 of the table|this is column 2 :)|
|caption|c
#list item
** sublist
** sublist 2
# original list?
----
!Clouds

<<cloud tag limit:10>>
<<cloud links limit:10>>
<<cloud references limit:10 >>
"Nemo" is my page. "nemo" is the tag used here...

Pages tagged "nemo" are pages ''about'' me. I wont tag stuff I made as being me, since that is a default assumption of [[this site|NemWiki]]. 

Maybe this is the Nemo content you may have come looking for?  <<slider chknemoNemo [[Nemo]] Nemo Nemo>>
/***
|''Name''|SimpleSearchPlugin|
|''Description''|displays search results as a simple list of matching tiddlers|
|''Authors''|FND|
|''Version''|0.4.0|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Keywords''|search|
!Revision History
!!v0.2.0 (2008-08-18)
* initial release
!!v0.3.0 (2008-08-19)
* added Open All button (renders Classic Search option obsolete)
* sorting by relevance (title matches before content matches)
!!v0.4.0 (2008-08-26)
* added tag matching
!To Do
* tag matching optional
* animations for container creation and removal
* when clicking on search results, do not scroll to the respective tiddler (optional)
* use template for search results
!Code
***/
//{{{
if(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once
version.extensions.SimpleSearchPlugin = { installed: true };

if(!plugins) { var plugins = {}; }
plugins.SimpleSearchPlugin = {
	heading: "Search Results",
	containerId: "searchResults",
	btnCloseLabel: "close",
	btnCloseTooltip: "dismiss search results",
	btnCloseId: "search_close",
	btnOpenLabel: "Open all",
	btnOpenTooltip: "open all search results",
	btnOpenId: "search_open",
	
	displayResults: function(matches, query) {
		story.refreshAllTiddlers(true); // update highlighting within story tiddlers
		var el = document.getElementById(this.containerId);
		query = '"""' + query + '"""'; // prevent WikiLinks
		if(el) {
			removeChildren(el);
		} else { //# fallback: use displayArea as parent
			var container = document.getElementById("displayArea");
			el = document.createElement("div");
			el.setAttribute("id", this.containerId);
			el = container.insertBefore(el, container.firstChild);
		}
		var msg = "!" + this.heading + "\n";
		if(matches.length > 0) {
			msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n";
			this.results = [];
			for(var i = 0 ; i < matches.length; i++) {
				this.results.push(matches[i].title);
				msg += "* [[" + matches[i].title + "]]\n";
			}
		} else {
			msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?
		}
		createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, plugins.SimpleSearchPlugin.closeResults, "button", this.btnCloseId);
		wikify(msg, el);
		if(matches.length > 0) { // XXX: redundant!?
			createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, plugins.SimpleSearchPlugin.openAll, "button", this.btnOpenId);
		}
	},

	closeResults: function() {
		var el = document.getElementById(plugins.SimpleSearchPlugin.containerId);
		removeNode(el);
		plugins.SimpleSearchPlugin.results = null;
		highlightHack = null;
	},

	openAll: function(ev) {
		story.displayTiddlers(null, plugins.SimpleSearchPlugin.results);
		return false;
	}
};

config.shadowTiddlers.StyleSheetSimpleSearch = "/*{{{*/\n" +
	"#" + plugins.SimpleSearchPlugin.containerId + " {\n" +
	"\toverflow: auto;\n" +
	"\tpadding: 5px 1em 10px;\n" +
	"\tbackground-color: [[ColorPalette::TertiaryPale]];\n" +
	"}\n\n" +
	"#" + plugins.SimpleSearchPlugin.containerId + " h1 {\n" +
	"\tmargin-top: 0;\n" +
	"\tborder: none;\n" +
	"}\n\n" +
	"#" + plugins.SimpleSearchPlugin.containerId + " ul {\n" +
	"\tmargin: 0.5em;\n" +
	"\tpadding-left: 1.5em;\n" +
	"}\n\n" +
	"#" + plugins.SimpleSearchPlugin.containerId + " .button {\n" +
	"\tdisplay: block;\n" +
	"\tborder-color: [[ColorPalette::TertiaryDark]];\n" +
	"\tpadding: 5px;\n" +
	"\tbackground-color: [[ColorPalette::TertiaryLight]];\n" +
	"}\n\n" +
	"#" + plugins.SimpleSearchPlugin.containerId + " .button:hover {\n" +
	"\tborder-color: [[ColorPalette::SecondaryMid]];\n" +
	"\tbackground-color: [[ColorPalette::SecondaryLight]];\n" +
	"}\n\n" +
	"#" + plugins.SimpleSearchPlugin.btnCloseId + " {\n" +
	"\tfloat: right;\n" +
	"\tmargin: -5px -1em 5px 5px;\n" +
	"}\n\n" +
	"#" + plugins.SimpleSearchPlugin.btnOpenId + " {\n" +
	"\tfloat: left;\n" +
	"\tmargin-top: 5px;\n" +
	"}\n" +
	"/*}}}*/";
store.addNotification("StyleSheetSimpleSearch", refreshStyles);

// override Story.search()
Story.prototype.search = function(text, useCaseSensitive, useRegExp) {
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack, null, "excludeSearch");
	var q = useRegExp ? "/" : "'";
	plugins.SimpleSearchPlugin.displayResults(matches, q + text + q);
};

// override TiddlyWiki.search() to sort by relevance
TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {
	var candidates = this.reverseLookup("tags", excludeTag, !!match);
	var primary = [];
	var secondary = [];
	var tertiary = [];
	for(var t = 0; t < candidates.length; t++) {
		if(candidates[t].title.search(searchRegExp) != -1) {
			primary.push(candidates[t]);
		} else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) {
			secondary.push(candidates[t]);
		} else if(candidates[t].text.search(searchRegExp) != -1) {
			tertiary.push(candidates[t]);
		}
	}
	var results = primary.concat(secondary).concat(tertiary);
	if(sortField) {
		results.sort(function(a, b) {
			return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
		});
	}
	return results;
};

} //# end of "install only once"
//}}}
{{{
It's about meeting someone.
Not for the first time mind you.
But the first time like this.
 
It's about facing your emotions.
Facing them down perhaps.
Daring them to rise to the surface.
 
It's about letting go of your rational thought
Letting your mind observe events.
And seeing what ideas result at the other end.
 
It's about seeing her smile.
Wondering about the emotions behind.
Behind the smile, and left behind in your mind.
 
It's about her way of being herself.
How dearly you feel for that.
 
It's about knowing your own mind.
Your own responses. Your own reactions.
 
It's about knowing your own feelings.
Predict thyself.
 
It's about realising that for all she is, and all she will ever be, she
will always be untouchable. Not because of how she feels for you. Or how
you feel for her. But because you know, through instinct refined through
experience, that you coulnd't live with yourself if you lived with her.
 
It's about your subconscious and conscious mind fighting for the control
of your actions. Your conscious mind observing what she is. Subconsciously
you try to complement her. Consciously you know that would be doomed to
failure. Either she would love you for who you are, or not at all.
 
Be thyself.
 
But the failing of the conscious mind is that it has limited control. Observe
yourself, as if helpless, as you find yourself continuing to try to be her
complement. How strange, that we are victims of our own making.
 
Maybe she finds herself the same way. Probably not. Not this time. Such things
have happened in times past, but teh result is the same. Always longing.
Always yearning. Always knowing that the paths are not destined to cross.
 
It's about love deliberately forsaken.
A friendship in the making.
A heart forever breaking.
}}}
----
{{justifyright{
20 December 1999
In late 1999, I tried to get back in touch with a few old friends from high school. The whole end-of-the-millennium thing and all. It seemed appropriate. One of those I tracked down was my old high school crush, the lovely Vanessa. She was visiting town for Christmas, and we managed to catch up... this poem came directly out of that visit. The title is taken from the moment that the feelings behind the poem occurred to me.
}}}
<<slider chkCinemaEpiloque "Epilogue to Cinema Lines" "Epilogue to Cinema Lines" "Epiloque to Cinema Lines (2000)">>
This tag is a recursive tag. It allows one to open the tiddlers for all the tags at once, and so read explanations of them all. Click on 'tag' in 'tags', and select 'open all'
Content about places in the real world - that is, [[meatspace]] - shall be labelled as a place. 
/***
|Name|TagCloudPlugin|
|Source|http://www.TiddlyTools.com/#TagCloudPlugin|
|Version|1.7.0|
|Author|Eric Shulman|
|Original Author|Clint Checketts|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|present a 'cloud' of tags (or links) using proportional font display|
!Usage
<<<
{{{
<<cloud type action:... limit:... tag tag tag ...>>
<<cloud type action:... limit:... +TiddlerName>>
<<cloud type action:... limit:... -TiddlerName>>
<<cloud type action:... limit:... =tagvalue>>
}}}
where:
* //type// is a keyword, one of:
** ''tags'' (default) - displays a cloud of tags, based on frequency of use
** ''links'' - displays a cloud of tiddlers, based on number of links //from// each tiddler
** ''references'' - displays a cloud of tiddlers, based on number of links //to// each tiddler
* ''action:popup'' (default) - clicking a cloud item shows a popup with links to related tiddlers<br>//or//<br> ''action:goto'' - clicking a cloud item immediately opens the tiddler corresponding to that item
* ''limit:N'' (optional) - restricts the cloud display to only show the N most popular tags/links
* ''tag tag tag...'' (or ''title title title'' if ''links''/''references'' is used)<br>shows all tags/links in the document //except// for those listed as macro parameters
* ''+TiddlerName''<br>show only tags/links read from a space-separated, bracketed list stored in a separate tiddler.
* ''-TiddlerName''<br>show all tags/links //except// those read from a space-separated, bracketed list stored in a separate tiddler.
* ''=tagvalue'' (//only if type=''tags''//)<br>shows only tags that are themselves tagged with the indicated tag value (i.e., ~TagglyTagging usage)
//note: for backward-compatibility, you can also use the macro {{{<<tagCloud ...>>}}} in place of {{{<<cloud ...>>}}}//
<<<
!Examples
<<<
//all tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud systemConfig excludeMissing script>>}}}
//top 10 tags excluding<<tag systemConfig>>, <<tag excludeMissing>> and <<tag script>>//
{{{<<cloud limit:10 systemConfig excludeMissing script>>}}}
{{groupbox{<<cloud limit:10 systemConfig excludeMissing script>>}}}
//tags listed in// [[FavoriteTags]]
{{{<<cloud +FavoriteTags>>}}}
{{groupbox{<<cloud +FavoriteTags>>}}}
//tags NOT listed in// [[FavoriteTags]]
{{{<<cloud -FavoriteTags>>}}}
{{groupbox{<<cloud -FavoriteTags>>}}}
//links to tiddlers tagged with 'package'//
{{{<<cloud action:goto =package>>}}}
{{groupbox{<<cloud action:goto =package>>}}}
//top 20 most referenced tiddlers//
{{{<<cloud references limit:20>>}}}
{{groupbox{<<cloud references limit:20>>}}}
//top 20 tiddlers that contain the most links//
{{{<<cloud links limit:20>>}}}
{{groupbox{<<cloud links limit:20>>}}}
<<<
!Revisions
<<<
2009.07.17 [1.7.0] added {{{-TiddlerName}}} parameter to exclude tags that are listed in the indicated tiddler
2009.02.26 [1.6.0] added {{{action:...}}} parameter to apply popup vs. goto action when clicking cloud items
2009.02.05 [1.5.0] added ability to show links or back-links (references) instead of tags and renamed macro to {{{<<cloud>>}}} to reflect more generalized usage.
2008.12.16 [1.4.2] corrected group calculation to prevent 'group=0' error
2008.12.16 [1.4.1] revised tag filtering so excluded tags don't affect calculations
2008.12.15 [1.4.0] added {{{limit:...}}} parameter to restrict the number of tags displayed to the top N most popular
2008.11.15 [1.3.0] added {{{+TiddlerName}}} parameter to include only tags that are listed in the indicated tiddler
2008.09.05 [1.2.0] added '=tagname' parameter to include only tags that are themselves tagged with the specified value (i.e., ~TagglyTagging usage)
2008.07.03 [1.1.0] added 'segments' property to macro object.  Extensive code cleanup
<<<
!Code
***/
//{{{
version.extensions.TagCloudPlugin= {major: 1, minor: 7 , revision: 0, date: new Date(2009,7,17)};
//Originally created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman
//Currently maintained and enhanced by Eric Shulman
//}}}
//{{{
config.macros.cloud = {
	tagstip: "%1 tiddlers tagged with '%0'",
	refslabel: " (%0 references)",
	refstip: "%1 tiddlers have links to '%0'",
	linkslabel: " (%0 links)",
	linkstip: "'%0' has links to %1 other tiddlers",
	groups: 9,
	init: function() {
		config.macros.tagCloud=config.macros.cloud; // for backward-compatibility
		config.shadowTiddlers.TagCloud='<<cloud>>';
		config.shadowTiddlers.StyleSheetTagCloud=
			'/*{{{*/\n'
			+'.tagCloud span {line-height: 3.5em; margin:3px;}\n'
			+'.tagCloud1{font-size: 80%;}\n'
			+'.tagCloud2{font-size: 100%;}\n'
			+'.tagCloud3{font-size: 120%;}\n'
			+'.tagCloud4{font-size: 140%;}\n'
			+'.tagCloud5{font-size: 160%;}\n'
			+'.tagCloud6{font-size: 180%;}\n'
			+'.tagCloud7{font-size: 200%;}\n'
			+'.tagCloud8{font-size: 220%;}\n'
			+'.tagCloud9{font-size: 240%;}\n'
			+'/*}}}*/\n';
		setStylesheet(store.getTiddlerText('StyleSheetTagCloud'),'tagCloudsStyles');
	},
	getLinks: function(tiddler) { // get list of links to existing tiddlers and shadows
		if (!tiddler.linksUpdated) tiddler.changed();
		var list=[]; for (var i=0; i<tiddler.links.length; i++) {
			var title=tiddler.links[i];
			if (store.isShadowTiddler(title)||store.tiddlerExists(title))
				list.push(title);
		}
		return list;
	},
	handler: function(place,macroName,params) {
		// unpack params
		var inc=[]; var ex=[]; var limit=0; var action='popup';
		var links=(params[0]&&params[0].toLowerCase()=='links'); if (links) params.shift();
		var refs=(params[0]&&params[0].toLowerCase()=='references'); if (refs) params.shift();
		if (params[0]&&params[0].substr(0,7).toLowerCase()=='action:')
			action=params.shift().substr(7).toLowerCase();
		if (params[0]&&params[0].substr(0,6).toLowerCase()=='limit:')
			limit=parseInt(params.shift().substr(6));
		while (params.length) {
			if (params[0].substr(0,1)=='+') { // read taglist from tiddler
				inc=inc.concat(store.getTiddlerText(params[0].substr(1),'').readBracketedList());
			} else if (params[0].substr(0,1)=='-') { // exclude taglist from tiddler
				ex=ex.concat(store.getTiddlerText(params[0].substr(1),'').readBracketedList());
			} else if (params[0].substr(0,1)=='=') { // get tag list using tagged tags
				var tagged=store.getTaggedTiddlers(params[0].substr(1));
				for (var t=0; t<tagged.length; t++) inc.push(tagged[t].title);
			} else ex.push(params[0]); // exclude params
			params.shift();
		}
		// get all items, include/exclude specific items
		var items=[];
		var list=(links||refs)?store.getTiddlers('title','excludeLists'):store.getTags();
		for (var t=0; t<list.length; t++) {
			var title=(links||refs)?list[t].title:list[t][0];
			if (links)	var count=this.getLinks(list[t]).length;
			else if (refs)	var count=store.getReferringTiddlers(title).length;
			else 		var count=list[t][1];
			if ((!inc.length||inc.contains(title))&&(!ex.length||!ex.contains(title)))
				items.push({ title:title, count:count });
		}
		if(!items.length) return;
		// sort by decending count, limit results (optional)
		items=items.sort(function(a,b){return(a.count==b.count)?0:(a.count>b.count?-1:1);});
		while (limit && items.length>limit) items.pop();
		// find min/max and group size
		var most=items[0].count;
		var least=items[items.length-1].count;
		var groupSize=(most-least+1)/this.groups;
		// sort by title and draw the cloud of items
		items=items.sort(function(a,b){return(a.title==b.title)?0:(a.title>b.title?1:-1);});
		var cloudWrapper = createTiddlyElement(place,'div',null,'tagCloud',null);
		for (var t=0; t<items.length; t++) {
			cloudWrapper.appendChild(document.createTextNode(' '));
			var group=Math.ceil((items[t].count-least)/groupSize)||1;
			var className='tagCloudtag tagCloud'+group;
			var tip=refs?this.refstip:links?this.linkstip:this.tagstip;
			tip=tip.format([items[t].title,items[t].count]);
			if (action=='goto') { // TAG/LINK/REFERENCES GOTO
				var btn=createTiddlyLink(cloudWrapper,items[t].title,true,className);
				btn.title=tip;
				btn.style.fontWeight='normal';
			} else if (!links&&!refs) { // TAG POPUP
				var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,onClickTag,className);
				btn.setAttribute('tag',items[t].title);
			} else { // LINK/REFERENCES POPUP
				var btn=createTiddlyButton(cloudWrapper,items[t].title,tip,
					function(ev) { var e=ev||window.event; var cmt=config.macros.cloud;
						var popup = Popup.create(this);
						var title = this.getAttribute('tiddler');
						var count = this.getAttribute('count');
						var refs  = this.getAttribute('refs')=='T';
						var links = this.getAttribute('links')=='T';
						var label = (refs?cmt.refslabel:cmt.linkslabel).format([count]);
						createTiddlyLink(popup,title,true);
						createTiddlyText(popup,label);
						createTiddlyElement(popup,'hr');
						if (refs) {
							popup.setAttribute('tiddler',title);
							config.commands.references.handlePopup(popup,title);
						}
						if (links) {
							var tiddler = store.fetchTiddler(title);
							var links=config.macros.cloud.getLinks(tiddler);
							for(var i=0;i<links.length;i++)
								createTiddlyLink(createTiddlyElement(popup,'li'),
									links[i],true);
						}
						Popup.show();
						e.cancelBubble=true; if(e.stopPropagation) e.stopPropagation();
						return false;
					}, className);
				btn.setAttribute('tiddler',items[t].title);
				btn.setAttribute('count',items[t].count);
				btn.setAttribute('refs',refs?'T':'F');
				btn.setAttribute('links',links?'T':'F');
				btn.title=tip;
			}
		}
	}
};
//}}}
If you abuse a Wiki, you wind up with an IckyWiki.
If you archive a snapshot of an abused wiki, you wind up with an IckyWikiPiccie. 
System tag
Nemo is online in many places. Some of those places are websites he [[hosts himself|NemoWeb]]. Other of those places are listed here:
//Note: this list should be a superset of// [[the list found on ThorxWIki|http://wiki.thorx.net/wiki/User:Nemo/Contact]]
|>|!Meatspace |
| Snail mail | GPO Box 1537, Brisbane, QLD, 4001, Australia |
| phone/sms | +61 410 491 539 |
|>|!Direct IM Online |
| email | [[nemo@thorx.net|mailto:nemo@thorx.net]] |
| [[IRC]] | user ''[[nemo|http://www.slashnet.org/users/nemo]]'' on [[SlashNet]] (especially #[[afda]]) or foonetic<br>and user ''earthnative'' on FreeNode) |
| ICQ | 5408336 |
| MSN | [[nemo@net.house.cx|mailto:nemo@net.house.cx]] |
| gmail/gtalk (Jabber) | [[earthnative@gmail.com|mailto:earthnative@gmail.com]] |
| LJchat (Jabber) | earthnative@livejournal.com |
| Skype | earth-native |
|>|!Social networks |
|>| The online world has many social haunts, increasingly so in the 2.0 era. Here is where I am and how to find me |
| Google (picassaweb, calendar, maps, youtube) | [[earthnative|http://www.google.com/profiles/earthnative]] |
| Twitter | [[@nemothorx|http://twitter.com/nemothorx]] - and others. See [[Twitter]] |
| StatusNet (aka identi.ca) | [[nemo|http://www.identi.ca/nemo]] |
| Facebook | Nemo Thorx |
| Flickr | [[nemotribble|http://www.flickr.com/photos/nemotribble]] |
| Wikipedia | [[Nemo|http://www.wikipedia.com/wiki/User:Nemo]] |
| Instagram | [[earthwombat|http://instagram.com/earthwombat]] |
| Last.fm | [[earthnative|http://www.last.fm/user/earthnative]] |
| Reddit | nemothorx |
| Livejournal | [[earthnative|http://earthnative.livejournal.com]] |
| Ubuntu QA | earthnative |
| Deviantart | earthnative |
| Myspace | earthnative |
| Toyota Sera forums | nemo |
| Trackmania | road_wombat |
| Songmeanings | nemothorx |
| Unicorn Jelly forums | nemo |
| eBay | earth-native |
| Livejournal | [[thorx|http://thorx.livejournal.com]] |
| Deadjournal | ent |
| [[Slashdot|http://www.slashdot.org]] | [[nemo|http://slashdot.org/~nemo]] |
| www.tantrix.com | nemo |
| Orkut | Nemo Thorx |
| Sourceforge | earth-native |
| aarghbrainz | nemo |
| TED | [[NemoThorx|http://www.ted.com/profiles/view/id/458409]] |
|>|!Alternative methods |
| Shouting | not very effective over long distances |
| Smoke signals | ...but not like [[Nethouse 2]] please |
| Telepathy | Only if you are telepathetic, however. |
|>|!Super traditional meatspace method |
| Visit [[Slumberland]] | if you know where it is... (and make sure you get the right one!)|
| Find me at my regular social events... | See an idea for my [[Social Calender]] |

! TODO ON THIS PAGE
fix content. delete relevant version on thorx
The meta tag is for pages about NemWiki
Tis tag is to remind [[Nemo]] of his tasklist on [[NemWiki]], both to note general TODOs (below), and specific ones (tagged tiddlers). This is distinct from [[project]]s, which are all about tasks outside this wiki

!!Stuff to be done
* edit songs/poems/writings and...
** change 'justifyright' style to 'credit' (search for 'justifyright' will work :)
** lyric quotes should be wrapped in '{{{<<<}}}'s, not individual '>'s. 
* import 2001 and 2002 NAFS blogposts.  DONE?
* import 1995/1996 BBS posts from email. 
** Any 1997-2000, or 2003-2008 posts to include???
* import ThorxWiki posts as appropriate
* tag poems with 'TheFarSide or BadPoetryOfTheDay as approp. 

Located in Charnwood, Canberra. Nethouse was the group house from February 1996, begun by "Bofh", "Matty" and "Spakman".

I moved in to join Bofh and Matty in March 1997, and in January 1999, Bofh, Mitch, James and myself moved as a group to [[Nethouse 2]].
This is the name of the house I lived in from May 2009 to April 2010, renting two rooms from the human JB.

The I/O Zoo rests on the foothills of Mount Cotton, where the wildlife can come and watch the crazy humans in the box
System tag
<<<
I walk the maze of moments
but everywhere I turn to
begins a new beginning
but never finds a finish
I walk to the horizon
and there I find another
it all seems so surprising
and then I find that I know

You go there you're gone forever
I go there I'll lose my way
if we stay here we're not together
Anywhere is

The moon upon the ocean
is swept around in motion
but without ever knowing
the reason for its flowing
in motion on the ocean
the moon still keeps on moving
the waves still keep on waving
and I still keep on going

You go there you're gone forever
I go there I'll lose my way
if we stay here we're not together
Anywhere is

I wonder if the stars sign
the life that is to be mine
and would they let their light shine
enough for me to follow
I look up to the heavens
but night has clouded over
no spark of constellation
no Vela no Orion

The shells upon the warm sands
have taken from their own lands
the echo of their story
but all I hear are low sounds
as pillow words are weaving
and willow waves are leaving
but should I be believing
that I am only dreaming

You go there you're gone forever
I go there I'll lose my way
if we stay here we're not together
Anywhere is

To leave the thread of all time
and let it make a dark line
in hopes that I can still find
the way back to the moment
I took the turn and turned to
begin a new beginning
still looking for the answer
I cannot find the finish
it's either this or that way
it's one way or the other
it should be one direction
it could be on reflection
the turn I have just taken
the turn that I was making
I might be just beginning
I might be near the end.
<<<
----
{{credit{
Enya / The Memory of Trees / 1995
4min 25
Confusingly, 'tribble' is both the test/guest user on this site, and an object. For the object, see [[Tribble]]

For the user: login with password 'guest'
A tribble is what is otherwise known as a Koosh ball (think: a rubber pompom)

They are my advanced pet substitute, and I've owned several over the years. These days I have a collection of perhaps several dozen. 

There are also Virtual Tribbles around the place. 
an object. an item. a THING. 
<<allTags>>
<<cloud>>
<<<
I hear a wind
Whistling air
Whispering in my ear

Boy Mercury shootin' through every degree
OOO girl dancin' down those dirty and dusty trails
Take it hip to hip rocket through the wilderness
Around the world, the trip begins with a kiss

Roam if you want to
Roam around the world
Roam if you want to
Without wings, without wheels
Roam if you want to
Without anything but he love we feel

Skip the air-strip for the sunset
Ride the arrow for the target - One
Take it hip to hip rock it through the wilderness
Around the world the trip begins with a kiss

Roam if you want to
Roam around the world
Roam if you want to
Without wings, without wheels
Roam if you want to
Without anything but he love we feel

Fly the great big sky
See the great big sea
Kick through continents
Bustin' boundaries
Take it hip to hip rock it through the wilderness
Around the world the trip begins with a kiss

Roam if you want to
Roam around the world
Roam if you want to
Without wings, without wheels
Roam if you want to
Without anything but the love we feel

Take it hip to hip
Rocket through the wilderness
<<<
----
{{credit{
The B-52's / Cosmic Thing / 1989
4min 54
}}}
If you take a day off work to make such an archive, that's an IckyWikiPiccieSickie. 
If you leave a note for someone, to remind them to take such a holiday, that would be an IckyWikiPiccieSickieSticky. 
If you take a photo of the note, it's IckyWikiPiccieSickieStickyClicky
If you make a webpage devoted to pages similar to that, which anyone can edit, not only do you get repetitive, you get an IckyWikiPiccieSickieStickyClickyWiki
If you rapidly lick your monitor while such a page is loaded, you have a QuickieLickyIckyWikiPiccieSickieStickyClickyWiki
If you have a picture taken of you performing one of those, you get (even more repetion...) a QuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccie
If you get a building-contractor to take the photo of the above event, he'd be a QuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickie. 
If said building contractor were known for his dishonesty, he'd be a TrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickie. 
If said contractor is wearing Dickie Jeans, his pants are TrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickies

Are we having fun yet? :-) 
And if said contractor went through multiple stores to find just the right Dickie Jeans, you could say they're PickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickies
And if said contractor had just made out with his girlfriend (or boyfriend) whilst wearing those pants and gotten a certain type of red spot on his neck, these spots would be known as PickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickiesHickies
And if he was ejaculated on while getting the hickey you would have a StickyPickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickiesHickies
And if that person who ejaculated hurried as he/she was doing it, they'd be QuickieStickyPickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickiesHickies
And if his girfriend was quite the squirmy girl she is, you'd have a KickyQuickieStickyPickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickiesHickies
And if that girl was Mickey Rooney who had had a sex change operation, they'd be KickyMickeyQuickieStickyPickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickiesHickies
And if she was very choosy, you'd have FinickyKickyMickeyQuickieStickyPickyTrickyQuickyLickyIckyWikiPiccieSickieStickyClickyWikiPiccieBrickieDickiesHickies
I was born at a very early age (see my PersonalAstrology for more information), and have been getting older ever since. 

My aim is to die young, as late as possible. (on an unrelated note, did you know that 40000 days is 109 years, 6 months, 4 days? otherwise known as 2084-10-18 given my birthdate as point of origin) 
''TheList'' is simply for trackkeeping of stuff I'd like to get. Either to get myself when I go and spends me money, or for other people to present it to me on birthdays, christmases, etc. 

Some of this is specific (DVDs). Some isn't (Books, CDs), and it's all pretty random. Stuff that has occured to me when I've been near enough this thing to add it in... Note that items marked "?" are ones I'm not yet certain I want. 

!!DVD / Blu Ray
This list is basically stuff I want to see again enough that I figure it's worth owning.
* B5: Crusade
* Brazil (3 DVD set)
* Donnie Darko 
* Dr Who... maybe
* Escape from LA
* Fifth Element - Ultimate Edition (the 2disc set with special features)
* Gremlins
* Grindhouse (box set with cinema release, plus full releases)
* Jackie Chan (ask if you care, I have preferences I can't be bothered typing in)
* Mind Candy (http://www.mindcandydvd.com/downloads)
* Monty Python (the complete box set with all TV and movies)
* Powers of 10 (http://www.powersof10.com/)
* The Princess Bride
* O Brother, Where Art Thou? (DVD with extras)
* Star Wars trilogy (esp: pre-Special Edition original trilogy)
* The Way Things Go (http://www.firstrunfeatures.com/vid/thewaythingsgo.html)
* The Phantom
* Tron set (so, after Tron2 is out, and maybe after 3, if there is a trilogy...

!!Books
This list, on the other hand, is largely made up of books I've had recommended to me, but have no actually read. 
* A New Kind Of Science
* The Man Who Folded Himself - David Gerrold
* Nightwork: A History of hacks and pranks at MIT. ISBN: 0262661373
* The New York Trilogy - http://www.paulauster.co.uk/thenewyorktrilogy.htm
* The Substance of Style - http://books.slashdot.org/article.pl?sid=03/10/16/1618236
* Oryx and Crake - http://books.slashdot.org/article.pl?sid=04/01/07/174247
* A complete Bloom County Collection
* Giraffes? Giraffes! - http://www.amazon.com/gp/product/0743267265/qid=1137988447/sr=8-1/ref=pd_bbs_1/102-5406753-4331369?n=507846&s=books&v=glance
* A Heartbreaking Work of Staggering Genius - http://www.amazon.com/gp/product/0375725784/qid=1137994604/sr=2-1/102-5406753-4331369?s=books&v=glance&n=283155
* Out of Control - available online here: http://www.kk.org/outofcontrol/index.php
* Paper Pong - http://paperconsole.com/
* Cooking for Geeks

!!CDs
Music is a mix of stuff I know, and stuff I've had recommended
* Jazz... Artists I've had recommended to me include:
** Robbie Williams
** Harry Connick Jnr.
** Glen Miller
** Benny Goodman
** Dizzy Gillespie
** Charlie Parker
* See the list of stuff from [[CDbaby]] that I'm after... :)
* Spiderbait "Shasahvaglava"
* Almost any 'The Goodies' CD
* http://perso.club-internet.fr/fakirpro/movies/esccd.htm
* Muse (any)


''Please note, this list should only be seen as a guide of what I would like, not of what I definatively want, and not what I definitively do not yet have. Consult with me first :)''
Here are my geekcode blocks over the years. Make of them as you will :)
{{{
  -----BEGIN GEEK CODE BLOCK-----Version: 3.12----- #16.Jan.2003
 GO/U>AT$ d- s: a- C++@$ UL++ P+ L++(+++) E-(---) W++ N+(++) o? K w-- O- M->+
 !V PS+ PE Y+ PGP-  t+(--) 5++ X++(-) !R tv b+ DI- D+ G  e* h(---) r++ y+
  ------END GEEK CODE BLOCK------ http://www.geekcode.com/ ------
}}}
{{{
  -----BEGIN GEEK CODE BLOCK-----Version: 3.12----- #14.09.2000
 GIT/CS d-(+) s: a- C++@$ UL++(+++) P+ L++(+++) E- W++ N+ o? K? w+(--) O? M(-)
 V? PS+ PE Y+ PGP- t+ 5++ X+ !R tv(+) b+>++ DI(+) D++ G(+) e(*) h- r>+++ y+
  ------END GEEK CODE BLOCK------ http://www.geekcode.com/ ------
}}}
{{{
  -----BEGIN GEEK CODE BLOCK-----Version: 3.12----- #19.11.98
 GAT d- s: a-- C++(+++)$ UL+ P+ L++ E(+) W++ N+(++) o? K? w(---) O? M(+) V? Y+
 PS(+) PE? PGP- t(+) 5++(+++) X !R tv+(++) b+>++ DI+ D++(+++) G e(*) h r(++) y+
  ------END GEEK CODE BLOCK------ http://www.geekcode.com/ -----
}}}
This is Nemo's political standing, according to http://www.politicalcompass.org


| !Date | !The happenings | !Economic | !Social | !Link |
| Late June 2016| weekend after "Brexit", week before 2016 Double Dissolution Election | -8.5 | -7.59 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-8.5&soc=-7.59]] |
| late Aug 2013| mid campaign before Abbott became PM | -7.5 | -6.46 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-7.5&soc=-6.46]] |
| July 2010| after Gillard became PM, but before the election was called | -6.62 |  -6.97 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-6.62&soc=-6.97]] |
| November 2007| immediately prior to the 2007 Federal Election |  -7.38 | -6.1 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-7.38&soc=-6.1]] |
| September 2005| | -7.75 | -5.44 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-7.75&soc=-5.44]] |
| October 2004| immediately after the 2004 Australian Federal Election | -5.62 | -4.77 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-5.62&soc=-4.77]] |
| January 2004| | -5.25 | -5.38 | [[link|https://www.politicalcompass.org/yourpoliticalcompass?ec=-5.25&soc=-5.38]] |

!!Analysis one
or: ''what this says about me''

On the Economic scale, negative values are left-wing, positive are right-wing. This is approximately the 'traditional' left/right political scale. The Social scale is Libertarian (negative values) through to Authoritarian (positive values).

Thus I am socially libertarian, but not economically. Economically, I have quite strong socialist tendancies -increasing in both facets over the years. The soundbite of my political leanings is "libertarian left"

!!Analysis two
or: ''what this doesn't take into account''

The problem with this, and most (all?) political view systems, is how motivated I am politically by my standing. Some people are very motivated by politics - following it as closely as sports fans follow statistics and careers of their favourite cricketers, footballers and teams. Alternatively, some people care not about sport - or politics at all. I care enough to glance at the newspaper headlines from time to time, and see what the score is after the big matches. This is true for both sport and politics. So whilst I lean to a relatively extreme libertarian left position, I do not find it a politically motivating position regardless.

!!Analysis three (2010)
or: ''long term trends''

I think it's fair to say that I'm trending slowly towards more social libertarianism all the time, but my economics seem to be stabilising at around the -6.5 to -7 mark. Additionally, since my writeup of Analysis two (probably written in 2003), I've become more politically aware and slightly more politically motivated. Much of that? Maybe, maybe not, but a little bit at least, yeah.

!!Analysis four (2016)
or ''timewarp: a jump to the left''

What's happened here? So much for stabilising view. Perhaps it's because I gave many more 'strongly' agree/disagree results this time around. I'm not sure if that's because of views solidifying as I age, or reaction to more recent events - Abbot/Turnbull, Trump, Brexit...

[[crowd chart|https://www.politicalcompass.org/crowdchart?0813=-7.5%2C-6.46&0710=-6.62%2C-6.97&1107=-7.38%2C-6.1&0905=-7.75%2C-5.44&1004=-5.62%2C-4.77&0104=-5.25%2C-5.38&name=0616&ec=-8.5&soc=-7.59]]:
[IMG[https://www.politicalcompass.org/charts/crowdchart?0813=-7.5%2C-6.46&0710=-6.62%2C-6.97&1107=-7.38%2C-6.1&0905=-7.75%2C-5.44&1004=-5.62%2C-4.77&0104=-5.25%2C-5.38&name=0616&ec=-8.5&soc=-7.59]]
Starting with 1993, I have tracked each year with a song. Usually choosing the song earlier in the year, with it representing where the year is going, and where I hope it will go. 

The songs are picked more by instinct and emotive feel than any logic. 

!!Pre-1993: ...
These are two songs I learnt very young, and which remind me of my youth. I have retroactively placed those songs here... 
!!!Time Warp (from The Rocky Horror Show)
The Time Warp, perhaps approriately, is my earliest musical and dance memory. My brother teaching me the idea of the dance steps when it was a hit. ...I was perhaps 4 or 5? This song is still a singing and dancefloor trump song for me, getting me up every time. Indeed, if theGeekCode had a RHPS section, I would probably be 'RHPS+' (knows and likes RHPS, even knows some of the callbacks, has helped initiated at least one RHPS virgin).
<<slider chkTimeWarp "Time Warp" "Lyrics to the Time Warp" "Time Warp (Rocky Horror)">>
!!!Vincent (Don McLean)
I was taught Vincent in primary school - I must have only been about 8 or 9. Everyone in the class drew a crayon picture representing a line of imagery from the song, and then we sung it to the school with our pictures as a show.

Sadly, I've lost the image I drew. I only remember it had alot of yellow in it!

I've always remembered the song though - and grown to love it. It's possibly the first song that I learnt in full (discounting nursery rhymes and church hymns). So Seeing as it reminds me of my youth, it seems perfectly appropriate as my song for pre-1992.
<<slider chkVincent Vincent "Lyrics to Vincent" "Vincent (Don McLean)">>
Alongside Timewarp and Vincent, I admit to a fondness for the Bee Gee's "Stayin' Alive" as a vague childhood memory also.
!!!Lean on Me (Bill Withers)
This was the song that my year chose to be the song we sang at our high school graduation (I graduated in 1992, noting here for Northern Hemispherians that the Australian school year is synchronous with the calendar year). I have to concede, some years later, that this song does always remind me of those latter highschool years...
<<slider chkLeanOnMe "Lean On Me" "Lyrics to Lean On Me" "Lean On Me (Bill Withers)">>

!!1993: And So It Goes (Billy Joel)
This was the song that started my "songs of the years" tradition, though I didn't know it at the time.

Originally, I just transcribed the lyrics into my 1993 diary because as well as just liking the poetry of the song in it's own right, it had caught my ear and heart (of Vanessa, a highschool crush)

Because of this, the song became attached to 1993 in my mind..
<<slider chkAndSoItGoes "And So It Goes" "Lyrics to And So It Goes" "And So It Goes (Billy Joel)">>

!!1994: Blackbird (The Beatles)
For my 1994 diary, I decided to continue the 1993 tradition, and transcribe another song. 

Blackbird seemed to fit a similar mood/style as And So It Goes - verging more to lyricise on growth and 'becoming' however - and so it became 1994's song. 
<<slider chkBlackbird "Blackbird" "Lyrics to Blackbird" "Blackbird (The Beatles)">>

!!1995: The River of Dreams (Billy Joel)
So by 1995 I had formalised the idea of choosing a song for a year. I was also changing my life in a few ways.

In the first few months of the year, I moved out of home, and found the BBS's. Together, these changed my social life, and I was trying to look up and around the world a little more. 

The River of Dreams seemed uplifting and the style fit
<<slider chkTheRiverOfDreams "The River of Dreams" "Lyrics to The River of Dreams" "The River of Dreams (Billy Joel)">>

!!1996: In my life (The Beatles)
In late 1995 my heart was tugged, and again in early 1996. I don't know at what point I chose this song to be for this year, but I do remember I'd taken a memory trip through my old primary and high schools, and that was an influence.

I guess I wanted the song for 1996 to represent that I was starting to learn matters of the heart, but also to not forget what I had already lived and learnt. It turned out to be quite appropriate. I began dating Amanda sometime between August and November this year. (the beginning of our relationship was never quite set to a given date, for reasons I wont go into here! :)
<<slider chkInMyLife "In My Life" "Lyrics to In My Life" "In My Life (The Beatles)">>

!!1997: Hand in my Pocket (Alanis Morrisette)
1997's song was chosen very early in 1997. I remember being in Brisbane for the Christmas/NewYear holiday. I think I was listening to Alanis specifically because Anita - an online friend for several years by this time - had dedicated "Head over Feet" to me. (I hope I have my chronology correct here!)

This song struck me and I think I was even brought to tears listening to it once. That would have been when I decided it to be the song for 1997. I think the timing of that would have been the first week of the year or so. Not bad given that by this stage, I'd prettymuch formalised choosing the song for the year by my birthday (mid April).

1996 was the last year I studied at university, so when I chose this song I was probably in a state of some depression, trying to decide what to do with my life. Continue university? Or leave and try for something else... something better? Hand in my Pocket seemed to fit one of my life philosophies... that everything will ultimately work out fine (fine fine!)
<<slider chkHandInMyPocket "Hand in My Pocket" "Lyrics to Hand in My Pocket" "Hand in My Pocket (Alanis Morissette)">>

!!1998: ...
!!!Truth/Lies And Fear Of Death + Endless Relentless (Def FX)
I started this year wanting to define myself a little clearer. I'd been with Amanda in a "steady" relationship for over a year - my first real relationship. I wanted to ensure I wasn't losing the feel of my own identity. Somehow, Truth/Lies seemed to aim for that. Probably that line, "''Everything that's been, everything that will be, is right here inside me''". 
Endless Relentless is the following track on the CD, but is little more than a long (2:17) instrumental fade out from Truth/Lies. 
<<slider chkTruthLiesEtc "Truth/Lies and Fear of Death" "Lyrics to Truth/Lies and Fear of Death" "Truth/Lies and Fear of Death (Def FX)">>
As relevant as a song of identity was to me, it didn't last in it's hold, and I chose another song later in the year... And so it was that I gained my song for the decade...
!!!Summer, Highland Falls (Billy Joel)
I'd toyed with the idea of a "song for the decade" for a while, and Summer, Highland Falls was the only song on the shortlist. It is still one of my favourite songs ever. (I love the questions of duality and contrast in the song. (see my somewhat autobiographical "[[shadow|Untitled (Shadow)]]" poem for more duality and contrast) So, in late 1998 - perhaps around August or so, I christened this song as my second song for the year, and also as the song for the decade
* ''It's either sadness or euphoria...''
<<slider chkSummerHighlandFalls "Summer, Highland Falls" "Lyrics to Summer, Highland Falls" "Summer, Highland Falls (Billy Joel)">>

!!1999: I Can See Clearly Now (Johnny Nash)
In late 1998 things between Amanda and I were quite sour. And then early 1999 they were unclear as to our position.

At the time of choosing, I felt like life was picking up though. I wanted 1999 to be a year of change (kind of a familiar theme huh?). Amanda and I resolved ourselves and were together till after the years end.

Other factors too (for example, work at Goldweb - we got a real office in August) changed and still held this song to a very real appropriateness.
<<slider chkICanSeeClearlyNow "I Can See Clearly Now" "Lyrics to I Can See Clearly Now" "I Can See Clearly Now (Johnny Nash)">>

!!2000: Anywhere Is (Enya) 
At the time I chose this song, I would have sworn blind that the album it came from (Memory of the Trees) was recommended to me by Jacy. And I'd even have been pretty sure it was recommended for this song.

Manda and I ended our 3+ year relationship sometime in March, and from memory, I finalised this song for me sometime just before my birthday. The line "I might be just beginning, I might be near the end" seemed especially poignant.

'''After''' I'd chosen this song for 2000, Jacy planned her visit, and even though she doesn't recall recommending the song or album to me, I still think it's extremely fitting.

After Jacy's visit, I did considered a second song for 2000 - Crowded House' [[Distant Sun]] seemed the prime contender. But it was too specific to an "incident" rather than trying to encompass the entire year. //Anywhere Is// was indeed the perfect choice for 2000
<<slider chkAnywhereIs "Anywhere Is" "Lyrics to Anywhere Is" "Anywhere Is (Enya)">>

!!2001: Roam (The B-52s)
2001 - finally, noone can argue that we're in the new millennium. Not even the [[pedants|http://www.douglasadams.com/dna/pedants.html]]!

There were a few songs that I considered - Two by Crowded House; [[Distant Sun]] and [[Together Alone]]. And whilst both have their "Crowded House moments" in my mind, they were a little too specific in meaning and implication to be a "year" song. 

A new millennium is a time for change however. A time for travel. A time to roam! And so in 2001 I traveled abroad for the first time - to [[New York City]]!

Plus, Roam is a fun song - always a bonus :)
<<slider chkRoam "Roam" "Lyrics to Roam" "Roam (The B-52s)">>

!!2002: Those Were the days (English text by Gene Raskin)
This song didn't even occur to me as a year song till only the week before my birthday, and I didn't finalise the choice till the week after my birthday. So much for the deadline!

No matter. In the week before my birthday, I had a bout of "getting old" sadness. Not long lasting, but hard and fast nonetheless. This song came out of that, and even though I was quickly feeling better, the song remains. 

I'm not entirely sure if I'm looking upon it as the days I've already lived, or that these are the days I'll look back on... probably both you know. It's kinda like that.

Incidentally, read up some [[history of the song|http://homepage.ntlworld.com/pat.richmonds/mhfs.htm]]
<<slider chkThoseWereTheDays "Those Were the Days" "Lyrics to Those Were the Days" "Those Were the Days (Gene Raskin)">>

!!2003: The Best Thing (Boom Crash Opera)
2003 - not everything is perfect, but things seem to be genuinly sorting themselves out for the better. For the best?

I didn't get this song chosen till mid May... in fact, I don't think I ever really started looking till my birthday - normally the deadline for this!

I can't think of many songs that are as unashamedly upbeat in both style and lyrics, and although the lyrics appear to address a person directly - that doesn't match for my usage as song of the year, since Terri and I broke up in 2003 - a split which had been slowly building since earlier in the year. Nonetheless it was a good year (neither because of or despite of that split). Rather, the song is indicative of my general growth as a person and increasing comfort in my own skin and love of the world. 
<<slider chkTheBestThing "The Best Thing" "Lyrics to The Best Thing" "The Best Thing (Boom Crash Opera)">>

!!2004: Zebra (John Butler Trio)
A song of contrasts, of opposites... and a song of potential. 
* ''I can be anything i put my mind to man, all i gotta do is give myself half a chance''
I think that about sums the sentiment here up really. This is a song I can groove to. It wasn't chosen till late in May, I went through a run of possible songs through most of April, but came up short. This one hit me in a single afternoon.
<<slider chkZebra "Zebra" "Lyrics to Zebra" "Zebra (John Butler Trio)">>

!!2005: ...
!!!Everybody's Talking (Fred Neil)
meloncholy, but with a traveling and improving theme...
<<slider chkEverybodysTalking "Everybody's Talking" "Lyrics to Everybody's Talking" "Everybody's Talking (Fred Neil)">>
!!!Singin' in the Rain (The Hollywood Revue of 1929)
...to improvement, cos this is just bouncy!
<<slider chkSingingInTheRain "Singin' in the Rain" "Lyrics to Singin' In the Rain" "Singin' in the Rain (The Hollywood Revue of 1929)">>

!!2006: Time is a Tempest (Cloudstreet)
This struck me as melancholy reminder that we are all part of so much bigger...
<<slider chkTimeIsATempest "Time is a Tempest" "Lyrics to Time is a Tempest" "Time is a Tempest (Cloudstreet)">>

!!2007: I Like Giants (Kimya Dawson)
A more upbeat continuation of the same reminders and themes
<<slider chkILikeGiants "I Like Giants" "Lyrics to I Like Giants" "I Like Giants (Kimya Dawson)">>

!!2008: Here I stand (Rafe Morris)
* ''...and if you're not having fun then you're having no fun, and if you're having no fun you're not good to no one...''
* ''...time moves slowly, but ads up so quickly, and if you listen, you can hear it tick tick tick  tick tick tick...''
<<slider chkHereIStand "Here I Stand" "Lyrics to Here I Stand" "Here I Stand (Rafe Morris)">>

!!2009: A Change Would Do You Good (Sheryl Crow)
Moving to Brisbane... decided early in the year after several months private and public consideration... and in the end, this song kept popping up!
<<slider chkAChangeWouldDoYouGood "A Change Would do you Good" "Lyrics to A Change Would Do You Good" "A Change Would Do You Good (Sheryl Crow)">>

!!2010: Do What You Want (OK GO)
The videoclip first captured me. But the lyrics made it work and stick. In 2010 I got a place by myself and am able to more easily move towards my own goals... all I need to do is do what I want...
<<slider chkDoWhatYouWant "Do What You Want" "Lyrics to Do What You Want" "Do What You Want (OK GO)">>

!!2011: ???
need to check notebooks to see if I have any song noted. Perhaps Muse - Starlight?

!!2012: ???
I didn't formally choose one. Themes were growing older, formalising things with Nerissa, and house purchasing - so a few songs I had noted were
* Rock n Roll best years of my life
* Easy Beats - My Life
* David Myles - Simple Pleasures
* Something to talk about
* Our House
* Caravan in the Hills

!!2013: ...
!!!Eclipse (The Beta Band)
For the lyrics
!!!The Doctor Who Theme
Because I watched all 50 years of Who this year. It was a big part of how I spent the year!

!!2014: I've been Wrong Before (Abney Park)
The lryics seemed to suit. A reminder that life is uncertainty and one needs to learn from mistakes. (not that I had any big/notable ones. Just a general reminder)

!!2015: ...
Between April and July 2015, Topaz and Follow your Bliss were in mind as suiting. I had thought they had already been year songs, so I dismissed the thought. Upon discovering Observer Destroyer (thanks 4zzz), I got obsessed with it, then discovered the B52s tracks were not previously year songs. So what the hell. Let's have them all! Nearly 30 minutes of mostly instrumental lovely. Best order: Observer - Topaz - Bliss. 
!!!Observer Destroyer (The Jimmy Cake)
* Observatory Destroyer - https://www.youtube.com/watch?v=ckx27MC94A4
!!!Topaz/Follow Your Bliss (The B-52s)
* Topaz + Follow your Bliss - https://www.youtube.com/watch?v=3-C0D0I3ZTY
<<sectionTOC>>
<<<
It's astounding, time is fleeting
Madness takes its toll
But listen closely - not for very much longer
I've got to keep control

I remember doing the Time Warp
Drinking those moments when
The blackness would hit me - and the void would be calling
Let's do the time warp again...
Let's do the time warp again!

It's just a jump to the left
And then a step to the right
Put your hands on your hips
You bring your knees in tight
But it's the pelvic thrust
that really drives you insane,
Let's do the Time Warp again!
Let's do the Time Warp again!

It's so dreamy, oh fantasy free me
So you can't see me, no no no not at all
In another dimension, with voyeuristic intention
Well-secluded, I see all
With a bit of a mind flip
You're there in the time slip
And nothing can ever be the same
You're spaced out on sensation - like you're under sedation
Let's do the Time Warp again!

Well I was walking down the street just a-having a think
When a snake of a guy gave me an evil wink
He shook me up, he took me by surprise
He had a pickup truck and the devil's eyes.
He stared at me and I felt a change
Time meant nothing, never would again
Let's do the Time Warp again!
<<<
----
{{credit{
Richard O'Brien / Rocky Horror Show / 1973
4min 29 / Best known from The Rocky Horror Picture Show 
}}}
<<<
And there you are - with all the answers for me
You lift me up better than anything
And if you wanted to, you could ignore me
But my soul would keep on looking
I like that - 'cause it makes me see
There's more than these blood and bones to me
Everything that's been, everything that will be
Is right here inside me

Truth, lies and fear of death

The truth that changes
Is denied by those that cling to truths predetermined
That mould, control through fear
From mouths filled with answers
Full of lies and empty dreams
Who let the limits of understanding
Explain everything, it seems
The quest for a saviour
And the worship of all unknown
Limits the understanding to why
Because and when
When words are twisted and turned to saturation
New narration, old translation masks the selfish lie

Truth, lies and fear of death

Fear of life after death you resolve
Through fear you create and control
Blind obedience carries us through
Waiting to be judged at death

Smash the smoke screen
Break through the vacuum seal
Ignore the writing on the wall
Ignore but understand the empty promise
Unfulfilled...
What a powerful seduction
Through blackmail and deceit of trust
The future is more certain

Truth, lies and fear of death
<<<
----
{{credit{
Def FX / Ritual Eternal / 1995
3min 30 / Follows into the instrumental //Endless Relentless//
/***
|Name|SectionLinksPlugin|
|Source|http://www.TiddlyTools.com/#SectionLinksPlugin|
|Documentation|http://www.TiddlyTools.com/#SectionLinksPlugin|
|Version|1.3.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|allow tiddler sections in TiddlyLinks to be used as anchor points|
This plugin enhances the processing of section references they can be used in links to auto-scroll to the indicated heading within a tiddler (i.e., similar to the 'anchor' behavior provided in HTML by {{{<a name="foo">}}} and {{{<a href="#foo">...</a>}}})
!!!Usage
<<<
!!!!!{{{<<tiddler>>}}} macro 
>The {{{<<tiddler SomeTiddler##SomeSection>>}}} syntax has been extended so that if the tiddler title is omitted or the 'here' keyword is used (e.g., {{{<<tiddler ##SomeSection>>}}} or {{{<<tiddler here##SomeSection>>}}}), then the current containing tiddler is implied by default.
!!!!!~TiddlyLink syntax
>the standard link syntax has been extended so that a section name can included in a tiddler link (e.g., {{{[[SomeTiddler##SomeSection]]}}}).  When clicked, the tiddler is displayed and the specified section heading will be automatically scrolled into view. If the tiddler title is omitted or the 'here' keyword is used (e.g., {{{[[##SomeSection]]}}} or {{{[[here##SomeSection]]>>}}}), then the current containing tiddler is implied by default.
!!!!!"""<<sectionTOC>>""" macro
>This macro generates a 'Table of Contents'-style numbered-bullet list with links to all sections within the current tiddler.  Simply place the following macro at the //end of the tiddler content// (i.e., following all section headings):
{{{
<<sectionTOC>> or <<sectionTOC className>>
}}}
>Note: The macro must occur at the end of the tiddler in order to locate the rendered section headings that precede it. In addition, to position the macro's //output// within the tiddler, you must create a special 'target element' that uses a specified classname (default='sectionTOC'), like this:
{{{
{{sectionTOC{}}}
}}}
>When the {{{<<sectionTOC>>}}} macro is rendered, it will find the matching 'sectionTOC'-classed element and writes it's output there.  You can also add the macro and/or target elements directly to the [[ViewTemplate]] definition, so that every tiddler can automatically display the table of contents:
{{{
<span class='sectionTOC'></span> <!-- target element -->
...
<span macro='sectionTOC'></span> <!-- must be at end of tiddler -->
}}}
<<<
!!!Revisions
<<<
2009.08.02 [1.3.1] in sectionTOC.handler(), trim leading/trailing whitespace from generated section links
2009.08.01 [1.3.0] in scrollToSection(), apply 3-tier section matching (exact, startsWith, contains)
2009.07.06 [1.2.2] fixed displayTiddler() hijack
2009.07.03 [1.2.1] in {{{<<sectionTOC>>}}}, suppress output if target is not found
2009.06.02 [1.2.0] added support for 'here' keyword in {{{[[here##section]]}}} links and {{{<<tiddler here##section>>}}} macro
2009.04.09 [1.1.1] in sectionTOC macro, make target visible when TOC is rendered.
2009.01.18 [1.1.0] added {{{<<sectionTOC>>}}} macro to generate numbered-bullet links to sections of current tiddler
2009.01.06 [1.0.0] converted to stand-alone plugin
2008.10.14 [0.0.0] initial release (as [[CoreTweaks]] #784 - http://trac.tiddlywiki.org/ticket/784)
<<<
!!!Code
***/
//{{{
version.extensions.SectionLinksPlugin= {major: 1, minor: 3, revision: 1, date: new Date(2009,8,2)};

Story.prototype.scrollToSection = function(title,section) {
	if (!title||!section) return; var t=this.getTiddler(title); if (!t) return null;
	var elems=t.getElementsByTagName('*'); var heads=[];
	for (var i=0; i<elems.length; i++)
		if (['H1','H2','H3','H4','H5'].contains(elems[i].nodeName)) heads.push(elems[i]);
	for (var i=0; i<heads.length; i++)
		if (getPlainText(heads[i]).trim()==section) break;
	if (i==heads.length) for (var i=0; i<heads.length; i++)
		if (getPlainText(heads[i]).trim().startsWith(section)) break;
	if (i==heads.length) for (var i=0; i<heads.length; i++)
		if (getPlainText(heads[i]).trim().indexOf(section)!=-1) break;
	if (i<heads.length) { var h=heads[i];
		// if section heading is collapsed, click to expand it - see [[FoldHeadingsPlugin]]
		if (hasClass(h,'foldable') && h.nextSibling.style.display=='none') h.onclick();
		// scroll *after* tiddler animation
		var delay=config.options.chkAnimate?config.animDuration+100:0;
		setTimeout('window.scrollTo('+findPosX(h)+','+findPosY(h)+')',delay);
		return h;
	}
}
//}}}
/***
!!!!core hijacks
***/
/***
!!!!!createTiddlyLink
***/
//{{{
// [[tiddlername##section]] and [[##section]]
window.createTiddlyLink_sectionanchor=window.createTiddlyLink;
window.createTiddlyLink=function(place,title) {
	var t=story.findContainingTiddler(place); var tid=t?t.getAttribute('tiddler'):'';
	var parts=title.split(config.textPrimitives.sectionSeparator);
	if (!parts[0].length || parts[0].toLowerCase()=='here') parts[0]=tid;  // default=current tiddler
	if (parts[1]) arguments[1]=parts[0]; // trim section from tiddler title
	var btn=createTiddlyLink_sectionanchor.apply(this,arguments);
	btn.setAttribute('tiddlyLink',parts[0]);
	if (parts[1]) btn.setAttribute('section',parts[1]); // save section
	return btn;
}
//}}}
/***
!!!!!onClickTiddlerLink
***/
//{{{
window.onClickTiddlerLink_sectionanchor=window.onClickTiddlerLink;
window.onClickTiddlerLink=function(ev) {
	var e=ev||window.event;	var target=resolveTarget(e); var title=null;
	while (target!=null && title==null) {
		title=target.getAttribute('tiddlyLink');
		section=target.getAttribute('section');
		target=target.parentNode;
	} 
	var t=story.findContainingTiddler(target); var tid=t?t.getAttribute('tiddler'):'';
	if (title!=tid||!section) onClickTiddlerLink_sectionanchor.apply(this,arguments); // avoid excess scrolling
	story.scrollToSection(title,section);
	return false;
}
//}}}
/***
!!!!! displayTiddler
***/
//{{{
Story.prototype.displayTiddler_sectionanchor=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var parts=title.split(config.textPrimitives.sectionSeparator);
	if (!parts[0].length || parts[0].toLowerCase()=='here') {
		var t=story.findContainingTiddler(place);
		parts[0]=t?t.getAttribute('tiddler'):'';
	}
	arguments[1]=parts[0];  // default=current tiddler
	this.displayTiddler_sectionanchor.apply(this,arguments);
	story.scrollToSection(parts[0],parts[1]);
}
//}}}
/***
!!!!!isExternalLink
***/
//{{{
config.formatterHelpers.isExternalLink_sectionanchor=config.formatterHelpers.isExternalLink;
config.formatterHelpers.isExternalLink=function(link) {
	if (link.indexOf(config.textPrimitives.sectionSeparator)!=-1) return false;
	return config.formatterHelpers.isExternalLink_sectionanchor.apply(this,arguments);
}
//}}}
/***
!!!!!tiddler.handler
***/
//{{{
config.macros.tiddler.handler_section=config.macros.tiddler.handler;
config.macros.tiddler.handler=function(place,macroName,params,wikifier,paramString,tiddler)
{
	if (!params[0]) return;
	var sep=config.textPrimitives.sectionSeparator;
	var parts=params[0].split(sep); var tid=parts[0]; var sec=parts[1];
	if ((tid.toLowerCase()=='here'||!tid.length) && sec) { // fixup for 'here##section' and '##section'
		var here=story.findContainingTiddler(place)
		var tid=here?here.getAttribute('tiddler'):tiddler?tiddler.title:'';
		arguments[2][0]=tid+sep+sec;
		arguments[4]=paramString.replace(new RegExp('(here)?'+sep+sec),tid+sep+sec);
	}
	config.macros.tiddler.handler_section.apply(this,arguments);
}
//}}}
/***
!!!!sectionTOC macro
***/
//{{{
config.macros.sectionTOC = {
	targetClass: 'sectionTOC',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var out=[];
		var targetClass=params[0]||this.targetClass;
		var t=story.findContainingTiddler(place); if (!t) return;
		var elems=t.getElementsByTagName('*');
		var level=5; // topmost heading level
		for (var i=0; i<elems.length; i++) {
			var txt=getPlainText(elems[i]).trim();
			var link='[['+txt+'|##'+txt+']]';
			switch(elems[i].nodeName) {
				case 'H1': out.push('#'+link);		level=1; break;
				case 'H2': out.push('##'+link);		level=level<2?level:2; break;
				case 'H3': out.push('###'+link);	level=level<3?level:3; break;
				case 'H4': out.push('####'+link);	level=level<4?level:4; break;
				case 'H5': out.push('#####'+link);	level=level<5?level:5; break;
				default: if (hasClass(elems[i],targetClass)) var target=elems[i];
			}
		}
		// trim excess bullet levels
		if (level>1) for (var i=0; i<out.length; i++) out[i]=out[i].substr(level-1);
		// show numbered list
		if (out.length && target) {
			if (target.style.display=='none') target.style.display='block';
			wikify(out.join('\n'),target);
		}
	}
}
//}}}
/***
!!!Invoke macro
{{{
<<sectionTOC>>
}}}
***/
// //<<sectionTOC>>
<<<
Starry, starry night
Paint your palette blue and gray
Look out on a summer's day
With eyes that know the darkness in my soul...

Shadows on the hills
Sketch the trees and the daffodils
Catch the breeze and the winter chills
In colors on the snowy linen land.

Now I understand
What you tried to say, to me
And how you suffered for your sanity
And how you tried to set them free:
They would not listen; they did not know how --
Perhaps they'll listen now.

Starry, starry night
Flaming flowers that brightly blaze
Swirling clouds in violet haze

Reflect in Vincent's eyes of china blue
Colors changing hue
Morning fields of amber grain
Weathered faces lined in pain
Are soothed beneath the artist's loving hand.

Now I understand
What you tried to say, to me
And how you suffered for your sanity
And how you tried to set them free:
They would not listen; they did not know how--
Perhaps they'll listen now.

For they could not love you
But still, your love was true
And when no hope was left inside
On that starry, starry night
You took your life as lovers often do--
But I could've told you, Vincent:
This world was never meant
For one as beautiful as you.

Starry, Starry night
Portraits hung in empty halls
Frameless heads on nameless walls
With eyes that watch the world and can't forget
Like the strangers that you've met
The ragged men in ragged clothes
The silver thorn, a bloody rose
Lie crushed and broken on the virgin snow.

Now I think I know
What you tried to say, to me
And how you suffered for your sanity
And how you tried to set them free:
They would not listen; they're not listening still--
Perhaps they never will.
<<<
----
{{credit{
Don McLean / American Pie / 1971
4min 03
<<<
In every heart there is a room
A sanctuary safe and strong
To heal the wounds from lovers past
Until a new one comes along

I spoke to you in cautious tones
You answered me with no pretense
And still I feel I said too much
My silence is my self defense

And every time I've held a rose
It seems I only felt the thorns
And so it goes, and so it goes
And so will you soon I suppose

But if my silence made you leave
Then that would be my worst mistake
So I will share this room with you
And you can have this heart to break

And this is why my eyes are closed
It's just as well for all I've seen
And so it goes, and so it goes
And you're the only one who knows

So I would choose to be with you
That's if the choice were mine to make
But you can make decisions too
And you can have this heart to break

And so it goes, and so it goes
And you're the only one who knows
<<<
----
{{credit{
Billy Joel / Storm Front /1990
3min 38
*  Internet Relay Chat (official)
* Irrelevant, Repetitive Conversation (especially #slashdot on SlashNet)
* IRC Recursive Chat (the GNU definition ;)
* Idle Rather than Chat (also applicable to #slashdot) 
SlashNet is an [[IRC]] network spawned from Slashdot, but otherwise unrelated these days. 

Amongst other attrocities, SlashNet hosts the #[[afda]] channel.

http://www.slashnet.org
''alt.fan.douglas-adams''
* %afda is the [[usenet froup|http://groups.google.com/groups?q=alt.fan.douglas-adams]]
* #afda is the [[IRC]] channel on [[SlashNet]]
* +afda is the Google+ huddle. (It's not unlike the #afda but even quieter)
* ~afda or ^afda is the (bitrotting) [[website|http://www.zootle.net/afda/]].
* ?afda is the FAQ (long unmaintained)
* &afda or *afda is the whole afda experience!
* /r/afda is the subreddit (originally [[/r/alt_fan_douglas_adams|http://www.reddit.com/r/alt_fan_doulas_adams]] but now [[/r/afda|http://www.reddit.com/r/afda]])
''Become an afdaniain today and impress your friends!''
[[Original thread discussing this naming scheme|http://groups.google.com/groups?hl=en&th=5b82fddfe16f242a&seekm=383AAEA0.C2606F18]]
----
* afda is the source of [[ISFN|http://wiki.thorx.net/wiki/ISFN]]
----
As there is no page specifically for #afda, info goes here:
* Special words used in #afda (and hopefully other places): [[Lexicon|http://wiki.thorx.net/wiki/Lexicon]]
<<<
I can see clearly now, the rain is gone,
I can see all obstacles in my way
Gone are the dark clouds that had me blind
It's gonna be a bright (bright), bright (bright)
~Sun-Shiny day.
It's gonna be a bright (bright), bright (bright)
~Sun-Shiny day.

I think I can make it now, the pain is gone
All of the bad feelings have disappeared
Here is the rainbow I've been prayin' for
It's gonna be a bright (bright), bright (bright)
~Sun-Shiny day.

Look all around, there's nothin' but blue skies
Look straight ahead, nothin' but blue skies

I can see clearly now, the rain is gone,
I can see all obstacles in my way
Gone are the dark clouds that had me blind
It's gonna be a bright (bright), bright (bright)
~Sun-Shiny day.
It's gonna be a bright (bright), bright (bright)
~Sun-Shiny day.
It's gonna be a bright (bright), bright (bright)
~Sun-Shiny day.
<<<
{{credit{
Johnny Nash / I Can See Clearly Now / 1972
2min 45
}}}
<<<
There are places I'll remember
All my life though some have changed
Some forever not for better
Some have gone and some remain
All these places have their moments
With lovers and friends I still can recall
Some are dead and some are living
In my life I've loved them all

But of all these friends and lovers
There is no one compares with you
And these memories lose their meaning
When I think of love as something new
Though I know I'll never lose affection
For people and things that went before
I know I'll often stop and think about them
In my life I love you more

Though I know I'll never lose affection
For people and things that went before
I know I'll often stop and think about them
In my life I love you more
In my life I love you more
<<<
----
{{credit{
The Beatles / Rubber Soul / 1965
2min 28
<<<
Once upon a time there was a tavern,
Where we used to raise a glass or two.
Remember how we laughed away the hours,
think of all the great things we would do.

Those were the days my friend,
We thought they'd never end,
We'd sing and dance for-ever and a day,
We'd live the life we choose,
We'd fight and never lose,
For we were young and sure to have our way.
Lalala lah lala, lalala lah lala
Those were the days, oh yes, those were the days.

Then the busy years went rushing by us.
We lost our starry notions on the way.
If by chance I'd see you in the tavern,
We'd smile at one another and we'd say:

Just tonight I stood before the tavern,
Nothing seemed the way it used to be.
In the glass I saw a strange reflection,
Was that lonely woman really me.

Through the door there came familiar laughter.
I saw your face and heard you call my name.
Oh, my friend, we're older but no wiser,
For in our hearts the dreams are still the same
<<<
----
{{credit{
Mary Hopkin (english lyrics by Gene Raskin) / single / 1968
5min 05
}}}
The meaning of life, the universe, and everything

Also: What do you get if you multiply 6 by 7?

Remember, nobody writes jokes in base 13. 
<<<
Blackbird singing in the dead of night
Take these broken wings and learn to fly
All your life
You were only waiting for this moment to arise.

Blackbird singing in the dead of night
Take these sunken eyes and learn to see
All your life
You were only waiting for this moment to be free.

Blackbird fly Blackbird fly
Into the light of the dark black night.
Blackbird fly Blackbird fly
Into the light of the dark black night.

Blackbird singing in the dead of night
Take these broken wings and learn to fly
All your life
You were only waiting for this moment to arise
You were only waiting for this moment to arise
You were only waiting for this moment to arise.
<<<
----
{{credit{
The Beatles / The Beatles (The White Album) / 1968
2min 18
}}}
<<<
In the middle of the night
I go walking in my sleep
From the mountains of faith
To a river so deep
I must be looking for something
Something sacred I lost
But the river is wide
And it's too hard to cross

And even though I know the river is wide
I walk down every evening and I stand on the shore
And try to cross to the opposite side
So I can finally find out what I've been looking for

In the middle of the night
I go walking in my sleep
Through the valley of fear
To a river so deep
And I've been searching for something
Taken out of my soul
Something I would never lose
Something somebody stole

I don't know why I go walking at night
But now I'm tired and I don't want to walk anymore
I hope it doesn't take the rest of my life
Until I find what it is that I've been looking for

In the middle of the night
I go walking in my sleep
Through the jungle of doubt
To a river so deep
I know I'm searching for something
Something so undefined
That it can only be seen
By the eyes of the blind
In the middle of the night

I'm not sure about a life after this
God knows I've never been a spiritual man
Baptized by the fire, I wade into the river
That runs to the promised land

In the middle of the night
I go walking in my sleep
Though the desert of truth
To the river so deep
We all end in the ocean
We all start in the streams
We're all carried along
By the river of dreams
In the middle of the night
<<<
----
{{credit{
Billy Joel / River of Dreams / 1993
4min 05
}}}
<<<
Nothing is random, nor will anything ever be, whether a long string of perfectly blue days that begin and end in golden dimness, the most seemingly chaotic political acts, the rise of a great city, the crystalline structure of a gem that has never seen the light, the distributions of fortune, what time the milkman gets up, the position of the electron, or the occurrence of one astonishingly frigid winter after another.

Even electrons, supposedly the paragons of unpredictability, are tame and obsequious little creatures that rush around at the speed of light, going precisely where they are supposed to go. They make faint whistling sounds that when apprehended in varying combinations are as pleasant as the wind flying through a forest, and they do exactly as they are told. Of this, one can be certain.

And yet there is a wonderful anarchy, in that the milkman chooses when to arise, the rat picks the tunnel into which he will dive when the subway comes rushing down the track from Borough Hall, and the snowflake will fall as it will. How can this be? If nothing is random, and everything is predetermined, how can there be free will? The answer to that is simple.

Nothing is predetermined; it is determined, or was determined, or will be determined. No matter, it all happened at once, in less than an instant, and time was invented because we cannot comprehend in one glance the enormous and detailed canvas that we have been given - so we track it, in linear fashion, piece by piece. Time, however, can be easily overcome; not by chasing light, but by standing back far enough to see it all at once.

The universe is still and complete. Everything that ever was, is; everything that ever will be, is - and so on, in all possible combinations. Though in perceiving it we imagine that it is in motion, and unfinished, it is quite finished and quite astonishingly beautiful.

In the end, or rather, as things really are, any event, no matter how small, is intimately and sensibly tied to all others. All rivers run full to the sea; those who are apart are brought together; the lost ones are redeemed; the dead come back to life; the perfectly blue days that have begun and ended in golden dimness continue, immobile and accessible; and, when all is perceived in such a way as to obviate time, justice becomes apparent not as something that will be, but as something that is.
<<<
----
{{credit{
Mark Helprin
A Winter's Tale
}}}
<<<
I'm broke but I'm happy
I'm poor but I'm kind
I'm short but I'm healthy, yeah
I'm high but I'm grounded
I'm sane but I'm overwhelmed
I'm lost but I'm hopeful baby
What it all comes down to
Is that everthing's gonna be fine fine fine
I've got one hand in my pocket
And the other one is giving a high five

I feel drunk but I'm sober
I'm young and I'm underpaid
I'm tired but I'm working, yeah
I care but I'm restless
I'm here but I'm really gone
I'm wrong and I'm sorry baby
What it all comes down to
Is that everything's gonna be quite alright
I've got one hand in my pocket
And the other is flicking a cigarette
What is all comes down to
Is that I haven't got it all figured out just yet
I've got one hand in my pocket
And the other one is giving the peace sign

I'm free but I'm focused
I'm green but I'm wise
I'm hard but I'm friendly baby
I'm sad but I'm laughing
I'm brave but I'm chicken shit
I'm sick but I'm pretty baby
What it all boils down to
Is that no one's really got it figured out just yet
I've got one hand in my pocket
And the other one is playing the piano
What it all comes down to my friends
Is that everything's just fine fine fine
I've got one hand in my pocket
And the other one is hailing a taxi cab...
<<<
----
{{credit{
Alanis Morrissette / Jagged Little Pill / 1995
3min 41
}}}
{{{
If you see my shadow
  And you see it's fading fast
You must try to catch it
  For the moment will not last

And if you look down deep
  You will see within my soul
Madness and Serenity
  Fighting for control
}}}
----
{{credit{
31 May 1996 
Originally from the '[[Snippets|Untitled (Snippets)]]' series.
I consider this to be "somewhat" autobiographical
}}}
<<<
They say that these are not the best of times,
But they're the only times I've ever known,
And I believe there is a time for meditation
in cathedrals of our own.

Now I have seen that sad surrender in my lover's eyes,
And I can only stand apart and sympathize.
For we are always what our situations hand us...
It's either sadness or euphoria.

And so we argue and we compromise,
and realize that nothing's ever changed,
For all our mutual experience,
our seperate conclusions are the same.

Now we are forced to recognize our inhumanity,
Our reason co-exists with our insanity.
And though we choose between reality and madness...
It's either sadness or euphoria.

How thoughtlessly we dissipate our energies
Perhaps we don't fulfill each other's fantasies.
And so we'll stand upon the ledges of our lives,
With our respective similarities...
It's either sadness or euphoria.
<<<
----
{{credit{
Billy Joel / Turnstiles / 1976
3min 15
<<OpenID>>
<<list shadowed>>
<<list orphans>>
<<list missing>>
<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>
<<list all>>
excludeLists excludeSearch ccTiddly systemConfig systemConfigDisable NavigationPackage TidIDEPackage pluginInfo loginBox DiscoveryPackage template wizard systemServer systemTheme script systemPackage plugins tag tab badDateTiddler systemConfigForce bookmarklet ♥? poetrytimeline BadPoetryOfTheDay TheFarSide IconPackage Slumberland 1994poetry 1995 1995blog 1995poetry 1996 1996blog 1996poetry 1997 1997poetry 1998 1999 1999poetry 2000 2000blog 2000poetry 2001 2001blog 2002 2002blog 2002poetry 2003 2003poetry 2004 2004poetry 2005 2005blog 2005poetry 2006 2006poetry 2007 2007blog 2007poetry 2008 2008blog 2008poetry 2009 2009blog 2009poetry 2010 2010blog 2010poetry 2011 2011blog 2011poetry 2012 2012blog 2012poetry 2013 2013blog 2014 2015
System UI tag
Some tiddlers do insist on having magic javascript(?) content which forces the tiddler to ALWAYS be the newest. This, imho, is broken behaviour. 

Solution: force a database version of those tiddlers, which then overrides. Then tag them with this, so that on an upgrade I can find them, delete them, and if they still misbehave, I can recreate with the (maybe) newer version.
<<<
I put my spacesuit on
and count back ten to one
the gravitation pull gets stronger
my skin it pulls away
my brains are on a plate
the weightless feeling here is bliss

This Is The Best Thing that has ever happened to me
these are the colours that I've always wanted to see
and although I've never said it before
I love you, I need you, I need it, I love you

now I'm embracing you
from the highest altitudes
though telescopes, out friends they watch us
these heights are dangerous
from here I can see why
our astronauts retire early

This Is The Best Thing that has ever happened to me
these are the colours that I've always wanted to see
and although I've never said it before
I love you, I need you, I need it, I love you

THIS IS THE BEST THING!
<<<
----
{{credit{
Boom Crash Opera / These Here are Crazy Times / 1989
4min 13
}}}
<<<
I can be loud man, I can be silent
I could be young or I could be old.
I can be a gentleman, I can be violent.
I could turn hot or I can be cold.
I could be just like the calm before the storm
Waiting for all hell yeah to break loose.
I could be innocent or I could be guilty
Doesn't mean that I man believe in no noose

I could be rich like a wandering Gypsy
I could be poor like a fat wallet lost.
I could be first or I could come last
Its not who breaks the ribbon
It's how you get across.
I could be red blue black + white sunset
Darkest at day man brightest at night
I could be the sun man I could be the moon
I'm made up from the stars man
I shining so bright.

I could be asleep man, I could be awake
I can be alive or be the walking dead
I can be ignorant, I could be informed
I could lead my life or i could be led
I can be anything i put my mind to man,
all I gotta do is give myself half a chance
I can bring love back into my life
and share it with the world if i got some balance
<<<
----
{{credit{
John Butler Trio / Sunrise over Sea / 2003
3min 56
}}}
Music is much awesome lovely. This tag should link to lyrics and anything relating to songs or music of any form.
We are old now. We sit, aged and tired, in our chairs, watching the world pass by outside the window. The world is now different to the one we grew up in and learnt to love. The world has seen many changes, as have we. Wars have ravaged the land, making much of it uninhabitable. The winds blow across the barren wastelands and sting our tired eyes. We are the last of a dying race. A new breed of survivors now are in control. We were required to make the transition, to show the path that was needed to take us from what we were to what we became, and ultimately to what they have become. Our time has past, and we are now simply the relics of an older, more complicated age.

When the bombs came, most died. Most of the rest suffered, and then too, died.

Few survived long enough to consider trying to rebuild something, anything, on the ruins that were before us. We were of the few that did. I will always remember standing in that cinema, remembering how only a brief year before I had been sitting there, enjoying the marvels of modern technology on the screen in front of me. Enjoying the popcorn and company. Now that cinema shows no remnants of its former glory. The bright curtains no longer hang from the walls. Most were destroyed, and the few rags that remained are now in service as clothes or as bedding. The hole in the roof let in the weather, which tormented us with storms and rains that could kill a man.

But we survived. Those first few years were the worst. I thought we would never make it, but somehow, as time went by, things that once seemed of great importance fell by the wayside. We adjusted to the more simple pleasures of life, and not only managed to survive, but to thrive on it. And we were happy. Somehow.

I don't think I could have made it without you though. It was your presence that always gave me the strength to keep going when all seemed lost. And many times all did seem lost.

I remember when our numbers fell to just the two of us, and we spent one night, thinking it was our last, together alone under the trusses of what was once a great bridge. It had since become a home to the vermin and rodents that now seemed to be everywhere one cared to look. And for us, we expected it to be our graves.

But yet we survived through some miracle. The next day gave us new companions, and new hope. We slowly formed a group, a tribe if you like, that was self-sufficent without relying on scavenging for all its needs.

We were the ancients amongst them, and tried to help them towards a world that would be more perfect than the one we were products of. I do not know if we helped them or hindered them. But their destiny is in their hands now.

We are too old to help anymore, and now just sit here at the vacant window, watching as they rebuild the world with their own dreams and visions. They seem to be doing well, and we are well looked after. I am content with my life, and the time I have spent with you.

I know it is my time to die now. I give to you the last remnants of my love, and hope to see you again in a world that is better than this one.
----
{{credit{
early 1996 (estimated)
This story was inspired by how terrible a movie Heat was.
I was so bored, I envisaged the entire destroyed cinema scene as a means of escape!
Interestingly, this follows a very similar structure to a story I wrote as a school assignment when I was 12!.
I hope to find this again and include here for comparison.
}}}
I wrote a series of small not-quite-poems at one time that I collectively dubbed 'snippets'. These are they.
{{{
Do not believe the things you see
they are, only the haunt you
Do not believe the things you hear
they are, only to taunt you
}}}
{{{
I went mad today, did you know?
I loved you yesterday, did you care?
}}}
----
{{justifyright{
May/June 1996
Originally published online on TheFarSide BBS on 2 June 1996 
See also [[Untitled (Shadow)]] which was originally published as a Snippet.
}}}
"The Far Side" was a text-based BBS in the forum style (rather than the file-sharing style), and running [[YAWC|http://en.wikipedia.org/wiki/YAWC]] codebase. 
[img(50%,50%)[http://nemo.house.cx/uploads/workspace/default/TFS_Duk.png]](note: no idea what the copyright would be on this image. It's just too complicated for me to think about! (a screenshot of a text login window incorporating, amongst other things, ascii art derived from a cartoon? eep)

It was a telnet text-only interface, and provided "rooms" for various topics (analogous at the time to usenet, but more similar to a modern web-forum in fact), and also instant messaging (X-messages) between users.

TFS was based in Canberra from late 2005(?) through 2006, and was a successor to the earlier "Blitzen" BBS which ran in earlier 2005. Nemo was an admin on both these BBSs, and most of his <<tag poetry>> from this era was seen first on Blitzen or TFS' "Creativity" or "Original Works" rooms.

The TFS community hosted the Canberra legs of the "[[Netnics|Netnic]]" in the 1990s, and also hosted two "[[TFSnics|TFSnic]]" - one in Rochester (NY), the other in Canberra, in 1996. 
The 'Netnic' was a series of events held amongst a certain group of online friends in Australia in the waning years of the 20th century, as organised through the YAWC BBSs in Canberra (TheFarSide), Sydney (Spinnaker) and Melbourne (LUCS) at the time. 

They were based on the 'ISCANIC' previously held by ISCA BBS in Iowa. They have given rise since to the [[NovemberFest]].

Some Netnics were..
# Melbourne - January(?) 1995
# Canberra (Glebe Park) - November 1995
# Melbourne - January 1996
# Sydney - April 1996
# Canberra (Glebe Park) - November 1996
# Melbourne - January 1997
# Sydney - April 1997
# Canberra (John J Knight Memorial Park) - November 1997
# Melbourne - January 1998
# Canberra (Glebe Park) - November 1998
# Melbourne - January 1999
# Sydney - April 1999
# Melbourne - January 2000
# Melbourne - January 2001
# Melbourne - January 2002
# Canberra (Telopea Park) - October 2003 (or was this a TFSnic? :)
* http://web.archive.org/web/19990221010941/www.goldweb.com.au/~nemo/netnic/

Additionally, 'TheFarSide BBS' also held it's own 'TFSnic' of which there were two. The first in Rochester, NY, the second in Canberra. 
# Rochester, NY - 1996?
# Canberra (Weston Park) - July 1996

There is a facebook reminiscing group also: https://www.facebook.com/groups/yawcbbs/
{{{
the deed is done.
the message is sent.
all will depend on how it will be received.
the trials and miseries have all been leading up to this point,
and now we sit here exhausted and weary,
waiting to see what the reply will be.
it could be good.
it could be bad.
nobody knows.
nobody knows.
I watch the messenger who has been forever faithful
  carry it up the last hill.
he trudges, knowing the heavy hand of fate is upon him this day.
the short straw was his.
the long straws were ours.
he knocks on the door and awaits a response.
a reply that will tell all.
a reply that will tell all.
the door slowly opens.
it creaks and groans and shakes.
the messenger peers inwards.
he looks and waits to see.
in the darkness motion.
a light or candle flare.
no indication does he see.
that his journey was not wasted.
that his journey was not wasted.
then suddenly a cry.
rings out throughout the night.
of pain. of misery. of sorrow.
of hardship hard to bear.
he takes an awkward step
and is soon engulfed from view.
his actions are unknown.
his doings are unseen.
his feelings go unnoticed.
by the crazy people there.
they taunt and shout and cry to him.
they tell of their despair.
yet still he trudges forward.
not wavering from his path.
he knows he must deliver.
the message send for there.
he takes the steps most humbly.
slowly and discreet.
not wanting to disturb.
by the noises of his feet.
but he knows he is expected.
that he should deliver soon.
that time is of the essence.
that all depends on him.
that all depends on him.
he bows and holds the message.
in an awkward humble stance.
his job is done.
his task is through.
his trials are over.
his life is complete.
yet she motions that the letter.
received upon her hand.
is not complete or worthy.
that more must be sent.
that the time is not yet.
the trials have not ended.
the tasks are not done.
the job is not over.
his life is not through.
his life is not through.
he bows and makes his leavings.
knowing both joy and despair.
for she was not only wondrous.
but also very fair.
for life is not of answers.
easy given, easy lost.
life is of feelings.
the essence of the soul.
he has been refreshed.
his time renewed.
he walks proudly out.
and back into view.
we quiz him of the time.
the hours he spent there.
yet he seems confused.
as if something was amiss.
the time he spent.
he carefully tells.
was a few minutes, maybe less.
we laugh at how he wonders.
we know the answers true.
he will trudge that path again.
maybe once.
maybe twice.
maybe he will spend his life forever trudging that lonely path.
a message each time.
different words, same meanings.
the lady who receives.
will not always be the same.
yet he will battle to meet her.
regardless of the pain.
regardless of the pain.
until such time as when.
the message that is sent.
is complete and just and worthy.
and then he will rest.
for he shall have a place there.
}}}
----
{{justifyright{
22 Jan 1996
Originally published on TheFarSide BBS.
Composition started as a post to the 'Non Sequitur' room on TFS, and as I wrote it grew into what you see. It was VERY much written without plan or idea of what the poem was about. It's quite amazing it's as cohesive as it it. 
}}}
{{{
Praying Mantis on the wall
You stop and then you see it all
Whatever are you praying for?
Dear Mantis on the wall.

Don't you know it all must fall?
Praying Mantis on that wall.
I say again, this time for all:
Don't you know it all must fall.
}}}
----
{{justifyright{
20 Feb 1996
Originally published to TheFarSide BBS 
}}}
NovemberFest is a thing. Like a picnic, but with more variety?

Like a party, but with more out-and-aboutness?

Like a dinner party, but with more frolicking?

NovemberFest is a Social Thing. 

It's a NovemberFest! ...an annual gathering to celebrate the passing of spring. Moreso, it is about getting people together. It is an ad-hoc social event get-together/event type thing, mainly consisting of a Picnic/BBQ lunch and social afternoon/evening.

So bring yourself. Bring friends. Bring food. Bring games. Be inventive - it'll be a fantastic-fancy-frizbees-fun-frolicking-frank-food-fabulous-fortuitous-frivolous-festival-for-friends sort of a day

{{center{
[img[http://nemo.house.cx/uploads/workspace/default/nfestbanner2009_rv.png]]
}}}

!!Welcome to NovemberFest

;What?
: Picnic park social lunch. BYO foods/drinks. Ad Hoc. 
;When?
: Last saturday in November, from 11am till 6pmish (or whenever the last people leave, depending on the mood of the crowd :)
;Where?
: Anzac Park, Toowong (and maybe somewhere else later in the evening, depending on the mood of the crowd! :)
;Who?
: You, and other friends you haven't met yet
;Why?
: Why on earth not? :)
;Bring?
:Food, drink, friends, toys. 
;Contact
: [[Nemo]] organises this, [[Contact]] if you have a question :)

!!What is an "Ad hoc Social event"?
This means there is little to no planning of the afternoon/evening events. NovemberFest attendees are encouraged to mingle and continue being social into the evening, with group dinner or movie events as per group consensus.

!!History
The NovemberFest (aka N'Fest) weekend has hosted a get-together in Canberra almost every year since 1995, though under various other names before 2002.

It evolved from the earlier Canberra [[Netnic]]s held from 1995 through 1998. The traditional date of "final weekend in November" is thanks to [[Wormey]]. 

... And the weather has ... ''rarely'' let us down.  :)

* 1995-1998: Canberra [[Netnic]] (all at Glebe Park except '97, at John J Knight Memorial Park)
* 1999: no event (though Nemo and Manda took some photos in Glebe Park to commemorate the traditional weekend)
* 2000: [[Nethouse]] 'nic gathering at WestonPark
* 2001: "Nemo 'nic" at WestonPark
* 2002-2006: NovemberFest at WestonPark (2003 notable for being the first with rain)
* 2007: NovemberFest in December, on Black Mt Peninsula - torrential rain but fun
* 2008: Still on Lake BG, this time next to paddleboat hire east of Acton Peninsula. Circus toys, geek creations and Paddleboating were to be had!
* 2009: NovemberFest in both Canberra (thanks to Terence for organising) and Brisbane (Roma St Parklands next to the Amphitheatre)
** Zen and Francis found love
* 2010: NovemberFest was held in Mowbray Park, Brisbane. Windy, but good!
* 2011: We watched the river roll by us at Guyatt Park, then played Frisbee and named people who weren't in attendance. Fabulous weather, and a great spot to repeat in, I feel!
* 2012: December 1st - where it combined with [[Slumberland Blackstone]] housewarming, A hot and sunny day at Tom Easterbrook park made a fabulous venue for new friends before evening backyard chatting and firetwirling 
** https://web.facebook.com/events/340484206048582/
** Cam and Tam found love. Should NovemberFest be subtitled 'CupidFest'?!!
* 2013: December 7th at Guyatt Park again. Gorgeous sunshine, a shady place, adventure croquet, and no demand for the BBQ. The first truly "picnic" fest?
** https://www.facebook.com/events/610880465622155/
* 2014: Held on the Nov 29, 2014. Planned for Guyatt Park, but that was shredded (more or less literally!) by a massive storm on the 27th, so at the last moment (midnight on the 28th) the location was moved to Picnic Island Green at Southbank Parklands instead. It worked out well given the circumstances. 
** https://www.facebook.com/events/811731475545505/
* 2015: Guyatt Park on the 28th. Overcast and light winds kept it cool, and threatened rain made for a few early departures, but a few remained, and we frisbeed till the light ran out and rain genuinely arrived
** https://www.facebook.com/events/1227988770561297/
* 2016: Anzac Park, Toowong
** https://www.facebook.com/events/189349498179410/permalink/189349528179407

!!FAQ
;Why was '''November'''Fest in ''December'' in 2007 and 2012 and 2013?
* 2007: There was a federal election on the traditional NovemberFest date, and Nemo for one, was to be in Melbourne for an election day party then, instead of hosting this. Anyways, traditions are made to be broken, so first Saturday of summer it was, rather than the last of spring :)
* 2012: Simply a clash on the previous weekend. Being the 1st meant that we could rationalise that it was "still november somewhere" (in California till 5pm, for example)
* 2013: Again to avoid clashing. This time the clash being Mez's Running Man birthday event.

----
Traditions certainly are made to be broken, but in any case there are good precedents for using misleading dates in event names.  Take May Week in Cambridge, for example.  That used to be in May, but for decades it's been in June.  -Jason
<<sectionTOC>>
This: http://vanessaharden.com/#625794/Intimacy-Patches
...led to a discussion which roped in GPS enabled chastity belt (unlocks only at the right location), and remote control "butterflies", to euphamism in a way I hope is clear. 

Now, should the butterfly be hooked into the GPS app, it could provide a literal "hotter" / "colder" type game... and when the target location is waiting, the treasure is unlocked and ready. 

For who? Well, for the person watching progress thanks to the Intimacy Patch noted above, of course... 
!STOP PRESS
!!ACT Gov is DOING SOMETHING.
(Maybe)
* http://www.tams.act.gov.au/__data/assets/pdf_file/0015/128103/Weston_Park_DRAFT_Master_Plan.pdf
----
----
Weston Park is a beautiful park situated on a peninsula in Lake Burley-Griffin in Canberra. 

A couple of good webpages on it: (there aren't many at all)
* http://www.parksandplaces.act.gov.au/parks/park.cfm?type=35 (Aug2003 update: 404 error)
* http://www.library.act.gov.au/heritagelibrary/reflectionscd/reflect/data/h325/310513.htm
* http://nla.gov.au/nla.pic-an14324452-372
* http://nla.gov.au/nla.pic-an14324452-374

It is, however, increasingly unmaintained, with all the cool stuff that was built in the 60s, 70s and 80s now having either:
* Been torn down (I suspect due to being "unsafe" - ie, the government doesn't want to get sued if some kid hurts himself)
* In a state of disrepair and neglect (and thus likely leading to being demolished)
* Likely to be torn down simply due to possible future safety concerns. 
I am writing this the day after I discovered that the "MouseHouse", a childhood favourite play unit and, in my mind, the heart of Weston Park, had been torn down. (pictures will be posted when available. note to self: 2002 series "eo16")

{{{
TODO
}}}
On the map, it is listed simply as "Concrete and timber play unit". 
http://www.nut.house.cx/~nemo/extras/westonpark2.jpg

Note that what I have marked on the map as "unsafe" is not really[14] - it's just a litigious legal nightmare in the new Australia of insurance hell[15]. The last time I saw the mouse house (NovemberFest [[2002]]) I thought that it might not last more than a few more years for that reason[16]. I didn't think it would be gone within 3 months however. 

This is the sort of thing that makes me think my childhood may be ending. :(
-Nemo, 16.Feb.2003

>The torment of precautions often exceeds the dangers to be avoided.
>It is sometimes better to abandon one's self to destiny"
>-Napoleon I
----
!!!Appendum (20.Jan.2004)
* In a november [[2003]] visit to weston park, I discovered that the replacement for the mouse house is, wait for a it, a set of oh-so-boring swings. Is this 1940?

* In the interest of full disclosure of known information, apparently the mouse house was demolished after a child fell and was killed there. Note that this is hearsay only, and has not been verified. Even if true, I point again to footnote 5 below. Also, I would definately not object to the replacement of the mousehouse with a similar fun (but safer) structure. But swings? I am still dismayed. 
----
!!!Appendum 2 (24 January 2006)
* At NovemberFest [[2005]], my fears for the treehouses were realised. They are gone, and except for some carvings higher up the trees than would be expected, there is no evidence they ever even existed.

!!!Footnotes
[14] I concede that unsupervised children may indeed find ways to hurt themselves on some of these devices, but they can do that anywhere anyways. That's part of what being a kid is about.

[15] I think some people have forgotten that "Parent supervision" and "Legal representation" are different concepts. 

[16] With a pessimistic eye to the future, I fear that not only will these "unsafe" structures be removed, but new ones will not be built in their place, due to concerns that they might possibly be considered "unsafe" a few decades down the track, and thus leave the government (or whoever) liable to be sued for having dared to build such a thing in the first place!
<<<
Leaf by leaf and page by page
throw this book away
All the sadness all the rage
throw this book away
Rip out the binding and tear the
glue
all of the grief we never even
knew
we had it all along
Now it's Smoke
The things we've written in it
never really happened
All the things we've written in it
never really happened
All the people come and
gone
never really lived
All the people come have gone
no one to forgive
Smoke

CHORUS
We will not write a new one
there will not be a new one
another one another one

here's an evening dark with
shame
throw it on the fire
here's the time I took the
blame
throw it on the fire
Here's the time we didn't speak
it seemed for years and years and
here's a secret
no one will ever know the
reasons for the tears
they are smoke

CHORUS

Where do all the secrets live
they travel in the air
you can smell them when
they burn
they travel
Those who say the past is
not dead
can stop and smell the smoke
you keep saying the past is
not dead
well stop and smell the smoke
you keep on saying the past is
not even past and
you keep on saying
we are, Smoke
<<<
----
{{credit{
Ben Folds Five / Whatever and Ever Amen / 1997
4min 52
}}}
A new years celebration, by [[Nemo]]

It's one of my annual new-years traditions now... started in at the end of 2001 on new years eve, but over the years it's migrated back to approximately Chinese New Years date instead... 

I buy a bunch of candles, and melt/join them into a rather larger structure... (the largest I made was well over a metre tall, but most are only about 30cm or so... in a dish/pan/tray around 30cm square or less) ... traditionally I made them throughout the year, but my own laziness means the last few years I've made them on the few weeks beforehand...

On the night, I light every wick I can get to, and everyone gathers round and writes the stuff they want to burn... and sacrifice it to the flames...

Some years it fades with a length gentle peacfullness, some years the wax ignites and ensures a stunning finish!

!!Some history

In 2001 this was absolutely spontaneous, and there was alot of memories people I knew wanted forgotten that year...

Around 2004 the date was shifted back to match Chinese New Year

In 2006 the wax ignited for a stunning finish... 

In 2008 I had two cathedrals... one in which the wax ignited, and a calmer night the following week. 

In 2009 the timing fell behind Chinese New year by another couple of weeks, and mini sparkler bundles planned for the obliteration of the past year... Soliciting donation of candles on the night

2010 it was held in conjunction with my combined birthday and housewarming for [[Slumberland]]

2011 - a private viewing separate and just after birthday events. The candles all burnt down, undisturbed by human hands. Though rain took their part in it... 

2012 - a small crowd appreciated the heralding of the Water Dragon. 16 candles in late evening, 15 burning strong in the morning.  

2013 - Not sure if 2012 was the first at Slumberland? Or this.

2014 - a very late cathedral, midwinter. Just Nerissa and I. Candles burning almost through till morning. 
----
Many candles, many flames... it's a beautiful site :)

...think of this as the Yin to the Yang of a [[Sparkler Bomb]]...
<<slider chkUntitledCandles "Untitled (Candles)" "Untitled (Candles)" "a poem about by Nemo in 2006">>
<<slider chkCathedralofLight "Cathedral of Light" "Cathedral of Light" "- a poem by Nerissa in 2012">>


<<slider chkSmoke Smoke "lyrics to Smoke" "Smoke - by Ben Folds Five">>
{{{
Burn out, or fade away?
Watch the candle burn...
Towers of wax, flames circle around

In the beginning, the flames burn bright and can be seen from afar
But only with time can the beauty come to the fore

Shapes revealed from the flame. Rivers of wax unmasking new delights
  unimagined.
The calm middle ages are like no other.

At the end, we are reduced to only one or two flames...
...and the potential for place and creativity grows.

Wax sculptures.
A whole mythos.
Creation.

The entire life cycle of the candle must be seen to truly appreciate
  it's beauty

Beauty is not just in the moment.
Not in any moment.

Beauty is in change. In all things there is change, and in all things
there is a beginning, and end, and all the things between.

Beauty is in the betweens.
}}}
----
{{credit{
Feb 2006
Written about the CandleCathedral.
Originally published to the Bad Poetry of the Day list under the headline of 'candles in the wind'
}}}
What do you get when you wire several hundred sparklers together?

Whoosh!
/*{{{*/
.tagCloud span {line-height: 3.5em; margin:3px;}
.tagCloud1{font-size: 70%;}
.tagCloud2{font-size: 85%;}
.tagCloud3{font-size: 100%;}
.tagCloud4{font-size: 115%;}
.tagCloud5{font-size: 130%;}
.tagCloud6{font-size: 145%;}
.tagCloud7{font-size: 160%;}
.tagCloud8{font-size: 175%;}
.tagCloud9{font-size: 190%;}
/*}}}*/
A variant of the [[Netnic]] targetted exclusively at regulars of TheFarSide BBS. Two nics were held, both in 1996. More detail is merged with the Netnic page. 
!!! stop press !!!
As of approx september2009, cdbbay has changed hosting setup, and the /from/nemo URL suffix no longer works. I also hear they have moved from a secure openBSD setup, to Microsoft. I no longer support CDbaby as I once did...

Rest of page is in temporary archive mode. 

----

Nemo is a [[cdbaby.com|http://www.cdbaby.com/home/from/nemo cdbaby.com]] affiliate parner buddy friend pal teammember type guy. 
* [[about CDbaby|http://www.cdbaby.com/about/from/nemo]]
* [[Search Page|http://www.cdbaby.com/search/from/nemo]]
* [[gallery|http://www.cdbaby.com/style/from/nemo style/genre]]
* [[New Arrivals|http://www.cdbaby.com/new/from/nemo]]
* [[Top Sellers|http://www.cdbaby.com/topnow/from/nemo]]
----
So, here are my recommendations... (in case you're curious - this is actually nemo's "will buy these when financial enough" list, and so may change as he buy stuff ;) 
See also: TheList
* [[Vinyl Kings - A little trip|http://www.cdbaby.com/cd/vinylkings/from/nemo]]
* [[Jody Whitesides - E.nergy A.udio R.evolution|http://www.cdbaby.com/cd/whitesides/from/nemo]]
* [[Jody Whitesides - is this considered naked|http://www.cdbaby.com/cd/whitesides2/from/nemo]]
* [[Live Alien Broadcast - Long way down|http://www.cdbaby.com/cd/livealien/from/nemo]]
* [[Bandits Of The Acoustic Revolution - A call to arms|http://www.cdbaby.com/cd/botar/from/nemo]]
* [[SushiRobo - Action Causes More Trouble Than Thought|http://www.cdbaby.com/cd/sushirobo1/from/nemo]]
* [[Paul Brian Newett - Vex|http://www.cdbaby.com/cd/pbnewett/from/nemo]]
* [[Gary Jules - Trading Snakeoil for Wolftickets- "Original Independent Release"|http://www.cdbaby.com/cd/garyjules/from/nemo]]
* [[Gary Jules - Greetings from the Side|http://www.cdbaby.com/cd/garyjules2/from/nemo]]
* [[Gary Jules - Trading Snakeoil for Wolftickets|http://www.cdbaby.com/cd/garyjules3/from/nemo]]
* [[E.S. Posthumus - Unearthed|http://www.cdbaby.com/cd/esposthumus/from/nemo]]
* [[Nemo - Signs of Life|http://cdbaby.com/cd/nemony/from/nemo]] (no, really, this isn't just for ego value)
* [[Captain Dan & the Scurvy Crew - Authentic Pirate Hip Hop|http://cdbaby.com/cd/captaindan/from/nemo]]
<subliminal>go buy them now</subliminal>

These are some I've gotten from CDbaby already though, don't get me these:
* [[MC5 - Babes in Arms|http://www.cdbaby.com/cd/mc5/from/nemo]]
* [[SushiRobo - Drawings and Garbage Structures|http://www.cdbaby.com/cd/sushirobo2/from/nemo]]
* [[SushiRobo - The Light-Fingered Feeling of Sushirobo|http://www.cdbaby.com/cd/sushirobo3/from/nemo]]
* [[Donnie Darko soundtrack|http://www.cdbaby.com/cd/donniedarko/from/nemo]]
{{{
Haikus do not scare
Mutilated flesh? No fear
Your soul torn to shreds

Fear not the reaper
He only brings peace to you
After the torture

Nothing as it was
You will never sleep the same
Memories don't fade

Screams don't wake you up
For you never really slept
Listen in the dark

Invade your soul once
Trap laid for next encounter
Will it come again?

Depth of night cliche
Defying reality
From nothing: terror

Until late one morn
When you least expect
You exist no more

So this tale ends
Not a scream, not a whimper
All you were is gone
}}}
----
{{justifyright{
2007
Originally published to the Bad Poetry of the Day list under the headline of 'A set of haiku for you'
}}}
{{{
Hello winter
Hello again
I welcome you back
Like an old friend

Though for nine months you scorned us
You've come back to haunt us

So welcome again
To rains and the snow
And the gentle crunch
of Frost under toe

Welcome again open fire and warm rugs
And welcome again to hot chocolate in mugs

Welcome to coats and warm knitted mittens
And the soft purr of furry young kittens

Yet only three months, you shan't stay no more
If it were longer, you would be a bore

But be welcome now, just settle right in
And in a few moments, we shall begin!
}}}
----
{{credit{
2006
Originally published to the Bad Poetry of the Day list under the headline of 'A Winter Serenade'
}}}
{{{
Parallel lines, seperated by just so much.
  How much? Nothing!
Their infinite length makes the distance
  between them immeasurably small
Everything experienced by one is, in due course
  experienced by the other.
Yet for all this, they are not one, but two.
  Destined to always be apart.
 
And to live. Two parallel lives.
}}}
----
{{justifyright{
Early 1997
This poem was written with [[Zara]] in mind. At the time, it seemed we were sharing alot of common experiences, though our individual situations were quite different.
I'm pretty sure the poem predates the doodle of the same name, which is itself dated 13.march.1997. 
}}}
{{{
The moon was lovely last night...
It filtered around the dark clouds like a lost torch.
It broke through and illuminated us, and was soon covered again by more cloud.

The clouds were lovely last night...
They hid the moon, haunting us like a ghost.
Then from the west, they rolled in bringing thunder and lightning.

The rain was lovely last night...
Great drops washing down onto us like my tears.
Frantic last minute packing, preparing to leave one last time.

The emotions were lovely last night...
Sadness and tears. I'm leaving home.
And then the doors were locked. The lights turned off. And Goodbye.
}}}
----
{{credit{
September 2004
About moving out of ThePorch.
Originally published to the BadPoetryOfTheDay list under the headline of '//a few drops...//'
}}}
"om nom nom nom" -Cookie Monster 

See also: http://tastymatic.wordpress.com
{{{
Fruit sways in the branches
tantalisingly out of reach
till
Wondrous day of days!
Ladder. Invented.
Except
Now I have no excuse to
not clean the gutters
}}}
----
{{credit{
March 2008
Not inspired by the Pink Floyd song of the same title, but the name was in mind when I named this
}}}
The Pizza Shack, in Cobleskill (sp?) NY. 

They sold the best pizza in the known universe. 

http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=the+pizza+shack,+cobleskill&jsv=143c&sll=42.677388,-74.467735&sspn=0.149424,0.21492&ie=UTF8&latlng=42677791,-74484677,1670396858860139323&ei=aIyHScC7EImGNt_GjeAD&cd=1

Pizza Capers in Brisbane, however, is an upstart chain which will customise vegetarian gourmet pizza's to ones hearts content, and is the new champion in this domain
CheesyCrunchyThings are just like CheesyToastyThings, except different. 

They're based on Cracked Pepper Jatz biscuits, and have layers of:
* cheese
* onion
* tomato 
* jatz (bottom)
Salt and pepper to taste if available. Order is arbitrary, and not all ingredients are necessary. Not even cheese. The whole setup is a lot more carefree compared to CheesyToastyThings, though could still be said to be a proto [[Pizza]]

I like mine in the order stated above, with salt after the tomato, and pepper (not LemonPepper, but regular), after the onion. Vegans should modify the cheese. Carnivores may want to add shaved ham (or other meat)
A nicely tangy blend of peppers, salts, ground lemon, and other stuff...

I know Masterfoods makes the stuff at least... 
(technically: ʻOtai). A tasty tongan tropical fruit drink

Ingredients
* Pineapple - grated
* Watermelon - crushed
* Coconut - blended (coconut milk and flesh)
* Mango - shredded
* Ice - crushed

For all ingredients in approximately equal parts (by visual approximation of volume), mix well together.
(To serve approx a dozen people, use approx: 2mango/2coconut/2small pineapple/ 1/2 watermelon)

Serve with spoon or fork.

!!Note
DO NOT BLEND the pineapple, watermelon or mango. These should remain chunky. Coconut flesh should be finely chopped or blended.

!!Variations on a theme
* A portion of dessicated coconut can provide a little bit of texture, and emphasise the subtle coconut flavour.
* Add a little sugar to guarantee sweetness - can be necessary if the mango is slightly bitter, but otherwise should not be required. 

!!Links
* http://en.wikipedia.org/wiki/%27otai
{{{
Time.
      Past.
          Wait.
             Again.
                Wait.
               Patience.
              Future.
             Eventually.
           Past revisited.
          Wait more.
         Delay.
         Confusion.
           Concern.
             My mind troubles me.
                Do what is right.
                   In the past.
                       In the future.
                          Present.
                          All the time.
                         Now.
                        Now.
                       Now!
}}}
----
{{credit{
New Years Eve, December 2005
Originally published to the BadPoetryOfTheDay list under the headline 'Time waves'
}}}
{{{
There are worse things than death
  or so they say
But I cannot say. What I haven't experienced I cannot compare

But I can say...
There are worse things than dancing
That is truer.
  And it is truth we seek in life? Yes?

There are worse things than chocolate
  Or Comfortable chairs
  Nectarines
  Live music
  Friends
  Sketch comedy
  Sex
  Clean dry clothes
  Bush walking...
  
Yes, there are worse things.
}}}
----
{{credit{
April 2008
}}}
{{{
It's easy to sit and watch you all turn away
  It's hard though not to cry
  Each minute is just another one
  Of wrenching deep despair
I am what time and societies cruelty has made
  But then like always
  I'm writing to a mirror
  You will never really care
}}}
----
{{justifyright{
1994
First published to TheFarSide on 13 November 1995 in the '//Creativity//' room.
I noted: "(I found this in my diary some time ago... I _think_ I did it, but I may be mistaken..."
}}}
{{{
I wander the streets.
Alone.
The sounds of movement wafts through empty doorways
  to mingle with the rustle of leaves
Sometimes I see a face in a window
But I hurry on before the dead eyes refocus to see me.

Listening for any sounds of life...
In the city there are no birds.
And cars lie silent on the streets

Only the sound of the wind reminds me that time itself has not ceased.
What happened to this place?
What happened to the people here?

Then it hits me all at once, and I feel numbed.
Last night was Halloween...
(and as my senses return, it is as if I hear cheering)
...And today... it is the race.

The race.
I DO hear cheering!
The RACE!

meh.
I walk on.
}}}
----
{{justifyright{
1 Nov 2005
Written about Melbourne Cup Day.
Originally published to the BadPoetryOfTheDay list under the headline of 'Spine Tingling Tales'
}}}
{{{
A circle. Black now.
Bend it. A heart.
Still black - a black heart.
Bend it more, deform it.
Bend it back, still a heart.
Back and forth, keep bending,
then pull it, stretch it, twist it.
It breaks. A broken heart.
 
A circle no more.
A heart no more.
It lies still.
It still has shape,
but none with meaning.
Yet still black.


Bend it more, make it something.
A spiral now. A ring.
Two turns on my finger.
With thorns that press into my skin.

Leave it alone. I don't want it.
It is worthless. A scrap of plastic.
In the garbage it goes, still black.
}}}
----
{{justifyright{
circa mid/late 1996
}}}
{{{
Microsleep vs Powernap
Who will win and who will snap?
"A 15 minute powernap can save your life"

Driving on, your mind unthinking
Reading signs, your eyes unblinking
"A microsleep can kill in seconds"

Battling on into the night
Stop and rest, or drive and fight?
"Trouble concentrating? Powernap now"

With cape of doona and weapon of pillow
Powernap battles Microsleep the killer!
"Yawning? A microsleep can kill"

And so into oblivion they brawl
Neither will win, but neither will they draw
"Only sleep cures fatigue"
}}}
----
{{justifyright{
March 2006
Inspired by Victorian driver-safety awareness signs on the trip to Port Fairy.
Originally published to the Bad Poetry of the Day list under the headline of 'Battle of Kips'
}}} 
Timtams are chocolate heaven.

Would you believe...?
* if you deprive an australian female of timtams for 6 months, then taunt them with a packet out of their reach, she will kill to get that packet?
* american women have been known to orgasm from the taste alone? Particularly sensual american women will orgasm from the sight of a packet alone!
* timtams are listed as minor sins relating to lust AND greed?
* on some pacific islands, timtams are a form of currency, with the current going rate putting a single timtam biscuit as 10kilo of freshly caught fish?
* it is believed that no timtam in history has ever reached it's expiry date.
* amongst industry insiders, the timtam recipe is considered more valuable than the combined worth of the Coke formula and KFC's 11 herbs and spices recipe?
* the "timtam slam" (or "timtam suck") has been recognised as an act of worship by every major religion - except catholicism, which considers it a deadly sin (as it combines both lust AND greed...)? 
Just what foods are representative of Australia?

Just what should you wrap up in a package and, if you can bear to part with it, send it off to expats who miss the local culture, or to those heathen folks who don't know what they're missing, but damnit, they're about to find out. 

* http://www.toxiccustard.com/australia/food.html - Toxic Custard, always a good read, gives some ideas on what australian food cuisine is like. 
* http://www.aussiecatalog.com/top20.html - The top 20 items purchased through aussiecatalog - best seen as an example of what expats want.

!!The aussiecatalog top20, as of 18 June 2003
# 445g jar Vegemite
# standard packet [[TimTam]]s
# Family pack of mini Violet Crumbles
# Milo
# multipack of mini Cherry Ripes
# Napisan (not a food!)
# bag of Caramello Koalas
# subscription to Women's Weekly (not suitable for any consumption ;)
# Cheese Twisties
# Novelty boomerang (do not eat)
# Mint Slice biscuits
# 115g jar of Vegemite.
# Cadbury Milk Chocolate block
# bag of Minties
# Yowies
# BBQ Shapes
# Bundaberg Ginger Beer 4pack
# Berocca (consume after a late night out ;)
# Chicken Twisties
# wood map of Australia (for viewing only)

!! A 2014 era discussion on facebook:
https://www.facebook.com/nemothorx/posts/10152806311013216
{{{
His name was Hannibal

A student of magics. Young and powerful was he.
He had moved mountains, tamed tornadoes, and summoned the sea.

He understood flows of energy with precisions and power undreamt of
By the philosophies of man, watchmaker or molotov

And yet he was sad

Long black hair, straightened, hung across his forehead.
Yes, Hannibal brooded, his angst he could not shed

He wore no colours, they were as nothing to him.
And the world had no life, he knew nothing but sin.

And then one day, hallelujah! A revelation!
He could do it! Share the world. He felt brief elation

So summoning power to the limits of control
He let his spell loose on the world that was so old

And throughout the world the people did blink
As within their eyes, their cones did unlink.

Everything was grey, and now that would be shared.
He felt momentarily at ease, though he little cared

And years later, his involvement not hidden
Hannibal's Colour Heist - history books were written.
}}}
----
{{credit{
May 2008
I had been reading about the movie Cannibal Holocaust... 
}}}
;STOP PRESS
:blogged about here: http://tastymatic.wordpress.com/2011/06/06/notes-on-a-roast-veg-meal/
::-- 2011 june 06
----

As named in the tradition of [[World Famous Pasta]], this is Nemo's Baked Potato dish. It's rather simple, but works rather well...

It is at its core a vegetarian dish, but easily veganised. Remember, it's all about the potatoes baby

!!Method

Potatos. Bake them. Then add stuff...

!!!Mark I
* diced and fried mushrooms
* shallots
* butter or equiv
* corn relish
* salsa

!!!Mark II
* diced and fried mushrooms
* shallots
* butter or equiv
* sour cream
* grated cheese

!!! Mark III - Vaguelly Awesome Baked Potato with bonus fantastic
Yes, this variants demaned it's own nomenclature due to it's excellence. BBQ relish is tops. 
* bbq relish (a masterfoods relish based on sour apple, onion and nutmeg) - [[this stuff|http://www.masterfoods.com.au/Products/ProductDetail/tabid/83/ProductId/1709/Cafe-Series-Gourmet-Barbecue-Relish.aspx]]
* sour cream
* grated cheese
* shallots
* splash of lime

!!!Variations on a theme
* coleslaw
* consider a small amount of vegetable stock when frying the mushrooms. Alternatively, lime juice when frying.
!!Inspirations
This recipe is a blend of several baked potato recipes... Corn relish + Salsa mix from an online source. Coleslaw and mushrooms from the 'Spudship Enterprise' baked potato van which is always seen at Majors Creek folk festival. 
{{{
Be true to yourself
Be the best person you can be
 
There is nothing to be gained in earning false love
There is everything to be gained for being loved for yourself.
 
Find the someone that loves you for who you are, and who you can be
Find the someone that can help you along that path
 
Change to the person YOU want to be.
}}}
----
{{justifyright{
3 September 2000
The epilogue to [[Cinema Lines]] was written shortly after Jacy visited in mid 2000. I felt it needed to be said to clarify the point. I like the epilogue for "closing" the poem properly. But I still think it feels "tacked on" :( 
}}}
{{{
Runaway said the voice
a whisper in my ear
RUNAWAY! it repeated,
listen to your fear!

The stories of the night
Tell their savage tale,
Of fear, and of hate. And of deceipt.
They try to influence you
to change the way you think.
But NOW is the time,
to stop and make a change
to become the dream you have
to do the things you wish.
Move fast, for the chance will not remain.
It moves and passes on,
and doubt takes it's place.

Doubt.
Unknowing. Unfeeling. Unsure.
Insecurity steals upon your soul.
You know not where you stand
or why you feel so bad.

The things you do
and think and say
Are yours to keep
(but not today!)

Paranoia says the voice.
Be paranoid today!
Call 1-800-state-your-fear
give us your cash
no more to pay!

Runaway said the voice.
RUNAWAY it repeated.

RUNAWAY!!
   Runaway
      runaway...
}}}
----
{{justifyright{
Jan/Feb 1996
I think I wrote this as I was working out the situation between Kathryn and I, early 1996.
I posted this to Blitzen BBS, Creativity, on Feb8 1996. That is the only date reference I have to it. 

Regardless of all that, I very much like this poem, and the two followups I wrote do not do this one justice
}}}
{{{
Life just gets so complicated
Past and future reverberated
Events and plans are celebrated
I don't remember this!

Emotions are not generated
Yet logic is so venerated
So I feel eviscerated
I didn't sign up for this!

If you think that love is wasted
Nothing good ever created
I don't want you to get too jaded
So I send this with a kiss

One step closer; exhilarated
Turn up the heat; marinated
Ideas flowing; serenaded
Do you feel the bliss?

This here poem orchestrated
And these words demonstrated
That I can rhyme - I almost made it
Call it a near miss...

So I finish, purged and sated
Mind is cleared and renovated
Only evidence is poem (I made it)
I hope you got the gist
}}}
----
{{credit{
May 2008
}}}
The great grey monster traversed the indigo wastelands, and felt a great sorrow lift from his soul... as he looked around he noticed the rain beginning to fall gently upon the hard dry packed sand. He looked up and watched as lightning crashed into the forest in the distance. The air shook, and a calmness overcame him.

Slowly, he walked towards the forest, not entirely sure why he was going there, as it had not been part of his original journey. But now he felt strangely drawn to it. The power of the storm drew him, it's cold hard raw edge made strange sense to him as he wandered.

He no longer felt alone.

Sighing happily, he moved forward once again, and entered the leafy glade that marked the entrance to the forest...
----
{{justifyright{
prior to Oct 1996
Wasteland was not originally written from an autobiographical viewpoint, but later additions reinforce this interpretation.
}}}
The figure skipped along the forest....the wind blowing through its dark hair like a flag..

The sprite's feet barely touched the ground as it weaved between the trees like someone playing chase with nature. The birds and animals all gathered around, playing with it, making the noises of their culture.

It's bright blue eyes gaze skyward as it stopped to gaze at the stars. In it's eyes was a strange look.. it was a look of hope.. a look of wonderment at what the universe told in it's depths. By looking at one, one would think it was just curious.. but the sprite knew more.. it knew it wanted to explore.. it wanted to know.. and it wanted to stretch the limits of nature. With a smile it knew what it wanted more than anything... to understand.

As the soft misty rain fell, it ran through the forest again, the flowers barely moving under it's feet.
----
{{justifyright{
Amanda Devaus, 8.Dec.1996
Sprite was written as a personal email from Amanda, and was composed with no knowledge of Indigo Wasteland.
}}}
One forest to a second he traveled. And then to a third, with barely a pause between them. Indeed, they were the same forest to him. But the paths he was following appeared to be without clear direction, as if they were confused.

The traveler paused to consider that it was he who was confused.

Suddenly, he was outside the forest again. How refreshing, to be in the clear open air - to look up and see the stars overheard without interruption. How lovely to look to the horizon and wonder what he might find.

His original journey would never be completed. Indeed, the plans were now long lost and unrecoverable. But if the forest life had taught him anything, it was that plans can change, and new plans can be created.

The journey would continue.

In no hurry to get to wherever was next, yet determined to get there, he moved forward.
----
{{justifyright{
16.May.2001
Journey was deliberately written with the autobiographical viewpoint in mind to follow Indigo Wasteland and Sprite
}}}
<<slider chkIndigoWasteland "Untitled (Indigo Wasteland)" "Untitled (Indigo Wasteland)" "Untitled (Indigo Wasteland) - 1996">>
<<slider chkSprite "Untitled (Sprite)" "Untitled (Sprite)" "Untitled (Sprite) - 1996">>
<<slider chkJourney "Journey" "Journey" "Journey (2001)">>
{{{
The words of truth
  are never easy to find
  yet they are out there somewhere
  just beyond our reach
We forever try to find them
  but are always doomed to fail
  the truth that is in our hearts
  that our tongues can never reach
}}}
----
{{credit{
mid/late 1995
First published to TheFarSide on 14 November 1995 in the '//Creativity//' room
I simply stated that I'd written it a few months earlier.
It deliberately follows the layout of [[Turn Away]]
}}}
{{{
pain.           the hurt rips through me. 
sorrow.         touches my soul and leaves me
                kneeling, weeping, cursing.
anger.          at myself. only myself.
                i take it out on myself. 
frustration.    damn. 
explore.        i twist and bend, i am a mirror. 
confusion.      look at me. look under the surface.
                find me. there is much you do not know. 
discovery.      there will be much you will not like.
                of this i am sure
expressions.    
love.           i am not sure i know this.
                despite what i said.
?
.
}}}
----
{{credit{
16 June 1996
I love this poem. Read it across as one poem, or in two columns as two poems. Either way it works!
}}}

I wrote this trying to be clear about my feelings for Zara. Indeed, parts of this poem relate to very specific events! 
She woke in a sweat, her breathing in short gasps as she tried to stop her racing heart.

Sure it was a nightmare..but it seemed so real!! her breath was labouring, her chest heaving as she tried to calm down the rising panic she felt in her. Nightmares were horrible as it is, but this was something more.

Yes it was a dream. Lena nodded and got up, padding her way to the kitchen to get a glass of water. Without thinking, she was turning on all the lights and smiled to herself. How silly she was being, but she kept going anyway.

She poured her glass full of the icy liquid from the refrigerator and sat down at the table, sipping the water. She felt the liquid trickle down her throat and sighed with contentment. Her heart was calming down.

She looked out of the window, taking in the full moon above her, lost in thought about the nightmare..

She sighed

It seemed so real..she could feel the fear in the figures that featured, she could feel their pain as it was her own.

With a sigh she remembered that the pain she was feeling was her own. The familiar pang of loss and raw ache was mirrored from the people in the dream.

Suddenly she was aware of a cold presence behind her..her breath stopped..she dared not breathe. She tried to rationalise, it was paranoia..if course it was. And her paranoia was feeding her imagination.

But the imagination wasnt creating feeling of someone's hand on her shoulder, and she spun around to be confronted by the presence of a shadowy figure.

The glass dropped on the hard floor and smashed into silvery shards, ignored as she focussed on the figure. Immediately looking for a weapon.

But amazingly she wasn't afraid, shocked but not afraid.

As she breathed normally again and calmed herself down, she managed to concentrate, and look at the figure with no fear..it wasn't a intruder but a spirit of some kind.

The spirit was a beautful girl-woman, she had long dark hair, and green eyes, her face was a classic beauty, she could even see that, as shadowy as it was. but what was more important was the figure seemed to glow..and radiate a calmness she hadn't felt in her life. The voice that come was barely a whisper and it was in her head..

"Please don't be afraid"

Lena smiled softly and nodded her head, replying in a whisper herself, willing her voice to not croak.

"I am not afraid..just a little startled..who are you?"

The Girl simply smiled and whispered again

"I can't stay for long, i just needed to tell you to calm down..i needed to see you, my name is Fiara..do you like it?"

Lena laughed softly, and nodded "Yes, I love the name" She was transfixed, it was a beautiful child, but she was filled with such a love, it seemed to heal all the pain of the past..and then she knew this was important to her.

Fiara spoke again, becoming fainter with each word "Please don't forget that you have to live, please don't live like you are dead, we will be here for you."

And with that she disappeared, leaving Lena with a sense of loss she didn't know she could feel..she extended a hand and felt the space where the figure stood..there was noone there.

She wiped the tear that had flowed down her cheek and stood to return to her bed..and her husband.. she felt alive again..like she was forgiven, whatever happened was for her, and something she would never forget.
----
{{credit{
June 1997
This story is not mine - but it is important to me that I host it on my site. Remember to live. -Nemo
}}}
12 ozs grated zucchini
1 large grated onion
1 cup SR Flour
1 tspn salt
1 tblspn chopped parsley or mint (but not mint)
1 cup grated tasty cheese          
3/4 cup cooking oil
5 eggs
pepper

Beat eggs and mix into all other ingrediants.  Pour into greased and floured tin about 12" square.  (You can even use new fangled metric).  Bake in a moderate stove (about 200c) for about 20 minutes or until set.  Serve hot or cold with salad or as savoury fingers. (It's better hot).  May be cut into squares and frozen (as long as I'm not around, cause there'll be none left to freeze).
----
{{credit{
recipe from Nerissa
}}}
The Hitchhikers Guide to the Internet - [[rfc1118|http://www.rfc-editor.org/rfc/rfc1118.txt]] - provides a fun history of the internet, circa 1989.
The more recent [[rfc1855|http://www.rfc-editor.org/rfc/rfc1855.txt]] gives a set of guidelines for netiquette. Good advice for all netizens.
Some important words about [[viruses on the internet|http://www.virtualsalt.com/warning.htm]] that everybody should be aware of.
<<tiddler ToggleBreadcrumbs>>
<<tiddler ToggleSinglePageMode>>
toggle <<tiddler ToggleFullScreen>>
toggle <<tiddler ToggleTiddlerTags>>

more [[settings|AdvancedOptions]]
----
[[help|Help]] ([[Markup|MarkupCheatSheet]], [[NemWiki howto]])<br /><<ccOptions>>
The wiki includes a bloglike component. The blogs of Nemo. (it is not intended or likely that anyone elses blogs will appear here, though if they do, it shall be endeavoured that they are tagged appropriately)

{{center{
<<cloud =blogtimeline>> }}}
Some blog posts are imported from old [[sites of Nemo|NemoWeb]] or other [[forums|TheFarSide]]. Others yet are new to this site. 

A rough history is as follows:
;1994-1996
:Selected of the saved public posts I made to Blitzen or TheFarSide BBS[*]
;2000-2002
:former "[[NAFS|http://wiki.thorx.net/wiki/NAFS]]" site. Mostly just small observations and bookmark notes.
;2003-(mid)2009
:Wiki posts from the original NemWiki, or ThorxWiki, which have, at the time of import to NemWiki, been deemed to be blog-like in nature. That is, they were most likely written about a time/place/event, in the first person, and subsequently lacked revisions. 
;(mid)2009-
:this current NemWiki

Other chrono-bound content authored by me can be found on other sites. Primarily - Deadjournal, Livejournal, facebook, twitter. Some of these may yet find their way out of archives and onto here. Find the links via my [[Contact]] page. 

: * yes, technically these are not blog posts because they were never 'web'. Nor was their public availability widespread. Nonetheless, they were written online for a public audience, and so are replicated here.
Check out the [[2000 Prize Winners|http://www.improbable.com/ig/ig-2000-winners.html]] of the coveted(?) [[Ig(r) Novel prizes|http://www.improbable.com/ig/ig-top.html]]. Special attention to Chemistry and Computer Science!
Do you live in the past? Check out [[Yesterdayland|http://www.yesterdayland.com/]]. Bring back memories of shows like [[Dangermouse|http://www.yesterdayland.com/popopedia/shows/saturday/sa1258.php]] or [[Mysterious Cities of Gold|http://www.yesterdayland.com/popopedia/shows/saturday/sa1709.php]]? ...Maybe [[Bananaman|http://www.yesterdayland.com/popopedia/shows/saturday/sa1482.php]] rings a bell? Unfortunately, the site is lacking on shows like The Goodies, Zebedee, Monkey Magic, The Wombles, and other not-shown-in-the-USA shows. The site isn't just TV shows either. Relive the music, the games...
Think computer games suck more now than they did in the past? You're not the only one. I agree, as does James Hague in [[this article|http://www.siggraph.org/publications/newsletter/v34n2/columns/gaming.html]].
I cannot begin to describe how cool dolphins are. But if you think they're just aquatic schmucks who get caught in tuna nets, then check out the [[Mystery of the Silver Rings|http://leahi.kcc.hawaii.edu/~et/delrings.html]] for THE COOLEST thing I've read in a long time. [[Scientific American|http://www.sciam.com]] has [[Videoclips here|http://www.sciam.com/0896issue/0896dolphins.html]]
[[The one and only ROPOD|http://www.ugcs.caltech.edu/~sethml/ropod/]] doesn't come close to being as cool as the dolphins, but it's still cool nonetheless. Imagine if TV's were like this! (See also [[here|http://www.bobblick.com/bob/projects/mclock/index.html]], [[here|http://www.geocities.com/SiliconValley/Lab/3685/analog.htm]], [[here|http://sj.znet.com/~kstaton/electronics/prop_clock/p_clk.html]], [[here|http://www.geocities.com/SiliconValley/Campus/9489/propclock.html]] and [[slashdot|http://slashdot.org/article.pl?sid=00/10/15/2010244&mode=nested]])
Some may remember that HHG started with this idea. Different ways the w
orld could end. So, if you're feeling a bit pessimistic about the future of the 
human race, or indeed, the planet as a whole, then discover [[20 Ways the world could end|http://www.discover.com/oct_00/featworld.html]]
[[Yesterdayland|http://www.yesterdayland.com]] didn't have the show, but [[Google|http://www.google.com]] saves the day. So without furthur ado,  a couple of links to that legendary show, Monkey! Some links are [[serious|http://www.geocities.com/Tokyo/Towers/8153/info.html]] and some are [[not so serious|http://www.geocities.com/SouthBeach/Bluffs/8111/monkey.htm]]. Both are good however, and provide more links.
If only they'd try to patent it, I could show prior art! Just proves that good ideas abound everywhere though. [[This article|http://news.bbc.co.uk/hi/english/education/newsid_982000/982346.stm]] talks about architectural quake. I did this years ago, modeling the [[Zone 3|http://www.zone3act.com.au]] maze in the original Quake. No .wad for linkage at this time though. 
Sorry.
Do you speak english? Do you speak another language as well? Are you on the net? (well, duh)  Regardless of your specific answers, [[this article|http://www.theatlantic.com/issues/2000/11/wallraff-graddol.htm]] should be of interest, since it deals with how the next generation may answer the same questions...
Now this is kind of cool - four-colour based vision... Read about [[Madam Tetrachromat|http://www.redherring.com/mag/issue86/mag-mutant-86.html]].  Also, the [[slashdot article|http://slashdot.org/article.pl?sid=00/11/28/1536204&mode=nested]]
As we approach 2001... let's stop for a moment and check the current state of Artificial Intelligence. Why not play [[20 Questions with a computer|http://www.20q.net/index.html]] see how it goes. HAL this is not.
Hope everyone had a Merry Christmas, and are looking forward to 2001! I caught up with family (yay) and got as many cards as I could sent prior to Christmas Day itself. That counts as a new record I believe! ;)
However, no good deed goes unpunished, and my glasses finally succumbed to an injury sustained over 4 years ago, and broke on Boxing Day. Oh well, I'm sure my optometrist was getting lonely anyways...
Happy New Year. Happy New Century! Happy New Millennium ([[?!?!|http://www.douglasadams.com/dna/pedants.html]]).

New Years is the traditional time to make resolutions and turn old leaves into new ones. A new millennium demands something better, though maybe not a whole new forest. So, I have been thinking of self improvements... things like smiling more, being more thoughtfull when listening and talking, and so on. Self congratulations on my success on 
such ventures will have to wait till I've perfected being humble ;)
2001 neat stuff! These are here cos they're cool IMHO, and I want to be able to find them easily later on. (no, I'm not turning this into a [[Slashdot|http://www.slashdot.org/]], though that is where I get alot of these stories!

First off the bat, presenting one of the world oldest computers. It's 50 years old, it's called [[CSIRAC|http://www.smh.com.au/news/0101/05/national/national11.html]], and any modern optical mouse (such as those by [[Apple|http://www.apple.com/mouse/"]] or [[Microsoft|http://www.microsoft.com/]]) could probably out-compute it easily!

Next on the list, the NSA abandonded [[this building|http://www.sunspot.net/content/cover/story?section=cover&pagename=story&storyid=1150520223288]] ...some astronomers got their hands on it. I'd LOVE to [[check it out|http://www.pari.edu/ToursHistory.htm]]!

Finally, there is a Monolith doing the rounds of seattle. (Here are the slashdot posts [[one|http://slashdot.org/article.pl?sid=01/01/02/2153254&mode=nested]] and [[two|http://slashdot.org/article.pl?sid=01/01/05/1258201&mode=nested]])
If you could make something [[TOTALLY friction free|http://www.eetimes.com/electronics-news/4166269/True-nonstick-polymer-eliminates-mechanical-friction]], what would YOU make? Sure, you could be serious and make friction-free industrial components. You could be practical and put it on aircraft wings. Or you could do something a bit more fun. Totally frictionless funfair slides? How about novelty frictionless clothing? I see a whole new industry emerging...
This is a truly objective method of rating movies. 

More to come...

(hint: keywords are 'Geoff' and 'Jeff')
Just saw that movie - [[The 6th Day|http://us.imdb.com/Title?0216216 ]]. Brings to mind some interesting thoughts about cloning and self-improvement at the genetic level. I've long dreamt of double-opposable thumbs on each hand, gills, perfect vision over a wider spectral band, and so on. But watching 6th Day brought a new improvement idea to my head. A bladder guaranteed to last the 2-3 hours it takes from buying your [[Coke|http://www.coke.com]], to watching the credits roll and counting the [[Dzefs|Dzef Rating]]!
Some people are monogamous by nature. Some are polyamorous. But it's no more binary a distinction than hetero or homosexual. 

For gender preference there is the Kinsey scale. I propose a "pKinsey" scale, for the equivelant poly graduation. 

For eg, my pKinsey rating would be between about 1 and 2, and could be described as "mono, but with a curiosity and experimentation with poly (with the right partner(s)), but unlikely to be a lifetime choice". 

Alongside the Kinsey and pKinsey scales, I think there heeds to be a promiscuity scale. (//needs a new page I think.//) Everyone has their variation within those scales, but I think when applied, could be an interesting way to determine the chance of two people hooking up - though the algorithm for determining that isn't quite trivial
Websites galore. Everywhere you look online you find another.  Of course, since websites=online for most people, I guess it's understandable. Nevertheless, they're not all worth the effort. [[Toxic Custard|http://www.toxiccustard.com/]] may or may not be one such site, depending on your tastes. Be sure to check out his Guide to Australia, and USA Holiday sections. I found them just a little topical...
Of course, in the quest for NYC info before actually getting there, I consult the [[HitchHiker's Guide to the Galaxy|http://www.h2g2.com]] - as any planetary or galactic traveller should. Fun AND informative. For special relevancy, run a search on Australia, and another on New York. Let's not forget [[Project Galactic Guide|http://www.megadodo.com]] either. An older, similar, more varied project (but with less commercial backing) with approximately the same goal.
Does this fall under the heading of "cool but useless" or just "useless" information? Not so useless to me, nor possibly to other arts and craftists who want to make something from those stacks of CD's they have laying around. What am I talking about? Simple, ~170degrees C is the required temperature to bend a CD. Oven cooking works well, and CD's don't hold much heat, so they can be bent with carefull fingers. (pick up with tongs though)
Grouping names can be interesting. A flock of birds. A mob of kangaroos. A herd of perfectly-normal-beasts. But what is the groupname for emotions? Does one exist that I just don't know about?

I'm going to guess not, and thus respectfully submit "complex" as the appropriate noun.
"A complex of emotions"

//14.May.2001// - It occured to me that the existant groupnoun for emotions may already be 'mess'...
{{center{
{{border{
In memory, [[Douglas Adams|http://www.douglasadams.com/]]. 1952-2001

"//`So Long,' they said, `and Thanks ...'
And that was all. He blinked, and understood nothing.//"
{{small{Douglas Adams, So Long and Thanks for all the Fish}}}
}}}
Someone really messed up the script for 11.May.2001 didn't they!
}}}
{{{
Silently she waded to the shore
Turned
And looked over the waves, water and ocean
Turned
And looked over the sand, trees and mountains

Silently she bowed her head, waiting for any last revelations.
The next step of the journey
Would mean no going back.

"I'm sorry dear", her mother had said, kindly, but firmly
"some first steps, once begun, cannot be undone"

She turned
looked back to her home
The lights in the distance behind her - blurring in the water

Her tears flowed newly and freely
And mingled with the water and ocean

Silently she stepped up onto the sand
into the trees and the mountains
to begin a new life
}}}
----
{{credit{
2009 Aug 13
An earlier edit was published on the Bad Poetry of the Day list under the headline of 'Footprints in the Sand'
<<newTiddler>> | <<newJournal "YYYY 0MM 0DD - a DDD in MMM"
 label:"new blog"
 tag: "YYYYblog">>
{{credit{
[ <<saveChanges>> ] }}}
Everyone knows what a metre is. What an inch is. What a litre is. So on... But what about those units of measurement we never hear about... the ones we REALLY use.
Read on...
----
Some of these are original... many aren't. I will add to this as I think or come across new ones... =)
;Barn
:One cubic nanometre. (As in, "They couldn't hit the side of a barn at this dist...") [{{small{//Ed: "They couldn't hit an elephant at this dist..." was in fact the last words of General john Sedgwick, spoken while looking over hte parapet at enemy lines during the Battle of Spotsylvania in 1864. Ref, The Book of Heroic Failures, Stephen Pile//}}}]
;Fingermetre
:The exact distance between the edge of your finger (or thumb) and the nail you were meaning to hit. [{{small{//(I credit this one to my mother :)//}}}]

The following come thanks to `fortune`...<br>
{{small{
{{{
1 Billion dollars of budget deficit             = 1 Gramm-Rudman
6.023 x 10 to the 23rd power alligator pears    = Avocado's number
2 pints                                         = 1 Cavort
Basic unit of Laryngitis                        = The Hoarsepower
Shortest distance between two jokes             = A straight line
6 Curses                                        = 1 Hexahex
3500 Calories                                   = 1 Food Pound
1 Mole                                          = 007 Secret Agents
1 Mole                                          = 25 Cagey Bees
1 Dog Pound                                     = 16 oz. of Alpo
1000 beers served at a Twins game               = 1 Killibrew
2.4 statute miles of surgical tubing at Yale U. = 1 I.V.League
2000 pounds of chinese soup                     = 1 Won Ton
10 to the minus 6th power mouthwashes           = 1 Microscope
Speed of a tortoise breaking the sound barrier  = 1 Machturtle
8 Catfish                                       = 1 Octo-puss
365 Days of drinkingLo-Cal beer.                = 1 Lite-year
16.5 feet in the Twilight Zone                  = 1 Rod Serling
Force needed to accelerate 2.2lbs of cookies    = 1 Fig-newton
        to 1 meter per second
One half large intestine                        = 1 Semicolon
10 to the minus 6th power Movie                 = 1 Microfilm
1000 pains                                      = 1 Megahertz
1 Word                                          = 1 Millipicture
1 Sagan                                         = Billions & Billions
1 Angstrom: measure of computer anxiety         = 1000 nail-bytes
10 to the 12th power microphones                = 1 Megaphone
10 to the 6th power Bicycles                    = 2 megacycles
The amount of beauty required launch 1 ship     = 1 Millihelen
}}}
}}}
Apart from staining my clothing with soot, hitting my head with sooty Kevlar (glad it was not burning!), and making my elbow move in ways it wasn't designed to (and this was just last night!), firetwirling is a totally safe, fun, harmless, etc activity *grins*. I do now feel the need to get me a firestick though! Anyone know where I can get some Kevlar, cheap...? (firebreathing next week! muahahaha)
"Baby you can drive my car..."
...no longer. Nemo finally sold his mini. It had to go, but a shame nonetheless. ~Dec1995-May2001
I've put this story under "ideas"... I think it will get more study over the following years, plus it relates to my own ideas and opinions regarding online communication.

Check it out, it's a [[NYT article|http://www.nytimes.com/2001/05/17/technology/17TALK.html]] on the differences between emails that men send, and women sent. (PS, thanks to [[Ars Technica|http://www.arstechnica.com]] for that link.)

On the topic of communications, also have a quick look-see at an article titled "[[Linguistic Viagra|http://www.technologyreview.com/magazine/jun01/hawley.asp]]".
It would not be literally true to say that I have breathed fire, though I think most people would know what I mean by that statement. It was, in a nutshell, cool. As is in fact, firetwirling in general, and midnight BBQ's too. In no particular order I want to give a big thankyou to Steve, Puppy, Clare, Marty, Terri, Jacqui, Gumby, Brendon, Chris, Heather, Fiona and Hollie who couldn't make it along!
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.04.11 [1.9.5] pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // external script library
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (code) { // inline code
				if (show) // display source in tiddler
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (label) { // create 'onclick' command link
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
					link.tiddler=w.tiddler;
					link.onclick=function(){
						this.bufferedHTML="";
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if(this.bufferedHTML.length)
								s.innerHTML=this.bufferedHTML;
							if((typeof(r)==="string")&&r.length) {
								wikify(r,s,null,this.tiddler);
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					};
					link.setAttribute("title",tip||"");
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
					link.setAttribute("href",URIcode);
					link.style.cursor="pointer";
					if (key) link.accessKey=key.substr(0,1); // single character only
				}
				else { // run script immediately
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
					try	 { var out=eval(c); }
					catch(e) { out=e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}

// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}
//}}}

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
/%
|Name|ToggleBreadcrumbs|
|Source|http://www.TiddlyTools.com/#ToggleBreadcrumbs|
|Version|0.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|BreadcrumbsPlugin, InlineJavascriptPlugin|
|Overrides||
|Description|dynamically enable/disable BreadcrumbsPlugin display|
%/<script>
if (config.options.chkShowBreadcrumbs==undefined) config.options.chkShowBreadcrumbs=true;
</script><<option chkShowBreadcrumbs>><script>
	var chk=place.lastChild;
	chk.coreOnChange=chk.onchange;
	chk.onchange=function() {
		if (this.coreOnChange) this.coreOnChange.apply(this,arguments);
		this.checked=config.options.chkShowBreadcrumbs;
		if (config.macros.breadcrumbs) config.macros.breadcrumbs.refresh();
	};
</script> show breadcrumbs
/***
<<tiddler CookieManager>>
***/
/***
!!![[Baked cookies:|CookieManagerPlugin]]
^^Press {{smallform{<<cookieManager button>>}}} to save the current browser cookies... then hand-edit this section to customize the results.^^
***/
//{{{

	config.options["chkAllowBrowserCookies"]=true;
	config.options["chkBackstage"]=false;
	config.options["chkCookieJarAddToAdvancedOptions"]=true;
	config.options["chkHttpReadOnly"]=true;
	config.options["chkMonitorCookieJar"]=true;
	config.options["chkPortableCookies"]=true;
	config.options["chkScrollSidebars"]=true;
	config.options["chkShowBreadcrumbs"]=true;
	config.options["chkShowLeftSidebar"]=true;
	config.options["chkShowRightSidebar"]=true;
	config.options["chkSinglePageMode"]=false;
	config.options["chkSliderAdminPanel"]=false;
	config.options["chkSliderContentTabs"]=true;
	config.options["chkSliderOptionsPanel"]=false;
	config.options["chkTimeline"]=true;
	config.options["txtMainTab"]="Timeline";
	config.options["txtMoreTab"]="Shadowed";
	config.options["txtTagsTab"]="All";
//}}}

//}}}

// 20 cookies saved on Tuesday, August 18th 2009 at 14:42:58 by nemo//
//^^(edit/remove username check and/or individual option settings as desired)^^//
//{{{
if (config.options.txtUserName=="nemo") {
	config.options["chkAllowBrowserCookies"]=true;
	config.options["chkBackstage"]=false;
	config.options["chkCookieJarAddToAdvancedOptions"]=true;
	config.options["chkHttpReadOnly"]=true;
	config.options["chkMonitorCookieJar"]=true;
	config.options["chkPortableCookies"]=true;
	config.options["chkScrollSidebars"]=true;
	config.options["chkShowBreadcrumbs"]=true;
	config.options["chkShowLeftSidebar"]=true;
	config.options["chkShowRightSidebar"]=true;
	config.options["chkSinglePageMode"]=false;
	config.options["chkSliderAdminPanel"]=true;
	config.options["chkSliderContentTabs"]=true;
	config.options["chkSliderOptionsPanel"]=true;
	config.options["chkTimeline"]=true;
	config.options["txtMainTab"]="Timeline";
	config.options["txtMoreTab"]="Shadowed";
	config.options["txtTagsTab"]="All";
}
//}}}
/%
|Name|ToggleFullScreen|
|Source|http://www.TiddlyTools.com/#ToggleFullScreen|
|Version|1.1.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide main menu, sidebar and page header|

Usage:
	<<tiddler ToggleFullScreen with: label altlabel>>
		- displays 'onclick' command link that toggles full screen display mode
	or
	<<tiddler ToggleFullScreen##ON>>
		- immediately sets full screen mode
	or
	<<tiddler ToggleFullScreen##OFF>>
		- immediately resets full screen mode

!ON
<script> if (!config.options.chkFullScreen) window.toggleFullScreen(); </script>
!end ON

!OFF
<script> if (config.options.chkFullScreen) window.toggleFullScreen(); </script>
!end OFF

%/<script>
window.toggleFullScreen=function(here) {
	config.options.chkFullScreen=!config.options.chkFullScreen;
	var showmm=!config.options.chkFullScreen && config.options.chkShowLeftSidebar!==false;
	var showsb=!config.options.chkFullScreen && config.options.chkShowRightSidebar!==false;
	var showcrumbs=!config.options.chkFullScreen && config.options.chkShowBreadcrumbs!==false
		&& config.macros.breadcrumbs && config.macros.breadcrumbs.crumbs.length;
	var cw=document.getElementById('contentWrapper');
	var da=document.getElementById('displayArea');
	var mm=document.getElementById('mainMenu');
	var sb=document.getElementById('sidebar');
	var sm=document.getElementById('storyMenu');
	var bc=document.getElementById('breadCrumbs');
	if (cw){
		for (var i=0; i<cw.childNodes.length; i++)
			if (hasClass(cw.childNodes[i],'header')) { var h=cw.childNodes[i]; break; }
		if (h) h.style.display=!config.options.chkFullScreen?'block':'none';
	}
	if (mm) {
		mm.style.display=showmm?'block':'none';
		da.style.marginLeft=showmm?(config.options.txtDisplayAreaLeftMargin||''):'1em';
	}
	if (sb) {
		sb.style.display=showsb?'block':'none';
		da.style.marginRight=showsb?(config.options.txtDisplayAreaRightMargin||''):'1em';
	}
	if (sm)
		sm.style.display=!config.options.chkFullScreen ?'block':'none';
	if (bc)
		bc.style.display=showcrumbs?'block':'none';
	var label=('$'+'1'=='$1')?'fullscreen':'$1';
	var altlabel='$2'; if ('$'+'2'=='$2') altlabel=label;
	if (typeof(here)!='undefined' && here!=window.place)
		here.innerHTML=!config.options.chkFullScreen?label:altlabel;
	var b=document.getElementById('restoreFromFullscreenButton');
	if (b) removeNode(b);
	else { 
		var b=createTiddlyElement(null,'span','restoreFromFullscreenButton','selected');
		b.innerHTML='&loz;';
		b.title='RESTORE: redisplay page header, menu and sidebar';
		b.onclick=window.toggleFullScreen;
		var s=b.style;
		s.position='fixed'; s.top='.3em'; s.right='.3em'; s.zIndex='10001';
		s.border='2px outset ButtonFace';
		s.padding='0px 3px';
		s.cursor='pointer';
		s.fontSize='8pt';
		s.backgroundColor='ButtonFace';
		if (config.browser.isGecko) {
			s.color='ButtonText !important';
			s.MozAppearance='button';
		}
		document.body.insertBefore(b,null);
	}
	return false;
};
</script>/%

%/<script label="$1" title="FULLSCREEN: toggle display of mainmenu, sidebar, and page header">
	window.toggleFullScreen(place);
	return false;
</script><script>
	place.lastChild.innerHTML=('$'+'1'=='$1')?'fullscreen':'$1';
</script>
/***
|Name|InlineJavascriptPluginInfo|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for InlineJavascriptPlugin|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code.
<script show>
	/* javascript code goes here... */
</script>Every time the tiddler content is rendered, the javascript code is automatically evaluated, allowing you to invoke 'side-effect' processing and/or produce dynamically-generated content that is then inserted into the tiddler content, immediately following the script (see below).  By including the optional ''show'' keyword as the final parameter in a {{{<script>}}} marker, the plugin will also include the script source code in the output that it displays in the tiddler.  This is helpful when creating examples for documentation purposes (such as used in this tiddler!)

__''Deferred execution from an 'onClick' link''__
<script label="click here" title="mouseover tooltip text" key="X" show>
	/* javascript code goes here... */
	alert('you clicked on the link!');
</script>
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text, and a {{{key="X"}}} parameter to specify an //access key// (which must be a //single// letter or numeric digit only).

__''Loading scripts from external source files''__
<script src="URL" show>
	/* optional javascript code goes here... */
</script>You can also load javascript directly from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}).  This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins.  The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.

In addition to loading the javascript from the external file, you can also use this feature to invoke javascript code contained within the {{{<script>...</script>}}} markers.  This code is invoked //after// the external script file has been processed, and can make immediate use of the functions and/or global variables defined by the external script file.
>Note: To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that is rendered as soon as your TiddlyWiki document is opened, such as MainMenu.  For example: put your {{{<script src="..."></script>}}} syntax into a separate 'library' tiddler (e.g., LoadScripts), and then add {{{<<tiddler LoadScripts>>}}} to MainMenu so that the library is loaded before any other tiddlers that rely upon the functions it defines. 
>
>Normally, loading external javascript in this way does not produce any direct output, and should not have any impact on the appearance of your MainMenu.  However, if your LoadScripts tiddler contains notes or other visible content, you can suppress this output by using 'inline CSS' in the MainMenu, like this: {{{@@display:none;<<tiddler LoadScripts>>@@}}}
<<<
!!!!!Creating dynamic tiddler content and accessing the ~TiddlyWiki DOM
<<<
An important difference between TiddlyWiki inline scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document: in a typical web document, you use the {{{document.write()}}} (or {{{document.writeln()}}}) function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.

However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and instead will //completely replace the entire ~TiddlyWiki document in your browser window (which is clearly not a good thing!)//.  In order to allow scripts to use {{{document.write()}}}, the plugin automatically converts and buffers all HTML output so it can be safely inserted into your tiddler content, immediately following the script.

''Note that {{{document.write()}}} can only be used to output "pure HTML" syntax.  To produce //wiki-formatted// output, your script should instead return a text value containing the desired wiki-syntax content'', which will then be automatically rendered immediately following the script.  If returning a text value is not sufficient for your needs, the plugin also provides an automatically-defined variable, 'place', that gives the script code ''direct access to the //containing DOM element//'' into which the tiddler output is being rendered.  You can use this variable to ''perform direct DOM manipulations'' that can, for example:
* generate wiki-formatted output using {{{wikify("...content...",place)}}}
* vary the script's actions based upon the DOM element in which it is embedded
* access 'tiddler-relative' DOM information using {{{story.findContainingTiddler(place)}}}
Note:
''When using an 'onclick' script, the 'place' element actually refers to the onclick //link text// itself, instead of the containing DOM element.''  This permits you to directly reference or modify the link text to reflect any 'stateful' conditions that might set by the script.  To refer to the containing DOM element from within an 'onclick' script, you can use "place.parentNode" instead.
<<<
!!!!!Instant "bookmarklets"
<<<
You can also use an 'onclick' link to define a "bookmarklet": a small piece of javascript that can be ''invoked directly from the browser without having to be defined within the current document.''  This allows you to create 'stand-alone' commands that can be applied to virtually ANY TiddlyWiki document... even remotely-hosted documents that have been written by others!!  To create a bookmarklet, simply define an 'onclick' script and then grab the resulting link text and drag-and-drop it onto your browser's toolbar (or right-click and use the 'bookmark this link' command to add it to the browser's menu).

Notes:
*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script.  As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,''  and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.  
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
<<<
!!!!!Special reserved function name
<<<
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
<<<
!!!!!$(...) 'shorthand' function
<<<
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
{{{
$(id)
}}}
in place of the normal standard javascript syntax:
{{{
document.getElementById(id)
}}}
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
<<<
!!!!!Examples
<<<
simple dynamic output:
><script show>
	document.write("The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
	if (!window.story) window.story=window;
	var title=story.findContainingTiddler(place).getAttribute("tiddler");
	var size=store.getTiddlerText(title).length;
	return title+" is using "+size+" bytes";
</script>
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
	document.write("<br>The current date/time is: "+(new Date())+"<br>");
	return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
	if (!window.story) window.story=window;
	var txt=place.firstChild.data;
	var tid=story.findContainingTiddler(place).getAttribute('tiddler');
	alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
</script>
dynamically setting onclick link text based on stateful information:
>{{block{
{{{
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.innerHTML=on?"enable":"disable";
	config.txtSomething=on?"OFF":"ON";
	return "\nThe current value is: "+config.txtSomething;
</script><script>
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.lastChild.previousSibling.innerHTML=on?"disable":"enable";
</script>
}}}
<script label="click here">
	/* toggle "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.innerHTML=on?"enable":"disable";
	config.txtSomething=on?"OFF":"ON";
	return "\nThe current value is: "+config.txtSomething;
</script><script>
	/* initialize onclick link text based on current "txtSomething" value */
	var on=(config.txtSomething=="ON");
	place.lastChild.innerHTML=on?"enable":"disable";
</script>
}}}
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
>
><script src="demo.js" show>
	return "inlineJavascriptDemo() function has been defined"
</script>
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
	inlineJavascriptDemo();
</script>
<<<
!!!!!Revisions
<<<
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
2008.06.11 [1.9.3] added $(...) function as 'shorthand' for document.getElementById()
2008.03.03 [1.9.2] corrected fallback declaration of wikifyPlainText() (fixes Safari "parse error")
2008.02.23 [1.9.1] in onclick function, use string instead of array for 'bufferedHTML' (fixes IE errors)
2008.02.21 [1.9.0] output from 'onclick' scripts (return value or document.write() calls) are now buffered and rendered into into a span following the script.  Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed).  Thanks to Xavier Verges for suggestion and preliminary code.
2008.02.14 [1.8.1] added backward-compatibility for use of wikifyPlainText() in TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 [1.8.0] added support for key="X" syntax to specify custom access key definitions
2007.12.15 [1.7.0] autogenerate URI encoded HREF on links for onclick scripts.  Drag links to browser toolbar to create bookmarklets.  IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets.  In addition, double-quotes will cause syntax errors.  Thanks to PaulReiber for debugging and brainstorming.
2007.11.26 [1.6.2] when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 [1.6.1] when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 [1.6.0] added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 [1.5.2] add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
2006.06.01 [1.5.1] when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 [1.5.0] added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 [1.4.0] added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
2005.12.13 [1.3.1] when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
2005.11.09 [1.3.0] for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
2005.11.08 [1.2.0] handle loading of javascript from an external URL via src="..." syntax
2005.11.08 [1.1.0] pass 'place' param into scripts to provide direct DOM access 
2005.11.08 [1.0.0] initial release
<<<
/%
|Name|ToggleReadOnly|
|Source|http://www.TiddlyTools.com/#ToggleReadOnly|
|Version|1.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|enable/disable global read-only state without reloading your document|
%/<<option chkHttpReadOnly>><script>
	var chk=place.lastChild;
	chk.style.margin=chk.style.padding="0";
	chk.title="enable/disable TiddlyWiki editing functions";
	chk.checked=readOnly;
	chk.coreOnChange=chk.onchange;
	chk.onchange=function() {
		if (this.coreOnChange) this.coreOnChange();
		this.checked=config.options.chkHttpReadOnly;
		readOnly=config.options.chkHttpReadOnly;
		story.switchTheme(config.options.txtTheme);
	};
</script><script label="read-only" title="enable/disable TiddlyWiki editing functions">
	place.previousSibling.click(); return false;
</script><script>
	var s=place.lastChild.style; s.display="inline"; s.fontWeight="normal";
</script>
/***
|Name|CookieManagerPluginConfig|
|Source|http://www.TiddlyTools.com/#CookieManagerPluginConfig|
|Requires|CookieManagerPlugin|
|Description|custom settings for [[CookieManagerPlugin]]|
!!!!!Browser Cookie Configuration:
***/
// // <<option chkAllowBrowserCookies>> store ~TiddlyWiki option settings using private browser cookies
// // <<option chkMonitorBrowserCookies>> monitor browser cookie activity (shows a message whenever a cookie is updated)
//{{{
// default settings:
config.options.chkAllowBrowserCookies=true;	// if FALSE, this blocks *all* cookies
config.options.chkMonitorBrowserCookies=false;
//}}}

// // Individual cookie names can be prevented from being created, modified, or deleted in your browser's stored cookies by adding them to the {{{config.macros.cookieManager.blockedCookies}}} array: 
//{{{
var bc=config.macros.cookieManager.blockedCookies; // abbreviation
bc.push("txtMainTab");			// TiddlyWiki:  SideBarTabs
bc.push("txtTOCSortBy");		// TiddlyTools: TableOfContentsPlugin
bc.push("txtCatalogTab");		// TiddlyTools: ShowCatalog
//}}}
// // You can also define a javascript test function that determines whether or not any particular cookie name should be blocked or allowed.  The following function should return FALSE if the browser cookie should be blocked, or TRUE if changes to the cookie should be allowed:
//{{{
config.macros.cookieManager.allowBrowserCookie=function(name) {
	// add tests based on specific cookie names and runtime conditions
	return true;
}
//}}}
/***
|Name|CookieManagerPlugin|
|Source|http://www.TiddlyTools.com/#CookieManagerPlugin|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|view/add/delete browser-based cookies and "bake" cookies to CookieJar tiddler for 'sticky' settings|
!!!!!Usage
<<<
This plugin provides an interactive control panel that lets you select, view, modify, or delete any of the current values for TiddlyWiki options that have been stored as local, private, //browser cookies//.  You can also use the control panel to "bake cookies", which generates a set of javascript statements that assign hard-coded option values to the TiddlyWiki internal variables that correspond to the current browser cookie settings.  These hard-coded values are then stored in the [[CookieJar]] tiddler, which is tagged with<<tag systemConfig>> so that each time the document is loaded, the baked cookie settings will be automatically applied.

When a set of baked cookies is added to the [[CookieJar]], it is automatically surrounded by a conditional test so that the hard-coded settings will only be applied for the username that was in effect when they were initially generated.  In this way, if you publish or share your document with others, //your// particular baked cookie settings are not automatically applied to others, so that their own browser-based cookie settings (if defined) will be applied as usual.

Whenever you "bake cookies", new hard-coded javascript assignment statements are *appended* to the end of the [[CookieJar]].  However, any baked cookies that were previously generated and stored in the [[CookieJar]] are not automatically removed from the tiddler.  As a result, because the most recently baked cookie settings in the [[CookieJar]] are always the last to be processed, the values assigned by older baked cookies are immediately overridden by the values from the newest baked cookies, so that the newest values will be in effect when the CookieJar startup processing is completed.

Each time you bake a new batch of cookies, it is recommended that you should review and hand-edit the [[CookieJar]] to remove any "stale cookies" or merge the old and new sets of baked cookies into a single block to simplify readability (as well as saving a little tiddler storage space).  Of course, you can also hand-edit the [[CookieJar]] tiddler at any time simply to remove a few individual //baked cookies// if they are no longer needed, and you can even delete the entire [[CookieJar]] tiddler and start fresh, if that is appropriate.  Please note that changing or deleting a baked cookie does not alter the current value of the corresponding option setting, and any changes you make to the [[CookieJar]] will only be applied after you have saved and reloaded the document in your browser.
<<<
!!!!!Examples
<<<
{{{<<cookieManager>>}}}
{{smallform small center{
@@display:block;width:35em;<<cookieManager>>@@}}}
<<<
!!!!!Configuration
<<<
<<option chkAllowBrowserCookies>> store ~TiddlyWiki option settings using private browser cookies
<<option chkMonitorBrowserCookies>> monitor browser cookie activity (show a message whenever a cookie is set or deleted)
<<option chkCookieManagerAddToAdvancedOptions>> display [[CookieManager]] in [[AdvancedOptions]]
//note: this setting does not take effect until you reload the document//
<<<
!!!!!Revisions
<<<
2009.08.05 [2.4.0] changed CookieJar output format to support odd symbols in option names (e.g. '@')
2008.09.14 [2.3.2] fixed handling for blocked cookies (was still allowing some blocked cookies to be set)
2008.09.12 [2.3.1] added blocked[] array and allowBrowserCookie() test function for selective blocking of changes to browser cookies based on cookie name
2008.09.08 [2.3.0] extensive code cleanup: defined removeCookie(), renamed cookies, added 'button' param for stand-alone "bake cookies" button, improved init of shadow [[CookieManager]] and [[CookieJar]] tiddlers for compatibility with new [[CookieSaverPlugin]]. 
2008.07.11 [2.2.1] fixed recursion error in hijack for saveOptionCookie()
2008.06.26 [2.2.0] added chkCookieManagerNoNewCookies option
2008.06.05 [2.1.3] replaced hard-coded definition for "CookieJar" title with option variable
2008.05.12 [2.1.2] add "cookies" task to backstage (moved from BackstageTasks)
2008.04.09 [2.1.0] added options: chkCookieManagerAddToAdvancedOptions
2008.04.08 [2.0.1] automatically include CookieManager control panel in AdvancedOptions shadow tiddler
2007.08.02 [2.0.0] converted from inline script
2007.04.29 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.CookieManagerPlugin= {major: 2, minor: 3, revision: 1, date: new Date(2008,9,12)};
//}}}
//{{{
config.macros.cookieManager = {
	target:
		config.options.txtCookieJar||"CookieJar",
	blockedCookies:
		[],
	allowBrowserCookie: function(name) {
		return true;
	},
	displayStatus: function(msg) {
		if (config.options.chkMonitorBrowserCookies && !startingUp)
			displayMessage("CookieManager: "+msg);
	},
	init: function() {
		if (config.options.txtCookieJar===undefined)
			config.options.txtCookieJar=this.target;
		if (config.options.chkAllowBrowserCookies===undefined)
			config.options.chkAllowBrowserCookies=true;
		if (config.options.chkMonitorBrowserCookies===undefined)
			config.options.chkMonitorBrowserCookies=false;

		config.shadowTiddlers.CookieManager=
			 "/***\n"
			+"!!![[Browser cookies:|CookieManagerPlugin]] "
			+"{{fine{<<option chkAllowBrowserCookies>>enable <<option chkMonitorBrowserCookies>>monitor}}}\n"
			+"^^Review, modify, or delete browser cookies..."
			+"To block specific cookies, see [[CookieManagerPluginConfig]].^^\n"
			+"@@display:block;width:30em;{{smallform small{\n<<cookieManager>>}}}@@\n"
			+"***/\n";

		// add CookieManager to shadow CookieJar
		var h="/***\n<<tiddler CookieManager>>\n***/\n";
		var t=(config.shadowTiddlers[this.target]||"").replace(new RegExp(h.replace(/\*/g,'\\*'),''),'')
		config.shadowTiddlers[this.target]=h+t;

		if (config.options.chkCookieManagerAddToAdvancedOptions===undefined)
			config.options.chkCookieManagerAddToAdvancedOptions=true;
		if (config.options.chkCookieManagerAddToAdvancedOptions)
			config.shadowTiddlers.AdvancedOptions+="\n!!CookieManager\n><<tiddler CookieManager>>";

		// add "cookies" backstage task
		if (config.tasks && !config.tasks.cookies) { // for TW2.2b3 or above
			config.tasks.cookies = {
				text: "cookies",
				tooltip: "manage cookie-based option settings",
				content: "{{groupbox{<<tiddler CookieManager>><<tiddler [["+this.target+"]]>>}}}"
			}
			config.backstageTasks.push("cookies");
		}
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span=createTiddlyElement(place,"span");
		span.innerHTML=(params[0]&&params[0].toLowerCase()=="button")?this.button:this.panel;
		this.setList(span.firstChild.list);
	},
	panel: '<form style="display:inline;margin:0;padding:0" onsubmit="return false"><!--\
		--><select style="width:99%" name="list" \
			onchange="this.form.val.value=this.value.length?config.options[this.value]:\'\';"><!--\
		--></select><br>\
		<input type="text" style="width:98%;margin:0;" name="val" title="enter an option value"><br>\
		<input type="button" style="width:33%;margin:0;" value="get" title="refresh list" \
			onclick="config.macros.cookieManager.setList(this.form.list);"><!--\
		--><input type="button" style="width:33%;margin:0;" value="set" title="save cookie value" \
			onclick="var cmc=config.macros.cookieManager;\
				var opt=this.form.list.value; var v=this.form.val.value; \
				var msg=opt+\' is a blocked cookie.  OK to proceed?\';\
				if ((!cmc.blockedCookies.contains(opt) && cmc.allowBrowserCookie(opt))||confirm(msg)) {\
					config.options[opt]=opt.substr(0,3)==\'txt\'?v:(v.toLowerCase()==\'true\'); \
					saveOptionCookie(opt);config.macros.cookieManager.setList(this.form.list);\
				}"><!--\
		--><input type="button" style="width:33%;margin:0;" value="del" title="remove cookie" \
			onclick="var cmc=config.macros.cookieManager; var opt=this.form.list.value; \
				var msg=opt+\' is a blocked cookie.  OK to proceed?\';\
				if ((!cmc.blockedCookies.contains(opt) && cmc.allowBrowserCookie(opt))||confirm(msg)) {\
					removeCookie(this.form.list.value,true); \
					cmc.setList(this.form.list);\
				}"><br>\
		<input type="button" style="width:50%;margin:0;" value="bake cookies" \
			title="save current cookie-based option values into a tiddler" \
			onclick="return config.macros.cookieManager.bake(this,false)"><!--\
		--><input type="button" style="width:50%;margin:0;" value="bake all options" \
			title="save ALL option values (including NON-COOKIE values) into a tiddler" \
			onclick="return config.macros.cookieManager.bake(this,true)"><!--\
		--></form>\
	',
	button: '<form style="display:inline;margin:0;padding:0" onsubmit="return false"><!--\
		--><input type="button" style="margin:0;" value="bake cookies" \
			title="save current browser-based cookie values into a tiddler" \
			onclick="return config.macros.cookieManager.bake(this,false)"><!--\
		--></form>\
	',
	getCookieList: function() {
		var cookies = { };
		if (document.cookie != "") {
			var p = document.cookie.split("; ");
			for (var i=0; i < p.length; i++) {
				var pos=p[i].indexOf("=");
				if (pos==-1) cookies[p[i]]="";
				else cookies[p[i].substr(0,pos)]=unescape(p[i].slice(pos+1));
			}
		}
		var opt=new Array(); for (var i in config.options) if (cookies[i]) opt.push(i); opt.sort();
		return opt;
	},
	setList: function(list) {
		if (!list) return false;
		var opt=this.getCookieList();
		var sel=list.selectedIndex;
		while (list.options.length > 1) { list.options[1]=null; } // clear list (except for header item)
		list.options[0]=new Option("There are "+opt.length+" cookies...","",false,false);
		if (!opt.length) { list.form.val.value=""; return; } // no cookies
		var c=1;
		for(var i=0; i<opt.length; i++) {
			var txt="";
			if  (opt[i].substr(0,3)=="chk")
				txt+="["+(config.options[opt[i]]?"\u221A":"_")+"] ";
			txt+=opt[i];
			list.options[c++]=new Option(txt,opt[i],false,false);
		}
		list.selectedIndex=sel>0?sel:0;
		list.form.val.value=sel>0?config.options[list.options[sel].value]:"";
	},
	header:
		"/***\n"
		+"!!![[Baked cookies:|CookieManagerPlugin]]\n"
		+"^^Press {{smallform{<<cookieManager button>>}}} to save the current browser cookies... "
		+"then hand-edit this section to customize the results.^^\n"
		+"***/\n",
	format: function(name) {
		if (name.substr(0,3)=='chk')
			return '\tconfig.options["'+name+'"]='+(config.options[name]?'true;':'false;');
		return '\tconfig.options["'+name+'"]="'+config.options[name]+'";';
	},
	bake: function(here,all) {
		if (story.isDirty(this.target)) return false; // target is being hand-edited... do nothing
		var text=store.getTiddlerText(this.target);
		if (text.indexOf(this.header)==-1) {
			text+=this.header;
			displayMessage("CookieManager: added 'Baked Cookies' section to CookieJar");
		}
		var who=config.options.txtUserName;
		var when=new Date();
		var tags=['systemConfig'];
		var tid=store.getTiddler(this.target)||store.saveTiddler(this.target,this.target,text,who,when,tags,{});
		if (!tid) return false; // if no target... do nothing
		if (all) { 
			var opts=new Array();
			for (var i in config.options) if (i.substr(0,3)=='chk'||i.substr(0,3)=='txt') opts.push(i);
			opts.sort();
		}
		else var opts=this.getCookieList();
		var t=tid.text;
		if (t.indexOf(this.header)==-1) t+=this.header;
		t+='\n// '+opts.length+(all?' options':' cookies')+' saved ';
		t+=when.formatString('on DDD, MMM DDth YYYY at 0hh:0mm:0ss');
		t+=' by '+who+'//\n';
		t+='//^^(edit/remove username check and/or individual option settings as desired)^^//\n';
		t+='//{{{\n';
		t+='if (config.options.txtUserName=="'+who+'") {\n';
		for (i=0; i<opts.length; i++) t+=config.macros.cookieManager.format(opts[i])+"\n";
		t+='}\n//}}}\n';
		store.saveTiddler(this.target,this.target,t,who,when,tags,tid?tid.fields:{});
		story.displayTiddler(story.findContainingTiddler(this),this.target);
		story.refreshTiddler(this.target,null,true);
		var msg=opts.length+(all?' options':' cookies')+' have been saved in '+this.target+'.  ';
		msg+='Please review all stored settings.';
		displayMessage(msg);
		return false;
	}
}
//}}}
//{{{
// Hijack saveOptionCookie() to add cookie blocking and monitoring messages
config.macros.cookieManager.saveOptionCookie=saveOptionCookie;
window.saveOptionCookie=function(name,force)
{
	var cmc=config.macros.cookieManager; // abbrev
	if (force || ((config.options.chkAllowBrowserCookies || name=="chkAllowBrowserCookies")
		&& !cmc.blockedCookies.contains(name) && cmc.allowBrowserCookie(name))) {
		cmc.saveOptionCookie.apply(this,arguments);
		cmc.displayStatus(name+"="+config.options[name]);
	} else cmc.displayStatus("setting of '"+name+"' is blocked");
}

// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

// ... and then hijack it to add cookie blocking and monitoring messages
config.macros.cookieManager.removeCookie=removeCookie;
window.removeCookie=function(name,force)
{
	var cmc=config.macros.cookieManager; // abbrev
	if (!cmc.getCookieList().contains(name))
		return; // not a current cookie!
	if (force || ((config.options.chkAllowBrowserCookies || name=="chkAllowBrowserCookies")
		&& !cmc.blockedCookies.contains(name) && cmc.allowBrowserCookie(name))) {
		cmc.removeCookie.apply(this,arguments);
		cmc.displayStatus("deleted "+name);
	} else cmc.displayStatus("deletion of '"+name+"' is blocked");
}
//}}}
/%
|Name|ToggleSinglePageMode|
|Source|http://www.TiddlyTools.com/#ToggleSinglePageMode|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|enable/disable 'one tiddler at a time' display mode|

Usage: <<tiddler ToggleSinglePageMode with: "label">>

%/<script label="$1" title="enable/disable 'one tiddler at a time' display mode">
	var opt="chkSinglePageMode";
	config.options[opt]=!config.options[opt];
	saveOptionCookie(opt);
	displayMessage('Single-page mode is: '+(config.options[opt]?'ON':'OFF'));
	config.macros.option.propagateOption(opt,"checked",config.options[opt],"input");
</script><script>
	if ('$1'=='$'+'1') place.lastChild.innerHTML="Toggle 'single tiddler' display";
</script>
/%
|Name|ToggleScrollingSidebars|
|Source|http://www.TiddlyTools.com/#ToggleScrollingSidebars|
|Version|1.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|enable/disable 'fixed' positioning of left and right sidebars|
%/<script>
	if (config.options.chkScrollSidebars==undefined)
		config.options.chkScrollSidebars=true;
	if (!config.options.txtOuterTabHeight||!config.options.txtOuterTabHeight.length)
		config.options.txtOuterTabHeight="25em";
	if (!config.options.txtInnerTabHeight||!config.options.txtInnerTabHeight.length)
		config.options.txtInnerTabHeight="21em";

	window.ToggleScrollingSidebars_setscroll = function() {
		var scroll=config.options.chkScrollSidebars?'':'fixed';
		document.getElementById('mainMenu').style.position=scroll;
		document.getElementById('sidebar').style.position=scroll;
		var outer=config.options.txtOuterTabHeight;
		if (config.options.chkScrollSidebars) outer="auto";
		var inner=config.options.txtInnerTabHeight;
		if (config.options.chkScrollSidebars) inner="auto";
		var css='#sidebarTabs .tabContents { height:'+outer+'; overflow:'+(outer!='auto'?'auto':'visible')+'; width:92.5%; }';
		css+='#sidebarTabs .tabContents .tabContents { height:'+inner+' !important; }';
		setStylesheet(css,'shortSidebarTabs');
	}
	window.ToggleScrollingSidebars_setscroll();
</script><<option chkScrollSidebars>><script>
	place.lastChild.checked=config.options.chkScrollSidebars;
	place.lastChild.onchange=function() {
		config.options.chkScrollSidebars=this.checked;
		saveOptionCookie("chkScrollSidebars");
		window.ToggleScrollingSidebars_setscroll();
	};
</script> sidebars scroll with page
/%
|Name|ToggleTiddlerTags|
|Source|http://www.TiddlyTools.com/#ToggleTiddlerTags|
|Version|1.0.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide tiddler tags display in all tiddlers|

Usage:

in tiddler content:
	<<tiddler ToggleTiddlerTags>>

in ViewTemplate or EditTemplate:
	<span class='toolbar' macro='tiddler ToggleTiddlerTags'></span>
	OR, if TiddlyTools' CoreTweaks for ticket #610 is installed:
	<span class='toolbar' macro='toolbar ... ToggleTiddlerTags...'></span>

%/<script label="tags" title="show/hide tiddler tags">
	config.options.chkHideTiddlerTags=!config.options.chkHideTiddlerTags;
	var show=config.options.chkHideTiddlerTags?'none':'block';
	setStylesheet('.tiddler .tagged { display:'+show+'; }','toggleTiddlerTags')
</script><script>
	if ("$1"!="$"+"1") place.lastChild.innerHTML="$1";
	place.lastChild.style.fontWeight="normal";
</script>
system tag
<<tiddler ToggleBreadcrumbs>>
<<tiddler ToggleScrollingSidebars>>
<<options>>
!About the ~IncludePlugin
Include other ~TiddlyWikis in your (main) TiddlyWiki, link to included tiddlers, view them in your (main) TiddlyWiki, without opening another TiddlyWiki. Even „search“ looks for included tiddlers. 

A great way to share tiddlers, to speed up "save changes" and to keep your ~TiddlyWikis small.
!Smaller ~TiddlyWikis
Other than „imported“ tiddlers, included tiddlers are not copied into your main ~TiddlyWiki. This keeps your individual ~TiddlyWikis small. 

Since your TiddlyWikis will become smaller (if you reorganize your TiddlyWikis using the IncludePlugin) also "save changes" becomes faster. You may even consider switching on "AutoSave" or "SaveBackups" again.

See also: [[Including even smaller TiddlyWiki Files]]

!Sharing ~TiddlyWikis
You may include one ~TiddlyWiki in several other ~TiddlyWikis. Changes you make to this shared ~TiddlyWiki are automatically reflected the next time you open the other ~TiddlyWikis, without any extra „import“ step or so.

''Examples''
* you may want to have a single „~TiddlyWikiHelp“ ~TiddlyWiki that you include in all your ~TiddlyWikis. So you can quickly find help information without looking into other files, and without blowing up your ~TiddlyWikis.
* You "archive" your old journal tiddlers into an extra TiddlyWiki (e.g. one per month) and just include the archived journals in you "current month diary/blog". This way you still have access to the old information (e.g. to reference historic information) but you avoid your diary/blog will get to large.
* ...

See also:
* [[How to use the IncludePlugin]]
* [[How Tiddlers are found]]
* [[IncludePlugin Options]]
* [[The "include" Macro]]
* [[The "includeState" Macro]]
* [[Programming with the IncludePlugin]]
* [[Troubleshooting the IncludePlugin]]
Using the AdvancedOptions page you have an easy way to configure the IncludePlugin options. 

You will find a section like this:
{{optionsBlock{
<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])
^^(Reload this ~TiddlyWiki to make changes become effective)^^
}}}
* By default the IncludePlugin is enabled. If you uncheck the checkbox external TiddlyWikis are not included.
* The IncludeList is the preferred place for your {{{<<include ...>>}}} lines.
* The IncludeState page gives you can an overview what TiddlyWikis are included etc.
* The help directs you to the online documentation of the Include Plugin.
/***
|''Name:''|abego.IncludePlugin|
|''Version:''|1.0.1 (2007-04-30)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#IncludePlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[IncludePlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]]|
|''Community:''|([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin]]) ([[Support|http://groups.google.com/group/TiddlyWiki]])|
|''Copyright:''|&copy; 2007 [[abego Software|http://www.abego-software.de]]|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''~CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js]] to get the readable source code.
***/
///%
if(!window.abego){window.abego={};}var invokeLater=function(_1,_2,_3){return abego.invokeLater?abego.invokeLater(_1,_2,_3):setTimeout(_1,_2);};abego.loadFile=function(_4,_5,_6){var _7=function(_8,_9,_a,_b,_c){return _8?_5(_a,_b,_9):_5(undefined,_b,_9,"Error loading %0".format([_b]));};if(_4.search(/^((http(s)?)|(file)):/)!=0){if(_4.search(/^((.\:\\)|(\\\\)|(\/))/)==0){_4="file://"+_4;}else{var _d=document.location.toString();var i=_d.lastIndexOf("/");_4=_d.substr(0,i+1)+_4;}_4=_4.replace(/\\/mg,"/");}loadRemoteFile(_4,_7,_6);};abego.loadTiddlyWikiStore=function(_f,_10,_11,_12){var _13=function(_14,_15){if(_12){_12(_14,"abego.loadTiddlyWikiStore",_15,_f,_11);}};var _16=function(_17,_18){var _19=_18.indexOf(startSaveArea);var _1a=_18.indexOf("<!--POST-BODY-END--"+">");var _1b=_18.lastIndexOf(endSaveArea,_1a==-1?_18.length:_1a);if((_19==-1)||(_1b==-1)){return config.messages.invalidFileError.format([_f]);}var _1c="<html><body>"+_18.substring(_19,_1b+endSaveArea.length)+"</body></html>";var _1d=document.createElement("iframe");_1d.style.display="none";document.body.appendChild(_1d);var doc=_1d.document;if(_1d.contentDocument){doc=_1d.contentDocument;}else{if(_1d.contentWindow){doc=_1d.contentWindow.document;}}doc.open();doc.writeln(_1c);doc.close();var _1f=doc.getElementById("storeArea");_17.loadFromDiv(_1f,"store");_1d.parentNode.removeChild(_1d);return null;};var _20=function(_21){_13("Error when loading %0".format([_f]),"Failed");_10(undefined,_f,_11,_21);return _21;};var _22=function(_23){_13("Loaded %0".format([_f]),"Done");_10(_23,_f,_11);return null;};var _24=function(_25,_26,_27,_28){if(_25===undefined){_20(_28);return;}_13("Processing %0".format([_f]),"Processing");var _29=config.messages.invalidFileError;config.messages.invalidFileError="The file '%0' does not appear to be a valid TiddlyWiki file";try{var _2a=new TiddlyWiki();var _2b=_16(_2a,_25);if(_2b){_20(_2b);}else{_22(_2a);}}catch(ex){_20(exceptionText(ex));}finally{config.messages.invalidFileError=_29;}};_13("Start loading %0".format([_f]),"Started");abego.loadFile(_f,_24,_11);};(function(){if(abego.TiddlyWikiIncluder){return;}var _2c="waiting";var _2d="loading";var _2e=1000;var _2f=-200;var _30=-100;var _31=-300;var _32;var _33=[];var _34={};var _35=[];var _36;var _37=[];var _38;var _39=function(){if(_32===undefined){_32=config.options.chkUseInclude===undefined||config.options.chkUseInclude;}return _32;};var _3a=function(url){return "No include specified for %0".format([url]);};var _3c=function(){var _3d=_35;_35=[];if(_3d.length){for(var i=0;i<_37.length;i++){_37[i](_3d);}}};var _3f;var _40=function(){if(_36!==undefined){clearInterval(_36);}_3f=0;var _41=function(){abego.TiddlyWikiIncluder.sendProgress("","","Done");};_36=setInterval(function(){_3f++;if(_3f<=10){return;}clearInterval(_36);_36=undefined;abego.TiddlyWikiIncluder.sendProgress("Refreshing...","","");refreshDisplay();invokeLater(_41,0,_2f);},1);};var _42=function(_43){var _44;for(var i=0;i<_33.length;i++){var _46=abego.TiddlyWikiIncluder.getStore(_33[i]);if(_46&&(_44=_43(_46,_33[i]))){return _44;}}};var _47=function(){if(!window.store){return invokeLater(_47,100);}var _48=store.fetchTiddler;store.fetchTiddler=function(_49){var t=_48.apply(this,arguments);if(t){return t;}if(config.shadowTiddlers[_49]!==undefined){return undefined;}if(_49==config.macros.newTiddler.title){return undefined;}return _42(function(_4b,url){var t=_4b.fetchTiddler(_49);if(t){t.includeURL=url;}return t;});};if(_33.length){_40();}};var _4e=function(){if(!window.store){return invokeLater(_4e,100);}var _4f=store.getTiddlerText("IncludeList");if(_4f){wikify(_4f,document.createElement("div"));}};var _50=function(_51){var _52=function(){var _53=store.forEachTiddler;var _54=function(_55){var _56={};var _57;var _58=function(_59,_5a){if(_56[_59]){return;}_56[_59]=1;if(_57){_5a.includeURL=_57;}_55.apply(this,arguments);};_53.call(store,_58);for(var n in config.shadowTiddlers){_56[n]=1;}_56[config.macros.newTiddler.title]=1;_42(function(_5c,url){_57=url;_5c.forEachTiddler(_58);});};store.forEachTiddler=_54;try{return _51.apply(this,arguments);}finally{store.forEachTiddler=_53;}};return _52;};var _5e=function(_5f,_60){return _5f[_60]=_50(_5f[_60]);};abego.TiddlyWikiIncluder={};abego.TiddlyWikiIncluder.setProgressFunction=function(_61){_38=_61;};abego.TiddlyWikiIncluder.getProgressFunction=function(_62){return _38;};abego.TiddlyWikiIncluder.sendProgress=function(_63,_64,_65){if(_38){_38.apply(this,arguments);}};abego.TiddlyWikiIncluder.onError=function(url,_67){displayMessage("Error when including '%0':\n%1".format([url,_67]));};abego.TiddlyWikiIncluder.hasPendingIncludes=function(){for(var i=0;i<_33.length;i++){var _69=abego.TiddlyWikiIncluder.getState(_33[i]);if(_69==_2c||_69==_2d){return true;}}return false;};abego.TiddlyWikiIncluder.getIncludes=function(){return _33.slice();};abego.TiddlyWikiIncluder.getState=function(url){var s=_34[url];if(!s){return _3a(url);}return typeof s=="string"?s:null;};abego.TiddlyWikiIncluder.getStore=function(url){var s=_34[url];if(!s){return _3a(url);}return s instanceof TiddlyWiki?s:null;};abego.TiddlyWikiIncluder.include=function(url,_6f){if(!_39()||_34[url]){return;}var _70=this;_33.push(url);_34[url]=_2c;var _71=function(_72,_73,_74,_75){if(_72===undefined){_34[url]=_75;_70.onError(url,_75);return;}_34[url]=_72;_35.push(url);invokeLater(_3c);};var _76=function(){_34[url]=_2d;abego.loadTiddlyWikiStore(url,_71,null,_38);};if(_6f){invokeLater(_76,_6f);}else{_76();}};abego.TiddlyWikiIncluder.forReallyEachTiddler=function(_77){var _78=function(){store.forEachTiddler(_77);};_50(_78).call(store);};abego.TiddlyWikiIncluder.getFunctionUsingForReallyEachTiddler=_50;abego.TiddlyWikiIncluder.useForReallyEachTiddler=_5e;abego.TiddlyWikiIncluder.addListener=function(_79){_37.push(_79);};abego.TiddlyWikiIncluder.addListener(_40);if(config.options.chkUseInclude===undefined){config.options.chkUseInclude=true;}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])\n^^(Reload this ~TiddlyWiki to make changes become effective)^^";config.shadowTiddlers.IncludeState="<<includeState>>";var _7a=function(e,_7c,_7d){if(!anim||!abego.ShowAnimation){e.style.display=_7c?"block":"none";return;}anim.startAnimating(new abego.ShowAnimation(e,_7c,_7d));};abego.TiddlyWikiIncluder.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\n"+"background-color:#FFCC00;\n"+"position:absolute;\n"+"right:0.2em;\n"+"top:0.2em;\n"+"width:7em;\n"+"padding-left:0.2em;\n"+"padding-right:0.2em\n"+"}\n","abegoInclude");var _7e=function(){var e=document.createElement("div");e.className="includeProgressState";e.style.display="none";document.body.appendChild(e);return e;};var _80=_7e();var _81=function(_82){removeChildren(_80);createTiddlyText(_80,_82);_7a(_80,true,0);};var _83=function(){invokeLater(function(){_7a(_80,false,_2e);},100,_30);};var _84=function(_85,_86,_87,url,_89){if(_87=="Done"||_87=="Failed"){_83();return;}if(_86=="abego.loadTiddlyWikiStore"){_3f=0;if(_87=="Processing"){_81("Including...");}}else{_81(_85);}};return _84;};abego.TiddlyWikiIncluder.setProgressFunction(abego.TiddlyWikiIncluder.getDefaultProgressFunction());config.macros.include={};config.macros.include.handler=function(_8a,_8b,_8c,_8d,_8e,_8f){_8c=_8e.parseParams("url",null,true,false,true);var _90=parseInt(getParam(_8c,"delay","0"));var _91=_8c[0]["url"];var _92=getFlag(_8c,"hide",false);if(!_92){createTiddlyText(createTiddlyElement(_8a,"code"),_8d.source.substring(_8d.matchStart,_8d.nextMatch));}for(var i=0;_91&&i<_91.length;i++){abego.TiddlyWikiIncluder.include(_91[i],_90);}};config.macros.includeState={};config.macros.includeState.handler=function(_94,_95,_96,_97,_98,_99){var _9a=function(){var s="";var _9c=abego.TiddlyWikiIncluder.getIncludes();if(!_9c.length){return "{{noIncludes{\nNo includes or 'include' is disabled (see AdvancedOptions)\n}}}\n";}s+="|!Address|!State|\n";for(var i=0;i<_9c.length;i++){var inc=_9c[i];s+="|{{{"+inc+"}}}|";var t=abego.TiddlyWikiIncluder.getState(inc);s+=t?"{{{"+t+"}}}":"included";s+="|\n";}s+="|includeState|k\n";return s;};var _a0=function(){removeChildren(div);wikify(_9a(),div);if(abego.TiddlyWikiIncluder.hasPendingIncludes()){invokeLater(_a0,500,_31);}};var div=createTiddlyElement(_94,"div");invokeLater(_a0,0,_31);};var _a2=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return _a2.apply(this,arguments)||this.isIncluded();};Tiddler.prototype.isIncluded=function(){return this.includeURL!=undefined;};Tiddler.prototype.getIncludeURL=function(){return this.includeURL;};var _a3={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1};for(var n in _a3){_5e(TiddlyWiki.prototype,n);}var _a5=function(){if(abego.IntelliTagger){_5e(abego.IntelliTagger,"assistTagging");}};var _a6=function(){if(config.macros.forEachTiddler){_5e(config.macros.forEachTiddler,"findTiddlers");}};_47();invokeLater(_4e,100);invokeLater(_a5,100);invokeLater(_a6,100);})();
//%/
It's the [[Funny things to do with your microwave oven page|http://margo.student.utwente.nl/el/microwave/]]. Everyone has heard of microwaving your CD... but not so many know about microwaving a bar of soap... Thanks to [[slashdot|http://slashdot.org/]] for the tip.

Also be looking at the [[Single pixel webcam|http://www-jcsu.jesus.cam.ac.uk/~rpc25/webcam/]] (even cooler, check out the graphs. Why am I reminded of my fetchmail strange attractor?
Is there such a thing as a Standard Dinner?

!! My Food has Standards!
* There is an igNobel winning ISO standard for a cup of tea: http://en.wikipedia.org/wiki/ISO_3103
* There is a US Military standard for oatmeal cookies and brownies here: http://liw.iki.fi/liw/misc/MIL-C-44072C.pdf 
** summarised here: http://reason.com/blog/2010/05/17/how-to-make-brownies-pentagon
** attempted here: http://www.crikey.com.au/2010/06/04/daily-proposition-dont-bake-the-26-page-pentagon-brownie-recipe/

* Drinks from a 1litre jug, and 1cup glasses. 
* The invites to such a dinner would be given in ISO 8601 compliant date/time format.  (http://en.wikipedia.org/wiki/ISO_8601)

!! Less formal Standards...
* http://en.wikipedia.org/wiki/Utah_teapot - make tea from this?
* The Royal Society of Chemists have their own recommendation for tea: http://www.rsc.org/pdf/pressoffice/2003/tea.pdf
* The Apr1 RFC for Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) - http://www.ietf.org/rfc/rfc2324.txt :)
* Ansi Standard Pizza - Pepperoni and Mushroom. See http://www.definitions.net/definition/ansi%20standard%20pizza

!! Unresolved issues and ideas
* What other standard foods are there?
* Plates to be... ?
** 10cm to a side and square? 
** ...or at least in unit circles (thanks teferi)
* Tea and cookies isn't a dinner. It's a tea break - but "Standards Tea Break" is a little lacking in style. Perhaps a 'Standards Tea Party' could work though. 

* notes on my phone called this "fractal dinner" at one point. I'm not quite sure what the idea there was, but I like the name. 
all the sabre sound effects from the trilogy, in order. 

perhaps with Dual of the Fates set quietly in the background?
I don't know if this would be best under "cool", "ideas" or "compute"...

[[/.|http://www.slashdot.org]] gives us a link to the [["doomsday" algorithm|http://www.interlog.com/~r937/doomsday.html]], and [[here is a poem|http://www.cs.wustl.edu/~ksl2/mathpoem.html]] of the same. What is it? Just a method to find out the day for any given date that is so easy you can do it in your head :)
It's only when you're up all night trying to pack for six weeks on the other side of the planet, do you realise that *this* is the year all those summer clothes were going to need major replacement. The start of winter is not the best time to go searching out summer clothing. 

On the other hand though, a dose of firetwirling and breathing followed by [[Oh Brother, Where Art Thou|http://us.imdb.com/Details?0190590]] (the latest Coen Brothers film) is definitely a worthy way to spend my last night in Canberra for almost 2 months!
This is an eight week holiday. That is, one week in Brisbane and travel to NYC, six weeks in the USA itself, and one week return travel and recover. For the bulk of the holiday, I'm staying totally out of touch. So why is this journal entry here at all...?
----
I was originally going to stay in touch with people via email. That, afterall, seems to be what it is designed to be for!

Then it was suggested to me that I should have this holiday to myself - TOTALLY to myself. No email, no phone, nothing. And, except for a couple of "I made it here safe" phonecalls when I arrived, I've kept my level of communication to zero. (and indeed, it IS a good idea :)

Today, I celebrate having been in the states for two weeks (the six weeks will be over before I realise it!). I broke my lack of online presence to retrieve one email - that purpose accomplished, I am taking the opportunity while I am online to explain myself here... 

When I return, I'll write a "real" and properly long journal entry about my adventures (mis-, and otherwise). Till then... I am not, in fact, here at all.
Well folks, I'm back home. The trip was a blast. Tokyo, NYC, Niagra Falls, New England, Boston... 

Thanks to Jacy for six weeks of living space.

I'll scan and put online a full account of the trip. Watch this space.
A couple of weeks back home, and you're all fresh and invigorated about life. And also in need of a strict savings plan to get my finances back in theblack... so what better time to lash out and buy a new machine (of course, it helps to have an extremely good working relationship with the people selling you the hardware! :)
----
For years I've intended to name my first "real" new machine "Nautilus" - and stuff the server/workstation naming scheme I otherwise use. It's a nice new 1.1Ghz Athlon on an ASUS ~A7V-C motherboard, with 512MB ram, 64MB ~GeForceII and Creative Live Value. All wrapped up with my existing 10bT NIC, 10G of HDD, and inside an Aopen ~HX45A case.

Yummy.
Sometimes, in one of those fits of "nothing better to do" you find yourself watching those bad daytime soap opera wannabe dramas. And you think about how totally unrealistic the situations the characters get themselves into are...
----
And so I wonder about who is the script writer in my life. Apparently there is a studio audience too. I hope they're enjoying themselves. Not to say that I'm not of course - I'm one of the main characters at the moment. I just hope I don't get killed off too early in the piece, and then be called back to play my own evil twin brother or something. 

But I get sidetracked. I've been having days that would get the scriptwriters of daytime soaps fired for being too cliche, not realistic enough, too formulaic, etc.

It's been an interesting week, to say the least.
This one goes out to all avid ~nemo webpage watchers out there. The info section is slowly being filled - the software pages being the latest victim to my motivation.
----
The NYC photos will be online too - don't fret about that.

Scanning, rescanning, panoramorating, colour correcting, cropping, resizing, etc... on 100+ pictures is no quick task. *hee* So, I think that's about it for now... :)
It's leading into springtime in Canberra - only a few more days and it's officially here. Indeed, the weather knows about it already. Slow rain that I expect to last all week is here. It's cold, it's refreshing, it's cleansing.

I like it.
Sometimes designs can have quite arbitrary criteria. Consider CDs. They have a length of 74 minutes - and the best known [[reason why|http://www.urbanlegends.com/misc/cd/cd_length_skeptical.html]] (Beethoven's Ninth) is quite arbitrary. So what other arbitrary design criteria can we come up with?
----
To continue the musical theme here, we can look at the original vinyl LPs. Their playing time was designed with much the [[same idea|http://www.musicinthemail.com/audiohistoryLP.html]] in mind.

But most importantly, I want to know why the ability to fit a queen sized mattress into the storage area //wasn't// an arbitrary design criteria for any and all cargo movers. This includes [[Panelvans|http://www.geocities.com/motorcity/garage/2197/vanring.htm]]. Humph!
{{center{
"The future is all around us, waiting, in moments
of transition, to be born in moments of revelation.
No one knows the shape of that future or where it will
take us. We know only that it is always born in pain."
   -- G'Kar, (Babylon 5 - episode 66 - Z'ha'dum)
}}}
History, like geology, has layers. I think today's attacks on the WTC and the pentagon mark such a transition.
----
Only a couple of months ago I was touristing on the WTC - I guess this alone makes it all seem closer to home.

Jacy, Rob, Chris, Angie, and others that I know live in New York. I haven't heard from Chris yet, but the others are fine.

Various levels of shock. It's hard to compose any kind of rational thought process out of this, and at the moment alot of me is running on autopilot. I increasingly think of Winter's Tale. 

A moment of silence, please.
Some weeks are born hectic.
Some weeks have hectic thrust upon them.
And some weeks achieve hectic through the efforts of those participating.
----
Last saturday Terri and I started looking for houses with all seriousness, and idly circled a few likely suspects in the paper. Managed to miss a few realestates, but got a few more. Found an online form for one of the places and filled it out, ready to mail out should we get to see the place and happen to like it.

So, Monday we looked at a house and deemed it unworthy.
Tuesday we went to look at another place and went "this is pretty damn neat you know". We also went "we should get a form to mail in", quickly followed by "we already filled in that form, it's ready". Not too long after that we were at the "oh, it got mailed yesterday? well, I guess that's cool then since we want the place afterall".
Tuesday night is also notable for being the one-month anniversary for Terri and I, celebrated at Hungry Jacks where we also commemorated one-year of the same Post It note with another.
Wednesday the realestate call and said "the place is yours, if you want it". Big hoopla! moment, and we kind of forego looking at other places that day. And in fact, we stop looking for good and continue packing in all seriousness.
Thursday was dinner, though not with each other, but with our respective pasts.
Friday - today, we signed the lease, got the keys, and big wow. ...that would be, {{big{WOW}}}.
We'll be moving stuff tomorrow, sunday... and likely fully out of [[nethouse|Nethouse 2]] by the end of next week!
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]]  is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version

!Code
***/
//{{{

	
//============================================================================
//============================================================================
//		   ForEachTiddlerPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

if (!window.abego) window.abego = {};

version.extensions.ForEachTiddlerPlugin = {
	major: 1, minor: 0, revision: 8, 
	date: new Date(2007,3,12), 
	source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};

// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
	TiddlyWiki.prototype.forEachTiddler = function(callback) {
		for(var t in this.tiddlers) {
			callback.call(this,t,this.tiddlers[t]);
		}
	};
}

//============================================================================
// forEachTiddler Macro
//============================================================================

version.extensions.forEachTiddler = {
	major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
	 // Standard Properties
	 label: "forEachTiddler",
	 prompt: "Perform actions on a (sorted) selection of tiddlers",

	 // actions
	 actions: {
		 addToList: {},
		 write: {}
	 }
};

// ---------------------------------------------------------------------------
//  The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	var title = e ? e.getAttribute("tiddler") : null; 
	return title ? store.getTiddler(title) : null;
};

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

	if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params
	// Parse the "in" clause
	var tiddlyWikiPath = undefined;
	if ((i < params.length) && params[i] == "in") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "TiddlyWiki path expected behind 'in'.");
			return;
		}
		tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the where clause
	var whereClause ="true";
	if ((i < params.length) && params[i] == "where") {
		i++;
		whereClause = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the sort stuff
	var sortClause = null;
	var sortAscending = true; 
	if ((i < params.length) && params[i] == "sortBy") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "sortClause missing behind 'sortBy'.");
			return;
		}
		sortClause = this.paramEncode(params[i]);
		i++;

		if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
			 sortAscending = params[i] == "ascending";
			 i++;
		}
	}

	// Parse the script
	var scriptText = null;
	if ((i < params.length) && params[i] == "script") {
		i++;
		scriptText = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the action. 
	// When we are already at the end use the default action
	var actionName = "addToList";
	if (i < params.length) {
	   if (!config.macros.forEachTiddler.actions[params[i]]) {
			this.handleError(place, "Unknown action '"+params[i]+"'.");
			return;
		} else {
			actionName = params[i]; 
			i++;
		}
	} 
	
	// Get the action parameter
	// (the parsing is done inside the individual action implementation.)
	var actionParameter = params.slice(i);


	// --- Processing ------------------------------------------
	try {
		this.performMacro({
				place: place, 
				inTiddler: tiddler,
				whereClause: whereClause, 
				sortClause: sortClause, 
				sortAscending: sortAscending, 
				actionName: actionName, 
				actionParameter: actionParameter, 
				scriptText: scriptText, 
				tiddlyWikiPath: tiddlyWikiPath});

	} catch (e) {
		this.handleError(place, e);
	}
};

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

	var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

	var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
	context["tiddlyWiki"] = tiddlyWiki;
	
	// Get the tiddlers, as defined by the whereClause
	var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
	context["tiddlers"] = tiddlers;

	// Sort the tiddlers, when sorting is required.
	if (parameter.sortClause) {
		this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
	}

	return {tiddlers: tiddlers, context: context};
};

// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
	return this.getTiddlersAndContext(parameter).tiddlers;
};

// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
//				  The following properties are supported:
//
//						place
//						whereClause
//						sortClause
//						sortAscending
//						actionName
//						actionParameter
//						scriptText
//						tiddlyWikiPath
//
//					All properties are optional. 
//					For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
	var tiddlersAndContext = this.getTiddlersAndContext(parameter);

	// Perform the action
	var actionName = parameter.actionName ? parameter.actionName : "addToList";
	var action = config.macros.forEachTiddler.actions[actionName];
	if (!action) {
		this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
		return;
	}

	var actionHandler = action.handler;
	actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};

// ---------------------------------------------------------------------------
//  The actions 
// ---------------------------------------------------------------------------

// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;

	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
		return;
	}

	// Perform the action.
	var list = document.createElement("ul");
	place.appendChild(list);
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		var listItem = document.createElement("li");
		list.appendChild(listItem);
		createTiddlyLink(listItem, tiddler.title, true);
	}
};

abego.parseNamedParameter = function(name, parameter, i) {
	var beginExpression = null;
	if ((i < parameter.length) && parameter[i] == name) {
		i++;
		if (i >= parameter.length) {
			throw "Missing text behind '%0'".format([name]);
		}
		
		return config.macros.forEachTiddler.paramEncode(parameter[i]);
	}
	return null;
}

// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;
	if (p >= parameter.length) {
		this.handleError(place, "Missing expression behind 'write'.");
		return;
	}

	var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
	p++;

	// Parse the "begin" option
	var beginExpression = abego.parseNamedParameter("begin", parameter, p);
	if (beginExpression !== null) 
		p += 2;
	var endExpression = abego.parseNamedParameter("end", parameter, p);
	if (endExpression !== null) 
		p += 2;
	var noneExpression = abego.parseNamedParameter("none", parameter, p);
	if (noneExpression !== null) 
		p += 2;

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		p++;
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
			return;
		}
		
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		p++;
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			p++;
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
				return;
			}
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
			p++;
		}
	}
	
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
		return;
	}

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	}
	
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

	if (count == 0 && noneExpression) 
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
		

	if (filename) {
		if (lineSeparator !== undefined) {
			lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
			text = text.replace(/\n/mg,lineSeparator);
		}
		saveFile(filename, convertUnicodeToUTF8(text));
	} else {
		var wrapper = createTiddlyElement(place, "span");
		wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
	}
};


// ---------------------------------------------------------------------------
//  Helpers
// ---------------------------------------------------------------------------

// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
	return {
		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
	};
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


	
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
//	 (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
			result.push(tiddler);
		}
	});
	return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	}
	this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
	}

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;
	}
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
	displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	}
	message += ">>";
	displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;
	}
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
	"forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
		}
	}
	return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
		}
	}
	return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
		}
	}
	return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/

Here are some examples that show the usage of the write action in the ForEachTiddlerMacro.

//''Select and Sort Examples''//
* InClauseExamples
* WhereClauseExamples
* SortClauseExamples
* ScriptClauseExamples
//''Action Examples''//
* AddToListActionExamples
* WriteActionExamples


Of cause you may also combine the examples, e.g. taking the whereClause of one example, the sortClause of a second and the action of a third.
//~~(Part of the [[ForEachTiddlerPlugin]])~~//

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


''Using JavaScript''

To give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples]] and adapt them to your needs.

''The Elements of the Macro''

The arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.

<<slider chkFETInClause [[inClause]] "inClause" "inClause">>
<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>
<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>
<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>
<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>

''Using Macros and ">" inside the forEachTiddler Macro''

You may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.

In addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.

''Using {{{<<tiddler ... with: ...>>}}} to re-use ForEachTiddler definitions''

Sometimes you may want to use a certain ForEachTiddler definition in slight variations. E.g. you may want to list either the tiddlers tagged with "ToDo" and in the other case with "Done". To do so you may use "Tiddler parameters". Here an example:

Replace the variable part of the ForEachTiddler definition with $1 ($2,... $9 are supported). E.g. you may create the tiddler "ListTaggedTiddlers" like this
{{{
<<forEachTiddler 
 where 
 'tiddler.tags.contains("$1")'
>>
}}}

Now you can use the ListTaggedTiddlers for various specific tags, using the {{{<<tiddler ...>>}}} macro:
{{{
<<tiddler ListTaggedTiddlers with: "systemConfig">>
}}}
{{{
<<tiddler ListTaggedTiddlers with: "Plugin">>
}}}


See also [[ForEachTiddlerExamples]].
For years people have been talking about technological implants to the human body. They want to be a cyborg.

Well, sorry.. but not me. I'm a geek, but not one that wants to violate my flesh and blood body.
----
However, that's not to say that I don't dream of improvements. I've a list of [[genetic changes|2001 01 19 - Genetics]] I'd happily apply to myself if it was possible. (gills are merely the obvious call on this point).

I also consider technological supplentments a great idea. Just not *implants*. For years I've dreamt of glasses that would supplement my vision with information about what I'm looking at. Glance at acar, and I get a label identifying the brand, make and model... or maybe the system would know the layout of the local supermarket and direct me directly to all my shopping list items?

A dream? [[It's becoming a reality...|http://www.nytimes.com/2001/09/25/science/physical/25CYBO.html]]
[[This article|http://www.discover.com/dec_99/featsyn.html]] at [[discover.com|http://www.discover.com/]] details a condition called "synesthesia". Do you smell colours? Do numbers have a colour? Does the sound of music have texture? If you answered "yes" to any of these questions, than perhaps you too are a synesthete!
I was watching a TV show (in the states in fact) about Roller Coasters and their design. One of the points made was how coaster designers are forever seeking new thrill-seeking moves for consumers to experience.

It occured to me that noone has yet made a Rollercoaster that runs as if on a moebius strip. I'm sure it'd take some way clever engineering, but I'm also sure it'd be quite possible. And a decent ride too! (would this be the ultimate geek thrill ride?)
Couldn't be done they said. Reinstall they said.
ha! I said. Ha! there, I said it again.

Win2k, then win98, then linux. You can't boot win2k again they said. I proved them wrong. nyah!

Now... if I could only just login...
Accidental rm -rf's on the wrong system really suck.
...I did this today, and lost some of this website. Oops. Fortunately, most of the important new-stuff has been found on the caching proxy at home, so it'll all be back soon :)
Circuits that evolve to work? Sounds amazing, but it's true, [[and it IS amazing|http://www.vcc.com/Hotworks_2.html]]. Also, ternary numbers look cool, and might be the way of the future. [[This slashdot story|http://slashdot.org/article.pl?sid=01/11/19/1347252&mode=nested]] has some good links regarding ternary computing.
----
''29.Dec.2001 : Update'' More on evolving circuits:
* [[This article|http://www.newsobserver.com/standing/collections/gilster/700000014439.html]] on [[newsobserver|http://www.newsobserver.com/]].
* [[One of the guys working on it|http://www.cogs.susx.ac.uk/users/adrianth/ade.html]]
* [[Slashdot article on it|http://slashdot.org/article.pl?sid=01/12/29/007258&mode=nested]]
Now THIS is cool university life. Unlike [[Real Genius|http://us.imdb.com/Title?0089886]] (as cool as that was), this is [[real life|http://hacks.mit.edu/]].
[[Nethouse]] has been in existance for almost 6 years.

Today it burnt.

nethouse is no more.
----
netmansion top floor is totally gutted - though the bottom floor seems to have escaped the fire unscathed (but water and smoke damage is still substantial)

The fire was this afternoon, and residents are now looking for somewhere to spend the night. Tomorrow is three months since I signed the lease at cheekyhouse.

A full page regarding the history of nethouse will happen.
Friday 21st - [[nethouse|Nethouse 2]] burnt
Monday 24th - Canberra burns, worst fires in 15 years
Tuesday 25th - NSW burns - worst fires in decades
Friday 28th - everything starting to get under control. (NSW still burning well into January however)

What a week. It's always good to remember that fire burns, and water makes you wet...
Welcome to 2002 folks.

This post is a bit later than I planned, but here it is... my primary NewYears resolution...
----
* To "release" something, be it software, writing, poetry, or so on, once every week. The deadline being the sunday of the week. This makes for 52 releases over the year, the first being January6, the last being December29.

Also, the "Candle Cathedral" went down well at NewYears - so I'm planning a new 2002 candle tower... the aim is to add a new candle each week or so to the base candle - so 52 candles to bring in 2003... :)
Well, it's a few days late... but I released the latest version of Tumbleweed for PWM yesterday, marking the first of my 52 "releases" this year.

Find more information at my [[Tumbleweed page|Tumbleweed]]
I have had a recurring gui theme for several years - a colour style many find a little jarring, being primarily made of a earthy maroon, earthy yellow, and subtle hints of pale tealish blue.

As of my adoption of GNOME usage around 2007, I have pretty much ceased using my Tumbleweed theme. 

Prior to that, however, I had adapted it to the following systems / window managers
* Windows (3.1 / 95 / 2000)
* WindowMaker
* PWM
* PekWM
So the releases are speeding up. I'll be on time soon ;)

This week, Nemo presents [[NUDI - Nemo's Ultimate Disc Identifier|http://wiki.thorx.net/wiki/NUDI]]. Think of it as a proper implementation of the ~CDDBp discid. See the page for more details :)
I find myself sitting here quietly surpised at myself for not having posted a story regarding [[Sparkler Bombs|http://www.fromorbit.com/drutter/Bombs.html]] before now. So now is the time.
{{center{
*-=[ [[Sparkler Bombs|http://www.fromorbit.com/drutter/Bombs.html]] ]=-*
}}}
----
Why did this come to mind you may ask? Well it was my curious privilege today to meet Matthew - he known by [[Dan|http://www.dansdata.com]] of the Sparkler Bomb, and indeed was attendance at the party commemorated on the Sparkler Bomb site. So, kinda neat that I say, and it gives me a reason to post to my webpage again, giving the rather suspiscious impression that I maintain it...
Appendum to the new-years resolution: Don't release the same thing two weeks running. ...on the other hand, every second week... ;)
----
This fixes a bug in the 20020111 release, and adds a new feature. See the [[Tumbleweed page|Tumbleweed]] for more info! :)
There are many things that, in the day to day existant life of a carbon based bipedal humanoid on sol3, it is not a good thing to forget. For example, the regular intake of an oxygen based gaseous mix...

Some other things to not forget...
----
* Taking a pair of shoes with you for a 1500km round trip to Melbourne
* Using this website as a journal, and not just a weekly log of overdue releases

...I'm sure there are others... but they don't spring readily to mind at the moment...
This, I've been waiting for ever since I discovered [a] how poorly the "Directors Cut" of Blade Runner was handled, and [b] how poorly the DVD of Blade Runner was.

But it is being recut, digitally mastered, restored, and remixed in 5.1 surround. This is SO COOL. Yay!
----
(PS, here's a [[link|http://www.aintitcoolnews.com/display.cgi?id=11137]])

(''06.Feb.2002'': Here is another, [[more usefull link|http://www.brmovie.com/BR_Special_Edition.htm]])
This release is kind of a rush job to get caught up a little. Or at least, not fall further behind.

Welcome to the new webpage theme - "greenbelt"
----
This new grey/green theme is inspired by a colour photo taken in 1909 by Russian ~Prokudin-Gorskii and can be seen [[here|http://www.loc.gov/exhibits/empire/images/p87-5006.jpg]] as part of [[this exhibition|http://www.loc.gov/exhibits/empire/]].

I was reminded of the photo by my clothing of yesterday, and created this theme quite swiftly, based heavily on the print theme, and using existing images (or modifications) as much as possible. One new image being the greenbelt sidebar image from the original photo.
Veronica is [[Nemo]]'s big white teddy bear - a prize from a christmas raffle in 1997.

She's been known to join in on games... 

{{center{
{{border{
''...note''
these rules tend to be tuned to the sort of relaxed not-highly-competitive gameplay that Nemo and friends participate in. They may not work for all groups
}}}
}}}

!!Monopoly
Rules for Veronica's participation in Monopoly:

* The banker, or other designated player rolls for veronica, moves her piece, collects rent, etc... all the "normal" stuff that is basically just chance. Note that all rent entitled to veronica is FORCED, as she cannot otherwise request rent on her own. 

So what parts of monopoly require decision making?

''Purchasing property''
;From the bank
:Veronica ALWAYS purchases, assuming she has the cash on hand to make the purchase.
;From another player
:Veronica only wants to purchase a property if she already has half or more of the colour group on-hand. The price is set as the cost+10%. Veronica and the seller each roll a D6 to determine the winner (if Veronica rolls highest, then the purchase is made. Tied die are re-rolled) . Veronica may only make one purchase request against each other competitor once each time she travels around the board. These purchase requests are made on her turn.

''Purchasing houses''
:Veronica will try and purchase houses if she can, one set of purchases around the board allowed.

''Selling property to another player''
:This is handled just like buying from another player. The player requests a purchase, price is set as cost+10%, and D6 are rolled to determine purchase. One purchase request against Veronica per player, per player-around-the-board.

''Mortgages''
:Veronica will only mortgage to raise money to pay rent or bills, but not for the regular expense of purchasing properties or houses. When she needs to mortgage, the she will mortgage the minimum number of properties possible such as to meet the payment needs. She will unmortgage as soon as she is financial enough to do so. If she has debts that cannot be met by mortgage alone, then she will sell houses, following the same "minimum to meet costs" rule. 

untested in play: //If veronica has to sell a property to meet costs, then the banker negotiates on her behalf with other players. She may sell one or more properties (ie, she may need to sell a complete colour group so as to complete the sale), but the minimum price for each property is cost-10%. Properties may be auctioned. Veronica will prefer to sell less valuable properties first.//

Is there anything else you need to ''think'' about to play monopoly?

!!Scrabble
Unlike Monopoly, Scrabble is almost entirely a thinking game, very little is chance-based. 

So we work it like this:

Veronica's tiles are hidden except on her own turn when they're played openface. All other players must agree on the word Veronica will play. Every player has veto, so ''everyone'' must agree. If a player thinks a suggested word is to help another player, then veto it!

Replacement pieces are kept hidden till Veronica's next turn, along with remaining pieces also. This way there is a minimum chance of a player relying on Veronica's tiles to help themselves.

Anything else you need for Scrabble?
Actually, in Australia, we don't use the term 'Cell Phones', but 'Mobile Phones', but the title is so much better this way. 

What am I talking about? Predictive spelling on modern phones for when sending SMSs of course. 

A certain number combination will give you the word you want - but it might give you others. 

This page is for humorous examples. Also, some words probably need to be taught to phones - words that are definitely known to be taught (as opposed to built-in) are in italics. 

(please include only 5letter or longer words, unless the 3 or 4 letter word equivalences happen to be humorous or something :)

!! The Lexicon
* 2625: Anal = Cock
* 5455: Kill = Jill = Lill. (Never call your daughter 'Jill' eh?)
* 6366: ''Nemo'' = Memo = Neon = Meno
* 5683: Love = Loud = Jove
* 4663: home = good
* 8732833: updated = treated
* 786637: summer = stones = runner
* 668437: mother = movies = motifs
* 687737: busses = curses


!!!Partial words...
Because sometimes you get a funny word predicted on your way to a longer word. 
* 37684: Froth = Eroti(c)
! The Cult of TFY
''...Thinking For Yourself...''

;Mascot
: One Moronic Ox.
{{{
Nothing as it seems
Example of mystery
This is not a haiku, and despite my efforts to edit and conserve space,
  I always found that I had too many syllables in the last line.
  Shame really. It was coming along quite well apart from that...
}}}
----
{{credit{
2008
}}}
{{{
Queuing for the bus
As if it's some kind of race
Crappy seats for all
}}}
----
{{credit{
March 2008
Predictably, written whilst waiting for a bus
}}}
{{{
Ion engines in action
or thermonuclear reaction
Escaping gravity's attraction
And then we're on our way!

Welcome to Outer Space
But still it's the human race
Now you can find your own place
Soon now we'll be there!

Out here there is nothing to fear
Unless your suit - it has a tear
In the vacuum noone will hear
And there will be no escape!

So on earth we roam
We still call it our only home
And as this poem's shown
It's not all wonderful out there
}}}
----
{{credit{
2006
Originally published to the Bad Poetry of the Day list under the headline of //Floating in Space//
}}}
{{{
Roll the dice
Shuffle the deck
Pick a mood...
How do I feel?

Scared.
Of trying and failing in view of everyone. Of rejection. Of humiliation

Thankful.
For life. Experience and joyous happy times. For ability, health and love

Angry.
At myself when I don't meet my own odd standards.
 At the world when it continues in it's obstinate habit of not thinking

Sad.
Lonely

Lonely.
When there are no people around

Comfortable.
When things seem just right.
But... comfort denies motivation, so is it really a good thing at all?

Horny.
Bad libido days. (just like a bad hair day, but it's not at the tips, but in the roots!)

Amused.
At almost everything when the mood strikes me right.
 Life is, at it's core, amusing. (and you wont get out of it alive, so enjoy it while it lasts!)

Moody.
What sort of mood is this? Redundant? Sarcasm? Irony? A tautology?
 Let's move on...

Tired.
Well, it is almost 3am after all... (only a few hours away).
 OTOH, it's always 3am on the internet. Seriously, long hectic days...

Loved.
When there ARE people around. People I relate to.
 Am comfortable with, and around whom I feel like I can be myself (and they aren't embarrassed!)

Upset.
When things just Don't. Work. Right.

Happy.
When things work out just fine


All of these (and more, naturally), are in me pretty much all of the time.
The only thing which changes is the order...

Shuffle me.
}}}
----
{{justifyright{
2006
Based on the LiveJournal mood list.
Originally published to the Bad Poetry of the Day list under the headline of '//Pick a Card//'
}}}
{{{
People die.
  The old. The young. The sick. The fit.
  The strong. The weak.
  The ill. The healthy.
  The deserving. The undeserving.
Nobody is immune.

The rain patters on the roof above my head
Life continues in cycles all around me.
People die.

Children are born.
  They grow up to be old. Young. Sick. Fit.
  Strong or weak.
  Ill or healthy.
  Deserving of life... or not.
  Everybody is given some kind of chance.
Nobody is immune.
}}}
----
{{credit{
2006
Title taken from a traditional Japanese Zen poem.
Originally published to the Bad Poetry of the Day list under the headline of '//This Mortal Life//'
}}}
{{{
It snowed today so I wrote a poem
In the cold, creativity flowing
I got inside and went to write
But my brain - it was all light
The poem I'm sure was very neat
But like the snow - it melted in the heat
}}}
----
{{justifyright{
2005
Originally published to the BadPoetryOfTheDay list under the headline of '//The insubstatial nature of thought//'
}}}
{{{
A snap, crackle, or pop
Indicates that your machine is going to stop

It's invisible and compressed
So much to escape when machine is laid to rest

The smoke will fill your eyes
As you gaze and then despise

The foolish error of way
That stopped the machine. Today.
}}}
----
{{credit{
2005
Originally published to the BadPoetryOfTheDay list under the headline of '//oops - pop//'
}}}
{{{
Laying back, thinking of Mother Earth
Watch the naked branches overhead move in the wind
In the distance listen to the leaves rustle loudly
White noise is a good background for watching clouds
Passing in front of the stars, shapes of white and shades of grey.
There! A rabbit in a sock. Or the lunatic laughing skull of a dog.
The sad and lonely face of a man,
  slowly distorted by the wind as he drifts past,
  till finally he is unrecognisable and out of sight

This is art. Beyond any painters brushstrokes of Genius.
Beyond the skill of a sculptor and chisel.

Lay back and watch the complex canvas move before your eyes.
Alive. A show for you alone.
There is beauty in them there clouds!
There is MAGIC! in the sky.
It's drifting just overhead in the clouds,
  only needing you to look up and see.

Listen to the wind.
Feel the grass beneath your feet
Commune with the elements
Look into the infinite beauty of the sky,
  the stars brilliant points shining down and illuminating our dreams.

Obscured by clouds, the stars still shine.
The path to our dreams is not diminished,
  but made all the more beautiful by their passing.

Relax, and drift with the clouds.
Silent, majestic and unique.
}}}
----
{{credit{
17 Sept 2003
First published to the BadPoetryOfTheDay list on 1 June 2004 under the headline of '//fluffy white poetry//'
}}}
{{{
The machine haunts me
Lurks in the shadows.

Waits innocuously for me to amble past
and then gurgles into life,
following me down the ever darkening alleyway

The machine watches me.
Tracking my movements and ensuring I know it is there.

Stalking.

The machine follows me into the night.

The machine tempts me with unnatural delights.
Begging of me to partake of its evil broth

It knows I have succumbed before,
and knows that, one day, willingly,
I will again.

They multiple. They are pervasive.

The machines shadow my every move.

They are the Coke machines that haunt me
}}}
----
{{credit{
22 July 2003
First published to the BadPoetryOfTheDay mailing list on 30 May 2004 under the headline of '//Rise of the machines//'
}}}
{{{
Dispite the cliche, it doesn't start with the eyes.
I think it's the smile that catches my eye
Then the face, smiling back at me.

A moment of realisation.
A moment where the uniqueness of the soul shines out
 and is shown so clearly and brilliantly that you cannot mistake it.

It is amazing to think, there is a unique person.
I am a unique person. Never shall I know what it is like to be another.
To see through the eyes of another.
To think as another thinks.

It is a moment of real.

In the mirror reflected, your face looks strangely different.
But not a stranger there stands. Not really.
Making faces, eye to eye he makes them back.
A moment of realization. A moment to laugh. A moment to cry.

A moment of real.
}}}
----
{{credit{
16 Feb 2002
I wrote this poetically, but the subject I'm dealing with is a philosophic. I don't know if anyone else gets "moments of real", as I call them. I get one maybe a few times a year. Love them =)
}}}
{{{
Wasted              Energy
Nothing             Flow
Nihilism            Spread
Nihil               Infect
Ni                  Infest
Ni                  Grow
Ni                  Consume
Doom                Invade
Pain                Light
Suffering           Float
Famine              Glow
Poverty             Exhalt
Death               Music
Graceless tune      Melody
Chordless           Dance
Strum               Live
Feedback            Longevity
Smash               Infinite
Crowd               Joy
Applause            Laugh
Celebration         Happy
Encapsulation       Dynamic
Repetition          Life
Dead
}}}
----
{{credit{
February 2008
Intended to be read down each column, but as a matching pair.
}}}
{{{
Hidden in places the girls do not go
Lay the boys that are sweet, but they do not know.

Hidden in places the boys dare not tread
Are the girls with the rocks, aimed for their heads

Hidden in a place where nothing much matters
Lies cupid in tears, his arrows in tatters
}}}
----
{{credit{
2005
Originally published to the BadPoetryOfTheDay list under the headline of '//Girls and Boys//'
}}}
{{{
The problem is that we all think
 our minor contributions have no bearing on the world at large
that we can keep on going on as we have, or even accelerating.
Playing with fire

Maybe our problem is that too many of us don't think. 

The problem is that we can't keep our hands to ourselves
  and insist on meddling in the affairs of others

The problem is that time, it turns out, is not on our side
there is a day of reckoning coming, and it's likely sooner than you think

The problem is that our default state is of enjoyment
with only interludes of remorse and guilt
and awareness of the problems
The problem is that this should be the other way around

The problem is that we keep talking about the problems
and not enough about the solutions
even though we know what they are

The problem is that...
no. Remember what was said. 

The solution. The solution is a change in attitude. 
A change in awareness. In perspective and style. 

The solution is change.
}}}
----
{{credit{
31 Aug 2009
Written directly into NemWiki. Both an observation of the world at large, and autobiographical
}}}
This is an exerpt from a longer piece by my brother. -- Nemo

!!Friendship / Mateship
> The term ''friend'' and the term ''mate'' are, in day-to-day speech, all but interchangeable. This is perfectly natural and nothing to be ashamed of, as no one really takes day-to-day speech seriously anyway, and if they do then they shouldn't. In actual fact, however, there is a great difference between a friend and a mate. They are both people who you voluntarily spend time with, they are both people whom you would stick up for in a fight or argument, but the dynamics of the relationship are very different.
>
> The difference is, essentially, that a friend is someone with whom there is a connection bordering on romance. There is something much deeper going on than the ability to get drunk together and laugh at strangers. A friend can be spoken to about important issues, worries, and all the little things that make life so temporarily undesirable. A friend is there for you in good times and bad, and rather than trying to cheer you up, will offer you their empathy and companionship.
>
> A mate is someone who you get drunk with. I'm not saying that one can't talk to a mate about one's problems, it's just that it's done in an entirely different manner. To a mate you might say "I'm feelin' pretty shit after my girlfriend's left me, eh?" but that would be the extent of it. A mate would try to take your mind off it, cheer you up, tell you it's all okay. Friends are smarter than this; also, friends know you better and know what to say at such times.
>
> I'm not trying to imply that friends are in some way better than mates. Both are very desirable to have, and I would never sacrifice either one for the other. Without mates life would be too serious; without friends, not serious enough.
----
{{credit{
Huw, 4/9/2002.
Taken from his [[website|http://members.tripod.com/chewbaccas_daughter/rantings/friend_mate.html]].
}}}
Hugs are the awesome, but not all hugs are created equal. 

There is a (at least one) spectrum of hugs. 

These are the 'hug', the 'huggle', the 'cuddle' and the 'snuggle'. There are also various positions, some of which may span multiple levels. 

In brief, the 'hug' through to the 'cuddle' are platonic. The snuggle crosses the line to sexuality. 

!! Is this the [[Lexicon]] of hugs?
;Hug
:A hug is the equivalent of a handshake. It's a meet/greet/hello/goodbye action, and is momentary. 
;Huggle
:A hug that sustains, but is in the settings that would be applicable for hugs. A huggle is really the minimum for comfort, but in txtspeke, often states as 'hugs' anyway.
;Cuddle
:A cuddle is a hug that is intended from the start to sustain. Couches and cushions are the places that cuddles exist. Cuddles are platonic between friends though.
:* Note though that cuddles are PLATONIC, and never anything but.
;Snuggle
:A fine line past a cuddle where platonic is no longer required. It may not exist as anything more manifest than an awareness of the potential lack of platonic. This makes the line between cuddle and snuggle to be particularly blurry. To link to the the flirting spectrum (flirting-without-intent vs flirting-with-intent) the snuggle is "with intent", whilst the cuddle is without)

!!Other lexicon
;Wraps
:Analagous to a cuddle, but perhaps with more distinct closeness (ie: wrapping) which blurs it closer to a snuggle, and also biases it towards seperate roles of hugger and huggee
;Surround
:Analagous to a wrap, but even more distinctly clarifies hugger and huggee. With a surround, the hugger wraps legs as well as arms (requiring a surround be performed horizontal, arguably making the surround the true 'snuggle' version of a wrap.
;Full-body hug
:another term for 'surround'. The use of legs as additional wrapping means is why it gains this name
;warm fuzzies
: analagous to a huggle, but without the implication of the physical. This is a personal (for [[Nemo]] anyway) anachronism from mid 1990s internet usage.
<<<
Overhead the albatross
Hangs motionless upon the air
And deep beneath the rolling waves
In labyrinths of coral caves
An echo of a distant time
Comes willowing across the sand
And everything is green and submarine.

And no one called us to the land
And no one knows the where's or why's.
Something stirs and something tries
Starts to climb toward the light.

Strangers passing in the street
By chance two separate glances meet
And I am you and what I see is me.
And do I take you by the hand
And lead you through the land
And help me understand the best I can.

And no one called us to the land
And no one crosses there alive.
No one speaks and no one tries
No one flies around the sun....

Almost everyday you fall
Upon my waking eyes,
Inviting and inciting me to rise.
And through the window in the wall
Come streaming in on sunlight wings
A million bright ambassadors of morning.

And no one sings me lullabyes
And no one makes me close my eyes
So I throw the windows wide
And call to you across the sky....
<<<
----
{{credit{
Pink Floyd (Waters, Wright, Mason, Gilmour) / Meddle / 1971
23min 30
}}}
<<<
Together alone
above and beneath
we were as close
as anyone can be
now you are gone
far away from me
as is once will always be
together alone

anei ra maua (here we are together)
e piri tahi nei (in a very close embrace)
e noha tahi nei (being together)
ko maua anake (just us alone)
 
kei runga a Rangi (Rangi the sky-father is above)
ko papa Kai raro (the earth mother is below)
e mau tonu nei (our love for one another)
kia mau tonu ra (is everlasting)

Together alone
shallow and deep
holding our breath
paying death no heed
I'm still your friend
when you are in need
as is once will always be
earth and sky
moon and sea
<<<
----
{{credit{
Crowded House / Together Alone / 1993
3min 55
Try reading both with and without the chorus translation
}}}
For words that are written... poetry, short prose etc... content that is outside the "normal" wiki intent of review and re-edits.

Much of this will be by Nemo, or for Nemo, such is the way of this wiki... 
This is Nemo's basic pasta sauce.

It is so called because, well, why not? There is no competing claim to the contrary, and besides, it '''is  famous''' amongst (an admittedly very limited subset) the people of planet Earth. 

It is designed as a vegan dish, and can be served with gluten free pasta also.
>This could not be improved with meat
>-- Kitten (a self-confessed lover of flesh)

!! Ingredients

''quantities given to serve approximately 6''
* Garlic (approx 3 cloves)
* Olive Oil
* Mushrooms (large handful)
* Onions (3)
* Zuchinni (1/2)
* Squash (2 small)
* Red Capsicum (1/2)
* Radish (small handful)
* Pasta
* Diced tomato (3 cans)
* Pasta sauce (1 medium bottle)
* Salt, pepper and assorted herbs (mainly italian style, but a range is good)
** Basil
** Oregano
** Chilli flakes
** Mint
** Thyme

!! Preparation

Prepare frypan with diced/crushed garlic and a swirl of olive oil. 

Dice onions and fry. Dice mushrooms and add in. They should be fried till the onion is thoroughly clear. 

Meanwhile, heat the diced tomato and pasta sauce to a large pot. 

Add onion and mushroom and mix well. Add salt and pepper.

Add diced radish, capsicum, zuchinni, squash and other herbs to taste. (small pinch of chilli flakes, plenty of basil, etc)

Meanwhile, prepare pasta. 

Serve one on the other. Enjoy.
(Repeat-rinse-lather.)

!! Storage and reheating
I store World Famous Pasta sauce in the fridge for up to a week and reheat in the microwave, cooking new pasta fresh for each meal.
!! Ingredients
* Half a lettuce torn
* Two tomatos, diced
* Two carrots, shredded
* Two sticks celery, sliced
* Half a red capsicum ("pepper" to the yanks), diced
* Half a cucumber, diced
* 6 shallots, diced

!! The dressing
* Half a lemon, squeezed
* 2 parts olive oil to one part lemonjuice
* bunch of parsley, cut fine
* teaspoon of pepper
* sugar to taste (usually ends up being near 1:1 sugar:everything-else ratio)

!! Serving
* Mix dressing into salad well immediately prior to serving. Feeds 8 nicely :)
SAO Sandwhiches are an invention of [[Nemo]]'s father, as far as is known. 
:* request for vegetarian friendly alternative to anchovette fish paste?
They go like this...

# Take three SAO's, and butter them all on one side. 
# Spread a layer of [[Vegemite]] on one, and a layer of Anchovette fish paste on the second.
# These go together to form a regular sandwhich layer.
# Repeat these steps again with one side of the sandwhich, and the third SAO, so you end up with a doubledecker sandwhich!
# Enjoy, but watch out for crumbs.

Somehow, it's not as overpoweringly salty as you might expect...
This is an idea that has been kicking around my mind for a few years... to parody the original Star Wars movie/trilogy by dubbing the muppets in. The idea dates back to either January 1996 or 1997, though the first reference I can find in email is June 1998. That email is roughly translated to the wiki here for further editing. 

''If I recall correctly, Mary was the other main instigator of this idea, and more work on it would be cool :)''

For everyone who hasn't seen it before, the idea is along the lines of dubbing Muppet characters voices over the top of the Star Wars trilogy. It's not a perfect list, and some choices are based on voices (logically), and others on looks (a somewhat less logical reason :) ...either way, suggestions for improvements, and general discussion would be cool... *grins*

{{{
        Rebellion:
 Princess Leia           Miss Piggy
 R2-D2                   Beaker
 C-3PO                   Dr Bunsen
 Luke Skywalker          Fozzie
 Obi-Wan                 Sam the Eagle
 Han Solo                Gonzo
 Chewbacca               Animal
 Yoda                    Super Grover
 Lando                   Kermit
 Mon Motha               Janice (Blond Hippy Singer)
 Ackbar                  Dr Teeth

        Empire:
 Vader                   Swedish Chef
 Stormtroopers (any)     Scooter
 Emperor                 Statler and Waldorf

        Other:
 Jabba                   Rowlf
 Admirals (any)          The Newsreader
 Ewoks                   Chickens (gonzo's)
 Boba Fett               ?
}}}

Some proposed variations and questions:

* Statler and Waldorf as the droids, or as external commentators, mst3k style. 
* Kermit as Luke - whiny voice match!
* What Sesame St characters are allowed? 
** The original idea is to be only Muppet Show muppets as much as possible, dispite the idea originating from Yoda having Grovers (a Sesame St character) voice...
* Sam the Eagle as the Emperor (but who would play Obi-Wan?)
* Sam the Eagle as Vader (he has the presence for it!)

!! Implementation

You would need audio of all the Muppets episodes, and then cut to each character... with a script of their lines by preference. Same for Star Wars.

Then match lines from Muppets to Star Wars to assemble an alternate script (whole movie or just scenes?), and then use the audio clips in-place to complete. Fine tune as nescessary. 

!! More generally

I like the idea of doing this in a general sense - replacing audio for actorA from movieA, with audio from the same actor from any other source that is NOT movieA. eg, Dubbing the Indiana Jones character with audio by Harrison Ford from Star Wars, Harrison Ford from American Graffiti, Airforce One, Blade Runner, etc etc etc...  

----

Usefull Links: 
* http://www-cs-students.stanford.edu/~csilvers/muppet-characters.html
!! What Would Tyler Durden Say?

Note - these are NOT Tyler quotes - rather, they are tyleresque comments. 

* You are not your hairstyle
* You are not your website
> //(good for picnics and impressing young ladies)//
> 
> 1. Roast some butternut pumpkin until delectable. Allow to cool.
> 2. Combine in a bowl with baby spinach leaves, chopped or crumbled feta(*), and pine nuts.
> 3. Drizzle some kind of balsamicy type dressing over the top.
> 4. Eat out of doors. :)
> 
> * If you think you don't like feta, try another brand.
<<cloud -excludeTags>>
I collect curses. Not seriously, but as an amusement. It started when I heard on the radio one day (probably TripleJ) the DJ talking about an old yiddish curse along the lines of 'may your clothes never properly dry', and she was saying that it sounds innocuous at first... but then think about it - how horrid to forever be having to wear damp clothes!

This then, is my own collection of innocuous -till you think about them- curses. 

* May you always be 1minute later than other people account for.   
>I  hope to come up with a better title for this CD soon -- Nemo

This is my notepad of ideas for novelty CDs... 

!! Conversation
This idea formulated with former housemate Adam. The idea being to take an existing song and turn it into a spoken word conversation. Lyrics should be maintained, but otherwise arbitarily split between speakers
* Peaches - POTUSA
* Comfortably Numb - see also: [[MovieSongs#Lyrics_for_a_scene]]
* several songs from TMBG's Flood. I need to verify some lyrics and get back to this

!! Metrication
This idea formulated with former housemate Adam. The idea being to metricise the imperial units sung in a song. 
* I'm gonna be (500 miles) - The Proclaimers
* The Galaxy Song - Monty Python (from The Meaning of Life)
** This should also be corrected with numbers from current accepted science
* Space Oddity ("Though I'm past one hundred thousand miles I'm feeling very still")
** Thanks /u/Slippor - https://www.reddit.com/r/Showerthoughts/comments/4pd58q/most_of_the_world_uses_the_metric_system_but_i/d4k2k3i

!! Callbacks
Just like for Rocky Horror, have a voice calling back and taunting the song. See the "who the fuck" versions of [[wikipedia:Living Next Door to Alice|Living Next Door to Alice]] for an existing commercial example
* several songs from TMBG's Flood could also suit this. I need to verify some lyrics and timing, and get back to this

!! Parody
In the 'everyone does this' scheme. 
* Comfortably Number - the geek version of Comfortably Numb
* Addicted to Net - from Robert Palmer's Addicted to Love
* Number Fourty-Two - aka  "Blowin' in the wind (Frankie Mouse and Benji Mouse remix" ie the HHG version of the eponymous answer Bob Dylan gave
This is the tag for projects [[Nemo]] has. ie, tasks outside this wiki. 

See also [[TODO]]
3am... I just got back from Star Wars: Revenge of the Sith.

My short review is as follows:

* There was no character growth/progression. There was lots of Anakin angst instead. Then there was lots of Padme and Obi-Wan angst when they found out about Anakin.
* There was no plot progression. There was spurious logic instead though. Especially when it came down to Palpatine talking to Anakin.

Did it feel like a Star Wars movie? No. There was ALOT of references to stuff in Eps 4,5,6 to give it the right feel though, but they seemed more like out-of-place and overdone cameos than anything else. (Think of how the TV Marvin was in the recent HHG movie... an overdone cameo). Examples of this include: mimicing the Vader/Luke lightsabre scene from the end of Jedi. The blockade runner. Proto TIE and X-Wing fighters. Chewbacca. Vaders outfit. The Death Star. Palpatines disfigured look. References to Red leader. Antilles. Senator Organa. The evolving look of the Star Destroyers... you could go on and on...

Also, there was alot of talk about how this would be the 'darkest' Star Wars movie ever. Was it? Well, I guess... since more 'bad' things happen to the good guys than to the bad guys. There was also more obvious gruesomeness. (Anakin at the edge of the lava springs to mind) ... but really, it didn't feel 'dark', because I just coulnd't feel involved...

So, in summary. Angst instead of character, spurious logic instead of plot, cameo-like references to the original series instead of feeling, and lots of bad stuff happens to the good guys.

And for everyone waiting for the Wookie battle scenes, promised since pre-production of Return of the Jedi? ... well, they sucked too.

And how does it end? Well, If you haven't seen (or at least heard of) a rather excellent low-budget 1977 movie called 'Star Wars', then the following might also be considered a spoiler...
* Anakin survives, but is disfigured horribly. They rebuild him, make him better, faster, stronger than before... (though I think they have a problem with 'breathing')
* Padme has twins - Luke and Leia.
* Palpatine survives, unharmed.
* Obi-wan survives, unharmed.
* Yoda survives, unharmed.

So, final word before I sleep? Great visuals. Yeah.
...but they'll be old-hat in a year or two...
objects are tangible. 

also, tagable. With an 'object' tag no less!
An australian mythical creature, about the size of a hippo.

They have VERY little in common with Bunnies. Except that bunny that killed all of those people in Monty Python and the The Search For the Holy Grail. if it had been bigger, colored differently, had the head of a horse, flippers, and tuskes like a walrus, and lived near a waterway in australia, it could have passed for a bunyip. Maybe. Except that bunyips don't fly. I hope.

(also, Bunnies kill off the Bilby in Australia. Hence we increasingly have Easter Bilbies, not Easter Bunnies) 
!! Competitive font creation

I've been following the RSS for http://www.acidfonts.com/ for some time now, though increasingly finding I don't check the new font each day... instead about once every few weeks or so, I just look at the ones with interesting titles.

Now I've been noticing that I hit titles that I expect will return interesting fonts. And indeed, have started to try to predict the type of font based on the title.

So what would happen if you got a bunch of font designers in a competition to draft up a font based ONLY on the title. In my head it's a game show (scene: think 'the weakest link' sort of layout... half a dozen font designers get 3 minutes each to sketch a font based on the name of the font. Audience then votes which font most matches what they expected from the title (and/or what they like best)... throw out the worst performer... repeat till you have a font-design winner!

In realistic world, the general populace doesn't care about fonts so much, but could the idea be translated to a web competition of some form? Either to raise general interest/awareness in fonts, and/or improve font-creaton skills. Plus random font names may provide random imagination sparks that one mightn't have already.

!!! Alternative competition
Another idea to stretch the skills of font creators would be to throw a random number generator at a bunch of criteria (sans or no? cursive or no?, etc) ... ie, ask 20 questions and draw the font at the end. When I find tailsteak's coin-based 20 questions drawings, I'll link to those, since it's that idea as applied to fonts :)

!!! Alternative #2
This is perhaps closer to what I do myself... a font is pre-created, and the competitors have to try and predict the font style based solely on the title. Iterate through questions... (everyone locks in their serif/sans answer, then the compere says 'SANS!' ... some people lose points, but can reevaluate their predictions now knowing it's not a Serif font...
It seems to me there needs to be a rethink of the classic Rock Scissors Paper. It's an epic battle, but some conclusions can now, I think at long last, be drawn.

Geographically, rock prefers third world and undeveloped regions, whilst scissors and paper have a symbiotic relationship and prefers more developed regions.

Increasingly, rock has lost, whilst scissors and paper do not compete. If they were to, however, scissors finds itself at a numerical disadvantage to paper, but with a significant endurance advantage.

Next up... grue, water, fire.
herein are my collected blog and blog-like writings from 2001. These are all (or in part?) lifted from my old NAFS software based site. 
herein are my collected blog and blog-like writings from 2000.

The content is primarily (totally?) collected from my former "NAFS" software site. 
herein are my collected blog and blog-like writings from 2002.

The content is primarily (totally?) collected from my former "NAFS" software site.
herein are my collected blog and blog-like writings from 2005.

The content is primarily made up of ThorxWiki pages which were written in a first-person blog styling, and subsequently never revised. When imported to NemWiki, they were then tagged blog. 
herein are my collected blog and blog-like writings from 2007.

The content is primarily made up of ThorxWiki pages which were written in a first-person blog styling, and subsequently never revised. When imported to NemWiki, they were then tagged blog. 
herein are my collected blog and blog-like writings from 2008.

The content is primarily made up of ThorxWiki pages which were written in a first-person blog styling, and subsequently never revised. When imported to NemWiki, they were then tagged blog. 
herein are my collected blog and blog-like writings from 2009.

As of late July 2009, these are likely to be first-published here on NemWiki. Prior to then, imported from ThorxWiki. 
[[Google maps of notes items|http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=103038660362717824460.000473ba9192862605ccc&ll=-27.467003,153.02762&spn=0.024979,0.036349&z=15]]

! Sidewalk Stars
These are stars cut into the red pavers used on many of the CBD footpaths. The star found are either single (star made form white pavers inset to the red), or double (a red star, with then a larger white star surrounding it, set within the red pavers

|370 George St (near Turbot)| Small star - curb edge |
|85 George St (cnr Mary)| Concentric star | [img[http://farm3.static.flickr.com/2532/3965469921_b132e7dd58_m.jpg][http://www.flickr.com/photos/nemotribble/3965469921/]] [img[http://farm4.static.flickr.com/3466/3965464669_be5ebeabdc_m.jpg][http://www.flickr.com/photos/nemotribble/3965464669/]] |
|300 Adelaide st| Concentric Star |
|160 Ann st| Concentric star with 3 single stars alongside |
|229 Elizabeth| Large star with Small star near - building edge | [img[http://farm3.static.flickr.com/2467/4060112554_c1e1637817_m.jpg][http://www.flickr.com/photos/nemotribble/4060112554/]] |
|363(?) Adelaide St| Small star - building edge |

! Obelisks
* St Pauls Tce
**This is a tall street-light like pole, multisided. But with no apparent obvious purpose. 
* Wickham Tce
** Like the one on St Pauls, this is near the ampitheatre at the northern end
** Note that this is near the 'Monument and Stonemasonry Association' - appears to be unrelated to location, but may be a useful contact to investigate the items...
* Thorn St (corner of Shafston Ave)
** South of the River, this is speculation as only the hexagon foundation remains. 
|~ViewToolbar|closeTiddler closeOthers ! collapseTiddler collapseOthers ! > fields syncing  revisions references ! +editTiddler permalink jump < |
|~CollapsedToolbar| closeTiddler closeOthers ! +expandTiddler collapseOthers ! > jump < |
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddlerHosted |
This is my own notes regarding how I setup the structure of tiddlers here, and some useful links:

!! TAG structure
blog tiddlers are tagged with "YYYYblog" for the year. Each "YYYYblog" tiddler is then tagged 'blog' for the MainMenu navigation. 
: ditto for poems (YYYYpoetry)
All these YYYYtiddlers are then tagged as 'timeline', allowing easy life navigation! :)

The YYYYtiddlers are excluded from the main navigate tags, as are the YYYY tags directly. They are not otherwise excluded however. See [[excludeTags]] to list all tags which are excluded from the tag cloud on the main navigational menu. 

My thoughts are that any tag which passes three dozen tiddlers of usage, should then be split down by some means, be it chonological, or other. The <<tag timeline>> tag obviously cannot be broken down by time, but perhaps by subject (poetrytimeline, blogtimeline  ?)
In 2008, [[Nemo]] reached the ripe age of 33. 

So to celebrate, Ego Trip through Europe. 

!! Ego Trip?
A few years previously, Nemo heard about nemo33 in Brussels, and so sparked the idea. Before long a few other places known as "nemo" in some variation popped up on his radar, and so this idea was born. 

!!! Nemo Locations
* Copenhagen
** [[Nemoland|http://www.nemoland.dk/frame1.html]] (cafe)
* Amsterdam
** [[e-nemo|http://www.e-nemo.nl/]] (science museum)
** [[Nemo Apartments|http://nemoamsterdam.com/]] (b&b - minimum 2nights stay)
* Brussels
** [[nemo33|http://www.nemo33.com/]] (indoor scuba pool)
** Slumberland - a chain of (comic) bookshops
* Poland
** [[Nemoland poland|http://www2.pz.nl/nemo/polenengelsbasis.html]] (nature appreciation cottage/grounds)

...others listed as they're found. 

!!! Other non-"Nemo" locations for consideration
* Tropical Islands (Germany)
* Mansfield
* Stonehenge
* Cardiff
* Grenwich

!!! Map
[[Google maps of places|http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=103038660362717824460.00043a87572a0a5c60483&ll=52.895649,12.546387&spn=8.887712,15.446777&z=6&iwloc=000448abb3e79802207c7]]

!!! Places actually visited
* Heathrow (wow)
* Copenhagen
* Christiania
** Nemoland cafe 
* Amsterdam
** e-Nemo science museum
** NEMO hairdressers (http://www.kapper-gids.org/nemo-hair-amsterdam/5531064040411661 ?)
* Berlin
* Frankfurt
* Mainz
* Brussels
** Nemo-33 pool
** Slumberland bookshop
* Paris
** Nemo street graffiti/stencil
* Cardiff
* Bath
* London

{{{
17:26 < nemo> http://wiki.thorx.net/wiki/EgoTrip   <-- EgoTrip, the original series
17:27 < Flayer> you are terrible nemo
17:27 < nemo> Flayer: no, I am awesome
17:27 < nemo> so awesome that I have to go to other continents just to visit all parts of my ego
17:27 < Flayer> good point
-- #xkcd, 2009Apr30
}}}

!! EgoTrip II 
Of course, it was inevitable that more Nemo places would eventuate, so maybe one day there will be a second venture... Till then, this is just a collection... 
* [[Nemo's Bakery, 416 N Hale Ave, Escondido, CA, 92029|http://411.sandiego.com/Nemo--27s+Bakery.9.12186443p.home.html]]
* Nemo Pizzeria in Dubrovnik, Croatia
* http://www.nemoland.it/ - annual event, scifi and fantasy workshops...

!! If I have a time machine... 
* http://www.myspace.com/nemomusicfestival






I have written much poetry over the years. Here it is!

{{center{
<<cloud =poetrytimeline>> }}}
Poems for 1994 through to 1996 were likely created on TheFarSide BBS first. After 2003, they were likely published to the BadPoetryOfTheDay list first. 









Chronological based subtags should be here. 
Here you can find my timelines of blogs, poems, and stuff in general. 

{{center{
<<cloud =timeline>> }}}
<<timeline "modified" "40">>
[[Nemo]] writes poems. They're regularly not very good, and they're often angsty. But sometimes fun and quirky too. 

Because there are so many, I've broken them down into tags by year - click through to see them vaguelly chronologically... 

My old site had poetry and writings... it is archived at archive.org... [[here|http://web.archive.org/web/20040805071805/www.nut.house.cx/~nemo/info.php?s=writings]]

----
Included here are tag links to easy navigation - you can jump to a poem directly from any of the following links - if you know which year the poem you want is in!
{{center{
<<cloud =poetrytimeline>> }}}
1994 poetry was to be found in notebooks... 
1995 poems were also written in notebooks...
In 1996, most of my poems were first published to TheFarSide BBS. Some were even written there directly. 
Much like [[1996poetry]] really...
Poems from 1999
There is an observation that I (and others) have made about personal poets like myself. That the poetry tends to come out of extreme emotions. Or even truer, out of the stressful and down moments

I was with Amanda for over three years - from the end of 1996 through to the beginning of 2000. I have no found writings for two and a half years! 
Poems from 2000
Poems from 2002
In late 2003, I started my current set of notebooks. This made me not only more organised, but arguably more prolific. 

I also subscribed to the BadPoetryOfTheDay mailing list, as run by Nerissa. Since September 2003, this has been the primary point of first (and usually: only) publication of my poems. 
Poems from 2004
Poems from 2005
Poems from 2006
Poems from 2007
2008 Poems. That is, the year, not a count. 
More poems. This time from the Year Of Our Lord, 2009. 
Are there any poems for 2001? They'll be here if I have made any public!
The way of complication.
The way of solitude. Of reassurance.
The way down. The way back.
The way away from this place.
The way it seems today.
The way it never was. The way it could have been?
The way is clear.
The way ahead. The way behind and the way to the side of us.
There is no way?
{{credit{
25 March 2004
Originally published to the BadPoetryOfTheDay list under the headline of '//Where are they going without ever knowing//'
}}}
A daily email list run by Nerissa. Many of my poems from 2003 were published there first. 

Chronologically by publication date to the list:
!! 2004
* 30 May: [[The Machines that Haunt Me]]
* 1 June: [[Watching Clouds]]

!! 2010
* 1 July - [[Untitled (iGeek)]]
* 13 July - [[Tyler Says...]]
* 2 Dec - [[Notebook]]
:I would have acted differently, and possibly not know now what I learnt by not knowing then. I would rather not know.
{{credit{
Originally posted to [[Blitzen|TheFarSide]] BBS on the 31 July 1995 in a morphic room that was asking the titular question as the room name
}}}
Selected posts from Blitzen and TheFarSide BBS. 

These posts were not technically 'web', but they were online, and public (to the userbase of the BBSs anyway), and so are replicated here. 

They are a small selection based from what I manually saved from the BBSs at the time of writing. My logic is that I saved them at the time for a purpose, and some of what I saved are worth re-distributing. 

See also: [[1995poetry]]
! *anonymous* (this is your post) Alias: 'just someone'
to all those who will feel alone this St Valentines day:
remember always that you are not forgotten.
there is always someone thinking of you, even if you do not realise it.
there is always love in the world. It is not always obvious, and sometimes it must be searched for long and hard.
But it IS there.

to everyone who will not have someone to share this St Valentines day with: you have my fondest wishes and hopes that -that special someone- will steal silently into your life, and before you even begin to realise what has happened, you will no longer consider yourself alone.
And untill that time comes, remember that you are only alone if you let yourself be alone.

I send my friendship and love to you all.

! *anonymous* (this is your post) Alias: 'just someone'
valentine hugglies to all those who _do_ have valentines at this time.
you are lucky to be with someone who loves and cares for you.
my best wishes to all the lucky couples out there.
 *hugs* to you all

! *anonymous* (this is your post) Alias: 'just someone'

for those who feel loss.   those who have recently left a relationship or are having troubles with a current one.  This must be especially hard time for you.   Everyone else's life seems full of hearts, happiness and joy.  And being St Valentines day, they are all sharing it. Does it seem like life isn't fair?
Unfortunately, sometimes life _isn't_ fair, but do not despair - a time will come when it will be unfair in your favour. Justice is served in the world, perhaps in ways that we cannot see, but it is there.
But for now, I send to you all my compassion and hope for a brighter future.

! *anonymous* (this is your post) Alias: 'just someone'
a last St Valentines Day huggly message while I still am able to post anon... 

to those with partners, those without partners.
to those gaining partners and those losing partners.
To everybody:

  Remember that love always exists in the world.  It is not just a commodity that is traded on St Valentines day. It persists throughout the year. Spreading warmth and hope to all those who are touched by it.                   
  St Valentines day is a day to celebrate love, but it should not be forgotten throughout the rest of the year. Feb 14th is but one day.
  Remember that there is -always- love in the world. All year. 365(or 366 this year!) days worth of it.

I plead with you all to remember this when all else seems lost. No matter what happens, no matter what sorrow befalls you, there is always someone who is thinking of you, and to whom you hold a special place in their heart.

To you all: all my love till next year  :)

                                        - just someone (who cares)
----
{{credit{
originally a series of anonymous posts to the '//Valentine HuGGLy Fings//'> room on TheFarSide
Anonymous posting was enabled for that day only.
}}}
Selected saved posts from TheFarSide BBS

See [[1995blog]] for more info. 

See also [[1996poetry]]
{{{
           ___________    ____                                                  
    ______/   \__//   \__/____\         This is the invite that is not the real 
  _/   \_/  :           //____\\        invite, but nevertheless serves to      
 /|      :  :  ..      /        \       inform you that I am inviting you to my 
| |     ::     ::      \        /       21st dinner and night out.              
| |     :|     ||     \ \______/                                                
| |     ||     ||      |\  /  |                                                 
 \|     ||     ||      |   / | \        This is just to let you know in advance 
  |     ||     ||      |  / /_\ \       of the real invite, which will be sent  
  | ___ || ___ ||      | /  /    \      out to you as soon as it is available.  
   \_-_/  \_-_/ | ____ |/__/      \     ...ie, as soon as I get around to       
                _\_--_/    \      /     getting it printed up!  (uh... soon? :) 
               /____             /                                              
              /     \           /                                               
              \______\_________/        (where/when etc details later  *grins*) 
}}}
----
{{credit{
As sent to people via mail> on TheFarSide
}}}
{{{
You learn something new everyday., 
sometimes it is something important., 
sometimes something inconsequential. 
sometimes something scientific., 
sometimes something personal. 
Sometimes good. 
sometimes bad. 
often times you don't even realise it. 
}}}
----
{{credit{
6 March 1996
Composed to the Non Sequitur room on TheFarSide BBS.
}}}
The new smurfs had survived quite well for a number of years after papa smurf had finally turned off his last micro-chip. His alloy-bonded body had been lain to rest in a special grave in the town square, and a annual holiday was held in his honour.

But now dark times had fallen upon the smurfs again, and one brave smurf, by the name of Kopper, felt that more help would be needed. He was a genius amongst the new smurfs, who were all pretty smart themselves anyways. Kopper felt sure that Papa could be repaired and would then help them.

One night he crept to the centre of town and timidly opened the Papa's tomb. Cautiously he peered inside and was startled to see two dull red glows. A quiet wise voice counseled him to come inside before anyone noticed him there at the doorway. Kopper could not believe his senses. Papa smurf was awake and fully functional!

'yes' said Papa. 'I am alive.. I bet you'd like to know how right? young Kopper??'
'uh..ye..how'd you know my name??' stammered young Kopper
'easy; before I shut myself down, I wired up the whole smurf village, and setup a warning system for if there should be any trouble. It reactivated me a few months ago, and I've been reviewing the logs to see who the smurfs are and what the trouble is'
'but you were meant to be dead. broken beyond all measure??'
Papa chuckled 'no... no my son, nothing of the kind. The titanium-nickel blend titanium bonded alloy which I am made of can withstand alot more than the digestive system of old Gargamel! I simply faked it... loosened a few screws here, disjointed a limb there... made sure I didn't clean any scorch marks off and let my flesh coating rot a bit. Quite simple really'
'of course, all my flesh has long since gone... I fear I will cause quite a stir if I should venture out as I am now though... as brave as smurfs are, I doubt the sight of a walking metal skeleton with red eyes emerging from a tomb will give anyone any comfort'
'how can I help??' asked Kopper
'easy said Papa. come closer and I will tell you... 
----
{{credit{
7 March 1996
Composed to the Non Sequitur room on TheFarSide BBS
}}}
Kopper slowly approached Papa Smurf, but at the last moment he stopped. Something about those glowing red eyes didn't seem natural. And somehow he was smirking in a not-quite-smurf-friendly way. It was a silly thought of course, because Papa could have no expression, being only a bonded titanium alloy skeleton at the moment. However, he didn't think of that till long after he had left the tomb at a frightful speed in sheer terror.

Papa watched Kopper as he grew frightened, and was silently amused when he turned and sprinted out the door. Resigning himself to the fact that he would not be able to offer his services directly to the troubled smurfs for quite some time, he made to close the door, and then returned to plug himself into the Smurf Village surveillance network...

The next morning, Kopper awoke to find the Smurfs in total dissaray. Smurfbabe was screaming something about a shadow at her window, while Graham was complaining (again) about problems with the ozone layer. noone else seemed to have any specific complaints that Kopper could find, but somehow everyone was unable to to anything. An elderly smurf, considered by most of the rest of the village to have long lost his sanity was the only one to be apparently not fussed by whatever it was that had the village in it's grip. He was know standing by himself off on the other side of the square, apparently not aware of any of the fuss that was all around him. A faint whistle emerged from his lips.

Kopper felt strangely compelled to talk to the old smurf, and moved towards him. The old smurf paid young Kopper no more attention than a raised eyebrow, after which he ignored all attempts Kopper made to make him presence felt to the old smurf, who continued to hum and whistle a faint happy tune.

Kopper amused himself for a few moments by keeping track of one smurf, then another, as they scurried backwards and forwards through the square. Most of the fuss that was so easily identifiable seemed to have passed, and everything appeared as it normally would as the smurfs busied themselves with morning trading and commerce. There was maybe something still lurking, but it was more guessed at than felt.

Returning his attention to the old smurf, Kopper felt that maybe he was just trying to pull blueberries from thin air. Kopper tried asking the old smurf again for some acknowledgement, but the smurf continued to stand still, and not notice Kopper's presence. But just as he was about to be inquired of again, he slowly reached out and put something in young Kopper's hand, and then he left without saying a word.

Kopper, who was dazed by all the events that were going on around him, waited a few moments before looking at the object in his hand. It was a small round globe with the letters WJ inscribed upon it. And that appeared to be all. 
----
{{credit{
27 March 1996
Composed to the Non Sequitur room on TheFarSide BBS
}}}
test external image:
[img[http://farm3.static.flickr.com/2575/3723842606_a5f44fcfb0_m.jpg]]
(invisible chair!)

<<youAreReading>>
there was no word to describe him... then someone of importance said 'patient' ... and he was patient... 'well trained' was the thoughts of one who could not guess his age... another said 'weird' ...and weird he was, though he prefered 'eccentric', and tended to use 'erratic' ...some time later another said 'animated', but even this did not fully describe him... 'you remind me of Kramer' someone remarked... and this was discussed and agreed upon by those present... but still it did not tell the full story... an open book in a closed library with people at the doors 
wanting to get in to read it... that seemed to be accurate, but only in the right context somehow... 

maybe he will never be fully described...  maybe a simple 'earth native' is the most accurate that is possible, simply by virtue of not saying _anything_ at all... 
----
{{credit{
Originally posted to TheFarSide. Has also had later revisions. 
}}}
This is the tag for content which are song lyrics. That's all. 
{{{
All the tools disappeared overnight...

The screwdrivers slipped silently into suburbia
The hammers were hidden from view
The vise devices were as invisible as mices
And the chisels too. 

We called the spade a spade
We called...
  "Hello spade! Where are you?!"
But it never was found
  "OK you stupid bloody SHOVEL. 
  See if I care. STAY HIDDEN!"
And it did.

The pick, the maddock and axe,
We tried to follow their tracks
  but soon we found
  that they'd gone underground
And then they had slipped through the cracks

But there was one tool
that we missed over others
And spend out day mourning laments

For they were our favourites
so shiny and good
It was on them that our money was spent

So throughout the town
the only thing heard
By those straight, sober or bent

Was always the same
whispered so loud
"We wonder where the wrenches went"
}}}
----
{{credit{
By request for a "we wonder where the wenches went" series. 
First performed at Speedpoets, 2009Oct04
Published to BadPoetryOfTheDay for 2009Oct06 under the title '//Mystery of the missing machete//'
this is a test of a tiddler created by guest user tribble!

except it's not registering the edit as being by anyone but nemo!

 :(
This is a mystical and ancient symbol representing the virility, hairiness and power of the noble sasquatch:

 #

> Isn't that robot? Is he finding [[kitten|Kitten Zagnog]]?  [[♡?]]
Kopper could not comprehend why the old Smurf had given him this globe, not could he find any meaning int eh letter 'WJ' that were inscribed upon it. However, given that so much else seemed in dissaray at that time, Kopper accepted it and continued his musings.

Suddenly distracted by the sounds of screaming, Kopper looked up to find that the square was empty, all teh other smurfs having gone home for the late-morning siesta that was now the habit of the village. Looking around Kopper noticed that he was not in fact alone, but that the old smurf, who was considered senile by the rest of the village, was apparently talking to himself on the other side of the square. Either he he was not aware that Kopper was still there, or he did not mind. Given the events that had transpired the previous night in Papa Smurf's tomb, Kopper was not going to take anything at face value, and while the rest of the village would no doubt have taken Chester's actions as that of simply an old senile smurf, Kopper knew now that this did not appear to be the case. Plus there was that globe, which fitted snugly into his hand and appeared to be made of some kind of crystal.

Cautious, yet curious, Kopper skirted the edges of the square and approached Chester from behind. But all he could see was shadows beyond where Chester was standing. He was about to turn and go home for his own siesta when suddenly Chester turned to him and motioned for him to approach. Kopper moved silently to him and waited for Chester to speak.

Chester pulled from a slot in the wall a large envelope and handed it to Kopper, before moving quickly away.

Glancing around to see if he had been spotted, which did not appear to be the case, Kopper turned and slowly made his way home, his mind filled with confusion.

Once home, he placed the globe, and the envelope on teh dresser, and settled into his easy chair to think upon the events of the day thus far... slowly he fell to a deep troubled sleep... 
----
{{credit{
7 August 1996
Composed to the Non Sequitur on TheFarSide
}}}
Kopper awoke with a start and looked around him. The light was dim and red, and the shadows indicated that the evenings sunset was in it's full glory. Checking that everything in his hut was in order, Kopper ventured out into the village square to watch the sun set over the mountains in the west, and to contemplate the strange dream he had had. 
 
The village had a quiet eerie feel to it, but that was easily explained by the events earlier in the day, and the occasional bustle of a Smurf making their way through the town assured Kopper that all was, in fact, OK. 
 
In his dream, Kopper had dreamt of silence, and a void that was incomprehensible. He had floated through this void, examining it for what may have been, in his dream, an eternity. But then the void had been broken by a shaft of light that seemed to rip it's very existance apart. Suddenly there was more to the void that simple nothingness. Now it had a form, and Kopper could somehow sense that the form was not stable. As kopper slowly grew accustomed to this new presence, he realised that the struggle he could sense was within this form. And before he knew what was happening, the form broke into two and flew apart, away from each other like nothing he had ever experienced before. He had remained floating in the space left behind trying to fathom what e had just expreienced, and then, just as he felt he was coming to a conclusion... 

Kopper looked up again as he suddenly realised that he had been awoken from his dream. Something had disturbed him in the normally quiet village, and Kopper felt that it was his duty to find what was causing the disturbance in the village. 

He considered the Smurfs village recent times. There had been a general but vague feeling of unrest, but nothing like this. His visit to Papa Smurfs tomb had only raised new questions, and Chesters actions remained unexplained.  And then there was the crystal sphere, which remained an enigma unto itself. 
 
Kopper rose and made his way home, determined to visit Papa's tomb again and try to get some answers, that was possible.  However, when he got home it seemed different. Nothing he could pick at first, but as he examined his home more closely, he found that many of his personal objects had been moved - only a fingers width or two, but that was enough to make him feel uneasy.  Then he suddenly realised that the sphere was missing...
----
{{credit{
10 April 1997
Composed to the Non Sequitur room on TheFarSide BBS
}}}
{{{
           ___________    ____		
    ______/   \__//   \__/____\		This is the invite that is not the real 
  _/   \_/  :           //____\\	invite, but nevertheless serves to
 /|      :  :  ..      /        \	inform you that I am inviting you to my
| |     ::     ::      \        /	21st dinner and night out.
| |     :|     ||     \ \______/	
| |     ||     ||      |\  /  |		
 \|     ||     ||      |   / | \	This is just to let you know in advance 
  |     ||     ||      |  / /_\ \	of the real invite, which will be sent
  | ___ || ___ ||      | /  /    \	out to you as soon as it is available.
   \_-_/  \_-_/ | ____ |/__/      \	...ie, as soon as I get around to 
                _\_--_/    \      /	getting it printed up!  (uh... soon?  :) 
               /____             /	
              /     \           /	
              \______\_________/


          __  __  ____  ____    __   ____  ____ 
         (  )(  )(  _ \(  _ \  /__\ (_  _)( ___)
          )(__)(  )___/ )(_) )/(__)\  )(   )__) 
         (______)(__)  (____/(__)(__)(__) (____)

The proposed plan of events is likely to be...

Date:  Fri the 19th April
Time:  To be worked out yet.. something sensible though   :) 
Place: Bobby McGees
What:  Dinner and general employment of time in a profitless and 
       non-productive manner (but hopefully alot of fun   :) 
Why:   Cause I am asking nicely?? 
Who:   You of course!!
When:  I already said...   :) 

More definate details, plus real invites, to be sent out soon   :) 

cheers...
...Owen
}}}
----
{{credit{
As sent via mail> on TheFarSide, and email
}}}
/***
|Name|ImageSizePlugin|
|Source|http://www.TiddlyTools.com/#ImageSizePlugin|
|Version|1.2.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|adds support for resizing images|
This plugin adds optional syntax to scale an image to a specified width and height and/or interactively resize the image with the mouse.
!!!!!Usage
<<<
The extended image syntax is:
{{{
[img(w+,h+)[...][...]]
}}}
where ''(w,h)'' indicates the desired width and height (in CSS units, e.g., px, em, cm, in, or %). Use ''auto'' (or a blank value) for either dimension to scale that dimension proportionally (i.e., maintain the aspect ratio). You can also calculate a CSS value 'on-the-fly' by using a //javascript expression// enclosed between """{{""" and """}}""". Appending a plus sign (+) to a dimension enables interactive resizing in that dimension (by dragging the mouse inside the image). Use ~SHIFT-click to show the full-sized (un-scaled) image. Use ~CTRL-click to restore the starting size (either scaled or full-sized).
<<<
!!!!!Examples
<<<
{{{
[img(100px+,75px+)[images/meow2.jpg]]
}}}
[img(100px+,75px+)[images/meow2.jpg]]
{{{
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
}}}
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img(  1%+,+)[images/meow.gif]]
{{tagClear{
}}}
<<<
!!!!!Revisions
<<<
2009.02.24 [1.2.1] cleanup width/height regexp, use '+' suffix for resizing
2009.02.22 [1.2.0] added stretchable images
2008.01.19 [1.1.0] added evaluated width/height values
2008.01.18 [1.0.1] regexp for "(width,height)" now passes all CSS values to browser for validation
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImageSizePlugin= {major: 1, minor: 2, revision: 1, date: new Date(2009,2,24)};
//}}}
//{{{
var f=config.formatters[config.formatters.findByField("name","image")];
f.match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
f.lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](?:\(([^,]*),([^\)]*)\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
f.handler=function(w) {
	this.lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var floatLeft=lookaheadMatch[1];
		var floatRight=lookaheadMatch[2];
		var width=lookaheadMatch[3];
		var height=lookaheadMatch[4];
		var tooltip=lookaheadMatch[5];
		var src=lookaheadMatch[6];
		var link=lookaheadMatch[7];

		// Simple bracketted link
		var e = w.output;
		if(link) { // LINKED IMAGE
			if (config.formatterHelpers.isExternalLink(link)) {
				if (config.macros.attach && config.macros.attach.isAttachment(link)) {
					// see [[AttachFilePluginFormatters]]
					e = createExternalLink(w.output,link);
					e.href=config.macros.attach.getAttachment(link);
					e.title = config.macros.attach.linkTooltip + link;
				} else
					e = createExternalLink(w.output,link);
			} else 
				e = createTiddlyLink(w.output,link,false,null,w.isStatic);
			addClass(e,"imageLink");
		}

		var img = createTiddlyElement(e,"img");
		if(floatLeft) img.align="left"; else if(floatRight) img.align="right";
		if(width||height) {
			var x=width.trim(); var y=height.trim();
			var stretchW=(x.substr(x.length-1,1)=='+'); if (stretchW) x=x.substr(0,x.length-1);
			var stretchH=(y.substr(y.length-1,1)=='+'); if (stretchH) y=y.substr(0,y.length-1);
			if (x.substr(0,2)=="{{")
				{ try{x=eval(x.substr(2,x.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			if (y.substr(0,2)=="{{")
				{ try{y=eval(y.substr(2,y.length-4))} catch(e){displayMessage(e.description||e.toString())} }
			img.style.width=x.trim(); img.style.height=y.trim();
			config.formatterHelpers.addStretchHandlers(img,stretchW,stretchH);
		}
		if(tooltip) img.title = tooltip;

		// GET IMAGE SOURCE
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
		else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
			if (config.browser.isIE || config.browser.isSafari) {
				img.onerror=(function(){
					this.src=config.formatterHelpers.resolvePath(this.src,false);
					return false;
				});
			} else
				src=config.formatterHelpers.resolvePath(src,true);
		}
		img.src=src;
		w.nextMatch = this.lookaheadRegExp.lastIndex;
	}
}

config.formatterHelpers.addStretchHandlers=function(e,stretchW,stretchH) {
	e.title=((stretchW||stretchH)?'DRAG=stretch/shrink, ':'')
		+'SHIFT-CLICK=show full size, CTRL-CLICK=restore initial size';
	e.statusMsg='width=%0, height=%1';
	e.style.cursor='move';
	e.originalW=e.style.width;
	e.originalH=e.style.height;
	e.minW=Math.max(e.offsetWidth/20,10);
	e.minH=Math.max(e.offsetHeight/20,10);
	e.stretchW=stretchW;
	e.stretchH=stretchH;
	e.onmousedown=function(ev) { var ev=ev||window.event;
		this.sizing=true;
		this.startX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
		this.startY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
		this.startW=this.offsetWidth;
		this.startH=this.offsetHeight;
		return false;
	};
	e.onmousemove=function(ev) { var ev=ev||window.event;
		if (this.sizing) {
			var s=this.style;
			var currX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
			var currY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
			var newW=(currX-this.offsetLeft)/(this.startX-this.offsetLeft)*this.startW;
			var newH=(currY-this.offsetTop )/(this.startY-this.offsetTop )*this.startH;
			if (this.stretchW) s.width =Math.floor(Math.max(newW,this.minW))+'px';
			if (this.stretchH) s.height=Math.floor(Math.max(newH,this.minH))+'px';
			clearMessage(); displayMessage(this.statusMsg.format([s.width,s.height]));
		}
		return false;
	};
	e.onmouseup=function(ev) { var ev=ev||window.event;
		if (ev.shiftKey) { this.style.width=this.style.height=''; }
		if (ev.ctrlKey)  { this.style.width=this.originalW; this.style.height=this.originalH; }
		this.sizing=false;
		clearMessage();
		return false;
	};
	e.onmouseout=function(ev) { var ev=ev||window.event;
		this.sizing=false;
		clearMessage();
		return false;
	};
}
//}}}
Don'tchya think these two unicode symbols could just be the future of music piracy logo?

How about as the logo for a label? :)
In the past I have used A4 pads as my notebooks. Then in America I bought a notebook which was 6.5" of 9.5" sized. It's an odd size, being just a touch smaller than B5! Anyway, It was 150 sheets of great, and served me for ages. 

Then in 2003, I adopted my current crop of A6 visual arts diaries. Nice thick acid free paper without lines. Perfect to sketch, and ok to prose. 

But not ideal always. Sometimes I want lines. or dots. or grids. 

In 2008 I bought an expensive "US Letter" sized "dot grid book" . It has alot of niceness in the grid, but the overall size is too big. 

My ideal notebook now:
A6, or maybe A5, visual arts diary, but with a faint 5mm 'dot grid' on one side of every page. (with front and back covers both clear, so either side can become 'front' as of first usage)

Anything else I've missed?
! Notes for my childhood hoon fantasy panelvan idea

The original core idea being to stretch a Holden van over dual rear axles and add campervan popup roof. However the idea has adjusted to circumstances and reality since then. 

Now, the idea is to take a Ford XC panelvan as base, and modify it by the following (in order of increasing complexity/fantasy)

* Full GS/Rally Pack spec (sports dash, bonnet, grill and bumper)
* V8 (4.9 / 5.8 / other (crate engine))
* Tailgate-and-hatch rear doors
** alternatively: full-height rear hatch as per modern station wagons. See also Holden "Sportswagon" style hatch which is gullwing-esque.
** if tailgate-and-hatch, then next step is Ford "magic-doorgate" style tailgate from wagon. (see also: Honda Ridgeline for excellent recent implementation)
* Internal rear seats. Note possible complications:
** moving petrol tank (will have to match station wagon)
** side intrusion bars? 
** seatbelt mounts?
** Additional (openable?) windows (coupe style door glass?)
* Extended to third axle ("dually" - six wheels)
* Widened to twin wheels on the axles (ten wheel total!!)
* Campervan popup roof (see XB Surferoo and XF Breakaway Surfside for examples, though I want full popup)
* Raised suspension / 4WD
* Electric conversion?

Alternative: Base as Ford XC station wagon, then the build process is to "replace body panels with that of panel van". It's unclear without research which would be easier (both mechanically, and legally) to do: Put a wagon interior into a van, or put a van exterior onto a wagon! 

!! Other ideas
* Interior roll-cage / "ceiling rack", from which cargo barriers can be attached, or even a hammock could be strung? ;)
** This may be worth pursuing for seatbelt mounts within a van, anyway?
* A "drive-in" mode. Basically, stealth - All lights disabled against accidental use (even brake light) at a drive-in. For legal reasons, this should only be able to be enabled whilst the car is parked, engine stopped, handbrake applied. 
** A semi-stealth mode for driving around a drive-in might be useful? dimmed (but usable/legal) indicators and brake lights, and navigating lights that are brighter than parking lights, but more direct to see the immediate (say, 2m past edge of car visibility) area.
* hatches along side of van for greater access? (or reverse hatch - see Toyota RV-2 concept. This wouldn't be compatible with pop-up roof)
* Holden HJ-WB style vents on front guards looks good on an XC. Consider it?
* Filled in tail-lights looks good too. Where to put the lights instead? Or maybe keep them there, but flush?

!! Name/Theme
Original concept for this was Holden based (because full-chassis and parochialism), and was to be called "Saandman" or "Sandmaan" to hint at the extended wheels. However, that style doesn't suit any of the Ford names. (Foord? Faalcon? Sundoowner?!). For the moment, I think of it as "Panel Wagon" (panel van exterior and wagon interior/seating), and "Travel Van" (my original name for the original core idea of stretching a van over dual rear axles). Conceptually, it's closer to a station wagon (ie, sedan seating, but expanded cargo space) than anything else. 

Name ideas then:
* Sunsurfer (A reference to 'Surferoo' and 'Surfsider' from the XB era, and 'Sundowner' from the XB/XC era
** perhaps Hotblack Sunsurfer - to give it a HHG flair in it's name
*** though I'm not looking to go with black as a colour... 
* The Beast
** it will be huge, but kind of taken by that movie guy's XB. "Love The Beast". Also, a bit of a generic name
* other alternate names for vans that I've found
** Swagman (because it's a synonym for 'Sundowner')
** Bushman (as counterpoint to 'Sandman')
* Mork themed
** white with rainbow stripes
*** "white on white" ?
** numberplate: "nanu•nanu"
** black interior, but some red with silver triangle somewhere?
*** seats? roof lining?
** ford badge on grill - swap colours - blue writing on white logo (it, to suit white exterior theming, plus oval)
*** have it say different word in Ford font? Nanu? Mork? Nemo? other?
** tail lights tweaked to be egg shaped lights. (keep outside view normal, just gobo it from behind the lens?)



Note that the above is Ford XC based as per my taste in vans of this era. However, they are a monocoque body/chassis, whilst the Holden commercials were full chassis, and the last of the Holdens - the WB, were made later than the XC. By all accounts, the full chassis leads to greater flexibility on the Holdens. (cite: 2-tonners, Overlander, "Blo-Bak II"), though it impacts feasibility of adding "rear seats". Note that the One-Tonner chassis was longer than the Ute/Wagon chassis. 

Conceptually, I like the "idea" of Holden more than Ford, but that is purely parochialism. In actual personal experience, prefer Fords

!! WB vs XC
| | !Holden HQ-HZ and WB | !Falcon XA,XB,XC |
| Year | 1980-1985 (WB) | 1976-1979 (XC)  |
| Best engine given mounts | Chevy LS1 ? | |
| Wheelbase | 2819mm (Sedan/coupe), 2895 (Wagon, Ute, Van, Statesman), (3058 cab-chassis) | 2819mm (sedan), 2946 (Wagon, Ute, Van) |
| Front/Rear Track | 1520/1530mm | 1539/1527mm |
| Interior | right-side handbrake | simple but excellent fascia, air vents |
| Doors | from sedan | from coupe |
| chassis | body-on-frame (has reputation of modding) | unibody |
| other | Side intrusion bars from late HX (but not ute/van). RTS from HZ | Side intrusion bars from the XC (from start, or "half"?). Improved suspension from "XC and a half"/"XC Update". XC.5 from April/May 1978 and identifiable by mid-grill Ford Oval badge. GS/Rally Pack = bonnet nostrils, driving lights (except Fairmont which had rectangle headlights already), and bumper extensions. (and sports dash?). two-way tailgate on wagons was standard on Fairmont, and option on Falcons. (may have been standard on XA/XB?) |

!! Links
* http://www.uniquecarsandparts.com.au/holden_WB_technical_specifications.htm
* http://www.uniquecarsandparts.com.au/falcon_XC_technical_specifications.htm
* http://en.wikipedia.org/wiki/Ford_Falcon_XC
* Overlander / 4wd conversions
** http://www.4wdonline.com/Conv/Overlander/Overlander.html
** http://www.4wdonline.com/Conv/Overlander/Ute.html
** http://www.allisons.org/ll/4/GM/Overlander/
** http://www.truckjungle.com/2012/09/08/aussie-classic-holden-overlander-4x4/
** http://www.4wdonline.com/Conv/Conv.html
* Cab-chassis info
** http://www.truckjungle.com/2011/11/29/the-original-aussie-one-tonner-turns-40/
** http://www.truckjungle.com/2012/02/02/full-history-hq-wb-holden-one-tonner-1971-1985/
* Modding info
** http://www.mysandman.com.au/forums/showthread.php/4998-Dual-fuel-tanks-anyone-tried-it
* http://holdenpaedia.oldholden.com/HQ-WB_Interchangeable_parts

* http://www.4wdaction.com.au/forum/viewtopic.php?f=7&t=94181 - Some forum with the right idea!

* XC Update
** http://www.aussiecoupes.com/xcfalcon.html
** http://www.boostedfalcon.net/falconfacts/falcon/xcfalcon.html
some ideas for tattoos that I could get. 

it's worth noting that I'm pretty much the opposite of impulsive for anything permanent like this, so most of these are theoretical at best. 

!!!Fanish stuff
!!!!HHG based ideas 
* babel fish in/behind/near ear
** TV series version!
* 42 or Don't Panic somewhere
!!!!Doctor Who
* "?" (as common in 1980s Doctor Who). On collarbone?
!!!!Gunnerkrigg Court
* forest symbol near heart and school symbol near on head
* reverse these to remind one to link to the other?

!!!Other
* self-designed pattern of some kind on back of skull. 
* power smiley on ankle
for gift or other

* Wallet
* chain maille
* inkblots on jigsaw puzzles (get your mind together!)
! lengthy
* HHG fan project in wraps
* Light - also in wraps

! parody short
* revisit the lobby scene from The Matrix, but with clowns and as a food fight

! short ideas
* rubiks cube - blended
/***
|Name|TiddlerTweakerPlugin|
|Source|http://www.TiddlyTools.com/#TiddlerTweakerPlugin|
|Version|2.4.4|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|select multiple tiddlers and modify author, created, modified and/or tag values|
~TiddlerTweaker is a 'power tool' for TiddlyWiki authors.  Select multiple tiddlers from a listbox and 'bulk modify' the creator, author, created, modified and/or tag values of those tiddlers using a compact set of form fields.  The values you enter into the fields simultaneously overwrite the existing values in all tiddlers you have selected.
!!!!!Usage
<<<
{{{<<tiddlerTweaker>>}}}
{{smallform{<<tiddlerTweaker>>}}}
By default, any tags you enter into the TiddlerTweaker will //replace// the existing tags in all the tiddlers you have selected.  However, you can also use TiddlerTweaker to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged:
>Any tag preceded by a '+' (plus) or '-' (minus), will be added or removed from the existing tags //instead of replacing the entire tag definition// of each tiddler (e.g., enter '-excludeLists' to remove that tag from all selected tiddlers.  When using this syntax, care should be taken to ensure that //every// tag is preceded by '+' or '-', to avoid inadvertently overwriting any other existing tags on the selected tiddlers.  (note: the '+' or '-' prefix on each tag value is NOT part of the tag value, and is only used by TiddlerTweaker to control how that tag value is processed)
Important Notes:
* TiddlerTweaker is a 'power user' tool that can make changes to many tiddlers at once.  ''You should always have a recent backup of your document (or 'save changes' just *before* tweaking the tiddlers), just in case you accidentally 'shoot yourself in the foot'.''
* The date and author information on any tiddlers you tweak will ONLY be updated if the corresponding checkboxes have been selected.  As a general rule, after using TiddlerTweaker, always ''//remember to save your document//'' when you are done, even though the tiddler timeline tab may not show any recently modified tiddlers.
* Selecting and updating all tiddlers in a document can take a while.  Your browser may warn about an 'unresponsive script'.  Usually, if you allow it to continue, it should complete the processing... eventually.  Nonetheless, be sure to save your work before you begin tweaking lots of tiddlers, just in case something does get stuck.
<<<
!!!!!Revisions
<<<
2009.09.15 2.4.4 added 'edit' button. moved html definition to separate section
2009.09.13 2.4.3 in settiddlers(), convert backslashed chars (\n\b\s\t) in replacement text
2009.06.26 2.4.2 only add brackets around tags containing spaces
2009.06.22 2.4.1 in setFields(), add brackets around all tags shown tweaker edit field
2009.03.30 2.4.0 added 'sort by modifier'
2009.01.22 2.3.0 added support for text pattern find/replace
2008.10.27 2.2.3 in setTiddlers(), fixed Safari bug by replacing static Array.concat(...) with new Array().concat(...)
2008.09.07 2.2.2 added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.12 2.2.1 replace built-in backstage tweak task with tiddler tweaker control panel (moved from BackstageTweaks)
2008.01.13 2.2.0 added 'auto-selection' links: all, changed, tags, title, text
2007.12.26 2.1.0 added support for managing 'creator' custom field (see [[CoreTweaks]])
2007.11.01 2.0.3 added config.options.txtTweakerSortBy for cookie-based persistence of list display order preference setting.
2007.09.28 2.0.2 in settiddlers() and deltiddlers(), added suspend/resume notification handling (improves performance when operating on multiple tiddlers)
2007.08.03 2.0.1 added shadow definition for [[TiddlerTweaker]] tiddler for use as parameter references with {{{<<tiddler>>, <<slider>> or <<tabs>>}}} macros.
2007.08.03 2.0.0 converted from inline script
2006.01.01 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlerTweakerPlugin= {major: 2, minor: 4, revision: 4, date: new Date(2009,9,15)};

// shadow tiddler
config.shadowTiddlers.TiddlerTweaker='<<tiddlerTweaker>>';

// defaults
if (config.options.txtTweakerSortBy==undefined) config.options.txtTweakerSortBy='modified';

// backstage task
if (config.tasks) { // for TW2.2b3 or above
	config.tasks.tweak.tooltip='review/modify tiddler internals: dates, authors, tags, etc.';
	config.tasks.tweak.content='{{smallform small groupbox{<<tiddlerTweaker>>}}}';
}

// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

config.macros.tiddlerTweaker = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span=createTiddlyElement(place,'span');
		span.innerHTML=store.getTiddlerText('TiddlerTweakerPlugin##html');
		this.init(span.getElementsByTagName('form')[0],config.options.txtTweakerSortBy);
	},
	init: function(f,sortby) { // initialize form controls
		if (!f) return; // form might not be rendered yet...
		while (f.list.options[0]) f.list.options[0]=null; // empty current list content
		var tids=store.getTiddlers(sortby);
		if (sortby=='size') // descending order
			tids.sort(function(a,b) {return a.text.length > b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});
		var who='';
		for (i=0; i<tids.length; i++) { var t=tids[i];
			var label=t.title; var value=t.title;
			switch (sortby) {
				case 'modified':
				case 'created':
					var t=tids[tids.length-i-1]; // reverse order
					var when=t[sortby].formatString('YY.0MM.0DD 0hh:0mm ');
					label=when+t.title;
					value=t.title;
					break;
				case 'size':
					label='['+t.text.length+'] '+label;
					break;
				case 'modifier':
				case 'creator':
					if (who!=t[sortby]) {
						who=t[sortby];
						f.list.options[f.list.length]=new Option('by '+who+':','',false,false);
					}
					label='\xa0\xa0\xa0'+label; // indent
					break;
			}
			f.list.options[f.list.length]=new Option(label,value,false,false);
		}
		f.title.value=f.who.value=f.creator.value=f.tags.value='';
		f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value='';
		f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value='';
		f.stats.disabled=f.set.disabled=f.del.disabled=f.edit.disabled=f.display.disabled=true;
		f.settitle.disabled=false;
		config.options.txtTweakerSortBy=sortby;
		f.sortby.value=sortby; // sync droplist
		if (sortby!='modified') saveOptionCookie('txtTweakerSortBy');
		else removeCookie('txtTweakerSortBy');
	},
	selecttiddlers: function(here) { // enables/disables inputs based on #items selected
		var f=here.form; var list=f.list;
		var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
		if (c>1) f.title.disabled=true;
		if (c>1) f.settitle.checked=false;
		f.set.disabled=(c==0);
		f.del.disabled=(c==0);
		f.edit.disabled=(c==0);
		f.display.disabled=(c==0);
		f.settitle.disabled=(c>1);
		f.stats.disabled=(c==0);
		var msg=(c==0)?'select tiddlers':(c+' tiddler'+(c!=1?'s':'')+' selected');
		here.previousSibling.firstChild.firstChild.nextSibling.innerHTML=msg;
		if (c) clearMessage(); else displayMessage('no tiddlers selected');
	},
	setfields: function(here) { // set fields from first selected tiddler
		var f=here.form;
		if (!here.value.length) {
			f.title.value=f.who.value=f.creator.value=f.tags.value='';
			f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value='';
			f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value='';
			return;
		}
		var tid=store.getTiddler(here.value); if (!tid) return;
		f.title.value=tid.title;
		f.who.value=tid.modifier;
		f.creator.value=tid.fields['creator']||''; // custom field - might not exist
		f.tags.value=tid.tags.map(function(t){return String.encodeTiddlyLink(t)}).join(' ');
		var c=tid.created; var m=tid.modified;
		f.cm.value=c.getMonth()+1;
		f.cd.value=c.getDate();
		f.cy.value=c.getFullYear();
		f.ch.value=c.getHours();
		f.cn.value=c.getMinutes();
		f.mm.value=m.getMonth()+1;
		f.md.value=m.getDate();
		f.my.value=m.getFullYear();
		f.mh.value=m.getHours();
		f.mn.value=m.getMinutes();
	},
	settiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		var cdate=new Date(f.cy.value,f.cm.value-1,f.cd.value,f.ch.value,f.cn.value);
		var mdate=new Date(f.my.value,f.mm.value-1,f.md.value,f.mh.value,f.mn.value);
		if (tids.length>1 && !confirm('Are you sure you want to update these tiddlers:\n\n'+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			var title=!f.settitle.checked?tid.title:f.title.value;
			var who=!f.setwho.checked?tid.modifier:f.who.value;
			var text=tid.text;
			if (f.replacetext.checked) {
				var r=f.replacement.value.replace(/\\t/mg,'\t').unescapeLineBreaks();
				text=text.replace(new RegExp(f.pattern.value,'mg'),r);
			}				
			var tags=tid.tags;
			if (f.settags.checked) { 
				var intags=f.tags.value.readBracketedList();
				var addtags=[]; var deltags=[]; var reptags=[];
				for (i=0;i<intags.length;i++) {
					if (intags[i].substr(0,1)=='+')
						addtags.push(intags[i].substr(1));
					else if (intags[i].substr(0,1)=='-')
						deltags.push(intags[i].substr(1));
					else
						reptags.push(intags[i]);
				}
				if (reptags.length)
					tags=reptags;
				if (addtags.length)
					tags=new Array().concat(tags,addtags);
				if (deltags.length)
					for (i=0;i<deltags.length;i++)
						{ var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }
			}
			if (!f.setcdate.checked) cdate=tid.created;
			if (!f.setmdate.checked) mdate=tid.modified;
			store.saveTiddler(tid.title,title,text,who,mdate,tags,tid.fields);
			if (f.setcreator.checked) store.setValue(tid.title,'creator',f.creator.value); // set creator
			if (f.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date
		}
		store.resumeNotifications();
		this.init(f,f.sortby.value);
	},
	displaytiddlers: function(here,edit) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		story.displayTiddlers(story.findContainingTiddler(f),tids,edit?DEFAULT_EDIT_TEMPLATE:null);
	},
	deltiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		if (!confirm('Are you sure you want to delete these tiddlers:\n\n'+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			if (tid.tags.contains('systemConfig')) {
				var msg=tid.title+' is tagged with systemConfig.'
					+'\n\nRemoving this tiddler may cause unexpected results.  Are you sure?';
				if (!confirm(msg)) continue;
			}
			store.removeTiddler(tid.title);
			story.closeTiddler(tid.title);
		}
		store.resumeNotifications();
		this.init(f,f.sortby.value);
	},
	stats: function(here) {
		var f=here.form; var list=f.list; var tids=[]; var out=''; var tot=0;
		var target=f.nextSibling;
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
		}
		var avg=tot/tids.length;
		out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<\n';
		removeChildren(target);
		target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' "
			+"onclick='this.parentNode.parentNode.style.display=\"none\"'>close</a></font>";
		wikify(out,target);
		target.style.display='block';
	}
};
//}}}
/***
//{{{
!html
<style>
.tiddlerTweaker table,
.tiddlerTweaker table tr,
.tiddlerTweaker table td
	{ padding:0;margin:0;border:0;white-space:nowrap; }
</style><form class='tiddlerTweaker'><!--
--><table style="width:100%"><tr valign="top"><!--
--><td style="text-align:center;width:99%;"><!--
	--><font size=-2><div style="text-align:left;"><span style="float:right"><!--
	-->&nbsp; <a href="javascript:;" 
		title="select all tiddlers"
		onclick="
		var f=this; while (f&&f.nodeName.toLowerCase()!='form')f=f.parentNode;
		for (var t=0; t<f.list.options.length; t++)
			if (f.list.options[t].value.length) f.list.options[t].selected=true;
		config.macros.tiddlerTweaker.selecttiddlers(f.list);
		return false">all</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers that are new/changed since the last file save"
		onclick="
		var lastmod=new Date(document.lastModified);
		var f=this; while (f&&f.nodeName.toLowerCase()!='form')f=f.parentNode;
		for (var t=0; t<f.list.options.length; t++) {
			var tid=store.getTiddler(f.list.options[t].value);
			f.list.options[t].selected=tid&&tid.modified>lastmod;
		}
		config.macros.tiddlerTweaker.selecttiddlers(f.list);
		return false">changed</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers with at least one matching tag"
		onclick="
		var t=prompt('Enter space-separated tags (match ONE)');
		if (!t||!t.length) return false;
		var tags=t.readBracketedList();
		var f=this; while (f&&f.nodeName.toLowerCase()!='form')f=f.parentNode;
		for (var t=0; t<f.list.options.length; t++) {
			f.list.options[t].selected=false;
			var tid=store.getTiddler(f.list.options[t].value);
			if (tid&&tid.tags.containsAny(tags)) f.list.options[t].selected=true;
		}
		config.macros.tiddlerTweaker.selecttiddlers(f.list);
		return false">tags</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers whose titles include matching text"
		onclick="
		var txt=prompt('Enter a title (or portion of a title) to match');
		if (!txt||!txt.length) return false;
		var f=this; while (f&&f.nodeName.toLowerCase()!='form')f=f.parentNode;
		for (var t=0; t<f.list.options.length; t++) {
			f.list.options[t].selected=f.list.options[t].value.indexOf(txt)!=-1;
		}
		config.macros.tiddlerTweaker.selecttiddlers(f.list);
		return false">titles</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers containing matching text"
		onclick="
		var txt=prompt('Enter tiddler text (content) to match');
		if (!txt||!txt.length) return false;
		var f=this; while (f&&f.nodeName.toLowerCase()!='form')f=f.parentNode;
		for (var t=0; t<f.list.options.length; t++) {
			var tt=store.getTiddlerText(f.list.options[t].value,'');
			f.list.options[t].selected=(tt.indexOf(txt)!=-1);
		}
		config.macros.tiddlerTweaker.selecttiddlers(f.list);
		return false">text</a> &nbsp;<!--
	--></span><span>select tiddlers</span><!--
	--></div><!--
	--></font><select multiple name=list size="11" style="width:99.99%" 
		title="use click, shift-click and/or ctrl-click to select multiple tiddler titles" 
		onclick="config.macros.tiddlerTweaker.selecttiddlers(this)" 
		onchange="config.macros.tiddlerTweaker.setfields(this)"><!--
	--></select><br><!--
	-->show<input type=text size=1 value="11" 
		onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--
	-->by<!--
	--><select name=sortby size=1 
		onchange="config.macros.tiddlerTweaker.init(this.form,this.value)"><!--
	--><option value="title">title</option><!--
	--><option value="size">size</option><!--
	--><option value="modified">modified</option><!--
	--><option value="created">created</option><!--
	--><option value="modifier">modifier</option><!--
	--></select><!--
	--><input type="button" value="refresh" 
		onclick="config.macros.tiddlerTweaker.init(this.form,this.form.sortby.value)"<!--
	--> <input type="button" name="stats" disabled value="totals..." 
		onclick="config.macros.tiddlerTweaker.stats(this)"><!--
--></td><td style="width:1%"><!--
	--><div style="text-align:left"><font size=-2>&nbsp;modify values</font></div><!--
	--><table style="width:100%;"><tr><!--
	--><td style="padding:1px"><!--
		--><input type=checkbox name=settitle unchecked 
			title="allow changes to tiddler title (rename tiddler)" 
			onclick="this.form.title.disabled=!this.checked">title<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=title size=35 style="width:98%" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setcreator unchecked 
			title="allow changes to tiddler creator" 
			onclick="this.form.creator.disabled=!this.checked">created by<!--
	--></td><td style="padding:1px;"><!--
		--><input type=text name=creator size=35 style="width:98%" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setwho unchecked 
			title="allow changes to tiddler author" 
			onclick="this.form.who.disabled=!this.checked">modified by<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=who size=35 style="width:98%" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setcdate unchecked 
			title="allow changes to created date" 
			onclick="var f=this.form;
				f.cm.disabled=f.cd.disabled=f.cy.disabled=f.ch.disabled=f.cn.disabled=!this.checked"><!--
		-->created on<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=cm size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=cd size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=cy size=4 style="width:3em;padding:0;text-align:center" disabled><!--
		--> at <input type=text name=ch size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> : <input type=text name=cn size=2 style="width:2em;padding:0;text-align:center" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setmdate unchecked 
			title="allow changes to modified date" 
			onclick="var f=this.form;
				f.mm.disabled=f.md.disabled=f.my.disabled=f.mh.disabled=f.mn.disabled=!this.checked"><!--
		-->modified on<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=mm size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=md size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=my size=4 style="width:3em;padding:0;text-align:center" disabled><!--
		--> at <input type=text name=mh size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> : <input type=text name=mn size=2 style="width:2em;padding:0;text-align:center" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=replacetext unchecked
			title="find/replace matching text" 
			onclick="this.form.pattern.disabled=this.form.replacement.disabled=!this.checked">replace text<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=pattern size=15 value="" style="width:40%" disabled 
			title="enter TEXT PATTERN (regular expression)"> with<!--
		--><input type=text name=replacement size=15 value="" style="width:40%" disabled 
			title="enter REPLACEMENT TEXT"><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=settags checked 
			title="allow changes to tiddler tags" 
			onclick="this.form.tags.disabled=!this.checked">tags<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=tags size=35 value="" style="width:98%" 
			title="enter new tags or use '+tag' and '-tag' to add/remove tags from existing tags"><!--
	--></td></tr></table><!--
	--><div style="text-align:center"><!--
	--><nobr><input type=button name=display disabled style="width:24%" value="display" 
		title="show selected tiddlers"
		onclick="config.macros.tiddlerTweaker.displaytiddlers(this,false)"><!--
	--> <input type=button name=edit disabled style="width:23%" value="edit" 
		title="edit selected tiddlers"
		onclick="config.macros.tiddlerTweaker.displaytiddlers(this,true)"><!--
	--> <input type=button name=del disabled style="width:24%" value="delete" 
		title="remove selected tiddlers"
		onclick="config.macros.tiddlerTweaker.deltiddlers(this)"><!--
	--> <input type=button name=set disabled style="width:24%" value="update" 
		title="update selected tiddlers"
		onclick="config.macros.tiddlerTweaker.settiddlers(this)"></nobr><!--
	--></div><!--
--></td></tr></table><!--
--></form><span style="display:none"><!--content replaced by tiddler "stats"--></span>
!end
//}}}
***/
 
A rack mounted LED array of [[blinkenlights|http://en.wikipedia.org/wiki/Blinkenlights]], 1RU, which emulates [[KITT|http://en.wikipedia.org/wiki/KITT]]s scanner by visual, but is similar to the [[BeBox|http://en.wikipedia.org/wiki/BeBox]]'s blinkenlights for function. 
[img[http://nemo.house.cx/uploads/workspace/default/kitt.gif][K.I.T.T]]

...this article has now (20110127) migrated to ThorxWiki. Go fetch! :)
lights in pipes. 

See: http://www.thinkgeek.com/clearance/831e/
/***
|''Name:''|WikiBar|
|''Version:''|2.0.0 beta3|
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|toolbar macro command extension|
|''Required:''|TiddlyWiki 2.0.0 beta6|
!Description
WikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax.
Besides, with WikiBar-addons, users can extend the power of WikiBar.
!Support browser
*Firefox 1.5
!Revision history
*v2.0.0 beta3 (2005/12/30)
** remove macros (replaced by TWMacro addon)
** add wikibar command in toolbar automatically
** rename DOIT to HANDLER
** rename TIP to TOOLTIP
*v2.0.0 beta2 (2005/12/21)
** re-design Wikibar addon framework
*v2.0.0 beta1 (2005/12/14)
** Note:
*** WikiBarPlugin is renamed to WikiBar
** New Features:
*** support TiddlyWiki 2.0.0 template mechanism
*** new wikibar data structure
*** new wikibar-addon framework for developers
**** support dynamic popup menu generator
*** support most new macros added in TiddlyWiki 2.0.0
*** multi-level popup menu
*** fix wikibar tab stop
*** remove paletteSelector
** Known Bugs:
*** popup-menu and color-picker can't be closed correctly
*** some macros can't be displayed correctly in previewer
*** text in previewer will be displayed italic
*v1.2.0 (2005/11/21)
**New Features:
***User defined color palettes supported
####Get color palettes from [[ColorZilla Palettes|http://www.iosart.com/firefox/colorzilla/palettes.html]].
####Save the palette file(*.gpl) as a new tiddler and tag it with 'ColorPalettes', then you can use it in WikiBar.
***WikiBar style sheet supported
***Click on document to close current colorPicker, paletteSelector or aboutWikibar
*v1.1.1 (2005/11/03)
**Bugs fixed:
***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'
*v1.1.0 (2005/11/01)
**Bugs fixed:
***WikiBar overruns (reported by by GeoffS <gslocock@yahoo.co.uk>)
**New features:
***Insert a color code at the cursor. (Thanks to RunningUtes <RunningUtes@gmail.com>)
***Enable gradient macro. (Thanks to RunningUtes <RunningUtes@gmail.com>)
***Insert tiddler comment tags {{{/% ... %/}}}. (new feature supported by TiddlyWiki 1.2.37)
***Insert DateFormatString for {{{<<today>>}}} macro. (new feature supported by TiddlyWiki 1.2.37)
**Enhanced:
***Allow optional parameters in syntax.
**Bugs:
***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'
*v1.0.0 (2005/10/30)
**Initial release
!Code
***/
//{{{
config.macros.wikibar = {major: 2, minor: 0, revision: 0, beta: 3, date: new Date(2005,12,30)};
config.macros.wikibar.handler = function(place,macroName,params,wikifier,paramString,tiddler){
  if(!(tiddler instanceof Tiddler))  {return;}
	story.setDirty(tiddler.title,true);
  place.id = 'wikibar'+tiddler.title;
  place.className = 'toolbar wikibar';
};
function wikibar_install(){
  config.commands.wikibar = {
  	text: 'wikibar',
  	tooltip: 'wikibar on/off',
  	handler: function(e,src,title) {
      if(!e){ e = window.event; }
      var theButton = resolveTarget(e);
      theButton.id = 'wikibarButton'+title;
      wikibarPopup.remove();
      wikibar_installAddons(theButton, title);
      wikibar_createWikibar(title);
      return(false);
    }
  };
  config.shadowTiddlers['EditTemplate'] = wikibar_addWikibarCommand(config.shadowTiddlers['EditTemplate']);
  var tiddler = store.getTiddler('EditTemplate');
  if(tiddler){
    tiddler.text = wikibar_addWikibarCommand(tiddler.text);
  }
}
function wikibar_installAddons(theButton, title){
 	var tiddlers = store.getTaggedTiddlers('wikibarAddons');
	if(!tiddlers)	  { return; }
	theButton.addons=[];
  for(var i=0; i<tiddlers.length; i++){
    try{
      eval(tiddlers[i].text);
      try{
        wikibar_addonInstall(title);
        wikibar_addonInstall = null;
        theButton.addons.push({ok:true, name:tiddlers[i].title});
      }catch(ex){
        theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
      }
    }catch(ex){
      theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
    }
  }
}
function wikibar_addWikibarCommand(tiddlerText){
  var div = document.createElement('div');
  div.style.display = 'none';
  div.innerHTML = tiddlerText;
  for(var i=0; i<div.childNodes.length; i++){
    var o=div.childNodes[i];
    if(o.tagName==='DIV'){
      if(o.className=='toolbar'){
        var macroText = o.getAttribute('macro').trim();
        if(macroText.search('wikibar')<=0){
          macroText += ' wikibar';
          o.setAttribute('macro', macroText);
        }
        break;
      }
    }
  }
  return div.innerHTML.replace(/\"/g, "\'");
}
function wikibar_processSyntaxParams(theSyntax, params){
  try{
    var pcr = 'AplWikibarPcr';
    var rx=null;
    var allParams=null;
    if(params){
      if(typeof(params)=='object'){
        for(var i=0; i<params.length; i++){
          if(params[i]){
            params[i] = params[i].replace(new RegExp('%','g'), pcr).trim();
            rx = '(\\[%'+(i+1)+'\\])' + '|' + '(%'+(i+1)+')';
            theSyntax = theSyntax.replace(new RegExp(rx,'g'), params[i] );
          }
        }
        allParams = params.join(' ').trim();
      }else{
        allParams = params.replace(new RegExp('%','g'), pcr).trim();
        rx = /(\[%1{1}\])|(%1{1})/g;
        theSyntax = theSyntax.replace(rx, allParams);
      }
    }
    if(allParams){
      theSyntax = theSyntax.replace(new RegExp('%N{1}','g'), allParams);
    }
    rx=/\[%(([1-9]{1,}[0-9]{0,})|(N{1}))\]/g;
    theSyntax = theSyntax.replace(rx, '');
    rx=/%(([1-9]{1,}[0-9]{0,})|(N{1}))/g;
    if( theSyntax.match(rx) ){
      throw 'Not enough parameters! ' + theSyntax;
    }
    theSyntax=theSyntax.replace(new RegExp(pcr,'g'), '%');
    return theSyntax;
  } catch(ex){
    return null;
  }
}
function wikibar_resolveEditItem(tiddlerWrapper, itemName){
  if(tiddlerWrapper.hasChildNodes()){
    var c=tiddlerWrapper.childNodes;
    for(var i=0; i<c.length; i++){
      var txt=wikibar_resolveEditItem(c[i], itemName);
      if(!txt){
        continue;
      }else{
        return txt;
      }
    }
  }
  return ((tiddlerWrapper.getAttribute && tiddlerWrapper.getAttribute('edit')==itemName)? tiddlerWrapper : null);
}
function wikibar_resolveEditItemValue(tiddlerWrapper, itemName){
  var o = wikibar_resolveEditItem(tiddlerWrapper, itemName);
  return (o? o.value.replace(/\r/mg,'') : null);
}
function wikibar_resolveTiddlerEditorWrapper(obj){
  if(obj.id=='tiddlerDisplay'){return null;}
  if((obj.getAttribute && obj.getAttribute('macro')=='edit text')){return obj;}
  return wikibar_resolveTiddlerEditorWrapper(obj.parentNode);
}
function wikibar_resolveTiddlerEditor(obj){
  if(obj.hasChildNodes()){
    var c = obj.childNodes;
    for(var i=0; i<c.length; i++){
      var o=wikibar_resolveTiddlerEditor(c[i]);
      if(o){ return o;}
    }
  }
  return ((obj.getAttribute && obj.getAttribute('edit')=='text')? obj : null);
}
function wikibar_resolveTargetButton(obj){
  if(obj.id && obj.id.substring(0,7)=='wikibar'){ return null; }
  if(obj.tiddlerTitle){
    return obj;
  }else{
    return wikibar_resolveTargetButton(obj.parentNode);
  }
}
function wikibar_isValidMenuItem(tool){
  if(!tool){  return false; }
  if(tool.TYPE=='MENU' || tool.TYPE=='MAIN_MENU'){
    for(var key in tool){
      if(key.substring(0,8)=='DYNAITEM'){ return true; }
      if(wikibar_isValidMenuItem(tool[key])){ return true; }
    }
    return false;
  }else{
    return (tool.HANDLER? true : false);
  }
}
function wikibar_editFormat(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByWord(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){return;}
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  selText	   = fullText.substring(ss,se);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	  if(!( fullText.charAt(ss-1).match(/\W/gi) || fullText.charAt(ss).match(/\W/gi) )){
      var m = frontText.match(/\W/gi);
      if(m){
        ss = frontText.lastIndexOf(m[m.length-1])+1;
      }
      else{
        ss = 0;
      }
      m = endText.match(/\W/gi);
      if(m){
        se += endText.indexOf(m[0]);
      }
      else{
        se = fullText.length;
      }
      frontText = fullText.substring(0, ss);
  	  endText   = fullText.substring(se, fullText.length);
  	  selText   = fullText.substring(ss,se);
	  }
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByCursor(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByLine(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
		if(this.byBlock){
	    frontText  = fullText.substring(0, ss);
	    selText		 = fullText.substring(ss,se);
	    endText    = fullText.substring(se, fullText.length);
		}
		else{
	  	se = ss;
		}
	}
  if(ss===0 && (se===0 || se == fullText.length) ){
    var m=fullText.match(/(\n|\r)/g);
    if(m){
      se = fullText.indexOf(m[0]);
    }else{
      se = fullText.length;
    }
    selText    = fullText.substring(0, se);
    endText    = fullText.substring(se, fullText.length);
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
    m = frontText.match(/(\n|\r)/g);
    if(m){
      ss = frontText.lastIndexOf(m[m.length-1])+1;
    }
    else{
      ss = 0;
    }
    m = endText.match(/(\n|\r)/g);
    if(m){
      se += endText.indexOf(m[0]);
    }
    else{
      se = fullText.length;
    }
    frontText = fullText.substring(0, ss);
	  selText   = fullText.substring(ss,se);
	  endText   = fullText.substring(se, fullText.length);
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	if(this.byBlock){
    if( (frontText.charAt(frontText.length-1)!='\n') && ss>0 ){
    	repText = '\n' + repText;
    }
    if( (endText.charAt(0)!='\n') || se==fullText.length){
    	repText += '\n';
    }
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByTableCell(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(ss===0 || ss==fullText.length){
		throw 'not valid cell!';
	}
	se=ss;
  frontText  = fullText.substring(0, ss);
  endText    = fullText.substring(se, fullText.length);
  i=frontText.lastIndexOf('\n');
  j=frontText.lastIndexOf('|');
  if(i>j || j<0){
  	throw 'not valid cell!';
  }
	ss = j+1;
  i=endText.indexOf('\n');
  j=endText.indexOf('|');
  if(i<j || j<0){
  	throw 'not valid cell!';
  }
  se += j;
  frontText = fullText.substring(0, ss-1);
  selText   = fullText.substring(ss,se);
  endText   = fullText.substring(se+1, fullText.length);
	if(this.key.substring(0,5)=='align'){
		selText = selText.trim();
		if(	selText=='>' || selText=='~' ||	selText.substring(0,8)=='bgcolor(')	{return; }
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length - 2;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editSelectAll(param){
  var editor = param.button.editor;
	editor.selectionStart = 0;
	editor.selectionEnd   = editor.value.length;
	editor.scrollTop      = 0;
	editor.focus();
}
function wikibar_doPreview(param){
  var theButton = param.button;
  var editor = param.button.editor;
  var wikibar = theButton.parentNode;
  if(!wikibar)  { return; }
  title = theButton.tiddlerTitle;
  var editorWrapper = wikibar_resolveTiddlerEditorWrapper(editor);
  var tiddlerWrapper = editorWrapper.parentNode;
  var previewer = document.getElementById('previewer'+title);
  if(previewer){
    previewer.parentNode.removeChild(previewer);
    editorWrapper.style.display = 'block';
    visible=true;
  }else{
    previewer = document.createElement('div');
    previewer.id = 'previewer'+title;
    previewer.className = 'viewer previewer';
    previewer.style.height = (editor.offsetHeight) + 'px';
    wikify(editor.value, previewer);
    tiddlerWrapper.insertBefore(previewer, editorWrapper);
    editorWrapper.style.display = 'none';
    visible=false;
  }
  var pv=null;
  for(var i=0; i<wikibar.childNodes.length; i++){
    try{
      var btn = wikibar.childNodes[i];
      if(btn.toolItem.key == 'preview'){ pv=btn; }
      if(btn.toolItem.key != 'preview'){
        btn.style.display = visible ? '': 'none';
      }
    }catch(ex){}
  }
  if(!pv) { return; }
  if(visible){
    pv.innerHTML = '<font face=\"verdana\">&infin;</font>';
    pv.title = 'preview current tiddler';
  }
  else{
    pv.innerHTML = '<font face=\"verdana\">&larr;</font>';
    pv.title = 'back to editor';
  }
}
function wikibar_doListAddons(param){
  clearMessage();
  var title = param.button.tiddlerTitle;
  var wikibarButton = document.getElementById('wikibarButton'+title);
  var ok=0, fail=0;
  for(var i=0; i<wikibarButton.addons.length; i++){
    var addon=wikibarButton.addons[i];
    if(addon.ok){
      displayMessage('[ o ] '+addon.name);
      ok++;
    }
    else{
      displayMessage('[ x ] '+addon.name + ': ' + addon.error);
      fail++;
    }
  }
  displayMessage('---------------------------------');
  displayMessage(ok + ' ok ; ' + fail + ' failed');
}
function wikibar_getColorCode(param){
  var cbOnPickColor = function(colorCode, param){
    param.params = colorCode;
    param.button.toolItem.doMore(param);
  };
  wikibarColorTool.openColorPicker(param.button, cbOnPickColor, param);
}
function wikibar_getLinkUrl(param){
  var url= prompt('Please enter the link target', (this.param? this.param : ''));
  if (url && url.trim().length>0){
    param.params = url;
    this.doMore(param);
  }
}
function wikibar_getTableRowCol(param){
  var rc= prompt('Please enter (rows x cols) of the table', '2 x 3');
  if (!rc || (rc.trim()).length<=0){ return; }
  var arr = rc.toUpperCase().split('X');
  if(arr.length != 2)   { return; }
  for(var i=0; i<arr.length; i++){
    if(isNaN(arr[i].trim()))  { return; }
  }
  var rows = parseInt(arr[0].trim(), 10);
  var cols = parseInt(arr[1].trim(), 10);
  var txtTable='';
  for(var r=0; r<rows; r++){
    for(var c=0; c<=cols; c++){
      if(c===0){
        txtTable += '|';
      }else{
        txtTable += ' |';
      }
    }
    txtTable += '\n';
  }
  if(txtTable.trim().length>0){
    param.params = txtTable.trim();
    this.doMore(param);
  }
}
function wikibar_getMacroParam(param){
  var p = prompt('Please enter the parameters of macro \"' + this.key + '\":' +
                 '\nSyntax: ' + this.syntax +
                 '\n\nNote: '+
                 '\n%1,%2,... - parameter needed'+
                 '\n[%1] - optional parameter'+
                 '\n%N   - more than one parameter(1~n)'+
                 '\n[%N] - any number of parameters(0~n)'+
                 '\n\nPS:'+
                 '\n1. Parameters should be seperated with space character'+
                 '\n2. Use \" to wrap the parameter that includes space character, ex: \"hello world\"'+
                 '\n3. Input the word(null) for the optional parameter ignored',
                 (this.param? this.param : '') );
  if(!p)  { return; }
  p=p.readMacroParams();
  for(var i=0; i<p.length; i++){
    var s=p[i].trim();
    if(s.indexOf(' ')>0){ p[i]="'"+s+"'"; }
    if(s.toLowerCase()=='null'){ p[i]=null; }
  }
  param.params = p;
  this.doMore(param);
}
function wikibar_getMorePalette(unused){
  clearMessage();
  displayMessage('Get more color palettes(*.gpl) from ColorZilla Palettes site', 'http:\/\/www.iosart.com/firefox/colorzilla/palettes.html');
  displayMessage('Save it as a new tiddler with \"ColorPalettes\" tag');
}
function wikibar_createWikibar(title){
  var theWikibar = document.getElementById('wikibar' + title);
  if(theWikibar){
    if(theWikibar.hasChildNodes()){
      theWikibar.style.display = (theWikibar.style.display=='block'? 'none':'block');
      return;
    }
  }
  var tiddlerWrapper = document.getElementById('tiddler'+title);
  var theTextarea = wikibar_resolveTiddlerEditor(tiddlerWrapper);
  if(!theTextarea){
    clearMessage();
    displayMessage('WikiBar only works in tiddler edit mode now');
    return;
  }else{
    if(!theTextarea.id){ theTextarea.id = 'editor'+title; }
    if(!theTextarea.parentNode.id){ theTextarea.parentNode.id='editorWrapper'+title;  }
  }
  if(theWikibar){
    theWikibar = document.getElementById('wikibar'+title);
  }else{
    var editorWrapper = wikibar_resolveTiddlerEditorWrapper(theTextarea);
    theWikibar = createTiddlyElement(tiddlerWrapper, 'div', 'wikibar'+title, 'toolbar');
    addClass(theWikibar, 'wikibar');
    var previewer = document.getElementById('previewer'+title);
    if(previewer){
      tiddlerWrapper.insertBefore(theWikibar, previewer);
    }else{
      tiddlerWrapper.insertBefore(theWikibar, editorWrapper);
    }
  }
  wikibar_createMenu(theWikibar,wikibarStore,title,theTextarea);
  if(config.options['chkWikibarSetEditorHeight'] && config.options['txtWikibarEditorRows']){
    theTextarea.rows = config.options['txtWikibarEditorRows'];
  }
  setStylesheet(
    '.wikibar{text-align:left;visibility:visible;margin:2px;padding:1px;}.previewer{overflow:auto;display:block;border:1px solid;}#colorPicker{position:absolute;display:none;z-index:10;margin:0px;padding:0px;}#colorPicker table{margin:0px;padding:0px;border:2px solid #000;border-spacing:0px;border-collapse:collapse;}#colorPicker td{margin:0px;padding:0px;border:1px solid;font-size:11px;text-align:center;cursor:auto;}#colorPicker .header{background-color:#fff;}#colorPicker .button{background-color:#fff;cursor:pointer;cursor:hand;}#colorPicker .button:hover{padding-top:3px;padding-bottom:3px;color:#fff;background-color:#136;}#colorPicker .cell{padding:4px;font-size:7px;cursor:crosshair;}#colorPicker .cell:hover{padding:10px;}.wikibarPopup{position:absolute;z-index:10;border:1px solid #014;color:#014;background-color:#333;}.wikibarPopup table{margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;}.wikibarPopup .button:hover{color:#eee;background-color:#014;}.wikibarPopup .disabled{color:#888;}.wikibarPopup .disabled:hover{color:#888;background-color:#cef;}.wikibarPopup tr .seperator hr{margin:0;padding:0;background-color:#cef;width:100%;border:0;border-top:1px dashed #014;}.wikibarPopup tr .icon{font-family:verdana;font-weight:bolder;}.wikibarPopup tr .marker{font-family:verdana;font-weight:bolder;}.wikibarPopup td{font-size:0.9em;padding:2px;}.wikibarPopup input{border:0;border-bottom:1px solid #014;margin:0;padding:0;font-family:arial;font-size:100%;background-color:#fff;}',
  	'WikiBarStyleSheet');
}
function wikibar_createMenu(place,toolset,title,editor){
  if(!wikibar_isValidMenuItem(toolset)){return;}
  if(!(toolset.TYPE=='MAIN_MENU' || toolset.TYPE=='MENU')){ return; }
    for(var key in toolset){
      if(key.substring(0,9)=='SEPERATOR'){
        wikibar_createMenuSeperator(place);
        continue;
      }
      if(key.substring(0,8)=='DYNAITEM'){
        var dynaTools = toolset[key](title,editor);
        if(dynaTools.TYPE && dynaTools.TYPE=='MENU'){
          wikibar_createMenuItem(place,dynaTools,null,editor,title);
        }else{
          dynaTools.TYPE = 'MENU';
          wikibar_createMenu(place, dynaTools, title, editor);
        }
        continue;
      }
      if((toolset[key].TYPE!='MENU' && toolset[key].TYPE!='MAIN_MENU') && !toolset[key].HANDLER){continue;}
      wikibar_createMenuItem(place,toolset,key,editor,title);
    }
}
function wikibar_createMenuItem(place,toolset,key,editor,title){
  if(!key){
    var tool = toolset;
  }else{
    tool = toolset[key];
    tool.key = key;
  }
  if(!wikibar_isValidMenuItem(tool)){return;}
  var toolIsOnMainMenu = (toolset.TYPE=='MAIN_MENU');
  var toolIsMenu = (tool.TYPE=='MENU');
  var theButton;
  if(toolIsOnMainMenu){
    theButton = createTiddlyButton(
                  place,
                  '',
                  (tool.TOOLTIP? tool.TOOLTIP : ''),
                  (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem),
                  'button');
    theButton.innerHTML = (tool.CAPTION? tool.CAPTION : key);
    theButton.isOnMainMenu = true;
    addClass(theButton, (toolIsMenu? 'menu' : 'item'));
  	place.appendChild( document.createTextNode('\n') );
    if(!toolIsMenu){
      if(config.options['chkWikibarPopmenuOnMouseOver']){
        theButton.onmouseover = function(e){ wikibarPopup.remove(); };
      }
    }
  }else{
    theButton=createTiddlyElement(place, 'tr',key,'button');
    theButton.title = (tool.TOOLTIP? tool.TOOLTIP : '');
    theButton.onclick = (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem);
    var tdL = createTiddlyElement(theButton, 'td','','marker');
    var td = createTiddlyElement(theButton, 'td');
    var tdR = createTiddlyElement(theButton, 'td','','marker');
    td.innerHTML = (tool.CAPTION? tool.CAPTION : key);
    if(toolIsMenu){
      tdR.innerHTML='&nbsp;&nbsp;&rsaquo;';
    }
    if(tool.SELECTED){
      tdL.innerHTML = '&radic; ';
      addClass(theButton, 'selected');
    }
    if(tool.DISABLED){
      addClass(theButton, 'disabled');
    }
  }
  theButton.tiddlerTitle = title;
  theButton.toolItem = tool;
  theButton.editor = editor;
  theButton.tabIndex = 999;
  if(toolIsMenu){
    if(config.options['chkWikibarPopmenuOnMouseOver']){
      theButton.onmouseover = wikibar_onClickMenuItem;
    }
  }
}
function wikibar_createMenuSeperator(place){
  if(place.id.substring(0,7)=='wikibar')  { return; }
  var onclickSeperator=function(e){
  	if(!e){ e = window.event; }
  	e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation();  }
  	return(false);
  };
  var theButton=createTiddlyElement(place,'tr','','seperator');
  var td = createTiddlyElement(theButton, 'td','','seperator');
  td.colSpan=3;
  theButton.onclick=onclickSeperator;
	td.innerHTML = '<hr>';
}
function wikibar_genWikibarAbout(){
  var toolset={};
  toolset.version = {
    CAPTION: '<center>WikiBar ' +
              config.macros.wikibar.major + '.' +
              config.macros.wikibar.minor + '.' +
              config.macros.wikibar.revision +
              (config.macros.wikibar.beta? ' beta '+config.macros.wikibar.beta : '') +
              '</center>',
    HANDLER: function(){}
  };
  toolset.SEPERATOR = {};
  toolset.author = {
    CAPTION: '<center>Arphen Lin<br>arphenlin@gmail.com</center>',
    TOOLTIP: 'send mail to the author',
    HANDLER: function(){ window.open('mailto:arphenlin@gmail.com'); }
  };
  toolset.website = {
    CAPTION: '<center>aiddlywiki.sourceforge.net</center>',
    TOOLTIP: 'go to the web site of WikiBar',
    HANDLER: function(){ window.open('http:\/\/aiddlywiki.sourceforge.net/'); }
  };
  return toolset;
}
function wikibar_genWikibarOptions(title, editor){
  var toolset={};
  toolset.popOnMouseOver = {
    CAPTION:'popup menu on mouse over',
    SELECTED: config.options['chkWikibarPopmenuOnMouseOver'],
    HANDLER: function(param){
      config.options['chkWikibarPopmenuOnMouseOver'] = !config.options['chkWikibarPopmenuOnMouseOver'];
      saveOptionCookie('chkWikibarPopmenuOnMouseOver');
      var title = param.button.tiddlerTitle;
      var wikibar = document.getElementById('wikibar'+title);
      if(wikibar){ wikibar.parentNode.removeChild(wikibar); }
      wikibar_createWikibar(title);
    }
  };
  toolset.setEditorSize = {
    CAPTION:'set editor height: <input id=\"txtWikibarEditorRows\" type=text size=1 MAXLENGTH=3 value=\"' +
            (config.options['txtWikibarEditorRows']? config.options['txtWikibarEditorRows']:editor.rows) + '\"> ok',
    HANDLER: function(param){
      var input = document.getElementById('txtWikibarEditorRows');
      if(input){
        var rows = parseInt(input.value, 10);
        if(!isNaN(rows)){
          var editor = param.button.editor;
          editor.rows = rows;
        }else{
          rows=config.maxEditRows;
        }
        config.options['txtWikibarEditorRows'] = rows;
        saveOptionCookie('txtWikibarEditorRows');
        config.maxEditRows = rows;
      }
    }
  };
  toolset.setEditorSizeOnLoadingWikibar = {
    CAPTION:'set editor height on loading wikibar',
    SELECTED: config.options['chkWikibarSetEditorHeight'],
    HANDLER: function(param){
      config.options['chkWikibarSetEditorHeight'] = !config.options['chkWikibarSetEditorHeight'];
      saveOptionCookie('chkWikibarSetEditorHeight');
      if(config.options['chkWikibarSetEditorHeight']){
        var rows = config.options['txtWikibarEditorRows'];
        if(!isNaN(rows)){ rows = 15; }
        var editor = param.button.editor;
        editor.rows = rows;
        config.options['txtWikibarEditorRows'] = rows;
        saveOptionCookie('txtWikibarEditorRows');
      }
    }
  };
  toolset.SEPERATOR = {};
  toolset.update = {
    CAPTION: 'check for updates',
    DISABLED: true,
    HANDLER: function(){}
  };
  return toolset;
}
function wikibar_genPaletteSelector(){
  try{
  	var cpTiddlers = store.getTaggedTiddlers('ColorPalettes');
  	if(!cpTiddlers) { return; }
  	var palettes=[];
  	palettes.push(wikibarColorTool.defaultPaletteName);
  	for(var i=0; i<cpTiddlers.length; i++){
  		palettes.push(cpTiddlers[i].title.trim());
  	}
    var toolset={};
    for(i=0; i<palettes.length; i++){
      toolset[palettes[i]] = {
        TOOLTIP: palettes[i],
        SELECTED: (palettes[i]==wikibarColorTool.paletteName),
        HANDLER: wikibar_doSelectPalette
      };
    }
    return toolset;
  }catch(ex){ return null; }
}
function wikibar_onClickItem(e){
	if(!e){ e = window.event; }
	var theTarget = resolveTarget(e);
	if(theTarget.tagName=='INPUT'){
    e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation(); }
    return;
	}
	var theButton = wikibar_resolveTargetButton(theTarget);
	if(!theButton){ return(false);  }
  	var o = theButton.toolItem;
    if(!o) { return; }
    var param = {
      event: e,
      button: theButton
    };
    if(o.HANDLER){ o.HANDLER(param);  }
  if(o.DISABLED){
    e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation(); }
  }
	return(false);
}
function wikibar_onClickMenuItem(e){
	if(!e){ e = window.event; }
	var theButton = wikibar_resolveTargetButton(resolveTarget(e));
	if(!theButton){ return(false);  }
	e.cancelBubble = true;
	if (e.stopPropagation){ e.stopPropagation(); }
    var title = theButton.tiddlerTitle;
    var editor = theButton.editor;
    var tool = theButton.toolItem;
    if(!tool) { return; }
    var popup = wikibarPopup.create(this);
  	if(popup){
      wikibar_createMenu(popup,tool,title,editor);
      if(!popup.hasChildNodes()){
        wikibarPopup.remove();
      }else{
        wikibarPopup.show(popup, false);
      }
    }
	return(false);
}
var wikibarColorTool = {
  defaultPaletteName : 'default',
  defaultColumns : 16,
  defaultPalette : [
    '#FFF','#DDD','#CCC','#BBB','#AAA','#999','#666','#333','#111','#000','#FC0','#F90','#F60','#F30','#C30','#C03',
    '#9C0','#9D0','#9E0','#E90','#D90','#C90','#FC3','#FC6','#F96','#F63','#600','#900','#C00','#F00','#F36','#F03',
    '#CF0','#CF3','#330','#660','#990','#CC0','#FF0','#C93','#C63','#300','#933','#C33','#F33','#C36','#F69','#F06',
    '#9F0','#CF6','#9C3','#663','#993','#CC3','#FF3','#960','#930','#633','#C66','#F66','#903','#C39','#F6C','#F09',
    '#6F0','#9F6','#6C3','#690','#996','#CC6','#FF6','#963','#630','#966','#F99','#F39','#C06','#906','#F3C','#F0C',
    '#3F0','#6F3','#390','#6C0','#9F3','#CC9','#FF9','#C96','#C60','#C99','#F9C','#C69','#936','#603','#C09','#303',
    '#0C0','#3C0','#360','#693','#9C6','#CF9','#FFC','#FC9','#F93','#FCC','#C9C','#969','#939','#909','#636','#606',
    '#060','#3C3','#6C6','#0F0','#3F3','#6F6','#9F9','#CFC','#9CF','#FCF','#F9F','#F6F','#F3F','#F0F','#C6C','#C3C',
    '#030','#363','#090','#393','#696','#9C9','#CFF','#39F','#69C','#CCF','#C9F','#96C','#639','#306','#90C','#C0C',
    '#0F3','#0C3','#063','#396','#6C9','#9FC','#9CC','#06C','#369','#99F','#99C','#93F','#60C','#609','#C3F','#C0F',
    '#0F6','#3F6','#093','#0C6','#3F9','#9FF','#699','#036','#039','#66F','#66C','#669','#309','#93C','#C6F','#90F',
    '#0F9','#6F9','#3C6','#096','#6FF','#6CC','#366','#069','#36C','#33F','#33C','#339','#336','#63C','#96F','#60F',
    '#0FC','#6FC','#3C9','#3FF','#3CC','#399','#033','#39C','#69F','#00F','#00C','#009','#006','#003','#63F','#30F',
    '#0C9','#3FC','#0FF','#0CC','#099','#066','#3CF','#6CF','#09C','#36F','#0CF','#09F','#06F','#03F','#03C','#30C'
  ],
	colorPicker : null,
  pickColorHandler: null,
  userData: null
};
wikibarColorTool.paletteName = wikibarColorTool.defaultPaletteName;
wikibarColorTool.columns = wikibarColorTool.defaultColumns;
wikibarColorTool.palette = wikibarColorTool.defaultPalette;
wikibarColorTool.onPickColor = function(e){
	if (!e){ e = window.event; }
	var theCell = resolveTarget(e);
	if(!theCell){ return(false); }
    color = theCell.bgColor.toLowerCase();
    if(!color)  { return; }
    wikibarColorTool.displayColorPicker(false);
    if(wikibarColorTool.pickColorHandler){
      wikibarColorTool.pickColorHandler(color, wikibarColorTool.userData);
    }
	return(false);
};
wikibarColorTool.onMouseOver = function(e){
	if (!e){ e = window.event; }
	var theButton = resolveTarget(e);
	if(!theButton){ return(false);  }
  	if(!wikibarColorTool)  { return; }
    color = theButton.bgColor.toUpperCase();
    if(!color)  { return; }
    td=document.getElementById('colorPickerInfo');
  	if(!td) { return; }
  	td.bgColor = color;
  	td.innerHTML = '<span style=\"color:#000;\">'+color+'</span>&nbsp;&nbsp;&nbsp;' +
  	               '<span style=\"color:#fff;\">'+color+'</span>';
	e.cancelBubble = true;
	if (e.stopPropagation){ e.stopPropagation(); }
	return(false);
};
wikibarColorTool.openColorPicker = function(theTarget, pickColorHandler, userData){
  wikibarColorTool.skipClickDocumentEvent = true;
  wikibarColorTool.pickColorHandler = pickColorHandler;
  wikibarColorTool.userData = userData;
  wikibarColorTool.moveColorPicker(theTarget);
};
wikibarColorTool.convert3to6HexColor = function(c){
  c=c.trim();
  var rx=/^\#(\d|[a-f])(\d|[a-f])(\d|[a-f])$/gi;
  return (rx.test(c)? c.replace(rx, '#$1$1$2$2$3$3') : c);
};
wikibarColorTool.numToHexColor = function (n){
  if(typeof(n)=='number' && (n>=0 && n<=255)) {
  		s = n.toString(16).toLowerCase();
  		return ((s.length==1)? '0'+s : s);
  }else{
	 return null;
	}
};
wikibarColorTool.renderColorPalette = function(){
	if(wikibarColorTool.paletteName==wikibarColorTool.defaultPaletteName){
		wikibarColorTool.palette=wikibarColorTool.defaultPalette;
		wikibarColorTool.columns=wikibarColorTool.defaultColumns;
		return;
	}
	tiddlerText = (store.getTiddlerText(wikibarColorTool.paletteName, '')).trim();
	if(tiddlerText.length<=0) { return; }
	var cpContents = tiddlerText.split('\n');
	var colors=[];
	columns = wikibarColorTool.defaultColumns;
	var tmpArray=null;
	errCount=0;
	for(var i=0; i<cpContents.length; i++){
		cpLine=cpContents[i].trim();
    if( (!cpLine) || (cpLine.length<=0) || (cpLine.charAt(0) == '#') ){ continue; }
		if(cpLine.substring(0,8).toLowerCase()=='columns:'){
			tmpArray = cpLine.split(':');
			try{
				columns = parseInt(tmpArray[1],10);
			}catch(ex){
				columns = wikibarColorTool.defaultColumns;
			}
		}else{
			tmpArray = cpLine.replace('\t', ' ').split(/[ ]{1,}/);
			try{
				color='';
				for(var j=0; j<3; j++){
          c=parseInt(tmpArray[j].trim(), 10);
          if(isNaN(c)){
						break;
          }else{
						c=wikibarColorTool.numToHexColor(c);
						if(!c) {break;}
            color+=c;
					}
				}
				if(color.length==6){
					colors.push('#'+color);
				}	else {
					throw 'error';
				}
			}catch(ex){
			}
		}
	}
	if(colors.length>0){
		wikibarColorTool.palette = colors;
		wikibarColorTool.columns = columns;
	}else{
		throw 'renderColorPalette(): No color defined in the palette.';
	}
};
wikibarColorTool.displayColorPicker = function(visible){
  if(wikibarColorTool.colorPicker){
    wikibarColorTool.colorPicker.style.display = (visible? 'block' : 'none');
  }
};
wikibarColorTool.moveColorPicker = function(theTarget){
  if(!wikibarColorTool.colorPicker){
  	wikibarColorTool.createColorPicker();
  }
	var cp = wikibarColorTool.colorPicker;
	var rootLeft = findPosX(theTarget);
  var rootTop = findPosY(theTarget);
  var popupLeft = rootLeft;
  var popupTop = rootTop;
  var popupWidth = cp.offsetWidth;
  var winWidth = findWindowWidth();
  if(popupLeft + popupWidth > winWidth){
	  popupLeft = winWidth - popupWidth;
	}
  cp.style.left = popupLeft + 'px';
  cp.style.top = popupTop + 'px';
  wikibarColorTool.displayColorPicker(true);
};
wikibarColorTool.createColorPicker = function(unused, palette){
  if(palette){	wikibarColorTool.paletteName=palette; }
	wikibarColorTool.renderColorPalette();
	wikibarColorTool.colorPicker = document.createElement('div');
	wikibarColorTool.colorPicker.id = 'colorPicker';
	document.body.appendChild(wikibarColorTool.colorPicker);
  var theTable = document.createElement('table');
  wikibarColorTool.colorPicker.appendChild(theTable);
  var theTR = document.createElement('tr');
	theTable.appendChild(theTR);
	var theTD = document.createElement('td');
	theTD.className = 'header';
	theTD.colSpan = wikibarColorTool.columns;
	theTD.innerHTML = wikibarColorTool.paletteName;
  theTR.appendChild(theTD);
  for(var i=0; i<wikibarColorTool.palette.length; i++){
    if((i%wikibarColorTool.columns)===0){
      theTR = document.createElement('tr');
      theTable.appendChild(theTR);
    }
    theTD = document.createElement('td');
    theTD.className = 'cell';
    theTD.bgColor = wikibarColorTool.convert3to6HexColor(wikibarColorTool.palette[i]);
    theTD.onclick = wikibarColorTool.onPickColor;
    theTD.onmouseover = wikibarColorTool.onMouseOver;
    theTR.appendChild(theTD);
  }
  rest = wikibarColorTool.palette.length % wikibarColorTool.columns;
  if(rest>0){
    theTD = document.createElement('td');
		theTD.colSpan = wikibarColorTool.columns-rest;
    theTD.bgColor = '#000000';
    theTR.appendChild(theTD);
  }
  theTR = document.createElement('tr');
	theTable.appendChild(theTR);
	theTD = document.createElement('td');
	theTD.colSpan = wikibarColorTool.columns;
	theTD.id = 'colorPickerInfo';
  theTR.appendChild(theTD);
};
wikibarColorTool.onDocumentClick = function(e){
	if (!e){ e = window.event; }
	if(wikibarColorTool.skipClickDocumentEvent) {
	  wikibarColorTool.skipClickDocumentEvent = false;
    return true;
	}
	if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
    wikibarColorTool.displayColorPicker(false);
  }
	return true;
};
function wikibar_doSelectPalette(param){
	clearMessage();
	var theButton = param.button;
	if(!theButton.toolItem.key)  { return; }
	var palette = theButton.toolItem.key;
	var oldPaletteName = wikibarColorTool.paletteName;
	if(oldPaletteName != palette){
		try{
			wikibarColorTool.createColorPicker(theButton, palette);
			displayMessage('Palette \"'+palette+'\" ('+ wikibarColorTool.palette.length +' colors) is selected');
		}catch(ex){
			errMsg = ex;
			if(errMsg.substring(0,18)=='renderColorPalette'){
				displayMessage('Invalid palette \"' + palette + '\", please check it out!');
				wikibarColorTool.createColorPicker(theButton, oldPaletteName);
			}
		}
	}
}
var wikibarPopup = {
  skipClickDocumentEvent: false,
	stack: []
};
wikibarPopup.resolveRootPopup = function(o){
  if(o.isOnMainMenu){  return null; }
  if(o.className.substring(0,12)=='wikibarPopup'){  return o;}
  return wikibarPopup.resolveRootPopup(o.parentNode);
};
wikibarPopup.create = function(root){
  for(var i=0; i<wikibarPopup.stack.length; i++){
    var p=wikibarPopup.stack[i];
    if(p.root==root){
      wikibarPopup.removeFrom(i+1);
      return null;
    }
  }
  var rootPopup = wikibarPopup.resolveRootPopup(root);
  if(!rootPopup){
    wikibarPopup.remove();
  }else{
    wikibarPopup.removeFromRootPopup(rootPopup);
  }
	var popup = createTiddlyElement(document.body,'div','wikibarPopup'+root.toolItem.key,'wikibarPopup');
	var pop = createTiddlyElement(popup,'table','','');
	wikibarPopup.stack.push({rootPopup: rootPopup, root: root, popup: popup});
	return pop;
};
wikibarPopup.show = function(unused,slowly){
	var curr = wikibarPopup.stack[wikibarPopup.stack.length-1];
	var overlayWidth = 1;
  var rootLeft, rootTop, rootWidth, rootHeight, popupLeft, popupTop, popupWidth;
  if(curr.rootPopup){
  	rootLeft = findPosX(curr.rootPopup);
  	rootTop = findPosY(curr.root);
  	rootWidth = curr.rootPopup.offsetWidth;
  	popupLeft = rootLeft + rootWidth - overlayWidth;
  	popupTop = rootTop;
  }else{
  	rootLeft = findPosX(curr.root);
  	rootTop = findPosY(curr.root);
  	rootHeight = curr.root.offsetHeight;
  	popupLeft = rootLeft;
  	popupTop = rootTop + rootHeight;
  }
	var winWidth = findWindowWidth();
	popupWidth = curr.popup.offsetWidth;
	if(popupLeft + popupWidth > winWidth){
		popupLeft = rootLeft - popupWidth + overlayWidth;
	}
	curr.popup.style.left = popupLeft + 'px';
	curr.popup.style.top = popupTop + 'px';
	curr.popup.style.display = 'block';
	addClass(curr.root, 'highlight');
	if(config.options.chkAnimate){
		anim.startAnimating(new Scroller(curr.popup,slowly));
	}else{
		window.scrollTo(0,ensureVisible(curr.popup));
	}
};
wikibarPopup.remove = function(){
	if(wikibarPopup.stack.length > 0){
		wikibarPopup.removeFrom(0);
  }
};
wikibarPopup.removeFrom = function(from){
	for(var t=wikibarPopup.stack.length-1; t>=from; t--){
		var p = wikibarPopup.stack[t];
		removeClass(p.root,'highlight');
		p.popup.parentNode.removeChild(p.popup);
  }
	wikibarPopup.stack = wikibarPopup.stack.slice(0,from);
};
wikibarPopup.removeFromRootPopup = function(from){
  for(var t=0; t<wikibarPopup.stack.length; t++){
    var p = wikibarPopup.stack[t];
    if(p.rootPopup==from){
      wikibarPopup.removeFrom(t);
      break;
    }
  }
};
wikibarPopup.onDocumentClick = function(e){
	if (!e){ e = window.event; }
	if(wikibarPopup.skipClickDocumentEvent){
	 wikibarPopup.skipClickDocumentEvent=false;
	 return true;
	}
	if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
		wikibarPopup.remove();
	}
	return true;
};
var wikibarStore = {
  TYPE: 'MAIN_MENU',
  help:{
    TYPE:'MENU',
    CAPTION: '<font face=\"verdana\">?</font>',
    TOOLTIP:     'about WikiBar',
    options:{
      TYPE:'MENU',
      DYNAITEM: wikibar_genWikibarOptions
    },
    about:{
      TYPE:'MENU',
      DYNAITEM: wikibar_genWikibarAbout
    }
  },
  preview:{
    TOOLTIP:     'preview this tiddler',
    CAPTION: '<font face=\"verdana\">&infin;</font>',
    HANDLER: wikibar_doPreview
  },
	line:{
		TOOLTIP:    'horizontal line',
		CAPTION: '<font face=\"verdana\">&mdash;</font>',
		syntax: '\n----\n',
		HANDLER: wikibar_editFormatByCursor
	},
	crlf:{
		TOOLTIP:    'new line',
		CAPTION: '<font face=\"verdana\">&para;</font>',
		syntax: '\n',
		HANDLER: wikibar_editFormatByCursor
	},
	selectAll:{
		TOOLTIP:    'select all',
		CAPTION: '<font face=\"verdana\">&sect;</font>',
		HANDLER: wikibar_editSelectAll
	},
	deleteSelected:{
		TOOLTIP:    'delete selected',
		CAPTION: '<font face=\"verdana\">&times;</font>',
		syntax: '',
		HANDLER: wikibar_editFormat
	},
  textFormat:{
    TYPE: 'MENU',
    CAPTION: 'text',
    TOOLTIP: 'text formatters',
    ignore:{
			TOOLTIP:     'ignore wiki word',
			CAPTION: 'ignore wikiWord',
			syntax:  '~user_text',
			hint:    'wiki_word',
			HANDLER:    wikibar_editFormatByWord
		},
		bolder:{
			TOOLTIP:     'bolder text',
			CAPTION: '<strong>bolder</strong>',
			syntax:  "''user_text''",
			hint:		 'bold_text',
			HANDLER:    wikibar_editFormatByWord
		},
		italic:{
			TOOLTIP:    'italic text',
			CAPTION: '<em>italic</em>',
			syntax: '\/\/user_text\/\/',
			hint:		'italic_text',
			HANDLER: wikibar_editFormatByWord
		},
		underline:{
			TOOLTIP:    'underline text',
			CAPTION: '<u>underline</u>',
			syntax: '__user_text__',
			hint:		'underline_text',
			HANDLER: wikibar_editFormatByWord
		},
		strikethrough:{
			TOOLTIP:    'strikethrough text',
			CAPTION: '<strike>strikethrough</strike>',
			syntax: '==user_text==',
			hint:		'strikethrough_text',
			HANDLER: wikibar_editFormatByWord
		},
		superscript:{
			TOOLTIP:    'superscript text',
			CAPTION: 'X<sup>superscript</sup>',
			syntax: '^^user_text^^',
			hint:		'superscript_text',
			HANDLER: wikibar_editFormatByWord
		},
		subscript:{
			TOOLTIP:    'subscript text',
			CAPTION: 'X<sub>subscript</sub>',
			syntax: '~~user_text~~',
			hint:		'subscript_text',
			HANDLER: wikibar_editFormatByWord
		},
		comment:{
			TOOLTIP:    'comment text',
			CAPTION: 'comment text',
			syntax: '/%user_text%/',
			hint:		'comment_text',
			HANDLER: wikibar_editFormatByWord
		},
		monospaced:{
			TOOLTIP:    'monospaced text',
			CAPTION: '<code>monospaced</code>',
			syntax: '{{{user_text}}}',
			hint:		'monospaced_text',
			HANDLER: wikibar_editFormatByWord
		}
  },
  paragraph:{
    TYPE: 'MENU',
    TOOLTIP: 'paragarph formatters',
    list:{
      TYPE: 'MENU',
      TOOLTIP: 'list tools',
      bullet:{
  			TOOLTIP:    'bullet point',
  			syntax: '*user_text',
  			hint:		'bullet_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		numbered:{
  			TOOLTIP:    'numbered list',
  			syntax: '#user_text',
  			hint:		'numbered_text',
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    heading:{
      TYPE: 'MENU',
      heading1:{
  		  CAPTION:'<h1>Heading 1</h1>',
  			TOOLTIP:    'Heading 1',
  			syntax: '!user_text',
  			hint:		'heading_1',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading2:{
  		  CAPTION:'<h2>Heading 2<h2>',
  			TOOLTIP:    'Heading 2',
  			syntax: '!!user_text',
  			hint:		'heading_2',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading3:{
  		  CAPTION:'<h3>Heading 3</h3>',
  			TOOLTIP:    'Heading 3',
  			syntax: '!!!user_text',
  			hint:		'heading_3',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading4:{
  		  CAPTION:'<h4>Heading 4</h4>',
  			TOOLTIP:    'Heading 4',
  			syntax: '!!!!user_text',
  			hint:		'heading_4',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading5:{
  		  CAPTION:'<h5>Heading 5</h5>',
  			TOOLTIP:    'Heading 5',
  			syntax: '!!!!!user_text',
  			hint:		'heading_5',
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    comment:{
      TYPE: 'MENU',
      commentByLine:{
  			CAPTION:'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '/%user_text%/',
  			hint:		'comment_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION:'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '/%\nuser_text\n%/',
  			hint:		'comment_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    monospaced:{
      TYPE: 'MENU',
  		monosByLine:{
  			CAPTION: 	'monospaced by line',
  			TOOLTIP:    'line monospaced',
  			syntax: '{{{\nuser_text\n}}}',
  			hint:		'monospaced_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		monosByBlock:{
  			CAPTION: 	'monospaced by block',
  			TOOLTIP:    'block monospaced',
  			syntax: '{{{\nuser_text\n}}}',
  			hint:		'monospaced_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    quote:{
      TYPE: 'MENU',
  		quoteByLine:{
  			CAPTION: 	'quote by line',
  			TOOLTIP:    'line quote',
  			syntax: '>user_text',
  			hint:		'quote_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		quoteByBlcok:{
  			CAPTION: 	'quote by block',
  			TOOLTIP:    'block quote',
  			syntax: '<<<\nuser_text\n<<<',
  			hint:		'quote_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    plugin:{
      TYPE: 'MENU',
      code:{
  			CAPTION: 	'code area',
  			TOOLTIP:    'block monospaced for plugin',
  			syntax: '\n\/\/{{{\nuser_text\n\/\/}}}\n',
  			hint:		'monospaced_plugin_code',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByLine:{
  			CAPTION: 	'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '\/\/user_text',
  			hint:		'plugin_comment',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION: 	'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '\/\***\nuser_text\n***\/',
  			hint:		'plugin_comment',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    css:{
      TYPE: 'MENU',
      code:{
  			CAPTION: 	'code area',
  			TOOLTIP:    'block monospaced for css',
  			syntax: '\n\nuser_text\n\n',
  			hint:		'monospaced_css_code',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByLine:{
  			CAPTION: 	'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '',
  			hint:		'css_comment',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION: 	'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '',
  			hint:		'css_comment',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    }
  },
  color:{
    TYPE: 'MENU',
    TOOLTIP: 'color tools',
    highlight:{
		  CAPTION:'highlight text',
			TOOLTIP:    'highlight text',
			syntax: '@@user_text@@',
			hint:		'highlight_text',
			HANDLER: wikibar_editFormatByWord
		},
		color:{
		  CAPTION:'text color',
			TOOLTIP:    'text color',
			hint:		'your_text',
			syntax: '@@color(%1):user_text@@',
			HANDLER:   wikibar_getColorCode,
			doMore: wikibar_editFormatByWord
		},
		bgcolor:{
		  CAPTION:'background color',
			TOOLTIP:    'background color',
			hint:		'your_text',
			syntax: '@@bgcolor(%1):user_text@@',
			HANDLER: wikibar_getColorCode,
			doMore: wikibar_editFormatByWord
		},
		colorcode:{
      CAPTION:'color code',
      TOOLTIP:    'insert color code',
      syntax: '%1',
      HANDLER: wikibar_getColorCode,
      doMore: wikibar_editFormatByCursor
    },
    'color palette':{
      TYPE:'MENU',
      DYNAITEM: wikibar_genPaletteSelector,
  		SEPERATOR:{},
  		morePalette:{
  		  CAPTION:'more palettes',
  		  TOOLTIP:'get more palettes',
  		  HANDLER: wikibar_getMorePalette
  		}
    }
  },
  link:{
    TYPE: 'MENU',
    TOOLTIP: 'insert link',
    wiki:{
		  CAPTION:'wiki link',
			TOOLTIP:    'wiki link',
			syntax: '[[user_text]]',
			hint:		'wiki_word',
			HANDLER: wikibar_editFormatByWord
		},
		pretty:{
			CAPTION: 	'pretty link',
			TOOLTIP:    'pretty link',
			syntax: '[[user_text|%1]]',
			hint:		'pretty_word',
			param:	'PrettyLink Target',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		},
		url:{
			TOOLTIP:    'url link',
			syntax: '[[user_text|%1]]',
			hint:		'your_text',
			param:	'http:\/\/...',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		},
		image:{
			TOOLTIP:    'image link',
			syntax: '[img[user_text|%1]]',
			hint:		'alt_text',
			param:	'image/icon.jpg',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		}
  },
  macro:{},
  more:{
    TYPE: 'MENU',
    TOOLTIP: 'more tools',
    table:{
      TYPE: 'MENU',
      TOOLTIP: 'table',
      table:{
  		  CAPTION:'create table',
  			TOOLTIP:    'create a new table',
  			syntax: '\n%1\n',
  			HANDLER: wikibar_getTableRowCol,
  			doMore: wikibar_editFormatByWord
  		},
  		header:{
  			TOOLTIP:    'table header text',
  			syntax: '|user_text|c',
  			hint:		'table_header',
  			HANDLER: wikibar_editFormatByWord
  		},
  		cell:{
  			TOOLTIP:    'create a tabel cell',
  			syntax: '|user_text|',
  			hint:		'your_text',
  			HANDLER: wikibar_editFormatByWord
  		},
  		columnHeader:{
  		  CAPTION:'column header',
  			TOOLTIP:    'create a column header cell',
  			syntax: '|!user_text|',
  			hint:		'column_header',
  			HANDLER: wikibar_editFormatByWord
  		},
  	  cell:{
  	    TYPE: 'MENU',
        CAPTION: 'cell options',
    		bgcolor:{
    			CAPTION: 	'background color',
    			TOOLTIP:    'cell bgcolor',
    			syntax: '|bgcolor(%1):user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_getColorCode,
    			doMore: wikibar_editFormatByTableCell
    		},
    		alignLeft:{
    			CAPTION: 	'align left',
    			TOOLTIP:    'left align cell text',
    			syntax: '|user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		},
    		alignCenter:{
    			CAPTION: 	'align center',
    			TOOLTIP:    'center align cell text',
    			syntax: '| user_text |',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		},
    		alignRight:{
    			CAPTION: 	'align right',
    			TOOLTIP:    'right align cell text',
    			syntax: '| user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		}
    	}
    },
    html:{
      TYPE: 'MENU',
      html:{
  			CAPTION: 	'&lt;html&gt;',
  			TOOLTIP:    'html tag',
  			syntax: '<html>\nuser_text\n</html>',
  			hint:		'html_content',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    }
  },
  addon:{
    TYPE: 'MENU',
    TOOLTIP:'3rd party tools',
    'about addons':{
      TOOLTIP: 'list loaded addons',
      HANDLER: wikibar_doListAddons
    },
    SEPERATOR:{}
  }
};
addEvent(document, 'click', wikibarColorTool.onDocumentClick);
addEvent(document, 'click', wikibarPopup.onDocumentClick);
wikibar_install();
//}}}
It should be said, for the record, that my loan was paid off in November, and that I have been approved for a house in Taringa. 

yes, I will finally be living by myself. 

3 bedroom place, and it needs a name...
herein are my collected blog and blog-like writings from 2009.

added to when I remember...

As I'm getting older, I'm learning better to go with my thoughts and instincts instead of pandering to the ideas of other. That is, I am learning to put myself first sometimes. 

But is it making me a jerk? Am I going too far so as to ignore genuine concerns and differing points of view?
Some movies are remakes of others. Or sequels. Or spoofs. Spinoffs. Sometimes they can be unrelated except for a common character, thus linking them to be in the same "universe"...

These links could be considered the "family tree" of a movie, as it were. 

For example, Airplane! 2 was sequel to Airplaine!, which in turn was a remake/spoof of Zero Hour! ...whilst Zero Hour! was a movie remake of a teleplay, [[Flight into Danger|http://en.wikipedia.org/wiki/Flight_into_Danger]]. The play was novelised, which in turn was then dramatized into a movie-of-the-week. 

wow. 

Xanadu has an even more convoluted tree. 

Any others? (I'm mainly aiming for movies that are very well known, and have obscure or strange geneology. Less interested in the followons from well known movies (eg: bad turkish remakes, etc)

* Could this become an XKCD-style comic? (just one mind you)
named from 'Little Nemo in Slumberland'. This is the name of Nemo's residence from 14th April, 2010 to May 2012. (there was several weeks overlap with [[Slumberland Blackstone]]). Lease ended on 4th June. 

The name was long-planned as to be the name of the first place he lived by himself, and though at the last moment there was some deliberation as to whether to keep the name in reserve for later, it finally won through. 

Thus, Taringa is the first Slumberland.

It was a place of bush turkeys, and tree pumpkins. 

Slumberland was in Taringa, south-west Brisbane - 2010 - 2012
The places I have lived... 

!! Canberra
Originally born in Canberra and then raised over the border with parents in Queanbeyan. Then in early 1995 I moved out - into a group house in Latham which lasted an impressive 6 weeks! When that ended suddenly, I moved just up the street (via a fortnight in QBN again) to board in a house for two years. Since then...
* <<slider chkNethouse "Nethouse" "Nethouse: March 1997 - January 1999" "Nethouse">>
* <<slider chkNethouse2 "Nethouse 2" "Nethouse 2: January 1999 - September 2001" "Nethouse 2">>
* <<slider chkCheekyHouse "Cheeky House" "Cheeky House: September 2001 - August 2002" "Cheeky House">>
* <<slider chkThePorch "The Porch" "Nuthouse / The Porch: August 2002 - September 2004" "nuthouse / The Porch">>
* <<slider chkCampbellHouse "Campbell House" "Campbell House: November 2004 - August 2007" "Campbell House">>
* <<slider chkThePharmacy "The Pharmacy" "The Pharmacy: August 2007 - May 2009" "The Pharmacy">>
!!Brisbane
In May 2009, I moved to The Bane. Brisvegas. Brisneyland. BRISBANE!
* <<slider chkIOZoo "The IO Zoo" "The Inside Out Zoo: May 2009 - April 2010" "The Inside Out Zoo">>
* <<slider chkSlumberlandTaringa "Slumberland Taringa" "Slumberland Taringa: April 2010 - April 2012" "Slumberland Taringa">>
* <<slider chkSlumberlandBlackstone "Slumberland Blackstone" "Slumberland Blackstone: April 2012 - current" "Slumberland Blackstone">>

!! Future Plans
See SlumberWiki
Nemo and Terri moved out of [[Nethouse 2]] to here; a townhouse in Page.

So named because it was inclear if the 'ch' should be pronounced hard or soft in 'Dallachy' (the street name) 
In an all in a new location (Florey), Nethouse 2 was populated by the original [[Nethouse]] carry-over champions, plus newcomer "Puppy".

A location rife with history, rumour has it that the residence had once housed part of the then-new Canberra Raiders football team, and had, prior to us, been an illegal brothel... 

It was also known by a range of monikers... 
* Net Mansion
* The Mansion
* The Coke House
* House of Coke
* The Palace (graffiti left by "the girls" - previous tenants/workers in the house)

> This place I live, its a bit of a dive
> I really don't know how I survive
> With a geek, a frat boy, an actor and a bloke
> And two others and a fridge full of coke.
> Its not so bad if you don't mind the mess
> And the coke and the computers and the people I guess ...
> So see you later house of Net, I don't think I'm ever gonna forget... 
{{credit{
Terri - Talkin' Canberra, 2001
}}}

After many changes of residents over the years (including Gary, Jacq, Rick, "Gumby", Matt, Doug, Terri, Steve, Zeb and Brendan), It ended with fire in December 2001. 

> ...and the white house burnt, and everything that was in it... 
{{credit{
Three Dead Trolls
}}}

See also the [[archived Nethouse/netmansion website|http://web.archive.org/web/20051217201824/http://www.net.house.cx/]], with inmate version log and eulogy to the mansion.
This was where Nemo and Terri moved to after our lease was not renewed on [[Cheeky House]] in August 2002.

A four bedroom house in suburban Page, Terri and I were joined by Jacq (formerly a housemate at [[Nethouse 2]], and we called the place the "nuthouse". When Jacq moved out sometime early/mid 2003, we renamed it to 'The Porch'.
A large and varied group in the suburb of Campbell, grouped since 2002?

As of early 2009, still running.

This house has also been nicknamed "the murder house" due to a grisly (pre-grouphouse) past.

I lived here for almost three years: 2004 through 2007, through a succession of housemates...
No, it wasn't a downer at all. (haha, location pun ...oh, never mind). This is another long-term group house with origins lost in the midst of lease paperwork...
config.commands.revisions.callback = function(context,userParams)
// The revisions are returned as tiddlers in the context.revisions array
{
	var revisions = context.revisions;
	popup = Popup.create(userParams.src);
	Popup.show(popup,false);
	if(revisions.length==0) {
		createTiddlyText(createTiddlyElement(popup,'li',null,'disabled'),config.commands.revisions.popupNone);
	} else {
		revisions.sort(function(a,b) {return a.modified < b.modified ? +1 : -1;});
		for(var i=0; i<revisions.length; i++) {
			var tiddler = revisions[i];
			var modified = tiddler.modified.formatString(context.dateFormat||config.commands.revisions.dateFormat);
			var revision = tiddler.fields['server.page.revision'];
			var summary = tiddler.fields['editsummary'];
			var btn = createTiddlyButton(createTiddlyElement(popup,'li'),
			config.commands.revisions.revisionTemplate.format([modified,revision,tiddler.modifier+' :: '+summary]), tiddler.text||config.commands.revisions.revisionTooltip, function() {
						config.commands.revisions.getTiddlerRevision(this.getAttribute('tiddlerTitle'),this.getAttribute('tiddlerModified'),this.getAttribute('tiddlerRevision'),this.getAttribute('tiddlerSummary'),this);
						return false;
						},
					'tiddlyLinkExisting tiddlyLink');
			btn.setAttribute('tiddlerSummary', summary);
			btn.setAttribute('tiddlerTitle',userParams.tiddler.title);
			btn.setAttribute('tiddlerRevision',revision);
			btn.setAttribute('tiddlerModified',tiddler.modified.convertToYYYYMMDDHHMM());
			if(userParams.tiddler.fields['server.page.revision'] == revision || (!userParams.tiddler.fields['server.page.revision'] && i==0))
				btn.className = 'revisionCurrent';
		}
	}
};
Random reminder of my own update... 

The house is good - been there some 6 weeks... 

Noticing my own habits... I'm very good at rinsing pots and pans after cooking, and plates after eating. Less good (though not actually BAD) with catching up with the washing up, but at least the stuff not caught up aint grimey. 

The house got called 'Slumberland' afterall. The name I'd long planned for my first house alone. 
<<<
So you were born in an electrical storm,
Took a bite out the sun
And saw your future in a machine built for two
Now your rays make me kind of go crazy,
Shock and awe and amaze me,
Just a ticker tape parade and me,
But something was wrong 'til you tap danced on the air, in the night.

Screaming at the top of your lungs, you said,
"Come on, come on, come on.
Do what you want.
What could go wrong?
Oh, come on, come on, come on, come on,
Do what you want.
Oh come on, come on.
What could go wrong?
Do do do do what you want."

Come on.

Me, I was raised amid the trickle-down days.
I woke up numb in the haze
And saw my future in a machine built for two,
But the light gave me some kind of fright.
How did wrong get so right
And lead me stumbling through the dark of night?
Oh, something was wrong,
But you tap danced on the air, in the night,
Screaming at the top of your lungs you said,
"Come on, come on.
Do what you want.
What could go wrong?
Come on, come on, come on, come on, do what you want.
Oh, come on, come on.
What could go wrong?
Do do do do what you want."

Come on. 
<<<
----
{{credit{
OK Go / Oh no / 1996
3min 05
}}}
test tiddler
Tiddlers tagged 'private' do not get loaded if you are not logged in

If you are logged in as a user, I do not know if you get all private tiddles, or just the ones your user created...?
2010 is like the FUTURRRRRRRRE... with poetry!
{{{
I must admit
I think i am
i... addicted
to my
iDevice of non-specific manufacturer
}}}
----
{{credit{
13 July 2010
First published to BadPoetryOfTheDay on the 13 July 2010, under the subject '//iGeek//'
}}}
{{{

You don't talk about it. 
That's because there is nothing to be said.
It's all in the actions. 

Look. That way

I glance left, looking, and then she pounces.
From the left. Where I wasn't expecting.
Damn.
Walked right into that one as it strikes me a one two double blow. 

I'm left to speak only in vowels. aeiiiou?!
I mean, ouch.

This isn't the civilised combat of boxing. This is harsher. Rawer. 
Just like Fight Club, we're competing on cardboard. 
After a brief exchange, she's there again. This time striking down.
Count it out for the exits. 

One, two, three, four. X on a double letter is sixteen, that makes 20.
And on a triple word too. That scores 60.

I wince again, and look down at my tiles. 
They seem to say GIVE_UP
}}}
{{small{
# The first rule of Scrabble Club is, you do not talk about Scrabble Club
# The second rule of Scrabble Club is, you DO NOT talk about Scrabble Club.
# If everyone passes twice, the game is over.
# Seven tiles to a rack guys.
# One player at the bag at a time
# Any word goes - but no proper names
# Each special square only counts the turn it's used
# Empty a full rack of seven, 50 bonus points.
# Even if this isn't your first night at Scrabble Club, you still HAVE to spell right.
}}}
----
{{credit{
1 July 2010
First published to the BadPoetryOfTheDay list on 1 July 2010, under the subject '//Bad Poetry Club//'
}}}
Without consideration to the earlier posted question, the short version of the answer did occur to me the other day. 

That it's important to care about others, but not care about what others think.

Can everything be extrapolated from that simple summary?
Astrology is all about charting the course of your personality and life based on the alignment of stars and planets at the time of your conception/birth, or somesuch nonsense. right?

Anyhow, I'm extending that to the idea of it being based on the alignment of all kinds of "things". Can they be found such as to fit my observed personality?

So, without further ado... 

The core of my personal astrology is:
* Conceived in Hawaii
* Due on April Fools Day
* Born two weeks late.
From these three factors alone, much about me can be deduced. However, there is more. 

!! TV
I was born under the sign of the [[Eurovision Raving Looney Contest|http://en.wikipedia.org/wiki/Fleet_Street_Goodies]] (the alternate title also amuses me, but I wont tell you how relevant THAT is! ;) 
This was only 3 weeks after a gentleman died whilst watching The Goodies. They were in their prime! Alternatively, I was born on the cusp of the [[Daleks|http://en.wikipedia.org/wiki/Genesis_of_the_Daleks]] and [[Cybermen|http://en.wikipedia.org/wiki/Revenge_of_the_Cybermen]]. 

!! Movies
On the day I was born, [[Fredric March|http://en.wikipedia.org/wiki/Fredric_March]] died. He was an Oscar winning actor, and avoided being typecast by resisting long-term studio contracts. Good work Fredric!

!! Music
(to note: none of these musics are really "me", in as far as I don't know what they are beyond names, offhand!)
* #1 on the Australian Charts was [[The Newcastle Song|http://en.wikipedia.org/wiki/The_Newcastle_Song]]
* #1 on the USA (Billboard) carts was [[Philadelphia Freedom|http://en.wikipedia.org/wiki/Philadelphia_Freedom_%28song%29]]
* #1 on the UK charts was the Bay City Roller's cover of [[Bye, Bye, Baby (Baby Goodbye)|http://en.wikipedia.org/wiki/Bye,_Bye,_Baby_%28Baby_Goodbye%29]]

!!Software
Am I stretching it a bit to observe that Microsoft is merely 10 days older than me? I am a computer geek, but no fan of Gates' Corp. 

!!Magazines
* National Geographic had articles about Salt Lake Valley, and Sharks. 
* MAD Magazine covered 'Death Wish'
These are nearly the ultimate hot snack food. You can think of them as a kind of proto-Pizza

They're toasted/grilled/broiled open sandwhiches arranged like:

* Salt and LemonPepper
* Cheese
* Onion
* Tomato
* Bread, lightly pre-toasted

Grill untill the cheese is lightly melted, and the Salt and Lemon Pepper has bonded to the cheese. The cheese should not brown.

Some alternative to the preperation

* Salt after the tomato layer, rather than the cheese layer
* Mustard on the bread layer, no lemon pepper
* ham for non-vegetarians! Vegan cheese for vegans :) 

From these developed the smaller, untoasted, easier-to-make cheesy nibbly things known as CheesyCrunchyThings
{{{
Another empty notebook
To slowly fill
With words
  Pictures
  Ideas & rhymes
  Sketches & collaboration
To fill with my brain

Another full notebook
Evidence I am alive
Sitting on the shelf
Awaiting rediscovery

Awaiting rediscovery
Sitting on the shelf
Is the evidence that I am alive

Another full notebook
Filled from my brain
  Sketches & collaborations
  Ideas & rhymes
  Pictures... with words

I am ready to fill
Another empty notebook
}}}
----
{{credit{
4 Oct 2010
First published to the BadPoetryOfTheDay list on 2 Dec 2010, under the subject 'Stories from the shelf'
}}}
{{{
I wont apologise for the choices I've made
But neither can I blame you for wishing they were different
}}}
----
{{credit{
25 Nov 2010
Submitted to the BadPoetryOfTheDay list on 2 December
This poem is also tagged as 'nemo' since it's effectively a journal entry of sorts... or a letter to the future...
}}}
An idea I had to theme each month around a different social theme or event
* January: New year
* February: Chinese New Year (sometimes is late January)
* March: Easter (sometimes easter is in April though)
* April: My birthday
* May: Eurovision
* June:
* July: N's Birthday
* August:
* September:
* October: Ig Nobel prizes
* November: Novemberfest
* December: Christmas
I have a loose and vague - and before now, barely defined - collection of works (mostly fictional), which I consider to be my personal scriptures. 

They are things I've read, or seen, which have moved me. Have become important to me. They are almost all fictional, and should be seen as allegorical to my philosophies only. 

This is a vague list of those works. 

* Winter's Tale - Mark Helprin
* Unicorn Jelly - Jennifer Diane Reitz
* The Hitch-hiker's Guide to the Galaxy - Douglas Adams
* Last Chance to See - Douglas Adams
* What Dreams May Come - directed by ???
* Minus comic strip number ???
* Salt (documentary)
some ideas...

* Zombies ("28 hours later" :)
* Dudes (4 movies: Bill and Teds and Waynes Worlds)
* MST3k (the stuff from that Public Domain Movies site I found a while back)
* Destroy New York (ID4/godzilla/deep impact/day after tomorrow/2012(?)/etc :)
* Coen Brothers
This list inspired by Kelly, who delights in pointing out the things about which [[Nemo]] is a snob...

* Wallets - I make my own
* Mint - fake mint is bad. 
* Apricots - I grew up with Apricot trees...

* Keyboards - In fact, I'm not really, but I do have an ideal: http://wiki.thorx.net/wiki/Keyboard_Snob
!! Nemo has a timecapsule...

In fact, when I was 12 I created a small one. A simple envelope with a photo, handwritten list of things I liked and friends... It was set to be opened a massive 18 years later! In the far-off time (from the perspective of 1987) of 2005!

Come 2005, and opened it was - for my 30th birthday. (TODO: find the abc news article about it! :) But better than that, a new capsule was created. Larger, and with contributions from many friends. This has a window of 12 years - to honour the original, but also so it can be opened when I'm 42! :)

In 2008 I added a second "layer". Mainly because after it was sealed in 2005 I subsequently got a late arrival (photos of the 2005 party, mainly (I think)). So I solicited letters from friends... nothing big, just enough to go in a manila folder beside the original. It was finally sealed in in June 2009. 

I'm subsequently toying with the idea of a rolling update... a proposed timeline is below. Note that each time a capsule is opened and a new one created, the old capsule should be included within!

!! Timeline
* 1987 - age 12
** Sealed capsule for 18 year duration (2005)
* 2005 - age 30
** Opened 1987, created new (and included 1987s inside) for 12 year duration (2017)
* 2008 - age 33
** New layer to 2005s. 9 year duration (2017)

!! Future plans
* 2017 - age 42
** Planned opening of 2005/2008 layers. Entire capsule is open. Create new layer for 12 year duration (2029)
* 2025 - aged 50 - half century old
** Add new layer for 14 years (2039)
* 2029 - age 54
** Planned opening of 2017 layer. Create new layer with 10 year duration (2039)
* 2039 - age 64 (when I'm sixty-four)
** Planned opening of 2025 and 2029  layer. This will be the first time since 2017 (age 42) that all layers are open at once!
** Create new capsule. Multiple to continue the streams? One long and one short? 
* 2044 - aged 69. Nice number ;)
* 2050 - aged 75. Middle of the century, Nemo 3/4 of a century old
* 2059 - aged 84 (2x 42)
** Time for another 'all layers'  ?
* 2075 - aged 100
I like pool. I have a terrible table though, but have played on some nice ones (thanks former housemates!)

These are my personal game variants and house rules

!! Games

!!! Kelly Pool
I play this inverse to the official rules. ie, I prefer a "keep yours on the table" game - making it a game of "last man standing". I prefer the balls to be split amongst all players with only a few unaligned on the table. Then, in the early game, players must announce when a ball of theirs is sunk - increasing the taunting and mocking value. Conversely, in the late stages of the game, players must remain silent, so increasing uncertainty and tension. The following table (TODO!) provides the early/late boundary for different numbers of players

!!! Fifteen-ball. 
Basically derived from Nine-ball, this game was developed with "House" Adam. It shares in common with nine-ball that a legal shot must involve the cue-ball striking the lowest numbered ball on the table. However, the game diverges from there. The winning condition is based on points accrued, and points are gained by potting balls on the table. 

The specifics are lost to memory for now (may be in a notebook however?), but I think points were scored by one of:
* Simple addition of the potted ball number
* Using the position in a players innings as the multiplier (ie, first pot is value, second pot = 2x value, third pot = 3x value, etc)
* Using the 'low ball' as a multiplier effect (thus decreasing the chance that a weak run early cannot be recovered from).
(these latter two methods are great for learning ones times-tables ;)

There may also have been appropriate negative scores for potting balls on a foul.

!! Regular pool house rules

;After foul
:Two shots, first from ON the line/D only, and must shoot forward.
;Sinking the black early
:Player loses
:(alternative when pay-per-game situation). Player loses the technical game, but continue playing to find the "skill" winner (and loser). Where possible, return black to the table. Otherwise (pub setting), then the closest-to-nine numbered ball from the opponent (the technical winner) becomes the proxy black. Either players may suffer multiple "technical losses", and up to one "skill loss". These count equal in the final reckoning and the player with the least losses, wins. (note that this does allow for ties - though if a moral winner (or tiebreak) is needed, then it goes to the skill winner)
;Potting the white when shooting for the black
:Loses game ONLY if both players are shooting for the black. Otherwise, foul. 
/*{{{*/
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)';}
/*}}}*/
/***
|''Name''|MediaWikiTableFormatterPlugin|
|''Description''|Allows MediaWiki style tables in TiddlyWiki|
|''Author''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Contributors''|FND|
|''Version''|0.1.2|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#MediaWikiTableFormatterPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/MediaWikiTableFormatterPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.1.0|
!Description
Enables [[MediaWiki|http://www.mediawiki.org]]'s table markup in TiddlyWiki, allowing for multi-line contents within table cells.
(Note that all TiddlyWiki markup still applies.)
!Usage
Detailed documentation available at [[MediaWiki.org|http://www.mediawiki.org/wiki/Help:Tables]].
!!Examples
{{{
{|
! Heading 1
! Heading 2
! Heading 3
|-
| row 1, column 1
| row 1, column 2
| row 1, column 3
|-
| row 2, column 1
| row 2, column 2
| row 2, column 3
|}
}}}
{|
! Heading 1
! Heading 2
! Heading 3
|-
| row 1, column 1
| row 1, column 2
| row 1, column 3
|-
| row 2, column 1
| row 2, column 2
| row 2, column 3
|}
!Revision History
!!v0.1 (2008-10-31)
* initial release
!!v0.1.2 (2008-11-05)
* removed unnecessary code
!Code
***/
//{{{
if(!version.extensions.MediaWikiTableFormatterPlugin) { //# ensure that the plugin is only installed once
version.extensions.MediaWikiTableFormatterPlugin = {installed:true};

if(version.major < 2 || (version.major == 2 && version.minor < 1)) {
	alertAndThrow('MediaWikiTableFormatterPlugin requires TiddlyWiki 2.1 or later.');
}

config.formatters.push({
	name: 'enhancedTable',
	match: '^\\{\\|',
	handler: function(w) {
		var pair = MediaWikiTemplate.findTableBracePair(w.source,w.matchStart);
		if(pair.start==w.matchStart) {
			w.nextMatch = w.matchStart;
			var table = MediaWikiTemplate.createElement(w.output,'table');
			var tbody = MediaWikiTemplate.createElement(table,'tbody'); // required for IE
			var mwt = new MediaWikiTemplate();
			mwt.wikifyTable(tbody,w,pair);
		}
	}
});


MediaWikiTemplate = function()
{
	this.stack = [];
	this.error = false;
	this.tiddler = null;
};

MediaWikiTemplate.createElement = function(parent,element)
{
	return parent.appendChild(document.createElement(element));
}

MediaWikiTemplate.setAttributesFromParams = function(e,p)
{
	var re = /\s*(.*?)=(?:(?:"(.*?)")|(?:'(.*?)')|((?:\w|%|#)*))/mg;
	var match = re.exec(p);
	while(match) {
		var s = match[1].unDash();
		if(s == 'bgcolor') {
			s = 'backgroundColor';
		}
		try {
			if(match[2]) {
				e.setAttribute(s,match[2]);
			} else if(match[3]) {
				e.setAttribute(s,match[3]);
			} else {
				e.setAttribute(s,match[4]);
			}
		}
		catch(ex) {}
		match = re.exec(p);
	}
};

MediaWikiTemplate.findRawDelimiter = function(delimiter,text,start)
//# find a delimiter that is not enclosed by [[..]]
{
	var d = text.indexOf(delimiter,start);
	if(d==-1)
		return -1;
	var b = {start:-1,end:-1};
	var bs = text.indexOf('[[',start);
	if(bs==-1 || bs >d)
		return d;
	var s1 = -1;
	if(bs!=-1 && bs <d) {
		var be = text.indexOf(']]',bs);
		if(be!=-1) {
			b.start = bs;
			b.end = be;
		}
	}
	if(b.start!=-1 && d>b.start)
		s1 = b.end+2;
	return s1==-1 ? d : MediaWikiTemplate.findRawDelimiter(delimiter,text,s1);
};

MediaWikiTemplate.findTableBracePair = function(text,start)
{
	var ret = {start:-1,end:-1};
	var s = text.indexOf('{|',start);
	if(s==-1)
		return ret;
	var e = text.indexOf('\n|}',s+2);
	if(e==-1)
		return ret;
	e++;
	var s2 = text.indexOf('{|',s+2);
	if(s2==-1 || s2 > e)
		return {start:s,end:e};
	var tp = MediaWikiTemplate.findTableBracePair(text,s+2);
	while(tp.end!=-1 && e>tp.start && e<=tp.end) {
		//# intervening table brace pair, so skip over
		e = tp.end+2;
		tp = MediaWikiTemplate.findTableBracePair(text,e);
		e = text.indexOf('\n|}',e);
		if(e==-1)
			return ret;
		e++;
	}
	return {start:s,end:e};
};

MediaWikiTemplate.prototype.wikifyTable = function(table,w,pair)
{
	function lineEnd(w) {
		var r = w.source.indexOf('\n',w.nextMatch);
		while(r!=-1) {
			var n = w.source.substr(r+1,1);
			if(n=='|' || n=='!' || (n=='{' && w.source.substr(r+2,1)=='|'))
				break;
			r = w.source.indexOf('\n',r+1);
		}
		return r;
	}
	function subWikifyText(e,w,text) {
			var oldSource = w.source; var oldMatch = w.nextMatch;
			w.source = text; w.nextMatch = 0;
			w.subWikifyUnterm(e);
			w.source = oldSource; w.nextMatch = oldMatch;
	}
	//# skip over {|
	w.nextMatch += 2;
	var i = lineEnd(w);
	if(i>w.nextMatch) {
		MediaWikiTemplate.setAttributesFromParams(table.parentNode,w.source.substring(w.nextMatch,i));
		w.nextMatch = i;
	}
	w.nextMatch++;
	if(w.source.substr(w.nextMatch,2)=='|+') {
		var caption = MediaWikiTemplate.createElement(table,'caption');
		w.nextMatch += 2;
		i = lineEnd(w);
		var d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
		if(d!=-1 && d<i) {
			MediaWikiTemplate.setAttributesFromParams(caption,w.source.substring(w.nextMatch,d));
			w.nextMatch = d+1;
		}
		w.subWikifyTerm(caption,/(\n)/mg);
	}
	var tr = MediaWikiTemplate.createElement(table,'tr');
	if(w.source.substr(w.nextMatch,2)=='|-') {
		w.nextMatch += 2;
		i = lineEnd(w);
		if(i>w.nextMatch) {
			MediaWikiTemplate.setAttributesFromParams(tr,w.source.substring(w.nextMatch,i));
			w.nextMatch = i;
		}
		w.nextMatch++;
	}
	var x = w.source.substr(w.nextMatch,2);
	while(x!='|}') {
		if(x=='{|') {
			//# nested table
			var pair2 = MediaWikiTemplate.findTableBracePair(w.source,w.nextMatch);
			if(pair2.start==w.nextMatch) {
				var table2 = MediaWikiTemplate.createElement(cell,'table');
				this.wikifyTable(table2,w,pair2);
			}
		} else if(x=='|-') {
			//# new row
			tr = MediaWikiTemplate.createElement(table,'tr');
			w.nextMatch += 2;
			i = lineEnd(w);
			if(i==-1)
				break;
			if(i>w.nextMatch) {
				MediaWikiTemplate.setAttributesFromParams(tr,w.source.substring(w.nextMatch,i));
				w.nextMatch = i;
			}
			w.nextMatch++;
		} else if(x.substr(0,1)=='!') {
			//# header cell
			w.nextMatch++;
			i = lineEnd(w);
			if(i==-1)
				break;
			var cell = MediaWikiTemplate.createElement(tr,'th');
			var c = w.source.indexOf('!!',w.nextMatch);
			while(c!=-1 && c<i) {
				d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
				if(d!=-1 && d<c) {
					MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
					w.nextMatch = d+1;
				}
				while(w.source.substr(w.nextMatch,1)==' ') {
					w.nextMatch++;
				}
				w.subWikifyTerm(cell,/(\!\!)/mg);
				cell = MediaWikiTemplate.createElement(tr,'th');
				c = w.source.indexOf('!!',w.nextMatch);
			}
			d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
			if(d!=-1 && d<i) {
				MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
				w.nextMatch = d+1;
			}
			while(w.source.substr(w.nextMatch,1)==' ') {
				w.nextMatch++;
			}
			subWikifyText(cell,w,w.source.substring(w.nextMatch,i));
			w.nextMatch = i+1;
		} else if(x.substr(0,1)=='|') {
			//# cell
			w.nextMatch++;
			i = lineEnd(w);
			if(i==-1)
				break;
			cell = MediaWikiTemplate.createElement(tr,'td');
			c = w.source.indexOf('||',w.nextMatch);
			while(c!=-1 && c<i) {
				d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
				if(d!=-1 && d<c) {
					MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
					w.nextMatch = d+1;
				}
				while(w.source.substr(w.nextMatch,1)==' ') {
					w.nextMatch++;
				}
				w.subWikifyTerm(cell,/(\|\|)/mg);
				cell = MediaWikiTemplate.createElement(tr,'td');
				c = w.source.indexOf('||',w.nextMatch);
			}
			d = MediaWikiTemplate.findRawDelimiter('|',w.source,w.nextMatch);
			if(d!=-1 && d<i) {
				MediaWikiTemplate.setAttributesFromParams(cell,w.source.substring(w.nextMatch,d));
				w.nextMatch = d+1;
			}
			while(w.source.substr(w.nextMatch,1)==' ') {
				w.nextMatch++;
			}
			subWikifyText(cell,w,w.source.substring(w.nextMatch,i));
			w.nextMatch = i+1;
		}
		x = w.source.substr(w.nextMatch,2);
	}
	w.nextMatch = pair.end + 3;
	return;
};

} //# end of 'install only once'
//}}}
The name was long-planned as to be the name of the first place he lived by himself, and though at the last moment there was some deliberation as to whether to keep the name in reserve for later, it finally won through.

Thus Blackstone is the second "Slumberland" :)

Slumberland - a place to dream!

* Slumberland in Blackstone (Ipswich) is my first owned house. Purchase date is officially (I think) the 24th March 2012, but I didn't do the big truck move till 30th April. As of writing, I am still there.

It is a place of tree frogs, but, in the first 18 months at least, quite antagonistic to birds!

See also, SlumberWiki, where the permanent Slumberland is planned!
While the [[food]] tag is for any post about food, the recipe tag is for specific recipes. It should be a true subset of food.
My wiki in which I am designing my house. It is part of the NemoWeb

http://nemo.house.cx/House

/***
|Name|RearrangeTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#RearrangeTiddlersPlugin|
|Version|2.0.0|
|Author|Eric Shulman|
|OriginalAuthor|Joe Raii|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|drag tiddlers by title to re-order story column display|

adapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable
changes by ELS:
* hijack refreshTiddler() instead of overridding createTiddler()
* find title element by className instead of elementID
* set cursor style via code instead of stylesheet
* set tooltip help text
* set tiddler "position:relative" when starting drag event, restore saved value when drag ends
* update 2006.08.07: use getElementsByTagName("*") to find title element, even when it is 'buried' deep in tiddler DOM elements (due to custom template usage)
* update 2007.03.01: use apply() to invoke hijacked core function
* update 2008.01.13: only hijack core function once.  (allows for dynamic loading of plugin via bookmarklet)
* update 2008.10.19: added onclick popup menu with 'move to top' and 'move to bottom' commands
* update 2010.11.30: use story.getTiddler()
***/
//{{{

if (Story.prototype.rearrangeTiddlersHijack_refreshTiddler===undefined) {
Story.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template)
{
	this.rearrangeTiddlersHijack_refreshTiddler.apply(this,arguments);
	var theTiddler = this.getTiddler(title); if (!theTiddler) return;
	var theHandle;
	var children=theTiddler.getElementsByTagName("*");
	for (var i=0; i<children.length; i++) if (hasClass(children[i],"title")) { theHandle=children[i]; break; }
	if (!theHandle) return theTiddler;

	Drag.init(theHandle, theTiddler, 0, 0, null, null);
	theHandle.style.cursor="move";
	theHandle.title="drag title to re-arrange tiddlers, click for more options..."
	theTiddler.onDrag = function(x,y,myElem) {
		if (this.style.position!="relative")
			{ this.savedstyle=this.style.position; this.style.position="relative"; }
		y = myElem.offsetTop;
		var next = myElem.nextSibling;
		var prev = myElem.previousSibling;
		if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) { 
			myElem.parentNode.removeChild(myElem);
			next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);
			myElem.style["top"] = -next.offsetHeight/2+"px";
		}
		if (prev && y < prev.offsetTop + prev.offsetHeight/2) { 
			myElem.parentNode.removeChild(myElem);
			prev.parentNode.insertBefore(myElem, prev);
			myElem.style["top"] = prev.offsetHeight/2+"px";
		}
	};
	theTiddler.onDragEnd = function(x,y,myElem) {
		myElem.style["top"] = "0px";
		if (this.savedstyle!=undefined)
			this.style.position=this.savedstyle;
	};
	theHandle.onclick=function(ev) {
		ev=ev||window.event;
		var p=Popup.create(this); if (!p) return;
		var b=createTiddlyButton(createTiddlyElement(p,"li"),
			"\u25B2 move to top of column ","move this tiddler to the top of the story column",
			function() {
				var t=story.getTiddler(this.getAttribute("tid"));
				t.parentNode.insertBefore(t,t.parentNode.firstChild); // move to top of column
				window.scrollTo(0,ensureVisible(t));
				return false;
			});
		b.setAttribute("tid",title);
		var b=createTiddlyButton(createTiddlyElement(p,"li"),
			"\u25BC move to bottom of column ","move this tiddler to the bottom of the story column",
			function() {
				var t=story.getTiddler(this.getAttribute("tid"));
				t.parentNode.insertBefore(t,null); // move to bottom of column
				window.scrollTo(0,ensureVisible(t));
				return false;
			});
		b.setAttribute("tid",title);
		Popup.show();
		ev.cancelBubble=true; if (ev.stopPropagation) ev.stopPropagation(); return(false);
	};
	return theTiddler;
}
}

/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 **************************************************/

var Drag = {
	obj:null,

	init:
	function(o, oRoot, minX, maxX, minY, maxY) {
		o.onmousedown = Drag.start;
		o.root = oRoot && oRoot != null ? oRoot : o ;
		if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";
		if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";
		o.minX = typeof minX != 'undefined' ? minX : null;
		o.minY = typeof minY != 'undefined' ? minY : null;
		o.maxX = typeof maxX != 'undefined' ? maxX : null;
		o.maxY = typeof maxY != 'undefined' ? maxY : null;
		o.root.onDragStart = new Function();
		o.root.onDragEnd = new Function();
		o.root.onDrag = new Function();
	},

	start:
	function(e) {
		var o = Drag.obj = this;
		e = Drag.fixE(e);
		var y = parseInt(o.root.style.top);
		var x = parseInt(o.root.style.left);
		o.root.onDragStart(x, y, Drag.obj.root);
		o.lastMouseX = e.clientX;
		o.lastMouseY = e.clientY;
		if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;
		if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;
		if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;
		if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;
		document.onmousemove = Drag.drag;
		document.onmouseup = Drag.end;
		Drag.obj.root.style["z-index"] = "10";
		return false;
	},

	drag:
	function(e) {
		e = Drag.fixE(e);
		var o = Drag.obj;
		var ey = e.clientY;
		var ex = e.clientX;
		var y = parseInt(o.root.style.top);
		var x = parseInt(o.root.style.left);
		var nx, ny;
		if (o.minX != null) ex = Math.max(ex, o.minMouseX);
		if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);
		if (o.minY != null) ey = Math.max(ey, o.minMouseY);
		if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);
		nx = x + (ex - o.lastMouseX);
		ny = y + (ey - o.lastMouseY);
		Drag.obj.root.style["left"] = nx + "px";
		Drag.obj.root.style["top"] = ny + "px";
		Drag.obj.lastMouseX = ex;
		Drag.obj.lastMouseY = ey;
		Drag.obj.root.onDrag(nx, ny, Drag.obj.root);
		return false;
	},

	end:
	function() {
		document.onmousemove = null;
		document.onmouseup = null;
		Drag.obj.root.style["z-index"] = "0";
		Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);
		Drag.obj = null;
	},

	fixE:
	function(e) {
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	}
};
//}}}
{{{
Space shuttle is... WOW
again and again and again
1981

Success is common
but don't use it in the cold
1986

Getting up? easy
Getting back is the hard bit
2003

Over 130 missions
No more lessons. Onto next.
2011

Enterprise. Columbia.
Challenger. Discovery.
Atlantis. Endeavour.
}}}
----
{{credit{
10 July 2011
First published to BadPoetryOfTheDay on the 11 May 2011, under the subject '//Not enough time for 131 individual musings//'
}}}
{{{
The sun set.
	I saw it go long from the air. Travelling
Hours later, the moon rose.
	Twice.

First time, banking into Canberra.
	It rose above the hills,
	the reddish yellow of a perfect mango
Then it set as we landed,
	only to rise again minutes later
	smiling at me with familiar cheesiness
	as I stepped onto the tarmac
}}}
----
{{credit{
22 April 2011
First published to BadPoetryOfTheDay on the 12 May 2011, under the subject '//Astronomically Delightful//'
}}}
It's the future... plus one!

Welcome to 2011

[img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk.gif][EmbeddedImages]]


[img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]][img[http://nemo.house.cx/uploads/workspace/default/lemmingswalk2.gif][EmbeddedImages]]

You'll have to imagine/remember your own Lemmings 8bit musics though :)
<<<
In dragon breath the pains of old
Incinerated as we watch
Sparkle silver and fizz gold
Release regrets with blinding torch

In lake of fire islands form
Solidify in hopes and dreams
It burns to welcome time renewed
A beacon for the bright new year
<<<
----
{{credit{
Nerissa Rowan / 23 January 2012
First published to BadPoetryOfTheDay on the 23 January 2011, under the subject '//Happy New Year!//'
}}}
As part of an ongoing series of awesomeness, this is the recipe is for Gardeners Pie, as taught to Nemo by Lisa...

So what is Gardeners Pie? Simply put, it is the vegetarian/vegan version of shepherds pie.

So let us begin...

!! Ingredients 

* Potatoes
* margarine
* 2 small/medium onions
* clove of garlic
* handfull of cauliflower
* handfull of mushrooms
* handfull of broccoli
* handfull of zuchinni
* third of a red capsicum
* tin of lentils
* 3 medium bay leaves
* splash of oil (extra virgin olive oil by preference)
* sprinkle of sage
* sprinkle of thyme 

!! Procedure
Cut up small and fry (in the olive oil, in the following order) the onion, garlic, mushroom, cauliflower, capsicum broccoli, and zuchinni up lightly.

Add the lentils, sage, thyme and bay leaves, mix well and place in baking dish. I use a 1.8litre baking dish, and these proportions fill with approx 2cm to spare for the potato...

Cover with the mashed potatoes you've been making simultaneously with the potato and margarine (I'm gonna assume you can make that!) to about 2-4cm thick.

Bake till lightly golden crust, or to taste.

Remove bayleaves when eating.

!! Variations on a theme
Consider including carrot, sweet potato, pumpkin or other herbs to taste in the covering mash. Other vegetables can of course be added to the main dish also. We encourage experimentation.

!! Vegan?
Ensure mashed potato is creamed with vegan margarine/soy milk/etc. That's about it really.
Chocolate isn't merely something like the best thing ever. It '''is''' the best thing ever. (statement may not apply to the deranged, or those not in posession of tastebuds)

!! Some ideas of stuff to do with chocolate...

;chocolate doughnut
:chocolate shell around chocolate mousse - a hollow choc torus!
:Alternative: whipped cream inside
;chocolate spitroast
:blocks of chocolate on a spit, under a heater. ...It's like an upside-down fondue.
:Don't forget a catch tray!
;Chocolate Mexican foods
:nachos (see review in the links below), tacos
:Nachos: corn chips replaces by chocolate tortilla equiv. sour cream becomes whipped cream. guacamole = ice cream scoop. cheese = chocolate syrup. 
:Tacos = ...?
;Chocolate spring rolls: eaten, yet to replicate


!! Chocolypse
What if one were to distill pure choc-hazelnut molecules out of nutella? What then huh? muahahaha!

!! Links
* http://www.seriouseats.com/recipes/2009/02/how-to-make-a-choco-taco-from-scratch.html - the URL should say it all, but it could be done better
* http://www.pimpthatsnack.com/ - This URL also says it all. Lots of choco goodness here
* http://www.chocolate-week.co.uk/index.php/site/news/chocolate_dinner/ - a meal with chocolate in every dish!
* http://kokopops.livejournal.com/7300.html - review of chocolate nachos
may mean:

* <<slider chkSlumberlandTaringa "Slumberland Taringa" "Slumberland Taringa: April 2010 - April 2012" "Slumberland Taringa">>
* <<slider chkSlumberlandBlackstone "Slumberland Blackstone" "Slumberland Blackstone: April 2012 - current" "Slumberland Blackstone">>

See also [[housetimeline]] 
this page from http://tiddlywiki.secret-hq.com/#formatting

Also see [[TiddlyWiki Markup (from TiddlyWiki.org)]].
{{sidebarRight{
''CONTENTS''
*~In-Line Text Formats
*Links
*Avoiding Wikification
*Headers & Lists
*Text Blocks
*Blockquoting
*Images
*Tables
*Custom CSS Classes
**Span vs. DIV
*Gradients
*Annotations
*Functions
**Extended Functions (plugins)
*Hyperlinking
}}}
!~In-Line Text Formats

|''Bold''|{{{''}}}two apostrophes{{{''}}}|
|//Italic//|{{{//}}}two slashes{{{//}}}|
|__Underline__|{{{__}}}two underscores{{{__}}}|
|@@Highlight (yellow)@@|{{{@@}}}two 'at' symbols{{{@@}}}|
|--Strikethrough--|{{{--}}}two hyphens{{{--}}}|
|{{{Monospace Font (Code)}}}|<html><code>{{{</code></html>three braces<html><code>}}}</code></html>|
|^^Super^^script|{{{^^}}}two carets{{{^^}}}|
|~~Sub~~script|{{{~~}}}two tildes{{{~~}}}|
|@@color(RED):Text@@ @@color(BLUE):Colors@@|{{{@@color(COLORNAME or HEX VALUE):}}}Text to Display{{{@@}}}|
|@@font-weight:bold;font-style:italic;text-align:right;inline custom styles@@|{{{@@inline-style-attribute:value;another-attibute:its-value;}}}Text to Display{{{@@}}}|
|<hr>(horizontal rule)|{{{<hr>}}}<br>or<br>{{{----}}} (four hyphens on their own line)|

!Links

''~WikiWords:''
Any words that begin with a capital letter and have internal caps ("~CamelCase") are treated as "~WikiWords" and automatically linked to.

''~PrettyLinks:''
*Add {{{[[two brackets]]}}} around any word or phrase to link to a tiddler with that name.
*To specify the display text as different from the tiddler name, use {{{[[Display Text|TiddlerName]]}}}.
*To link display text outside the current ~TiddlyWiki, use {{{[[Display Text|URL]]}}}, as in:
**{{{[[eBay|http://www.ebay.com]]}}}
**{{{[[This TiddlyWiki|file:///C:/path/to/TiddlyWiki.html]]}}}

!Avoiding Wikification

Escape Characters : {{{"""}}}three quotation marks{{{"""}}} or {{{<nowiki>}}} and {{{</nowiki>}}} tags

Escape ~WikiWords with a tilde ({{{~WikiWords}}}).

Eric Shulman's excellent [[DisableWikiLinksPlugin]] is also installed in most of my ~Secret-HQ ~TiddlyWikis and can be used to prevent wikification altogether or in conjunction with an [[exception list|DisableWikiLinksList]].  (If it's not installed in this ~TiddlyWiki, you can get it [[from TiddlyTools|http://www.TiddlyTools.com/#DisableWikiLinksPlugin]].)

!Headers & Lists

{{{!}}}~Top-Level Header
{{{!!}}}Secondary Header
{{{!!!}}}Tertiary Header
etc.

*{{{*}}}Bulleted List
**{{{**}}}~Sub-Item
***{{{***}}}~Sub-Sub-Item
****{{{****}}}etc.

#{{{#}}}Ordered List
##{{{##}}}~Sub-Item #1
##{{{##}}}~Sub-Item #2
###{{{###}}}~Sub-Sub-Item
####{{{####}}}etc.

!Text Blocks

<HTML><CODE>{{block{</CODE></HTML>
Wrap multiple lines of text in this markup to make ~TiddlyWiki treat them as a single block.
<HTML><CODE>}}}</CODE></HTML>

#Comes in especially handy
#{{block{
<HTML><CODE>{{block{</CODE></HTML>
with bulleted lists
...
and especially with numbered lists
<HTML><CODE>}}}</CODE></HTML>
}}}
#(as you can see)

!Blockquoting

>{{{>}}}Simple indent.  Applies to the entire block, including word wrapping.
>>{{{>>}}}Add extra //Greater Than//s to increase the indent.  (The blockquote created by {{{>}}} ends where the line ends, so when you create nested blockquotes, you're actually creating one paragraph inside a set of {{{<blockquote></blockquote>}}} tags, then a second set inside the first: {{{<blockquote><blockquote></blockquote></blockquote>}}}

{{{<<<}}}
To blockquote a section spanning multiple lines, you can either preface each line with {{{>}}} -- or you can surround the text with this markup (on its own lines).
{{{<<<}}}

<HTML><CODE>{{blockquote{</CODE></HTML>
Before I realized there was a native function for blockquoting multiple lines, I created a custom CSS class named //blockquote// in most of my ~Secret-HQ ~TiddlyWikis.  If this class is present in the StyleSheet, it can be invoked with the markup shown surrounding this paragraph to achieve the same effect as surrounding a block of text with {{{<<<}}} and {{{<<<}}}.
<HTML><CODE>}}}</CODE></HTML>

!Images

Image paths can be relative or absolute; local, on the network, or on the web.  See //Hyperlinking// below for more examples of valid paths.

{{sidebar{
{{{[img[http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]}}}:

[img[http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]
}}}

''Float Image to the Left or Right''

{{sidebar{
{{{[<img[http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]}}}:

[<img[http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]Float the image to the left of text with a {{{<}}}.

@@clear:left;display:block;Clear the floated image with {{{@@clear:left;display:block;}}}an inline style like this one{{{@@}}}.@@
}}}

{{sidebar{
{{{[>img[http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]}}}:

[>img[http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]Float the image to the right of text with a {{{>}}}.

@@clear:right;display:block;Clear the floated image with {{{@@clear:right;display:block;}}}an inline style like this one{{{@@}}}.@@
}}}

@@clear:both;display:block;{{{@@clear:both;display:block;}}} will clear both/either left-floating and/or right-floating images.{{{@@}}}@@

''Add Tooltip Text (Mouseover)''

{{sidebar{
{{{[img[Kitty Girl (tooltip text)|http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]}}}:

[img[Kitty Girl (tooltip text)|http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg]]
}}}

''Add a Link''

{{sidebar{
{{{[img[click to visit TiddlyWiki.Secret-HQ.com|http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg][TARGETLINK]]}}}:
[img[click to visit TiddlyWiki.Secret-HQ.com|http://tiddlywiki.secret-hq.com/images/KittyGirl.jpg][http://tiddlywiki.secret-hq.com#formatting]]
}}}

!Tables

|>|Tables Can Be Created with Pipes|h
|row 1, cell 1|row 1, cell 2|
|row 2, cell 1|row 2, cell 2|
|>|This is the table footer.|f
|And this is the table caption.|c

*Tag the right edge of the header row with {{{|h}}} and the right edge of the footer row with {{{|f}}} to mark them as header or footer rows.
*Tag the right edge of the caption with {{{|c}}}.
*{{{|>|}}} indicates an empty cell being merged with the next cell to its right in a row, creating a single cell that spans mutliple columns, {{{colspan}}}-style.
*{{{|~|}}} indicates an empty cell being merged with the cell above it, creating a single cell that spans multiple rows, {{{rowspan}}}-style.
*Use {{{<br>}}} for line breaks within table cells.
*Use a space at the beginning of a cell ({{{| See that space?|}}}) to right-align the contents of the cell.

!Custom CSS Classes

Create any custom style you want in the StyleSheet tiddler and invoke it in a tiddler by enclosing the content/element to be styled within <html><code>{{customCSSClassName{</code></html> and <html><code>}}}</code></html> -- just as you would normally enclose it within {{{<span style="customCSSClassName">}}} and {{{</span>}}}.

!!SPAN vs. DIV

Use a line break before the content/element to treat the enclosure as a {{{DIV}}} rather than a {{{SPAN}}}.

I.e., the effect of {{{<span style="customCSSClassName">some content</span>}}} is created with:
{{{
{{customCSSClassName{some content}}}
}}}

... but the effect of {{{<div style="customCSSClassName">some content</div>}}} is created with:
{{{
{{customCSSClassName{
some content}}}
}}}

!Gradients

Gradients are defined by {{{<<gradient vert|horiz STARTINGCOLOR MIDDLECOLOR FINAL COLOR>>}}}, then whatever is to appears inside the gradient (text, entire tiddler contents, etc.), then a second {{{>>}}}.  The {{{vert}}} or {{{horiz}}} value determines whether the gradient is applied vertically from top to bottom or horizonatally from left to right.

| <<gradient vert #ffffff #ffdddd #ff8888>>Reddish>> | <<gradient vert #ffffff #ddffdd #88ff88>>Greenish>> | <<gradient vert #ffffff #ddddff #8888ff>>Purplish>> |

!Annotations

''Add a Footnote'' //requires [[FootnotesPlugin]]//

A statement to annotate.{{{```Text of footnote.```}}}

''Add a ~Pop-Up Annotation'' //requires [[AnnotationsPlugin]]//

The {{{((annotated text(Text of annotation.)))}}} will be styled accordingly.

{{{((Using a caret(^Text of annotation.)))}}} will display the annotated text in the pop-up layer.

!Functions

~TiddlyWiki allows you to execute complex functions via macros.  Some macros are defined in the ~TiddlyWiki core ("native functions") and some are defined in plugins.  Macros are called with the syntax {{{<<macroName>>}}}.  You can pass parameters to some macros using the syntax {{{<<macroName parameter1 parameter2 etc.>>}}}.

''Create a New Tiddler'' //native function//

{{{<<newTiddler "TITLE" label:"LABEL" tag:"TAG1" tag:"TAG 2">>}}}

*{{{TITLE}}} refers to the title of the new tiddler to be created.
*{{{LABEL}}} refers to the text that will be shown when this function button is displayed.
*{{{TAG1}}} and {{{TAG 2}}} refer tags that will be pre-populated in the new tiddler.  Do not use double brackets.  (They will be added when a tag value has spaces.)
*If you don't need to differentiate the label, you can use a simpler syntax:
**{{{<<newTiddler "TITLE" "TAG1" "TAG 2">>}}}

''Create a New Tiddler from a Template'' //native function//

{{{<<newTiddler "TITLE" label:"LABEL" tag:"TAG1" tag:"TAG 2" text:{{store.getTiddlerText('TEMPLATE')}}>>}}}

*{{{TEMPLATE}}} refers to the tiddler to use as a template when creating the new tiddler.  Any tiddler can be used; you do not need a dedicated template.  (When I do save templates as individual tiddlers, I use the naming convention of giving them ~WikiWord names like RSSFeedTemplate and tagging them with the tag [[templates]].)

''Create a New Journal Tiddler'' //native function//

{{{<<newJournal "DD MMM YYYY" "journal">>}}}

*{{{DD MMM YYYY}}} refers to the current date (in the format shown here).  The format can be adjusted, and {{{MM}}} can also be used to indicate the number of the month rather than its name.
*The text {{{journal}}} is simply a tag value.

''Display Tagged Tiddlers'' //native function//

{{{<<tag "TAG" "LABEL">>}}}

*{{{TAG}}} refers to a single tag.  (Multi-word tags with spaces are O.K.)
*{{{LABEL}}} is an optional parameter to specify the name displayed in the generated drop-down list.  (If no second parameter is specified, the name of the tag is displayed.)
*If [[QuickOpenTagPlugin]] is installed, the syntax is slightly different (and in reverse order, more like ~PrettyLinks):

>{{{<<tag "LABEL|TAG">>}}}

''Transclude (Include the Contents of One Tiddler in Another)'' //native function//

{{{<<tiddler "TIDDLERNAME">>}}}

*{{{TIDDLERNAME}}} refers to the name of the tiddler to include.

!!Extended Functions (plugins)

These functions are available via common ~TiddlyWiki plugins.

''Open Multiple Tiddlers with a Single Link'' //requires [[OpenTiddlersMacro]]//

{{{<<openTiddlers text:"LABEL" tiddlers:"TIDDLER1 TIDDLER2 [[TIDDLER WITH SPACES]] TIDDLER4">>}}}

''Display an RSS Feed in a Tiddler'' //requires [[RSSReaderPlugin]]//

{{{<<rssReader RSSURL>>}}}

''Perform Batch Edits & Deletes on Multiple Tiddlers'' //requires [[TiddlerTweakerPlugin]]//

{{{<<tiddlerTweaker>>}}}

!Hyperlinking

''Another TiddlyWiki in the Same Directory''

{{{[[link text|AnotherTiddlyWiki.html]]}}}

''Another TiddlyWiki on the Same Machine''

Use absolute path:
{{{[[link text|file:///C:/path/to/AnotherTiddlyWiki.html]]}}}

Or relative path:
{{{[[link text|../../other TiddlyWikis/AnotherTiddlyWiki.html]]}}}

''Another TiddlyWiki on the Local Area Network''

{{{[[link text|file:\\COMPUTERNAME\path\to\AnotherTiddlyWiki.html]]}}}

''Tiddlers in Another TiddlyWiki''

You can pass the name of tiddler (or multiple tiddlers separated by spaces) to a TiddlyWiki file as an anchor tag, and the specified tiddler(s) will open on startup, overriding the DefaultTiddlers value.

{{{file:///C:/path/to/TiddlyWiki.html#SomeTiddler}}}
{{{file:///C:/path/to/TiddlyWiki.html#SomeTiddler AndAnotherTiddler}}}
{{{file:///C:/path/to/TiddlyWiki.html#[[Some Tiddler with Spaces in Its Title]] [[And Another Tiddler with Spaces in Its Title]]}}}

This works with TiddlyWikis on the web, too:
{{{http://www.SomeWebSiteThatIsATiddlyWiki.com#[[Some Tiddler with Spaces in Its Title]]}}}
{{{http://www.SomeOtherDomain.com/TiddlyWiki.html#[[Still Another Tiddler with Spaces in Its Title]]}}}

''Using HTML Links''

If you're linking to specific tiddlers with spaces that require you to use {{{[[}}} and {{{]]}}}, you may need to use HTML (since you can't nest one set of double brackets for ~PrettyLinks inside another):

{{{<html><a href="file:///C:/path/to/TiddlyWiki.html#[[Some Tiddler with Spaces in Its Title]]">link text</a></html>}}}

Or you can use escape sequences for the left brackets ({{{%5B}}}), right brackets ({{{%5D}}}), and spaces ({{{%20}}}):

{{{[[link text|file:///C:/path/to/TiddlyWiki.html#%5B%5BSome%20Tiddler%20with%20Spaces%20in%20Its%20Title%5D%5D]]}}}
A vege stew/curry thing. Works great by itself, on bread, or as a corn chip dip. Add a touch of lemon, or sour cream, to tune the taste. 

Recipe involves: 
* mince (or vegan equiv)
* onions
* Veges to boil down to mush - any/all of
** potatoes
** sweet potato
** pumpkin
** carrots
* curry powder

Approx 3 hours to cook. 

----
{{credit{
recipe from my mother}}}
It's been a long time since writing up something here. 

This post is inspired by the wiki having been down for the last 3 months after a server upgrade, and not quite understanding how I got it working (there are PHP errors with this version of PHP, and ccTiddly is way out of date. All content here will likely move to TiddlyWiki5 once that's out and server-friendly enough. 

But I did get it running, and, frankly, have rediscovered just how much damn fun TiddlyWiki's are. 

So. :)
!! Personally maintained (to some vague degree)
* [[@NemoThorx|http://twitter.com/thatcoat]] - my personal twittering
* [[@thatcoat|http://twitter.com/thatcoat]] - my coat has an account
!! Project of some form
* [[@statementals|http://twitter.com/statementals]] - potentially embarrasing stuff that I overhear (mostly: from friends)
* [[@WatchingDrWho|http://twitter.com/WatchingDrWho]] - my 'watching 50 years of Doctor Who' 2013 project
* [[@WombleBrisbane|http://twitter.com/WombleBrisbane]] - on topic of hard rubbish pickups in Brisbane
* [[@inspi_rational|http://twitter.com/inspi_rational]] - Rational inspirational aphorisms
!! Bots
* [[@JamieMythBot|http://twitter.com/JamieMythBot]] - everyone needs a fake celebrity account. This one didn't do too badly, I think. 
* [[@_glossolalia_|http://twitter.com/_glossolalia_]] - says what it says on the tin. 
* [[@Daisy_the_goat|http://twitter.com/Daisy_the_goat]] - an unused spin-off from JamieMythBot

...and another secret one I wont tell you about at all. Except to say there is one!
;January
: start: New Year
;February
: start: A's birthday
;March
;April
: mid: My birthday
;May
: ???: Eurovision
;June
;July
: end: N's birthday
;August
;September
;October
: start: Ig Nobels
: end: Halloween
;November
: end: NovemberFest
;December
: end: Christmas
stuff from 2013...
I love my clock radio. The radio hasn't actually worked in years, but it has dimmers on the (red seven segment display) LEDs, and has the worlds most annoying alarm which, for years, sometimes even managed to wake me up (sleeping is my super power). I may never have shown up to high school on time without it. 

It has done great things over the last few decades. As well as waking me up, it can add "kept time for a foundary" and "annoyed my housemates when I was on holiday" to it's accomplishments

But something broke in the last few weeks, and it's no longer keeping accurate time. 

And because it's the sort of geek I am, I compared it against internet time servers yesterday, and again today. The results are in - it's gaining 2 minutes every 26 hours (or: running at 100.1288% speed)

{{credit{
Also/originally published at: https://www.facebook.com/nemothorx/posts/10151883590803216
}}}
----

Comments/Appendums:

:http://en.wikipedia.org/wiki/Pye_Ltd%2E <-- it is PYE brand btw

:hmm, I can't find a pic of mine online, but their clock radio model numbers appear to be sequential (assuming that 'CR' stands for 'Clock Radio' (and that ECR is Electronic Clock Radio)
:So they're up around 'CR299' now
:Mine is an "ECR 19" 

:/me contemplates pointing a webcam at a collection of clocks, and making a timelapse

My private on-disk TiddlyWiki. See NemoWeb
This site is run by a derivation of TiddlyWiki (now called 'TiddlyWiki classic' called ccTiddly. 
A timeline of thoughts. When did Australia achieve independance? 

1900: Australian constitution became law (9th of July) in the British Parliament, though the law didn't take effect till 1901 - http://en.wikipedia.org/wiki/Constitution_of_Australia
1901: recognised as a country, constitution came into effect. http://en.wikipedia.org/wiki/Federation_of_Australia
1910: Australia got it's own pound http://en.wikipedia.org/wiki/Australian_pound (it was locked to the Pound Sterling by Australian policy till 1929, and replaced by the decimal dollar in 1966)
1927: dominions have equal status to the UK (ie, created the commonwealth) (1926 Imperial Conference, Balfour Declaration 1926 and Royal and Parliamentary Titles Act 1927) - http://en.wikipedia.org/wiki/Sue_v_Hill
1942: Australian laws could contradict UK laws (previously, any contradiction meant the AU law was invalid) - http://en.wikipedia.org/wiki/Statute_of_Westminster_Adoption_Act_1942
1949: the concept of "citizen of Australia" came about (but still said "british subject") - http://en.wikipedia.org/wiki/Australian_nationality_law
1953: legally recognising the "Australian flag" - http://en.wikipedia.org/wiki/Flag_of_Australia
1970 (July): Perth Mint ceased to be under the jurisdiction of Great Britain (became a statutory authority of the Govt of WA)
1984 (April): Australia gets its own National Anthem.
1984 (November): Australian citizens no longer also "british subject") (see Australian_nationality_law again)
1986: removed ability of UK to alter Australian constitution, or overrule Australian courts - http://en.wikipedia.org/wiki/Australia_Act_1986
1999: ruling regarding dual citizens sitting in Parliament - they cannot. Ruling based in part from the independence implied in the Australia Act. https://en.wikipedia.org/wiki/Sue_v_Hill#Consequences

> Soon afterwards, however, in Shaw (2003),[19] the whole Court (including Kirby) took a more comprehensive view: that the Australia Act in its two versions, together with the State request and consent legislation, amounted to establishing Australian independence at the date when the Australia Act (Cth) came into operation, 3 March 1986.
> — [[http://en.wikipedia.org/wiki/Australia_Act_1986#The_Act_and_Australian_independence]]
mobile phones, I've had a few. 

Here is some history, and some future thoughts... 

* 199? - several nokias that I may try and remember and get details of later... 
* 2004 - Nokia 6230 - http://en.wikipedia.org/wiki/Nokia_6230
* 2007? - Nokia 6500 Classic - http://en.wikipedia.org/wiki/Nokia_6500_classic
* 2009 - iPhone 3gs
* 2011 - iPhone 4s - http://en.wikipedia.org/wiki/IPhone_4S

Ideal:
* For a keypad phone - the 6230 was just about perfect. I'll have another. 
* For a touchscreen smartphone, IMHO the dimensions of the 6500Classic were pretty great - just need to reskin it as touchscreen
** Another way of saying: half way between an iPhone 4s and a 7th generation iPod nano (2012)
*** http://en.wikipedia.org/wiki/IPod_Nano#Seventh_generation

Some Numbers: 
| !Device | !Height (mm) | !Width (mm) | !Depth (mm) | !volume | !Weight (g) |
| Poker cards (B8) | 89 | 64 | xx | | xx |
| Bridge cards | 89 | 57 | xx | | xx |
| Original iPod (2001) | 102 | 61.8 | 19.9 | 125.5cc | 185g |
| 6500 classic | 109.8 | 45 | 9.5 | 47cc | 94g |
| iPhone 4gs | 115.2 | 58.6 | 9.3 | 63cc | 140g |
| iPod Nano 7th Gen | 76.5 | 39.6 | 5.4 | 16cc | 31g |
| average of iphone and ipod | 95.85 | 49.1 | 7.35 | 39.5 | 85.5 |

Let's say that "100x50x10" would be nice then :)
* if 100x50 is the device at maximum, then the screen may be as much as... say (5mm top, 10mm bottom (button), and 1mm side bezel) 85x48mm. This maths out to a diagonal of 97.6mm, which is 3.8 inches. This compares well with the 3.5inch original iPhone (for marketing purposes?), and is 50cc (compares well with my 6500 classic baseline)

btw, gsmarena search for 100x50x14 max, with any touchscreen. It's pretty slim pickings. 

http://www.gsmarena.com/results.php3?sName=&idMaker=0&idAvailability=0&YearAnnounced=0&nPriceLow=0&nPriceHigh=0&idCurrency=0&idFormFactor=0&idSIMType=0&idDualSIM=0&idQwerty=0&HeightMax=100&WidthMax=50&ThicknessMax=14&WeightMax=0&idOS=0&idOSVersion=0&idOSWhen=0&nminCPUMHz=0&nCPUCores=0&nminRAMMB=0&nminInternalStorageMB=0&idExpansionCard=0&idDisplay=0&nminDisplayX=0&nminDisplayY=0&nmaxDisplayX=0&nmaxDisplayY=0&fminDisplaySize=0&fmaxDisplaySize=0&nPixelDensity=0&idDisplayTech=0&idTouchscreen=1&idAccelerometer=0&idGyro=0&idCompass=0&id35mm=0&idCamera=0&idCameraFlash=0&idVideoRecorder=0&idSecondaryCamera=0&idGPS=0&idWLAN=0&idNFC=0&bEDGE=0&bGPRS=0&idBluetooth=0&bIR=0&bEmail=0&bWAP=0&bJava=0&idRadio=0&bMMS=0&idRingtones=0&sColor=&nBatteryCapacity=0&StandBy=0&TalkTime=0&sFreeText=

Even 105x55x12 is pretty sparse, though bumping to 14mm improves a lot, most even then are quite old... :(
http://www.gsmarena.com/results.php3?sName=&idMaker=0&idAvailability=0&YearAnnounced=0&nPriceLow=0&nPriceHigh=0&idCurrency=0&idFormFactor=0&idSIMType=0&idDualSIM=0&idQwerty=0&HeightMax=105&WidthMax=55&ThicknessMax=12&WeightMax=0&idOS=0&idOSVersion=0&idOSWhen=0&nminCPUMHz=0&nCPUCores=0&nminRAMMB=0&nminInternalStorageMB=0&idExpansionCard=0&idDisplay=0&nminDisplayX=0&nminDisplayY=0&nmaxDisplayX=0&nmaxDisplayY=0&fminDisplaySize=0&fmaxDisplaySize=0&nPixelDensity=0&idDisplayTech=0&idTouchscreen=1&idAccelerometer=0&idGyro=0&idCompass=0&id35mm=0&idCamera=0&idCameraFlash=0&idVideoRecorder=0&idSecondaryCamera=0&idGPS=0&idWLAN=0&idNFC=0&bEDGE=0&bGPRS=0&idBluetooth=0&bIR=0&bEmail=0&bWAP=0&bJava=0&idRadio=0&bMMS=0&idRingtones=0&sColor=&nBatteryCapacity=0&StandBy=0&TalkTime=0&sFreeText=

Google's Project Ara looks promising, with its "Mini" frame size aiming for 45 x 118 x 9.7 mm (ie, only ~1cm taller than the 6500classic. Same width! :)
http://en.wikipedia.org/wiki/Project_Ara

This concept mockup of a next-gen Apple Remote would be lovely! (120x40.8x7.2 = 35.2cc)
http://www.appletvhacks.net/2014/03/18/new-apple-tv-4-concept-touch-based-remote/#.VfDzv3U4Z4s
29 Aug 2014
* 18 days after Robin Williams' death from depression by suicide. 

People say suicide is taking the easy way out. It's not. Suicide is the hardest choice someone ever makes. 

[work in progress]
5 books to be stuck on the proverbial desert island with... 

* Catch-22 - Heller
* Hitchhiker's Trilogy - Adams (it's bound in a single volume, so it's fair game right? ;)
* Winter's Tale - Helprin
* Trouble for Trumpets - Cross
* Chaos (or Genius?) - Gleick
What could it celebrate?

* 20 April 1770 - Captain Cook first sighted the Australian continent
* 29th April 1770 - Cook first landed
* 22 August 1770 - Cook claimed the continent for Britain
* 18 January 1788 - the first fleet arrived in Botony Bay
* 26 January 1788 - the first fleet relocated to Port Jackson and permanent settlement began
* 9 July 1900 - Australian Constitution enshrined into law (British law)
* 1 January 1901 - Federation of the colonies into the country of Australia (Australian Constitution came into effect)
* 3 March 1986 - Full Independence from the UK (ignoring the conflict of interest of a shared head of state)

I suggest that 26 January is not "Australia" day at all, but merely Sydney Day, and that "Australia" day should be a date that reflects significance for the whole country of Australia. Thus, 9 July, 1 Jan or 3 March are, IMHO, the prime contenders. Everything prior to that related to European discovery and colonisation of the continent, rather than the creation of the country.