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

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

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

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

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

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

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

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#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 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 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:0 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 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding: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 0;}
.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 0 0 0.5em;}
.tab {margin:0 0 0 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 0 14em;}

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

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

.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:0 0.25em; padding:0 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 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin: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;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding: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;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<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>>
/***
|''Name:''|ImageMacroPlugin|
|''Description:''| macro to create an image using a tiddler field |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/ImageMacroPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ImageMacroPlugin/ |
|''Version:''|0.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This macro was created to assist including images in a tiddler view template, where the source 
of an image is defined by a tiddler field:

<<image "http://tiddlywiki.com/fractalveg.jpg">>

<<image "http://tiddlywiki.com/fractalveg.jpg">>

<<image "@image">>

<<image @image>>

!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global config */
if (!version.extensions.ImageMacroPlugin) {
    version.extensions.ImageMacroPlugin = {installed: true};

	config.macros.image = {};
	config.macros.image.handler = function(place, macroName, params, wikifier, paramString,tiddler) {
        
        var value = params[0].match(/^@/) ? store.getValue(tiddler, params[0].substring(1))
			: value = params[0];

		var e = createTiddlyElement(place, 'img', null, null);
		e.setAttribute('src', value);
	}
}
//}}}
Manifestopheles
|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Wide Image: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='wideImageSlide'>
        <div class='image viewer' macro="imagezoom @image"></div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Wide Image Slide: <span macro="view title"></span></h2>
<div class='editSlide wideImageSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image"></div>
</div>
[[EditToolbar]]
<!--}}}-->

!StyleSheet
/*{{{*/
.wideImageSlide {
    font-size: 2em;
    text-align: left;
    background-color: #E8E8E8;
    height: 100%;
    min-height: 400px;
}

.wideImageSlide .image {
    padding: 0;
    margin: 0 auto;
}

.wideImageSlide .image img {
    width: 100%;
    border: none;
    padding: 0;
    margin: 0;
}
/*}}}*/
/***
|''Name:''|DiffFormatterPlugin|
|''Description:''|Extension of TiddlyWiki syntax to support Diff text formatting|
|''Author:''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Source:''|http://www.martinswiki.com/#DiffFormatterPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/DiffFormatterPlugin.js |
|''Version:''|0.0.3|
|''Date:''|Sep 11, 2009|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.1.0|

This is an early release of the DiffFormatterPlugin, which extends the TiddlyWiki syntax to support Diff
text formatting.

The Diff formatter is different from the other formatters in that Tiddlers are not required to be
tagged: instead the Diff format adds formatting that augments TiddlyWiki's format.

The Diff formatter adds the following:
# ^+ for added
# ^- for removed
# ^"""@@ """, """--- """ and """+++ """ for special markers

Please report any defects you find at http://groups.google.co.uk/group/TiddlyWikiDev
!StyleSheet
.viewer .removed { background: #fdd; }
.viewer .added { background: #dfd; }
!Code
***/
//{{{
// Ensure that the DiffFormatterPlugin is only installed once.
if(!version.extensions.DiffFormatterPlugin) {
version.extensions.DiffFormatterPlugin = {installed:true};

if(version.major < 2 || (version.major == 2 && version.minor < 1)) {
	alertAndThrow('DiffFormatterPlugin requires TiddlyWiki 2.1 or later.');
}

diffFormatter = {}; // 'namespace' for local functions

diffFormatter.init = function() {
	var stylesheet = store.getTiddlerText(tiddler.title + "##StyleSheet");
	if(stylesheet) { // check necessary because it happens more than once for some reason
		config.shadowTiddlers["StyleSheetDiffFormatter"] = stylesheet;
		store.addNotification("StyleSheetDiffFormatter", refreshStyles);
	}
};

diffFormatter.added = {
	name: 'diffAdded',
	match: '^\\+',
	termRegExp: /(\n)/mg,
	handler: function(w)
	{
		var e = createTiddlyElement(w.output,'span',null,'added');
		w.subWikifyTerm(e,this.termRegExp);
		createTiddlyElement(w.output,'br');
	}
};

diffFormatter.removed = {
	name: 'diffRemoved',
	match: '^-',
	termRegExp: /(\n)/mg,
	handler: function(w)
	{
		var e = createTiddlyElement(w.output,'span',null,'removed');
		w.subWikifyTerm(e,this.termRegExp);
		createTiddlyElement(w.output,'br');
	}
};

diffFormatter.charDiff = {
	name: 'diffChars',
	match: '^(?:@@|[+-]{3}) ',
	lookaheadRegExp: /^(?:@@|[+-]{3}) .*\n/mg,
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
};

// add new formatters
diffFormatter.init();
config.formatters.push(diffFormatter.added);
config.formatters.push(diffFormatter.removed);

diffFormatter.replaceFormatter = function()
{
	for(var i=0; i<config.formatters.length; i++) {
		if(config.formatters[i].name == 'characterFormat') {
			config.formatters.splice(i,0,diffFormatter.charDiff);
			break;
		}
	}
};
diffFormatter.replaceFormatter();

}// end of 'install only once'
//}}}
Background: #fff
Foreground: #000

PrimaryPale: #e8e8e8
PrimaryLight: #747474
PrimaryMid: #333
PrimaryDark: #111

SecondaryPale: #f8f8f8
SecondaryLight: #dddddd
SecondaryMid: #5B6D6E
SecondaryDark: #000

TertiaryPale: #e8e8e8
TertiaryLight: #dddddd
TertiaryMid: #404040
TertiaryDark: #000

Error: #faa

SelectedPale: #dafaff
SelectedLight: #459BF9
SelectedDark: #07f

TiddlySlidyLight: #50a0fc
TiddlySlidyMid: #2d00ff
TiddlySlidyDark: #0069dd
<!--{{{-->
<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='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
[[ViewToolbar]]
<!--}}}-->

|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Four Images: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='fourImagesSlide'>
        <div class='title viewer' macro='view title wikified'></div>
        <div class='subtitle viewer' macro='view subtitle wikified'></div>
        <div class='boxes'>
            <div class='box'>
                <div class='caption viewer' macro='view caption wikified'></div>
                <div class='image viewer' macro="imagezoom @image"></div>
            </div>
            <div class='box'>
                <div class='caption viewer' macro='view caption2 wikified'></div>
                <div class='image viewer' macro="imagezoom @image2"></div>
            </div>
            <div class='box'>
                <div class='caption viewer' macro='view caption3 wikified'></div>
                <div class='image viewer' macro="imagezoom @image3"></div>
            </div>
            <div class='box'>
                <div class='caption viewer' macro='view caption4 wikified'></div>
                <div class='image viewer' macro="imagezoom @image4"></div>
            </div>
        </div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Four Images Slide: <span macro="view title"></span></h2>
<div class='editSlide fourImagesSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption1"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image1"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption2"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image2"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption3"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image3"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption4"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image4"></div>
</div>
[[EditToolbar]]
<!--}}}-->

!StyleSheet
/*{{{*/
.fourImagesSlide {
    font-size: 2em;
    text-align: left;
    background-color: #e8e8e8;
    height: 100%;
    min-height: 400px;
}

.fourImagesSlide .title {
    color: #747474;
    font-weight: normal;
    letter-spacing: 0;
    padding-left: 0.5em;
}

.fourImagesSlide .subtitle {
    color: #747474;
    font-weight: normal;
    font-size: 0.8em;
    padding-left: 1em;
}

.fourImagesSlide .boxes {
    padding-left: 2em;
}

.fourImagesSlide .box {
    margin: 2px;
    height: auto;
    width: 22%;
    float: left;
    padding: 1em 0;
    text-align: center;
}

.fourImagesSlide .caption {
    text-align: center;
    font-size: 0.6em;
}

.fourImagesSlide .image img {
    border: 1px solid #fff;
    padding: 0;
    margin: 0;
    width: 90%;
    height: auto; 
}

/*}}}*/
* Knowing is [[Individual]]
* Knowing is [[Belief]]
* Knowing is [[Transcendent]]
* Knowing follows [[Learning]]
* Built [[Manifestopheles|mdescript]] to Play
*[[Manifestopheles]]
*[[Who]]
*[[What]]
*[[Background]]
*[[Open Source]]
*[[Problem]]
*[[Solution]]
*[[Play]]
*[[Techniques]]
*[[Challenge]]
/***
|''Name:''|ThemedTiddlerPlugin |
|''Description:''|Per-Tiddler Mini-Themes |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/ThemedTiddlerPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ThemedTiddlerPlugin/ |
|''Version:''|0.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
The extended field "theme" is used to reference a tiddler containing a "mini-theme"

A mini-theme is a tiddler containing a [[ViewTemplate]], [[EditTemplate]] and [[StyleSheet]] sections which are applied when the tiddler is displayed. 

In addition, a CSS class of the theme name is added to the tiddler which may be useful when writing a mini-theme [[StyleSheet]]. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global Story, store, setStylesheet, addClass */
if (!version.extensions.ThemedTiddlerPlugin) {
    version.extensions.ThemedTiddlerPlugin = {installed: true};

    Story.prototype.__chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler;
    Story.prototype.chooseTemplateForTiddler = function (title, n)
    {
        // translate number into template name
        var template = ["ViewTemplate", "EditTemplate"][n ? n - 1 : 0];

        var tiddler = store.getTiddler(title);

        if (tiddler) {
            var theme = tiddler.fields.theme;
            if (theme) {

                // assert stylesheet
                var style = store.getTiddlerText(theme + '##StyleSheet');
                if (style) {
                    setStylesheet(style, theme);
                }

                // return theme template
                var slice = theme + '##' + template;
                if (store.getTiddlerText(slice)) {
                    return slice;
                }
            }
        }

        // default template
        return this.__chooseTemplateForTiddler.apply(this, arguments);
    };

    // assert theme name as a class on the tiddler
    Story.prototype.__refreshTiddler = Story.prototype.refreshTiddler;
    Story.prototype.refreshTiddler = function (title, template, force, customFields, defaultText)
    {
        var tiddlerElem = this.__refreshTiddler.apply(this, arguments);
        addClass(tiddlerElem, store.getTiddler(title).fields.theme);
        return tiddlerElem;
    };
}
//}}}
The self taught.

Those that learn through independent discovery, using their access to tools to confirm and expand the information they have found.

Open access to lots of information is a good thing.
/%
!info
|Name|CheckboxToggleTag|
|Source|http://www.TiddlyTools.com/#CheckboxToggleTag|
|Version|1.3.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|toggle between two tag values using an HTML checkbox (no plugins)|
Usage:
<<<
{{{
in tiddler content:
   <<tiddler CheckboxToggleTag with: tag1 tag2 TiddlerName>> label
in ViewTemplate or EditTemplate:
   <span macro='CheckboxToggleTag with: tag1 tag2 TiddlerName'></span> label
}}}
where:
*''tag1'' is the tag to use when the checkbox is set
*''tag2'' //(optional)// is the tag to use when the checkbox is cleared (default=remove ''tag1'')
*''~TiddlerName'' //(optional)// is the tiddler to be tagged (default=current tiddler)
*''label'' //(optional)// is any text you want to display next to the checkbox
//note: to specify a ''~TiddlerName'' while omitting ''tag2'', use {{{""}}} (empty quotes) as a placeholder for ''tag2''//
<<<
Examples:
<<<
{{{
<<tiddler CheckboxToggleTag with: sometag>> set/clear 'sometag'
<<tiddler CheckboxToggleTag with: tagA tagB>> toggle tagA (checked) and tagB (unchecked)
}}}
<<tiddler CheckboxToggleTag with: sometag>> set/clear 'sometag'
<<tiddler CheckboxToggleTag with: tagA tagB>> toggle tagA (checked) and tagB (unchecked)
<<<
Notes:
<<<
*Clicking a checkbox immediately changes the corresponding tag value in the tiddler. This can, in some cases, trigger additional 'side-effect' processing, such as refreshing of page elements, or autosaving of the document (if that option is enabled).
*If you are currently editing the tiddler being tagged, any //unsaved// changes you have made to the contents of the ''tags'' input field will be discarded when the checkbox is clicked.
<<<
!end info
!show
<html><input type="checkbox" onclick="
	store.suspendNotifications();
	var tid=this.getAttribute('tid');
	var ontag=this.getAttribute('onTag');
	var offtag=this.getAttribute('offTag');
	if (ontag && ontag.length)  store.setTiddlerTag(tid,this.checked,ontag);
	if (offtag && offtag.length) store.setTiddlerTag(tid,!this.checked,offtag);

    // update tiddler ..
    config.extensions.MainMenuUpdate(tid, this.checked?tid:null);

	store.resumeNotifications();
	store.notify(tid,true);
	var here=story.findContainingTiddler(this);
	if (here) { /* refresh current tiddler */
		var title=here.getAttribute('tiddler');
		var template=story.chooseTemplateForTiddler(title,story.isDirty(title)?2:1);
		story.refreshTiddler(title,template,true);
	}
	return false;
"><nowiki></html><<tiddler {{
	var tid="$3";
	if (tid=="$"+"3") {
		var here=story.findContainingTiddler(place);
		if (here) tid=here.getAttribute('tiddler');
	}
	if (store.tiddlerExists(tid)) {
		var c=place.lastChild.firstChild;
		c.setAttribute('onTag','$1');
		c.setAttribute('offTag','$2'!='$'+'2'&&'$2'!='undefined'?'$2':'');
		c.setAttribute('tid',tid);
		c.checked=store.getTiddler(tid).isTagged(c.getAttribute('onTag'));
	}
'';}}>>
!end show

%/<<tiddler {{'CheckboxToggleTag##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]]>>
http://tiddlyslidy.osmosoft.com
/***
|''Name:''|MainMenuOrderPlugin|
|''Description:''|MainMenu reorderable using drag and drop |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/MainMenuOrderPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/MainMenuOrderPlugin/ |
|''Version:''|0.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin is Very much the subject of work in progress, has no automatic tests, 
and has only tried in Safari and Firefox.
The DragSort plugin is very buggy, may be replaced with jquery.ui "sortable".
The MainMenu currently must be an unordered bullet list.
It is planned to support nested lists in a later version.
Attach it to the page template as follows:
{{{
<div id='mainMenu' macro='MainMenuOrder'></div>
}}}
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global document config jQuery */
if (!version.extensions.MainMenuOrderPlugin) {
    version.extensions.MainMenuOrderPlugin = {installed: true};

/*
    jQuery List DragSort v0.3.8 pre-release
    Website: http://dragsort.codeplex.com/
    License: http://dragsort.codeplex.com/license
*/
(function($) {

    $.fn.dragsort = function(options) {
        var opts = $.extend({}, $.fn.dragsort.defaults, options);
        var lists = new Array();
        var list = null, lastPos = null;

        this.each(function(i, cont) {

            var newList = {
                draggedItem: null,
                placeHolderItem: null,
                pos: null,
                offset: null,
                offsetLimit: null,
                container: cont,

                init: function() {
                    $(this.container).attr("listIdx", i).find(opts.dragSelector).css("cursor", "move").mousedown(this.grabItem);
                },

                grabItem: function(e) {
                    var target = e.srcElement || e.target;
                    if (e.button == 2 || target.tagName == "INPUT" || target.tagName == "A" && target.getAttribute("href") != null)
                        return;
                    
                    if (list != null && list.draggedItem != null)
                        list.dropItem();

                    $(this).css("cursor", "move");

                    list = lists[$(this).parents("*[listIdx]").attr("listIdx")];
                    list.draggedItem = $(this).is(opts.itemSelector) ? $(this) : $(this).closest(opts.itemSelector);
                    list.offset = list.draggedItem.offset();
                    list.offset.top = e.pageY - list.offset.top;
                    list.offset.left = e.pageX - list.offset.left;

                    var containerHeight = $(list.container).outerHeight() == 0 ? Math.max(1, Math.round(0.5 + $(list.container).children(opts.itemSelector).size() * list.draggedItem.outerWidth() / $(list.container).outerWidth())) * list.draggedItem.outerHeight() : $(list.container).outerHeight();
                    list.offsetLimit = $(list.container).offset();
                    list.offsetLimit.right = list.offsetLimit.left + $(list.container).outerWidth() - list.draggedItem.outerWidth();
                    list.offsetLimit.bottom = list.offsetLimit.top + containerHeight - list.draggedItem.outerHeight();

                    list.placeHolderItem = list.draggedItem.clone().html(opts.placeHolderTemplate).addClass(opts.placeHolderClass).css("height", list.draggedItem.height()).attr("placeHolder", true);
                    list.draggedItem.after(list.placeHolderItem);
                    list.draggedItem.css({ position: "absolute", opacity: 0.8 });

                    $(lists).each(function(i, l) { l.ensureNotEmpty(); l.buildPositionTable(); });

                    list.setPos(e.pageX, e.pageY);
                    $(document).bind("selectstart", list.stopBubble); //stop ie text selection
                    $(document).bind("mousemove", list.swapItems);
                    $(document).bind("mouseup", list.dropItem);
                    return false; //stop moz text selection
                },

                setPos: function(x, y) {
                    var top = y - this.offset.top;
                    var left = x - this.offset.left;

                    if (!opts.dragBetween) {
                        top = Math.min(this.offsetLimit.bottom, Math.max(top, this.offsetLimit.top));
                        left = Math.min(this.offsetLimit.right, Math.max(left, this.offsetLimit.left));
                    }

                    this.draggedItem.parents().each(function() {
                        if ($(this).css("position") != "static"  && (!$.browser.mozilla || $(this).css("display") != "table")) {
                            var offset = $(this).offset();
                            top -= offset.top;
                            left -= offset.left;
                            return false;
                        }
                    });

                    this.draggedItem.css({ top: top, left: left });
                },

                buildPositionTable: function() {
                    var item = this.draggedItem == null ? null : this.draggedItem.get(0);
                    var pos = new Array();
                    $(this.container).children(opts.itemSelector).each(function(i, elm) {
                        if (elm != item) {
                            var loc = $(elm).offset();
                            loc.right = loc.left + $(elm).width();
                            loc.bottom = loc.top + $(elm).height();
                            loc.elm = elm;
                            pos.push(loc);
                        }
                    });
                    this.pos = pos;
                },

                dropItem: function() {
                    if (list.draggedItem == null)
                        return;

                    $(list.container).find(opts.dragSelector).css("cursor", "move");
                    list.placeHolderItem.before(list.draggedItem);

                    list.draggedItem.css({ position: "", top: "", left: "", opacity: "" });
                    list.placeHolderItem.remove();
                    
                    $("*[emptyPlaceHolder]").remove();

                    $(document).unbind("selectstart", list.stopBubble);
                    $(document).unbind("mousemove", list.swapItems);
                    $(document).unbind("mouseup", list.dropItem);

                    //opts.dragEnd.apply(list.draggedItem);
                    opts.dragEnd();
                    list.draggedItem = null;
                    return false;
                },

                stopBubble: function() { return false; },

                swapItems: function(e) {
                    if (list.draggedItem == null)
                        return false;

                    list.setPos(e.pageX, e.pageY);

                    var ei = list.findPos(e.pageX, e.pageY);
                    var nlist = list;
                    for (var i = 0; ei == -1 && opts.dragBetween && i < lists.length; i++) {
                        ei = lists[i].findPos(e.pageX, e.pageY);
                        nlist = lists[i];
                    }

                    if (ei == -1 || $(nlist.pos[ei].elm).attr("placeHolder"))
                        return false;

                    if (lastPos == null || lastPos.top > list.draggedItem.offset().top || lastPos.left > list.draggedItem.offset().left)
                        $(nlist.pos[ei].elm).before(list.placeHolderItem);
                    else
                        $(nlist.pos[ei].elm).after(list.placeHolderItem);

                    $(lists).each(function(i, l) { l.ensureNotEmpty(); l.buildPositionTable(); });
                    lastPos = list.draggedItem.offset();
                    return false;
                },

                findPos: function(x, y) {
                    for (var i = 0; i < this.pos.length; i++) {
                        if (this.pos[i].left < x && this.pos[i].right > x && this.pos[i].top < y && this.pos[i].bottom > y)
                            return i;
                    }
                    return -1;
                },
                
                ensureNotEmpty: function() {
                    if (!opts.dragBetween)
                        return;

                    var item = this.draggedItem == null ? null : this.draggedItem.get(0);
                    var emptyPH = null, empty = true;
                    
                    $(this.container).children(opts.itemSelector).each(function(i, elm) {
                        if ($(elm).attr("emptyPlaceHolder"))
                            emptyPH = elm;
                        else if (elm != item)
                            empty = false;
                    });
                    
                    if (empty && emptyPH == null)
                        $(this.container).append(list.placeHolderItem.clone().removeAttr("placeHolder").attr("emptyPlaceHolder", true));
                    else if (!empty && emptyPH != null)
                        $(emptyPH).remove();
                }
            };

            newList.init();
            lists.push(newList);
        });

        return this;
    };

    $.fn.dragsort.defaults = {
        itemSelector: "li",
        dragSelector: "li",
        dragEnd: function() { },
        dragBetween: false,
        placeHolderClass: "placeHolder",
        placeHolderTemplate: "&nbsp;"
    };

})(jQuery);

// core code until TW 2.5.5 is released ..
config.macros.tiddler.transclude = function(wrapper,tiddlerName,args)
{
    var text = store.getTiddlerText(tiddlerName);
    if(!text)
        return;
    var stack = config.macros.tiddler.tiddlerStack;
    if(stack.indexOf(tiddlerName) !== -1)
        return;
    stack.push(tiddlerName);
    try {
        if(typeof args == "string")
            args = args.readBracketedList();
        var n = args ? Math.min(args.length,9) : 0;
        for(var i=0; i<n; i++) {
            var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
            text = text.replace(placeholderRE,args[i]);
        }
        config.macros.tiddler.renderText(wrapper,text,tiddlerName,params);
    } finally {
        stack.pop();
    }
};

(function ($) {
    config.macros.MainMenuOrder = {};
    config.macros.MainMenuOrder.update = function () {
        var text = "";
        $("#mainMenu li a").each(function(i, elm) { 
            text += "*[[" + $(elm).attr('tiddlylink') + "]]\n";
        });
        var t = store.getTiddler("MainMenu");
        if (t.text != text) {
            store.saveTiddler(t.title,t.title,text,t.modifier,t.modified,t.tags,t.fields,true,t.created,t.creator);
            autoSaveChanges();
        }
    };

    config.macros.MainMenuOrder.handler = function (place, macroName, params, wikifier, paramString) {
        config.macros.tiddler.transclude(place, "MainMenu", "");
        $("#mainMenu ul:first").dragsort({ dragEnd: config.macros.MainMenuOrder.update});
        config.macros.MainMenuOrder.refresh();
    };

    config.macros.MainMenuOrder.refresh = function () {
        $('#mainMenu a').removeClass('selected');
        $('.tiddler').each(function () { 
            var title = $(this).attr('tiddler');
            $('#mainMenu a[tiddlylink="' + title + '"]').addClass('selected');
        });
    };

})(jQuery);
}
//}}}
|''PageTemplate''|##PageTemplate|
|''StyleSheet''|##StyleSheet|

!PageTemplate
<!--{{{-->
<div id='header'>
    <p class='siteTitle' refresh='content' tiddler='SiteTitle'></p>
    <div class="modeSwitch" refresh='content' tiddler='ModeSwitch'></div>
</div>
<div id='messageArea'></div>
<div id='sidebar'>
    <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
    <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
</div>
<div id="sections">
    <div id='authorButtons' refresh='content' tiddler='AuthorButtons'></div>
    <div id='mainMenu' macro='MainMenuOrder'></div>
</div>
<div id='displayArea'>
    <div id='tiddlerDisplay'></div>
</div>
<div id='footer'></div>
<!--}}}-->

!StyleSheet
[[StyleSheet]]
/*{{{*/
/*}}}*/
<div class='toolbar' macro='toolbar -cancelTiddler deleteTiddler +saveTiddler'></div>
|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Text Box: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='textBoxSlide'>
        <div class='title viewer' macro='view title wikified'></div>
        <div class='subtitle viewer' macro='view subtitle wikified'></div>
        <div class='textbox viewer' macro='view text wikified'></div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Text Box Slide: <span macro="view title"></span></h2>
<div class='editSlide textBoxSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Text</div><div class="textbox editor" macro="edit text"></div>
</div>
[[EditToolbar]]
<!--}}}-->


!StyleSheet
/*{{{*/
.textBoxSlide {
    font-size: 2em;
    text-align: left;
    background-color: #E8E8E8;
    height: 100%;
    min-height: 400px;
}

.textBoxSlide .title {
    color: #747474;
    font-weight: normal;
    letter-spacing: 0;
    padding-left: 0.5em;
}

.textBoxSlide .subtitle {
    color: #747474;
    font-weight: normal;
    font-size: 0.8em;
    padding-left: 1em;
}

.textBoxSlide .textbox {
    color: #333;
    font-size: 1.2em;
    line-spacing: 1.6em;
    padding: 0 1em;
}

.textBoxSlide ul li {
    padding-left: 0em;
}

.textBoxSlide blockquote {
    border-left:8px solid #999999;
    margin: 1em 2em;
    padding-left: 1em;
}


/*}}}*/
Built via [[Synthesis]].

Software is built through cycles of learning and composition.
<html>
    <div class="knob squeeze"><a href="javascript:story.firstTiddler()" title="First slide"><div>|&#x25c4;</div></a></div>
    <div class="knob"><a href="javascript:story.prevTiddler()" title="Previous slide"><div>&#x25c4;</div></a></div>
    <div class="knob stop"><a href="javascript:story.switchTheme('AuthorMode');" title="Author mode"><div>&#x25a3;</div></a></div>
    <div class="knob help"><a href="#help" title="Help"><div>?</div></a></div>
    <div class="knob"><a href="javascript:story.nextTiddler()" title="Next slide"><div>&#x25ba;</div></a></div>
    <div class="knob squeeze"><a href="javascript:story.lastTiddler()" title="Last slide"><div>&#x25ba;|</div></a></div>
    <div class="contents"><a href="#contents" title="Contents"><span class="current">3</span><span class="spacer">/</span
><span class="total">34</span></a></div>
    <div class="knob fullscreen"><a href="#fullscreen" title="Full screen"><div><div>F</div></div></a></div>
</html>
/***
|''Name:''|DisableWikiLinksPlugin|
|''Description:''|Allows you to disable TiddlyWiki's automatic linking of WikiWords|
|''Author:''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Source:''|http://www.martinswiki.com/#DisableWikiLinksPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/plugins/DisableWikiLinksPlugin.js |
|''Version:''|0.1.3|
|''Date:''|Aug 5, 2006|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.1.0|

|''Disable WikiLinks''|<<option chkDisableWikiLinks>>|

***/

//{{{
// Ensure that the DisableWikiLinksPlugin is only installed once.
if(!version.extensions.DisableWikiLinksPlugin) {
version.extensions.DisableWikiLinksPlugin = {installed:true};

if(version.major < 2 || (version.major == 2 && version.minor < 1))
	{alertAndThrow('DisableWikiLinksPlugin requires TiddlyWiki 2.1 or newer.');}

if (config.options.chkDisableWikiLinks==undefined)
	{config.options.chkDisableWikiLinks = false;}

Tiddler.prototype.autoLinkWikiWords = function()
{
	if(config.options.chkDisableWikiLinks==true)
		{return false;}
	return !this.isTagged('systemConfig') && !this.isTagged('excludeMissing');
};

} // end of 'install only once'
//}}}
* Knowing is [[Individual]] √
* Knowing is [[Belief]]
* Knowing is [[Transcendent]] √
* Knowing follows [[Learning]] √
* Built [[Manifestopheles|mdescript]] to Play
Python + WSGI was choice because I believe it was the right choice. I didn't know this because I had used it before, but because it made emotional appeals to my desire for openness and composition.

The learning device that is the Internet made it possible to use something I didn't know, easily.
/***
|''Name:''|ReadyPlugin|
|''Description:''|Attach a plugin to a tiddler from within a template |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/ReadyPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ReadyPlugin/ |
|''Version:''|0.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin allows the author of a PageTemplate ViewTemplate or EditTemplate to attach one or more plugins to an element with a {{{macro}}} or {{{content}}} attribute. For example, the function {{{config.macros.DemoReady.ready}}} will be called each time the Hello element is refreshed with the following ViewTemplate:
{{{
    <div class='title' macro='view title' ready='readyDemo'></div>
}}}
This behaviour is useful for attaching jQuery effects to a tiddler as they are dynamically added to the story.
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config applyHtmlMacros refreshPageTemplate */
(function ($) {
    version.extensions.ReadyPlugin = {installed: true};

    function assertReady(root) {
        $(root).children(":first[ready]").each(function () {
            var macros = $(this).attr('ready').split(/[, ]/);
            for (var i = 0; i < macros.length; i++) {
                var m = config.macros[macros[i]];
                if (m && m.ready) {
                    m.ready.apply(this, arguments);
                }
            }
            $(this).removeAttr('ready');
        });
    };

    refreshElements = function (root,changeList,depth) {
        if (!depth) {
            assertReady(root);
        }

        // this is fugly but it's hard to hijack a recursive core function
        var nodes = root.childNodes;
        for(var c=0; c<nodes.length; c++) {
            var e = nodes[c], type = null;
            if(e.getAttribute && (e.tagName ? e.tagName != "IFRAME" : true))
                type = e.getAttribute("refresh");
            var refresher = config.refreshers[type];
            var refreshed = false;
            if(refresher != undefined)
                refreshed = refresher(e,changeList);
            if(e.hasChildNodes() && !refreshed)
                refreshElements(e,changeList,true);
        }
    }

})(jQuery);
//}}}
* Statement of Beliefs
* How can we believe it?
* Manifestopheles is a Composition
** Information, in Context
** Expertise, in Context
** Software, in Context
/*jslint onevar: false nomen: false plusplus: false */
/*global console config jQuery createTiddlyButton store story Story createTiddlyDropDown merge */

// In the absence of a HistoryPlugin
var lastSlide = '';

(function ($) {

    // Enable keybindings only when we are in presenter mode.
    Story.prototype._keybindings_switchTheme = Story.prototype.switchTheme;
    Story.prototype.switchTheme = function(theme) {
        this._keybindings_switchTheme.apply(this,arguments);
        if(theme == 'PresenterMode') {
            config.macros.keybindings.enable();
        } else {
            config.macros.keybindings.disable();
        }
    };

	// expose a function for the navigation buttons toggle.
	config.macros.toggleLinearNavigation = function(){
		$('div.slide-bottom a').slideToggle(100);
	};

    var displayTiddler = Story.prototype.displayTiddler;
    Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc) {
        var r = displayTiddler.apply(this, arguments);
        tiddler = (tiddler instanceof Tiddler) ? tiddler : store.fetchTiddler(tiddler);

        // refresh control panel
        refreshElements($('#footer')[0]);

        // update MainMenu
        config.macros.MainMenuOrder.refresh();

        if (tiddler.tags.indexOf('slide') != -1) {
            $('#fullframe').remove();
            $('#contentWrapper').show();
            lastSlide = tiddler.title;
            return r;
        }

        if (!$('#presentation').length) {
            return r;
        }

        $('#contentWrapper').hide();

        $('body').append("<div id='fullframe'></div>");
        $('#slide').clone().appendTo('#fullframe');

        $('#fullframe')
            .css('display', 'block')
            .css('margin', 'auto')
            .css('position', 'absolute')
            .css('z-index', '999')
            .css('top', '0')
            .css('left', '0')
            .css('width', '100%')
            .css('height', Math.max($('#fullframe').height(), $(window).height()))
            .css('background-color', config.macros.imagezoom.color)

            .click(function (e) {
                $('#contentWrapper').show();
                var link = $(e.target).attr("tiddlyLink");
                $('#fullframe').remove();
                story.displayTiddler(null, link || lastSlide);
            });

        return r;
    };


    /*
     *  newSlide button
     *  TBD := replace with selection from master slide thumbnails
     */
    config.macros.newSlide = {};
    config.macros.newSlide.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
        var theme = params[0];
        var title = "New Slide";
        var tip = "Create a new " + theme + " Slide";
        var tag = params[1] || "slide";

        return createTiddlyButton(place, theme, tip, function () {
                var template = theme + "##EditTemplate";
                var tags = [tag];
                var customFields = {
                    'theme': theme
                };
                merge(customFields, config.defaultCustomFields);
                var tiddler = store.createTiddler(title);
                merge(tiddler.fields, customFields);
                merge(tiddler.tags, tags);
                story.displayTiddler(null, title, template, false, null, null, false, place);
                story.focusTiddler(title,'title');
                return false;
            }, 
            null, 
            null, 
            null);
    };

    /*
     *  select Master
     *  TBD := make into a generic plugin which also works in Edit Mode
     */
    config.macros.fieldSelector = {};
    config.macros.fieldSelector.handler = function(place, macroName, params, wikifier, paramString, tiddler) {
        var caption = params[0] || "Select a master slide";
        var field = params[1] || "theme";
        var tag = params[2] || "masterSlide";
        var title = tiddler.title;

        var tagged = store.getTaggedTiddlers(tag);
        var options = [];
        options.push({'caption': caption, 'name': null});
        for (var i=0; i < tagged.length; i++) {
            options.push({'caption': tagged[i].title, 'name': tagged[i].title});
        }

        return createTiddlyDropDown(place, function(ev) {
                var fields = {};
                fields[field] = this[this.selectedIndex].value;
                store.addTiddlerFields(title, fields);
                story.refreshTiddler(title);
                return false;
            }, options, 
            tiddler.fields[field]);
    };

    /*
     *  better CheckboxToggle
     */
    config.macros.toggleTag = {};
    config.macros.toggleTag.handler = function (place, macroName, params, wikifier, paramString, tiddler) {
        var ontag = params[0] || "slide";
        var offtag = params[1] || "notes";
        var caption = params[2] || "";

        var title = tiddler.title;
		var checked = tiddler.isTagged(ontag);

        createTiddlyCheckbox(place, "", checked, function () {
            checked = this.checked;
            store.setTiddlerTag(title, checked, ontag);
            store.setTiddlerTag(title, !checked, offtag);
            config.extensions.MainMenuUpdate(title, checked ? title : null);
            return false;
        });

        var id = story.tiddlerId(title) + "Toggle" + ontag;
        $(place).find('input').attr('id', id);
        $('<label for=' + id + '>' + caption + '</label>').appendTo(place);
        return false;
    };

Story.prototype.onTiddlerMouseOver = function(e)
{
    addClass(this, "mousey");
    return false;
};


})(jQuery);
|''PageTemplate''|##PageTemplate|
|''StyleSheet''|##StyleSheet|

!PageTemplate
<!--{{{-->
<div id='messageArea'></div>
<div id='presentation'>
    <div id='slide'>
        <div id='tiddlerDisplay'>display</div>
    </div>
</div>
<div id='footer'>
    <div class="controls" refresh='content' tiddler='ControlPanel'></div>
</div>

<!--}}}-->

!StyleSheet
[[StyleSheet]]
/*{{{*/

a#backstageShow {
    color: [[ColorPalette::SecondaryPale]];
}

/*}}}*/
<html><a class="button" href="javascript:void(0)" onclick="story.displayTiddlers(null,['NewSlide'])" >New&nbsp;Slide</a></html>
/***
|''Name:''|FadingMessagesPlugin|
|''Description:''|Automatically clear a displayed message after an interval |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/FadingMessagesPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/FadingMessagesPlugin/ |
|''Version:''|0.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
|''Overrides:''|displayMessage|
|''Requires:''|WikifiedMessagesPlugin|
!!Documentation
Displayed messages automatically fade away after a short interval. 
!!Options
|<<option txtFadingMessagesTimeout>>|<<message config.optionsDesc.txtFadingMessagesTimeout>>|
|<<option chkAnimate>>|<<message config.optionsDesc.chkAnimate>>|
!!Code
***/
//{{{
if(!version.extensions.FadingMessagesPlugin) {
version.extensions.FadingMessagesPlugin = {installed:true};

	config.options.txtFadingMessagesTimeout = 5;
	config.optionsDesc.txtFadingMessagesTimeout = "seconds before a displayed message clears itself";

	config.animDurationFade = 900;

	config.extensions.FadingMessages = {
		Fader: function(e,done)
		{
			e.style.overflow = 'hidden';
			e.style.display = 'block';
			var p = [];
			p.push({style: 'display', atEnd: 'none'});
			p.push({style: 'opacity', start: 1, end: 0, template: '%0'});
			p.push({style: 'filter', start: 100, end: 0, template: 'alpha(opacity:%0)'});
			return new Morpher(e,config.animDurationFade,p,done);
		},  
		clearMessageBox: function(e)
		{
			try { removeNode(e); } catch(ex) {}
			var msgArea = document.getElementById("messageArea");
			var n = msgArea.getElementsByTagName('div');
			if(!(n&&n.length)){
				msgArea.style.display = "none";
			}
		},
		fadeMessageBox: function(e)
		{
			var me = config.extensions.FadingMessages;
			if(config.options.chkAnimate && anim){
				anim.startAnimating(new me.Fader(e,me.clearMessageBox));
			}else{
				me.clearMessageBox(e);
			}
		},
		createClearAllButton: function(e)
		{
			return null;
		},
		createClearMessageButton: function(e)
		{
			var me = config.extensions.FadingMessages;
			return createTiddlyButton(createTiddlyElement(e,"span",null,"messageClear"),
				"×","",
				function(){me.clearMessageBox(e);});
		},
		_displayMessage: displayMessage,
		displayMessage: function(text,linkText)
		{
			var me = config.extensions.FadingMessages;
			var e = me._displayMessage(text,linkText);
			if(e){
				window.setTimeout(function(){me.fadeMessageBox(e);},config.options.txtFadingMessagesTimeout*1000);
			}
			return e;
		}
	};

	displayMessage = config.extensions.FadingMessages.displayMessage;
	config.extensions.WikifiedMessages.createClearMessageButton = config.extensions.FadingMessages.createClearMessageButton;
	config.extensions.WikifiedMessages.createClearAllButton = config.extensions.FadingMessages.createClearAllButton;
}
//}}}
<<newSlide TitleMaster "slide">> 

<<newSlide TextBoxMaster "slide">>   

<<newSlide ImageAndTextMaster "slide">> 

<<newSlide SingleImageMaster "slide">> <<newSlide ThreeImagesMaster "slide">> <<newSlide FourImagesMaster "slide">>

<<newSlide WideImageMaster "slide">>  <<newSlide TallImageMaster "slide">>
If you are already familiar with the connotative richness of what I've said, if it is in line with what you've been thinking all along about such things, then you've bought in.

You already believe it.

If not, you believe I'm bullshitting.

Whatever shall we do?
/***
|''Name:''|ImageZoomMacroPlugin|
|''Description:''| macro to create a zoomable image using a tiddler field |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/ImageZoomMacroPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ImageZoomMacroPlugin/ |
|''Version:''|0.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This macro was created to assist including images in a tiddler view template, where the source 
of an image is defined by a tiddler field:

<<imagezoom "http://tiddlywiki.com/fractalveg.jpg">>

<<imagezoom "http://farm1.static.flickr.com/33/65468830_ef7d984ba2_o.jpg">>

<<imagezoom "@image">>

<<imagezoom @image>>

Clicking on the image creates a display containing the full sized image.
Both the image and the fullframe version may be styled using CSS.

!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global config jQuery store window */
(function ($) {
    version.extensions.ImageZoomMacroPlugin = {installed: true};

	config.macros.imagezoom = {};
	config.macros.imagezoom.color = '#000';
	config.macros.imagezoom.handler = function (place, macroName, params, wikifier, paramString, tiddler) {
        
        var src = params[0].match(/^@/) ? store.getValue(tiddler, params[0].substring(1))
			: params[0];

        $(place).append($("<img>")
            .attr("src", src)
            .css('cursor', 'pointer')
            .click(function () { 
            $('body').append("<div id='fullframe'><img src='" + this.src + "'></div>");
            $('#contentWrapper').hide();

            $('#fullframe img')
                .css('display', 'block')
                .css('margin', 'auto');

            $('#fullframe')
                .click(function () {
                    $(this).remove();
                    $('#contentWrapper').show();
                })

                .css('position', 'absolute')
                .css('z-index', '999')
                .css('top', '0')
                .css('left', '0')
                .css('width', '100%')
                .css('height', Math.max($('#fullframe img').height(), $(window).height()))
                .css('background-color', config.macros.imagezoom.color);
        }));
	};
})(jQuery);
//}}}
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|0.7.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/TiddlyWebConfig.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|TiddlyWebAdaptor|
|''Keywords''|serverSide TiddlyWeb|
!Revision History
!!v0.1 (2008-11-30)
* initial release
!!v0.2 (2009-01-15)
* removed obsolete dependencies
!!v0.3 (2009-03-16)
* sync username with server
!!v0.4 (2009-05-23)
* cache list of available login challengers
!!v0.5 (2009-07-10)
* disabled save and delete toolbar commands for unauthorized users
!!v0.6 (2009-08-15)
* disabled edit toolbar command for unauthorized users
!!v0.7 (2009-09-11)
* added revisions toolbar command
!Code
***/
//{{{
if(!config.adaptors.tiddlyweb) {
	throw "Missing dependency: TiddlyWebAdaptor";
}

(function() {

if(window.location.protocol != "file:") {
	config.options.chkAutoSave = true;
}

// initialize configuration
var adaptor = tiddler.getAdaptor();
var host = tiddler.fields["server.host"];
var recipe = tiddler.fields["server.recipe"];
var workspace = recipe ? "recipes/" + recipe : "bags/common";
config.defaultCustomFields = {
	"server.type": tiddler.getServerType(),
	"server.host": host,
	"server.workspace": workspace
};

// modify toolbar commands

config.shadowTiddlers.ToolbarCommands = config.shadowTiddlers.ToolbarCommands.
	replace("closeTiddler ", "revisions closeTiddler ");

config.commands.saveTiddler.isEnabled = function(tiddler) {
	return hasPermission("write", tiddler);
};

config.commands.deleteTiddler.isEnabled = function(tiddler) {
	return hasPermission("delete", tiddler);
};

// hijack isReadOnly to take into account permissions and content type
var _isReadOnly = Tiddler.prototype.isReadOnly;
Tiddler.prototype.isReadOnly = function() {
	var readOnly = _isReadOnly.apply(this, arguments); // global read-only mode
	var type = this.fields["server.content-type"] || ""; // defaults to non-binary
	return readOnly || type != "" || !hasPermission("write", this);
};

var hasPermission = function(type, tiddler) {
	var perms = tiddler.fields["server.permissions"];
	if(perms) {
		return perms.split(", ").contains(type);
	} else {
		return true;
	}
};

// retrieve server info
var statusCallback = function(context, userParams) {
	if(context.serverStatus) {
		// set username
		if(context.serverStatus.username) {
			config.macros.option.propagateOption("txtUserName",
				"value", context.serverStatus.username, "input");
		}
		// retrieve challengers
		if(context.serverStatus.challengers) {
			config.adaptors.tiddlyweb.challengers = context.serverStatus.challengers;
		}
	}
};
adaptor.getStatus({ host: host }, null, statusCallback);

})();
//}}}
|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Text and Image: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='textAndImageSlide'>
        <div class='title viewer' macro='view title wikified'></div>
        <div class='subtitle viewer' macro='view subtitle wikified'></div>
        <div class='boxes'>
            <div class='image viewer' macro="imagezoom @image"></div>
            <div class='textbox viewer' macro='view text wikified'></div>
        </div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Text and Image Slide: <span macro="view title"></span></h2>
<div class='editSlide textAndImageSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image"></div>
    <div class="label">Text</div><div class="textbox editor" macro="edit text"></div>
</div>
[[EditToolbar]]
<!--}}}-->


!StyleSheet
/*{{{*/
.textAndImageSlide {
    font-size: 2em;
    text-align: left;
    background-color: #E8E8E8;
    height: 100%;
    min-height: 400px;
    overflow: hidden;
}

.textAndImageSlide .title {
    color: #747474;
    font-weight: normal;
    letter-spacing: 0;
    padding-left: 0.5em;
}

.textAndImageSlide .subtitle {
    color: #747474;
    font-weight: normal;
    font-size: 0.8em;
    padding-left: 1em;
}

.textAndImageSlide .image {
    margin: 2px;
    padding: 1em;
    height: auto;
    width: 40%;
    float: left;
    text-align: left;
}

.textAndImageSlide .image img {
    border: 1px solid #fff;
    padding: 0;
    margin: 0;
    width: 90%;
    height: auto; 
}

.textAndImageSlide .textbox {
    color: #333;
    padding: 1em;
    width: 45%;
    font-size: 0.8em;
    float: left;
}

.textAndImageSlide ul li {
    padding-left: 0em;
}

.textAndImageSlide blockquote {
    border-left:8px solid #999999;
    margin: 1em 2em;
    padding-left: 1em;
}

/*}}}*/
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.2.0|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {

var adaptor;
adaptor = config.adaptors.tiddlyweb = function() {}; //# set up alias

adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename

// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/status";
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
		null, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.workspaces = [];
	var uriTemplate = "%0/recipes"; // XXX: bags?
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var workspaces = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers%3";
	var params = context.filters ? "?filter=" + context.filters : "";
	if(context.format) {
		params = context.format + params;
	}
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), params]);
	var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.tiddlers = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# N.B.: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var t = tiddlers[i];
			var tiddler = new Tiddler(t.title);
			t.created = Date.convertFromYYYYMMDDHHMM(t.created);
			t.modified = Date.convertFromYYYYMMDDHHMM(t.modified);
			tiddler.assign(t.title, t.text, t.modifier, t.modified, t.tags, t.created, t.fields);
			tiddler.fields["server.type"] = adaptor.serverType;
			tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
			tiddler.fields["server.workspace"] = context.workspace;
			tiddler.fields["server.page.revision"] = t.revision;
			context.tiddlers.push(tiddler);
		}
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/search?q=%1%2";
	var filterString = context.filters ? ";filter=" + context.filters : "";
	var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
	var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
	adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};

// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.revisions = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# N.B.: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var t = tiddlers[i];
			var tiddler = new Tiddler(t.title);
			tiddler.assign(t.title, null, t.modifier, Date.convertFromYYYYMMDDHHMM(t.modified),
				t.tags, Date.convertFromYYYYMMDDHHMM(t.created), t.fields);
			tiddler.fields["server.type"] = adaptor.serverType;
			tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
			tiddler.fields["server.page.revision"] = t.revision;
			tiddler.fields["server.workspace"] = "bags/" + t.bag;
			context.revisions.push(tiddler);
		}
		var sortField = "server.page.revision";
		context.revisions.sort(function(a, b) {
			return a.fields[sortField] < b.fields[sortField] ? 1 :
				(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
		 });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.revision = revision;
	return this.getTiddler(title, context, userParams, callback);
};

// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	if(context.revision) {
		var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
	} else {
		uriTemplate = "%0/%1/%2/tiddlers/%3";
	}
	if(!context.tiddler) {
		context.tiddler = new Tiddler(title);
	}
	context.tiddler.fields["server.type"] = adaptor.serverType;
	context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
	context.tiddler.fields["server.title"] = title; //# required for detecting renames
	context.tiddler.fields["server.workspace"] = context.workspace;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
		context.revision]);
	var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
		{ accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var t = $.evalJSON(responseText); //# N.B.: not an actual tiddler instance
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.tiddler.assign(context.tiddler.title, t.text, t.modifier,
			Date.convertFromYYYYMMDDHHMM(t.modified), t.tags || [],
			Date.convertFromYYYYMMDDHHMM(t.created), context.tiddler.fields); // XXX: merge extended fields!?
		context.tiddler.fields["server.workspace"] = t.bag ? "bags/" + t.bag : "recipes/" + t.recipe; // XXX: bag is always supplied!?
		context.tiddler.fields["server.page.revision"] = t.revision;
		context.tiddler.fields["server.permissions"] = t.permissions.join(", ");
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.responseText = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title;
	context.tiddler = tiddler;
	context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	if(!tiddler.fields["server.title"]) {
		tiddler.fields["server.title"] = tiddler.title; //# required for detecting subsequent renames
	} else if(tiddler.title != tiddler.fields["server.title"]) {
		return this.moveTiddler({ title: tiddler.fields["server.title"] },
			{ title: tiddler.title }, context, userParams, callback);
	}
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": '"' + etag + '"' } : null;
	var payload = {
		title: tiddler.title,
		text: tiddler.text,
		modifier: tiddler.modifier,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	payload = $.toJSON(payload);
	var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.status) {
		context.adaptor.getTiddler(context.tiddler.title, context,
			context.userParams, context.callback);
	} else if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = revisions[0].title;
	var headers = null;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(context.title)]);
	if(workspace.type == "bag") { // generate ETag
		var etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
		headers = { "If-Match": '"' + etag + '"' };
	}
	var payload = $.toJSON(revisions);
	var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers";
	var host = context.host;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name)]);
	var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
		context, null, store, "text/x-tiddlywiki", null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
	var _this = this;
	var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
	var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
	oldTiddler.title = from.title; //# required for original tiddler's ETag
	var _getTiddlerChronicle = function(title, context, userParams, callback) {
		return _this.getTiddlerChronicle(title, context, userParams, callback);
	};
	var _putTiddlerChronicle = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		var revisions = $.evalJSON(context.responseText); // XXX: error handling?
		// change current title while retaining previous location
		for(var i = 0; i < revisions.length; i++) {
			if(!revisions[i].fields.origin) { // N.B.: origin = "<workspace>/<title>"
				revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
			}
			revisions[i].title = to.title;
		}
		// add new revision
		var rev = $.extend({}, revisions[0]);
		rev.title = to.title;
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.revision++;
		rev.created = rev.created.convertToYYYYMMDDHHMM();
		rev.modified = new Date().convertToYYYYMMDDHHMM();
		delete rev.fields.changecount;
		revisions.unshift(rev);
		if(to.workspace) {
			context.workspace = to.workspace;
		} else if(context.workspace.substring(0, 4) != "bags") { // N.B.: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userparams) {
			var rev = "server.page.revision";
			newTiddler.fields[rev] = parseInt(newTiddler.fields[rev], 10) + 1; // XXX: extended fields' values should be strings!?
			newTiddler.fields["server.title"] = to.title;
			_deleteTiddler(context, userparams);
		};
		return _this.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		context.callback = null;
		return _this.deleteTiddler(oldTiddler, context, context.userParams, callback);
	};
	callback = callback || function() {};
	context = this.setContext(context, userParams);
	context.host = context.host || oldTiddler.fields["server.host"];
	context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
	return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};

// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title; // XXX: not required!?
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": '"' + etag + '"' } : null;
	var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
		null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;

	var tiddler = store.getTiddler(title);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");

	var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
	var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;

	var uriTemplate = "%0/diff?rev1=%1";
	if(rev2) {
		uriTemplate += "&rev2=%2";
	}
	if(context.format) {
		uriTemplate += "&format=%3";
	}
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
		adaptor.normalizeTitle(rev2), context.format]);

	if(rev2) {
		var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
			null, null, null, null, true);
	} else {
		var payload = {
			title: tiddler.title,
			text: tiddler.text,
			modifier: tiddler.modifier,
			tags: tiddler.tags,
			fields: $.extend({}, tiddler.fields)
		}; // XXX: missing attributes!?
		payload = $.toJSON(payload);
		req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
			null, payload, adaptor.mimeType, null, null, true);
	}
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.diff = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
	var info = {};
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
	host = this.fullHostName(host);
	var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	info.uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	return info;
};

adaptor.resolveWorkspace = function(workspace) {
	var components = workspace.split("/");
	return {
		type: components[0] == "bags" ? "bag" : "recipe",
		name: components[1] || components[0]
	};
};

adaptor.generateETag = function(workspace, tiddler) {
	var etag = null;
	if(workspace.type == "bag") {
		var revision = tiddler.fields["server.page.revision"];
		if(typeof revision == "undefined") {
			revision = "0";
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
	}
	return etag;
};

adaptor.normalizeTitle = function(title) {
	return encodeURIComponent(title);
};

})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.3
 * source: http://code.google.com/p/jquery-json/
 * license: MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
* Internet by and for [[Autodidacts]]
* Facile [[Breakdowns]] Drug Fix
* Find Meaning
** From [[Connotation]]
** Through [[Synthesis]]
* Information ➤ Learning ➤ Knowledge
<!--{{{-->
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div><div macro='annotations'></div>
<div class="label">Master</div><div class="master editor" macro="edit theme"></div>
<div macro='message views.editor.tagPrompt'></div>
<div class='editor' macro='edit tags'></div>
<div class='editor' macro='edit text'></div>
[[EditToolbar]]
<!--}}}-->
/***
|''Name:''| keybindings |
|''Description:''|Keybindings|
|''Author:''|Phil Hawksworth|
|''Version:''|0.1|
|''Date:''|201001181709|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.4.1|
***/

//{{{

	// create macro object
	config.macros.keybindings = {
		
		enabled: false,
		
		init: function() {	
			config.macros.keybindings.enable();
			jQuery(document).bind('keypress', function(ev){				
				if(config.macros.keybindings.enabled && config.macros.keybindings.keyCodes[ev.which] && config.macros.keybindings.keyCodes[ev.which] !== undefined) {
					config.macros.keybindings.keyCodes[ev.which].call();
				}
			});
		},
		
		// Add a handler function to be invoked by <<keybindings>> 
		// handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		// 	
		// 	// to do: display the options panel for customisation.
		// 	
		// },
		
		// todo: replace this with some namespaced event binding and unbinding.
		enable: function() {
			config.macros.keybindings.enabled = true;
		},
		disable: function() {
			config.macros.keybindings.enabled = false;
		},
		
		
		// some sample functions to invoke.
		forward: function() {
            story.nextTiddler();
		},
		
		back: function() {
            story.prevTiddler();
		}
		
	};
	
	// key mappings
	config.macros.keybindings.keyCodes = {
		32: config.macros.keybindings.forward, 	//space
		46: config.macros.keybindings.forward, 	// .
		44: config.macros.keybindings.back		// ,
	};


//}}}
|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Single Image: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='singleImageSlide'>
        <div class='title viewer' macro='view title wikified'></div>
        <div class='subtitle viewer' macro='view subtitle wikified'></div>
        <div class='image viewer' macro="imagezoom @image"></div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Single Image Slide: <span macro="view title"></span></h2>
<div class='editSlide titleSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Image</div><div class="image editor" macro="edit image"></div>
</div>
[[EditToolbar]]
<!--}}}-->

!StyleSheet
/*{{{*/
.singleImageSlide {
    font-size: 2em;
    text-align: left;
    background-color: #e8e8e8;
    height: 100%;
    min-height: 400px;
}

.singleImageSlide .title {
    color: #747474;
    font-weight: normal;
    letter-spacing: 0;
    padding-left: 0.5em;
}

.singleImageSlide .subtitle {
    color: #747474;
    font-weight: normal;
    font-size: 0.8em;
    padding-left: 1em;
}

.singleImageSlide .image {
    padding: 0;
    margin: 0.5em;
    height: 310px;
    overflow: hidden;
    border: 2px solid #dddddd;
}

.singleImageSlide .image img {
    width: 100%;
    padding: 0;
    margin: 0;
}
/*}}}*/
<<saveChanges "Save">><<themeButton "AuthorMode" "Author" "Author Mode">><<themeButton "PresenterMode" "Present" "Presenter Mode">>
* --Economic--^W ''//Political//''
* Closed: Makes People Dumb
* Open: Makes People Smart
* Linked: Freedom to Choose
<div class='toolbar'><span class="label">Included in the presentation</span><span macro="tiddler CheckboxToggleTag with: slide notes"></span><span macro='toolbar closeTiddler deleteTiddler editTiddler'></span></div>
"to pass beyond the limits of something"

We use knowledge to get past problems. When we //know//, we are able to make choices. Without choice, there is no freedom.
When things don't work like we expect them to, there is a breakdown, which requires "more deliberate mode of action", one in which we make an effort to learn.

Computers and the internet:
* break a lot
* do it in ways where recovering from the breakdown is full of information
/***
|''Name:''|ThemeButtonPlugin|
|''Description:''|Macro to provide a button to switch to a named theme |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/ThemeButtonPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ThemeButtonPlugin/ |
|''Version:''|0.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
Macro to provide a theme switch button, used as follows:

<<themeButton DefaultTheme>> {{{<<themeButton DefaultTheme>>}}}

<<themeButton DarkTheme "Dark Theme">> {{{<<themeButton DarkTheme "Dark Theme">>}}}

<<themeButton DarkTheme "Dark Theme (Again)" "switch to the Dark Theme">> {{{<<themeButton DarkTheme "Dark Theme (Again)" "switch to the Dark Theme">>}}}

A class of "selected" is provided for styling the selected button as follows:

!!StyleSheet
{{{
.themeButton.selected { 
    border: 5px solid red;
}
}}}

!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config story createTiddlyButton createTiddlyElement addClass */
if (!version.extensions.ThemeButtonPlugin) {
    version.extensions.ThemeButtonPlugin = {installed: true};

    config.macros.themeButton = {
        label: "Switch Theme",
        prompt: "switch the theme"
    };

    config.macros.themeButton.handler = function (place, macroName, params) {
        var theme = params[0];
        var btn = createTiddlyButton(place, params[1] || this.label, params[2] || this.prompt, 
            function (ev) {
                story.switchTheme(theme);
                jQuery('.themeButton').removeClass('selected');
                jQuery('.themeButton[theme="' + theme + '"]').addClass('selected');
                return false;
            });
        btn.setAttribute('theme', theme);
        addClass(btn, 'themeButton', theme);
        if (theme === config.options.txtTheme) {
            addClass(btn, 'selected');
        }
    };
}

//}}}
/***
|''Name:''|MainMenuUpdatePlugin|
|''Description:''|Update MainMenu links when a tiddler is added, renamed or removed |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/MainMenuUpdatePlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/MainMenuUpdatePlugin/ |
|''Version:''|0.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin treats the MainMenu as a list of tiddlers, and maintains its contents as tiddlers are saved and deleted from the story:
*Renaming a tiddler, results in the link being changed in the MainMenu.
*Deleting a tiddler mentioned in the MainMenu results in it being removed from the MainMenu.
*Saving a tiddler not mentioned in the MainMenu, causes it to be be added to the end of the MainMenu.
This plugin was developed for TiddlySlidy and has been designed to work with the MainMenuNavigation and MainMenuOrder plugins.
New items added to the MainMenu as a member of an unordered list, so as to work with the MainMenuReorder plugin. This may change in a future version.

!!Options
|<<option txtMainMenuTag>>|<<message config.optionsDesc.txtMainMenuTag>>|

!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global config story store refreshAll autoSaveChanges */
(function ($) {
    version.extensions.MainMenuUpdatePlugin = {installed: true};

    config.options.txtMainMenuTag = "slide";
    config.optionsDesc.txtMainMenuTag = "Tag of items automatically added to the MainMenu";

    config.extensions.MainMenuUpdate = function (title, newTitle) {
        var t = store.getTiddler("MainMenu");
        var text = t.text;
        if (!newTitle) {
            text = text.replace("*[[" + title + "]]\n", "");
        } else {
            if (newTitle !== title) {
                text = text.replace("[[" + title + "]]", "[[" + newTitle + "]]");
            } else if (text.indexOf("[[" + title  + "]]") === -1) {
                text = text + "*[[" + title + "]]\n";
            }
        }
        store.saveTiddler(t.title, t.title, text, t.modifier, t.modified, t.tags, t.fields, true, t.created, t.creator);

        // this should go ..
        story.refreshAllTiddlers(true);
        refreshAll();
        autoSaveChanges();
    };

    // should be possible to remove these hi-jacks
    var saveTiddler = story.saveTiddler;
    story.saveTiddler = function (title, minorUpdate) {
        var newTitle = saveTiddler.apply(this, arguments);
        var tiddler = store.getTiddler(newTitle);
        if (tiddler.tags.indexOf(config.options.txtMainMenuTag) !== -1) {
            config.extensions.MainMenuUpdate(title, newTitle);
        }
        return newTitle;
    };

    var removeTiddler = store.removeTiddler;
    store.removeTiddler = function (title) {
        config.extensions.MainMenuUpdate(title);
        story.closeTiddler(title, true);
        return removeTiddler.apply(store, arguments);
    };

})(jQuery);
//}}}
Grubbing around in information until we believe it is useful and correct. Then we know it.
The harmonics on a piece of information. That which is implied or has the power to inspire sympathetic understandings.
/*{{{*/
#messageArea {
	border:none;
	background: transparent;
}

#messageArea .messageBox {
	border:2px solid [[ColorPalette::SecondaryMid]];
	color:[[ColorPalette::Foreground]];
	background:[[ColorPalette::SecondaryLight]]; 
	width:20em;
	padding:10px;
	margin-top:0px;
	margin-bottom:5px;
	-moz-border-radius:5px;
	-webkit-border-radius:5px;
	filter:alpha(opacity=80);
}

#messageArea .messageText {
	display:block;
	width:15em;
	margin:0;
	padding:0;
}

#messageArea .messageClear {
	display:block;
	float:right;
	width:1em;
}

#messageArea .messageClear a {
	text-decoration:none;
	background-color: transparent;
	color:[[ColorPalette::Foreground]];
}

/*}}}*/
/***
|''Name:''|ThemeSwitchRefreshPlugin|
|''Description:''|Force a refresh on switching a theme, even when the default View or Edit template hasn't been changed |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ThemeSwitchRefreshPlugin |
|''Version:''|0.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
|''Overrides''|Story.prototype.swtichTheme() |
!!Documentation
The core Story.themeSwitch function has an optimization to avoid refreshing the story when the View or Edit templates haven't been altered. This causes issues with plugins which extend the chooseTemplateForTiddler functionality, such as the TaggedTemplateTweak and TaggedTemplatePlugin.
This plugin refreshes the page and story on a theme switch, regardless of the templates defined.
!!Code
***/
//{{{
if(!version.extensions.ThemeSwitchRefreshPlugin) {
version.extensions.ThemeSwitchRefreshPlugin = {installed:true};

Story.prototype._themeSwitchRefresh_switchTheme = Story.prototype.switchTheme;
Story.prototype.switchTheme = function(theme)
{
	this._themeSwitchRefresh_switchTheme.apply(this,arguments);
	//TBD: be canny to see if the theme contained a View or Edit template and avoid this:
	refreshAll();
	this.refreshAllTiddlers(true);
};
}
//}}}

/***
|''Name:''|MainMenuNavigatorPlugin|
|''Description:''| First/Next/Previous/Last Tiddler from the MainMenu |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/MainMenuNavigatorPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/MainMenuNavigatorPlugin/ |
|''Version:''|0.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
Designed to work with the SinglePageMode, this plugin provides functions and macros which treat
the MainMenu as a list of tiddlers with the "current" tiddler as the first tiddler in the story.

<<firstTiddler>>
<<nextTiddler>>
<<prevTiddler>>
<<lastTiddler>>

!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global console, config, createTiddlyButton store story Story */
(function() {
    version.extensions.MainMenuNavigatorPlugin = {installed: true};

    /*
     *  navigation buttons 
     */
    Story.prototype.firstTiddler = function () {
        var nav = config.extensions.navigation;
        nav.load();
        this.displayTiddler(null, nav.list[0]);
    };

    Story.prototype.lastTiddler = function () {
        var nav = config.extensions.navigation;
        nav.load();
        this.displayTiddler(null, nav.list[nav.list.length - 1]);
    };

    Story.prototype.nextTiddler = function () {
        var nav = config.extensions.navigation;
        nav.load();
        this.displayTiddler(null, nav.relative(1));
    };

    Story.prototype.prevTiddler = function () {
        var nav = config.extensions.navigation;
        nav.load();
        this.displayTiddler(null, nav.relative(-1));
    };

    Story.prototype.firstTitle = function () {
        var place = this.getContainer();
        if (place) {
            return place.firstChild.getAttribute("tiddler");
        }
    };

    /*
     *  plugin
     */
    config.extensions.navigation = {
        list: [],
        parse: function (s) {
            s = s.trim();
            if (!s) {
                return [];
            }
            s = s.replace(/\]\]$/, "");
            s = s.replace(/[\s\*]*\[\[/g, "[[");
            var list = s.split(/\]\]\s*/);
            for (var i = 0; i < list.length; i++) {
                list[i] = list[i].startsWith("[[") ? 
                    list[i].substring(2)
                    : parseInt(list[i], 10);
            }
            return list;
        },

        load: function () {
            this.list = this.parse(store.getTiddler("MainMenu").text);
        },

        relative : function (delta) {
            var title = story.firstTitle();
            var index = this.list.indexOf(title) + delta;
            index = index.clamp(0, this.list.length - 1);
            return this.list[index];
        },

        addButton : function (name) {
            config.macros[name + "Tiddler"] = {
                label : name,
                prompt : "Open the " + name + " Tiddler",
                handler: function (place, macroName, params, wikifier, paramString, tiddler) {
                    createTiddlyButton(place, params[1] || this.label, params[2] || this.prompt, function (ev) {
                        story[name + "Tiddler"]();
                    });
                }
            };
        },

        addButtons : function () {
            this.addButton("first");
            this.addButton("last");
            this.addButton("next");
            this.addButton("prev");
        }
    };

    config.extensions.navigation.addButtons();
})();
//}}}
|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Title: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='titleSlide'>
        <div class='title viewer' macro='view title wikified'></div>
        <div class='subtitle viewer' macro='view subtitle wikified'></div>
        <div class='url viewer' macro='view url wikified'></div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Title Slide: <span macro="view title"></span></h2>
<div class='editSlide titleSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Homepage</div><div class="subtitle editor" macro="edit url"></div>
</div>
[[EditToolbar]]
<!--}}}-->

!StyleSheet
/*{{{*/
.titleSlide {
    font-size: 4em;
    text-align: center;
    background-color: #E8E8E8;
    height: 100%;
    min-height: 400px;
}

.titleSlide .title {
    color: #333;
    font-weight: bolder;
    letter-spacing: -2px;
}

.titleSlide .subtitle {
    color: #747474;
    font-size: 0.4em;
}

.titleSlide .url {
    color: #747474;
    font-size: 0.4em;
    padding-top: 6em;
}
/*}}}*/
* Source + Links = Choose to Believe
* Internet Does That
* Open Source Does That

* But is it Right and Real?
Manifestopheles is an information sharing device that highlights connotative and ancillary associations in an author's work. Exposing unexpected associations can lead to new learnings.

Genius is defined as the manifestation of unexpected, long-distance, hyper-synthesis.
|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Tall Image: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='tallImageSlide'>
        <center><div class='image viewer' macro="imagezoom @image"></div></center>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Tall Image Slide: <span macro="view title"></span></h2>
<div class='editSlide tallImageSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image"></div>
</div>
[[EditToolbar]]
<!--}}}-->

!StyleSheet
/*{{{*/
.tallImageSlide {
    font-size: 2em;
    text-align: left;
    background-color: #E8E8E8;
    height: 100%;
    min-height: 400px;
}

.tallImageSlide .image {
    padding: 0;
    margin: 0;
}

/* 100% height needs JavaScript .. */
.tallImageSlide .image img {
    height: 480px;          
    border: none;
    margin: 0;
    padding: 0;
}
/*}}}*/
[[Manifestopheles]]
/*{{{*/

.controls {
    font-size: 1.2em;
    color: [[ColorPalette::PrimaryMid]];
    background-color: [[ColorPalette::PrimaryPale]];
    border: 2px solid [[ColorPalette::SecondaryLight]];
    width: 600px;
    height: 2em;
    margin: 0 auto 1em auto;
    padding: 1em;
    font-family: Helvetica Neue, Arial, Helvetica, sans-serif;
    text-align: center;
    overflow: hidden;
    -moz-border-radius: 8px;
    -webkit-border-radius: 8px;
    border-radius: 8px;
}

.knob {
    float: left;
    margin: 0;
    border: 2px solid [[ColorPalette::PrimaryPale]];
    background-color: [[ColorPalette::PrimaryPale]];
    font-family: Helvetica, Arial, sans-serif;
    font-size: 1em;
    font-weight: normal;
    width: 1.5em;
    height: 1.5em;
    line-height: 1.5em;
    text-align: center; 
    -moz-border-radius: 1px;
    -webkit-border-radius: 1px;
    border-radius: 1px;
}

.controls a:hover div,
.controls a:hover div div,
.controls .contents a:hover {
    text-decoration: none;
    color: [[ColorPalette::Foreground]];
    background: [[ColorPalette::Background]];
}

.controls a:active div,
.controls a:active div div,
.controls .contents a:active {
    color: [[ColorPalette::Background]];
}

.controls *:focus {
    outline: none;
}

.controls .fullscreen a:hover div,
.controls .fullscreen a:active div {
    text-decoration: none;
    background-color: [[ColorPalette::PrimaryMid]];
    border: 1px solid [[ColorPalette::PrimaryMid]];
}

.controls .fullscreen a:hover div div,
.controls .fullscreen a:active div div {
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
}

.knob div {
    font-weight: bolder;
    color: [[ColorPalette::PrimaryPale]];
    background-color: [[ColorPalette::PrimaryLight]];
    -webkit-border-radius: 1em; 
    -moz-border-radius: 1em;
    border-radius: 1em;
    color: [[ColorPalette::Background]];
    background-color: [[ColorPalette::PrimaryDark]];
    -webkit-box-shadow: 2px 2px 3px rgba(135, 139, 144, 0.4);
    -moz-box-shadow: 2px 2px 3px rgba(135, 139, 144, 0.4);
    box-shadow: 2px 2px 3px rgba(135, 139, 144, 0.4);
}

.contents {
    float: left;
    font-size: 0.8em;
    padding: 0.4em 1em 0;
    font-weight: lighter;
}

.contents a {
    padding: 0.3em 1em;
}

.contents .spacer {
    padding-left: 0.3em;
}

.squeeze {
    letter-spacing: -3px; 
}

.fullscreen {
    float: right;
    background-color: [[ColorPalette::PrimaryPale]];
    margin-top: 0.2em;
}

.fullscreen div {
    border: 1px solid [[ColorPalette::PrimaryMid]];
    background-color: [[ColorPalette::PrimaryPale]];
    width: 1em;
    height: 1em;
    -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    border-radius: 2px;
}

.fullscreen div div {
    text-indent: -300px;
    overflow: hidden;
    background-color: [[ColorPalette::PrimaryMid]];
    border: 1px solid [[ColorPalette::PrimaryMid]];
    display: block;
    float: left;
    width: 50%;
    height: 50%;
}


/*}}}*/
* Sourcecode is Information
* Software is [[Synthetic]]
* Software Created by [[Autodidacts]]
* On the Internet
* Open ➤ Can Learn from It
jQuery inheres a set of beliefs about how things should be. The technical reasons are not the driving force in deciding to use it. What are is its coolness and the coolness of the people already associated with it. By choosing it I'm saying, "I want to believe like these people".
* [[TiddlyWeb]] with Python + [[WSGI]]
* [[jQuery]] + DOM + CSS
* Click to Learn
* @Osmosoft building TiddlyWeb
* Socialtext, [[Blue Oxen]]
* [[Hypertext]] will Save
/***
|''Name:''|BackstageTiddlersPlugin|
|''Description:''|Adds a backstage panel allowing easy access to all tiddlers|
|''Author:''|JeremyRuston|
|''Source:''|http://www.osmosoft.com/#BackstageTiddlersPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/JeremyRuston/plugins/BackstageTiddlersPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Feb 28, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''~CoreVersion:''|2.3|

***/

//{{{
if(!version.extensions.BackstageTiddlersPlugin) {

version.extensions.BackstageTiddlersPlugin = {installed:true};

config.tasks.tiddlers = {
	text: "tiddlers",
	tooltip: "Access the raw tiddlers",
	content: "<<tabs txtMainTab 'Timeline' 'Timeline' TabTimeline 'All' 'All tiddlers' TabAll 'Tags' 'All tags' TabTags 'More' 'More lists' TabMore>>"};
config.backstageTasks.push("tiddlers");

} //# end of 'install only once'
//}}}
/***
|''Name:''|WikifiedMessagesPlugin|
|''Description:''|Wikify displayMessage text  |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/WikifiedMessagesPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/WikifiedMessagesPlugin/ |
|''Version:''|0.4|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
A plugin to replace the core displayMessage function with a version which wikifies the message text.
The construction of the [close] single message and [close all] buttons has been seperated to be overrideable and the created message div is returned by displayMessage, for extensibility by other plugins.
!!Code
***/
//{{{
if(!version.extensions.WikifiedMessagesPlugin) {
version.extensions.WikifiedMessagesPlugin = {installed:true};

	if(!config.extensions){
		config.extensions = {};
	}

	config.extensions.WikifiedMessages = {

		createClearAllButton: function(msgArea)
		{
			return (msgArea.hasChildNodes())? null :
				createTiddlyButton(createTiddlyElement(msgArea,"div",null,"messageToolbar"),
					config.messages.messageClose.text,
					config.messages.messageClose.tooltip,
					clearMessage);
		},
		createClearMessageButton: function(e)
		{
			return null;
		},
		getMessageDiv: function()
		{
			var msgArea = document.getElementById("messageArea");
			var me = config.extensions.WikifiedMessages;
			if(!msgArea){
				return null;
			}
			msgArea.style.display = "block";
			me.createClearAllButton(msgArea);
			e = createTiddlyElement(msgArea,"div",null,"messageBox");
			me.createClearMessageButton(e);
			return e;
		},
		displayMessage: function(text,linkText)
		{
			var e = getMessageDiv();
			if(!e) {
				alert(wikifyPlain(text));
				return null;
			}
			if(linkText) {
				text = "[["+text+"|"+linkText+"]]";
			}
			t = createTiddlyElement(e,"span",null,"messageText");
			t.innerHTML = wikifyStatic(text);
			return e;
		}
	};

	displayMessage = config.extensions.WikifiedMessages.displayMessage;
	getMessageDiv = config.extensions.WikifiedMessages.getMessageDiv;

        // macro, useful for testing
        config.macros.DisplayMessage = {
                handler: function(place,macroName,params,wikifier,paramString,tiddler){
                        displayMessage(paramString);
                }
        };
}
//}}}

|''PageTemplate''|##PageTemplate|
|''StyleSheet''|##StyleSheet|

!PageTemplate
<!--{{{-->
<div id='messageArea'></div>
<div id='presentation'>
    <div id='slide'>
        <div id='tiddlerDisplay'>display</div>
    </div>
</div>
<div id='footer'>
    <div class="controls" refresh='content' tiddler='ControlPanel'></div>
</div>

<!--}}}-->

!StyleSheet
[[StyleSheet]]
/*{{{*/

#messageArea {
    display: none;
}

a#backstageShow {
    color: [[ColorPalette::SecondaryPale]];
}

#presentation .tiddler,
#presentation .viewSlide {
    overflow: scroll;
}

/*}}}*/
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.5|
|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.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.06.12 [2.9.5] corrected 'scroll to top of page' logic in auto-scroll handling
| 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: 5, date: new Date(2008,6,12)};
//}}}
//{{{
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=true;
//}}}
//{{{
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 200ms after animation completes
		var delay=opt.chkAnimate?config.animDuration+200: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;
}
//}}}
//{{{

/*
 *  Theme
 */
config.options.txtTheme = "PresenterMode";
//config.options.txtTheme = "AuthorMode";
//config.options.txtTheme = "TiddlyWikiMode";

/*
 *  Faster fading messages!
 */
config.options.txtFadingMessagesTimeout = 1; 

/*
 *  Disable WikiLinks
 */
config.options.chkDisableWikiLinks = 1;

/*
 *  Animations
 */ 
config.options.chkAnimate = 0;

/*
 *  SinglePagedMode
 */
config.options.chkSinglePageMode = 1; //Display one tiddler at a time
config.options.chkSinglePagePermalink = 1; //Automatically permalink current tiddler
config.options.chkSinglePageKeepFoldedTiddlers = 0; //Don't close tiddlers that are folded
config.options.chkSinglePageKeepEditedTiddlers = 1; //Don't close tiddlers that are being edited
config.options.chkTopOfPageMode = 1; //Open tiddlers at the top of the page
//config.options.chkBottomOfPageMode = 0; //Open tiddlers at the bottom of the page
//config.options.chkSinglePageAutoScroll = 1; //Automatically scroll tiddler into view (if needed)


/*
 *  Lingo
 */
merge(config.macros.newTiddler,{
    label: "new slide",
    prompt: "Create a new slide",
    title: "New Slide",
    accessKey: "N"
});

merge(config.views.wikified,{
    defaultText: "The tiddler '%0' doesn't yet exist. Edit to create it."
});

merge(config.views.editor,{
	themePrompt: "Type a theme for the slide"
});


/*
 *  disable read-only mode for demo
 */
config.options.chkHttpReadOnly = false;
readOnly = false;
showBackstage = true

//}}}
Multi-referential webs of meaning capture the system of information without defined structure, reflecting connections as they are rather than as someone or something thinks they should be.
<<tabs txtTabDetails "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
<<list filter [tag[masterSlide]]>>
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.5.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin 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
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
readOnly = false; //# enable editing over HTTP

(function($) {

var plugin;
plugin = config.extensions.ServerSideSavingPlugin = {};

plugin.locale = {
	saved: "%0 saved successfully",
	saveError: "Error saving %0: %1",
	saveConflict: "Error saving %0: edit conflict",
	deleted: "Removed %0",
	deleteError: "Error removing %0: %1",
	deleteLocalError: "Error removing %0 locally",
	removedNotice: "This tiddler has been deleted.",
	connectionError: "connection could not be established"
};

plugin.sync = function() {
	store.forEachTiddler(function(title, tiddler) {
		var changecount = parseInt(tiddler.fields.changecount, 10);
		if(tiddler.fields.deleted === "true" && changecount === 1) {
			plugin.removeTiddler(tiddler);
		} else if(tiddler.isTouched() && !tiddler.doNotSave() &&
			tiddler.getServerType() && tiddler.fields["server.host"]) {
			delete tiddler.fields.deleted;
			plugin.saveTiddler(tiddler);
		}
	});
};

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

plugin.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;
		}
		plugin.reportSuccess("saved", tiddler);
		store.setDirty(false);
	} else {
		if(context.httpStatus == 412) {
			plugin.reportFailure("saveConflict", tiddler);
		} else {
			plugin.reportFailure("saveError", tiddler, context);
		}
	}
};

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

plugin.removeTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.deleted === "true") {
			store.deleteTiddler(tiddler.title);
		} else {
			plugin.reportFailure("deleteLocalError", tiddler);
		}
		plugin.reportSuccess("deleted", tiddler);
		store.setDirty(false);
	} else {
		plugin.reportFailure("deleteError", tiddler, context);
	}
};

plugin.getTiddlerServerAdaptor = function(tiddler) { // XXX: rename?
	var type = tiddler.fields["server.type"] || config.defaultCustomFields["server.type"];
	return new config.adaptors[type]();
};

plugin.reportSuccess = function(msg, tiddler) {
	displayMessage(plugin.locale[msg].format([tiddler.title]));
};

plugin.reportFailure = function(msg, tiddler, context) {
	context = context || {};
	var desc = context.httpStatus ? context.statusText : plugin.locale.connectionError;
	displayMessage(plugin.locale[msg].format([tiddler.title, desc]));
};

config.macros.saveToWeb = { // XXX: hijack existing sync macro?
	locale: { // TODO: merge with plugin.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
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(window.location.protocol == "file:") {
		_saveChanges.apply(this, arguments);
	} else {
		plugin.sync();
	}
};

// override removeTiddler to flag tiddler as deleted -- XXX: use hijack to preserve compatibility?
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.fields.changecount = "1";
		this.notify(title, true);
		this.setDirty(true);
	}
};

})(jQuery);
//}}}
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.0|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/RevisionsCommandPlugin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/plugins/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.4.2|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.1 (2010-03-04)
* suppressing wikification in diff view
!To Do
* strip server.* fields from revision tiddlers
* resolve naming conflicts
* i18n, l10n
* code sanitizing
* documentation
!Code
***/
//{{{
(function() {

jQuery.twStylesheet(".diff { white-space: pre, font-family: monospace }",
	{ id: "diff" });

var cmd; //# alias
cmd = config.commands.revisions = {
	type: "popup",
	hideShadow: true,
	text: "revisions",
	tooltip: "display tiddler revisions",
	revTooltip: "", // TODO: populate dynamically?
	loadLabel: "loading...",
	loadTooltip: "loading revision list",
	selectLabel: "select",
	selectTooltip: "select revision for comparison",
	selectedLabel: "selected",
	compareLabel: "compare",
	revSuffix: " [rev. #%0]",
	diffSuffix: " [diff: #%0 #%1]",
	dateFormat: "YYYY-0MM-0DD 0hh:0mm",

	handlePopup: function(popup, title) {
		stripSuffix = function(type, title) {
			var str = cmd[type + "Suffix"];
			var i = str.indexOf("%0");
			i = title.indexOf(str.substr(0, i));
			if(i != -1) {
				title = title.substr(0, i);
			}
			return title;
		};
		title = stripSuffix("rev", title);
		title = stripSuffix("diff", title);
		var tiddler = store.getTiddler(title);
		var type = this._getField("server.type", tiddler);
		var adaptor = new config.adaptors[type]();
		var limit = null; // TODO: customizable
		var context = {
			host: this._getField("server.host", tiddler),
			workspace: this._getField("server.workspace", tiddler)
		};
		var loading = createTiddlyButton(popup, cmd.loadLabel, cmd.loadTooltip);
		var params = { popup: popup, loading: loading, origin: title };
		adaptor.getTiddlerRevisionList(title, limit, context, params, this.displayRevisions);
	},

	displayRevisions: function(context, userParams) {
		var callback = function(ev) {
			var e = ev || window.event;
			var revision = resolveTarget(e).getAttribute("revision");
			context.adaptor.getTiddlerRevision(tiddler.title, revision, context,
				userParams, cmd.displayTiddlerRevision);
		};
		removeNode(userParams.loading);
		var table = createTiddlyElement(userParams.popup, "table");
		for(var i = 0; i < context.revisions.length; i++) {
			var tiddler = context.revisions[i];
			var row = createTiddlyElement(table, "tr");
			var timestamp = tiddler.modified.formatString(cmd.dateFormat);
			var revision = tiddler.fields["server.page.revision"];
			var cell = createTiddlyElement(row, "td");
			createTiddlyButton(cell, timestamp, cmd.revTooltip, callback, null,
				null, null, { revision: revision });
			cell = createTiddlyElement(row, "td", null, null, tiddler.modifier);
			cell = createTiddlyElement(row, "td");
			createTiddlyButton(cell, cmd.selectLabel, cmd.selectTooltip,
				cmd.revisionSelected, null, null, null,
				{ index:i, revision: revision, col: 2 });
			cmd.context = context; // XXX: unsafe (singleton)!?
		}
	},

	revisionSelected: function(ev) {
		var e = ev || window.event;
		e.cancelBubble = true;
		if(e.stopPropagation) {
			e.stopPropagation();
		}
		var n = resolveTarget(e);
		var index = n.getAttribute("index");
		var col = n.getAttribute("col");
		while(!index || !col) {
			n = n.parentNode;
			index = n.getAttribute("index");
			col = n.getAttribute("col");
		}
		cmd.revision = n.getAttribute("revision");
		var table = n.parentNode.parentNode.parentNode;
		var rows = table.childNodes;
		for(var i = 0; i < rows.length; i++) {
			var c = rows[i].childNodes[col].firstChild;
			if(i == index) {
				if(c.textContent) {
					c.textContent = cmd.selectedLabel;
				} else {
					c.text = cmd.selectedLabel;
				}
			} else {
				if(c.textContent) {
					c.textContent = cmd.compareLabel;
				} else {
					c.text = cmd.compareLabel;
				}
				c.onclick = cmd.compareSelected;
			}
		}
	},

	compareSelected: function(ev) {
		var e = ev || window.event;
		var n = resolveTarget(e);
		var context = cmd.context;
		context.rev1 = n.getAttribute("revision");
		context.rev2 = cmd.revision;
		context.tiddler = context.revisions[n.getAttribute("index")];
		context.format = "unified";
		context.adaptor.getTiddlerDiff(context.tiddler.title, context,
			context.userParams, cmd.displayTiddlerDiffs);
	},

	displayTiddlerDiffs: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.diffSuffix.format([context.rev1, context.rev2]);
		tiddler.text = '{{diff{\n{{{\n' + context.diff + '\n}}}\n}}}';
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		story.displayTiddler(src, tiddler);
	},

	displayTiddlerRevision: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.revSuffix.format([tiddler.fields["server.page.revision"]]);
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		story.displayTiddler(src, tiddler);
	},

	_getField: function(name, tiddler) {
		return tiddler.fields[name] || config.defaultCustomFields[name];
	}
};

})();
//}}}
TiddlyWeb provides the API on which some URLs sit. We store the templates, CSS and Javascript in there along with the content.

Monospace and no style is used on the text to highlight that the words are the thing.

[[jQuery]] adds the interactivity. Contenteditable is used for editing because it connotes a style. Style means something. Style shows a belief.

TiddlyWeb acts as the host providing the data model, including permissions, and the controller.

Each manifesto and definition is a tiddler. That tiddler is rendered to link up words to definitions. Every manifesto is represented by a recipe which contains one or more bags which provide the dictionary. Each manifesto can use the same dictionary as others, or different ones. Viewing a manifesto with a different dictionary could expose different meaning.

''The goal'': Click and around, see some information, and choose to learn something.

|''ViewTemplate''|##ViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview">Preview Three Images: <span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='threeImagesSlide'>
        <div class='title viewer' macro='view title wikified'></div>
        <div class='subtitle viewer' macro='view subtitle wikified'></div>
        <div class='boxes'>
            <div class='box'>
                <div class='caption viewer' macro='view caption wikified'></div>
                <div class='image viewer' macro="imagezoom @image"></div>
            </div>
            <div class='box'>
                <div class='caption viewer' macro='view caption2 wikified'></div>
                <div class='image viewer' macro="imagezoom @image2"></div>
            </div>
            <div class='box'>
                <div class='caption viewer' macro='view caption3 wikified'></div>
                <div class='image viewer' macro="imagezoom @image3"></div>
            </div>
        </div>
    </div>
</div>
[[ViewToolbar]]
<!--}}}-->

!EditTemplate
<!--{{{-->
<h2>Edit Three Images Slide: <span macro="view title"></span></h2>
<div class='editSlide threeImagesSlideEdit'>
    <div class="label">Title</div><div class="title editor" macro="edit title"></div>
    <div class="label">Subtitle</div><div class="subtitle editor" macro="edit subtitle"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption1"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image1"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption2"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image2"></div>
    <div class="label">Caption</div><div class="subtitle editor" macro="edit caption3"></div>
    <div class="label">Image</div><div class="subtitle editor" macro="edit image3"></div>
</div>
[[EditToolbar]]
<!--}}}-->

!StyleSheet
/*{{{*/
.threeImagesSlide {
    font-size: 2em;
    text-align: left;
    background-color: #e8e8e8;
    height: 100%;
    min-height: 400px;
}

.threeImagesSlide .title {
    color: #747474;
    font-weight: normal;
    letter-spacing: 0;
    padding-left: 0.5em;
}

.threeImagesSlide .subtitle {
    color: #747474;
    font-weight: normal;
    font-size: 0.8em;
    padding-left: 1em;
}

.threeImagesSlide .boxes {
    padding-left: 2em;
}

.threeImagesSlide .box {
    margin: 2px;
    height: auto;
    width: 30%;
    float: left;
    padding: 1em 0;
    text-align: center;
}

.threeImagesSlide .caption {
    text-align: center;
    font-size: 0.6em;
}

.threeImagesSlide .image img {
    border: 1px solid #fff;
    padding: 0;
    margin: 0;
    width: 90%;
    height: auto; 
}

/*}}}*/
/*{{{*/

html, body {
	padding: 0;
	margin:0;
    font-family: Helvetica Neue, Arial, Helvetica, sans-serif;
    color: [[ColorPalette::PrimaryLight]];
    background-color: [[ColorPalette::SecondaryPale]];
}

#header {
    height: 4em;
    padding: 1.5em 2em 1.5em 2.6em;
    background-color: [[ColorPalette::PrimaryPale]];
    border: 2px solid [[ColorPalette::SecondaryLight]];
}

#contentWrapper {
    background-color: [[ColorPalette::SecondaryPale]];
}

a#backstageShow {
    color: [[ColorPalette::PrimaryPale]];
}

#header .siteTitle {
    font-family: Georgia, serif;
    font-size: 3em;
    padding: 0em;
    margin: 0em;
}

#header .modeTitle {
    font-size: 1.4em;
    margin-top: 0.5em;
}

#header .modeSwitch {
    float:right;
    margin-top: -2.5em;
}

#sections {
    width: 20%;
    position: absolute;
    left: 0;
    padding: 2em;
}

#sidebar {
    width: 20%;
    padding: 0;
    margin: 0;
    text-align: center;
    font-size: 1em;
    position:absolute; 
    right:3px;
}

#sidebarTabs .tabContents {
    margin: 0 auto;
    text-align: left;
}
#sidebarOptions {
    padding-top:1em;
}
#sidebarOptions a {margin:0; padding:0; display: inline; }
#sidebarOptions input {margin:0.4em 0.5em;}

#sidebarTabs .tabContents {
    width: 15em; 
    overflow: hidden;
    color: [[ColorPalette::SecondaryMid]];
    border: 2px solid [[ColorPalette::PrimaryPale]];
    background-color: [[ColorPalette::Background]];
}

#sidebar .tabUnselected {
    background-color: [[ColorPalette::SecondaryMid]];
    color: [[ColorPalette::Background]];
}

#sidebar .tiddlyLinkExisting {
    color: [[ColorPalette::SecondaryMid]];
}


#displayArea {
    margin: 1em auto 1em auto;
    width: 50%;
}

#presentation {
    border: none;
    background-color: [[ColorPalette::SecondaryPale]];
    margin: 0 auto 0 0;
}

#tiddlerDisplay {
    margin: auto;
    width: 100%;
    height: 100%;
    background-color: [[ColorPalette::Background]];
    border: none;
    width: 640px;
}

#footer {
    height: 4em;
    padding: 0 2em 1em 2em;
    background-color: [[ColorPalette::SecondaryPale]];
    border: none;
}

#slide {
    border: 2px solid [[ColorPalette::SecondaryLight]];
    background-color: [[ColorPalette::Background]];
    width: 640px;
    height: 480px;
    margin: 1em auto;
}

.viewSlide {
    min-height: 20em;
}

#thumbnail {
    margin: 1em;
    border: 2px solid [[ColorPalette::PrimaryMid]];
}

#contentWrapper .themeButton, 
#contentWrapper .button {
    width: 5em;
    text-align: center;
    letter-spacing: 1px;
    padding: 0.3em 2em 0.3em 2em;
    margin: 2em 1em 0em 1em;
    background-color: [[ColorPalette::Background]];
    background: [[ColorPalette::SecondaryLight]] url(images/bg-button.gif);
    border: 1px solid [[ColorPalette::PrimaryLight]];
    color: [[ColorPalette::PrimaryMid]];
    border-radius: 4px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    -webkit-box-shadow: 2px 2px 3px rgba(135, 139, 144, 0.4);
    -moz-box-shadow: 2px 2px 3px rgba(135, 139, 144, 0.4);
    box-shadow: 2px 2px 3px rgba(135, 139, 144, 0.4);
}

#contentWrapper .themeButton:hover,
#contentWrapper .themeButton:active,
#contentWrapper .button:hover,
#contentWrapper .button:active
 {
    background: [[ColorPalette::SecondaryLight]] url(images/bg-button.gif);
    background-position:0 -400px;
    border: 1px solid [[ColorPalette::PrimaryMid]];
    color: [[ColorPalette::PrimaryMid]];
    outline: none;
}

#contentWrapper .themeButton.selected:hover,
#contentWrapper .themeButton.selected:active,
#contentWrapper .themeButton.selected {
    cursor: default;
    border: 1px solid [[ColorPalette::PrimaryLight]];
    color: [[ColorPalette::Background]];
    background: [[ColorPalette::SelectedDark]];
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0.0, [[ColorPalette::SelectedLight]]), color-stop(1.0, [[ColorPalette::SelectedDark]]));
    background: -moz-linear-gradient(top, [[ColorPalette::SelectedLight]] 0%, [[ColorPalette::SelectedDark]] 100%);
}

#authorButtons {
    height: 3.5em;
    padding: 0 auto;
}

#sidebar a.button,
#authorButtons a.button {
    text-align: center;
    font-size: 1.2em;
}

#mainMenu {
    width: 100%;
    position: relative;
    margin: 0;
    padding: 0;
}

#mainMenu ul {
    margin: 0;
    padding: 0;
}

#mainMenu li {
    text-align: right;
    display: block;
    width: 80%;
    border: 2px solid [[ColorPalette::PrimaryPale]];
    background-color: [[ColorPalette::Background]];
    margin-bottom: 0.2em;
    padding: 0 2em 0 0;
}

#mainMenu li a {
    color: [[ColorPalette::SecondaryMid]];
    display: block;
    padding-right: 1em;
    width: 90%;
}

/*
#mainMenu li:first-of-type a {
    color: [[ColorPalette::SelectedPale]];
}
#mainMenu li:first-of-type {
    background-color: [[ColorPalette::PrimaryLight]];
}
*/

h2 {
    border: none;
    color: [[ColorPalette::TertiaryMid]];
    font-size: 2em;
    font-weight: normal;
    padding-bottom: 0.5em;
    margin: 0;
}

.toolbar {
    padding: 1em 0;
    font-size: 1.2em;
}

.button {
    -moz-border-radius: 4px;
}

#presentation .toolbar,
#presentation h2.preview {
    display: none;
}

#presentation .tiddler,
#presentation .viewSlide
 {
    height: 97%;
    overflow: hidden;
}


table.twtable {
    width: 100%;
    border-top: 1px solid [[ColorPalette::PrimaryLight]];
    border-bottom: 1px solid [[ColorPalette::PrimaryLight]];
    border-left: none;
    border-right: none;
    margin-left: 0mm;
    font-size: 0.5em;
    line-height: 1.5em;
}

.twtable th {
    background-color: [[ColorPalette::PrimaryDark]];
    font-weight: normal;
}

.twtable th,
.twtable tr,
.twtable td {
    border: none;
}


.twtable .evenRow {
    background-color: [[ColorPalette::PrimaryPale]];
}

.twtable .oddRow {
    background-color: [[ColorPalette::SecondaryPale]];
}

[[GrowlStyle]]
[[ControlPanelStyle]]

.editor {
    font-size: 1.5em;
    padding-top: 0.2em;
    padding-bottom: 1em;
}

.editor input,
.editor textarea {
    border: 2px solid [[ColorPalette::PrimaryPale]];
}

.editSlide {
    padding: 0 1em;
}


#fullframe {
    background-color: #000;
}

#fullframe .preview,
#fullframe .toolbar {
    display: none;
}


/*}}}*/
It's a piece of dogma in information science that knowledge only exists in the head of the person experiencing it. You //cannot// transfer knowledge. As soon as it leaves my head and becomes communication, it is information. If you are able to synthesize it into your own world view, your belief system, then it becomes knowledge for you.
<<list filter [tag[notes]]>>
|''ViewTemplate''|##ViewTemplate|

!ViewTemplate
<!--{{{-->
<h2 class="preview">New Slide: Select a Template</div>
<div class='viewSlide'>
    <div class='newSlide'>
        <div class='textbox viewer' macro='view text wikified'></div>
    </div>
</div>
<div class='toolbar' macro='toolbar -closeTiddler'></div>
<!--}}}-->
Dialect composition of pieces and parts which we compare and contrast in an effort to understand.

In an information rich environment like the internet, where pieces are easily addressable, the pieces can be composed for easy contrast, facilitating understanding.
* [[SinglePageModePlugin]]
* [[MainMenuOrderPlugin]]
* [[ThemeButtonPlugin]]
* [[ThemedTiddlerPlugin]]
|''ViewTemplate''|##ViewTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
<!--{{{-->
<h2 class="preview"><span macro="view title"></span></h2>
<div class='viewSlide'>
    <div class='slideSorter'>
        <div class='title viewer'>Slides</div>
        <div class='text viewer' macro='view text wikified'></div>
    </div>
</div>
<div class="toolbarOptions">
</div>
<div class='toolbar'>
    <span macro='toolbar closeTiddler'></span>
</div>
<!--}}}-->

!StyleSheet
/*{{{*/
.slideSorter {
    font-size: 4em;
    text-align: center;
    background-color: #E8E8E8;
    height: 100%;
    min-height: 400px;
}

.slideSorter .title {
    color: #333;
    font-weight: bolder;
    letter-spacing: -2px;
    font-size: 1em;
}

.slideSorter .text {
    font-size: 0.7em;
}

.slideSorter ul {
    list-style: none;
    margin: 0;
    padding: 0;
    border: none;
    display: inline;
}

.slideSorter li {
    list-style: none;
    display: inline;
}

.slideSorter li:after {
    content: "  ";
}

/*}}}*/
<<tabs txtMainTab Notes "Notes" TabNotes Masters "Master Slide Templates" TabMasters "More" "More lists" TabDetails>>
Think tank advised by Doug Engelbart exploring high performance collaboration, especially augmented (by tools) and asynchronous collaboration.

The Blue Oxen Way states several assumptions about collaboration:
* Shared Language and Shared Understanding are prerequisites to a Shared Goal.
* A Shared Goal is //the// prerequisite to Collaboration.
* Collaboration and Collaborative Tools should Make us Less Dumb.